From 89219f1780a976b6d1ac4dca1baac9d2d556d567 Mon Sep 17 00:00:00 2001 From: ramil Date: Tue, 26 Jul 2022 01:55:01 +0300 Subject: [PATCH 001/181] codegen for wasm-go --- .../src/bindings/golang/wasm-go/baseTypes.ts | 18 + .../src/bindings/golang/wasm-go/functions.ts | 311 ++++++++++++++++++ .../bind/src/bindings/golang/wasm-go/index.ts | 177 ++++++++++ .../bindings/golang/wasm-go/reservedWords.ts | 201 +++++++++++ .../golang/wasm-go/templates/main-go.mustache | 22 ++ .../module-type/serialization-go.mustache | 69 ++++ .../templates/object-type/main-go.mustache | 18 + .../object-type/serialization-go.mustache | 22 ++ packages/schema/bind/src/bindings/index.ts | 5 +- packages/schema/bind/src/types.ts | 2 +- .../cases/bind/sanity/output/wasm-go/main.go | 24 ++ 11 files changed, 867 insertions(+), 2 deletions(-) create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/baseTypes.ts create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/functions.ts create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/index.ts create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/reservedWords.ts create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/main-go.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/serialization-go.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/main-go.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/serialization-go.mustache create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/main.go diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/baseTypes.ts b/packages/schema/bind/src/bindings/golang/wasm-go/baseTypes.ts new file mode 100644 index 0000000000..e667344d20 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/baseTypes.ts @@ -0,0 +1,18 @@ +const baseTypes = { + u8: "u8", + u16: "u16", + u32: "u32", + i8: "i8", + i16: "i16", + i32: "i32", + string: "string", + bool: "bool", +}; + +export type BaseTypes = typeof baseTypes; + +export type BaseType = keyof BaseTypes; + +export function isBaseType(type: string): type is BaseType { + return type in baseTypes; +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts b/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts new file mode 100644 index 0000000000..ab3b954496 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts @@ -0,0 +1,311 @@ +import { isBaseType } from "./baseTypes"; +import { reservedWordsAS } from "./reservedWords"; +import { MustacheFn } from "../../types"; + +export const handleKeywords: MustacheFn = () => { + return (text: string, render: (template: string) => string): string => { + const rendered: string = render(text); + if (reservedWordsAS.has(rendered)) { + return "m_" + rendered; + } + return rendered; + }; +}; + +export const toMsgPack: MustacheFn = () => { + return (value: string, render: (template: string) => string) => { + let type = render(value); + + let modifier = ""; + if (type[type.length - 1] === "!") { + type = type.substring(0, type.length - 1); + } else { + modifier = "Optional"; + } + + if (type[0] === "[") { + return modifier + "Array"; + } + if (type.startsWith("Map<")) { + return modifier + "ExtGenericMap"; + } + switch (type) { + case "Int": + return modifier + "Int32"; + case "UInt": + return modifier + "UInt32"; + case "Boolean": + return modifier + "Bool"; + default: + return modifier + type; + } + }; +}; + +export const toWasmInit: MustacheFn = () => { + return (value: string, render: (template: string) => string) => { + let type = render(value); + + if (type[type.length - 1] === "!") { + type = type.substring(0, type.length - 1); + } else { + const nullType = toWasm()(value, render); + const optional = "Option"; + const nullOptional = "| null"; + + if (nullType.endsWith(nullOptional)) { + return "null"; + } else if (nullType.startsWith(optional)) { + type = nullType.substring(6); + return `Option.None${type}()`; + } + } + + if (type[0] === "[") { + return "[]"; + } + + if (type.startsWith("Map<")) { + const openBracketIdx = type.indexOf("<"); + const closeBracketIdx = type.lastIndexOf(">"); + const [key, value] = type + .substring(openBracketIdx + 1, closeBracketIdx) + .split(",") + .map((x) => toWasm()(x.trim(), render)); + return `new Map<${key}, ${value}>()`; + } + + switch (type) { + case "Int": + case "Int8": + case "Int16": + case "Int32": + case "UInt": + case "UInt8": + case "UInt16": + case "UInt32": + return "0"; + case "String": + return `""`; + case "Boolean": + return "false"; + case "Bytes": + return `new ArrayBuffer(0)`; + case "BigInt": + return `BigInt.fromUInt16(0)`; + case "BigNumber": + return `new BigNumber(BigInt.fromUInt16(0), 0, 0)`; + case "JSON": + return `JSON.Value.Null()`; + default: + if (type.includes("Enum_")) { + return "0"; + } else { + return `new Types.${type}()`; + } + } + }; +}; + +export const toWasm: MustacheFn = () => { + return (value: string, render: (template: string) => string) => { + let type = render(value); + let isEnum = false; + + let optional = false; + if (type[type.length - 1] === "!") { + type = type.substring(0, type.length - 1); + } else { + optional = true; + } + + if (type[0] === "[") { + return toWasmArray(type, optional); + } + + if (type.startsWith("Map<")) { + return toWasmMap(type, optional); + } + + switch (type) { + case "Int": + type = "i32"; + break; + case "Int8": + type = "i8"; + break; + case "Int16": + type = "i16"; + break; + case "Int32": + type = "i32"; + break; + case "UInt": + case "UInt32": + type = "u32"; + break; + case "UInt8": + type = "u8"; + break; + case "UInt16": + type = "u16"; + break; + case "String": + type = "string"; + break; + case "Boolean": + type = "bool"; + break; + case "Bytes": + type = "ArrayBuffer"; + break; + case "BigInt": + type = "BigInt"; + break; + case "BigNumber": + type = "BigNumber"; + break; + case "JSON": + type = "JSON.Value"; + break; + default: + if (type.includes("Enum_")) { + type = `Types.${type.replace("Enum_", "")}`; + isEnum = true; + } else { + type = `Types.${type}`; + } + } + + return applyOptional(type, optional, isEnum); + }; +}; + +const toWasmArray = (type: string, optional: boolean): string => { + const result = type.match(/(\[)([[\]A-Za-z0-9_.!]+)(\])/); + + if (!result || result.length !== 4) { + throw Error(`Invalid Array: ${type}`); + } + + const wasmType = toWasm()(result[2], (str) => str); + return applyOptional("Array<" + wasmType + ">", optional, false); +}; + +const toWasmMap = (type: string, optional: boolean): string => { + const firstOpenBracketIdx = type.indexOf("<"); + const lastCloseBracketIdx = type.lastIndexOf(">"); + + if (!(firstOpenBracketIdx !== -1 && lastCloseBracketIdx !== -1)) { + throw new Error(`Invalid Map: ${type}`); + } + + const keyValTypes = type + .substring(firstOpenBracketIdx + 1, lastCloseBracketIdx) + .split(",") + .map((x) => x.trim()); + + if (keyValTypes.length !== 2 || !keyValTypes[0] || !keyValTypes[1]) { + throw new Error(`Invalid Map: ${type}`); + } + + const keyType = toWasm()(keyValTypes[0], (str) => str); + const valType = toWasm()(keyValTypes[1], (str) => str); + + return applyOptional(`Map<${keyType}, ${valType}>`, optional, false); +}; + +const applyOptional = ( + type: string, + optional: boolean, + isEnum: boolean +): string => { + if (optional) { + if ( + type.indexOf("Array") === 0 || + type.indexOf("string") === 0 || + (!isEnum && !isBaseType(type)) + ) { + return `${type} | null`; + } else { + return `Option<${type}>`; + } + } else { + return type; + } +}; + +function replaceAt(str: string, index: number, replacement: string): string { + return ( + str.substr(0, index) + replacement + str.substr(index + replacement.length) + ); +} + +function insertAt(str: string, index: number, insert: string): string { + return str.substr(0, index) + insert + str.substr(index); +} + +function removeAt(str: string, index: number): string { + return str.substr(0, index) + str.substr(index + 1); +} + +export const toLower: MustacheFn = () => { + return (value: string, render: (template: string) => string) => { + let type = render(value); + + for (let i = 0; i < type.length; ++i) { + const char = type.charAt(i); + const lower = char.toLowerCase(); + + if (char !== lower) { + // Replace the uppercase char w/ the lowercase version + type = replaceAt(type, i, lower); + + // if (i !== 0 && type[i - 1] !== "_") { + // // Make sure all lowercase conversions have an underscore before them + // type = insertAt(type, i, "_"); + // } + } + } + + return type; + }; +}; + +export const toFirstLower: MustacheFn = () => { + return (value: string, render: (template: string) => string) => { + let type = render(value); + + // First character must always be upper case + const firstChar = type.charAt(0); + const firstLower = firstChar.toLowerCase(); + type = replaceAt(type, 0, firstLower); + + return type; + }; +}; + +export const toUpper: MustacheFn = () => { + return (value: string, render: (template: string) => string) => { + let type = render(value); + + // First character must always be upper case + const firstChar = type.charAt(0); + const firstUpper = firstChar.toUpperCase(); + type = replaceAt(type, 0, firstUpper); + + // Look for any underscores, remove them if they exist, and make next letter uppercase + // for (let i = 0; i < type.length; ++i) { + // const char = type.charAt(i); + // + // if (char === "_") { + // const nextChar = type.charAt(i + 1); + // const nextCharUpper = nextChar.toUpperCase(); + // type = replaceAt(type, i + 1, nextCharUpper); + // type = removeAt(type, i); + // } + // } + + return type; + }; +}; diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/index.ts b/packages/schema/bind/src/bindings/golang/wasm-go/index.ts new file mode 100644 index 0000000000..fdc646f0e0 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/index.ts @@ -0,0 +1,177 @@ +import * as Functions from "./functions"; +import { GenerateBindingFn } from "../.."; +import { renderTemplates, loadSubTemplates } from "../../utils/templates"; +import { BindOptions, BindOutput } from "../../.."; + +import { + Abi, + transformAbi, + addFirstLast, + extendType, + toPrefixedGraphQLType, +} from "@polywrap/schema-parse"; +import { OutputEntry, readDirectorySync } from "@polywrap/os-js"; +import path from "path"; + +const templatesDir = readDirectorySync(path.join(__dirname, "./templates")); +const subTemplates = loadSubTemplates(templatesDir.entries); +const templatePath = (subpath: string) => + path.join(__dirname, "./templates", subpath); + +export const generateBinding: GenerateBindingFn = ( + options: BindOptions +): BindOutput => { + const result: BindOutput = { + output: { + entries: [], + }, + outputDirAbs: options.outputDirAbs, + }; + const output = result.output; + const abi = applyTransforms(options.abi); + + // Generate object type folders + for (const objectType of abi.objectTypes) { + output.entries.push({ + type: "Directory", + name: objectType.type, + data: renderTemplates( + templatePath("object-type"), + objectType, + subTemplates + ), + }); + } + + // Generate imported folder + const importEntries: OutputEntry[] = []; + + // Generate imported module type folders + // for (const importedModuleType of abi.importedModuleTypes) { + // importEntries.push({ + // type: "Directory", + // name: importedModuleType.type, + // data: renderTemplates( + // templatePath("imported/module-type"), + // importedModuleType, + // subTemplates + // ), + // }); + // } + // + // // Generate imported env type folders + // for (const importedEnvType of abi.importedEnvTypes) { + // importEntries.push({ + // type: "Directory", + // name: importedEnvType.type, + // data: renderTemplates( + // templatePath("imported/env-type"), + // importedEnvType, + // subTemplates + // ), + // }); + // } + // + // // Generate imported enum type folders + // for (const importedEnumType of abi.importedEnumTypes) { + // importEntries.push({ + // type: "Directory", + // name: importedEnumType.type, + // data: renderTemplates( + // templatePath("imported/enum-type"), + // importedEnumType, + // subTemplates + // ), + // }); + // } + // + // // Generate imported object type folders + // for (const importedObectType of abi.importedObjectTypes) { + // importEntries.push({ + // type: "Directory", + // name: importedObectType.type, + // data: renderTemplates( + // templatePath("imported/object-type"), + // importedObectType, + // subTemplates + // ), + // }); + // } + // + // if (importEntries.length) { + // output.entries.push({ + // type: "Directory", + // name: "imported", + // data: [ + // ...importEntries, + // ...renderTemplates(templatePath("imported"), abi, subTemplates), + // ], + // }); + // } + // + // // Generate interface type folders + // for (const interfaceType of abi.interfaceTypes) { + // output.entries.push({ + // type: "Directory", + // name: interfaceType.type, + // data: renderTemplates( + // templatePath("interface-type"), + // interfaceType, + // subTemplates + // ), + // }); + // } + // + // Generate module type folders + if (abi.moduleType) { + output.entries.push({ + type: "Directory", + name: abi.moduleType.type, + data: renderTemplates( + templatePath("module-type"), + abi.moduleType, + subTemplates + ), + }); + } + + // Generate enum type folders + // for (const enumType of abi.enumTypes) { + // output.entries.push({ + // type: "Directory", + // name: enumType.type, + // data: renderTemplates(templatePath("enum-type"), enumType, subTemplates), + // }); + // } + // + // // Generate env type folders + // if (abi.envType) { + // output.entries.push({ + // type: "Directory", + // name: abi.envType.type, + // data: renderTemplates( + // templatePath("env-type"), + // abi.envType, + // subTemplates + // ), + // }); + // } + + // Generate root entry file + output.entries.push(...renderTemplates(templatePath(""), abi, subTemplates)); + + return result; +}; + +function applyTransforms(abi: Abi): Abi { + const transforms = [ + extendType(Functions), + addFirstLast, + toPrefixedGraphQLType, + ]; + + for (const transform of transforms) { + abi = transformAbi(abi, transform); + } + return abi; +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/reservedWords.ts b/packages/schema/bind/src/bindings/golang/wasm-go/reservedWords.ts new file mode 100644 index 0000000000..f962c6f7b5 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/reservedWords.ts @@ -0,0 +1,201 @@ +// based on: +// - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#keywords +// - https://github.com/AssemblyScript/assemblyscript/blob/f54dbfb527842f3d68f18643bb614d104b4f0160/src/common.ts#L107 +// - https://github.com/AssemblyScript/assemblyscript/blob/f54dbfb527842f3d68f18643bb614d104b4f0160/src/tokenizer.ts#L181 +export const reservedWordsAS: Set = new Set([ + "async", + "await", + "arguments", + "abstract", + "as", + "break", + "const", + "class", + "catch", + "case", + "continue", + "constructor", + "default", + "declare", + "do", + "delete", + "debugger", + "else", + "enum", + "export", + "extends", + "for", + "from", + "function", + "finally", + "get", + "if", + "in", + "is", + "implements", + "import", + "instanceof", + "interface", + "keyof", + "let", + "module", + "new", + "namespace", + "of", + "private", + "package", + "public", + "protected", + "return", + "readonly", + "switch", + "static", + "set", + "super", + "this", + "type", + "try", + "throw", + "typeof", + "var", + "while", + "with", + "yield", + // types + "i8", + "i16", + "i32", + "i64", + "isize", + "u8", + "u16", + "u32", + "u64", + "usize", + "bool", + "f32", + "f64", + "v128", + "funcref", + "externref", + "anyref", + "eqref", + "i31ref", + "dataref", + "i8x16", + "u8x16", + "i16x8", + "u16x8", + "i32x4", + "u32x4", + "i64x2", + "u64x2", + "f32x4", + "f64x2", + "void", + "number", + "boolean", + "string", + "native", + "indexof", + "valueof", + "returnof", + "nonnull", + // aliases + "null", + "true", + "false", + // constants + "ASC_TARGET", + "ASC_RUNTIME", + "ASC_NO_ASSERT", + "ASC_MEMORY_BASE", + "ASC_TABLE_BASE", + "ASC_OPTIMIZE_LEVEL", + "ASC_SHRINK_LEVEL", + "ASC_LOW_MEMORY_LIMIT", + "ASC_EXPORT_RUNTIME", + "ASC_WASI", + "ASC_FEATURE_SIGN_EXTENSION", + "ASC_FEATURE_MUTABLE_GLOBALS", + "ASC_FEATURE_NONTRAPPING_F2I", + "ASC_FEATURE_BULK_MEMORY", + "ASC_FEATURE_SIMD", + "ASC_FEATURE_THREADS", + "ASC_FEATURE_EXCEPTION_HANDLING", + "ASC_FEATURE_TAIL_CALLS", + "ASC_FEATURE_REFERENCE_TYPES", + "ASC_FEATURE_MULTI_VALUE", + "ASC_FEATURE_GC", + "ASC_FEATURE_MEMORY64", + "ASC_VERSION_MAJOR", + "ASC_VERSION_MINOR", + "ASC_VERSION_PATCH", + // classes + "I8", + "I16", + "I32", + "I64", + "Isize", + "U8", + "U16", + "U32", + "U64", + "Usize", + "Bool", + "F32", + "F64", + "V128", + "Funcref", + "Externref", + "Anyref", + "Eqref", + "I31ref", + "Dataref", + "String", + "Object", + "Array", + "StaticArray", + "Set", + "Map", + "Function", + "ArrayBufferView", + "ArrayBuffer", + "Math", + "Mathf", + "NativeMath", + "NativeMathf", + "Int8Array", + "Int16Array", + "Int32Array", + "Int64Array", + "Uint8Array", + "Uint8ClampedArray", + "Uint16Array", + "Uint32Array", + "Uint64Array", + "Float32Array", + "Float64Array", + "TemplateStringsArray", + "Error", + // runtime + "abort", + "trace", + "seed", + "pow", + "ipow32", + "ipow64", + "mod", + "__alloc", + "__realloc", + "__free", + "__new", + "__renew", + "__link", + "__collect", + "__typeinfo", + "__instanceof", + "__visit", + "__newBuffer", + "__newArray", +]); diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/main-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/main-go.mustache new file mode 100644 index 0000000000..5907c2160f --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/main-go.mustache @@ -0,0 +1,22 @@ +package main + +import ( + "github.com/consideritdone/polywrap-go/examples/demo1/wrap/module" + "github.com/consideritdone/polywrap-go/polywrap" +) + +//export _wrap_invoke +func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { + args := polywrap.WrapInvokeArgs(methodSize, argsSize) + + {{#moduleType}} + {{#methods}} + {{^first}}else {{/first}}if args.method == "{{name}}" { + return polywrap.WrapInvoke(args, envSize, module.{{#toUpper}}{{name}}{{/toUpper}}Wrapped) + } {{/methods}}{{/moduleType}}else { + return polywrap.WrapInvoke(args, envSize, nil) + } +} + +func main() { +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/serialization-go.mustache new file mode 100644 index 0000000000..f3149225b5 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/serialization-go.mustache @@ -0,0 +1,69 @@ +package module + +import ( + "github.com/consideritdone/polywrap-go/examples/demo1/wrap/moduleTypes" + "github.com/consideritdone/polywrap-go/examples/demo1/wrap/sampleResult" + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) +{{#methods}} + +export class Args{{#toUpper}}{{name}}{{/toUpper}} { + {{#arguments}} + {{#handleKeywords}}{{name}}{{/handleKeywords}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}}; + {{/arguments}} +} + +export function deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte): *moduleTypes.Args{{name}} { + context := msgpack.NewContext("Deserializing module-type: {{name}}") + {{#arguments.length}} + reader := msgpack.NewReadDecoder(context, argsBuf) + numFields := reader.ReadMapLength() + + {{#arguments}} + {{^object}} + let _{{name}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = {{#toWasmInit}}{{toGraphQLType}}{{/toWasmInit}}; + {{/object}} + {{#required}} + let _{{name}}Set: bool = false; + {{/required}} + {{/arguments}} + + for i := numFields; i > 0; i-- { + const field = reader.readString(); + + reader.Context().Push(field, "unknown", "searching for property type") + {{#arguments}} + {{^first}}else {{/first}}if (field == "{{name}}") { + reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") + + {{#scalar}} + _{{name}} = reader.Read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(); + {{/scalar}} + {{#required}} + _{{name}}Set = true; + {{/required}} + reader.Context().Pop() + } + {{/arguments}} + reader.context().pop(); + } + + {{#arguments}} + {{#required}} + {{^object}} + if !_{{name}}Set { + {{/object}} + panic(reader.Context().PrintWithContext("Missing required argument: '{{name}}: {{type}}'")) + } + {{/required}} + {{/arguments}} + {{/arguments.length}} + + return { + {{#arguments}} + {{#handleKeywords}}{{name}}{{/handleKeywords}}: _{{name}}{{^last}},{{/last}} + {{/arguments}} + }; +} + +{{/methods}} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/main-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/main-go.mustache new file mode 100644 index 0000000000..b0cfc417d3 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/main-go.mustache @@ -0,0 +1,18 @@ +package {{#toFirstLower}}{{type}}{{/toFirstLower}} + +import "github.com/consideritdone/polywrap-go/polywrap/msgpack" + +type {{type}} struct { + Value string + {{#properties}} + {{#handleKeywords}}{{#toUpper}}{{name}}{{/toUpper}}{{/handleKeywords}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{/properties}} +} + +func toBuffer(args SampleResult) []byte { + return serializeSampleResult(args) +} + +func Write(writer msgpack.Write, args SampleResult) { + writeSampleResult(writer, args) +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/serialization-go.mustache new file mode 100644 index 0000000000..b168feedb1 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/serialization-go.mustache @@ -0,0 +1,22 @@ +package {{#toFirstLower}}{{type}}{{/toFirstLower}} + +import "github.com/consideritdone/polywrap-go/polywrap/msgpack" + +func serialize{{type}}(args {{type}}) []byte { + context := msgpack.NewContext("Serializing (encoding) object-type: {{type}}") + encoder := msgpack.NewWriteEncoder(context) + write{{type}}(encoder, args) + + return encoder.Buffer() +} + +func write{{type}}(writer msgpack.Write, args {{type}}) { + writer.WriteMapLength({{properties.length}}) + {{#properties}} + writer.Context().Push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + writer.WriteString("{{name}}") + {{#scalar}} + writer.Write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(args.{{#handleKeywords}}{{name}}{{/handleKeywords}}); + {{/scalar}} + {{/properties}} +} diff --git a/packages/schema/bind/src/bindings/index.ts b/packages/schema/bind/src/bindings/index.ts index 61e4cfa78e..0d56f2f487 100644 --- a/packages/schema/bind/src/bindings/index.ts +++ b/packages/schema/bind/src/bindings/index.ts @@ -3,8 +3,9 @@ import { BindLanguage } from "../"; import * as AssemblyScript from "./assemblyscript"; import * as Rust from "./rust"; import * as TypeScript from "./typescript"; +import * as Golang from "./golang"; -export { AssemblyScript, Rust, TypeScript }; +export { AssemblyScript, Rust, TypeScript, Golang }; export * from "./types"; export * from "./utils"; @@ -16,6 +17,8 @@ export function getGenerateBindingFn( return AssemblyScript.Wasm.generateBinding; case "wasm-rs": return Rust.Wasm.generateBinding; + case "wasm-go": + return Golang.Wasm.generateBinding; case "plugin-ts": return TypeScript.Plugin.generateBinding; case "app-ts": diff --git a/packages/schema/bind/src/types.ts b/packages/schema/bind/src/types.ts index 3ae6aa13dc..dca0689457 100644 --- a/packages/schema/bind/src/types.ts +++ b/packages/schema/bind/src/types.ts @@ -1,7 +1,7 @@ import { OutputDirectory } from "@polywrap/os-js"; import { WrapAbi } from "@polywrap/schema-parse"; -export type BindLanguage = "wasm-as" | "wasm-rs" | "plugin-ts" | "app-ts"; +export type BindLanguage = "wasm-as" | "wasm-rs" | "wasm-go" | "plugin-ts" | "app-ts"; export interface BindOutput { output: OutputDirectory; diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go new file mode 100644 index 0000000000..fa5dc8d666 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go @@ -0,0 +1,24 @@ +package main + +import ( + "github.com/consideritdone/polywrap-go/examples/demo1/wrap/module" + "github.com/consideritdone/polywrap-go/polywrap" +) + +//export _wrap_invoke +func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { + args := polywrap.WrapInvokeArgs(methodSize, argsSize) + + if args.Method == "moduleMethod" { + return polywrap.WrapInvoke(args, envSize, module.ModuleMethodWrapped) + } else if args.Method == "objectMethod" { + return polywrap.WrapInvoke(args, envSize, module.ObjectMethodWrapped) + } else if args.Method == "optionalEnvMethod" { + return polywrap.WrapInvoke(args, envSize, module.OptionalEnvMethodWrapped) + } else { + return polywrap.WrapInvoke(args, envSize, nil) + } +} + +func main() { +} From e58ad8439d3f0c621ee0e491d5ec9531b91ded26 Mon Sep 17 00:00:00 2001 From: ramil Date: Wed, 3 Aug 2022 21:40:10 +0300 Subject: [PATCH 002/181] for debug only --- packages/schema/bind/src/__tests__/index.ts | 1 + .../bind/src/__tests__/test-cases.spec.ts | 38 ++++++++++++++++++- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/packages/schema/bind/src/__tests__/index.ts b/packages/schema/bind/src/__tests__/index.ts index 1fd3557924..efe0d6ff43 100644 --- a/packages/schema/bind/src/__tests__/index.ts +++ b/packages/schema/bind/src/__tests__/index.ts @@ -64,6 +64,7 @@ export function fetchTestCases(): TestCases { const outputLanguages = fs .readdirSync(outputDir, { withFileTypes: true }) .filter((item: fs.Dirent) => item.isDirectory()) + .filter((item: fs.Dirent) => item.name == "wasm-go") .map((item: fs.Dirent) => { return { language: item.name, diff --git a/packages/schema/bind/src/__tests__/test-cases.spec.ts b/packages/schema/bind/src/__tests__/test-cases.spec.ts index 450600d723..9617eb6587 100644 --- a/packages/schema/bind/src/__tests__/test-cases.spec.ts +++ b/packages/schema/bind/src/__tests__/test-cases.spec.ts @@ -12,7 +12,7 @@ import { OutputEntry } from "@polywrap/os-js"; -import fs from "fs"; +import fs, {existsSync, mkdirSync} from "fs"; import path from "path"; describe("Polywrap Binding Test Suite", () => { @@ -74,6 +74,42 @@ describe("Polywrap Binding Test Suite", () => { JSON.stringify(expectedOutput, null, 2), ); + const paths: string[] = []; + + + const outputDirectoryEntry = (root: string, entry: OutputEntry) => { + const entryPath = path.join(root, entry.name); + paths.push(entryPath); + + switch (entry.type) { + case "File": { + writeFileSync(entryPath, entry.data); + break; + } + case "Directory": { + for (const subEntry of entry.data) { + if (!existsSync(entryPath)) { + mkdirSync(entryPath, { recursive: true }); + } + outputDirectoryEntry(entryPath, subEntry); + } + break; + } + default: { + throw Error( + `outputDirectoryEntry: Unknown entry type. Entry: ${JSON.stringify( + entry + )}` + ); + } + } + }; + + for (const entry of output.output.entries) { + outputDirectoryEntry(testResultDir, entry); + } + + expect(output).toMatchObject(expectedOutput); } }); From e3244985a76ad722e1a77646b56f64aa3002c5fb Mon Sep 17 00:00:00 2001 From: n0cte Date: Tue, 16 Aug 2022 14:40:27 +0300 Subject: [PATCH 003/181] Add serialization and deserialization for common types --- .../src/bindings/golang/wasm-go/functions.ts | 251 ++-- .../bind/src/bindings/golang/wasm-go/index.ts | 36 +- .../templates/deserialize_array.mustache | 23 + .../templates/deserialize_enum.mustache | 11 + .../templates/deserialize_map.mustache | 24 + .../templates/deserialize_object.mustache | 8 + .../templates/deserialize_scalar.mustache | 9 + .../templates/enum-type/type-go.mustache | 39 + .../templates/object-type/main-go.mustache | 35 +- .../object-type/serialization-go.mustache | 119 +- .../templates/serialize_array.mustache | 23 + .../wasm-go/templates/serialize_enum.mustache | 13 + .../wasm-go/templates/serialize_map.mustache | 24 + .../templates/serialize_object.mustache | 10 + .../templates/serialize_scalar.mustache | 13 + .../output/wasm-go/types/another_type.go | 27 + .../types/another_type_serialization.go | 94 ++ .../output/wasm-go/types/custom_enum.go | 38 + .../output/wasm-go/types/custom_type.go | 67 + .../types/custom_type_serialization.go | 1218 +++++++++++++++++ .../bind/sanity/output/wasm-go/types/env.go | 27 + .../output/wasm-go/types/env_serialization.go | 115 ++ 22 files changed, 2070 insertions(+), 154 deletions(-) create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_array.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_enum.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_map.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_object.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_scalar.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/enum-type/type-go.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_array.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_enum.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_map.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_object.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_scalar.mustache create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/types/another_type.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/types/another_type_serialization.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_enum.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_type.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_type_serialization.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/types/env.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/types/env_serialization.go diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts b/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts index ab3b954496..ee1ab96b97 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts +++ b/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts @@ -2,6 +2,86 @@ import { isBaseType } from "./baseTypes"; import { reservedWordsAS } from "./reservedWords"; import { MustacheFn } from "../../types"; +let num = -1; + +export const startIter: MustacheFn = () => { + return (): string => { + num = -1; + return "" + } +} + +export const stopIter: MustacheFn = () => { + return (): string => { + num = -1; + return "" + } +} + +export const currIter: MustacheFn = () => { + return (text: string, render: (template: string) => string): string => { + const rendered: string = render(text); + return `${rendered}${num}`; + } +} + +export const nextIter: MustacheFn = () => { + return (text: string, render: (template: string) => string): string => { + const rendered: string = render(text); + return `${rendered}${++num}`; + } +} + +export const prevFullIter: MustacheFn = () => { + return (text: string, render: (template: string) => string): string => { + const rendered: string = render(text); + if (rendered == "stop") { + return ""; + } + return Array(num).fill(0).map((_, i) => `[${rendered}${i}]`).join(""); + } +} + +export const lastFullIter: MustacheFn = () => { + return (text: string, render: (template: string) => string): string => { + const rendered: string = render(text); + if (rendered == "stop") { + return ""; + } + return Array(num + 1).fill(0).map((_, i) => `[${rendered}${i}]`).join(""); + } +} + +export const writePointer: MustacheFn = () => { + return (text: string, render: (template: string) => string): string => { + const [type, value] = render(text).split(" - "); + let pointer = "*"; + if ({ + "BigInt": true, + "Json": true, + "Bytes": true, + }[type] ?? false) { + pointer = ""; + } + return `writer.Write${type}(${pointer}${value})` + } +} + +export const readPointer: MustacheFn = () => { + return (text: string, render: (template: string) => string): string => { + const [type, value] = render(text).split(" - "); + let pointer = "&"; + if ({ + "BigInt": true, + "Json": true, + "Bytes": true, + }[type] ?? false) { + pointer = ""; + } + return `${pointer}${value}` + } +} + export const handleKeywords: MustacheFn = () => { return (text: string, render: (template: string) => string): string => { const rendered: string = render(text); @@ -15,7 +95,6 @@ export const handleKeywords: MustacheFn = () => { export const toMsgPack: MustacheFn = () => { return (value: string, render: (template: string) => string) => { let type = render(value); - let modifier = ""; if (type[type.length - 1] === "!") { type = type.substring(0, type.length - 1); @@ -23,87 +102,45 @@ export const toMsgPack: MustacheFn = () => { modifier = "Optional"; } - if (type[0] === "[") { - return modifier + "Array"; - } - if (type.startsWith("Map<")) { - return modifier + "ExtGenericMap"; - } - switch (type) { - case "Int": - return modifier + "Int32"; - case "UInt": - return modifier + "UInt32"; - case "Boolean": - return modifier + "Bool"; - default: - return modifier + type; - } - }; -}; - -export const toWasmInit: MustacheFn = () => { - return (value: string, render: (template: string) => string) => { - let type = render(value); - - if (type[type.length - 1] === "!") { - type = type.substring(0, type.length - 1); - } else { - const nullType = toWasm()(value, render); - const optional = "Option"; - const nullOptional = "| null"; - - if (nullType.endsWith(nullOptional)) { - return "null"; - } else if (nullType.startsWith(optional)) { - type = nullType.substring(6); - return `Option.None${type}()`; - } - } - - if (type[0] === "[") { - return "[]"; - } - - if (type.startsWith("Map<")) { - const openBracketIdx = type.indexOf("<"); - const closeBracketIdx = type.lastIndexOf(">"); - const [key, value] = type - .substring(openBracketIdx + 1, closeBracketIdx) - .split(",") - .map((x) => toWasm()(x.trim(), render)); - return `new Map<${key}, ${value}>()`; - } - - switch (type) { - case "Int": - case "Int8": - case "Int16": - case "Int32": - case "UInt": - case "UInt8": - case "UInt16": - case "UInt32": - return "0"; - case "String": - return `""`; - case "Boolean": - return "false"; - case "Bytes": - return `new ArrayBuffer(0)`; - case "BigInt": - return `BigInt.fromUInt16(0)`; - case "BigNumber": - return `new BigNumber(BigInt.fromUInt16(0), 0, 0)`; - case "JSON": - return `JSON.Value.Null()`; - default: - if (type.includes("Enum_")) { - return "0"; - } else { - return `new Types.${type}()`; - } + let t = type; + if (type.startsWith("[")) { + t = "Array"; + } else if (type.startsWith("Map")) { + t = "Map"; + } else if (type.startsWith("Int8")) { + t = "I8" + } else if (type.startsWith("Int16")) { + t = "I16" + } else if (type.startsWith("Int32")) { + t = "I32" + } else if (type.startsWith("Int64")) { + t = "I64" + } else if (type.startsWith("Int")) { + t = "I32" + } else if (type.startsWith("UInt8")) { + t = "U8" + } else if (type.startsWith("UInt16")) { + t = "U16" + } else if (type.startsWith("UInt32")) { + t = "U32" + } else if (type.startsWith("UInt64")) { + t = "U64" + } else if (type.startsWith("UInt")) { + t = "U32" + } else if (type.startsWith("String")) { + t = "String" + } else if (type.startsWith("Boolean")) { + t = "Bool" + } else if (type.startsWith("Bytes")) { + t = "Bytes" + } else if (type.startsWith("BigInt")) { + t = "BigInt" + } else if (type.startsWith("BigNumber")) { + t = "BigInt" + } else if (type.startsWith("JSON")) { + t = "Json" } + return t; }; }; @@ -129,26 +166,34 @@ export const toWasm: MustacheFn = () => { switch (type) { case "Int": - type = "i32"; + type = "int32"; break; case "Int8": - type = "i8"; + type = "int8"; break; case "Int16": - type = "i16"; + type = "int16"; break; case "Int32": - type = "i32"; + type = "int32"; + break; + case "Int64": + type = "int64"; break; case "UInt": - case "UInt32": - type = "u32"; + type = "uint32"; break; case "UInt8": - type = "u8"; + type = "uint8"; break; case "UInt16": - type = "u16"; + type = "uint16"; + break; + case "UInt32": + type = "uint32"; + break; + case "UInt64": + type = "uint64"; break; case "String": type = "string"; @@ -157,23 +202,23 @@ export const toWasm: MustacheFn = () => { type = "bool"; break; case "Bytes": - type = "ArrayBuffer"; + type = "[]byte"; break; case "BigInt": - type = "BigInt"; + type = "*big.Int"; break; case "BigNumber": - type = "BigNumber"; + type = "*big.Int"; break; case "JSON": - type = "JSON.Value"; + type = "*fastjson.Value"; break; default: if (type.includes("Enum_")) { - type = `Types.${type.replace("Enum_", "")}`; + type = `${type.replace("Enum_", "")}`; isEnum = true; } else { - type = `Types.${type}`; + type = `${type}`; } } @@ -189,7 +234,7 @@ const toWasmArray = (type: string, optional: boolean): string => { } const wasmType = toWasm()(result[2], (str) => str); - return applyOptional("Array<" + wasmType + ">", optional, false); + return applyOptional(`[]${wasmType}`, optional, false); }; const toWasmMap = (type: string, optional: boolean): string => { @@ -212,7 +257,7 @@ const toWasmMap = (type: string, optional: boolean): string => { const keyType = toWasm()(keyValTypes[0], (str) => str); const valType = toWasm()(keyValTypes[1], (str) => str); - return applyOptional(`Map<${keyType}, ${valType}>`, optional, false); + return applyOptional(`map[${keyType}]${valType}`, optional, false); }; const applyOptional = ( @@ -220,16 +265,8 @@ const applyOptional = ( optional: boolean, isEnum: boolean ): string => { - if (optional) { - if ( - type.indexOf("Array") === 0 || - type.indexOf("string") === 0 || - (!isEnum && !isBaseType(type)) - ) { - return `${type} | null`; - } else { - return `Option<${type}>`; - } + if (optional && !type.startsWith("*") && !type.startsWith("[]") && !type.startsWith("map")) { + return `*${type}` } else { return type; } diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/index.ts b/packages/schema/bind/src/bindings/golang/wasm-go/index.ts index fdc646f0e0..4704b19d59 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm-go/index.ts @@ -136,26 +136,22 @@ export const generateBinding: GenerateBindingFn = ( } // Generate enum type folders - // for (const enumType of abi.enumTypes) { - // output.entries.push({ - // type: "Directory", - // name: enumType.type, - // data: renderTemplates(templatePath("enum-type"), enumType, subTemplates), - // }); - // } - // - // // Generate env type folders - // if (abi.envType) { - // output.entries.push({ - // type: "Directory", - // name: abi.envType.type, - // data: renderTemplates( - // templatePath("env-type"), - // abi.envType, - // subTemplates - // ), - // }); - // } + for (const enumType of abi.enumTypes) { + output.entries.push({ + type: "Directory", + name: enumType.type, + data: renderTemplates(templatePath("enum-type"), enumType, subTemplates), + }); + } + + // Generate env type folders + if (abi.envType) { + output.entries.push({ + type: "Directory", + name: abi.envType.type, + data: renderTemplates(templatePath("object-type"), abi.envType, subTemplates), + }); + } // Generate root entry file output.entries.push(...renderTemplates(templatePath(""), abi, subTemplates)); diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_array.mustache new file mode 100644 index 0000000000..59003f2d65 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_array.mustache @@ -0,0 +1,23 @@ +if reader.IsNil() { + _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = nil +} else { + {{#nextIter}}ln{{/nextIter}} := reader.ReadArrayLength() + _{{name}}{{#prevFullIter}}i{{/prevFullIter}} = make({{#toWasm}}{{toGraphQLType}}{{/toWasm}}, {{#currIter}}ln{{/currIter}}) + for {{#currIter}}i{{/currIter}} := uint32(0); {{#currIter}}i{{/currIter}} < {{#currIter}}ln{{/currIter}}; {{#currIter}}i{{/currIter}}++ { + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{> deserialize_array}} + {{/array}} + {{#map}} + {{> deserialize_map}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + } +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_enum.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_enum.mustache new file mode 100644 index 0000000000..f92f67096d --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_enum.mustache @@ -0,0 +1,11 @@ +{{#required}} +_{{name}}{{#lastFullIter}}i{{/lastFullIter}} = {{#toUpper}}{{type}}{{/toUpper}}(reader.ReadI32()) +Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(int32(_{{name}}{{#lastFullIter}}i{{/lastFullIter}})) +{{/required}} +{{^required}} +if !reader.IsNil() { + v := {{#toUpper}}{{type}}{{/toUpper}}(reader.ReadI32()) + Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(int32(v)) + _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = &v +} +{{/required}} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_map.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_map.mustache new file mode 100644 index 0000000000..a88ea85f13 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_map.mustache @@ -0,0 +1,24 @@ +if reader.IsNil() { + _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = nil +} else { + {{#nextIter}}ln{{/nextIter}} := reader.ReadMapLength() + _{{name}}{{#prevFullIter}}i{{/prevFullIter}} = make({{#toWasm}}{{toGraphQLType}}{{/toWasm}}) + for {{#currIter}}j{{/currIter}} := uint32(0); {{#currIter}}j{{/currIter}} < {{#currIter}}ln{{/currIter}}; {{#currIter}}j{{/currIter}}++ { + {{#currIter}}i{{/currIter}} := reader.Read{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}() + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{> deserialize_array}} + {{/array}} + {{#map}} + {{> deserialize_map}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + } +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_object.mustache new file mode 100644 index 0000000000..86cea2fe71 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_object.mustache @@ -0,0 +1,8 @@ +if v := {{#toUpper}}{{type}}{{/toUpper}}Read(reader); v != nil { + {{#required}} + _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = *v + {{/required}} + {{^required}} + _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = v + {{/required}} +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_scalar.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_scalar.mustache new file mode 100644 index 0000000000..1a7849f233 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_scalar.mustache @@ -0,0 +1,9 @@ +{{#required}} +_{{name}}{{#lastFullIter}}i{{/lastFullIter}} = reader.Read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}() +{{/required}} +{{^required}} +if !reader.IsNil() { + v := reader.Read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(); + _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = {{#readPointer}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}} - v{{/readPointer}} +} +{{/required}} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/enum-type/type-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/enum-type/type-go.mustache new file mode 100644 index 0000000000..a33f6f9723 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/enum-type/type-go.mustache @@ -0,0 +1,39 @@ +package types + +type {{#toUpper}}{{type}}{{/toUpper}} int32 + +const ( + {{#constants}} + {{#toUpper}}{{type}}{{/toUpper}}{{.}} = iota + {{/constants}} + {{#toFirstLower}}{{type}}{{/toFirstLower}}Max = iota +) + +func Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(value int32) { + if !(value >= 0 && value < int32({{#toFirstLower}}{{type}}{{/toFirstLower}}Max)) { + panic("Invalid value for enum '{{#toUpper}}{{type}}{{/toUpper}}'") + } +} + +func Get{{#toUpper}}{{type}}{{/toUpper}}Value(key string) {{#toUpper}}{{type}}{{/toUpper}} { + switch key { + {{#constants}} + case "{{.}}": + return {{#toUpper}}{{type}}{{/toUpper}}{{.}} + {{/constants}} + default: + panic("Invalid key for enum '{{#toUpper}}{{type}}{{/toUpper}}'") + } +} + +func Get{{#toUpper}}{{type}}{{/toUpper}}Key(value {{#toUpper}}{{type}}{{/toUpper}}) string { + Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(int32(value)) + switch value { + {{#constants}} + case {{#toUpper}}{{type}}{{/toUpper}}{{.}}: + return "{{.}}" + {{/constants}} + default: + panic("Invalid value for enum '{{#toUpper}}{{type}}{{/toUpper}}'") + } +} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/main-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/main-go.mustache index b0cfc417d3..08d588529e 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/main-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/main-go.mustache @@ -1,18 +1,31 @@ -package {{#toFirstLower}}{{type}}{{/toFirstLower}} +package types -import "github.com/consideritdone/polywrap-go/polywrap/msgpack" +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" + "github.com/valyala/fastjson" +) -type {{type}} struct { - Value string - {{#properties}} - {{#handleKeywords}}{{#toUpper}}{{name}}{{/toUpper}}{{/handleKeywords}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} - {{/properties}} +type {{#toUpper}}{{type}}{{/toUpper}} struct { + {{#properties}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{/properties}} } -func toBuffer(args SampleResult) []byte { - return serializeSampleResult(args) +func {{#toUpper}}{{type}}{{/toUpper}}ToBuffer(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { + return serialize{{#toUpper}}{{type}}{{/toUpper}}(value) } -func Write(writer msgpack.Write, args SampleResult) { - writeSampleResult(writer, args) +func {{#toUpper}}{{type}}{{/toUpper}}FromBuffer(data []byte) *{{#toUpper}}{{type}}{{/toUpper}} { + return deserialize{{#toUpper}}{{type}}{{/toUpper}}(data) } + +func {{#toUpper}}{{type}}{{/toUpper}}Write(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { + write{{#toUpper}}{{type}}{{/toUpper}}(writer, value) +} + +func {{#toUpper}}{{type}}{{/toUpper}}Read(reader msgpack.Read) *{{#toUpper}}{{type}}{{/toUpper}} { + return read{{#toUpper}}{{type}}{{/toUpper}}(reader) +} + diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/serialization-go.mustache index b168feedb1..38c9f04e63 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/serialization-go.mustache @@ -1,22 +1,109 @@ -package {{#toFirstLower}}{{type}}{{/toFirstLower}} +package types -import "github.com/consideritdone/polywrap-go/polywrap/msgpack" +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" + "github.com/valyala/fastjson" +) -func serialize{{type}}(args {{type}}) []byte { - context := msgpack.NewContext("Serializing (encoding) object-type: {{type}}") - encoder := msgpack.NewWriteEncoder(context) - write{{type}}(encoder, args) - - return encoder.Buffer() +func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { + ctx := msgpack.NewContext("Serializing (encoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") + encoder := msgpack.NewWriteEncoder(ctx) + write{{#toUpper}}{{type}}{{/toUpper}}(encoder, value) + return encoder.Buffer() } -func write{{type}}(writer msgpack.Write, args {{type}}) { - writer.WriteMapLength({{properties.length}}) +func write{{#toUpper}}{{type}}{{/toUpper}}(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { + writer.WriteMapLength({{properties.length}}) + {{#properties}} + writer.Context().Push("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + writer.WriteString("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}") + {{#scalar}} + {{> serialize_scalar}} + {{/scalar}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> serialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> serialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> serialize_object}} + {{/object}} + {{#enum}} + {{> serialize_enum}} + {{/enum}} + writer.Context().Pop() + {{/properties}} +} + +func deserialize{{#toUpper}}{{type}}{{/toUpper}}(data []byte) *{{#toUpper}}{{type}}{{/toUpper}} { + ctx := msgpack.NewContext("Deserializing (decoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") + reader := msgpack.NewReadDecoder(ctx, data) + return read{{#toUpper}}{{type}}{{/toUpper}}(reader) +} + +func read{{#toUpper}}{{type}}{{/toUpper}}(reader msgpack.Read) *{{#toUpper}}{{type}}{{/toUpper}} { + var ( {{#properties}} - writer.Context().Push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") - writer.WriteString("{{name}}") - {{#scalar}} - writer.Write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(args.{{#handleKeywords}}{{name}}{{/handleKeywords}}); - {{/scalar}} + _{{name}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{#required}} + _{{name}}Set bool + {{/required}} {{/properties}} -} + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type"); + switch field { + {{#properties}} + case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": + reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> deserialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> deserialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + {{#required}} + _{{name}}Set = true; + {{/required}} + reader.Context().Pop() + {{/properties}} + } + reader.Context().Pop() + } + + {{#properties}} + {{#required}} + if (!_{{name}}Set) { + panic(reader.Context().PrintWithContext("Missing required property: '{{name}}: {{type}}'")) + } + {{/required}} + {{/properties}} + + return &{{#toUpper}}{{type}}{{/toUpper}}{ + {{#properties}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, + {{/properties}} + } +} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_array.mustache new file mode 100644 index 0000000000..2a807ea5b0 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_array.mustache @@ -0,0 +1,23 @@ +if value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#lastFullIter}}i{{/lastFullIter}} == nil { + writer.WriteNil() +} else if len(value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#lastFullIter}}i{{/lastFullIter}}) == 0 { + writer.WriteNil() +} else { + for {{#nextIter}}i{{/nextIter}} := range value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#prevFullIter}}i{{/prevFullIter}} { + {{#scalar}} + {{> serialize_scalar}} + {{/scalar}} + {{#enum}} + {{> serialize_enum}} + {{/enum}} + {{#array}} + {{> serialize_array}} + {{/array}} + {{#map}} + {{> serialize_map_value}} + {{/map}} + {{#object}} + {{> serialize_object}} + {{/object}} + } +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_enum.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_enum.mustache new file mode 100644 index 0000000000..3a5f83b057 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_enum.mustache @@ -0,0 +1,13 @@ +{ + v := value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#lastFullIter}}i{{/lastFullIter}} + {{#required}} + writer.WriteI32(int32(v)); + {{/required}} + {{^required}} + if v == nil { + writer.WriteNil() + } else { + writer.WriteI32(int32(*v)); + } + {{/required}} +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_map.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_map.mustache new file mode 100644 index 0000000000..ea96d27d16 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_map.mustache @@ -0,0 +1,24 @@ +if value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} == nil { + writer.WriteNil() +} else if len(value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}) == 0 { + writer.WriteNil() +} else { + for {{#nextIter}}i{{/nextIter}} := range value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#getPrevIter}}i{{/getPrevIter}} { + writer.Write{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}({{#currIter}}i{{/currIter}}) + {{#scalar}} + {{> serialize_scalar}} + {{/scalar}} + {{#enum}} + {{> serialize_enum}} + {{/enum}} + {{#array}} + {{> serialize_array}} + {{/array}} + {{#map}} + {{> serialize_map}} + {{/map}} + {{#object}} + {{> serialize_object}} + {{/object}} + } +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_object.mustache new file mode 100644 index 0000000000..95139e29c6 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_object.mustache @@ -0,0 +1,10 @@ + +{ + v := value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#lastFullIter}}i{{/lastFullIter}} + {{#required}} + {{#toUpper}}{{type}}{{/toUpper}}Write(writer, &v) + {{/required}} + {{^required}} + {{#toUpper}}{{type}}{{/toUpper}}Write(writer, v) + {{/required}} +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_scalar.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_scalar.mustache new file mode 100644 index 0000000000..256dd0ec43 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_scalar.mustache @@ -0,0 +1,13 @@ +{ + v := value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#lastFullIter}}i{{/lastFullIter}} + {{#required}} + writer.Write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(v) + {{/required}} + {{^required}} + if v == nil { + writer.WriteNil() + } else { + {{#writePointer}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}} - v{{/writePointer}} + } + {{/required}} +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/another_type.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/another_type.go new file mode 100644 index 0000000000..c66983302c --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/another_type.go @@ -0,0 +1,27 @@ +package types + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) + +type AnotherType struct { + Prop *string + Circular *CustomType + M_const *string +} + +func AnotherTypeToBuffer(value *AnotherType) []byte { + return serializeAnotherType(value) +} + +func AnotherTypeFromBuffer(data []byte) *AnotherType { + return deserializeAnotherType(data) +} + +func AnotherTypeWrite(writer msgpack.Write, value *AnotherType) { + writeAnotherType(writer, value) +} + +func AnotherTypeRead(reader msgpack.Read) *AnotherType { + return readAnotherType(reader) +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/another_type_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/another_type_serialization.go new file mode 100644 index 0000000000..682e6bde21 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/another_type_serialization.go @@ -0,0 +1,94 @@ +package types + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) + +func serializeAnotherType(value *AnotherType) []byte { + ctx := msgpack.NewContext("Serializing (encoding) env-type: AnotherType") + encoder := msgpack.NewWriteEncoder(ctx) + writeAnotherType(encoder, value) + return encoder.Buffer() +} + +func writeAnotherType(writer msgpack.Write, value *AnotherType) { + writer.WriteMapLength(3) + writer.Context().Push("Prop", "*string", "writing property") + writer.WriteString("Prop") + { + v := value.Prop + if v == nil { + writer.WriteNil() + } else { + writer.WriteString(*v) + } + } + writer.Context().Pop() + writer.Context().Push("Circular", "*CustomType", "writing property") + writer.WriteString("Circular") + + { + v := value.Circular + CustomTypeWrite(writer, v) + } + writer.Context().Pop() + writer.Context().Push("M_const", "*string", "writing property") + writer.WriteString("M_const") + { + v := value.M_const + if v == nil { + writer.WriteNil() + } else { + writer.WriteString(*v) + } + } + writer.Context().Pop() +} + +func deserializeAnotherType(data []byte) *AnotherType { + ctx := msgpack.NewContext("Deserializing (decoding) env-type: AnotherType") + reader := msgpack.NewReadDecoder(ctx, data) + return readAnotherType(reader) +} + +func readAnotherType(reader msgpack.Read) *AnotherType { + var ( + _prop *string + _circular *CustomType + _const *string + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type") + switch field { + case "Prop": + reader.Context().Push(field, "*string", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadString() + _prop = &v + } + reader.Context().Pop() + case "Circular": + reader.Context().Push(field, "*CustomType", "type found, reading property") + if v := CustomTypeRead(reader); v != nil { + _circular = v + } + reader.Context().Pop() + case "M_const": + reader.Context().Push(field, "*string", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadString() + _const = &v + } + reader.Context().Pop() + } + reader.Context().Pop() + } + + return &AnotherType{ + Prop: _prop, + Circular: _circular, + M_const: _const, + } +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_enum.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_enum.go new file mode 100644 index 0000000000..5ee8b8ac5d --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_enum.go @@ -0,0 +1,38 @@ +package types + +type CustomEnum int32 + +const ( + CustomEnumSTRING = iota + CustomEnumBYTES = iota + customEnumMax = iota +) + +func SanitizeCustomEnumValue(value int32) { + if !(value >= 0 && value < int32(customEnumMax)) { + panic("Invalid value for enum 'CustomEnum'") + } +} + +func GetCustomEnumValue(key string) CustomEnum { + switch key { + case "STRING": + return CustomEnumSTRING + case "BYTES": + return CustomEnumBYTES + default: + panic("Invalid key for enum 'CustomEnum'") + } +} + +func GetCustomEnumKey(value CustomEnum) string { + SanitizeCustomEnumValue(int32(value)) + switch value { + case CustomEnumSTRING: + return "STRING" + case CustomEnumBYTES: + return "BYTES" + default: + panic("Invalid value for enum 'CustomEnum'") + } +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_type.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_type.go new file mode 100644 index 0000000000..d2198e9826 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_type.go @@ -0,0 +1,67 @@ +package types + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + "github.com/valyala/fastjson" +) + +type CustomType struct { + Str string + OptStr *string + U uint32 + OptU *uint32 + M_u8 uint8 + M_u16 uint16 + M_u32 uint32 + I int32 + M_i8 int8 + M_i16 int16 + M_i32 int32 + Bigint *big.Int + OptBigint *big.Int + Bignumber *big.Int + OptBignumber *big.Int + Json *fastjson.Value + OptJson *fastjson.Value + Bytes []byte + OptBytes []byte + M_boolean bool + OptBoolean *bool + UArray []uint32 + UOptArray []uint32 + OptUOptArray []*uint32 + OptStrOptArray []*string + UArrayArray [][]uint32 + UOptArrayOptArray [][]*uint32 + UArrayOptArrayArray [][][]uint32 + CrazyArray [][][][]uint32 + Object AnotherType + OptObject *AnotherType + ObjectArray []AnotherType + OptObjectArray []*AnotherType + En CustomEnum + OptEnum *CustomEnum + EnumArray []CustomEnum + OptEnumArray []*CustomEnum + Map map[string]int32 + MapOfArr map[string][]int32 + MapOfObj map[string]AnotherType + MapOfArrOfObj map[string][]AnotherType +} + +func CustomTypeToBuffer(value *CustomType) []byte { + return serializeCustomType(value) +} + +func CustomTypeFromBuffer(data []byte) *CustomType { + return deserializeCustomType(data) +} + +func CustomTypeWrite(writer msgpack.Write, value *CustomType) { + writeCustomType(writer, value) +} + +func CustomTypeRead(reader msgpack.Read) *CustomType { + return readCustomType(reader) +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_type_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_type_serialization.go new file mode 100644 index 0000000000..d986dab75f --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_type_serialization.go @@ -0,0 +1,1218 @@ +package types + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + "github.com/valyala/fastjson" +) + +func serializeCustomType(value *CustomType) []byte { + ctx := msgpack.NewContext("Serializing (encoding) env-type: CustomType") + encoder := msgpack.NewWriteEncoder(ctx) + writeCustomType(encoder, value) + return encoder.Buffer() +} + +func writeCustomType(writer msgpack.Write, value *CustomType) { + writer.WriteMapLength(41) + writer.Context().Push("Str", "string", "writing property") + writer.WriteString("Str") + { + v := value.Str + writer.WriteString(v) + } + writer.Context().Pop() + writer.Context().Push("OptStr", "*string", "writing property") + writer.WriteString("OptStr") + { + v := value.OptStr + if v == nil { + writer.WriteNil() + } else { + writer.WriteString(*v) + } + } + writer.Context().Pop() + writer.Context().Push("U", "uint32", "writing property") + writer.WriteString("U") + { + v := value.U + writer.WriteU32(v) + } + writer.Context().Pop() + writer.Context().Push("OptU", "*uint32", "writing property") + writer.WriteString("OptU") + { + v := value.OptU + if v == nil { + writer.WriteNil() + } else { + writer.WriteU32(*v) + } + } + writer.Context().Pop() + writer.Context().Push("M_u8", "uint8", "writing property") + writer.WriteString("M_u8") + { + v := value.M_u8 + writer.WriteU8(v) + } + writer.Context().Pop() + writer.Context().Push("M_u16", "uint16", "writing property") + writer.WriteString("M_u16") + { + v := value.M_u16 + writer.WriteU16(v) + } + writer.Context().Pop() + writer.Context().Push("M_u32", "uint32", "writing property") + writer.WriteString("M_u32") + { + v := value.M_u32 + writer.WriteU32(v) + } + writer.Context().Pop() + writer.Context().Push("I", "int32", "writing property") + writer.WriteString("I") + { + v := value.I + writer.WriteI32(v) + } + writer.Context().Pop() + writer.Context().Push("M_i8", "int8", "writing property") + writer.WriteString("M_i8") + { + v := value.M_i8 + writer.WriteI8(v) + } + writer.Context().Pop() + writer.Context().Push("M_i16", "int16", "writing property") + writer.WriteString("M_i16") + { + v := value.M_i16 + writer.WriteI16(v) + } + writer.Context().Pop() + writer.Context().Push("M_i32", "int32", "writing property") + writer.WriteString("M_i32") + { + v := value.M_i32 + writer.WriteI32(v) + } + writer.Context().Pop() + writer.Context().Push("Bigint", "*big.Int", "writing property") + writer.WriteString("Bigint") + { + v := value.Bigint + writer.WriteBigInt(v) + } + writer.Context().Pop() + writer.Context().Push("OptBigint", "*big.Int", "writing property") + writer.WriteString("OptBigint") + { + v := value.OptBigint + if v == nil { + writer.WriteNil() + } else { + writer.WriteBigInt(v) + } + } + writer.Context().Pop() + writer.Context().Push("Bignumber", "*big.Int", "writing property") + writer.WriteString("Bignumber") + { + v := value.Bignumber + writer.WriteBigInt(v) + } + writer.Context().Pop() + writer.Context().Push("OptBignumber", "*big.Int", "writing property") + writer.WriteString("OptBignumber") + { + v := value.OptBignumber + if v == nil { + writer.WriteNil() + } else { + writer.WriteBigInt(v) + } + } + writer.Context().Pop() + writer.Context().Push("Json", "*fastjson.Value", "writing property") + writer.WriteString("Json") + { + v := value.Json + writer.WriteJson(v) + } + writer.Context().Pop() + writer.Context().Push("OptJson", "*fastjson.Value", "writing property") + writer.WriteString("OptJson") + { + v := value.OptJson + if v == nil { + writer.WriteNil() + } else { + writer.WriteJson(v) + } + } + writer.Context().Pop() + writer.Context().Push("Bytes", "[]byte", "writing property") + writer.WriteString("Bytes") + { + v := value.Bytes + writer.WriteBytes(v) + } + writer.Context().Pop() + writer.Context().Push("OptBytes", "[]byte", "writing property") + writer.WriteString("OptBytes") + { + v := value.OptBytes + if v == nil { + writer.WriteNil() + } else { + writer.WriteBytes(v) + } + } + writer.Context().Pop() + writer.Context().Push("M_boolean", "bool", "writing property") + writer.WriteString("M_boolean") + { + v := value.M_boolean + writer.WriteBool(v) + } + writer.Context().Pop() + writer.Context().Push("OptBoolean", "*bool", "writing property") + writer.WriteString("OptBoolean") + { + v := value.OptBoolean + if v == nil { + writer.WriteNil() + } else { + writer.WriteBool(*v) + } + } + writer.Context().Pop() + writer.Context().Push("UArray", "[]uint32", "writing property") + writer.WriteString("UArray") + if value.UArray == nil { + writer.WriteNil() + } else if len(value.UArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.UArray { + { + v := value.UArray[i0] + writer.WriteU32(v) + } + } + } + writer.Context().Pop() + writer.Context().Push("UOptArray", "[]uint32", "writing property") + writer.WriteString("UOptArray") + if value.UOptArray == nil { + writer.WriteNil() + } else if len(value.UOptArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.UOptArray { + { + v := value.UOptArray[i0] + writer.WriteU32(v) + } + } + } + writer.Context().Pop() + writer.Context().Push("OptUOptArray", "[]*uint32", "writing property") + writer.WriteString("OptUOptArray") + if value.OptUOptArray == nil { + writer.WriteNil() + } else if len(value.OptUOptArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.OptUOptArray { + { + v := value.OptUOptArray[i0] + if v == nil { + writer.WriteNil() + } else { + writer.WriteU32(*v) + } + } + } + } + writer.Context().Pop() + writer.Context().Push("OptStrOptArray", "[]*string", "writing property") + writer.WriteString("OptStrOptArray") + if value.OptStrOptArray == nil { + writer.WriteNil() + } else if len(value.OptStrOptArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.OptStrOptArray { + { + v := value.OptStrOptArray[i0] + if v == nil { + writer.WriteNil() + } else { + writer.WriteString(*v) + } + } + } + } + writer.Context().Pop() + writer.Context().Push("UArrayArray", "[][]uint32", "writing property") + writer.WriteString("UArrayArray") + if value.UArrayArray == nil { + writer.WriteNil() + } else if len(value.UArrayArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.UArrayArray { + if value.UArrayArray[i0] == nil { + writer.WriteNil() + } else if len(value.UArrayArray[i0]) == 0 { + writer.WriteNil() + } else { + for i1 := range value.UArrayArray[i0] { + { + v := value.UArrayArray[i0][i1] + writer.WriteU32(v) + } + } + } + } + } + writer.Context().Pop() + writer.Context().Push("UOptArrayOptArray", "[][]*uint32", "writing property") + writer.WriteString("UOptArrayOptArray") + if value.UOptArrayOptArray == nil { + writer.WriteNil() + } else if len(value.UOptArrayOptArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.UOptArrayOptArray { + if value.UOptArrayOptArray[i0] == nil { + writer.WriteNil() + } else if len(value.UOptArrayOptArray[i0]) == 0 { + writer.WriteNil() + } else { + for i1 := range value.UOptArrayOptArray[i0] { + { + v := value.UOptArrayOptArray[i0][i1] + if v == nil { + writer.WriteNil() + } else { + writer.WriteU32(*v) + } + } + } + } + } + } + writer.Context().Pop() + writer.Context().Push("UArrayOptArrayArray", "[][][]uint32", "writing property") + writer.WriteString("UArrayOptArrayArray") + if value.UArrayOptArrayArray == nil { + writer.WriteNil() + } else if len(value.UArrayOptArrayArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.UArrayOptArrayArray { + if value.UArrayOptArrayArray[i0] == nil { + writer.WriteNil() + } else if len(value.UArrayOptArrayArray[i0]) == 0 { + writer.WriteNil() + } else { + for i1 := range value.UArrayOptArrayArray[i0] { + if value.UArrayOptArrayArray[i0][i1] == nil { + writer.WriteNil() + } else if len(value.UArrayOptArrayArray[i0][i1]) == 0 { + writer.WriteNil() + } else { + for i2 := range value.UArrayOptArrayArray[i0][i1] { + { + v := value.UArrayOptArrayArray[i0][i1][i2] + writer.WriteU32(v) + } + } + } + } + } + } + } + writer.Context().Pop() + writer.Context().Push("CrazyArray", "[][][][]uint32", "writing property") + writer.WriteString("CrazyArray") + if value.CrazyArray == nil { + writer.WriteNil() + } else if len(value.CrazyArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.CrazyArray { + if value.CrazyArray[i0] == nil { + writer.WriteNil() + } else if len(value.CrazyArray[i0]) == 0 { + writer.WriteNil() + } else { + for i1 := range value.CrazyArray[i0] { + if value.CrazyArray[i0][i1] == nil { + writer.WriteNil() + } else if len(value.CrazyArray[i0][i1]) == 0 { + writer.WriteNil() + } else { + for i2 := range value.CrazyArray[i0][i1] { + if value.CrazyArray[i0][i1][i2] == nil { + writer.WriteNil() + } else if len(value.CrazyArray[i0][i1][i2]) == 0 { + writer.WriteNil() + } else { + for i3 := range value.CrazyArray[i0][i1][i2] { + { + v := value.CrazyArray[i0][i1][i2][i3] + writer.WriteU32(v) + } + } + } + } + } + } + } + } + } + writer.Context().Pop() + writer.Context().Push("Object", "AnotherType", "writing property") + writer.WriteString("Object") + + { + v := value.Object + AnotherTypeWrite(writer, &v) + } + writer.Context().Pop() + writer.Context().Push("OptObject", "*AnotherType", "writing property") + writer.WriteString("OptObject") + + { + v := value.OptObject + AnotherTypeWrite(writer, v) + } + writer.Context().Pop() + writer.Context().Push("ObjectArray", "[]AnotherType", "writing property") + writer.WriteString("ObjectArray") + if value.ObjectArray == nil { + writer.WriteNil() + } else if len(value.ObjectArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.ObjectArray { + + { + v := value.ObjectArray[i0] + AnotherTypeWrite(writer, &v) + } + } + } + writer.Context().Pop() + writer.Context().Push("OptObjectArray", "[]*AnotherType", "writing property") + writer.WriteString("OptObjectArray") + if value.OptObjectArray == nil { + writer.WriteNil() + } else if len(value.OptObjectArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.OptObjectArray { + + { + v := value.OptObjectArray[i0] + AnotherTypeWrite(writer, v) + } + } + } + writer.Context().Pop() + writer.Context().Push("En", "CustomEnum", "writing property") + writer.WriteString("En") + { + v := value.En + writer.WriteI32(int32(v)); + } + writer.Context().Pop() + writer.Context().Push("OptEnum", "*CustomEnum", "writing property") + writer.WriteString("OptEnum") + { + v := value.OptEnum + if v == nil { + writer.WriteNil() + } else { + writer.WriteI32(int32(*v)); + } + } + writer.Context().Pop() + writer.Context().Push("EnumArray", "[]CustomEnum", "writing property") + writer.WriteString("EnumArray") + if value.EnumArray == nil { + writer.WriteNil() + } else if len(value.EnumArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.EnumArray { + { + v := value.EnumArray[i0] + writer.WriteI32(int32(v)); + } + } + } + writer.Context().Pop() + writer.Context().Push("OptEnumArray", "[]*CustomEnum", "writing property") + writer.WriteString("OptEnumArray") + if value.OptEnumArray == nil { + writer.WriteNil() + } else if len(value.OptEnumArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.OptEnumArray { + { + v := value.OptEnumArray[i0] + if v == nil { + writer.WriteNil() + } else { + writer.WriteI32(int32(*v)); + } + } + } + } + writer.Context().Pop() + writer.Context().Push("Map", "map[string]int32", "writing property") + writer.WriteString("Map") + if value.Map == nil { + writer.WriteNil() + } else if len(value.Map) == 0 { + writer.WriteNil() + } else { + for i0 := range value.Map { + writer.WriteString(i0) + { + v := value.Map[i0] + writer.WriteI32(v) + } + } + } + writer.Context().Pop() + writer.Context().Push("MapOfArr", "map[string][]int32", "writing property") + writer.WriteString("MapOfArr") + if value.MapOfArr == nil { + writer.WriteNil() + } else if len(value.MapOfArr) == 0 { + writer.WriteNil() + } else { + for i0 := range value.MapOfArr { + writer.WriteString(i0) + if value.MapOfArr[i0] == nil { + writer.WriteNil() + } else if len(value.MapOfArr[i0]) == 0 { + writer.WriteNil() + } else { + for i1 := range value.MapOfArr[i0] { + { + v := value.MapOfArr[i0][i1] + writer.WriteI32(v) + } + } + } + } + } + writer.Context().Pop() + writer.Context().Push("MapOfObj", "map[string]AnotherType", "writing property") + writer.WriteString("MapOfObj") + if value.MapOfObj == nil { + writer.WriteNil() + } else if len(value.MapOfObj) == 0 { + writer.WriteNil() + } else { + for i0 := range value.MapOfObj { + writer.WriteString(i0) + + { + v := value.MapOfObj[i0] + AnotherTypeWrite(writer, &v) + } + } + } + writer.Context().Pop() + writer.Context().Push("MapOfArrOfObj", "map[string][]AnotherType", "writing property") + writer.WriteString("MapOfArrOfObj") + if value.MapOfArrOfObj == nil { + writer.WriteNil() + } else if len(value.MapOfArrOfObj) == 0 { + writer.WriteNil() + } else { + for i0 := range value.MapOfArrOfObj { + writer.WriteString(i0) + if value.MapOfArrOfObj[i0] == nil { + writer.WriteNil() + } else if len(value.MapOfArrOfObj[i0]) == 0 { + writer.WriteNil() + } else { + for i1 := range value.MapOfArrOfObj[i0] { + + { + v := value.MapOfArrOfObj[i0][i1] + AnotherTypeWrite(writer, &v) + } + } + } + } + } + writer.Context().Pop() +} + +func deserializeCustomType(data []byte) *CustomType { + ctx := msgpack.NewContext("Deserializing (decoding) env-type: CustomType") + reader := msgpack.NewReadDecoder(ctx, data) + return readCustomType(reader) +} + +func readCustomType(reader msgpack.Read) *CustomType { + var ( + _str string + _strSet bool + _optStr *string + _u uint32 + _uSet bool + _optU *uint32 + _u8 uint8 + _u8Set bool + _u16 uint16 + _u16Set bool + _u32 uint32 + _u32Set bool + _i int32 + _iSet bool + _i8 int8 + _i8Set bool + _i16 int16 + _i16Set bool + _i32 int32 + _i32Set bool + _bigint *big.Int + _bigintSet bool + _optBigint *big.Int + _bignumber *big.Int + _bignumberSet bool + _optBignumber *big.Int + _json *fastjson.Value + _jsonSet bool + _optJson *fastjson.Value + _bytes []byte + _bytesSet bool + _optBytes []byte + _boolean bool + _booleanSet bool + _optBoolean *bool + _uArray []uint32 + _uArraySet bool + _uOptArray []uint32 + _optUOptArray []*uint32 + _optStrOptArray []*string + _uArrayArray [][]uint32 + _uArrayArraySet bool + _uOptArrayOptArray [][]*uint32 + _uOptArrayOptArraySet bool + _uArrayOptArrayArray [][][]uint32 + _uArrayOptArrayArraySet bool + _crazyArray [][][][]uint32 + _object AnotherType + _objectSet bool + _optObject *AnotherType + _objectArray []AnotherType + _objectArraySet bool + _optObjectArray []*AnotherType + _en CustomEnum + _enSet bool + _optEnum *CustomEnum + _enumArray []CustomEnum + _enumArraySet bool + _optEnumArray []*CustomEnum + _map map[string]int32 + _mapSet bool + _mapOfArr map[string][]int32 + _mapOfArrSet bool + _mapOfObj map[string]AnotherType + _mapOfObjSet bool + _mapOfArrOfObj map[string][]AnotherType + _mapOfArrOfObjSet bool + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type"); + switch field { + case "Str": + reader.Context().Push(field, "string", "type found, reading property") + _str = reader.ReadString() + _strSet = true; + reader.Context().Pop() + case "OptStr": + reader.Context().Push(field, "*string", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadString(); + _optStr = &v + } + reader.Context().Pop() + case "U": + reader.Context().Push(field, "uint32", "type found, reading property") + _u = reader.ReadU32() + _uSet = true; + reader.Context().Pop() + case "OptU": + reader.Context().Push(field, "*uint32", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadU32(); + _optU = &v + } + reader.Context().Pop() + case "M_u8": + reader.Context().Push(field, "uint8", "type found, reading property") + _u8 = reader.ReadU8() + _u8Set = true; + reader.Context().Pop() + case "M_u16": + reader.Context().Push(field, "uint16", "type found, reading property") + _u16 = reader.ReadU16() + _u16Set = true; + reader.Context().Pop() + case "M_u32": + reader.Context().Push(field, "uint32", "type found, reading property") + _u32 = reader.ReadU32() + _u32Set = true; + reader.Context().Pop() + case "I": + reader.Context().Push(field, "int32", "type found, reading property") + _i = reader.ReadI32() + _iSet = true; + reader.Context().Pop() + case "M_i8": + reader.Context().Push(field, "int8", "type found, reading property") + _i8 = reader.ReadI8() + _i8Set = true; + reader.Context().Pop() + case "M_i16": + reader.Context().Push(field, "int16", "type found, reading property") + _i16 = reader.ReadI16() + _i16Set = true; + reader.Context().Pop() + case "M_i32": + reader.Context().Push(field, "int32", "type found, reading property") + _i32 = reader.ReadI32() + _i32Set = true; + reader.Context().Pop() + case "Bigint": + reader.Context().Push(field, "*big.Int", "type found, reading property") + _bigint = reader.ReadBigInt() + _bigintSet = true; + reader.Context().Pop() + case "OptBigint": + reader.Context().Push(field, "*big.Int", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadBigInt(); + _optBigint = v + } + reader.Context().Pop() + case "Bignumber": + reader.Context().Push(field, "*big.Int", "type found, reading property") + _bignumber = reader.ReadBigInt() + _bignumberSet = true; + reader.Context().Pop() + case "OptBignumber": + reader.Context().Push(field, "*big.Int", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadBigInt(); + _optBignumber = v + } + reader.Context().Pop() + case "Json": + reader.Context().Push(field, "*fastjson.Value", "type found, reading property") + _json = reader.ReadJson() + _jsonSet = true; + reader.Context().Pop() + case "OptJson": + reader.Context().Push(field, "*fastjson.Value", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadJson(); + _optJson = v + } + reader.Context().Pop() + case "Bytes": + reader.Context().Push(field, "[]byte", "type found, reading property") + _bytes = reader.ReadBytes() + _bytesSet = true; + reader.Context().Pop() + case "OptBytes": + reader.Context().Push(field, "[]byte", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadBytes(); + _optBytes = v + } + reader.Context().Pop() + case "M_boolean": + reader.Context().Push(field, "bool", "type found, reading property") + _boolean = reader.ReadBool() + _booleanSet = true; + reader.Context().Pop() + case "OptBoolean": + reader.Context().Push(field, "*bool", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadBool(); + _optBoolean = &v + } + reader.Context().Pop() + case "UArray": + reader.Context().Push(field, "[]uint32", "type found, reading property") + if reader.IsNil() { + _uArray = nil + } else { + ln0 := reader.ReadArrayLength() + _uArray = make([]uint32, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + _uArray[i0] = reader.ReadU32() + } + } + _uArraySet = true; + reader.Context().Pop() + case "UOptArray": + reader.Context().Push(field, "[]uint32", "type found, reading property") + if reader.IsNil() { + _uOptArray = nil + } else { + ln0 := reader.ReadArrayLength() + _uOptArray = make([]uint32, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + _uOptArray[i0] = reader.ReadU32() + } + } + reader.Context().Pop() + case "OptUOptArray": + reader.Context().Push(field, "[]*uint32", "type found, reading property") + if reader.IsNil() { + _optUOptArray = nil + } else { + ln0 := reader.ReadArrayLength() + _optUOptArray = make([]*uint32, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if !reader.IsNil() { + v := reader.ReadU32(); + _optUOptArray[i0] = &v + } + } + } + reader.Context().Pop() + case "OptStrOptArray": + reader.Context().Push(field, "[]*string", "type found, reading property") + if reader.IsNil() { + _optStrOptArray = nil + } else { + ln0 := reader.ReadArrayLength() + _optStrOptArray = make([]*string, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if !reader.IsNil() { + v := reader.ReadString(); + _optStrOptArray[i0] = &v + } + } + } + reader.Context().Pop() + case "UArrayArray": + reader.Context().Push(field, "[][]uint32", "type found, reading property") + if reader.IsNil() { + _uArrayArray = nil + } else { + ln0 := reader.ReadArrayLength() + _uArrayArray = make([][]uint32, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if reader.IsNil() { + _uArrayArray[i0] = nil + } else { + ln1 := reader.ReadArrayLength() + _uArrayArray[i0] = make([]uint32, ln1) + for i1 := uint32(0); i1 < ln1; i1++ { + _uArrayArray[i0][i1] = reader.ReadU32() + } + } + } + } + _uArrayArraySet = true; + reader.Context().Pop() + case "UOptArrayOptArray": + reader.Context().Push(field, "[][]*uint32", "type found, reading property") + if reader.IsNil() { + _uOptArrayOptArray = nil + } else { + ln0 := reader.ReadArrayLength() + _uOptArrayOptArray = make([][]*uint32, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if reader.IsNil() { + _uOptArrayOptArray[i0] = nil + } else { + ln1 := reader.ReadArrayLength() + _uOptArrayOptArray[i0] = make([]*uint32, ln1) + for i1 := uint32(0); i1 < ln1; i1++ { + if !reader.IsNil() { + v := reader.ReadU32(); + _uOptArrayOptArray[i0][i1] = &v + } + } + } + } + } + _uOptArrayOptArraySet = true; + reader.Context().Pop() + case "UArrayOptArrayArray": + reader.Context().Push(field, "[][][]uint32", "type found, reading property") + if reader.IsNil() { + _uArrayOptArrayArray = nil + } else { + ln0 := reader.ReadArrayLength() + _uArrayOptArrayArray = make([][][]uint32, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if reader.IsNil() { + _uArrayOptArrayArray[i0] = nil + } else { + ln1 := reader.ReadArrayLength() + _uArrayOptArrayArray[i0] = make([][]uint32, ln1) + for i1 := uint32(0); i1 < ln1; i1++ { + if reader.IsNil() { + _uArrayOptArrayArray[i0][i1] = nil + } else { + ln2 := reader.ReadArrayLength() + _uArrayOptArrayArray[i0][i1] = make([]uint32, ln2) + for i2 := uint32(0); i2 < ln2; i2++ { + _uArrayOptArrayArray[i0][i1][i2] = reader.ReadU32() + } + } + } + } + } + } + _uArrayOptArrayArraySet = true; + reader.Context().Pop() + case "CrazyArray": + reader.Context().Push(field, "[][][][]uint32", "type found, reading property") + if reader.IsNil() { + _crazyArray = nil + } else { + ln0 := reader.ReadArrayLength() + _crazyArray = make([][][][]uint32, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if reader.IsNil() { + _crazyArray[i0] = nil + } else { + ln1 := reader.ReadArrayLength() + _crazyArray[i0] = make([][][]uint32, ln1) + for i1 := uint32(0); i1 < ln1; i1++ { + if reader.IsNil() { + _crazyArray[i0][i1] = nil + } else { + ln2 := reader.ReadArrayLength() + _crazyArray[i0][i1] = make([][]uint32, ln2) + for i2 := uint32(0); i2 < ln2; i2++ { + if reader.IsNil() { + _crazyArray[i0][i1][i2] = nil + } else { + ln3 := reader.ReadArrayLength() + _crazyArray[i0][i1][i2] = make([]uint32, ln3) + for i3 := uint32(0); i3 < ln3; i3++ { + _crazyArray[i0][i1][i2][i3] = reader.ReadU32() + } + } + } + } + } + } + } + } + reader.Context().Pop() + case "Object": + reader.Context().Push(field, "AnotherType", "type found, reading property") + if v := AnotherTypeRead(reader); v != nil { + _object = *v + } + _objectSet = true; + reader.Context().Pop() + case "OptObject": + reader.Context().Push(field, "*AnotherType", "type found, reading property") + if v := AnotherTypeRead(reader); v != nil { + _optObject = v + } + reader.Context().Pop() + case "ObjectArray": + reader.Context().Push(field, "[]AnotherType", "type found, reading property") + if reader.IsNil() { + _objectArray = nil + } else { + ln0 := reader.ReadArrayLength() + _objectArray = make([]AnotherType, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if v := AnotherTypeRead(reader); v != nil { + _objectArray[i0] = *v + } + } + } + _objectArraySet = true; + reader.Context().Pop() + case "OptObjectArray": + reader.Context().Push(field, "[]*AnotherType", "type found, reading property") + if reader.IsNil() { + _optObjectArray = nil + } else { + ln0 := reader.ReadArrayLength() + _optObjectArray = make([]*AnotherType, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if v := AnotherTypeRead(reader); v != nil { + _optObjectArray[i0] = v + } + } + } + reader.Context().Pop() + case "En": + reader.Context().Push(field, "CustomEnum", "type found, reading property") + _en = CustomEnum(reader.ReadI32()) + SanitizeCustomEnumValue(int32(_en)) + _enSet = true; + reader.Context().Pop() + case "OptEnum": + reader.Context().Push(field, "*CustomEnum", "type found, reading property") + if !reader.IsNil() { + v := CustomEnum(reader.ReadI32()) + SanitizeCustomEnumValue(int32(v)) + _optEnum = &v + } + reader.Context().Pop() + case "EnumArray": + reader.Context().Push(field, "[]CustomEnum", "type found, reading property") + if reader.IsNil() { + _enumArray = nil + } else { + ln0 := reader.ReadArrayLength() + _enumArray = make([]CustomEnum, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + _enumArray[i0] = CustomEnum(reader.ReadI32()) + SanitizeCustomEnumValue(int32(_enumArray[i0])) + } + } + _enumArraySet = true; + reader.Context().Pop() + case "OptEnumArray": + reader.Context().Push(field, "[]*CustomEnum", "type found, reading property") + if reader.IsNil() { + _optEnumArray = nil + } else { + ln0 := reader.ReadArrayLength() + _optEnumArray = make([]*CustomEnum, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if !reader.IsNil() { + v := CustomEnum(reader.ReadI32()) + SanitizeCustomEnumValue(int32(v)) + _optEnumArray[i0] = &v + } + } + } + reader.Context().Pop() + case "Map": + reader.Context().Push(field, "map[string]int32", "type found, reading property") + if reader.IsNil() { + _map = nil + } else { + ln0 := reader.ReadMapLength() + _map = make(map[string]int32) + for j0 := uint32(0); j0 < ln0; j0++ { + i0 := reader.ReadString() + _map[i0] = reader.ReadI32() + } + } + _mapSet = true; + reader.Context().Pop() + case "MapOfArr": + reader.Context().Push(field, "map[string][]int32", "type found, reading property") + if reader.IsNil() { + _mapOfArr = nil + } else { + ln0 := reader.ReadMapLength() + _mapOfArr = make(map[string][]int32) + for j0 := uint32(0); j0 < ln0; j0++ { + i0 := reader.ReadString() + if reader.IsNil() { + _mapOfArr[i0] = nil + } else { + ln1 := reader.ReadArrayLength() + _mapOfArr[i0] = make([]int32, ln1) + for i1 := uint32(0); i1 < ln1; i1++ { + _mapOfArr[i0][i1] = reader.ReadI32() + } + } + } + } + _mapOfArrSet = true; + reader.Context().Pop() + case "MapOfObj": + reader.Context().Push(field, "map[string]AnotherType", "type found, reading property") + if reader.IsNil() { + _mapOfObj = nil + } else { + ln0 := reader.ReadMapLength() + _mapOfObj = make(map[string]AnotherType) + for j0 := uint32(0); j0 < ln0; j0++ { + i0 := reader.ReadString() + if v := AnotherTypeRead(reader); v != nil { + _mapOfObj[i0] = *v + } + } + } + _mapOfObjSet = true; + reader.Context().Pop() + case "MapOfArrOfObj": + reader.Context().Push(field, "map[string][]AnotherType", "type found, reading property") + if reader.IsNil() { + _mapOfArrOfObj = nil + } else { + ln0 := reader.ReadMapLength() + _mapOfArrOfObj = make(map[string][]AnotherType) + for j0 := uint32(0); j0 < ln0; j0++ { + i0 := reader.ReadString() + if reader.IsNil() { + _mapOfArrOfObj[i0] = nil + } else { + ln1 := reader.ReadArrayLength() + _mapOfArrOfObj[i0] = make([]AnotherType, ln1) + for i1 := uint32(0); i1 < ln1; i1++ { + if v := AnotherTypeRead(reader); v != nil { + _mapOfArrOfObj[i0][i1] = *v + } + } + } + } + } + _mapOfArrOfObjSet = true; + reader.Context().Pop() + } + reader.Context().Pop() + } + + if (!_strSet) { + panic(reader.Context().PrintWithContext("Missing required property: 'str: String'")) + } + if (!_uSet) { + panic(reader.Context().PrintWithContext("Missing required property: 'u: UInt'")) + } + if (!_u8Set) { + panic(reader.Context().PrintWithContext("Missing required property: 'u8: UInt8'")) + } + if (!_u16Set) { + panic(reader.Context().PrintWithContext("Missing required property: 'u16: UInt16'")) + } + if (!_u32Set) { + panic(reader.Context().PrintWithContext("Missing required property: 'u32: UInt32'")) + } + if (!_iSet) { + panic(reader.Context().PrintWithContext("Missing required property: 'i: Int'")) + } + if (!_i8Set) { + panic(reader.Context().PrintWithContext("Missing required property: 'i8: Int8'")) + } + if (!_i16Set) { + panic(reader.Context().PrintWithContext("Missing required property: 'i16: Int16'")) + } + if (!_i32Set) { + panic(reader.Context().PrintWithContext("Missing required property: 'i32: Int32'")) + } + if (!_bigintSet) { + panic(reader.Context().PrintWithContext("Missing required property: 'bigint: BigInt'")) + } + if (!_bignumberSet) { + panic(reader.Context().PrintWithContext("Missing required property: 'bignumber: BigNumber'")) + } + if (!_jsonSet) { + panic(reader.Context().PrintWithContext("Missing required property: 'json: JSON'")) + } + if (!_bytesSet) { + panic(reader.Context().PrintWithContext("Missing required property: 'bytes: Bytes'")) + } + if (!_booleanSet) { + panic(reader.Context().PrintWithContext("Missing required property: 'boolean: Boolean'")) + } + if (!_uArraySet) { + panic(reader.Context().PrintWithContext("Missing required property: 'uArray: [UInt]'")) + } + if (!_uArrayArraySet) { + panic(reader.Context().PrintWithContext("Missing required property: 'uArrayArray: [[UInt]]'")) + } + if (!_uOptArrayOptArraySet) { + panic(reader.Context().PrintWithContext("Missing required property: 'uOptArrayOptArray: [[UInt32]]'")) + } + if (!_uArrayOptArrayArraySet) { + panic(reader.Context().PrintWithContext("Missing required property: 'uArrayOptArrayArray: [[[UInt32]]]'")) + } + if (!_objectSet) { + panic(reader.Context().PrintWithContext("Missing required property: 'object: AnotherType'")) + } + if (!_objectArraySet) { + panic(reader.Context().PrintWithContext("Missing required property: 'objectArray: [AnotherType]'")) + } + if (!_enSet) { + panic(reader.Context().PrintWithContext("Missing required property: 'en: CustomEnum'")) + } + if (!_enumArraySet) { + panic(reader.Context().PrintWithContext("Missing required property: 'enumArray: [CustomEnum]'")) + } + if (!_mapSet) { + panic(reader.Context().PrintWithContext("Missing required property: 'map: Map'")) + } + if (!_mapOfArrSet) { + panic(reader.Context().PrintWithContext("Missing required property: 'mapOfArr: Map'")) + } + if (!_mapOfObjSet) { + panic(reader.Context().PrintWithContext("Missing required property: 'mapOfObj: Map'")) + } + if (!_mapOfArrOfObjSet) { + panic(reader.Context().PrintWithContext("Missing required property: 'mapOfArrOfObj: Map'")) + } + + return &CustomType{ + Str: _str, + OptStr: _optStr, + U: _u, + OptU: _optU, + M_u8: _u8, + M_u16: _u16, + M_u32: _u32, + I: _i, + M_i8: _i8, + M_i16: _i16, + M_i32: _i32, + Bigint: _bigint, + OptBigint: _optBigint, + Bignumber: _bignumber, + OptBignumber: _optBignumber, + Json: _json, + OptJson: _optJson, + Bytes: _bytes, + OptBytes: _optBytes, + M_boolean: _boolean, + OptBoolean: _optBoolean, + UArray: _uArray, + UOptArray: _uOptArray, + OptUOptArray: _optUOptArray, + OptStrOptArray: _optStrOptArray, + UArrayArray: _uArrayArray, + UOptArrayOptArray: _uOptArrayOptArray, + UArrayOptArrayArray: _uArrayOptArrayArray, + CrazyArray: _crazyArray, + Object: _object, + OptObject: _optObject, + ObjectArray: _objectArray, + OptObjectArray: _optObjectArray, + En: _en, + OptEnum: _optEnum, + EnumArray: _enumArray, + OptEnumArray: _optEnumArray, + Map: _map, + MapOfArr: _mapOfArr, + MapOfObj: _mapOfObj, + MapOfArrOfObj: _mapOfArrOfObj, + } +} \ No newline at end of file diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/env.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/env.go new file mode 100644 index 0000000000..3ee18a765c --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/env.go @@ -0,0 +1,27 @@ +package types + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) + +type Env struct { + Prop string + OptProp *string + OptMap map[string]*int32 +} + +func EnvToBuffer(value *Env) []byte { + return serializeEnv(value) +} + +func EnvFromBuffer(data []byte) *Env { + return deserializeEnv(data) +} + +func EnvWrite(writer msgpack.Write, value *Env) { + writeEnv(writer, value) +} + +func EnvRead(reader msgpack.Read) *Env { + return readEnv(reader) +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/env_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/env_serialization.go new file mode 100644 index 0000000000..5b7e8a9345 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/env_serialization.go @@ -0,0 +1,115 @@ +package types + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) + +func serializeEnv(value *Env) []byte { + ctx := msgpack.NewContext("Serializing (encoding) env-type: Env") + encoder := msgpack.NewWriteEncoder(ctx) + writeEnv(encoder, value) + return encoder.Buffer() +} + +func writeEnv(writer msgpack.Write, value *Env) { + writer.WriteMapLength(3) + writer.Context().Push("Prop", "string", "writing property") + writer.WriteString("Prop") + { + v := value.Prop + writer.WriteString(v) + } + writer.Context().Pop() + writer.Context().Push("OptProp", "*string", "writing property") + writer.WriteString("OptProp") + { + v := value.OptProp + if v == nil { + writer.WriteNil() + } else { + writer.WriteString(*v) + } + } + writer.Context().Pop() + writer.Context().Push("OptMap", "map[string]*int32", "writing property") + writer.WriteString("OptMap") + if value.OptMap == nil { + writer.WriteNil() + } else if len(value.OptMap) == 0 { + writer.WriteNil() + } else { + for i0 := range value.OptMap { + writer.WriteString(i0) + { + v := value.OptMap[i0] + if v == nil { + writer.WriteNil() + } else { + writer.WriteI32(*v) + } + } + } + } + writer.Context().Pop() +} + +func deserializeEnv(data []byte) *Env { + ctx := msgpack.NewContext("Deserializing (decoding) env-type: Env") + reader := msgpack.NewReadDecoder(ctx, data) + return readEnv(reader) +} + +func readEnv(reader msgpack.Read) *Env { + var ( + _prop string + _propSet bool + _optProp *string + _optMap map[string]*int32 + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type") + switch field { + case "Prop": + reader.Context().Push(field, "string", "type found, reading property") + _prop = reader.ReadString() + _propSet = true + reader.Context().Pop() + case "OptProp": + reader.Context().Push(field, "*string", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadString() + _optProp = &v + } + reader.Context().Pop() + case "OptMap": + reader.Context().Push(field, "map[string]*int32", "type found, reading property") + if reader.IsNil() { + _optMap = nil + } else { + ln0 := reader.ReadMapLength() + _optMap = make(map[string]*int32) + for j0 := uint32(0); j0 < ln0; j0++ { + i0 := reader.ReadString() + if !reader.IsNil() { + v := reader.ReadI32() + _optMap[i0] = &v + } + } + } + reader.Context().Pop() + } + reader.Context().Pop() + } + + if !_propSet { + panic(reader.Context().PrintWithContext("Missing required property: 'prop: String'")) + } + + return &Env{ + Prop: _prop, + OptProp: _optProp, + OptMap: _optMap, + } +} From 5ad800a731b17c5eacf7fb0eb0caeeccc2cf3e31 Mon Sep 17 00:00:00 2001 From: ramil Date: Tue, 16 Aug 2022 15:06:00 +0300 Subject: [PATCH 004/181] debug: parse template filename --- .../bind/src/bindings/golang/wasm-go/index.ts | 74 +++++++++++-------- packages/schema/bind/src/bindings/utils.ts | 2 +- 2 files changed, 44 insertions(+), 32 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/index.ts b/packages/schema/bind/src/bindings/golang/wasm-go/index.ts index 4704b19d59..e577b0da3a 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm-go/index.ts @@ -34,7 +34,7 @@ export const generateBinding: GenerateBindingFn = ( for (const objectType of abi.objectTypes) { output.entries.push({ type: "Directory", - name: objectType.type, + name: "abc", data: renderTemplates( templatePath("object-type"), objectType, @@ -43,6 +43,18 @@ export const generateBinding: GenerateBindingFn = ( }); } + // if (abi.moduleType) { + // output.entries.push({ + // type: "Directory", + // name: "types", + // data: renderTemplates( + // templatePath("types"), + // abi.moduleType, + // subTemplates + // ), + // }); + // } + // Generate imported folder const importEntries: OutputEntry[] = []; @@ -123,38 +135,38 @@ export const generateBinding: GenerateBindingFn = ( // } // // Generate module type folders - if (abi.moduleType) { - output.entries.push({ - type: "Directory", - name: abi.moduleType.type, - data: renderTemplates( - templatePath("module-type"), - abi.moduleType, - subTemplates - ), - }); - } - - // Generate enum type folders - for (const enumType of abi.enumTypes) { - output.entries.push({ - type: "Directory", - name: enumType.type, - data: renderTemplates(templatePath("enum-type"), enumType, subTemplates), - }); - } - - // Generate env type folders - if (abi.envType) { - output.entries.push({ - type: "Directory", - name: abi.envType.type, - data: renderTemplates(templatePath("object-type"), abi.envType, subTemplates), - }); - } + // if (abi.moduleType) { + // output.entries.push({ + // type: "Directory", + // name: abi.moduleType.type, + // data: renderTemplates( + // templatePath("module-type"), + // abi.moduleType, + // subTemplates + // ), + // }); + // } + // + // // Generate enum type folders + // for (const enumType of abi.enumTypes) { + // output.entries.push({ + // type: "Directory", + // name: enumType.type, + // data: renderTemplates(templatePath("enum-type"), enumType, subTemplates), + // }); + // } + // + // // Generate env type folders + // if (abi.envType) { + // output.entries.push({ + // type: "Directory", + // name: abi.envType.type, + // data: renderTemplates(templatePath("object-type"), abi.envType, subTemplates), + // }); + // } // Generate root entry file - output.entries.push(...renderTemplates(templatePath(""), abi, subTemplates)); + // output.entries.push(...renderTemplates(templatePath(""), abi, subTemplates)); return result; }; diff --git a/packages/schema/bind/src/bindings/utils.ts b/packages/schema/bind/src/bindings/utils.ts index fac191d695..f3be1c7846 100644 --- a/packages/schema/bind/src/bindings/utils.ts +++ b/packages/schema/bind/src/bindings/utils.ts @@ -27,7 +27,7 @@ export function renderTemplates( if (data) { output.push({ type: "File", - name: name.replace("-", "."), + name: name.replace("-", ".").replace("%type%", (view as {type: string}).type.toLowerCase()), data, }); } From bbf6f57a706aa01f49b9a9fe7c46be32140dd6c0 Mon Sep 17 00:00:00 2001 From: n0cte Date: Fri, 19 Aug 2022 02:39:50 +0300 Subject: [PATCH 005/181] add serialization and deserialization for impors, interfaces, modules --- .../src/bindings/golang/wasm-go/functions.ts | 8 + .../bind/src/bindings/golang/wasm-go/index.ts | 216 +++++++++--------- ...ype-go.mustache => Enum%type%-go.mustache} | 0 .../Env%type%-go.mustache} | 0 .../Env%type%Serialization-go.mustache} | 0 .../imported/enum-type/Enum%type%-go.mustache | 39 ++++ .../imported/env-type/Env%type%-go.mustache | 31 +++ .../Env%type%Serialization-go.mustache | 109 +++++++++ .../interface-type/%type%-go.mustache | 19 ++ .../%type%Serialization-go.mustache | 84 +++++++ .../module-type/%type%Wrapped-go.mustache | 39 ++++ .../object-type/Object%type%-go.mustache | 31 +++ .../Object%type%Serialization-go.mustache | 109 +++++++++ .../interface-type/%type%-go.mustache | 19 ++ .../%type%Serialization-go.mustache | 115 ++++++++++ .../module-type/%type%Wrapped-go.mustache | 35 +++ .../module-type/serialization-go.mustache | 69 ------ .../object-type/Object%type%-go.mustache | 31 +++ .../Object%type%Serialization-go.mustache | 109 +++++++++ .../value_deserialize_array.mustache | 23 ++ .../templates/value_deserialize_enum.mustache | 11 + .../templates/value_deserialize_map.mustache | 24 ++ .../value_deserialize_object.mustache | 8 + .../value_deserialize_scalar.mustache | 9 + .../templates/value_serialize_array.mustache | 23 ++ .../templates/value_serialize_enum.mustache | 13 ++ .../templates/value_serialize_map.mustache | 24 ++ .../templates/value_serialize_object.mustache | 9 + .../templates/value_serialize_scalar.mustache | 13 ++ packages/schema/bind/src/bindings/utils.ts | 15 +- 30 files changed, 1060 insertions(+), 175 deletions(-) rename packages/schema/bind/src/bindings/golang/wasm-go/templates/enum-type/{type-go.mustache => Enum%type%-go.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm-go/templates/{object-type/main-go.mustache => env-type/Env%type%-go.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm-go/templates/{object-type/serialization-go.mustache => env-type/Env%type%Serialization-go.mustache} (100%) create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/enum-type/Enum%type%-go.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%-go.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%Serialization-go.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/interface-type/%type%-go.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Serialization-go.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Wrapped-go.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%-go.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%Serialization-go.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/interface-type/%type%-go.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Serialization-go.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Wrapped-go.mustache delete mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/serialization-go.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%-go.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%Serialization-go.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_array.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_enum.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_map.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_object.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_scalar.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_array.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_enum.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_map.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_object.mustache create mode 100644 packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_scalar.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts b/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts index ee1ab96b97..9b6c0d1470 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts +++ b/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts @@ -82,6 +82,14 @@ export const readPointer: MustacheFn = () => { } } +export const toSnakeCase: MustacheFn = () => { + return (text: string, render: (template: string) => string): string => { + text = render(text).replace( /([A-Z])/g, "_$1"); + text = text.startsWith("_") ? text.slice(1) : text; + return text.toLowerCase(); + } +} + export const handleKeywords: MustacheFn = () => { return (text: string, render: (template: string) => string): string => { const rendered: string = render(text); diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/index.ts b/packages/schema/bind/src/bindings/golang/wasm-go/index.ts index e577b0da3a..bd4823ffda 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm-go/index.ts @@ -18,6 +18,12 @@ const subTemplates = loadSubTemplates(templatesDir.entries); const templatePath = (subpath: string) => path.join(__dirname, "./templates", subpath); +function camel2snake(str: string): string { + str = str.replace( /([A-Z])/g, "_$1"); + str = str.startsWith("_") ? str.slice(1) : str; + return str.toLowerCase(); +} + export const generateBinding: GenerateBindingFn = ( options: BindOptions ): BindOutput => { @@ -34,7 +40,7 @@ export const generateBinding: GenerateBindingFn = ( for (const objectType of abi.objectTypes) { output.entries.push({ type: "Directory", - name: "abc", + name: "types", data: renderTemplates( templatePath("object-type"), objectType, @@ -59,114 +65,114 @@ export const generateBinding: GenerateBindingFn = ( const importEntries: OutputEntry[] = []; // Generate imported module type folders - // for (const importedModuleType of abi.importedModuleTypes) { - // importEntries.push({ - // type: "Directory", - // name: importedModuleType.type, - // data: renderTemplates( - // templatePath("imported/module-type"), - // importedModuleType, - // subTemplates - // ), - // }); - // } - // + for (const importedModuleType of abi.importedModuleTypes) { + importEntries.push({ + type: "Directory", + name: `${camel2snake(importedModuleType.namespace)}`, + data: renderTemplates( + templatePath("imported/module-type"), + importedModuleType, + subTemplates + ), + }); + } + // // Generate imported env type folders - // for (const importedEnvType of abi.importedEnvTypes) { - // importEntries.push({ - // type: "Directory", - // name: importedEnvType.type, - // data: renderTemplates( - // templatePath("imported/env-type"), - // importedEnvType, - // subTemplates - // ), - // }); - // } - // - // // Generate imported enum type folders - // for (const importedEnumType of abi.importedEnumTypes) { - // importEntries.push({ - // type: "Directory", - // name: importedEnumType.type, - // data: renderTemplates( - // templatePath("imported/enum-type"), - // importedEnumType, - // subTemplates - // ), - // }); - // } - // - // // Generate imported object type folders - // for (const importedObectType of abi.importedObjectTypes) { - // importEntries.push({ - // type: "Directory", - // name: importedObectType.type, - // data: renderTemplates( - // templatePath("imported/object-type"), - // importedObectType, - // subTemplates - // ), - // }); - // } - // - // if (importEntries.length) { - // output.entries.push({ - // type: "Directory", - // name: "imported", - // data: [ - // ...importEntries, - // ...renderTemplates(templatePath("imported"), abi, subTemplates), - // ], - // }); - // } - // - // // Generate interface type folders - // for (const interfaceType of abi.interfaceTypes) { - // output.entries.push({ - // type: "Directory", - // name: interfaceType.type, - // data: renderTemplates( - // templatePath("interface-type"), - // interfaceType, - // subTemplates - // ), - // }); - // } - // + for (const importedEnvType of abi.importedEnvTypes) { + importEntries.push({ + type: "Directory", + name: `${camel2snake(importedEnvType.namespace)}`, + data: renderTemplates( + templatePath("imported/env-type"), + importedEnvType, + subTemplates + ), + }); + } + + // Generate imported enum type folders + for (const importedEnumType of abi.importedEnumTypes) { + importEntries.push({ + type: "Directory", + name: `${camel2snake(importedEnumType.namespace)}`, + data: renderTemplates( + templatePath("imported/enum-type"), + importedEnumType, + subTemplates + ), + }); + } + + // Generate imported object type folders + for (const importedObectType of abi.importedObjectTypes) { + importEntries.push({ + type: "Directory", + name: `${camel2snake(importedObectType.namespace)}`, + data: renderTemplates( + templatePath("imported/object-type"), + importedObectType, + subTemplates + ), + }); + } + + if (importEntries.length) { + output.entries.push({ + type: "Directory", + name: "imported", + data: [ + ...importEntries, + ...renderTemplates(templatePath("imported"), abi, subTemplates), + ], + }); + } + + // Generate interface type folders + for (const interfaceType of abi.interfaceTypes) { + output.entries.push({ + type: "Directory", + name: "interfaces", + data: renderTemplates( + templatePath("interface-type"), + interfaceType, + subTemplates + ), + }); + } + // Generate module type folders - // if (abi.moduleType) { - // output.entries.push({ - // type: "Directory", - // name: abi.moduleType.type, - // data: renderTemplates( - // templatePath("module-type"), - // abi.moduleType, - // subTemplates - // ), - // }); - // } - // - // // Generate enum type folders - // for (const enumType of abi.enumTypes) { - // output.entries.push({ - // type: "Directory", - // name: enumType.type, - // data: renderTemplates(templatePath("enum-type"), enumType, subTemplates), - // }); - // } - // - // // Generate env type folders - // if (abi.envType) { - // output.entries.push({ - // type: "Directory", - // name: abi.envType.type, - // data: renderTemplates(templatePath("object-type"), abi.envType, subTemplates), - // }); - // } + if (abi.moduleType) { + output.entries.push({ + type: "Directory", + name: "types", + data: renderTemplates( + templatePath("module-type"), + abi.moduleType, + subTemplates + ), + }); + } + + // Generate enum type folders + for (const enumType of abi.enumTypes) { + output.entries.push({ + type: "Directory", + name: "types", + data: renderTemplates(templatePath("enum-type"), enumType, subTemplates), + }); + } + + // Generate env type folders + if (abi.envType) { + output.entries.push({ + type: "Directory", + name: "types", + data: renderTemplates(templatePath("object-type"), abi.envType, subTemplates), + }); + } // Generate root entry file - // output.entries.push(...renderTemplates(templatePath(""), abi, subTemplates)); + output.entries.push(...renderTemplates(templatePath(""), abi, subTemplates)); return result; }; diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/enum-type/type-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/enum-type/Enum%type%-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/enum-type/type-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm-go/templates/enum-type/Enum%type%-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/main-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/env-type/Env%type%-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/main-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm-go/templates/env-type/Env%type%-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/env-type/Env%type%Serialization-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/serialization-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm-go/templates/env-type/Env%type%Serialization-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/enum-type/Enum%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/enum-type/Enum%type%-go.mustache new file mode 100644 index 0000000000..f4713678fc --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/enum-type/Enum%type%-go.mustache @@ -0,0 +1,39 @@ +package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} + +type {{#toUpper}}{{type}}{{/toUpper}} int32 + +const ( + {{#constants}} + {{#toUpper}}{{type}}{{/toUpper}}{{.}} = iota + {{/constants}} + {{#toFirstLower}}{{type}}{{/toFirstLower}}Max = iota +) + +func Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(value int32) { + if !(value >= 0 && value < int32({{#toFirstLower}}{{type}}{{/toFirstLower}}Max)) { + panic("Invalid value for enum '{{#toUpper}}{{type}}{{/toUpper}}'") + } +} + +func Get{{#toUpper}}{{type}}{{/toUpper}}Value(key string) {{#toUpper}}{{type}}{{/toUpper}} { + switch key { + {{#constants}} + case "{{.}}": + return {{#toUpper}}{{type}}{{/toUpper}}{{.}} + {{/constants}} + default: + panic("Invalid key for enum '{{#toUpper}}{{type}}{{/toUpper}}'") + } +} + +func Get{{#toUpper}}{{type}}{{/toUpper}}Key(value {{#toUpper}}{{type}}{{/toUpper}}) string { + Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(int32(value)) + switch value { + {{#constants}} + case {{#toUpper}}{{type}}{{/toUpper}}{{.}}: + return "{{.}}" + {{/constants}} + default: + panic("Invalid value for enum '{{#toUpper}}{{type}}{{/toUpper}}'") + } +} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%-go.mustache new file mode 100644 index 0000000000..ec612efbee --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%-go.mustache @@ -0,0 +1,31 @@ +package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" + "github.com/valyala/fastjson" +) + +type {{#toUpper}}{{type}}{{/toUpper}} struct { + {{#properties}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{/properties}} +} + +func {{#toUpper}}{{type}}{{/toUpper}}ToBuffer(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { + return serialize{{#toUpper}}{{type}}{{/toUpper}}(value) +} + +func {{#toUpper}}{{type}}{{/toUpper}}FromBuffer(data []byte) *{{#toUpper}}{{type}}{{/toUpper}} { + return deserialize{{#toUpper}}{{type}}{{/toUpper}}(data) +} + +func {{#toUpper}}{{type}}{{/toUpper}}Write(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { + write{{#toUpper}}{{type}}{{/toUpper}}(writer, value) +} + +func {{#toUpper}}{{type}}{{/toUpper}}Read(reader msgpack.Read) *{{#toUpper}}{{type}}{{/toUpper}} { + return read{{#toUpper}}{{type}}{{/toUpper}}(reader) +} + diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%Serialization-go.mustache new file mode 100644 index 0000000000..c8a2d79e65 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%Serialization-go.mustache @@ -0,0 +1,109 @@ +package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" + "github.com/valyala/fastjson" +) + +func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { + ctx := msgpack.NewContext("Serializing (encoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") + encoder := msgpack.NewWriteEncoder(ctx) + write{{#toUpper}}{{type}}{{/toUpper}}(encoder, value) + return encoder.Buffer() +} + +func write{{#toUpper}}{{type}}{{/toUpper}}(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { + writer.WriteMapLength({{properties.length}}) + {{#properties}} + writer.Context().Push("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + writer.WriteString("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}") + {{#scalar}} + {{> serialize_scalar}} + {{/scalar}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> serialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> serialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> serialize_object}} + {{/object}} + {{#enum}} + {{> serialize_enum}} + {{/enum}} + writer.Context().Pop() + {{/properties}} +} + +func deserialize{{#toUpper}}{{type}}{{/toUpper}}(data []byte) *{{#toUpper}}{{type}}{{/toUpper}} { + ctx := msgpack.NewContext("Deserializing (decoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") + reader := msgpack.NewReadDecoder(ctx, data) + return read{{#toUpper}}{{type}}{{/toUpper}}(reader) +} + +func read{{#toUpper}}{{type}}{{/toUpper}}(reader msgpack.Read) *{{#toUpper}}{{type}}{{/toUpper}} { + var ( + {{#properties}} + _{{name}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{#required}} + _{{name}}Set bool + {{/required}} + {{/properties}} + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type"); + switch field { + {{#properties}} + case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": + reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> deserialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> deserialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + {{#required}} + _{{name}}Set = true; + {{/required}} + reader.Context().Pop() + {{/properties}} + } + reader.Context().Pop() + } + + {{#properties}} + {{#required}} + if (!_{{name}}Set) { + panic(reader.Context().PrintWithContext("Missing required property: '{{name}}: {{type}}'")) + } + {{/required}} + {{/properties}} + + return &{{#toUpper}}{{type}}{{/toUpper}}{ + {{#properties}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, + {{/properties}} + } +} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/interface-type/%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/interface-type/%type%-go.mustache new file mode 100644 index 0000000000..2db03af454 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/interface-type/%type%-go.mustache @@ -0,0 +1,19 @@ +package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} + +{{#capabilities}} +{{#getImplementations}} +{{#enabled}} +import "github.com/consideritdone/polywrap-go/polywrap" +{{/enabled}} +{{/getImplementations}} +{{/capabilities}} + +{{#capabilities}} +{{#getImplementations}} +{{#enabled}} +func {{#toUpper}}{{namespace}}{{/toUpper}}Implementations() []string { + return polywrap.WrapGetImplementations("{{uri}}") +} +{{/enabled}} +{{/getImplementations}} +{{/capabilities}} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Serialization-go.mustache new file mode 100644 index 0000000000..45e7b0762d --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Serialization-go.mustache @@ -0,0 +1,84 @@ +package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" + "github.com/valyala/fastjson" +) + +{{#methods}} +type Args{{#toUpper}}{{name}}{{/toUpper}} struct { + {{#arguments}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{/arguments}} +} + +func Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(value *Args{{#toUpper}}{{name}}{{/toUpper}}) []byte { + ctx := msgpack.NewContext("Serializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") + encoder := msgpack.NewWriteEncoder(ctx) + Write{{#toUpper}}{{name}}{{/toUpper}}Args(encoder, value); + return encoder.Buffer() +} + +func Write{{#toUpper}}{{name}}{{/toUpper}}Args(writer msgpack.Write, value *Args{{#toUpper}}{{name}}{{/toUpper}}) { + writer.WriteMapLength({{arguments.length}}) + {{#arguments}} + writer.Context().Push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + writer.WriteString("{{name}}") + {{#scalar}} + {{> value_serialize_scalar}} + {{/scalar}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> value_serialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> value_serialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> value_serialize_object}} + {{/object}} + {{#enum}} + {{> value_serialize_enum}} + {{/enum}} + writer.Context().Pop() + {{/arguments}} +} + +export function Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(argsBuf []byte): {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}} { + ctx := msgpack.NewContext("Deserializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") + reader := msgpack.NewReadDecoder(ctx, argsBuf) + + {{#return}} + reader.Context().Push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "reading function output"); + var value {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{#scalar}} + {{> value_deserialize_scalar}} + {{/scalar}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> value_deserialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> value_deserialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> value_deserialize_object}} + {{/object}} + {{#enum}} + {{> value_deserialize_enum}} + {{/enum}} + writer.Context().Pop() + return value + {{/return}} +} + +{{/methods}} + diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Wrapped-go.mustache new file mode 100644 index 0000000000..b7d1e09512 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Wrapped-go.mustache @@ -0,0 +1,39 @@ +package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} + +{{#methods.length}} +import ( + "github.com/consideritdone/polywrap-go/polywrap" + "some/library/to/methods" +) +{{/methods.length}} + +{{^isInterface}} +{{#methods}} +func {{#toUpper}}{{type}}{{/toUpper}}{{#toUpper}}{{name}}{{/toUpper}}(args *Args{{#toUpper}}{{name}}{{/toUpper}}) ({{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, error) { + argsBuf := Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(args) + data, err := polywrap.WrapSubinvoke("{{uri}}", "{{name}}", argsBuf) + if err != nil { + return nil, result.Error() + } + return Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(result.unwrap()), nil +} +{{^last}} + +{{/last}} +{{/methods}} +{{/isInterface}} +{{#isInterface}} +{{#methods}} +func {{#toUpper}}{{type}}{{/toUpper}}{{#toUpper}}{{name}}{{/toUpper}}(uri string, args *Args{{#toUpper}}{{name}}{{/toUpper}}) ({{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, error) { + argsBuf := Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(args) + data, err := polywrap.WrapSubinvokeImplementation("{{uri}}", uri, "{{name}}", argsBuf) + if err != nil { + return nil, err + } + return Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(data), nil +} +{{^last}} + +{{/last}} +{{/methods}} +{{/isInterface}} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%-go.mustache new file mode 100644 index 0000000000..ec612efbee --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%-go.mustache @@ -0,0 +1,31 @@ +package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" + "github.com/valyala/fastjson" +) + +type {{#toUpper}}{{type}}{{/toUpper}} struct { + {{#properties}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{/properties}} +} + +func {{#toUpper}}{{type}}{{/toUpper}}ToBuffer(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { + return serialize{{#toUpper}}{{type}}{{/toUpper}}(value) +} + +func {{#toUpper}}{{type}}{{/toUpper}}FromBuffer(data []byte) *{{#toUpper}}{{type}}{{/toUpper}} { + return deserialize{{#toUpper}}{{type}}{{/toUpper}}(data) +} + +func {{#toUpper}}{{type}}{{/toUpper}}Write(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { + write{{#toUpper}}{{type}}{{/toUpper}}(writer, value) +} + +func {{#toUpper}}{{type}}{{/toUpper}}Read(reader msgpack.Read) *{{#toUpper}}{{type}}{{/toUpper}} { + return read{{#toUpper}}{{type}}{{/toUpper}}(reader) +} + diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%Serialization-go.mustache new file mode 100644 index 0000000000..c8a2d79e65 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%Serialization-go.mustache @@ -0,0 +1,109 @@ +package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" + "github.com/valyala/fastjson" +) + +func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { + ctx := msgpack.NewContext("Serializing (encoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") + encoder := msgpack.NewWriteEncoder(ctx) + write{{#toUpper}}{{type}}{{/toUpper}}(encoder, value) + return encoder.Buffer() +} + +func write{{#toUpper}}{{type}}{{/toUpper}}(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { + writer.WriteMapLength({{properties.length}}) + {{#properties}} + writer.Context().Push("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + writer.WriteString("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}") + {{#scalar}} + {{> serialize_scalar}} + {{/scalar}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> serialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> serialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> serialize_object}} + {{/object}} + {{#enum}} + {{> serialize_enum}} + {{/enum}} + writer.Context().Pop() + {{/properties}} +} + +func deserialize{{#toUpper}}{{type}}{{/toUpper}}(data []byte) *{{#toUpper}}{{type}}{{/toUpper}} { + ctx := msgpack.NewContext("Deserializing (decoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") + reader := msgpack.NewReadDecoder(ctx, data) + return read{{#toUpper}}{{type}}{{/toUpper}}(reader) +} + +func read{{#toUpper}}{{type}}{{/toUpper}}(reader msgpack.Read) *{{#toUpper}}{{type}}{{/toUpper}} { + var ( + {{#properties}} + _{{name}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{#required}} + _{{name}}Set bool + {{/required}} + {{/properties}} + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type"); + switch field { + {{#properties}} + case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": + reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> deserialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> deserialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + {{#required}} + _{{name}}Set = true; + {{/required}} + reader.Context().Pop() + {{/properties}} + } + reader.Context().Pop() + } + + {{#properties}} + {{#required}} + if (!_{{name}}Set) { + panic(reader.Context().PrintWithContext("Missing required property: '{{name}}: {{type}}'")) + } + {{/required}} + {{/properties}} + + return &{{#toUpper}}{{type}}{{/toUpper}}{ + {{#properties}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, + {{/properties}} + } +} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/interface-type/%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/interface-type/%type%-go.mustache new file mode 100644 index 0000000000..46cc9be8e0 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/interface-type/%type%-go.mustache @@ -0,0 +1,19 @@ +package interfaces + +{{#capabilities}} +{{#getImplementations}} +{{#enabled}} +import "github.com/consideritdone/polywrap-go/polywrap" +{{/enabled}} +{{/getImplementations}} +{{/capabilities}} + +{{#capabilities}} +{{#getImplementations}} +{{#enabled}} +func {{#toUpper}}{{namespace}}{{/toUpper}}Implementations() []string { + return polywrap.WrapGetImplementations("{{uri}}") +} +{{/enabled}} +{{/getImplementations}} +{{/capabilities}} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Serialization-go.mustache new file mode 100644 index 0000000000..9dff688252 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Serialization-go.mustache @@ -0,0 +1,115 @@ +package types + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" + "github.com/valyala/fastjson" +) + +{{#methods}} +type Args{{#toUpper}}{{name}}{{/toUpper}} struct { + {{#arguments}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{/arguments}} +} + +func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *Args{{#toUpper}}{{name}}{{/toUpper}} { + ctx := msgpack.NewContext("Deserializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") + {{#arguments.length}} + reader := msgpack.NewReadDecoder(ctx, argsBuf) + + var ( + {{#arguments}} + _{{name}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{#required}} + _{{name}}Set bool + {{/required}} + {{/arguments}} + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type"); + reader.Context().Pop() + switch field { + {{#arguments}} + case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": + reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> deserialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> deserialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + {{#required}} + _{{name}}Set = true; + {{/required}} + reader.Context().Pop() + {{/arguments}} + } + } + + {{#arguments}} + {{#required}} + if (!_{{name}}Set) { + panic(reader.Context().PrintWithContext("Missing required property: '{{name}}: {{type}}'")) + } + {{/required}} + {{/arguments}} + {{/arguments.length}} + + return &Args{{#toUpper}}{{name}}{{/toUpper}}{ + {{#arguments}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, + {{/arguments}} + } +} + +func Serialize{{#toUpper}}{{name}}{{/toUpper}}Result(value {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}) []byte { + ctx := msgpack.NewContext("Serializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") + encoder := msgpack.NewWriteEncoder(ctx) + Write{{#toUpper}}{{name}}{{/toUpper}}Result(encoder, value); + return encoder.Buffer() +} + +func Write{{#toUpper}}{{name}}{{/toUpper}}Result(writer msgpack.Write, value {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}) { + {{#return}} + writer.Context().Push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property"); + {{#scalar}} + {{> value_serialize_scalar}} + {{/scalar}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> value_serialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> value_serialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> value_serialize_object}} + {{/object}} + {{#enum}} + {{> value_serialize_enum}} + {{/enum}} + writer.Context().Pop() + {{/return}} +} + +{{/methods}} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Wrapped-go.mustache new file mode 100644 index 0000000000..5e24b3b48a --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Wrapped-go.mustache @@ -0,0 +1,35 @@ +package types + +{{#methods.length}} +import ( + "github.com/consideritdone/polywrap-go/polywrap" + "some/library/to/methods" +) +{{/methods.length}} + +{{#methods}} +func {{#toUpper}}{{name}}{{/toUpper}}Wrapped(argsBuf []byte, envSize uint32) []byte { + var env *Env + {{#env}} + {{#required}} + if (envSize == 0) { + panic("Environment is not set, and it is required by method 'objectMethod'") + } + {{/required}} + if (envSize > 0) { + envBuf := polywrap.WrapLoadEnv(envSize); + env = EnvFromBuffer(envBuf); + } + {{/env}} + + {{#arguments.length}} + args: = Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf) + {{/arguments.length}} + + result := methods.{{#toUpper}}{{name}}{{/toUpper}}({{#arguments.length}}args{{/arguments.length}}{{^arguments.length}}nil{{/arguments.length}}{{#env}}, env{{/env}}) + return Serialize{{#toUpper}}{{name}}{{/toUpper}}Result(result); +} +{{^last}} + +{{/last}} +{{/methods}} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/serialization-go.mustache deleted file mode 100644 index f3149225b5..0000000000 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/serialization-go.mustache +++ /dev/null @@ -1,69 +0,0 @@ -package module - -import ( - "github.com/consideritdone/polywrap-go/examples/demo1/wrap/moduleTypes" - "github.com/consideritdone/polywrap-go/examples/demo1/wrap/sampleResult" - "github.com/consideritdone/polywrap-go/polywrap/msgpack" -) -{{#methods}} - -export class Args{{#toUpper}}{{name}}{{/toUpper}} { - {{#arguments}} - {{#handleKeywords}}{{name}}{{/handleKeywords}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}}; - {{/arguments}} -} - -export function deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte): *moduleTypes.Args{{name}} { - context := msgpack.NewContext("Deserializing module-type: {{name}}") - {{#arguments.length}} - reader := msgpack.NewReadDecoder(context, argsBuf) - numFields := reader.ReadMapLength() - - {{#arguments}} - {{^object}} - let _{{name}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = {{#toWasmInit}}{{toGraphQLType}}{{/toWasmInit}}; - {{/object}} - {{#required}} - let _{{name}}Set: bool = false; - {{/required}} - {{/arguments}} - - for i := numFields; i > 0; i-- { - const field = reader.readString(); - - reader.Context().Push(field, "unknown", "searching for property type") - {{#arguments}} - {{^first}}else {{/first}}if (field == "{{name}}") { - reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") - - {{#scalar}} - _{{name}} = reader.Read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(); - {{/scalar}} - {{#required}} - _{{name}}Set = true; - {{/required}} - reader.Context().Pop() - } - {{/arguments}} - reader.context().pop(); - } - - {{#arguments}} - {{#required}} - {{^object}} - if !_{{name}}Set { - {{/object}} - panic(reader.Context().PrintWithContext("Missing required argument: '{{name}}: {{type}}'")) - } - {{/required}} - {{/arguments}} - {{/arguments.length}} - - return { - {{#arguments}} - {{#handleKeywords}}{{name}}{{/handleKeywords}}: _{{name}}{{^last}},{{/last}} - {{/arguments}} - }; -} - -{{/methods}} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%-go.mustache new file mode 100644 index 0000000000..08d588529e --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%-go.mustache @@ -0,0 +1,31 @@ +package types + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" + "github.com/valyala/fastjson" +) + +type {{#toUpper}}{{type}}{{/toUpper}} struct { + {{#properties}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{/properties}} +} + +func {{#toUpper}}{{type}}{{/toUpper}}ToBuffer(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { + return serialize{{#toUpper}}{{type}}{{/toUpper}}(value) +} + +func {{#toUpper}}{{type}}{{/toUpper}}FromBuffer(data []byte) *{{#toUpper}}{{type}}{{/toUpper}} { + return deserialize{{#toUpper}}{{type}}{{/toUpper}}(data) +} + +func {{#toUpper}}{{type}}{{/toUpper}}Write(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { + write{{#toUpper}}{{type}}{{/toUpper}}(writer, value) +} + +func {{#toUpper}}{{type}}{{/toUpper}}Read(reader msgpack.Read) *{{#toUpper}}{{type}}{{/toUpper}} { + return read{{#toUpper}}{{type}}{{/toUpper}}(reader) +} + diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%Serialization-go.mustache new file mode 100644 index 0000000000..38c9f04e63 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%Serialization-go.mustache @@ -0,0 +1,109 @@ +package types + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" + "github.com/valyala/fastjson" +) + +func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { + ctx := msgpack.NewContext("Serializing (encoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") + encoder := msgpack.NewWriteEncoder(ctx) + write{{#toUpper}}{{type}}{{/toUpper}}(encoder, value) + return encoder.Buffer() +} + +func write{{#toUpper}}{{type}}{{/toUpper}}(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { + writer.WriteMapLength({{properties.length}}) + {{#properties}} + writer.Context().Push("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + writer.WriteString("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}") + {{#scalar}} + {{> serialize_scalar}} + {{/scalar}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> serialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> serialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> serialize_object}} + {{/object}} + {{#enum}} + {{> serialize_enum}} + {{/enum}} + writer.Context().Pop() + {{/properties}} +} + +func deserialize{{#toUpper}}{{type}}{{/toUpper}}(data []byte) *{{#toUpper}}{{type}}{{/toUpper}} { + ctx := msgpack.NewContext("Deserializing (decoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") + reader := msgpack.NewReadDecoder(ctx, data) + return read{{#toUpper}}{{type}}{{/toUpper}}(reader) +} + +func read{{#toUpper}}{{type}}{{/toUpper}}(reader msgpack.Read) *{{#toUpper}}{{type}}{{/toUpper}} { + var ( + {{#properties}} + _{{name}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{#required}} + _{{name}}Set bool + {{/required}} + {{/properties}} + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type"); + switch field { + {{#properties}} + case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": + reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> deserialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> deserialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + {{#required}} + _{{name}}Set = true; + {{/required}} + reader.Context().Pop() + {{/properties}} + } + reader.Context().Pop() + } + + {{#properties}} + {{#required}} + if (!_{{name}}Set) { + panic(reader.Context().PrintWithContext("Missing required property: '{{name}}: {{type}}'")) + } + {{/required}} + {{/properties}} + + return &{{#toUpper}}{{type}}{{/toUpper}}{ + {{#properties}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, + {{/properties}} + } +} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_array.mustache new file mode 100644 index 0000000000..8a852d06e1 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_array.mustache @@ -0,0 +1,23 @@ +if reader.IsNil() { + value{{#lastFullIter}}i{{/lastFullIter}} = nil +} else { + {{#nextIter}}ln{{/nextIter}} := reader.ReadArrayLength() + value{{#prevFullIter}}i{{/prevFullIter}} = make({{#toWasm}}{{toGraphQLType}}{{/toWasm}}, {{#currIter}}ln{{/currIter}}) + for {{#currIter}}i{{/currIter}} := uint32(0); {{#currIter}}i{{/currIter}} < {{#currIter}}ln{{/currIter}}; {{#currIter}}i{{/currIter}}++ { + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{> deserialize_array}} + {{/array}} + {{#map}} + {{> deserialize_map}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + } +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_enum.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_enum.mustache new file mode 100644 index 0000000000..72dcb0b7ed --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_enum.mustache @@ -0,0 +1,11 @@ +{{#required}} +value{{#lastFullIter}}i{{/lastFullIter}} = {{#toUpper}}{{type}}{{/toUpper}}(reader.ReadI32()) +Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(int32(_{{name}}{{#lastFullIter}}i{{/lastFullIter}})) +{{/required}} +{{^required}} +if !reader.IsNil() { + v := {{#toUpper}}{{type}}{{/toUpper}}(reader.ReadI32()) + Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(int32(v)) + value{{#lastFullIter}}i{{/lastFullIter}} = &v +} +{{/required}} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_map.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_map.mustache new file mode 100644 index 0000000000..5861374a16 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_map.mustache @@ -0,0 +1,24 @@ +if reader.IsNil() { + value{{#lastFullIter}}i{{/lastFullIter}} = nil +} else { + {{#nextIter}}ln{{/nextIter}} := reader.ReadMapLength() + value{{#prevFullIter}}i{{/prevFullIter}} = make({{#toWasm}}{{toGraphQLType}}{{/toWasm}}) + for {{#currIter}}j{{/currIter}} := uint32(0); {{#currIter}}j{{/currIter}} < {{#currIter}}ln{{/currIter}}; {{#currIter}}j{{/currIter}}++ { + {{#currIter}}i{{/currIter}} := reader.Read{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}() + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{> deserialize_array}} + {{/array}} + {{#map}} + {{> deserialize_map}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + } +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_object.mustache new file mode 100644 index 0000000000..645435c97c --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_object.mustache @@ -0,0 +1,8 @@ +if v := {{#toUpper}}{{type}}{{/toUpper}}Read(reader); v != nil { + {{#required}} + value{{#lastFullIter}}i{{/lastFullIter}} = *v + {{/required}} + {{^required}} + value{{#lastFullIter}}i{{/lastFullIter}} = v + {{/required}} +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_scalar.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_scalar.mustache new file mode 100644 index 0000000000..c917632081 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_scalar.mustache @@ -0,0 +1,9 @@ +{{#required}} +value{{#lastFullIter}}i{{/lastFullIter}} = reader.Read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}() +{{/required}} +{{^required}} +if !reader.IsNil() { + v := reader.Read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(); + value{{#lastFullIter}}i{{/lastFullIter}} = {{#readPointer}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}} - v{{/readPointer}} +} +{{/required}} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_array.mustache new file mode 100644 index 0000000000..9c759d825b --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_array.mustache @@ -0,0 +1,23 @@ +if value{{#lastFullIter}}i{{/lastFullIter}} == nil { + writer.WriteNil() +} else if len(value{{#lastFullIter}}i{{/lastFullIter}}) == 0 { + writer.WriteNil() +} else { + for {{#nextIter}}i{{/nextIter}} := range value{{#prevFullIter}}i{{/prevFullIter}} { + {{#scalar}} + {{> value_serialize_scalar}} + {{/scalar}} + {{#enum}} + {{> value_serialize_enum}} + {{/enum}} + {{#array}} + {{> value_serialize_array}} + {{/array}} + {{#map}} + {{> value_serialize_map}} + {{/map}} + {{#object}} + {{> value_serialize_object}} + {{/object}} + } +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_enum.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_enum.mustache new file mode 100644 index 0000000000..c6567e8c24 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_enum.mustache @@ -0,0 +1,13 @@ +{ + v := value{{#lastFullIter}}i{{/lastFullIter}} + {{#required}} + writer.WriteI32(int32(v)); + {{/required}} + {{^required}} + if v == nil { + writer.WriteNil() + } else { + writer.WriteI32(int32(*v)); + } + {{/required}} +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_map.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_map.mustache new file mode 100644 index 0000000000..d60bb55b17 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_map.mustache @@ -0,0 +1,24 @@ +if value == nil { + writer.WriteNil() +} else if len(value) == 0 { + writer.WriteNil() +} else { + for {{#nextIter}}i{{/nextIter}} := range value{{#getPrevIter}}i{{/getPrevIter}} { + writer.Write{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}({{#currIter}}i{{/currIter}}) + {{#scalar}} + {{> value_serialize_scalar}} + {{/scalar}} + {{#enum}} + {{> value_serialize_enum}} + {{/enum}} + {{#array}} + {{> value_serialize_array}} + {{/array}} + {{#map}} + {{> value_serialize_map}} + {{/map}} + {{#object}} + {{> value_serialize_object}} + {{/object}} + } +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_object.mustache new file mode 100644 index 0000000000..aa5894e0ba --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_object.mustache @@ -0,0 +1,9 @@ +{ + v := value{{#lastFullIter}}i{{/lastFullIter}} + {{#required}} + {{#toUpper}}{{type}}{{/toUpper}}Write(writer, &v) + {{/required}} + {{^required}} + {{#toUpper}}{{type}}{{/toUpper}}Write(writer, v) + {{/required}} +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_scalar.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_scalar.mustache new file mode 100644 index 0000000000..6aa89267b1 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_scalar.mustache @@ -0,0 +1,13 @@ +{ + v := value{{#lastFullIter}}i{{/lastFullIter}} + {{#required}} + writer.Write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(v) + {{/required}} + {{^required}} + if v == nil { + writer.WriteNil() + } else { + {{#writePointer}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}} - v{{/writePointer}} + } + {{/required}} +} diff --git a/packages/schema/bind/src/bindings/utils.ts b/packages/schema/bind/src/bindings/utils.ts index f3be1c7846..07e0d96949 100644 --- a/packages/schema/bind/src/bindings/utils.ts +++ b/packages/schema/bind/src/bindings/utils.ts @@ -1,7 +1,20 @@ import { OutputEntry, readDirectorySync } from "@polywrap/os-js"; +import { GenericDefinition } from "@polywrap/schema-parse"; import Mustache from "mustache"; import path from "path"; +function transformName(str: string, view: unknown): string { + str = str.replace("-", "."); + if (!str.endsWith(".go")) { + return str; + } + const def = view as GenericDefinition; + str = str.replace("%type%", def.type) + .replace( /([A-Z])/g, "_$1") + .toLowerCase(); + return str.startsWith("_") ? str.slice(1) : str; +} + export function renderTemplates( templateDirAbs: string, view: unknown, @@ -27,7 +40,7 @@ export function renderTemplates( if (data) { output.push({ type: "File", - name: name.replace("-", ".").replace("%type%", (view as {type: string}).type.toLowerCase()), + name: transformName(name, view), data, }); } From 7e99c54450f523ccff25dd831d56eb5719c5a506 Mon Sep 17 00:00:00 2001 From: n0cte Date: Tue, 23 Aug 2022 00:24:34 +0300 Subject: [PATCH 006/181] prettify generated golang code --- .../src/bindings/golang/wasm-go/functions.ts | 45 +- .../templates/deserialize_array.mustache | 40 +- .../templates/deserialize_enum.mustache | 6 +- .../templates/deserialize_map.mustache | 42 +- .../templates/deserialize_object.mustache | 12 +- .../templates/deserialize_scalar.mustache | 4 +- .../enum-type/Enum%type%-go.mustache | 28 +- .../templates/env-type/Env%type%-go.mustache | 16 +- .../Env%type%Serialization-go.mustache | 159 ++- .../imported/enum-type/Enum%type%-go.mustache | 28 +- .../imported/env-type/Env%type%-go.mustache | 16 +- .../Env%type%Serialization-go.mustache | 155 ++- .../interface-type/%type%-go.mustache | 4 +- .../%type%Serialization-go.mustache | 134 +- .../module-type/%type%Wrapped-go.mustache | 28 +- .../object-type/Object%type%-go.mustache | 16 +- .../Object%type%Serialization-go.mustache | 159 ++- .../interface-type/%type%-go.mustache | 4 +- .../golang/wasm-go/templates/main-go.mustache | 24 +- .../%type%Serialization-go.mustache | 191 +-- .../module-type/%type%Wrapped-go.mustache | 40 +- .../object-type/Object%type%-go.mustache | 16 +- .../Object%type%Serialization-go.mustache | 160 ++- .../templates/serialize_array.mustache | 38 +- .../wasm-go/templates/serialize_enum.mustache | 22 +- .../wasm-go/templates/serialize_map.mustache | 40 +- .../templates/serialize_object.mustache | 15 +- .../templates/serialize_scalar.mustache | 22 +- .../value_deserialize_array.mustache | 40 +- .../templates/value_deserialize_enum.mustache | 6 +- .../templates/value_deserialize_map.mustache | 42 +- .../value_deserialize_object.mustache | 12 +- .../value_deserialize_scalar.mustache | 4 +- .../templates/value_serialize_array.mustache | 38 +- .../templates/value_serialize_enum.mustache | 22 +- .../templates/value_serialize_map.mustache | 40 +- .../templates/value_serialize_object.mustache | 14 +- .../templates/value_serialize_scalar.mustache | 22 +- .../test_import/enum_test_import__enum.go | 38 + .../test_import/env_test_import__env.go | 25 + .../env_test_import__env_serialization.go | 57 + .../object_test_import__another_object.go | 25 + ...st_import__another_object_serialization.go | 57 + .../test_import/object_test_import__object.go | 32 + ...bject_test_import__object_serialization.go | 253 ++++ .../test_import__module_serialization.go | 245 ++++ .../test_import__module_wrapped.go | 24 + .../output/wasm-go/interfaces/test_import.go | 7 + .../cases/bind/sanity/output/wasm-go/main.go | 16 +- .../types/custom_type_serialization.go | 1218 ----------------- .../{custom_enum.go => enum_custom_enum.go} | 0 .../wasm-go/types/module_serialization.go | 436 ++++++ .../output/wasm-go/types/module_wrapped.go | 45 + ...another_type.go => object_another_type.go} | 0 ...o => object_another_type_serialization.go} | 1 - .../{custom_type.go => object_custom_type.go} | 0 .../types/object_custom_type_serialization.go | 1211 ++++++++++++++++ .../wasm-go/types/{env.go => object_env.go} | 0 ...ization.go => object_env_serialization.go} | 1 - 59 files changed, 3328 insertions(+), 2067 deletions(-) create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/enum_test_import__enum.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object_serialization.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/interfaces/test_import.go delete mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_type_serialization.go rename packages/test-cases/cases/bind/sanity/output/wasm-go/types/{custom_enum.go => enum_custom_enum.go} (100%) create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_serialization.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_wrapped.go rename packages/test-cases/cases/bind/sanity/output/wasm-go/types/{another_type.go => object_another_type.go} (100%) rename packages/test-cases/cases/bind/sanity/output/wasm-go/types/{another_type_serialization.go => object_another_type_serialization.go} (99%) rename packages/test-cases/cases/bind/sanity/output/wasm-go/types/{custom_type.go => object_custom_type.go} (100%) create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go rename packages/test-cases/cases/bind/sanity/output/wasm-go/types/{env.go => object_env.go} (100%) rename packages/test-cases/cases/bind/sanity/output/wasm-go/types/{env_serialization.go => object_env_serialization.go} (99%) diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts b/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts index 9b6c0d1470..1265e1d045 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts +++ b/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts @@ -84,12 +84,55 @@ export const readPointer: MustacheFn = () => { export const toSnakeCase: MustacheFn = () => { return (text: string, render: (template: string) => string): string => { - text = render(text).replace( /([A-Z])/g, "_$1"); + text = render(text).replace(/([A-Z])/g, "_$1"); text = text.startsWith("_") ? text.slice(1) : text; return text.toLowerCase(); } } +export const makeImports: MustacheFn = () => { + return (text: string, render: (template: string) => string): string => { + const types = render(text).split(",") + const exist: {[key:string]: boolean} = {}; + for (const t of types){ + switch (t) { + case "*big.Int": + exist["github.com/consideritdone/polywrap-go/polywrap/msgpack/big"] = true; + break + case "*fastjson.Value": + exist["github.com/valyala/fastjson"] = true; + break; + } + } + let imports: Array = ["github.com/consideritdone/polywrap-go/polywrap/msgpack"]; + imports.push(...Object.keys(exist)); + const txt = imports.sort().map(imp => `\t"${imp}"`).join("\n"); + return `import (\n${txt}\n)` + } +} + +export const stuctProps: MustacheFn = () => { + return (text: string, render: (template: string) => string): string => { + let props: [string, string][] = render(text).split("\n") + .map(line => line.trimEnd()) + .filter(line => line !== "") + .map(line => line.split(" ") as [string, string]) + let maxPropNameLn = 0; + for (const [propName] of props) { + if (propName.length > maxPropNameLn) { + maxPropNameLn = propName.length + } + } + for (let i = 0; i < props.length; i++) { + if (props[i][0].length < maxPropNameLn) { + props[i][0] += Array(maxPropNameLn - props[i][0].length).fill(" ").join(""); + } + props[i][0] = "\t" + props[i][0]; + } + return props.map(v => v.join(" ")).join("\n") + "\n"; + } +} + export const handleKeywords: MustacheFn = () => { return (text: string, render: (template: string) => string): string => { const rendered: string = render(text); diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_array.mustache index 59003f2d65..c66ee906d9 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_array.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_array.mustache @@ -1,23 +1,23 @@ if reader.IsNil() { - _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = nil + _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = nil } else { - {{#nextIter}}ln{{/nextIter}} := reader.ReadArrayLength() - _{{name}}{{#prevFullIter}}i{{/prevFullIter}} = make({{#toWasm}}{{toGraphQLType}}{{/toWasm}}, {{#currIter}}ln{{/currIter}}) - for {{#currIter}}i{{/currIter}} := uint32(0); {{#currIter}}i{{/currIter}} < {{#currIter}}ln{{/currIter}}; {{#currIter}}i{{/currIter}}++ { - {{#scalar}} - {{> deserialize_scalar}} - {{/scalar}} - {{#enum}} - {{> deserialize_enum}} - {{/enum}} - {{#array}} - {{> deserialize_array}} - {{/array}} - {{#map}} - {{> deserialize_map}} - {{/map}} - {{#object}} - {{> deserialize_object}} - {{/object}} - } + {{#nextIter}}ln{{/nextIter}} := reader.ReadArrayLength() + _{{name}}{{#prevFullIter}}i{{/prevFullIter}} = make({{#toWasm}}{{toGraphQLType}}{{/toWasm}}, {{#currIter}}ln{{/currIter}}) + for {{#currIter}}i{{/currIter}} := uint32(0); {{#currIter}}i{{/currIter}} < {{#currIter}}ln{{/currIter}}; {{#currIter}}i{{/currIter}}++ { + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{> deserialize_array}} + {{/array}} + {{#map}} + {{> deserialize_map}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + } } diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_enum.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_enum.mustache index f92f67096d..b5ac1f35bb 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_enum.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_enum.mustache @@ -4,8 +4,8 @@ Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(int32(_{{name}}{{#lastFullIter}}i{ {{/required}} {{^required}} if !reader.IsNil() { - v := {{#toUpper}}{{type}}{{/toUpper}}(reader.ReadI32()) - Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(int32(v)) - _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = &v + v := {{#toUpper}}{{type}}{{/toUpper}}(reader.ReadI32()) + Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(int32(v)) + _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = &v } {{/required}} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_map.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_map.mustache index a88ea85f13..409d6c97db 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_map.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_map.mustache @@ -1,24 +1,24 @@ if reader.IsNil() { - _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = nil + _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = nil } else { - {{#nextIter}}ln{{/nextIter}} := reader.ReadMapLength() - _{{name}}{{#prevFullIter}}i{{/prevFullIter}} = make({{#toWasm}}{{toGraphQLType}}{{/toWasm}}) - for {{#currIter}}j{{/currIter}} := uint32(0); {{#currIter}}j{{/currIter}} < {{#currIter}}ln{{/currIter}}; {{#currIter}}j{{/currIter}}++ { - {{#currIter}}i{{/currIter}} := reader.Read{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}() - {{#scalar}} - {{> deserialize_scalar}} - {{/scalar}} - {{#enum}} - {{> deserialize_enum}} - {{/enum}} - {{#array}} - {{> deserialize_array}} - {{/array}} - {{#map}} - {{> deserialize_map}} - {{/map}} - {{#object}} - {{> deserialize_object}} - {{/object}} - } + {{#nextIter}}ln{{/nextIter}} := reader.ReadMapLength() + _{{name}}{{#prevFullIter}}i{{/prevFullIter}} = make({{#toWasm}}{{toGraphQLType}}{{/toWasm}}) + for {{#currIter}}j{{/currIter}} := uint32(0); {{#currIter}}j{{/currIter}} < {{#currIter}}ln{{/currIter}}; {{#currIter}}j{{/currIter}}++ { + {{#currIter}}i{{/currIter}} := reader.Read{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}() + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{> deserialize_array}} + {{/array}} + {{#map}} + {{> deserialize_map}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + } } diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_object.mustache index 86cea2fe71..6fc0c5ba2f 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_object.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_object.mustache @@ -1,8 +1,8 @@ if v := {{#toUpper}}{{type}}{{/toUpper}}Read(reader); v != nil { - {{#required}} - _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = *v - {{/required}} - {{^required}} - _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = v - {{/required}} + {{#required}} + _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = *v + {{/required}} + {{^required}} + _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = v + {{/required}} } diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_scalar.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_scalar.mustache index 1a7849f233..2c65dc5c0e 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_scalar.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_scalar.mustache @@ -3,7 +3,7 @@ _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = reader.Read{{#toMsgPack}}{{toGrap {{/required}} {{^required}} if !reader.IsNil() { - v := reader.Read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(); - _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = {{#readPointer}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}} - v{{/readPointer}} + v := reader.Read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}() + _{{name}}{{#lastFullIter}}i{{/lastFullIter}} = {{#readPointer}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}} - v{{/readPointer}} } {{/required}} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/enum-type/Enum%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/enum-type/Enum%type%-go.mustache index a33f6f9723..f88d287c1b 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/enum-type/Enum%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/enum-type/Enum%type%-go.mustache @@ -3,10 +3,12 @@ package types type {{#toUpper}}{{type}}{{/toUpper}} int32 const ( - {{#constants}} - {{#toUpper}}{{type}}{{/toUpper}}{{.}} = iota - {{/constants}} - {{#toFirstLower}}{{type}}{{/toFirstLower}}Max = iota +{{#stuctProps}} +{{#constants}} +{{#toUpper}}{{type}}{{/toUpper}}{{.}} = iota +{{/constants}} +{{#toFirstLower}}{{type}}{{/toFirstLower}}Max = iota +{{/stuctProps}} ) func Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(value int32) { @@ -17,10 +19,10 @@ func Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(value int32) { func Get{{#toUpper}}{{type}}{{/toUpper}}Value(key string) {{#toUpper}}{{type}}{{/toUpper}} { switch key { - {{#constants}} - case "{{.}}": - return {{#toUpper}}{{type}}{{/toUpper}}{{.}} - {{/constants}} + {{#constants}} + case "{{.}}": + return {{#toUpper}}{{type}}{{/toUpper}}{{.}} + {{/constants}} default: panic("Invalid key for enum '{{#toUpper}}{{type}}{{/toUpper}}'") } @@ -29,11 +31,11 @@ func Get{{#toUpper}}{{type}}{{/toUpper}}Value(key string) {{#toUpper}}{{type}}{{ func Get{{#toUpper}}{{type}}{{/toUpper}}Key(value {{#toUpper}}{{type}}{{/toUpper}}) string { Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(int32(value)) switch value { - {{#constants}} - case {{#toUpper}}{{type}}{{/toUpper}}{{.}}: - return "{{.}}" - {{/constants}} + {{#constants}} + case {{#toUpper}}{{type}}{{/toUpper}}{{.}}: + return "{{.}}" + {{/constants}} default: panic("Invalid value for enum '{{#toUpper}}{{type}}{{/toUpper}}'") } -} \ No newline at end of file +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/env-type/Env%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/env-type/Env%type%-go.mustache index 08d588529e..4cc1a1eea6 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/env-type/Env%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/env-type/Env%type%-go.mustache @@ -1,16 +1,13 @@ package types -import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" - "github.com/valyala/fastjson" -) +{{#makeImports}}{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} type {{#toUpper}}{{type}}{{/toUpper}} struct { - {{#properties}} - {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} - {{/properties}} + {{#stuctProps}} + {{#properties}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{/properties}} + {{/stuctProps}} } func {{#toUpper}}{{type}}{{/toUpper}}ToBuffer(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { @@ -28,4 +25,3 @@ func {{#toUpper}}{{type}}{{/toUpper}}Write(writer msgpack.Write, value *{{#toUpp func {{#toUpper}}{{type}}{{/toUpper}}Read(reader msgpack.Read) *{{#toUpper}}{{type}}{{/toUpper}} { return read{{#toUpper}}{{type}}{{/toUpper}}(reader) } - diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/env-type/Env%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/env-type/Env%type%Serialization-go.mustache index 38c9f04e63..0574f0e584 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/env-type/Env%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/env-type/Env%type%Serialization-go.mustache @@ -1,11 +1,6 @@ package types -import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" - "github.com/valyala/fastjson" -) +{{#makeImports}}{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { ctx := msgpack.NewContext("Serializing (encoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") @@ -16,30 +11,30 @@ func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toU func write{{#toUpper}}{{type}}{{/toUpper}}(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { writer.WriteMapLength({{properties.length}}) - {{#properties}} - writer.Context().Push("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") - writer.WriteString("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}") - {{#scalar}} - {{> serialize_scalar}} - {{/scalar}} - {{#array}} - {{#startIter}}{{/startIter}} - {{> serialize_array}} - {{#stopIter}}{{/stopIter}} - {{/array}} - {{#map}} - {{#startIter}}{{/startIter}} - {{> serialize_map}} - {{#stopIter}}{{/stopIter}} - {{/map}} - {{#object}} - {{> serialize_object}} - {{/object}} - {{#enum}} - {{> serialize_enum}} - {{/enum}} - writer.Context().Pop() - {{/properties}} + {{#properties}} + writer.Context().Push("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + writer.WriteString("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}") + {{#scalar}} + {{> serialize_scalar}} + {{/scalar}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> serialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> serialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> serialize_object}} + {{/object}} + {{#enum}} + {{> serialize_enum}} + {{/enum}} + writer.Context().Pop() + {{/properties}} } func deserialize{{#toUpper}}{{type}}{{/toUpper}}(data []byte) *{{#toUpper}}{{type}}{{/toUpper}} { @@ -49,61 +44,65 @@ func deserialize{{#toUpper}}{{type}}{{/toUpper}}(data []byte) *{{#toUpper}}{{typ } func read{{#toUpper}}{{type}}{{/toUpper}}(reader msgpack.Read) *{{#toUpper}}{{type}}{{/toUpper}} { - var ( - {{#properties}} - _{{name}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} - {{#required}} - _{{name}}Set bool - {{/required}} - {{/properties}} - ) + var ( + {{#stuctProps}} + {{#properties}} + _{{name}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{#required}} + _{{name}}Set bool + {{/required}} + {{/properties}} + {{/stuctProps}} + ) for i := int32(reader.ReadMapLength()); i > 0; i-- { field := reader.ReadString() - reader.Context().Push(field, "unknown", "searching for property type"); + reader.Context().Push(field, "unknown", "searching for property type") switch field { - {{#properties}} - case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": - reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") - {{#scalar}} - {{> deserialize_scalar}} - {{/scalar}} - {{#enum}} - {{> deserialize_enum}} - {{/enum}} - {{#array}} - {{#startIter}}{{/startIter}} - {{> deserialize_array}} - {{#stopIter}}{{/stopIter}} - {{/array}} - {{#map}} - {{#startIter}}{{/startIter}} - {{> deserialize_map}} - {{#stopIter}}{{/stopIter}} - {{/map}} - {{#object}} - {{> deserialize_object}} - {{/object}} - {{#required}} - _{{name}}Set = true; - {{/required}} - reader.Context().Pop() - {{/properties}} + {{#properties}} + case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": + reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> deserialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> deserialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + {{#required}} + _{{name}}Set = true + {{/required}} + reader.Context().Pop() + {{/properties}} } - reader.Context().Pop() + reader.Context().Pop() } - {{#properties}} - {{#required}} - if (!_{{name}}Set) { - panic(reader.Context().PrintWithContext("Missing required property: '{{name}}: {{type}}'")) - } - {{/required}} - {{/properties}} + {{#properties}} + {{#required}} + if !_{{name}}Set { + panic(reader.Context().PrintWithContext("Missing required property: '{{name}}: {{type}}'")) + } + {{/required}} + {{/properties}} - return &{{#toUpper}}{{type}}{{/toUpper}}{ - {{#properties}} - {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, - {{/properties}} - } -} \ No newline at end of file + return &{{#toUpper}}{{type}}{{/toUpper}}{ + {{#stuctProps}} + {{#properties}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, + {{/properties}} + {{/stuctProps}} + } +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/enum-type/Enum%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/enum-type/Enum%type%-go.mustache index f4713678fc..1bd32360c5 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/enum-type/Enum%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/enum-type/Enum%type%-go.mustache @@ -3,10 +3,12 @@ package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} type {{#toUpper}}{{type}}{{/toUpper}} int32 const ( - {{#constants}} - {{#toUpper}}{{type}}{{/toUpper}}{{.}} = iota - {{/constants}} - {{#toFirstLower}}{{type}}{{/toFirstLower}}Max = iota +{{#stuctProps}} +{{#constants}} +{{#toUpper}}{{type}}{{/toUpper}}{{.}} = iota +{{/constants}} +{{#toFirstLower}}{{type}}{{/toFirstLower}}Max = iota +{{/stuctProps}} ) func Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(value int32) { @@ -17,10 +19,10 @@ func Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(value int32) { func Get{{#toUpper}}{{type}}{{/toUpper}}Value(key string) {{#toUpper}}{{type}}{{/toUpper}} { switch key { - {{#constants}} - case "{{.}}": - return {{#toUpper}}{{type}}{{/toUpper}}{{.}} - {{/constants}} + {{#constants}} + case "{{.}}": + return {{#toUpper}}{{type}}{{/toUpper}}{{.}} + {{/constants}} default: panic("Invalid key for enum '{{#toUpper}}{{type}}{{/toUpper}}'") } @@ -29,11 +31,11 @@ func Get{{#toUpper}}{{type}}{{/toUpper}}Value(key string) {{#toUpper}}{{type}}{{ func Get{{#toUpper}}{{type}}{{/toUpper}}Key(value {{#toUpper}}{{type}}{{/toUpper}}) string { Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(int32(value)) switch value { - {{#constants}} - case {{#toUpper}}{{type}}{{/toUpper}}{{.}}: - return "{{.}}" - {{/constants}} + {{#constants}} + case {{#toUpper}}{{type}}{{/toUpper}}{{.}}: + return "{{.}}" + {{/constants}} default: panic("Invalid value for enum '{{#toUpper}}{{type}}{{/toUpper}}'") } -} \ No newline at end of file +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%-go.mustache index ec612efbee..7f50e2c6a6 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%-go.mustache @@ -1,16 +1,13 @@ package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} -import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" - "github.com/valyala/fastjson" -) +{{#makeImports}}{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} type {{#toUpper}}{{type}}{{/toUpper}} struct { - {{#properties}} - {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} - {{/properties}} +{{#stuctProps}} +{{#properties}} +{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} +{{/properties}} +{{/stuctProps}} } func {{#toUpper}}{{type}}{{/toUpper}}ToBuffer(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { @@ -28,4 +25,3 @@ func {{#toUpper}}{{type}}{{/toUpper}}Write(writer msgpack.Write, value *{{#toUpp func {{#toUpper}}{{type}}{{/toUpper}}Read(reader msgpack.Read) *{{#toUpper}}{{type}}{{/toUpper}} { return read{{#toUpper}}{{type}}{{/toUpper}}(reader) } - diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%Serialization-go.mustache index c8a2d79e65..ac4ea04a6f 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%Serialization-go.mustache @@ -1,11 +1,6 @@ package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} -import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" - "github.com/valyala/fastjson" -) +{{#makeImports}}{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { ctx := msgpack.NewContext("Serializing (encoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") @@ -16,30 +11,30 @@ func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toU func write{{#toUpper}}{{type}}{{/toUpper}}(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { writer.WriteMapLength({{properties.length}}) - {{#properties}} - writer.Context().Push("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") - writer.WriteString("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}") - {{#scalar}} - {{> serialize_scalar}} - {{/scalar}} - {{#array}} - {{#startIter}}{{/startIter}} - {{> serialize_array}} - {{#stopIter}}{{/stopIter}} - {{/array}} - {{#map}} - {{#startIter}}{{/startIter}} - {{> serialize_map}} - {{#stopIter}}{{/stopIter}} - {{/map}} - {{#object}} - {{> serialize_object}} - {{/object}} - {{#enum}} - {{> serialize_enum}} - {{/enum}} - writer.Context().Pop() - {{/properties}} + {{#properties}} + writer.Context().Push("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + writer.WriteString("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}") + {{#scalar}} + {{> serialize_scalar}} + {{/scalar}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> serialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> serialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> serialize_object}} + {{/object}} + {{#enum}} + {{> serialize_enum}} + {{/enum}} + writer.Context().Pop() + {{/properties}} } func deserialize{{#toUpper}}{{type}}{{/toUpper}}(data []byte) *{{#toUpper}}{{type}}{{/toUpper}} { @@ -50,60 +45,64 @@ func deserialize{{#toUpper}}{{type}}{{/toUpper}}(data []byte) *{{#toUpper}}{{typ func read{{#toUpper}}{{type}}{{/toUpper}}(reader msgpack.Read) *{{#toUpper}}{{type}}{{/toUpper}} { var ( - {{#properties}} - _{{name}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} - {{#required}} - _{{name}}Set bool - {{/required}} - {{/properties}} + {{#stuctProps}} + {{#properties}} + _{{name}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{#required}} + _{{name}}Set bool + {{/required}} + {{/properties}} + {{/stuctProps}} ) for i := int32(reader.ReadMapLength()); i > 0; i-- { field := reader.ReadString() - reader.Context().Push(field, "unknown", "searching for property type"); + reader.Context().Push(field, "unknown", "searching for property type") switch field { - {{#properties}} - case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": - reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") - {{#scalar}} - {{> deserialize_scalar}} - {{/scalar}} - {{#enum}} - {{> deserialize_enum}} - {{/enum}} - {{#array}} - {{#startIter}}{{/startIter}} - {{> deserialize_array}} - {{#stopIter}}{{/stopIter}} - {{/array}} - {{#map}} - {{#startIter}}{{/startIter}} - {{> deserialize_map}} - {{#stopIter}}{{/stopIter}} - {{/map}} - {{#object}} - {{> deserialize_object}} - {{/object}} - {{#required}} - _{{name}}Set = true; - {{/required}} - reader.Context().Pop() - {{/properties}} + {{#properties}} + case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": + reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> deserialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> deserialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + {{#required}} + _{{name}}Set = true + {{/required}} + reader.Context().Pop() + {{/properties}} } - reader.Context().Pop() + reader.Context().Pop() } - {{#properties}} - {{#required}} - if (!_{{name}}Set) { - panic(reader.Context().PrintWithContext("Missing required property: '{{name}}: {{type}}'")) - } - {{/required}} - {{/properties}} + {{#properties}} + {{#required}} + if !_{{name}}Set { + panic(reader.Context().PrintWithContext("Missing required property: '{{name}}: {{type}}'")) + } + {{/required}} + {{/properties}} - return &{{#toUpper}}{{type}}{{/toUpper}}{ - {{#properties}} - {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, - {{/properties}} - } -} \ No newline at end of file + return &{{#toUpper}}{{type}}{{/toUpper}}{ + {{#stuctProps}} + {{#properties}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, + {{/properties}} + {{/stuctProps}} + } +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/interface-type/%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/interface-type/%type%-go.mustache index 2db03af454..c63551016a 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/interface-type/%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/interface-type/%type%-go.mustache @@ -12,8 +12,8 @@ import "github.com/consideritdone/polywrap-go/polywrap" {{#getImplementations}} {{#enabled}} func {{#toUpper}}{{namespace}}{{/toUpper}}Implementations() []string { - return polywrap.WrapGetImplementations("{{uri}}") + return polywrap.WrapGetImplementations("{{uri}}") } {{/enabled}} {{/getImplementations}} -{{/capabilities}} \ No newline at end of file +{{/capabilities}} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Serialization-go.mustache index 45e7b0762d..e908e48bfc 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Serialization-go.mustache @@ -1,84 +1,82 @@ package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} -import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" - "github.com/valyala/fastjson" -) +{{#makeImports}}{{#arguments}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/arguments}}{{/makeImports}} {{#methods}} type Args{{#toUpper}}{{name}}{{/toUpper}} struct { - {{#arguments}} - {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} - {{/arguments}} +{{#stuctProps}} +{{#arguments}} +{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} +{{/arguments}} +{{/stuctProps}} } func Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(value *Args{{#toUpper}}{{name}}{{/toUpper}}) []byte { - ctx := msgpack.NewContext("Serializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") - encoder := msgpack.NewWriteEncoder(ctx) - Write{{#toUpper}}{{name}}{{/toUpper}}Args(encoder, value); - return encoder.Buffer() + ctx := msgpack.NewContext("Serializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") + encoder := msgpack.NewWriteEncoder(ctx) + Write{{#toUpper}}{{name}}{{/toUpper}}Args(encoder, value) + return encoder.Buffer() } func Write{{#toUpper}}{{name}}{{/toUpper}}Args(writer msgpack.Write, value *Args{{#toUpper}}{{name}}{{/toUpper}}) { - writer.WriteMapLength({{arguments.length}}) - {{#arguments}} - writer.Context().Push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") - writer.WriteString("{{name}}") - {{#scalar}} - {{> value_serialize_scalar}} - {{/scalar}} - {{#array}} - {{#startIter}}{{/startIter}} - {{> value_serialize_array}} - {{#stopIter}}{{/stopIter}} - {{/array}} - {{#map}} - {{#startIter}}{{/startIter}} - {{> value_serialize_map}} - {{#stopIter}}{{/stopIter}} - {{/map}} - {{#object}} - {{> value_serialize_object}} - {{/object}} - {{#enum}} - {{> value_serialize_enum}} - {{/enum}} - writer.Context().Pop() - {{/arguments}} + writer.WriteMapLength({{arguments.length}}) + {{#arguments}} + writer.Context().Push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + writer.WriteString("{{name}}") + {{#scalar}} + {{> serialize_scalar}} + {{/scalar}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> serialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> serialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> serialize_object}} + {{/object}} + {{#enum}} + {{> serialize_enum}} + {{/enum}} + writer.Context().Pop() + {{/arguments}} } -export function Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(argsBuf []byte): {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}} { - ctx := msgpack.NewContext("Deserializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") - reader := msgpack.NewReadDecoder(ctx, argsBuf) +func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(argsBuf []byte) {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}} { + ctx := msgpack.NewContext("Deserializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") + reader := msgpack.NewReadDecoder(ctx, argsBuf) - {{#return}} - reader.Context().Push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "reading function output"); - var value {{#toWasm}}{{toGraphQLType}}{{/toWasm}} - {{#scalar}} - {{> value_deserialize_scalar}} - {{/scalar}} - {{#array}} - {{#startIter}}{{/startIter}} - {{> value_deserialize_array}} - {{#stopIter}}{{/stopIter}} - {{/array}} - {{#map}} - {{#startIter}}{{/startIter}} - {{> value_deserialize_map}} - {{#stopIter}}{{/stopIter}} - {{/map}} - {{#object}} - {{> value_deserialize_object}} - {{/object}} - {{#enum}} - {{> value_deserialize_enum}} - {{/enum}} - writer.Context().Pop() - return value - {{/return}} + {{#return}} + reader.Context().Push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "reading function output") + var value {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{#scalar}} + {{> value_deserialize_scalar}} + {{/scalar}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> value_deserialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> value_deserialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> value_deserialize_object}} + {{/object}} + {{#enum}} + {{> value_deserialize_enum}} + {{/enum}} + reader.Context().Pop() + return value + {{/return}} } +{{^last}} -{{/methods}} - +{{/last}} +{{/methods}} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Wrapped-go.mustache index b7d1e09512..1340695e91 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Wrapped-go.mustache @@ -2,20 +2,20 @@ package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} {{#methods.length}} import ( - "github.com/consideritdone/polywrap-go/polywrap" - "some/library/to/methods" + "github.com/consideritdone/polywrap-go/polywrap" + "some/library/to/methods" ) {{/methods.length}} {{^isInterface}} {{#methods}} func {{#toUpper}}{{type}}{{/toUpper}}{{#toUpper}}{{name}}{{/toUpper}}(args *Args{{#toUpper}}{{name}}{{/toUpper}}) ({{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, error) { - argsBuf := Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(args) - data, err := polywrap.WrapSubinvoke("{{uri}}", "{{name}}", argsBuf) - if err != nil { - return nil, result.Error() - } - return Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(result.unwrap()), nil + argsBuf := Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(args) + data, err := polywrap.WrapSubinvoke("{{uri}}", "{{name}}", argsBuf) + if err != nil { + return nil, result.Error() + } + return Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(result.unwrap()), nil } {{^last}} @@ -25,12 +25,12 @@ func {{#toUpper}}{{type}}{{/toUpper}}{{#toUpper}}{{name}}{{/toUpper}}(args *Args {{#isInterface}} {{#methods}} func {{#toUpper}}{{type}}{{/toUpper}}{{#toUpper}}{{name}}{{/toUpper}}(uri string, args *Args{{#toUpper}}{{name}}{{/toUpper}}) ({{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, error) { - argsBuf := Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(args) - data, err := polywrap.WrapSubinvokeImplementation("{{uri}}", uri, "{{name}}", argsBuf) - if err != nil { - return nil, err - } - return Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(data), nil + argsBuf := Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(args) + data, err := polywrap.WrapSubinvokeImplementation("{{uri}}", uri, "{{name}}", argsBuf) + if err != nil { + return nil, err + } + return Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(data), nil } {{^last}} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%-go.mustache index ec612efbee..7f50e2c6a6 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%-go.mustache @@ -1,16 +1,13 @@ package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} -import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" - "github.com/valyala/fastjson" -) +{{#makeImports}}{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} type {{#toUpper}}{{type}}{{/toUpper}} struct { - {{#properties}} - {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} - {{/properties}} +{{#stuctProps}} +{{#properties}} +{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} +{{/properties}} +{{/stuctProps}} } func {{#toUpper}}{{type}}{{/toUpper}}ToBuffer(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { @@ -28,4 +25,3 @@ func {{#toUpper}}{{type}}{{/toUpper}}Write(writer msgpack.Write, value *{{#toUpp func {{#toUpper}}{{type}}{{/toUpper}}Read(reader msgpack.Read) *{{#toUpper}}{{type}}{{/toUpper}} { return read{{#toUpper}}{{type}}{{/toUpper}}(reader) } - diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%Serialization-go.mustache index c8a2d79e65..3274d8b9c4 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%Serialization-go.mustache @@ -1,11 +1,6 @@ package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} -import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" - "github.com/valyala/fastjson" -) +{{#makeImports}}{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { ctx := msgpack.NewContext("Serializing (encoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") @@ -16,30 +11,30 @@ func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toU func write{{#toUpper}}{{type}}{{/toUpper}}(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { writer.WriteMapLength({{properties.length}}) - {{#properties}} - writer.Context().Push("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") - writer.WriteString("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}") - {{#scalar}} - {{> serialize_scalar}} - {{/scalar}} - {{#array}} - {{#startIter}}{{/startIter}} - {{> serialize_array}} - {{#stopIter}}{{/stopIter}} - {{/array}} - {{#map}} - {{#startIter}}{{/startIter}} - {{> serialize_map}} - {{#stopIter}}{{/stopIter}} - {{/map}} - {{#object}} - {{> serialize_object}} - {{/object}} - {{#enum}} - {{> serialize_enum}} - {{/enum}} - writer.Context().Pop() - {{/properties}} + {{#properties}} + writer.Context().Push("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + writer.WriteString("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}") + {{#scalar}} + {{> serialize_scalar}} + {{/scalar}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> serialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> serialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> serialize_object}} + {{/object}} + {{#enum}} + {{> serialize_enum}} + {{/enum}} + writer.Context().Pop() + {{/properties}} } func deserialize{{#toUpper}}{{type}}{{/toUpper}}(data []byte) *{{#toUpper}}{{type}}{{/toUpper}} { @@ -49,61 +44,65 @@ func deserialize{{#toUpper}}{{type}}{{/toUpper}}(data []byte) *{{#toUpper}}{{typ } func read{{#toUpper}}{{type}}{{/toUpper}}(reader msgpack.Read) *{{#toUpper}}{{type}}{{/toUpper}} { - var ( - {{#properties}} - _{{name}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} - {{#required}} - _{{name}}Set bool - {{/required}} - {{/properties}} - ) + var ( + {{#stuctProps}} + {{#properties}} + _{{name}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{#required}} + _{{name}}Set bool + {{/required}} + {{/properties}} + {{/stuctProps}} + ) for i := int32(reader.ReadMapLength()); i > 0; i-- { field := reader.ReadString() - reader.Context().Push(field, "unknown", "searching for property type"); + reader.Context().Push(field, "unknown", "searching for property type") switch field { - {{#properties}} - case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": - reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") - {{#scalar}} - {{> deserialize_scalar}} - {{/scalar}} - {{#enum}} - {{> deserialize_enum}} - {{/enum}} - {{#array}} - {{#startIter}}{{/startIter}} - {{> deserialize_array}} - {{#stopIter}}{{/stopIter}} - {{/array}} - {{#map}} - {{#startIter}}{{/startIter}} - {{> deserialize_map}} - {{#stopIter}}{{/stopIter}} - {{/map}} - {{#object}} - {{> deserialize_object}} - {{/object}} - {{#required}} - _{{name}}Set = true; - {{/required}} - reader.Context().Pop() - {{/properties}} + {{#properties}} + case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": + reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> deserialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> deserialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + {{#required}} + _{{name}}Set = true + {{/required}} + reader.Context().Pop() + {{/properties}} } - reader.Context().Pop() + reader.Context().Pop() } - {{#properties}} - {{#required}} - if (!_{{name}}Set) { - panic(reader.Context().PrintWithContext("Missing required property: '{{name}}: {{type}}'")) - } - {{/required}} - {{/properties}} + {{#properties}} + {{#required}} + if !_{{name}}Set { + panic(reader.Context().PrintWithContext("Missing required property: '{{name}}: {{type}}'")) + } + {{/required}} + {{/properties}} - return &{{#toUpper}}{{type}}{{/toUpper}}{ - {{#properties}} - {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, - {{/properties}} - } -} \ No newline at end of file + return &{{#toUpper}}{{type}}{{/toUpper}}{ + {{#stuctProps}} + {{#properties}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, + {{/properties}} + {{/stuctProps}} + } +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/interface-type/%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/interface-type/%type%-go.mustache index 46cc9be8e0..861f5555e7 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/interface-type/%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/interface-type/%type%-go.mustache @@ -12,8 +12,8 @@ import "github.com/consideritdone/polywrap-go/polywrap" {{#getImplementations}} {{#enabled}} func {{#toUpper}}{{namespace}}{{/toUpper}}Implementations() []string { - return polywrap.WrapGetImplementations("{{uri}}") + return polywrap.WrapGetImplementations("{{uri}}") } {{/enabled}} {{/getImplementations}} -{{/capabilities}} \ No newline at end of file +{{/capabilities}} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/main-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/main-go.mustache index 5907c2160f..c4f9dfc4e8 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/main-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/main-go.mustache @@ -1,21 +1,23 @@ package main import ( - "github.com/consideritdone/polywrap-go/examples/demo1/wrap/module" - "github.com/consideritdone/polywrap-go/polywrap" + "github.com/consideritdone/polywrap-go/examples/demo1/wrap/module" + "github.com/consideritdone/polywrap-go/polywrap" ) //export _wrap_invoke func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { - args := polywrap.WrapInvokeArgs(methodSize, argsSize) - - {{#moduleType}} - {{#methods}} - {{^first}}else {{/first}}if args.method == "{{name}}" { - return polywrap.WrapInvoke(args, envSize, module.{{#toUpper}}{{name}}{{/toUpper}}Wrapped) - } {{/methods}}{{/moduleType}}else { - return polywrap.WrapInvoke(args, envSize, nil) - } + args := polywrap.WrapInvokeArgs(methodSize, argsSize) + switch args.method { + {{#moduleType}} + {{#methods}} + case "{{name}}": + return polywrap.WrapInvoke(args, envSize, module.{{#toUpper}}{{name}}{{/toUpper}}Wrapped) + {{/methods}} + {{/moduleType}} + default: + return polywrap.WrapInvoke(args, envSize, nil) + } } func main() { diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Serialization-go.mustache index 9dff688252..292aa1978d 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Serialization-go.mustache @@ -1,115 +1,118 @@ package types -import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" - "github.com/valyala/fastjson" -) +{{#makeImports}}{{#arguments}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/arguments}}{{/makeImports}} {{#methods}} type Args{{#toUpper}}{{name}}{{/toUpper}} struct { - {{#arguments}} - {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} - {{/arguments}} +{{#stuctProps}} +{{#arguments}} +{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} +{{/arguments}} +{{/stuctProps}} } func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *Args{{#toUpper}}{{name}}{{/toUpper}} { - ctx := msgpack.NewContext("Deserializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") + ctx := msgpack.NewContext("Deserializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") {{#arguments.length}} - reader := msgpack.NewReadDecoder(ctx, argsBuf) + reader := msgpack.NewReadDecoder(ctx, argsBuf) - var ( - {{#arguments}} - _{{name}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} - {{#required}} - _{{name}}Set bool - {{/required}} - {{/arguments}} - ) + var ( + {{#stuctProps}} + {{#arguments}} + _{{name}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{#required}} + _{{name}}Set bool + {{/required}} + {{/arguments}} + {{/stuctProps}} + ) - for i := int32(reader.ReadMapLength()); i > 0; i-- { - field := reader.ReadString() - reader.Context().Push(field, "unknown", "searching for property type"); - reader.Context().Pop() - switch field { - {{#arguments}} - case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": - reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") - {{#scalar}} - {{> deserialize_scalar}} - {{/scalar}} - {{#enum}} - {{> deserialize_enum}} - {{/enum}} - {{#array}} - {{#startIter}}{{/startIter}} - {{> deserialize_array}} - {{#stopIter}}{{/stopIter}} - {{/array}} - {{#map}} - {{#startIter}}{{/startIter}} - {{> deserialize_map}} - {{#stopIter}}{{/stopIter}} - {{/map}} - {{#object}} - {{> deserialize_object}} - {{/object}} - {{#required}} - _{{name}}Set = true; - {{/required}} - reader.Context().Pop() - {{/arguments}} - } - } + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type") + reader.Context().Pop() + switch field { + {{#arguments}} + case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": + reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> deserialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> deserialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + {{#required}} + _{{name}}Set = true + {{/required}} + reader.Context().Pop() + {{/arguments}} + } + } - {{#arguments}} - {{#required}} - if (!_{{name}}Set) { - panic(reader.Context().PrintWithContext("Missing required property: '{{name}}: {{type}}'")) - } - {{/required}} - {{/arguments}} - {{/arguments.length}} + {{#arguments}} + {{#required}} + if !_{{name}}Set { + panic(reader.Context().PrintWithContext("Missing required property: '{{name}}: {{type}}'")) + } + {{/required}} + {{/arguments}} + {{/arguments.length}} - return &Args{{#toUpper}}{{name}}{{/toUpper}}{ - {{#arguments}} - {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, - {{/arguments}} - } + return &Args{{#toUpper}}{{name}}{{/toUpper}}{ + {{#stuctProps}} + {{#arguments}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, + {{/arguments}} + {{/stuctProps}} + } } func Serialize{{#toUpper}}{{name}}{{/toUpper}}Result(value {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}) []byte { - ctx := msgpack.NewContext("Serializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") - encoder := msgpack.NewWriteEncoder(ctx) - Write{{#toUpper}}{{name}}{{/toUpper}}Result(encoder, value); - return encoder.Buffer() + ctx := msgpack.NewContext("Serializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") + encoder := msgpack.NewWriteEncoder(ctx) + Write{{#toUpper}}{{name}}{{/toUpper}}Result(encoder, value); + return encoder.Buffer() } func Write{{#toUpper}}{{name}}{{/toUpper}}Result(writer msgpack.Write, value {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}) { - {{#return}} - writer.Context().Push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property"); - {{#scalar}} - {{> value_serialize_scalar}} - {{/scalar}} - {{#array}} - {{#startIter}}{{/startIter}} - {{> value_serialize_array}} - {{#stopIter}}{{/stopIter}} - {{/array}} - {{#map}} - {{#startIter}}{{/startIter}} - {{> value_serialize_map}} - {{#stopIter}}{{/stopIter}} - {{/map}} - {{#object}} - {{> value_serialize_object}} - {{/object}} - {{#enum}} - {{> value_serialize_enum}} - {{/enum}} - writer.Context().Pop() - {{/return}} + {{#return}} + writer.Context().Push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + {{#scalar}} + {{> value_serialize_scalar}} + {{/scalar}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> value_serialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> value_serialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> value_serialize_object}} + {{/object}} + {{#enum}} + {{> value_serialize_enum}} + {{/enum}} + writer.Context().Pop() + {{/return}} } +{{^last}} -{{/methods}} +{{/last}} +{{/methods}} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Wrapped-go.mustache index 5e24b3b48a..3941f19b41 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Wrapped-go.mustache @@ -2,34 +2,32 @@ package types {{#methods.length}} import ( - "github.com/consideritdone/polywrap-go/polywrap" - "some/library/to/methods" + "github.com/consideritdone/polywrap-go/polywrap" + "some/library/to/methods" ) {{/methods.length}} {{#methods}} func {{#toUpper}}{{name}}{{/toUpper}}Wrapped(argsBuf []byte, envSize uint32) []byte { - var env *Env - {{#env}} - {{#required}} - if (envSize == 0) { - panic("Environment is not set, and it is required by method 'objectMethod'") - } - {{/required}} - if (envSize > 0) { - envBuf := polywrap.WrapLoadEnv(envSize); - env = EnvFromBuffer(envBuf); - } - {{/env}} + var env *Env + {{#env}} + {{#required}} + if envSize == 0 { + panic("Environment is not set, and it is required by method 'objectMethod'") + } + {{/required}} + if envSize > 0 { + envBuf := polywrap.WrapLoadEnv(envSize) + env = EnvFromBuffer(envBuf) + } + {{/env}} - {{#arguments.length}} - args: = Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf) - {{/arguments.length}} + {{#arguments.length}} + args := Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf) + {{/arguments.length}} - result := methods.{{#toUpper}}{{name}}{{/toUpper}}({{#arguments.length}}args{{/arguments.length}}{{^arguments.length}}nil{{/arguments.length}}{{#env}}, env{{/env}}) - return Serialize{{#toUpper}}{{name}}{{/toUpper}}Result(result); + result := methods.{{#toUpper}}{{name}}{{/toUpper}}({{#arguments.length}}args{{/arguments.length}}{{^arguments.length}}nil{{/arguments.length}}{{#env}}, env{{/env}}) + return Serialize{{#toUpper}}{{name}}{{/toUpper}}Result(result) } -{{^last}} -{{/last}} {{/methods}} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%-go.mustache index 08d588529e..b17610926a 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%-go.mustache @@ -1,16 +1,13 @@ package types -import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" - "github.com/valyala/fastjson" -) +{{#makeImports}}{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} type {{#toUpper}}{{type}}{{/toUpper}} struct { - {{#properties}} - {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} - {{/properties}} +{{#stuctProps}} +{{#properties}} +{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} +{{/properties}} +{{/stuctProps}} } func {{#toUpper}}{{type}}{{/toUpper}}ToBuffer(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { @@ -28,4 +25,3 @@ func {{#toUpper}}{{type}}{{/toUpper}}Write(writer msgpack.Write, value *{{#toUpp func {{#toUpper}}{{type}}{{/toUpper}}Read(reader msgpack.Read) *{{#toUpper}}{{type}}{{/toUpper}} { return read{{#toUpper}}{{type}}{{/toUpper}}(reader) } - diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%Serialization-go.mustache index 38c9f04e63..93bec1a7d4 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%Serialization-go.mustache @@ -1,11 +1,6 @@ package types -import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/container" - "github.com/valyala/fastjson" -) +{{#makeImports}}{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { ctx := msgpack.NewContext("Serializing (encoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") @@ -16,30 +11,30 @@ func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toU func write{{#toUpper}}{{type}}{{/toUpper}}(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { writer.WriteMapLength({{properties.length}}) - {{#properties}} - writer.Context().Push("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") - writer.WriteString("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}") - {{#scalar}} - {{> serialize_scalar}} - {{/scalar}} - {{#array}} - {{#startIter}}{{/startIter}} - {{> serialize_array}} - {{#stopIter}}{{/stopIter}} - {{/array}} - {{#map}} - {{#startIter}}{{/startIter}} - {{> serialize_map}} - {{#stopIter}}{{/stopIter}} - {{/map}} - {{#object}} - {{> serialize_object}} - {{/object}} - {{#enum}} - {{> serialize_enum}} - {{/enum}} - writer.Context().Pop() - {{/properties}} + {{#properties}} + writer.Context().Push("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + writer.WriteString("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}") + {{#scalar}} + {{> serialize_scalar}} + {{/scalar}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> serialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> serialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> serialize_object}} + {{/object}} + {{#enum}} + {{> serialize_enum}} + {{/enum}} + writer.Context().Pop() + {{/properties}} } func deserialize{{#toUpper}}{{type}}{{/toUpper}}(data []byte) *{{#toUpper}}{{type}}{{/toUpper}} { @@ -49,61 +44,64 @@ func deserialize{{#toUpper}}{{type}}{{/toUpper}}(data []byte) *{{#toUpper}}{{typ } func read{{#toUpper}}{{type}}{{/toUpper}}(reader msgpack.Read) *{{#toUpper}}{{type}}{{/toUpper}} { - var ( - {{#properties}} - _{{name}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} - {{#required}} - _{{name}}Set bool - {{/required}} - {{/properties}} - ) + var ( + {{#stuctProps}} + {{#properties}} + _{{name}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{#required}} + _{{name}}Set bool + {{/required}} + {{/properties}} + {{/stuctProps}} + ) for i := int32(reader.ReadMapLength()); i > 0; i-- { field := reader.ReadString() - reader.Context().Push(field, "unknown", "searching for property type"); + reader.Context().Push(field, "unknown", "searching for property type") switch field { - {{#properties}} - case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": - reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") - {{#scalar}} - {{> deserialize_scalar}} - {{/scalar}} - {{#enum}} - {{> deserialize_enum}} - {{/enum}} - {{#array}} - {{#startIter}}{{/startIter}} - {{> deserialize_array}} - {{#stopIter}}{{/stopIter}} - {{/array}} - {{#map}} - {{#startIter}}{{/startIter}} - {{> deserialize_map}} - {{#stopIter}}{{/stopIter}} - {{/map}} - {{#object}} - {{> deserialize_object}} - {{/object}} - {{#required}} - _{{name}}Set = true; - {{/required}} - reader.Context().Pop() - {{/properties}} + {{#properties}} + case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": + reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{#startIter}}{{/startIter}} + {{> deserialize_array}} + {{#stopIter}}{{/stopIter}} + {{/array}} + {{#map}} + {{#startIter}}{{/startIter}} + {{> deserialize_map}} + {{#stopIter}}{{/stopIter}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + {{#required}} + _{{name}}Set = true + {{/required}} + reader.Context().Pop() + {{/properties}} } - reader.Context().Pop() + reader.Context().Pop() } - {{#properties}} - {{#required}} - if (!_{{name}}Set) { - panic(reader.Context().PrintWithContext("Missing required property: '{{name}}: {{type}}'")) - } - {{/required}} - {{/properties}} - - return &{{#toUpper}}{{type}}{{/toUpper}}{ - {{#properties}} - {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, - {{/properties}} - } -} \ No newline at end of file + {{#properties}} + {{#required}} + if !_{{name}}Set { + panic(reader.Context().PrintWithContext("Missing required property: '{{name}}: {{type}}'")) + } + {{/required}} + {{/properties}} + return &{{#toUpper}}{{type}}{{/toUpper}}{ + {{#stuctProps}} + {{#properties}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, + {{/properties}} + {{/stuctProps}} + } +} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_array.mustache index 2a807ea5b0..cc83c569de 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_array.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_array.mustache @@ -1,23 +1,23 @@ if value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#lastFullIter}}i{{/lastFullIter}} == nil { - writer.WriteNil() + writer.WriteNil() } else if len(value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#lastFullIter}}i{{/lastFullIter}}) == 0 { - writer.WriteNil() + writer.WriteNil() } else { - for {{#nextIter}}i{{/nextIter}} := range value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#prevFullIter}}i{{/prevFullIter}} { - {{#scalar}} - {{> serialize_scalar}} - {{/scalar}} - {{#enum}} - {{> serialize_enum}} - {{/enum}} - {{#array}} - {{> serialize_array}} - {{/array}} - {{#map}} - {{> serialize_map_value}} - {{/map}} - {{#object}} - {{> serialize_object}} - {{/object}} - } + for {{#nextIter}}i{{/nextIter}} := range value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#prevFullIter}}i{{/prevFullIter}} { + {{#scalar}} + {{> serialize_scalar}} + {{/scalar}} + {{#enum}} + {{> serialize_enum}} + {{/enum}} + {{#array}} + {{> serialize_array}} + {{/array}} + {{#map}} + {{> serialize_map_value}} + {{/map}} + {{#object}} + {{> serialize_object}} + {{/object}} + } } diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_enum.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_enum.mustache index 3a5f83b057..cf2d5be270 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_enum.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_enum.mustache @@ -1,13 +1,13 @@ { - v := value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#lastFullIter}}i{{/lastFullIter}} - {{#required}} - writer.WriteI32(int32(v)); - {{/required}} - {{^required}} - if v == nil { - writer.WriteNil() - } else { - writer.WriteI32(int32(*v)); - } - {{/required}} + v := value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#lastFullIter}}i{{/lastFullIter}} + {{#required}} + writer.WriteI32(int32(v)) + {{/required}} + {{^required}} + if v == nil { + writer.WriteNil() + } else { + writer.WriteI32(int32(*v)) + } + {{/required}} } diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_map.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_map.mustache index ea96d27d16..3191f3ad83 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_map.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_map.mustache @@ -1,24 +1,24 @@ if value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} == nil { - writer.WriteNil() + writer.WriteNil() } else if len(value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}) == 0 { - writer.WriteNil() + writer.WriteNil() } else { - for {{#nextIter}}i{{/nextIter}} := range value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#getPrevIter}}i{{/getPrevIter}} { - writer.Write{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}({{#currIter}}i{{/currIter}}) - {{#scalar}} - {{> serialize_scalar}} - {{/scalar}} - {{#enum}} - {{> serialize_enum}} - {{/enum}} - {{#array}} - {{> serialize_array}} - {{/array}} - {{#map}} - {{> serialize_map}} - {{/map}} - {{#object}} - {{> serialize_object}} - {{/object}} - } + for {{#nextIter}}i{{/nextIter}} := range value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#getPrevIter}}i{{/getPrevIter}} { + writer.Write{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}({{#currIter}}i{{/currIter}}) + {{#scalar}} + {{> serialize_scalar}} + {{/scalar}} + {{#enum}} + {{> serialize_enum}} + {{/enum}} + {{#array}} + {{> serialize_array}} + {{/array}} + {{#map}} + {{> serialize_map}} + {{/map}} + {{#object}} + {{> serialize_object}} + {{/object}} + } } diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_object.mustache index 95139e29c6..62c6d07eeb 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_object.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_object.mustache @@ -1,10 +1,9 @@ - { - v := value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#lastFullIter}}i{{/lastFullIter}} - {{#required}} - {{#toUpper}}{{type}}{{/toUpper}}Write(writer, &v) - {{/required}} - {{^required}} - {{#toUpper}}{{type}}{{/toUpper}}Write(writer, v) - {{/required}} + v := value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#lastFullIter}}i{{/lastFullIter}} + {{#required}} + {{#toUpper}}{{type}}{{/toUpper}}Write(writer, &v) + {{/required}} + {{^required}} + {{#toUpper}}{{type}}{{/toUpper}}Write(writer, v) + {{/required}} } diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_scalar.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_scalar.mustache index 256dd0ec43..322a1867ce 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_scalar.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_scalar.mustache @@ -1,13 +1,13 @@ { - v := value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#lastFullIter}}i{{/lastFullIter}} - {{#required}} - writer.Write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(v) - {{/required}} - {{^required}} - if v == nil { - writer.WriteNil() - } else { - {{#writePointer}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}} - v{{/writePointer}} - } - {{/required}} + v := value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#lastFullIter}}i{{/lastFullIter}} + {{#required}} + writer.Write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(v) + {{/required}} + {{^required}} + if v == nil { + writer.WriteNil() + } else { + {{#writePointer}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}} - v{{/writePointer}} + } + {{/required}} } diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_array.mustache index 8a852d06e1..808965046e 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_array.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_array.mustache @@ -1,23 +1,23 @@ if reader.IsNil() { - value{{#lastFullIter}}i{{/lastFullIter}} = nil + value{{#lastFullIter}}i{{/lastFullIter}} = nil } else { - {{#nextIter}}ln{{/nextIter}} := reader.ReadArrayLength() - value{{#prevFullIter}}i{{/prevFullIter}} = make({{#toWasm}}{{toGraphQLType}}{{/toWasm}}, {{#currIter}}ln{{/currIter}}) - for {{#currIter}}i{{/currIter}} := uint32(0); {{#currIter}}i{{/currIter}} < {{#currIter}}ln{{/currIter}}; {{#currIter}}i{{/currIter}}++ { - {{#scalar}} - {{> deserialize_scalar}} - {{/scalar}} - {{#enum}} - {{> deserialize_enum}} - {{/enum}} - {{#array}} - {{> deserialize_array}} - {{/array}} - {{#map}} - {{> deserialize_map}} - {{/map}} - {{#object}} - {{> deserialize_object}} - {{/object}} - } + {{#nextIter}}ln{{/nextIter}} := reader.ReadArrayLength() + value{{#prevFullIter}}i{{/prevFullIter}} = make({{#toWasm}}{{toGraphQLType}}{{/toWasm}}, {{#currIter}}ln{{/currIter}}) + for {{#currIter}}i{{/currIter}} := uint32(0); {{#currIter}}i{{/currIter}} < {{#currIter}}ln{{/currIter}}; {{#currIter}}i{{/currIter}}++ { + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{> deserialize_array}} + {{/array}} + {{#map}} + {{> deserialize_map}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + } } diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_enum.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_enum.mustache index 72dcb0b7ed..b498c3d4f5 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_enum.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_enum.mustache @@ -4,8 +4,8 @@ Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(int32(_{{name}}{{#lastFullIter}}i{ {{/required}} {{^required}} if !reader.IsNil() { - v := {{#toUpper}}{{type}}{{/toUpper}}(reader.ReadI32()) - Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(int32(v)) - value{{#lastFullIter}}i{{/lastFullIter}} = &v + v := {{#toUpper}}{{type}}{{/toUpper}}(reader.ReadI32()) + Sanitize{{#toUpper}}{{type}}{{/toUpper}}Value(int32(v)) + value{{#lastFullIter}}i{{/lastFullIter}} = &v } {{/required}} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_map.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_map.mustache index 5861374a16..c0eeaa66d6 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_map.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_map.mustache @@ -1,24 +1,24 @@ if reader.IsNil() { - value{{#lastFullIter}}i{{/lastFullIter}} = nil + value{{#lastFullIter}}i{{/lastFullIter}} = nil } else { - {{#nextIter}}ln{{/nextIter}} := reader.ReadMapLength() - value{{#prevFullIter}}i{{/prevFullIter}} = make({{#toWasm}}{{toGraphQLType}}{{/toWasm}}) - for {{#currIter}}j{{/currIter}} := uint32(0); {{#currIter}}j{{/currIter}} < {{#currIter}}ln{{/currIter}}; {{#currIter}}j{{/currIter}}++ { - {{#currIter}}i{{/currIter}} := reader.Read{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}() - {{#scalar}} - {{> deserialize_scalar}} - {{/scalar}} - {{#enum}} - {{> deserialize_enum}} - {{/enum}} - {{#array}} - {{> deserialize_array}} - {{/array}} - {{#map}} - {{> deserialize_map}} - {{/map}} - {{#object}} - {{> deserialize_object}} - {{/object}} - } + {{#nextIter}}ln{{/nextIter}} := reader.ReadMapLength() + value{{#prevFullIter}}i{{/prevFullIter}} = make({{#toWasm}}{{toGraphQLType}}{{/toWasm}}) + for {{#currIter}}j{{/currIter}} := uint32(0); {{#currIter}}j{{/currIter}} < {{#currIter}}ln{{/currIter}}; {{#currIter}}j{{/currIter}}++ { + {{#currIter}}i{{/currIter}} := reader.Read{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}() + {{#scalar}} + {{> deserialize_scalar}} + {{/scalar}} + {{#enum}} + {{> deserialize_enum}} + {{/enum}} + {{#array}} + {{> deserialize_array}} + {{/array}} + {{#map}} + {{> deserialize_map}} + {{/map}} + {{#object}} + {{> deserialize_object}} + {{/object}} + } } diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_object.mustache index 645435c97c..2a7c26cd0c 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_object.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_object.mustache @@ -1,8 +1,8 @@ if v := {{#toUpper}}{{type}}{{/toUpper}}Read(reader); v != nil { - {{#required}} - value{{#lastFullIter}}i{{/lastFullIter}} = *v - {{/required}} - {{^required}} - value{{#lastFullIter}}i{{/lastFullIter}} = v - {{/required}} + {{#required}} + value{{#lastFullIter}}i{{/lastFullIter}} = *v + {{/required}} + {{^required}} + value{{#lastFullIter}}i{{/lastFullIter}} = v + {{/required}} } diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_scalar.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_scalar.mustache index c917632081..09966bd026 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_scalar.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_scalar.mustache @@ -3,7 +3,7 @@ value{{#lastFullIter}}i{{/lastFullIter}} = reader.Read{{#toMsgPack}}{{toGraphQLT {{/required}} {{^required}} if !reader.IsNil() { - v := reader.Read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(); - value{{#lastFullIter}}i{{/lastFullIter}} = {{#readPointer}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}} - v{{/readPointer}} + v := reader.Read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}() + value{{#lastFullIter}}i{{/lastFullIter}} = {{#readPointer}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}} - v{{/readPointer}} } {{/required}} diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_array.mustache index 9c759d825b..8dd12bb4f4 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_array.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_array.mustache @@ -1,23 +1,23 @@ if value{{#lastFullIter}}i{{/lastFullIter}} == nil { - writer.WriteNil() + writer.WriteNil() } else if len(value{{#lastFullIter}}i{{/lastFullIter}}) == 0 { - writer.WriteNil() + writer.WriteNil() } else { - for {{#nextIter}}i{{/nextIter}} := range value{{#prevFullIter}}i{{/prevFullIter}} { - {{#scalar}} - {{> value_serialize_scalar}} - {{/scalar}} - {{#enum}} - {{> value_serialize_enum}} - {{/enum}} - {{#array}} - {{> value_serialize_array}} - {{/array}} - {{#map}} - {{> value_serialize_map}} - {{/map}} - {{#object}} - {{> value_serialize_object}} - {{/object}} - } + for {{#nextIter}}i{{/nextIter}} := range value{{#prevFullIter}}i{{/prevFullIter}} { + {{#scalar}} + {{> value_serialize_scalar}} + {{/scalar}} + {{#enum}} + {{> value_serialize_enum}} + {{/enum}} + {{#array}} + {{> value_serialize_array}} + {{/array}} + {{#map}} + {{> value_serialize_map}} + {{/map}} + {{#object}} + {{> value_serialize_object}} + {{/object}} + } } diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_enum.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_enum.mustache index c6567e8c24..590702b638 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_enum.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_enum.mustache @@ -1,13 +1,13 @@ { - v := value{{#lastFullIter}}i{{/lastFullIter}} - {{#required}} - writer.WriteI32(int32(v)); - {{/required}} - {{^required}} - if v == nil { - writer.WriteNil() - } else { - writer.WriteI32(int32(*v)); - } - {{/required}} + v := value{{#lastFullIter}}i{{/lastFullIter}} + {{#required}} + writer.WriteI32(int32(v)) + {{/required}} + {{^required}} + if v == nil { + writer.WriteNil() + } else { + writer.WriteI32(int32(*v)) + } + {{/required}} } diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_map.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_map.mustache index d60bb55b17..41b00f5949 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_map.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_map.mustache @@ -1,24 +1,24 @@ if value == nil { - writer.WriteNil() + writer.WriteNil() } else if len(value) == 0 { - writer.WriteNil() + writer.WriteNil() } else { - for {{#nextIter}}i{{/nextIter}} := range value{{#getPrevIter}}i{{/getPrevIter}} { - writer.Write{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}({{#currIter}}i{{/currIter}}) - {{#scalar}} - {{> value_serialize_scalar}} - {{/scalar}} - {{#enum}} - {{> value_serialize_enum}} - {{/enum}} - {{#array}} - {{> value_serialize_array}} - {{/array}} - {{#map}} - {{> value_serialize_map}} - {{/map}} - {{#object}} - {{> value_serialize_object}} - {{/object}} - } + for {{#nextIter}}i{{/nextIter}} := range value{{#getPrevIter}}i{{/getPrevIter}} { + writer.Write{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}({{#currIter}}i{{/currIter}}) + {{#scalar}} + {{> value_serialize_scalar}} + {{/scalar}} + {{#enum}} + {{> value_serialize_enum}} + {{/enum}} + {{#array}} + {{> value_serialize_array}} + {{/array}} + {{#map}} + {{> value_serialize_map}} + {{/map}} + {{#object}} + {{> value_serialize_object}} + {{/object}} + } } diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_object.mustache index aa5894e0ba..3b6ae4d7c6 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_object.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_object.mustache @@ -1,9 +1,9 @@ { - v := value{{#lastFullIter}}i{{/lastFullIter}} - {{#required}} - {{#toUpper}}{{type}}{{/toUpper}}Write(writer, &v) - {{/required}} - {{^required}} - {{#toUpper}}{{type}}{{/toUpper}}Write(writer, v) - {{/required}} + v := value{{#lastFullIter}}i{{/lastFullIter}} + {{#required}} + {{#toUpper}}{{type}}{{/toUpper}}Write(writer, &v) + {{/required}} + {{^required}} + {{#toUpper}}{{type}}{{/toUpper}}Write(writer, v) + {{/required}} } diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_scalar.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_scalar.mustache index 6aa89267b1..440c44f87c 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_scalar.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_scalar.mustache @@ -1,13 +1,13 @@ { - v := value{{#lastFullIter}}i{{/lastFullIter}} - {{#required}} - writer.Write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(v) - {{/required}} - {{^required}} - if v == nil { - writer.WriteNil() - } else { - {{#writePointer}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}} - v{{/writePointer}} - } - {{/required}} + v := value{{#lastFullIter}}i{{/lastFullIter}} + {{#required}} + writer.Write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(v) + {{/required}} + {{^required}} + if v == nil { + writer.WriteNil() + } else { + {{#writePointer}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}} - v{{/writePointer}} + } + {{/required}} } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/enum_test_import__enum.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/enum_test_import__enum.go new file mode 100644 index 0000000000..e70a6de407 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/enum_test_import__enum.go @@ -0,0 +1,38 @@ +package test_import + +type TestImport_Enum int32 + +const ( + TestImport_EnumSTRING = iota + TestImport_EnumBYTES = iota + testImport_EnumMax = iota +) + +func SanitizeTestImport_EnumValue(value int32) { + if !(value >= 0 && value < int32(testImport_EnumMax)) { + panic("Invalid value for enum 'TestImport_Enum'") + } +} + +func GetTestImport_EnumValue(key string) TestImport_Enum { + switch key { + case "STRING": + return TestImport_EnumSTRING + case "BYTES": + return TestImport_EnumBYTES + default: + panic("Invalid key for enum 'TestImport_Enum'") + } +} + +func GetTestImport_EnumKey(value TestImport_Enum) string { + SanitizeTestImport_EnumValue(int32(value)) + switch value { + case TestImport_EnumSTRING: + return "STRING" + case TestImport_EnumBYTES: + return "BYTES" + default: + panic("Invalid value for enum 'TestImport_Enum'") + } +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go new file mode 100644 index 0000000000..a82fa76d57 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go @@ -0,0 +1,25 @@ +package test_import + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) + +type TestImport_Env struct { + EnviroProp string +} + +func TestImport_EnvToBuffer(value *TestImport_Env) []byte { + return serializeTestImport_Env(value) +} + +func TestImport_EnvFromBuffer(data []byte) *TestImport_Env { + return deserializeTestImport_Env(data) +} + +func TestImport_EnvWrite(writer msgpack.Write, value *TestImport_Env) { + writeTestImport_Env(writer, value) +} + +func TestImport_EnvRead(reader msgpack.Read) *TestImport_Env { + return readTestImport_Env(reader) +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go new file mode 100644 index 0000000000..f0bca14901 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go @@ -0,0 +1,57 @@ +package test_import + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) + +func serializeTestImport_Env(value *TestImport_Env) []byte { + ctx := msgpack.NewContext("Serializing (encoding) env-type: TestImport_Env") + encoder := msgpack.NewWriteEncoder(ctx) + writeTestImport_Env(encoder, value) + return encoder.Buffer() +} + +func writeTestImport_Env(writer msgpack.Write, value *TestImport_Env) { + writer.WriteMapLength(1) + writer.Context().Push("EnviroProp", "string", "writing property") + writer.WriteString("EnviroProp") + { + v := value.EnviroProp + writer.WriteString(v) + } + writer.Context().Pop() +} + +func deserializeTestImport_Env(data []byte) *TestImport_Env { + ctx := msgpack.NewContext("Deserializing (decoding) env-type: TestImport_Env") + reader := msgpack.NewReadDecoder(ctx, data) + return readTestImport_Env(reader) +} + +func readTestImport_Env(reader msgpack.Read) *TestImport_Env { + var ( + _enviroProp string + _enviroPropSet bool + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type") + switch field { + case "EnviroProp": + reader.Context().Push(field, "string", "type found, reading property") + _enviroProp = reader.ReadString() + _enviroPropSet = true + reader.Context().Pop() + } + reader.Context().Pop() + } + + if !_enviroPropSet { + panic(reader.Context().PrintWithContext("Missing required property: 'enviroProp: String'")) + } + + return &TestImport_Env{ + EnviroProp: _enviroProp, + } +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object.go new file mode 100644 index 0000000000..8e38e568f2 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object.go @@ -0,0 +1,25 @@ +package test_import + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) + +type TestImport_AnotherObject struct { + Prop string +} + +func TestImport_AnotherObjectToBuffer(value *TestImport_AnotherObject) []byte { + return serializeTestImport_AnotherObject(value) +} + +func TestImport_AnotherObjectFromBuffer(data []byte) *TestImport_AnotherObject { + return deserializeTestImport_AnotherObject(data) +} + +func TestImport_AnotherObjectWrite(writer msgpack.Write, value *TestImport_AnotherObject) { + writeTestImport_AnotherObject(writer, value) +} + +func TestImport_AnotherObjectRead(reader msgpack.Read) *TestImport_AnotherObject { + return readTestImport_AnotherObject(reader) +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object_serialization.go new file mode 100644 index 0000000000..8fd5893842 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object_serialization.go @@ -0,0 +1,57 @@ +package test_import + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) + +func serializeTestImport_AnotherObject(value *TestImport_AnotherObject) []byte { + ctx := msgpack.NewContext("Serializing (encoding) env-type: TestImport_AnotherObject") + encoder := msgpack.NewWriteEncoder(ctx) + writeTestImport_AnotherObject(encoder, value) + return encoder.Buffer() +} + +func writeTestImport_AnotherObject(writer msgpack.Write, value *TestImport_AnotherObject) { + writer.WriteMapLength(1) + writer.Context().Push("Prop", "string", "writing property") + writer.WriteString("Prop") + { + v := value.Prop + writer.WriteString(v) + } + writer.Context().Pop() +} + +func deserializeTestImport_AnotherObject(data []byte) *TestImport_AnotherObject { + ctx := msgpack.NewContext("Deserializing (decoding) env-type: TestImport_AnotherObject") + reader := msgpack.NewReadDecoder(ctx, data) + return readTestImport_AnotherObject(reader) +} + +func readTestImport_AnotherObject(reader msgpack.Read) *TestImport_AnotherObject { + var ( + _prop string + _propSet bool + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type") + switch field { + case "Prop": + reader.Context().Push(field, "string", "type found, reading property") + _prop = reader.ReadString() + _propSet = true + reader.Context().Pop() + } + reader.Context().Pop() + } + + if !_propSet { + panic(reader.Context().PrintWithContext("Missing required property: 'prop: String'")) + } + + return &TestImport_AnotherObject{ + Prop: _prop, + } +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object.go new file mode 100644 index 0000000000..6b60414f31 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object.go @@ -0,0 +1,32 @@ +package test_import + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) + +type TestImport_Object struct { + Object TestImport_AnotherObject + OptObject *TestImport_AnotherObject + ObjectArray []TestImport_AnotherObject + OptObjectArray []*TestImport_AnotherObject + En TestImport_Enum + OptEnum *TestImport_Enum + EnumArray []TestImport_Enum + OptEnumArray []*TestImport_Enum +} + +func TestImport_ObjectToBuffer(value *TestImport_Object) []byte { + return serializeTestImport_Object(value) +} + +func TestImport_ObjectFromBuffer(data []byte) *TestImport_Object { + return deserializeTestImport_Object(data) +} + +func TestImport_ObjectWrite(writer msgpack.Write, value *TestImport_Object) { + writeTestImport_Object(writer, value) +} + +func TestImport_ObjectRead(reader msgpack.Read) *TestImport_Object { + return readTestImport_Object(reader) +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go new file mode 100644 index 0000000000..e9e87399a2 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go @@ -0,0 +1,253 @@ +package test_import + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) + +func serializeTestImport_Object(value *TestImport_Object) []byte { + ctx := msgpack.NewContext("Serializing (encoding) env-type: TestImport_Object") + encoder := msgpack.NewWriteEncoder(ctx) + writeTestImport_Object(encoder, value) + return encoder.Buffer() +} + +func writeTestImport_Object(writer msgpack.Write, value *TestImport_Object) { + writer.WriteMapLength(8) + writer.Context().Push("Object", "TestImport_AnotherObject", "writing property") + writer.WriteString("Object") + { + v := value.Object + TestImport_AnotherObjectWrite(writer, &v) + } + writer.Context().Pop() + writer.Context().Push("OptObject", "*TestImport_AnotherObject", "writing property") + writer.WriteString("OptObject") + { + v := value.OptObject + TestImport_AnotherObjectWrite(writer, v) + } + writer.Context().Pop() + writer.Context().Push("ObjectArray", "[]TestImport_AnotherObject", "writing property") + writer.WriteString("ObjectArray") + if value.ObjectArray == nil { + writer.WriteNil() + } else if len(value.ObjectArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.ObjectArray { + { + v := value.ObjectArray[i0] + TestImport_AnotherObjectWrite(writer, &v) + } + } + } + writer.Context().Pop() + writer.Context().Push("OptObjectArray", "[]*TestImport_AnotherObject", "writing property") + writer.WriteString("OptObjectArray") + if value.OptObjectArray == nil { + writer.WriteNil() + } else if len(value.OptObjectArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.OptObjectArray { + { + v := value.OptObjectArray[i0] + TestImport_AnotherObjectWrite(writer, v) + } + } + } + writer.Context().Pop() + writer.Context().Push("En", "TestImport_Enum", "writing property") + writer.WriteString("En") + { + v := value.En + writer.WriteI32(int32(v)) + } + writer.Context().Pop() + writer.Context().Push("OptEnum", "*TestImport_Enum", "writing property") + writer.WriteString("OptEnum") + { + v := value.OptEnum + if v == nil { + writer.WriteNil() + } else { + writer.WriteI32(int32(*v)) + } + } + writer.Context().Pop() + writer.Context().Push("EnumArray", "[]TestImport_Enum", "writing property") + writer.WriteString("EnumArray") + if value.EnumArray == nil { + writer.WriteNil() + } else if len(value.EnumArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.EnumArray { + { + v := value.EnumArray[i0] + writer.WriteI32(int32(v)) + } + } + } + writer.Context().Pop() + writer.Context().Push("OptEnumArray", "[]*TestImport_Enum", "writing property") + writer.WriteString("OptEnumArray") + if value.OptEnumArray == nil { + writer.WriteNil() + } else if len(value.OptEnumArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.OptEnumArray { + { + v := value.OptEnumArray[i0] + if v == nil { + writer.WriteNil() + } else { + writer.WriteI32(int32(*v)) + } + } + } + } + writer.Context().Pop() +} + +func deserializeTestImport_Object(data []byte) *TestImport_Object { + ctx := msgpack.NewContext("Deserializing (decoding) env-type: TestImport_Object") + reader := msgpack.NewReadDecoder(ctx, data) + return readTestImport_Object(reader) +} + +func readTestImport_Object(reader msgpack.Read) *TestImport_Object { + var ( + _object TestImport_AnotherObject + _objectSet bool + _optObject *TestImport_AnotherObject + _objectArray []TestImport_AnotherObject + _objectArraySet bool + _optObjectArray []*TestImport_AnotherObject + _en TestImport_Enum + _enSet bool + _optEnum *TestImport_Enum + _enumArray []TestImport_Enum + _enumArraySet bool + _optEnumArray []*TestImport_Enum + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type") + switch field { + case "Object": + reader.Context().Push(field, "TestImport_AnotherObject", "type found, reading property") + if v := TestImport_AnotherObjectRead(reader); v != nil { + _object = *v + } + _objectSet = true + reader.Context().Pop() + case "OptObject": + reader.Context().Push(field, "*TestImport_AnotherObject", "type found, reading property") + if v := TestImport_AnotherObjectRead(reader); v != nil { + _optObject = v + } + reader.Context().Pop() + case "ObjectArray": + reader.Context().Push(field, "[]TestImport_AnotherObject", "type found, reading property") + if reader.IsNil() { + _objectArray = nil + } else { + ln0 := reader.ReadArrayLength() + _objectArray = make([]TestImport_AnotherObject, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if v := TestImport_AnotherObjectRead(reader); v != nil { + _objectArray[i0] = *v + } + } + } + _objectArraySet = true + reader.Context().Pop() + case "OptObjectArray": + reader.Context().Push(field, "[]*TestImport_AnotherObject", "type found, reading property") + if reader.IsNil() { + _optObjectArray = nil + } else { + ln0 := reader.ReadArrayLength() + _optObjectArray = make([]*TestImport_AnotherObject, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if v := TestImport_AnotherObjectRead(reader); v != nil { + _optObjectArray[i0] = v + } + } + } + reader.Context().Pop() + case "En": + reader.Context().Push(field, "TestImport_Enum", "type found, reading property") + _en = TestImport_Enum(reader.ReadI32()) + SanitizeTestImport_EnumValue(int32(_en)) + _enSet = true + reader.Context().Pop() + case "OptEnum": + reader.Context().Push(field, "*TestImport_Enum", "type found, reading property") + if !reader.IsNil() { + v := TestImport_Enum(reader.ReadI32()) + SanitizeTestImport_EnumValue(int32(v)) + _optEnum = &v + } + reader.Context().Pop() + case "EnumArray": + reader.Context().Push(field, "[]TestImport_Enum", "type found, reading property") + if reader.IsNil() { + _enumArray = nil + } else { + ln0 := reader.ReadArrayLength() + _enumArray = make([]TestImport_Enum, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + _enumArray[i0] = TestImport_Enum(reader.ReadI32()) + SanitizeTestImport_EnumValue(int32(_enumArray[i0])) + } + } + _enumArraySet = true + reader.Context().Pop() + case "OptEnumArray": + reader.Context().Push(field, "[]*TestImport_Enum", "type found, reading property") + if reader.IsNil() { + _optEnumArray = nil + } else { + ln0 := reader.ReadArrayLength() + _optEnumArray = make([]*TestImport_Enum, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if !reader.IsNil() { + v := TestImport_Enum(reader.ReadI32()) + SanitizeTestImport_EnumValue(int32(v)) + _optEnumArray[i0] = &v + } + } + } + reader.Context().Pop() + } + reader.Context().Pop() + } + + if !_objectSet { + panic(reader.Context().PrintWithContext("Missing required property: 'object: TestImport_AnotherObject'")) + } + if !_objectArraySet { + panic(reader.Context().PrintWithContext("Missing required property: 'objectArray: [TestImport_AnotherObject]'")) + } + if !_enSet { + panic(reader.Context().PrintWithContext("Missing required property: 'en: TestImport_Enum'")) + } + if !_enumArraySet { + panic(reader.Context().PrintWithContext("Missing required property: 'enumArray: [TestImport_Enum]'")) + } + + return &TestImport_Object{ + Object: _object, + OptObject: _optObject, + ObjectArray: _objectArray, + OptObjectArray: _optObjectArray, + En: _en, + OptEnum: _optEnum, + EnumArray: _enumArray, + OptEnumArray: _optEnumArray, + } +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go new file mode 100644 index 0000000000..3189323eff --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go @@ -0,0 +1,245 @@ +package test_import + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) + +type ArgsImportedMethod struct { + Str string + OptStr *string + U uint32 + OptU *uint32 + UArrayArray [][]*uint32 + Object TestImport_Object + OptObject *TestImport_Object + ObjectArray []TestImport_Object + OptObjectArray []*TestImport_Object + En TestImport_Enum + OptEnum *TestImport_Enum + EnumArray []TestImport_Enum + OptEnumArray []*TestImport_Enum +} + +func SerializeImportedMethodArgs(value *ArgsImportedMethod) []byte { + ctx := msgpack.NewContext("Serializing module-type: ImportedMethod") + encoder := msgpack.NewWriteEncoder(ctx) + WriteImportedMethodArgs(encoder, value) + return encoder.Buffer() +} + +func WriteImportedMethodArgs(writer msgpack.Write, value *ArgsImportedMethod) { + writer.WriteMapLength(13) + writer.Context().Push("str", "string", "writing property") + writer.WriteString("str") + { + v := value.Str + writer.WriteString(v) + } + writer.Context().Pop() + writer.Context().Push("optStr", "*string", "writing property") + writer.WriteString("optStr") + { + v := value.OptStr + if v == nil { + writer.WriteNil() + } else { + writer.WriteString(*v) + } + } + writer.Context().Pop() + writer.Context().Push("u", "uint32", "writing property") + writer.WriteString("u") + { + v := value.U + writer.WriteU32(v) + } + writer.Context().Pop() + writer.Context().Push("optU", "*uint32", "writing property") + writer.WriteString("optU") + { + v := value.OptU + if v == nil { + writer.WriteNil() + } else { + writer.WriteU32(*v) + } + } + writer.Context().Pop() + writer.Context().Push("uArrayArray", "[][]*uint32", "writing property") + writer.WriteString("uArrayArray") + if value.UArrayArray == nil { + writer.WriteNil() + } else if len(value.UArrayArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.UArrayArray { + if value.UArrayArray[i0] == nil { + writer.WriteNil() + } else if len(value.UArrayArray[i0]) == 0 { + writer.WriteNil() + } else { + for i1 := range value.UArrayArray[i0] { + { + v := value.UArrayArray[i0][i1] + if v == nil { + writer.WriteNil() + } else { + writer.WriteU32(*v) + } + } + } + } + } + } + writer.Context().Pop() + writer.Context().Push("object", "TestImport_Object", "writing property") + writer.WriteString("object") + { + v := value.Object + TestImport_ObjectWrite(writer, &v) + } + writer.Context().Pop() + writer.Context().Push("optObject", "*TestImport_Object", "writing property") + writer.WriteString("optObject") + { + v := value.OptObject + TestImport_ObjectWrite(writer, v) + } + writer.Context().Pop() + writer.Context().Push("objectArray", "[]TestImport_Object", "writing property") + writer.WriteString("objectArray") + if value.ObjectArray == nil { + writer.WriteNil() + } else if len(value.ObjectArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.ObjectArray { + { + v := value.ObjectArray[i0] + TestImport_ObjectWrite(writer, &v) + } + } + } + writer.Context().Pop() + writer.Context().Push("optObjectArray", "[]*TestImport_Object", "writing property") + writer.WriteString("optObjectArray") + if value.OptObjectArray == nil { + writer.WriteNil() + } else if len(value.OptObjectArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.OptObjectArray { + { + v := value.OptObjectArray[i0] + TestImport_ObjectWrite(writer, v) + } + } + } + writer.Context().Pop() + writer.Context().Push("en", "TestImport_Enum", "writing property") + writer.WriteString("en") + { + v := value.En + writer.WriteI32(int32(v)) + } + writer.Context().Pop() + writer.Context().Push("optEnum", "*TestImport_Enum", "writing property") + writer.WriteString("optEnum") + { + v := value.OptEnum + if v == nil { + writer.WriteNil() + } else { + writer.WriteI32(int32(*v)) + } + } + writer.Context().Pop() + writer.Context().Push("enumArray", "[]TestImport_Enum", "writing property") + writer.WriteString("enumArray") + if value.EnumArray == nil { + writer.WriteNil() + } else if len(value.EnumArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.EnumArray { + { + v := value.EnumArray[i0] + writer.WriteI32(int32(v)) + } + } + } + writer.Context().Pop() + writer.Context().Push("optEnumArray", "[]*TestImport_Enum", "writing property") + writer.WriteString("optEnumArray") + if value.OptEnumArray == nil { + writer.WriteNil() + } else if len(value.OptEnumArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.OptEnumArray { + { + v := value.OptEnumArray[i0] + if v == nil { + writer.WriteNil() + } else { + writer.WriteI32(int32(*v)) + } + } + } + } + writer.Context().Pop() +} + +func DeserializeImportedMethodResult(argsBuf []byte) *TestImport_Object { + ctx := msgpack.NewContext("Deserializing module-type: ImportedMethod") + reader := msgpack.NewReadDecoder(ctx, argsBuf) + + reader.Context().Push("importedMethod", "*TestImport_Object", "reading function output") + var value *TestImport_Object + if v := TestImport_ObjectRead(reader); v != nil { + value = v + } + reader.Context().Pop() + return value +} + +type ArgsAnotherMethod struct { + Arg []string +} + +func SerializeAnotherMethodArgs(value *ArgsAnotherMethod) []byte { + ctx := msgpack.NewContext("Serializing module-type: AnotherMethod") + encoder := msgpack.NewWriteEncoder(ctx) + WriteAnotherMethodArgs(encoder, value) + return encoder.Buffer() +} + +func WriteAnotherMethodArgs(writer msgpack.Write, value *ArgsAnotherMethod) { + writer.WriteMapLength(1) + writer.Context().Push("arg", "[]string", "writing property") + writer.WriteString("arg") + if value.Arg == nil { + writer.WriteNil() + } else if len(value.Arg) == 0 { + writer.WriteNil() + } else { + for i0 := range value.Arg { + { + v := value.Arg[i0] + writer.WriteString(v) + } + } + } + writer.Context().Pop() +} + +func DeserializeAnotherMethodResult(argsBuf []byte) int32 { + ctx := msgpack.NewContext("Deserializing module-type: AnotherMethod") + reader := msgpack.NewReadDecoder(ctx, argsBuf) + + reader.Context().Push("anotherMethod", "int32", "reading function output") + var value int32 + value = reader.ReadI32() + reader.Context().Pop() + return value +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go new file mode 100644 index 0000000000..9b45b19f55 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go @@ -0,0 +1,24 @@ +package test_import + +import ( + "github.com/consideritdone/polywrap-go/polywrap" + "some/library/to/methods" +) + +func MethodImportedMethod(uri string, args *ArgsImportedMethod) (*TestImport_Object, error) { + argsBuf := SerializeImportedMethodArgs(args) + data, err := polywrap.WrapSubinvokeImplementation("testimport.uri.eth", uri, "importedMethod", argsBuf) + if err != nil { + return nil, err + } + return DeserializeImportedMethodResult(data), nil +} + +func MethodAnotherMethod(uri string, args *ArgsAnotherMethod) (int32, error) { + argsBuf := SerializeAnotherMethodArgs(args) + data, err := polywrap.WrapSubinvokeImplementation("testimport.uri.eth", uri, "anotherMethod", argsBuf) + if err != nil { + return nil, err + } + return DeserializeAnotherMethodResult(data), nil +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/interfaces/test_import.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/interfaces/test_import.go new file mode 100644 index 0000000000..c82ec76871 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/interfaces/test_import.go @@ -0,0 +1,7 @@ +package interfaces + +import "github.com/consideritdone/polywrap-go/polywrap" + +func TestImportImplementations() []string { + return polywrap.WrapGetImplementations("testimport.uri.eth") +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go index fa5dc8d666..5c9d9a022a 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go @@ -7,15 +7,15 @@ import ( //export _wrap_invoke func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { - args := polywrap.WrapInvokeArgs(methodSize, argsSize) - - if args.Method == "moduleMethod" { + args := polywrap.WrapInvokeArgs(methodSize, argsSize) + switch args.method { + case "moduleMethod": return polywrap.WrapInvoke(args, envSize, module.ModuleMethodWrapped) - } else if args.Method == "objectMethod" { - return polywrap.WrapInvoke(args, envSize, module.ObjectMethodWrapped) - } else if args.Method == "optionalEnvMethod" { - return polywrap.WrapInvoke(args, envSize, module.OptionalEnvMethodWrapped) - } else { + case "objectMethod": + return polywrap.WrapInvoke(args, envSize, module.ObjectMethodWrapped) + case "optionalEnvMethod": + return polywrap.WrapInvoke(args, envSize, module.OptionalEnvMethodWrapped) + default: return polywrap.WrapInvoke(args, envSize, nil) } } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_type_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_type_serialization.go deleted file mode 100644 index d986dab75f..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_type_serialization.go +++ /dev/null @@ -1,1218 +0,0 @@ -package types - -import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" - "github.com/valyala/fastjson" -) - -func serializeCustomType(value *CustomType) []byte { - ctx := msgpack.NewContext("Serializing (encoding) env-type: CustomType") - encoder := msgpack.NewWriteEncoder(ctx) - writeCustomType(encoder, value) - return encoder.Buffer() -} - -func writeCustomType(writer msgpack.Write, value *CustomType) { - writer.WriteMapLength(41) - writer.Context().Push("Str", "string", "writing property") - writer.WriteString("Str") - { - v := value.Str - writer.WriteString(v) - } - writer.Context().Pop() - writer.Context().Push("OptStr", "*string", "writing property") - writer.WriteString("OptStr") - { - v := value.OptStr - if v == nil { - writer.WriteNil() - } else { - writer.WriteString(*v) - } - } - writer.Context().Pop() - writer.Context().Push("U", "uint32", "writing property") - writer.WriteString("U") - { - v := value.U - writer.WriteU32(v) - } - writer.Context().Pop() - writer.Context().Push("OptU", "*uint32", "writing property") - writer.WriteString("OptU") - { - v := value.OptU - if v == nil { - writer.WriteNil() - } else { - writer.WriteU32(*v) - } - } - writer.Context().Pop() - writer.Context().Push("M_u8", "uint8", "writing property") - writer.WriteString("M_u8") - { - v := value.M_u8 - writer.WriteU8(v) - } - writer.Context().Pop() - writer.Context().Push("M_u16", "uint16", "writing property") - writer.WriteString("M_u16") - { - v := value.M_u16 - writer.WriteU16(v) - } - writer.Context().Pop() - writer.Context().Push("M_u32", "uint32", "writing property") - writer.WriteString("M_u32") - { - v := value.M_u32 - writer.WriteU32(v) - } - writer.Context().Pop() - writer.Context().Push("I", "int32", "writing property") - writer.WriteString("I") - { - v := value.I - writer.WriteI32(v) - } - writer.Context().Pop() - writer.Context().Push("M_i8", "int8", "writing property") - writer.WriteString("M_i8") - { - v := value.M_i8 - writer.WriteI8(v) - } - writer.Context().Pop() - writer.Context().Push("M_i16", "int16", "writing property") - writer.WriteString("M_i16") - { - v := value.M_i16 - writer.WriteI16(v) - } - writer.Context().Pop() - writer.Context().Push("M_i32", "int32", "writing property") - writer.WriteString("M_i32") - { - v := value.M_i32 - writer.WriteI32(v) - } - writer.Context().Pop() - writer.Context().Push("Bigint", "*big.Int", "writing property") - writer.WriteString("Bigint") - { - v := value.Bigint - writer.WriteBigInt(v) - } - writer.Context().Pop() - writer.Context().Push("OptBigint", "*big.Int", "writing property") - writer.WriteString("OptBigint") - { - v := value.OptBigint - if v == nil { - writer.WriteNil() - } else { - writer.WriteBigInt(v) - } - } - writer.Context().Pop() - writer.Context().Push("Bignumber", "*big.Int", "writing property") - writer.WriteString("Bignumber") - { - v := value.Bignumber - writer.WriteBigInt(v) - } - writer.Context().Pop() - writer.Context().Push("OptBignumber", "*big.Int", "writing property") - writer.WriteString("OptBignumber") - { - v := value.OptBignumber - if v == nil { - writer.WriteNil() - } else { - writer.WriteBigInt(v) - } - } - writer.Context().Pop() - writer.Context().Push("Json", "*fastjson.Value", "writing property") - writer.WriteString("Json") - { - v := value.Json - writer.WriteJson(v) - } - writer.Context().Pop() - writer.Context().Push("OptJson", "*fastjson.Value", "writing property") - writer.WriteString("OptJson") - { - v := value.OptJson - if v == nil { - writer.WriteNil() - } else { - writer.WriteJson(v) - } - } - writer.Context().Pop() - writer.Context().Push("Bytes", "[]byte", "writing property") - writer.WriteString("Bytes") - { - v := value.Bytes - writer.WriteBytes(v) - } - writer.Context().Pop() - writer.Context().Push("OptBytes", "[]byte", "writing property") - writer.WriteString("OptBytes") - { - v := value.OptBytes - if v == nil { - writer.WriteNil() - } else { - writer.WriteBytes(v) - } - } - writer.Context().Pop() - writer.Context().Push("M_boolean", "bool", "writing property") - writer.WriteString("M_boolean") - { - v := value.M_boolean - writer.WriteBool(v) - } - writer.Context().Pop() - writer.Context().Push("OptBoolean", "*bool", "writing property") - writer.WriteString("OptBoolean") - { - v := value.OptBoolean - if v == nil { - writer.WriteNil() - } else { - writer.WriteBool(*v) - } - } - writer.Context().Pop() - writer.Context().Push("UArray", "[]uint32", "writing property") - writer.WriteString("UArray") - if value.UArray == nil { - writer.WriteNil() - } else if len(value.UArray) == 0 { - writer.WriteNil() - } else { - for i0 := range value.UArray { - { - v := value.UArray[i0] - writer.WriteU32(v) - } - } - } - writer.Context().Pop() - writer.Context().Push("UOptArray", "[]uint32", "writing property") - writer.WriteString("UOptArray") - if value.UOptArray == nil { - writer.WriteNil() - } else if len(value.UOptArray) == 0 { - writer.WriteNil() - } else { - for i0 := range value.UOptArray { - { - v := value.UOptArray[i0] - writer.WriteU32(v) - } - } - } - writer.Context().Pop() - writer.Context().Push("OptUOptArray", "[]*uint32", "writing property") - writer.WriteString("OptUOptArray") - if value.OptUOptArray == nil { - writer.WriteNil() - } else if len(value.OptUOptArray) == 0 { - writer.WriteNil() - } else { - for i0 := range value.OptUOptArray { - { - v := value.OptUOptArray[i0] - if v == nil { - writer.WriteNil() - } else { - writer.WriteU32(*v) - } - } - } - } - writer.Context().Pop() - writer.Context().Push("OptStrOptArray", "[]*string", "writing property") - writer.WriteString("OptStrOptArray") - if value.OptStrOptArray == nil { - writer.WriteNil() - } else if len(value.OptStrOptArray) == 0 { - writer.WriteNil() - } else { - for i0 := range value.OptStrOptArray { - { - v := value.OptStrOptArray[i0] - if v == nil { - writer.WriteNil() - } else { - writer.WriteString(*v) - } - } - } - } - writer.Context().Pop() - writer.Context().Push("UArrayArray", "[][]uint32", "writing property") - writer.WriteString("UArrayArray") - if value.UArrayArray == nil { - writer.WriteNil() - } else if len(value.UArrayArray) == 0 { - writer.WriteNil() - } else { - for i0 := range value.UArrayArray { - if value.UArrayArray[i0] == nil { - writer.WriteNil() - } else if len(value.UArrayArray[i0]) == 0 { - writer.WriteNil() - } else { - for i1 := range value.UArrayArray[i0] { - { - v := value.UArrayArray[i0][i1] - writer.WriteU32(v) - } - } - } - } - } - writer.Context().Pop() - writer.Context().Push("UOptArrayOptArray", "[][]*uint32", "writing property") - writer.WriteString("UOptArrayOptArray") - if value.UOptArrayOptArray == nil { - writer.WriteNil() - } else if len(value.UOptArrayOptArray) == 0 { - writer.WriteNil() - } else { - for i0 := range value.UOptArrayOptArray { - if value.UOptArrayOptArray[i0] == nil { - writer.WriteNil() - } else if len(value.UOptArrayOptArray[i0]) == 0 { - writer.WriteNil() - } else { - for i1 := range value.UOptArrayOptArray[i0] { - { - v := value.UOptArrayOptArray[i0][i1] - if v == nil { - writer.WriteNil() - } else { - writer.WriteU32(*v) - } - } - } - } - } - } - writer.Context().Pop() - writer.Context().Push("UArrayOptArrayArray", "[][][]uint32", "writing property") - writer.WriteString("UArrayOptArrayArray") - if value.UArrayOptArrayArray == nil { - writer.WriteNil() - } else if len(value.UArrayOptArrayArray) == 0 { - writer.WriteNil() - } else { - for i0 := range value.UArrayOptArrayArray { - if value.UArrayOptArrayArray[i0] == nil { - writer.WriteNil() - } else if len(value.UArrayOptArrayArray[i0]) == 0 { - writer.WriteNil() - } else { - for i1 := range value.UArrayOptArrayArray[i0] { - if value.UArrayOptArrayArray[i0][i1] == nil { - writer.WriteNil() - } else if len(value.UArrayOptArrayArray[i0][i1]) == 0 { - writer.WriteNil() - } else { - for i2 := range value.UArrayOptArrayArray[i0][i1] { - { - v := value.UArrayOptArrayArray[i0][i1][i2] - writer.WriteU32(v) - } - } - } - } - } - } - } - writer.Context().Pop() - writer.Context().Push("CrazyArray", "[][][][]uint32", "writing property") - writer.WriteString("CrazyArray") - if value.CrazyArray == nil { - writer.WriteNil() - } else if len(value.CrazyArray) == 0 { - writer.WriteNil() - } else { - for i0 := range value.CrazyArray { - if value.CrazyArray[i0] == nil { - writer.WriteNil() - } else if len(value.CrazyArray[i0]) == 0 { - writer.WriteNil() - } else { - for i1 := range value.CrazyArray[i0] { - if value.CrazyArray[i0][i1] == nil { - writer.WriteNil() - } else if len(value.CrazyArray[i0][i1]) == 0 { - writer.WriteNil() - } else { - for i2 := range value.CrazyArray[i0][i1] { - if value.CrazyArray[i0][i1][i2] == nil { - writer.WriteNil() - } else if len(value.CrazyArray[i0][i1][i2]) == 0 { - writer.WriteNil() - } else { - for i3 := range value.CrazyArray[i0][i1][i2] { - { - v := value.CrazyArray[i0][i1][i2][i3] - writer.WriteU32(v) - } - } - } - } - } - } - } - } - } - writer.Context().Pop() - writer.Context().Push("Object", "AnotherType", "writing property") - writer.WriteString("Object") - - { - v := value.Object - AnotherTypeWrite(writer, &v) - } - writer.Context().Pop() - writer.Context().Push("OptObject", "*AnotherType", "writing property") - writer.WriteString("OptObject") - - { - v := value.OptObject - AnotherTypeWrite(writer, v) - } - writer.Context().Pop() - writer.Context().Push("ObjectArray", "[]AnotherType", "writing property") - writer.WriteString("ObjectArray") - if value.ObjectArray == nil { - writer.WriteNil() - } else if len(value.ObjectArray) == 0 { - writer.WriteNil() - } else { - for i0 := range value.ObjectArray { - - { - v := value.ObjectArray[i0] - AnotherTypeWrite(writer, &v) - } - } - } - writer.Context().Pop() - writer.Context().Push("OptObjectArray", "[]*AnotherType", "writing property") - writer.WriteString("OptObjectArray") - if value.OptObjectArray == nil { - writer.WriteNil() - } else if len(value.OptObjectArray) == 0 { - writer.WriteNil() - } else { - for i0 := range value.OptObjectArray { - - { - v := value.OptObjectArray[i0] - AnotherTypeWrite(writer, v) - } - } - } - writer.Context().Pop() - writer.Context().Push("En", "CustomEnum", "writing property") - writer.WriteString("En") - { - v := value.En - writer.WriteI32(int32(v)); - } - writer.Context().Pop() - writer.Context().Push("OptEnum", "*CustomEnum", "writing property") - writer.WriteString("OptEnum") - { - v := value.OptEnum - if v == nil { - writer.WriteNil() - } else { - writer.WriteI32(int32(*v)); - } - } - writer.Context().Pop() - writer.Context().Push("EnumArray", "[]CustomEnum", "writing property") - writer.WriteString("EnumArray") - if value.EnumArray == nil { - writer.WriteNil() - } else if len(value.EnumArray) == 0 { - writer.WriteNil() - } else { - for i0 := range value.EnumArray { - { - v := value.EnumArray[i0] - writer.WriteI32(int32(v)); - } - } - } - writer.Context().Pop() - writer.Context().Push("OptEnumArray", "[]*CustomEnum", "writing property") - writer.WriteString("OptEnumArray") - if value.OptEnumArray == nil { - writer.WriteNil() - } else if len(value.OptEnumArray) == 0 { - writer.WriteNil() - } else { - for i0 := range value.OptEnumArray { - { - v := value.OptEnumArray[i0] - if v == nil { - writer.WriteNil() - } else { - writer.WriteI32(int32(*v)); - } - } - } - } - writer.Context().Pop() - writer.Context().Push("Map", "map[string]int32", "writing property") - writer.WriteString("Map") - if value.Map == nil { - writer.WriteNil() - } else if len(value.Map) == 0 { - writer.WriteNil() - } else { - for i0 := range value.Map { - writer.WriteString(i0) - { - v := value.Map[i0] - writer.WriteI32(v) - } - } - } - writer.Context().Pop() - writer.Context().Push("MapOfArr", "map[string][]int32", "writing property") - writer.WriteString("MapOfArr") - if value.MapOfArr == nil { - writer.WriteNil() - } else if len(value.MapOfArr) == 0 { - writer.WriteNil() - } else { - for i0 := range value.MapOfArr { - writer.WriteString(i0) - if value.MapOfArr[i0] == nil { - writer.WriteNil() - } else if len(value.MapOfArr[i0]) == 0 { - writer.WriteNil() - } else { - for i1 := range value.MapOfArr[i0] { - { - v := value.MapOfArr[i0][i1] - writer.WriteI32(v) - } - } - } - } - } - writer.Context().Pop() - writer.Context().Push("MapOfObj", "map[string]AnotherType", "writing property") - writer.WriteString("MapOfObj") - if value.MapOfObj == nil { - writer.WriteNil() - } else if len(value.MapOfObj) == 0 { - writer.WriteNil() - } else { - for i0 := range value.MapOfObj { - writer.WriteString(i0) - - { - v := value.MapOfObj[i0] - AnotherTypeWrite(writer, &v) - } - } - } - writer.Context().Pop() - writer.Context().Push("MapOfArrOfObj", "map[string][]AnotherType", "writing property") - writer.WriteString("MapOfArrOfObj") - if value.MapOfArrOfObj == nil { - writer.WriteNil() - } else if len(value.MapOfArrOfObj) == 0 { - writer.WriteNil() - } else { - for i0 := range value.MapOfArrOfObj { - writer.WriteString(i0) - if value.MapOfArrOfObj[i0] == nil { - writer.WriteNil() - } else if len(value.MapOfArrOfObj[i0]) == 0 { - writer.WriteNil() - } else { - for i1 := range value.MapOfArrOfObj[i0] { - - { - v := value.MapOfArrOfObj[i0][i1] - AnotherTypeWrite(writer, &v) - } - } - } - } - } - writer.Context().Pop() -} - -func deserializeCustomType(data []byte) *CustomType { - ctx := msgpack.NewContext("Deserializing (decoding) env-type: CustomType") - reader := msgpack.NewReadDecoder(ctx, data) - return readCustomType(reader) -} - -func readCustomType(reader msgpack.Read) *CustomType { - var ( - _str string - _strSet bool - _optStr *string - _u uint32 - _uSet bool - _optU *uint32 - _u8 uint8 - _u8Set bool - _u16 uint16 - _u16Set bool - _u32 uint32 - _u32Set bool - _i int32 - _iSet bool - _i8 int8 - _i8Set bool - _i16 int16 - _i16Set bool - _i32 int32 - _i32Set bool - _bigint *big.Int - _bigintSet bool - _optBigint *big.Int - _bignumber *big.Int - _bignumberSet bool - _optBignumber *big.Int - _json *fastjson.Value - _jsonSet bool - _optJson *fastjson.Value - _bytes []byte - _bytesSet bool - _optBytes []byte - _boolean bool - _booleanSet bool - _optBoolean *bool - _uArray []uint32 - _uArraySet bool - _uOptArray []uint32 - _optUOptArray []*uint32 - _optStrOptArray []*string - _uArrayArray [][]uint32 - _uArrayArraySet bool - _uOptArrayOptArray [][]*uint32 - _uOptArrayOptArraySet bool - _uArrayOptArrayArray [][][]uint32 - _uArrayOptArrayArraySet bool - _crazyArray [][][][]uint32 - _object AnotherType - _objectSet bool - _optObject *AnotherType - _objectArray []AnotherType - _objectArraySet bool - _optObjectArray []*AnotherType - _en CustomEnum - _enSet bool - _optEnum *CustomEnum - _enumArray []CustomEnum - _enumArraySet bool - _optEnumArray []*CustomEnum - _map map[string]int32 - _mapSet bool - _mapOfArr map[string][]int32 - _mapOfArrSet bool - _mapOfObj map[string]AnotherType - _mapOfObjSet bool - _mapOfArrOfObj map[string][]AnotherType - _mapOfArrOfObjSet bool - ) - - for i := int32(reader.ReadMapLength()); i > 0; i-- { - field := reader.ReadString() - reader.Context().Push(field, "unknown", "searching for property type"); - switch field { - case "Str": - reader.Context().Push(field, "string", "type found, reading property") - _str = reader.ReadString() - _strSet = true; - reader.Context().Pop() - case "OptStr": - reader.Context().Push(field, "*string", "type found, reading property") - if !reader.IsNil() { - v := reader.ReadString(); - _optStr = &v - } - reader.Context().Pop() - case "U": - reader.Context().Push(field, "uint32", "type found, reading property") - _u = reader.ReadU32() - _uSet = true; - reader.Context().Pop() - case "OptU": - reader.Context().Push(field, "*uint32", "type found, reading property") - if !reader.IsNil() { - v := reader.ReadU32(); - _optU = &v - } - reader.Context().Pop() - case "M_u8": - reader.Context().Push(field, "uint8", "type found, reading property") - _u8 = reader.ReadU8() - _u8Set = true; - reader.Context().Pop() - case "M_u16": - reader.Context().Push(field, "uint16", "type found, reading property") - _u16 = reader.ReadU16() - _u16Set = true; - reader.Context().Pop() - case "M_u32": - reader.Context().Push(field, "uint32", "type found, reading property") - _u32 = reader.ReadU32() - _u32Set = true; - reader.Context().Pop() - case "I": - reader.Context().Push(field, "int32", "type found, reading property") - _i = reader.ReadI32() - _iSet = true; - reader.Context().Pop() - case "M_i8": - reader.Context().Push(field, "int8", "type found, reading property") - _i8 = reader.ReadI8() - _i8Set = true; - reader.Context().Pop() - case "M_i16": - reader.Context().Push(field, "int16", "type found, reading property") - _i16 = reader.ReadI16() - _i16Set = true; - reader.Context().Pop() - case "M_i32": - reader.Context().Push(field, "int32", "type found, reading property") - _i32 = reader.ReadI32() - _i32Set = true; - reader.Context().Pop() - case "Bigint": - reader.Context().Push(field, "*big.Int", "type found, reading property") - _bigint = reader.ReadBigInt() - _bigintSet = true; - reader.Context().Pop() - case "OptBigint": - reader.Context().Push(field, "*big.Int", "type found, reading property") - if !reader.IsNil() { - v := reader.ReadBigInt(); - _optBigint = v - } - reader.Context().Pop() - case "Bignumber": - reader.Context().Push(field, "*big.Int", "type found, reading property") - _bignumber = reader.ReadBigInt() - _bignumberSet = true; - reader.Context().Pop() - case "OptBignumber": - reader.Context().Push(field, "*big.Int", "type found, reading property") - if !reader.IsNil() { - v := reader.ReadBigInt(); - _optBignumber = v - } - reader.Context().Pop() - case "Json": - reader.Context().Push(field, "*fastjson.Value", "type found, reading property") - _json = reader.ReadJson() - _jsonSet = true; - reader.Context().Pop() - case "OptJson": - reader.Context().Push(field, "*fastjson.Value", "type found, reading property") - if !reader.IsNil() { - v := reader.ReadJson(); - _optJson = v - } - reader.Context().Pop() - case "Bytes": - reader.Context().Push(field, "[]byte", "type found, reading property") - _bytes = reader.ReadBytes() - _bytesSet = true; - reader.Context().Pop() - case "OptBytes": - reader.Context().Push(field, "[]byte", "type found, reading property") - if !reader.IsNil() { - v := reader.ReadBytes(); - _optBytes = v - } - reader.Context().Pop() - case "M_boolean": - reader.Context().Push(field, "bool", "type found, reading property") - _boolean = reader.ReadBool() - _booleanSet = true; - reader.Context().Pop() - case "OptBoolean": - reader.Context().Push(field, "*bool", "type found, reading property") - if !reader.IsNil() { - v := reader.ReadBool(); - _optBoolean = &v - } - reader.Context().Pop() - case "UArray": - reader.Context().Push(field, "[]uint32", "type found, reading property") - if reader.IsNil() { - _uArray = nil - } else { - ln0 := reader.ReadArrayLength() - _uArray = make([]uint32, ln0) - for i0 := uint32(0); i0 < ln0; i0++ { - _uArray[i0] = reader.ReadU32() - } - } - _uArraySet = true; - reader.Context().Pop() - case "UOptArray": - reader.Context().Push(field, "[]uint32", "type found, reading property") - if reader.IsNil() { - _uOptArray = nil - } else { - ln0 := reader.ReadArrayLength() - _uOptArray = make([]uint32, ln0) - for i0 := uint32(0); i0 < ln0; i0++ { - _uOptArray[i0] = reader.ReadU32() - } - } - reader.Context().Pop() - case "OptUOptArray": - reader.Context().Push(field, "[]*uint32", "type found, reading property") - if reader.IsNil() { - _optUOptArray = nil - } else { - ln0 := reader.ReadArrayLength() - _optUOptArray = make([]*uint32, ln0) - for i0 := uint32(0); i0 < ln0; i0++ { - if !reader.IsNil() { - v := reader.ReadU32(); - _optUOptArray[i0] = &v - } - } - } - reader.Context().Pop() - case "OptStrOptArray": - reader.Context().Push(field, "[]*string", "type found, reading property") - if reader.IsNil() { - _optStrOptArray = nil - } else { - ln0 := reader.ReadArrayLength() - _optStrOptArray = make([]*string, ln0) - for i0 := uint32(0); i0 < ln0; i0++ { - if !reader.IsNil() { - v := reader.ReadString(); - _optStrOptArray[i0] = &v - } - } - } - reader.Context().Pop() - case "UArrayArray": - reader.Context().Push(field, "[][]uint32", "type found, reading property") - if reader.IsNil() { - _uArrayArray = nil - } else { - ln0 := reader.ReadArrayLength() - _uArrayArray = make([][]uint32, ln0) - for i0 := uint32(0); i0 < ln0; i0++ { - if reader.IsNil() { - _uArrayArray[i0] = nil - } else { - ln1 := reader.ReadArrayLength() - _uArrayArray[i0] = make([]uint32, ln1) - for i1 := uint32(0); i1 < ln1; i1++ { - _uArrayArray[i0][i1] = reader.ReadU32() - } - } - } - } - _uArrayArraySet = true; - reader.Context().Pop() - case "UOptArrayOptArray": - reader.Context().Push(field, "[][]*uint32", "type found, reading property") - if reader.IsNil() { - _uOptArrayOptArray = nil - } else { - ln0 := reader.ReadArrayLength() - _uOptArrayOptArray = make([][]*uint32, ln0) - for i0 := uint32(0); i0 < ln0; i0++ { - if reader.IsNil() { - _uOptArrayOptArray[i0] = nil - } else { - ln1 := reader.ReadArrayLength() - _uOptArrayOptArray[i0] = make([]*uint32, ln1) - for i1 := uint32(0); i1 < ln1; i1++ { - if !reader.IsNil() { - v := reader.ReadU32(); - _uOptArrayOptArray[i0][i1] = &v - } - } - } - } - } - _uOptArrayOptArraySet = true; - reader.Context().Pop() - case "UArrayOptArrayArray": - reader.Context().Push(field, "[][][]uint32", "type found, reading property") - if reader.IsNil() { - _uArrayOptArrayArray = nil - } else { - ln0 := reader.ReadArrayLength() - _uArrayOptArrayArray = make([][][]uint32, ln0) - for i0 := uint32(0); i0 < ln0; i0++ { - if reader.IsNil() { - _uArrayOptArrayArray[i0] = nil - } else { - ln1 := reader.ReadArrayLength() - _uArrayOptArrayArray[i0] = make([][]uint32, ln1) - for i1 := uint32(0); i1 < ln1; i1++ { - if reader.IsNil() { - _uArrayOptArrayArray[i0][i1] = nil - } else { - ln2 := reader.ReadArrayLength() - _uArrayOptArrayArray[i0][i1] = make([]uint32, ln2) - for i2 := uint32(0); i2 < ln2; i2++ { - _uArrayOptArrayArray[i0][i1][i2] = reader.ReadU32() - } - } - } - } - } - } - _uArrayOptArrayArraySet = true; - reader.Context().Pop() - case "CrazyArray": - reader.Context().Push(field, "[][][][]uint32", "type found, reading property") - if reader.IsNil() { - _crazyArray = nil - } else { - ln0 := reader.ReadArrayLength() - _crazyArray = make([][][][]uint32, ln0) - for i0 := uint32(0); i0 < ln0; i0++ { - if reader.IsNil() { - _crazyArray[i0] = nil - } else { - ln1 := reader.ReadArrayLength() - _crazyArray[i0] = make([][][]uint32, ln1) - for i1 := uint32(0); i1 < ln1; i1++ { - if reader.IsNil() { - _crazyArray[i0][i1] = nil - } else { - ln2 := reader.ReadArrayLength() - _crazyArray[i0][i1] = make([][]uint32, ln2) - for i2 := uint32(0); i2 < ln2; i2++ { - if reader.IsNil() { - _crazyArray[i0][i1][i2] = nil - } else { - ln3 := reader.ReadArrayLength() - _crazyArray[i0][i1][i2] = make([]uint32, ln3) - for i3 := uint32(0); i3 < ln3; i3++ { - _crazyArray[i0][i1][i2][i3] = reader.ReadU32() - } - } - } - } - } - } - } - } - reader.Context().Pop() - case "Object": - reader.Context().Push(field, "AnotherType", "type found, reading property") - if v := AnotherTypeRead(reader); v != nil { - _object = *v - } - _objectSet = true; - reader.Context().Pop() - case "OptObject": - reader.Context().Push(field, "*AnotherType", "type found, reading property") - if v := AnotherTypeRead(reader); v != nil { - _optObject = v - } - reader.Context().Pop() - case "ObjectArray": - reader.Context().Push(field, "[]AnotherType", "type found, reading property") - if reader.IsNil() { - _objectArray = nil - } else { - ln0 := reader.ReadArrayLength() - _objectArray = make([]AnotherType, ln0) - for i0 := uint32(0); i0 < ln0; i0++ { - if v := AnotherTypeRead(reader); v != nil { - _objectArray[i0] = *v - } - } - } - _objectArraySet = true; - reader.Context().Pop() - case "OptObjectArray": - reader.Context().Push(field, "[]*AnotherType", "type found, reading property") - if reader.IsNil() { - _optObjectArray = nil - } else { - ln0 := reader.ReadArrayLength() - _optObjectArray = make([]*AnotherType, ln0) - for i0 := uint32(0); i0 < ln0; i0++ { - if v := AnotherTypeRead(reader); v != nil { - _optObjectArray[i0] = v - } - } - } - reader.Context().Pop() - case "En": - reader.Context().Push(field, "CustomEnum", "type found, reading property") - _en = CustomEnum(reader.ReadI32()) - SanitizeCustomEnumValue(int32(_en)) - _enSet = true; - reader.Context().Pop() - case "OptEnum": - reader.Context().Push(field, "*CustomEnum", "type found, reading property") - if !reader.IsNil() { - v := CustomEnum(reader.ReadI32()) - SanitizeCustomEnumValue(int32(v)) - _optEnum = &v - } - reader.Context().Pop() - case "EnumArray": - reader.Context().Push(field, "[]CustomEnum", "type found, reading property") - if reader.IsNil() { - _enumArray = nil - } else { - ln0 := reader.ReadArrayLength() - _enumArray = make([]CustomEnum, ln0) - for i0 := uint32(0); i0 < ln0; i0++ { - _enumArray[i0] = CustomEnum(reader.ReadI32()) - SanitizeCustomEnumValue(int32(_enumArray[i0])) - } - } - _enumArraySet = true; - reader.Context().Pop() - case "OptEnumArray": - reader.Context().Push(field, "[]*CustomEnum", "type found, reading property") - if reader.IsNil() { - _optEnumArray = nil - } else { - ln0 := reader.ReadArrayLength() - _optEnumArray = make([]*CustomEnum, ln0) - for i0 := uint32(0); i0 < ln0; i0++ { - if !reader.IsNil() { - v := CustomEnum(reader.ReadI32()) - SanitizeCustomEnumValue(int32(v)) - _optEnumArray[i0] = &v - } - } - } - reader.Context().Pop() - case "Map": - reader.Context().Push(field, "map[string]int32", "type found, reading property") - if reader.IsNil() { - _map = nil - } else { - ln0 := reader.ReadMapLength() - _map = make(map[string]int32) - for j0 := uint32(0); j0 < ln0; j0++ { - i0 := reader.ReadString() - _map[i0] = reader.ReadI32() - } - } - _mapSet = true; - reader.Context().Pop() - case "MapOfArr": - reader.Context().Push(field, "map[string][]int32", "type found, reading property") - if reader.IsNil() { - _mapOfArr = nil - } else { - ln0 := reader.ReadMapLength() - _mapOfArr = make(map[string][]int32) - for j0 := uint32(0); j0 < ln0; j0++ { - i0 := reader.ReadString() - if reader.IsNil() { - _mapOfArr[i0] = nil - } else { - ln1 := reader.ReadArrayLength() - _mapOfArr[i0] = make([]int32, ln1) - for i1 := uint32(0); i1 < ln1; i1++ { - _mapOfArr[i0][i1] = reader.ReadI32() - } - } - } - } - _mapOfArrSet = true; - reader.Context().Pop() - case "MapOfObj": - reader.Context().Push(field, "map[string]AnotherType", "type found, reading property") - if reader.IsNil() { - _mapOfObj = nil - } else { - ln0 := reader.ReadMapLength() - _mapOfObj = make(map[string]AnotherType) - for j0 := uint32(0); j0 < ln0; j0++ { - i0 := reader.ReadString() - if v := AnotherTypeRead(reader); v != nil { - _mapOfObj[i0] = *v - } - } - } - _mapOfObjSet = true; - reader.Context().Pop() - case "MapOfArrOfObj": - reader.Context().Push(field, "map[string][]AnotherType", "type found, reading property") - if reader.IsNil() { - _mapOfArrOfObj = nil - } else { - ln0 := reader.ReadMapLength() - _mapOfArrOfObj = make(map[string][]AnotherType) - for j0 := uint32(0); j0 < ln0; j0++ { - i0 := reader.ReadString() - if reader.IsNil() { - _mapOfArrOfObj[i0] = nil - } else { - ln1 := reader.ReadArrayLength() - _mapOfArrOfObj[i0] = make([]AnotherType, ln1) - for i1 := uint32(0); i1 < ln1; i1++ { - if v := AnotherTypeRead(reader); v != nil { - _mapOfArrOfObj[i0][i1] = *v - } - } - } - } - } - _mapOfArrOfObjSet = true; - reader.Context().Pop() - } - reader.Context().Pop() - } - - if (!_strSet) { - panic(reader.Context().PrintWithContext("Missing required property: 'str: String'")) - } - if (!_uSet) { - panic(reader.Context().PrintWithContext("Missing required property: 'u: UInt'")) - } - if (!_u8Set) { - panic(reader.Context().PrintWithContext("Missing required property: 'u8: UInt8'")) - } - if (!_u16Set) { - panic(reader.Context().PrintWithContext("Missing required property: 'u16: UInt16'")) - } - if (!_u32Set) { - panic(reader.Context().PrintWithContext("Missing required property: 'u32: UInt32'")) - } - if (!_iSet) { - panic(reader.Context().PrintWithContext("Missing required property: 'i: Int'")) - } - if (!_i8Set) { - panic(reader.Context().PrintWithContext("Missing required property: 'i8: Int8'")) - } - if (!_i16Set) { - panic(reader.Context().PrintWithContext("Missing required property: 'i16: Int16'")) - } - if (!_i32Set) { - panic(reader.Context().PrintWithContext("Missing required property: 'i32: Int32'")) - } - if (!_bigintSet) { - panic(reader.Context().PrintWithContext("Missing required property: 'bigint: BigInt'")) - } - if (!_bignumberSet) { - panic(reader.Context().PrintWithContext("Missing required property: 'bignumber: BigNumber'")) - } - if (!_jsonSet) { - panic(reader.Context().PrintWithContext("Missing required property: 'json: JSON'")) - } - if (!_bytesSet) { - panic(reader.Context().PrintWithContext("Missing required property: 'bytes: Bytes'")) - } - if (!_booleanSet) { - panic(reader.Context().PrintWithContext("Missing required property: 'boolean: Boolean'")) - } - if (!_uArraySet) { - panic(reader.Context().PrintWithContext("Missing required property: 'uArray: [UInt]'")) - } - if (!_uArrayArraySet) { - panic(reader.Context().PrintWithContext("Missing required property: 'uArrayArray: [[UInt]]'")) - } - if (!_uOptArrayOptArraySet) { - panic(reader.Context().PrintWithContext("Missing required property: 'uOptArrayOptArray: [[UInt32]]'")) - } - if (!_uArrayOptArrayArraySet) { - panic(reader.Context().PrintWithContext("Missing required property: 'uArrayOptArrayArray: [[[UInt32]]]'")) - } - if (!_objectSet) { - panic(reader.Context().PrintWithContext("Missing required property: 'object: AnotherType'")) - } - if (!_objectArraySet) { - panic(reader.Context().PrintWithContext("Missing required property: 'objectArray: [AnotherType]'")) - } - if (!_enSet) { - panic(reader.Context().PrintWithContext("Missing required property: 'en: CustomEnum'")) - } - if (!_enumArraySet) { - panic(reader.Context().PrintWithContext("Missing required property: 'enumArray: [CustomEnum]'")) - } - if (!_mapSet) { - panic(reader.Context().PrintWithContext("Missing required property: 'map: Map'")) - } - if (!_mapOfArrSet) { - panic(reader.Context().PrintWithContext("Missing required property: 'mapOfArr: Map'")) - } - if (!_mapOfObjSet) { - panic(reader.Context().PrintWithContext("Missing required property: 'mapOfObj: Map'")) - } - if (!_mapOfArrOfObjSet) { - panic(reader.Context().PrintWithContext("Missing required property: 'mapOfArrOfObj: Map'")) - } - - return &CustomType{ - Str: _str, - OptStr: _optStr, - U: _u, - OptU: _optU, - M_u8: _u8, - M_u16: _u16, - M_u32: _u32, - I: _i, - M_i8: _i8, - M_i16: _i16, - M_i32: _i32, - Bigint: _bigint, - OptBigint: _optBigint, - Bignumber: _bignumber, - OptBignumber: _optBignumber, - Json: _json, - OptJson: _optJson, - Bytes: _bytes, - OptBytes: _optBytes, - M_boolean: _boolean, - OptBoolean: _optBoolean, - UArray: _uArray, - UOptArray: _uOptArray, - OptUOptArray: _optUOptArray, - OptStrOptArray: _optStrOptArray, - UArrayArray: _uArrayArray, - UOptArrayOptArray: _uOptArrayOptArray, - UArrayOptArrayArray: _uArrayOptArrayArray, - CrazyArray: _crazyArray, - Object: _object, - OptObject: _optObject, - ObjectArray: _objectArray, - OptObjectArray: _optObjectArray, - En: _en, - OptEnum: _optEnum, - EnumArray: _enumArray, - OptEnumArray: _optEnumArray, - Map: _map, - MapOfArr: _mapOfArr, - MapOfObj: _mapOfObj, - MapOfArrOfObj: _mapOfArrOfObj, - } -} \ No newline at end of file diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_enum.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/enum_custom_enum.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_enum.go rename to packages/test-cases/cases/bind/sanity/output/wasm-go/types/enum_custom_enum.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_serialization.go new file mode 100644 index 0000000000..8bbc6a75a0 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_serialization.go @@ -0,0 +1,436 @@ +package types + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) + +type ArgsModuleMethod struct { + Str string + OptStr *string + En CustomEnum + OptEnum *CustomEnum + EnumArray []CustomEnum + OptEnumArray []*CustomEnum + Map map[string]int32 + MapOfArr map[string][]int32 + MapOfObj map[string]AnotherType + MapOfArrOfObj map[string][]AnotherType +} + +func DeserializeModuleMethodArgs(argsBuf []byte) *ArgsModuleMethod { + ctx := msgpack.NewContext("Deserializing module-type: ModuleMethod") + reader := msgpack.NewReadDecoder(ctx, argsBuf) + + var ( + _str string + _strSet bool + _optStr *string + _en CustomEnum + _enSet bool + _optEnum *CustomEnum + _enumArray []CustomEnum + _enumArraySet bool + _optEnumArray []*CustomEnum + _map map[string]int32 + _mapSet bool + _mapOfArr map[string][]int32 + _mapOfArrSet bool + _mapOfObj map[string]AnotherType + _mapOfObjSet bool + _mapOfArrOfObj map[string][]AnotherType + _mapOfArrOfObjSet bool + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type") + reader.Context().Pop() + switch field { + case "Str": + reader.Context().Push(field, "string", "type found, reading property") + _str = reader.ReadString() + _strSet = true + reader.Context().Pop() + case "OptStr": + reader.Context().Push(field, "*string", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadString() + _optStr = &v + } + reader.Context().Pop() + case "En": + reader.Context().Push(field, "CustomEnum", "type found, reading property") + _en = CustomEnum(reader.ReadI32()) + SanitizeCustomEnumValue(int32(_en)) + _enSet = true + reader.Context().Pop() + case "OptEnum": + reader.Context().Push(field, "*CustomEnum", "type found, reading property") + if !reader.IsNil() { + v := CustomEnum(reader.ReadI32()) + SanitizeCustomEnumValue(int32(v)) + _optEnum = &v + } + reader.Context().Pop() + case "EnumArray": + reader.Context().Push(field, "[]CustomEnum", "type found, reading property") + if reader.IsNil() { + _enumArray = nil + } else { + ln0 := reader.ReadArrayLength() + _enumArray = make([]CustomEnum, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + _enumArray[i0] = CustomEnum(reader.ReadI32()) + SanitizeCustomEnumValue(int32(_enumArray[i0])) + } + } + _enumArraySet = true + reader.Context().Pop() + case "OptEnumArray": + reader.Context().Push(field, "[]*CustomEnum", "type found, reading property") + if reader.IsNil() { + _optEnumArray = nil + } else { + ln0 := reader.ReadArrayLength() + _optEnumArray = make([]*CustomEnum, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if !reader.IsNil() { + v := CustomEnum(reader.ReadI32()) + SanitizeCustomEnumValue(int32(v)) + _optEnumArray[i0] = &v + } + } + } + reader.Context().Pop() + case "Map": + reader.Context().Push(field, "map[string]int32", "type found, reading property") + if reader.IsNil() { + _map = nil + } else { + ln0 := reader.ReadMapLength() + _map = make(map[string]int32) + for j0 := uint32(0); j0 < ln0; j0++ { + i0 := reader.ReadString() + _map[i0] = reader.ReadI32() + } + } + _mapSet = true + reader.Context().Pop() + case "MapOfArr": + reader.Context().Push(field, "map[string][]int32", "type found, reading property") + if reader.IsNil() { + _mapOfArr = nil + } else { + ln0 := reader.ReadMapLength() + _mapOfArr = make(map[string][]int32) + for j0 := uint32(0); j0 < ln0; j0++ { + i0 := reader.ReadString() + if reader.IsNil() { + _mapOfArr[i0] = nil + } else { + ln1 := reader.ReadArrayLength() + _mapOfArr[i0] = make([]int32, ln1) + for i1 := uint32(0); i1 < ln1; i1++ { + _mapOfArr[i0][i1] = reader.ReadI32() + } + } + } + } + _mapOfArrSet = true + reader.Context().Pop() + case "MapOfObj": + reader.Context().Push(field, "map[string]AnotherType", "type found, reading property") + if reader.IsNil() { + _mapOfObj = nil + } else { + ln0 := reader.ReadMapLength() + _mapOfObj = make(map[string]AnotherType) + for j0 := uint32(0); j0 < ln0; j0++ { + i0 := reader.ReadString() + if v := AnotherTypeRead(reader); v != nil { + _mapOfObj[i0] = *v + } + } + } + _mapOfObjSet = true + reader.Context().Pop() + case "MapOfArrOfObj": + reader.Context().Push(field, "map[string][]AnotherType", "type found, reading property") + if reader.IsNil() { + _mapOfArrOfObj = nil + } else { + ln0 := reader.ReadMapLength() + _mapOfArrOfObj = make(map[string][]AnotherType) + for j0 := uint32(0); j0 < ln0; j0++ { + i0 := reader.ReadString() + if reader.IsNil() { + _mapOfArrOfObj[i0] = nil + } else { + ln1 := reader.ReadArrayLength() + _mapOfArrOfObj[i0] = make([]AnotherType, ln1) + for i1 := uint32(0); i1 < ln1; i1++ { + if v := AnotherTypeRead(reader); v != nil { + _mapOfArrOfObj[i0][i1] = *v + } + } + } + } + } + _mapOfArrOfObjSet = true + reader.Context().Pop() + } + } + + if !_strSet { + panic(reader.Context().PrintWithContext("Missing required property: 'str: String'")) + } + if !_enSet { + panic(reader.Context().PrintWithContext("Missing required property: 'en: CustomEnum'")) + } + if !_enumArraySet { + panic(reader.Context().PrintWithContext("Missing required property: 'enumArray: [CustomEnum]'")) + } + if !_mapSet { + panic(reader.Context().PrintWithContext("Missing required property: 'map: Map'")) + } + if !_mapOfArrSet { + panic(reader.Context().PrintWithContext("Missing required property: 'mapOfArr: Map'")) + } + if !_mapOfObjSet { + panic(reader.Context().PrintWithContext("Missing required property: 'mapOfObj: Map'")) + } + if !_mapOfArrOfObjSet { + panic(reader.Context().PrintWithContext("Missing required property: 'mapOfArrOfObj: Map'")) + } + + return &ArgsModuleMethod{ + Str: _str, + OptStr: _optStr, + En: _en, + OptEnum: _optEnum, + EnumArray: _enumArray, + OptEnumArray: _optEnumArray, + Map: _map, + MapOfArr: _mapOfArr, + MapOfObj: _mapOfObj, + MapOfArrOfObj: _mapOfArrOfObj, + } +} + +func SerializeModuleMethodResult(value int32) []byte { + ctx := msgpack.NewContext("Serializing module-type: ModuleMethod") + encoder := msgpack.NewWriteEncoder(ctx) + WriteModuleMethodResult(encoder, value); + return encoder.Buffer() +} + +func WriteModuleMethodResult(writer msgpack.Write, value int32) { + writer.Context().Push("moduleMethod", "int32", "writing property") + { + v := value + writer.WriteI32(v) + } + writer.Context().Pop() +} + +type ArgsObjectMethod struct { + Object AnotherType + OptObject *AnotherType + ObjectArray []AnotherType + OptObjectArray []*AnotherType +} + +func DeserializeObjectMethodArgs(argsBuf []byte) *ArgsObjectMethod { + ctx := msgpack.NewContext("Deserializing module-type: ObjectMethod") + reader := msgpack.NewReadDecoder(ctx, argsBuf) + + var ( + _object AnotherType + _objectSet bool + _optObject *AnotherType + _objectArray []AnotherType + _objectArraySet bool + _optObjectArray []*AnotherType + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type") + reader.Context().Pop() + switch field { + case "Object": + reader.Context().Push(field, "AnotherType", "type found, reading property") + if v := AnotherTypeRead(reader); v != nil { + _object = *v + } + _objectSet = true + reader.Context().Pop() + case "OptObject": + reader.Context().Push(field, "*AnotherType", "type found, reading property") + if v := AnotherTypeRead(reader); v != nil { + _optObject = v + } + reader.Context().Pop() + case "ObjectArray": + reader.Context().Push(field, "[]AnotherType", "type found, reading property") + if reader.IsNil() { + _objectArray = nil + } else { + ln0 := reader.ReadArrayLength() + _objectArray = make([]AnotherType, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if v := AnotherTypeRead(reader); v != nil { + _objectArray[i0] = *v + } + } + } + _objectArraySet = true + reader.Context().Pop() + case "OptObjectArray": + reader.Context().Push(field, "[]*AnotherType", "type found, reading property") + if reader.IsNil() { + _optObjectArray = nil + } else { + ln0 := reader.ReadArrayLength() + _optObjectArray = make([]*AnotherType, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if v := AnotherTypeRead(reader); v != nil { + _optObjectArray[i0] = v + } + } + } + reader.Context().Pop() + } + } + + if !_objectSet { + panic(reader.Context().PrintWithContext("Missing required property: 'object: AnotherType'")) + } + if !_objectArraySet { + panic(reader.Context().PrintWithContext("Missing required property: 'objectArray: [AnotherType]'")) + } + + return &ArgsObjectMethod{ + Object: _object, + OptObject: _optObject, + ObjectArray: _objectArray, + OptObjectArray: _optObjectArray, + } +} + +func SerializeObjectMethodResult(value *AnotherType) []byte { + ctx := msgpack.NewContext("Serializing module-type: ObjectMethod") + encoder := msgpack.NewWriteEncoder(ctx) + WriteObjectMethodResult(encoder, value); + return encoder.Buffer() +} + +func WriteObjectMethodResult(writer msgpack.Write, value *AnotherType) { + writer.Context().Push("objectMethod", "*AnotherType", "writing property") + { + v := value + AnotherTypeWrite(writer, v) + } + writer.Context().Pop() +} + +type ArgsOptionalEnvMethod struct { + Object AnotherType + OptObject *AnotherType + ObjectArray []AnotherType + OptObjectArray []*AnotherType +} + +func DeserializeOptionalEnvMethodArgs(argsBuf []byte) *ArgsOptionalEnvMethod { + ctx := msgpack.NewContext("Deserializing module-type: OptionalEnvMethod") + reader := msgpack.NewReadDecoder(ctx, argsBuf) + + var ( + _object AnotherType + _objectSet bool + _optObject *AnotherType + _objectArray []AnotherType + _objectArraySet bool + _optObjectArray []*AnotherType + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type") + reader.Context().Pop() + switch field { + case "Object": + reader.Context().Push(field, "AnotherType", "type found, reading property") + if v := AnotherTypeRead(reader); v != nil { + _object = *v + } + _objectSet = true + reader.Context().Pop() + case "OptObject": + reader.Context().Push(field, "*AnotherType", "type found, reading property") + if v := AnotherTypeRead(reader); v != nil { + _optObject = v + } + reader.Context().Pop() + case "ObjectArray": + reader.Context().Push(field, "[]AnotherType", "type found, reading property") + if reader.IsNil() { + _objectArray = nil + } else { + ln0 := reader.ReadArrayLength() + _objectArray = make([]AnotherType, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if v := AnotherTypeRead(reader); v != nil { + _objectArray[i0] = *v + } + } + } + _objectArraySet = true + reader.Context().Pop() + case "OptObjectArray": + reader.Context().Push(field, "[]*AnotherType", "type found, reading property") + if reader.IsNil() { + _optObjectArray = nil + } else { + ln0 := reader.ReadArrayLength() + _optObjectArray = make([]*AnotherType, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if v := AnotherTypeRead(reader); v != nil { + _optObjectArray[i0] = v + } + } + } + reader.Context().Pop() + } + } + + if !_objectSet { + panic(reader.Context().PrintWithContext("Missing required property: 'object: AnotherType'")) + } + if !_objectArraySet { + panic(reader.Context().PrintWithContext("Missing required property: 'objectArray: [AnotherType]'")) + } + + return &ArgsOptionalEnvMethod{ + Object: _object, + OptObject: _optObject, + ObjectArray: _objectArray, + OptObjectArray: _optObjectArray, + } +} + +func SerializeOptionalEnvMethodResult(value *AnotherType) []byte { + ctx := msgpack.NewContext("Serializing module-type: OptionalEnvMethod") + encoder := msgpack.NewWriteEncoder(ctx) + WriteOptionalEnvMethodResult(encoder, value); + return encoder.Buffer() +} + +func WriteOptionalEnvMethodResult(writer msgpack.Write, value *AnotherType) { + writer.Context().Push("optionalEnvMethod", "*AnotherType", "writing property") + { + v := value + AnotherTypeWrite(writer, v) + } + writer.Context().Pop() +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_wrapped.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_wrapped.go new file mode 100644 index 0000000000..8b77f7a4a8 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_wrapped.go @@ -0,0 +1,45 @@ +package types + +import ( + "github.com/consideritdone/polywrap-go/polywrap" + "some/library/to/methods" +) + +func ModuleMethodWrapped(argsBuf []byte, envSize uint32) []byte { + var env *Env + + args := DeserializeModuleMethodArgs(argsBuf) + + result := methods.ModuleMethod(args) + return SerializeModuleMethodResult(result) +} + +func ObjectMethodWrapped(argsBuf []byte, envSize uint32) []byte { + var env *Env + if envSize == 0 { + panic("Environment is not set, and it is required by method 'objectMethod'") + } + if envSize > 0 { + envBuf := polywrap.WrapLoadEnv(envSize) + env = EnvFromBuffer(envBuf) + } + + args := DeserializeObjectMethodArgs(argsBuf) + + result := methods.ObjectMethod(args, env) + return SerializeObjectMethodResult(result) +} + +func OptionalEnvMethodWrapped(argsBuf []byte, envSize uint32) []byte { + var env *Env + if envSize > 0 { + envBuf := polywrap.WrapLoadEnv(envSize) + env = EnvFromBuffer(envBuf) + } + + args := DeserializeOptionalEnvMethodArgs(argsBuf) + + result := methods.OptionalEnvMethod(args, env) + return SerializeOptionalEnvMethodResult(result) +} + diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/another_type.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/types/another_type.go rename to packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/another_type_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type_serialization.go similarity index 99% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/types/another_type_serialization.go rename to packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type_serialization.go index 682e6bde21..3bb5d8f434 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/another_type_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type_serialization.go @@ -26,7 +26,6 @@ func writeAnotherType(writer msgpack.Write, value *AnotherType) { writer.Context().Pop() writer.Context().Push("Circular", "*CustomType", "writing property") writer.WriteString("Circular") - { v := value.Circular CustomTypeWrite(writer, v) diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_type.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/types/custom_type.go rename to packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go new file mode 100644 index 0000000000..74d75efa54 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go @@ -0,0 +1,1211 @@ +package types + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + "github.com/valyala/fastjson" +) + +func serializeCustomType(value *CustomType) []byte { + ctx := msgpack.NewContext("Serializing (encoding) env-type: CustomType") + encoder := msgpack.NewWriteEncoder(ctx) + writeCustomType(encoder, value) + return encoder.Buffer() +} + +func writeCustomType(writer msgpack.Write, value *CustomType) { + writer.WriteMapLength(41) + writer.Context().Push("Str", "string", "writing property") + writer.WriteString("Str") + { + v := value.Str + writer.WriteString(v) + } + writer.Context().Pop() + writer.Context().Push("OptStr", "*string", "writing property") + writer.WriteString("OptStr") + { + v := value.OptStr + if v == nil { + writer.WriteNil() + } else { + writer.WriteString(*v) + } + } + writer.Context().Pop() + writer.Context().Push("U", "uint32", "writing property") + writer.WriteString("U") + { + v := value.U + writer.WriteU32(v) + } + writer.Context().Pop() + writer.Context().Push("OptU", "*uint32", "writing property") + writer.WriteString("OptU") + { + v := value.OptU + if v == nil { + writer.WriteNil() + } else { + writer.WriteU32(*v) + } + } + writer.Context().Pop() + writer.Context().Push("M_u8", "uint8", "writing property") + writer.WriteString("M_u8") + { + v := value.M_u8 + writer.WriteU8(v) + } + writer.Context().Pop() + writer.Context().Push("M_u16", "uint16", "writing property") + writer.WriteString("M_u16") + { + v := value.M_u16 + writer.WriteU16(v) + } + writer.Context().Pop() + writer.Context().Push("M_u32", "uint32", "writing property") + writer.WriteString("M_u32") + { + v := value.M_u32 + writer.WriteU32(v) + } + writer.Context().Pop() + writer.Context().Push("I", "int32", "writing property") + writer.WriteString("I") + { + v := value.I + writer.WriteI32(v) + } + writer.Context().Pop() + writer.Context().Push("M_i8", "int8", "writing property") + writer.WriteString("M_i8") + { + v := value.M_i8 + writer.WriteI8(v) + } + writer.Context().Pop() + writer.Context().Push("M_i16", "int16", "writing property") + writer.WriteString("M_i16") + { + v := value.M_i16 + writer.WriteI16(v) + } + writer.Context().Pop() + writer.Context().Push("M_i32", "int32", "writing property") + writer.WriteString("M_i32") + { + v := value.M_i32 + writer.WriteI32(v) + } + writer.Context().Pop() + writer.Context().Push("Bigint", "*big.Int", "writing property") + writer.WriteString("Bigint") + { + v := value.Bigint + writer.WriteBigInt(v) + } + writer.Context().Pop() + writer.Context().Push("OptBigint", "*big.Int", "writing property") + writer.WriteString("OptBigint") + { + v := value.OptBigint + if v == nil { + writer.WriteNil() + } else { + writer.WriteBigInt(v) + } + } + writer.Context().Pop() + writer.Context().Push("Bignumber", "*big.Int", "writing property") + writer.WriteString("Bignumber") + { + v := value.Bignumber + writer.WriteBigInt(v) + } + writer.Context().Pop() + writer.Context().Push("OptBignumber", "*big.Int", "writing property") + writer.WriteString("OptBignumber") + { + v := value.OptBignumber + if v == nil { + writer.WriteNil() + } else { + writer.WriteBigInt(v) + } + } + writer.Context().Pop() + writer.Context().Push("Json", "*fastjson.Value", "writing property") + writer.WriteString("Json") + { + v := value.Json + writer.WriteJson(v) + } + writer.Context().Pop() + writer.Context().Push("OptJson", "*fastjson.Value", "writing property") + writer.WriteString("OptJson") + { + v := value.OptJson + if v == nil { + writer.WriteNil() + } else { + writer.WriteJson(v) + } + } + writer.Context().Pop() + writer.Context().Push("Bytes", "[]byte", "writing property") + writer.WriteString("Bytes") + { + v := value.Bytes + writer.WriteBytes(v) + } + writer.Context().Pop() + writer.Context().Push("OptBytes", "[]byte", "writing property") + writer.WriteString("OptBytes") + { + v := value.OptBytes + if v == nil { + writer.WriteNil() + } else { + writer.WriteBytes(v) + } + } + writer.Context().Pop() + writer.Context().Push("M_boolean", "bool", "writing property") + writer.WriteString("M_boolean") + { + v := value.M_boolean + writer.WriteBool(v) + } + writer.Context().Pop() + writer.Context().Push("OptBoolean", "*bool", "writing property") + writer.WriteString("OptBoolean") + { + v := value.OptBoolean + if v == nil { + writer.WriteNil() + } else { + writer.WriteBool(*v) + } + } + writer.Context().Pop() + writer.Context().Push("UArray", "[]uint32", "writing property") + writer.WriteString("UArray") + if value.UArray == nil { + writer.WriteNil() + } else if len(value.UArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.UArray { + { + v := value.UArray[i0] + writer.WriteU32(v) + } + } + } + writer.Context().Pop() + writer.Context().Push("UOptArray", "[]uint32", "writing property") + writer.WriteString("UOptArray") + if value.UOptArray == nil { + writer.WriteNil() + } else if len(value.UOptArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.UOptArray { + { + v := value.UOptArray[i0] + writer.WriteU32(v) + } + } + } + writer.Context().Pop() + writer.Context().Push("OptUOptArray", "[]*uint32", "writing property") + writer.WriteString("OptUOptArray") + if value.OptUOptArray == nil { + writer.WriteNil() + } else if len(value.OptUOptArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.OptUOptArray { + { + v := value.OptUOptArray[i0] + if v == nil { + writer.WriteNil() + } else { + writer.WriteU32(*v) + } + } + } + } + writer.Context().Pop() + writer.Context().Push("OptStrOptArray", "[]*string", "writing property") + writer.WriteString("OptStrOptArray") + if value.OptStrOptArray == nil { + writer.WriteNil() + } else if len(value.OptStrOptArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.OptStrOptArray { + { + v := value.OptStrOptArray[i0] + if v == nil { + writer.WriteNil() + } else { + writer.WriteString(*v) + } + } + } + } + writer.Context().Pop() + writer.Context().Push("UArrayArray", "[][]uint32", "writing property") + writer.WriteString("UArrayArray") + if value.UArrayArray == nil { + writer.WriteNil() + } else if len(value.UArrayArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.UArrayArray { + if value.UArrayArray[i0] == nil { + writer.WriteNil() + } else if len(value.UArrayArray[i0]) == 0 { + writer.WriteNil() + } else { + for i1 := range value.UArrayArray[i0] { + { + v := value.UArrayArray[i0][i1] + writer.WriteU32(v) + } + } + } + } + } + writer.Context().Pop() + writer.Context().Push("UOptArrayOptArray", "[][]*uint32", "writing property") + writer.WriteString("UOptArrayOptArray") + if value.UOptArrayOptArray == nil { + writer.WriteNil() + } else if len(value.UOptArrayOptArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.UOptArrayOptArray { + if value.UOptArrayOptArray[i0] == nil { + writer.WriteNil() + } else if len(value.UOptArrayOptArray[i0]) == 0 { + writer.WriteNil() + } else { + for i1 := range value.UOptArrayOptArray[i0] { + { + v := value.UOptArrayOptArray[i0][i1] + if v == nil { + writer.WriteNil() + } else { + writer.WriteU32(*v) + } + } + } + } + } + } + writer.Context().Pop() + writer.Context().Push("UArrayOptArrayArray", "[][][]uint32", "writing property") + writer.WriteString("UArrayOptArrayArray") + if value.UArrayOptArrayArray == nil { + writer.WriteNil() + } else if len(value.UArrayOptArrayArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.UArrayOptArrayArray { + if value.UArrayOptArrayArray[i0] == nil { + writer.WriteNil() + } else if len(value.UArrayOptArrayArray[i0]) == 0 { + writer.WriteNil() + } else { + for i1 := range value.UArrayOptArrayArray[i0] { + if value.UArrayOptArrayArray[i0][i1] == nil { + writer.WriteNil() + } else if len(value.UArrayOptArrayArray[i0][i1]) == 0 { + writer.WriteNil() + } else { + for i2 := range value.UArrayOptArrayArray[i0][i1] { + { + v := value.UArrayOptArrayArray[i0][i1][i2] + writer.WriteU32(v) + } + } + } + } + } + } + } + writer.Context().Pop() + writer.Context().Push("CrazyArray", "[][][][]uint32", "writing property") + writer.WriteString("CrazyArray") + if value.CrazyArray == nil { + writer.WriteNil() + } else if len(value.CrazyArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.CrazyArray { + if value.CrazyArray[i0] == nil { + writer.WriteNil() + } else if len(value.CrazyArray[i0]) == 0 { + writer.WriteNil() + } else { + for i1 := range value.CrazyArray[i0] { + if value.CrazyArray[i0][i1] == nil { + writer.WriteNil() + } else if len(value.CrazyArray[i0][i1]) == 0 { + writer.WriteNil() + } else { + for i2 := range value.CrazyArray[i0][i1] { + if value.CrazyArray[i0][i1][i2] == nil { + writer.WriteNil() + } else if len(value.CrazyArray[i0][i1][i2]) == 0 { + writer.WriteNil() + } else { + for i3 := range value.CrazyArray[i0][i1][i2] { + { + v := value.CrazyArray[i0][i1][i2][i3] + writer.WriteU32(v) + } + } + } + } + } + } + } + } + } + writer.Context().Pop() + writer.Context().Push("Object", "AnotherType", "writing property") + writer.WriteString("Object") + { + v := value.Object + AnotherTypeWrite(writer, &v) + } + writer.Context().Pop() + writer.Context().Push("OptObject", "*AnotherType", "writing property") + writer.WriteString("OptObject") + { + v := value.OptObject + AnotherTypeWrite(writer, v) + } + writer.Context().Pop() + writer.Context().Push("ObjectArray", "[]AnotherType", "writing property") + writer.WriteString("ObjectArray") + if value.ObjectArray == nil { + writer.WriteNil() + } else if len(value.ObjectArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.ObjectArray { + { + v := value.ObjectArray[i0] + AnotherTypeWrite(writer, &v) + } + } + } + writer.Context().Pop() + writer.Context().Push("OptObjectArray", "[]*AnotherType", "writing property") + writer.WriteString("OptObjectArray") + if value.OptObjectArray == nil { + writer.WriteNil() + } else if len(value.OptObjectArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.OptObjectArray { + { + v := value.OptObjectArray[i0] + AnotherTypeWrite(writer, v) + } + } + } + writer.Context().Pop() + writer.Context().Push("En", "CustomEnum", "writing property") + writer.WriteString("En") + { + v := value.En + writer.WriteI32(int32(v)) + } + writer.Context().Pop() + writer.Context().Push("OptEnum", "*CustomEnum", "writing property") + writer.WriteString("OptEnum") + { + v := value.OptEnum + if v == nil { + writer.WriteNil() + } else { + writer.WriteI32(int32(*v)) + } + } + writer.Context().Pop() + writer.Context().Push("EnumArray", "[]CustomEnum", "writing property") + writer.WriteString("EnumArray") + if value.EnumArray == nil { + writer.WriteNil() + } else if len(value.EnumArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.EnumArray { + { + v := value.EnumArray[i0] + writer.WriteI32(int32(v)) + } + } + } + writer.Context().Pop() + writer.Context().Push("OptEnumArray", "[]*CustomEnum", "writing property") + writer.WriteString("OptEnumArray") + if value.OptEnumArray == nil { + writer.WriteNil() + } else if len(value.OptEnumArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.OptEnumArray { + { + v := value.OptEnumArray[i0] + if v == nil { + writer.WriteNil() + } else { + writer.WriteI32(int32(*v)) + } + } + } + } + writer.Context().Pop() + writer.Context().Push("Map", "map[string]int32", "writing property") + writer.WriteString("Map") + if value.Map == nil { + writer.WriteNil() + } else if len(value.Map) == 0 { + writer.WriteNil() + } else { + for i0 := range value.Map { + writer.WriteString(i0) + { + v := value.Map[i0] + writer.WriteI32(v) + } + } + } + writer.Context().Pop() + writer.Context().Push("MapOfArr", "map[string][]int32", "writing property") + writer.WriteString("MapOfArr") + if value.MapOfArr == nil { + writer.WriteNil() + } else if len(value.MapOfArr) == 0 { + writer.WriteNil() + } else { + for i0 := range value.MapOfArr { + writer.WriteString(i0) + if value.MapOfArr[i0] == nil { + writer.WriteNil() + } else if len(value.MapOfArr[i0]) == 0 { + writer.WriteNil() + } else { + for i1 := range value.MapOfArr[i0] { + { + v := value.MapOfArr[i0][i1] + writer.WriteI32(v) + } + } + } + } + } + writer.Context().Pop() + writer.Context().Push("MapOfObj", "map[string]AnotherType", "writing property") + writer.WriteString("MapOfObj") + if value.MapOfObj == nil { + writer.WriteNil() + } else if len(value.MapOfObj) == 0 { + writer.WriteNil() + } else { + for i0 := range value.MapOfObj { + writer.WriteString(i0) + { + v := value.MapOfObj[i0] + AnotherTypeWrite(writer, &v) + } + } + } + writer.Context().Pop() + writer.Context().Push("MapOfArrOfObj", "map[string][]AnotherType", "writing property") + writer.WriteString("MapOfArrOfObj") + if value.MapOfArrOfObj == nil { + writer.WriteNil() + } else if len(value.MapOfArrOfObj) == 0 { + writer.WriteNil() + } else { + for i0 := range value.MapOfArrOfObj { + writer.WriteString(i0) + if value.MapOfArrOfObj[i0] == nil { + writer.WriteNil() + } else if len(value.MapOfArrOfObj[i0]) == 0 { + writer.WriteNil() + } else { + for i1 := range value.MapOfArrOfObj[i0] { + { + v := value.MapOfArrOfObj[i0][i1] + AnotherTypeWrite(writer, &v) + } + } + } + } + } + writer.Context().Pop() +} + +func deserializeCustomType(data []byte) *CustomType { + ctx := msgpack.NewContext("Deserializing (decoding) env-type: CustomType") + reader := msgpack.NewReadDecoder(ctx, data) + return readCustomType(reader) +} + +func readCustomType(reader msgpack.Read) *CustomType { + var ( + _str string + _strSet bool + _optStr *string + _u uint32 + _uSet bool + _optU *uint32 + _u8 uint8 + _u8Set bool + _u16 uint16 + _u16Set bool + _u32 uint32 + _u32Set bool + _i int32 + _iSet bool + _i8 int8 + _i8Set bool + _i16 int16 + _i16Set bool + _i32 int32 + _i32Set bool + _bigint *big.Int + _bigintSet bool + _optBigint *big.Int + _bignumber *big.Int + _bignumberSet bool + _optBignumber *big.Int + _json *fastjson.Value + _jsonSet bool + _optJson *fastjson.Value + _bytes []byte + _bytesSet bool + _optBytes []byte + _boolean bool + _booleanSet bool + _optBoolean *bool + _uArray []uint32 + _uArraySet bool + _uOptArray []uint32 + _optUOptArray []*uint32 + _optStrOptArray []*string + _uArrayArray [][]uint32 + _uArrayArraySet bool + _uOptArrayOptArray [][]*uint32 + _uOptArrayOptArraySet bool + _uArrayOptArrayArray [][][]uint32 + _uArrayOptArrayArraySet bool + _crazyArray [][][][]uint32 + _object AnotherType + _objectSet bool + _optObject *AnotherType + _objectArray []AnotherType + _objectArraySet bool + _optObjectArray []*AnotherType + _en CustomEnum + _enSet bool + _optEnum *CustomEnum + _enumArray []CustomEnum + _enumArraySet bool + _optEnumArray []*CustomEnum + _map map[string]int32 + _mapSet bool + _mapOfArr map[string][]int32 + _mapOfArrSet bool + _mapOfObj map[string]AnotherType + _mapOfObjSet bool + _mapOfArrOfObj map[string][]AnotherType + _mapOfArrOfObjSet bool + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type") + switch field { + case "Str": + reader.Context().Push(field, "string", "type found, reading property") + _str = reader.ReadString() + _strSet = true + reader.Context().Pop() + case "OptStr": + reader.Context().Push(field, "*string", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadString() + _optStr = &v + } + reader.Context().Pop() + case "U": + reader.Context().Push(field, "uint32", "type found, reading property") + _u = reader.ReadU32() + _uSet = true + reader.Context().Pop() + case "OptU": + reader.Context().Push(field, "*uint32", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadU32() + _optU = &v + } + reader.Context().Pop() + case "M_u8": + reader.Context().Push(field, "uint8", "type found, reading property") + _u8 = reader.ReadU8() + _u8Set = true + reader.Context().Pop() + case "M_u16": + reader.Context().Push(field, "uint16", "type found, reading property") + _u16 = reader.ReadU16() + _u16Set = true + reader.Context().Pop() + case "M_u32": + reader.Context().Push(field, "uint32", "type found, reading property") + _u32 = reader.ReadU32() + _u32Set = true + reader.Context().Pop() + case "I": + reader.Context().Push(field, "int32", "type found, reading property") + _i = reader.ReadI32() + _iSet = true + reader.Context().Pop() + case "M_i8": + reader.Context().Push(field, "int8", "type found, reading property") + _i8 = reader.ReadI8() + _i8Set = true + reader.Context().Pop() + case "M_i16": + reader.Context().Push(field, "int16", "type found, reading property") + _i16 = reader.ReadI16() + _i16Set = true + reader.Context().Pop() + case "M_i32": + reader.Context().Push(field, "int32", "type found, reading property") + _i32 = reader.ReadI32() + _i32Set = true + reader.Context().Pop() + case "Bigint": + reader.Context().Push(field, "*big.Int", "type found, reading property") + _bigint = reader.ReadBigInt() + _bigintSet = true + reader.Context().Pop() + case "OptBigint": + reader.Context().Push(field, "*big.Int", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadBigInt() + _optBigint = v + } + reader.Context().Pop() + case "Bignumber": + reader.Context().Push(field, "*big.Int", "type found, reading property") + _bignumber = reader.ReadBigInt() + _bignumberSet = true + reader.Context().Pop() + case "OptBignumber": + reader.Context().Push(field, "*big.Int", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadBigInt() + _optBignumber = v + } + reader.Context().Pop() + case "Json": + reader.Context().Push(field, "*fastjson.Value", "type found, reading property") + _json = reader.ReadJson() + _jsonSet = true + reader.Context().Pop() + case "OptJson": + reader.Context().Push(field, "*fastjson.Value", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadJson() + _optJson = v + } + reader.Context().Pop() + case "Bytes": + reader.Context().Push(field, "[]byte", "type found, reading property") + _bytes = reader.ReadBytes() + _bytesSet = true + reader.Context().Pop() + case "OptBytes": + reader.Context().Push(field, "[]byte", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadBytes() + _optBytes = v + } + reader.Context().Pop() + case "M_boolean": + reader.Context().Push(field, "bool", "type found, reading property") + _boolean = reader.ReadBool() + _booleanSet = true + reader.Context().Pop() + case "OptBoolean": + reader.Context().Push(field, "*bool", "type found, reading property") + if !reader.IsNil() { + v := reader.ReadBool() + _optBoolean = &v + } + reader.Context().Pop() + case "UArray": + reader.Context().Push(field, "[]uint32", "type found, reading property") + if reader.IsNil() { + _uArray = nil + } else { + ln0 := reader.ReadArrayLength() + _uArray = make([]uint32, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + _uArray[i0] = reader.ReadU32() + } + } + _uArraySet = true + reader.Context().Pop() + case "UOptArray": + reader.Context().Push(field, "[]uint32", "type found, reading property") + if reader.IsNil() { + _uOptArray = nil + } else { + ln0 := reader.ReadArrayLength() + _uOptArray = make([]uint32, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + _uOptArray[i0] = reader.ReadU32() + } + } + reader.Context().Pop() + case "OptUOptArray": + reader.Context().Push(field, "[]*uint32", "type found, reading property") + if reader.IsNil() { + _optUOptArray = nil + } else { + ln0 := reader.ReadArrayLength() + _optUOptArray = make([]*uint32, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if !reader.IsNil() { + v := reader.ReadU32() + _optUOptArray[i0] = &v + } + } + } + reader.Context().Pop() + case "OptStrOptArray": + reader.Context().Push(field, "[]*string", "type found, reading property") + if reader.IsNil() { + _optStrOptArray = nil + } else { + ln0 := reader.ReadArrayLength() + _optStrOptArray = make([]*string, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if !reader.IsNil() { + v := reader.ReadString() + _optStrOptArray[i0] = &v + } + } + } + reader.Context().Pop() + case "UArrayArray": + reader.Context().Push(field, "[][]uint32", "type found, reading property") + if reader.IsNil() { + _uArrayArray = nil + } else { + ln0 := reader.ReadArrayLength() + _uArrayArray = make([][]uint32, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if reader.IsNil() { + _uArrayArray[i0] = nil + } else { + ln1 := reader.ReadArrayLength() + _uArrayArray[i0] = make([]uint32, ln1) + for i1 := uint32(0); i1 < ln1; i1++ { + _uArrayArray[i0][i1] = reader.ReadU32() + } + } + } + } + _uArrayArraySet = true + reader.Context().Pop() + case "UOptArrayOptArray": + reader.Context().Push(field, "[][]*uint32", "type found, reading property") + if reader.IsNil() { + _uOptArrayOptArray = nil + } else { + ln0 := reader.ReadArrayLength() + _uOptArrayOptArray = make([][]*uint32, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if reader.IsNil() { + _uOptArrayOptArray[i0] = nil + } else { + ln1 := reader.ReadArrayLength() + _uOptArrayOptArray[i0] = make([]*uint32, ln1) + for i1 := uint32(0); i1 < ln1; i1++ { + if !reader.IsNil() { + v := reader.ReadU32() + _uOptArrayOptArray[i0][i1] = &v + } + } + } + } + } + _uOptArrayOptArraySet = true + reader.Context().Pop() + case "UArrayOptArrayArray": + reader.Context().Push(field, "[][][]uint32", "type found, reading property") + if reader.IsNil() { + _uArrayOptArrayArray = nil + } else { + ln0 := reader.ReadArrayLength() + _uArrayOptArrayArray = make([][][]uint32, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if reader.IsNil() { + _uArrayOptArrayArray[i0] = nil + } else { + ln1 := reader.ReadArrayLength() + _uArrayOptArrayArray[i0] = make([][]uint32, ln1) + for i1 := uint32(0); i1 < ln1; i1++ { + if reader.IsNil() { + _uArrayOptArrayArray[i0][i1] = nil + } else { + ln2 := reader.ReadArrayLength() + _uArrayOptArrayArray[i0][i1] = make([]uint32, ln2) + for i2 := uint32(0); i2 < ln2; i2++ { + _uArrayOptArrayArray[i0][i1][i2] = reader.ReadU32() + } + } + } + } + } + } + _uArrayOptArrayArraySet = true + reader.Context().Pop() + case "CrazyArray": + reader.Context().Push(field, "[][][][]uint32", "type found, reading property") + if reader.IsNil() { + _crazyArray = nil + } else { + ln0 := reader.ReadArrayLength() + _crazyArray = make([][][][]uint32, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if reader.IsNil() { + _crazyArray[i0] = nil + } else { + ln1 := reader.ReadArrayLength() + _crazyArray[i0] = make([][][]uint32, ln1) + for i1 := uint32(0); i1 < ln1; i1++ { + if reader.IsNil() { + _crazyArray[i0][i1] = nil + } else { + ln2 := reader.ReadArrayLength() + _crazyArray[i0][i1] = make([][]uint32, ln2) + for i2 := uint32(0); i2 < ln2; i2++ { + if reader.IsNil() { + _crazyArray[i0][i1][i2] = nil + } else { + ln3 := reader.ReadArrayLength() + _crazyArray[i0][i1][i2] = make([]uint32, ln3) + for i3 := uint32(0); i3 < ln3; i3++ { + _crazyArray[i0][i1][i2][i3] = reader.ReadU32() + } + } + } + } + } + } + } + } + reader.Context().Pop() + case "Object": + reader.Context().Push(field, "AnotherType", "type found, reading property") + if v := AnotherTypeRead(reader); v != nil { + _object = *v + } + _objectSet = true + reader.Context().Pop() + case "OptObject": + reader.Context().Push(field, "*AnotherType", "type found, reading property") + if v := AnotherTypeRead(reader); v != nil { + _optObject = v + } + reader.Context().Pop() + case "ObjectArray": + reader.Context().Push(field, "[]AnotherType", "type found, reading property") + if reader.IsNil() { + _objectArray = nil + } else { + ln0 := reader.ReadArrayLength() + _objectArray = make([]AnotherType, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if v := AnotherTypeRead(reader); v != nil { + _objectArray[i0] = *v + } + } + } + _objectArraySet = true + reader.Context().Pop() + case "OptObjectArray": + reader.Context().Push(field, "[]*AnotherType", "type found, reading property") + if reader.IsNil() { + _optObjectArray = nil + } else { + ln0 := reader.ReadArrayLength() + _optObjectArray = make([]*AnotherType, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if v := AnotherTypeRead(reader); v != nil { + _optObjectArray[i0] = v + } + } + } + reader.Context().Pop() + case "En": + reader.Context().Push(field, "CustomEnum", "type found, reading property") + _en = CustomEnum(reader.ReadI32()) + SanitizeCustomEnumValue(int32(_en)) + _enSet = true + reader.Context().Pop() + case "OptEnum": + reader.Context().Push(field, "*CustomEnum", "type found, reading property") + if !reader.IsNil() { + v := CustomEnum(reader.ReadI32()) + SanitizeCustomEnumValue(int32(v)) + _optEnum = &v + } + reader.Context().Pop() + case "EnumArray": + reader.Context().Push(field, "[]CustomEnum", "type found, reading property") + if reader.IsNil() { + _enumArray = nil + } else { + ln0 := reader.ReadArrayLength() + _enumArray = make([]CustomEnum, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + _enumArray[i0] = CustomEnum(reader.ReadI32()) + SanitizeCustomEnumValue(int32(_enumArray[i0])) + } + } + _enumArraySet = true + reader.Context().Pop() + case "OptEnumArray": + reader.Context().Push(field, "[]*CustomEnum", "type found, reading property") + if reader.IsNil() { + _optEnumArray = nil + } else { + ln0 := reader.ReadArrayLength() + _optEnumArray = make([]*CustomEnum, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if !reader.IsNil() { + v := CustomEnum(reader.ReadI32()) + SanitizeCustomEnumValue(int32(v)) + _optEnumArray[i0] = &v + } + } + } + reader.Context().Pop() + case "Map": + reader.Context().Push(field, "map[string]int32", "type found, reading property") + if reader.IsNil() { + _map = nil + } else { + ln0 := reader.ReadMapLength() + _map = make(map[string]int32) + for j0 := uint32(0); j0 < ln0; j0++ { + i0 := reader.ReadString() + _map[i0] = reader.ReadI32() + } + } + _mapSet = true + reader.Context().Pop() + case "MapOfArr": + reader.Context().Push(field, "map[string][]int32", "type found, reading property") + if reader.IsNil() { + _mapOfArr = nil + } else { + ln0 := reader.ReadMapLength() + _mapOfArr = make(map[string][]int32) + for j0 := uint32(0); j0 < ln0; j0++ { + i0 := reader.ReadString() + if reader.IsNil() { + _mapOfArr[i0] = nil + } else { + ln1 := reader.ReadArrayLength() + _mapOfArr[i0] = make([]int32, ln1) + for i1 := uint32(0); i1 < ln1; i1++ { + _mapOfArr[i0][i1] = reader.ReadI32() + } + } + } + } + _mapOfArrSet = true + reader.Context().Pop() + case "MapOfObj": + reader.Context().Push(field, "map[string]AnotherType", "type found, reading property") + if reader.IsNil() { + _mapOfObj = nil + } else { + ln0 := reader.ReadMapLength() + _mapOfObj = make(map[string]AnotherType) + for j0 := uint32(0); j0 < ln0; j0++ { + i0 := reader.ReadString() + if v := AnotherTypeRead(reader); v != nil { + _mapOfObj[i0] = *v + } + } + } + _mapOfObjSet = true + reader.Context().Pop() + case "MapOfArrOfObj": + reader.Context().Push(field, "map[string][]AnotherType", "type found, reading property") + if reader.IsNil() { + _mapOfArrOfObj = nil + } else { + ln0 := reader.ReadMapLength() + _mapOfArrOfObj = make(map[string][]AnotherType) + for j0 := uint32(0); j0 < ln0; j0++ { + i0 := reader.ReadString() + if reader.IsNil() { + _mapOfArrOfObj[i0] = nil + } else { + ln1 := reader.ReadArrayLength() + _mapOfArrOfObj[i0] = make([]AnotherType, ln1) + for i1 := uint32(0); i1 < ln1; i1++ { + if v := AnotherTypeRead(reader); v != nil { + _mapOfArrOfObj[i0][i1] = *v + } + } + } + } + } + _mapOfArrOfObjSet = true + reader.Context().Pop() + } + reader.Context().Pop() + } + + if !_strSet { + panic(reader.Context().PrintWithContext("Missing required property: 'str: String'")) + } + if !_uSet { + panic(reader.Context().PrintWithContext("Missing required property: 'u: UInt'")) + } + if !_u8Set { + panic(reader.Context().PrintWithContext("Missing required property: 'u8: UInt8'")) + } + if !_u16Set { + panic(reader.Context().PrintWithContext("Missing required property: 'u16: UInt16'")) + } + if !_u32Set { + panic(reader.Context().PrintWithContext("Missing required property: 'u32: UInt32'")) + } + if !_iSet { + panic(reader.Context().PrintWithContext("Missing required property: 'i: Int'")) + } + if !_i8Set { + panic(reader.Context().PrintWithContext("Missing required property: 'i8: Int8'")) + } + if !_i16Set { + panic(reader.Context().PrintWithContext("Missing required property: 'i16: Int16'")) + } + if !_i32Set { + panic(reader.Context().PrintWithContext("Missing required property: 'i32: Int32'")) + } + if !_bigintSet { + panic(reader.Context().PrintWithContext("Missing required property: 'bigint: BigInt'")) + } + if !_bignumberSet { + panic(reader.Context().PrintWithContext("Missing required property: 'bignumber: BigNumber'")) + } + if !_jsonSet { + panic(reader.Context().PrintWithContext("Missing required property: 'json: JSON'")) + } + if !_bytesSet { + panic(reader.Context().PrintWithContext("Missing required property: 'bytes: Bytes'")) + } + if !_booleanSet { + panic(reader.Context().PrintWithContext("Missing required property: 'boolean: Boolean'")) + } + if !_uArraySet { + panic(reader.Context().PrintWithContext("Missing required property: 'uArray: [UInt]'")) + } + if !_uArrayArraySet { + panic(reader.Context().PrintWithContext("Missing required property: 'uArrayArray: [[UInt]]'")) + } + if !_uOptArrayOptArraySet { + panic(reader.Context().PrintWithContext("Missing required property: 'uOptArrayOptArray: [[UInt32]]'")) + } + if !_uArrayOptArrayArraySet { + panic(reader.Context().PrintWithContext("Missing required property: 'uArrayOptArrayArray: [[[UInt32]]]'")) + } + if !_objectSet { + panic(reader.Context().PrintWithContext("Missing required property: 'object: AnotherType'")) + } + if !_objectArraySet { + panic(reader.Context().PrintWithContext("Missing required property: 'objectArray: [AnotherType]'")) + } + if !_enSet { + panic(reader.Context().PrintWithContext("Missing required property: 'en: CustomEnum'")) + } + if !_enumArraySet { + panic(reader.Context().PrintWithContext("Missing required property: 'enumArray: [CustomEnum]'")) + } + if !_mapSet { + panic(reader.Context().PrintWithContext("Missing required property: 'map: Map'")) + } + if !_mapOfArrSet { + panic(reader.Context().PrintWithContext("Missing required property: 'mapOfArr: Map'")) + } + if !_mapOfObjSet { + panic(reader.Context().PrintWithContext("Missing required property: 'mapOfObj: Map'")) + } + if !_mapOfArrOfObjSet { + panic(reader.Context().PrintWithContext("Missing required property: 'mapOfArrOfObj: Map'")) + } + return &CustomType{ + Str: _str, + OptStr: _optStr, + U: _u, + OptU: _optU, + M_u8: _u8, + M_u16: _u16, + M_u32: _u32, + I: _i, + M_i8: _i8, + M_i16: _i16, + M_i32: _i32, + Bigint: _bigint, + OptBigint: _optBigint, + Bignumber: _bignumber, + OptBignumber: _optBignumber, + Json: _json, + OptJson: _optJson, + Bytes: _bytes, + OptBytes: _optBytes, + M_boolean: _boolean, + OptBoolean: _optBoolean, + UArray: _uArray, + UOptArray: _uOptArray, + OptUOptArray: _optUOptArray, + OptStrOptArray: _optStrOptArray, + UArrayArray: _uArrayArray, + UOptArrayOptArray: _uOptArrayOptArray, + UArrayOptArrayArray: _uArrayOptArrayArray, + CrazyArray: _crazyArray, + Object: _object, + OptObject: _optObject, + ObjectArray: _objectArray, + OptObjectArray: _optObjectArray, + En: _en, + OptEnum: _optEnum, + EnumArray: _enumArray, + OptEnumArray: _optEnumArray, + Map: _map, + MapOfArr: _mapOfArr, + MapOfObj: _mapOfObj, + MapOfArrOfObj: _mapOfArrOfObj, + } +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/env.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/types/env.go rename to packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/env_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env_serialization.go similarity index 99% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/types/env_serialization.go rename to packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env_serialization.go index 5b7e8a9345..802539ef32 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/env_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env_serialization.go @@ -106,7 +106,6 @@ func readEnv(reader msgpack.Read) *Env { if !_propSet { panic(reader.Context().PrintWithContext("Missing required property: 'prop: String'")) } - return &Env{ Prop: _prop, OptProp: _optProp, From bfafa77ad1204d7f889d2d7916bdafcbc12a4510 Mon Sep 17 00:00:00 2001 From: n0cte Date: Tue, 23 Aug 2022 00:42:36 +0300 Subject: [PATCH 007/181] fix property name for args --- .../bind/src/bindings/golang/wasm-go/templates/main-go.mustache | 2 +- packages/test-cases/cases/bind/sanity/output/wasm-go/main.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/main-go.mustache b/packages/schema/bind/src/bindings/golang/wasm-go/templates/main-go.mustache index c4f9dfc4e8..9e70cc5fbd 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/templates/main-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm-go/templates/main-go.mustache @@ -8,7 +8,7 @@ import ( //export _wrap_invoke func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { args := polywrap.WrapInvokeArgs(methodSize, argsSize) - switch args.method { + switch args.Method { {{#moduleType}} {{#methods}} case "{{name}}": diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go index 5c9d9a022a..23ef94b6fb 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go @@ -8,7 +8,7 @@ import ( //export _wrap_invoke func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { args := polywrap.WrapInvokeArgs(methodSize, argsSize) - switch args.method { + switch args.Method { case "moduleMethod": return polywrap.WrapInvoke(args, envSize, module.ModuleMethodWrapped) case "objectMethod": From d31f21ecf310f619cac6d69028793a1ea947c1b4 Mon Sep 17 00:00:00 2001 From: n0cte Date: Tue, 23 Aug 2022 12:11:05 +0300 Subject: [PATCH 008/181] fix schema output structure --- .../bind/src/bindings/golang/wasm-go/index.ts | 40 +++++++++++++------ 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/index.ts b/packages/schema/bind/src/bindings/golang/wasm-go/index.ts index bd4823ffda..025f9ed4e5 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm-go/index.ts @@ -19,7 +19,7 @@ const templatePath = (subpath: string) => path.join(__dirname, "./templates", subpath); function camel2snake(str: string): string { - str = str.replace( /([A-Z])/g, "_$1"); + str = str.replace(/([A-Z])/g, "_$1"); str = str.startsWith("_") ? str.slice(1) : str; return str.toLowerCase(); } @@ -49,18 +49,6 @@ export const generateBinding: GenerateBindingFn = ( }); } - // if (abi.moduleType) { - // output.entries.push({ - // type: "Directory", - // name: "types", - // data: renderTemplates( - // templatePath("types"), - // abi.moduleType, - // subTemplates - // ), - // }); - // } - // Generate imported folder const importEntries: OutputEntry[] = []; @@ -173,10 +161,36 @@ export const generateBinding: GenerateBindingFn = ( // Generate root entry file output.entries.push(...renderTemplates(templatePath(""), abi, subTemplates)); + output.entries = mergePaths(output.entries); return result; }; +function mergePaths(array: OutputEntry[]): OutputEntry[] { + const tmp: { [key: string]: OutputEntry } = {}; + for (let i = 0; i < array.length; i++) { + switch (array[i].type) { + case "File": + tmp[array[i].name] = array[i] + break; + case "Directory": + if (!tmp[array[i].name]) { + tmp[array[i].name] = array[i] + } else { + (tmp[array[i].name].data as OutputEntry[]).push(...(array[i].data as OutputEntry[])) + } + break; + } + } + array = Object.values(tmp); + for (let i = 0; i < array.length; i++) { + if (array[i].type === "Directory") { + array[i].data = mergePaths(array[i].data as OutputEntry[]); + } + } + return array; +} + function applyTransforms(abi: Abi): Abi { const transforms = [ extendType(Functions), From 30f5a34d23ee3535e8162ade46d762444ffb4989 Mon Sep 17 00:00:00 2001 From: n0cte Date: Tue, 23 Aug 2022 15:18:10 +0300 Subject: [PATCH 009/181] fix code style --- .../src/bindings/golang/wasm-go/functions.ts | 186 +++++++++--------- .../bind/src/bindings/golang/wasm-go/index.ts | 14 +- packages/schema/bind/src/bindings/utils.ts | 5 +- packages/schema/bind/src/types.ts | 7 +- 4 files changed, 114 insertions(+), 98 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts b/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts index 1265e1d045..d73d73fb4b 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts +++ b/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts @@ -1,4 +1,3 @@ -import { isBaseType } from "./baseTypes"; import { reservedWordsAS } from "./reservedWords"; import { MustacheFn } from "../../types"; @@ -7,30 +6,30 @@ let num = -1; export const startIter: MustacheFn = () => { return (): string => { num = -1; - return "" - } -} + return ""; + }; +}; export const stopIter: MustacheFn = () => { return (): string => { num = -1; - return "" - } -} + return ""; + }; +}; export const currIter: MustacheFn = () => { return (text: string, render: (template: string) => string): string => { const rendered: string = render(text); return `${rendered}${num}`; - } -} + }; +}; export const nextIter: MustacheFn = () => { return (text: string, render: (template: string) => string): string => { const rendered: string = render(text); return `${rendered}${++num}`; - } -} + }; +}; export const prevFullIter: MustacheFn = () => { return (text: string, render: (template: string) => string): string => { @@ -38,9 +37,12 @@ export const prevFullIter: MustacheFn = () => { if (rendered == "stop") { return ""; } - return Array(num).fill(0).map((_, i) => `[${rendered}${i}]`).join(""); - } -} + return Array(num) + .fill(0) + .map((_, i) => `[${rendered}${i}]`) + .join(""); + }; +}; export const lastFullIter: MustacheFn = () => { return (text: string, render: (template: string) => string): string => { @@ -48,90 +50,103 @@ export const lastFullIter: MustacheFn = () => { if (rendered == "stop") { return ""; } - return Array(num + 1).fill(0).map((_, i) => `[${rendered}${i}]`).join(""); - } -} + return Array(num + 1) + .fill(0) + .map((_, i) => `[${rendered}${i}]`) + .join(""); + }; +}; export const writePointer: MustacheFn = () => { return (text: string, render: (template: string) => string): string => { const [type, value] = render(text).split(" - "); let pointer = "*"; - if ({ - "BigInt": true, - "Json": true, - "Bytes": true, - }[type] ?? false) { - pointer = ""; + switch (type) { + case "BigInt": + case "Json": + case "Bytes": + pointer = ""; + break; } - return `writer.Write${type}(${pointer}${value})` - } -} + return `writer.Write${type}(${pointer}${value})`; + }; +}; export const readPointer: MustacheFn = () => { return (text: string, render: (template: string) => string): string => { const [type, value] = render(text).split(" - "); let pointer = "&"; - if ({ - "BigInt": true, - "Json": true, - "Bytes": true, - }[type] ?? false) { - pointer = ""; + switch (type) { + case "BigInt": + case "Json": + case "Bytes": + pointer = ""; + break; } - return `${pointer}${value}` - } -} + return `${pointer}${value}`; + }; +}; export const toSnakeCase: MustacheFn = () => { return (text: string, render: (template: string) => string): string => { text = render(text).replace(/([A-Z])/g, "_$1"); text = text.startsWith("_") ? text.slice(1) : text; return text.toLowerCase(); - } -} + }; +}; export const makeImports: MustacheFn = () => { return (text: string, render: (template: string) => string): string => { - const types = render(text).split(",") - const exist: {[key:string]: boolean} = {}; - for (const t of types){ + const types = render(text).split(","); + const exist: { [key: string]: boolean } = {}; + for (const t of types) { switch (t) { case "*big.Int": - exist["github.com/consideritdone/polywrap-go/polywrap/msgpack/big"] = true; - break + exist[ + "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + ] = true; + break; case "*fastjson.Value": exist["github.com/valyala/fastjson"] = true; break; } } - let imports: Array = ["github.com/consideritdone/polywrap-go/polywrap/msgpack"]; + const imports: Array = [ + "github.com/consideritdone/polywrap-go/polywrap/msgpack", + ]; imports.push(...Object.keys(exist)); - const txt = imports.sort().map(imp => `\t"${imp}"`).join("\n"); - return `import (\n${txt}\n)` - } -} + const txt = imports + .sort() + .map((imp) => `\t"${imp}"`) + .join("\n"); + return `import (\n${txt}\n)`; + }; +}; export const stuctProps: MustacheFn = () => { return (text: string, render: (template: string) => string): string => { - let props: [string, string][] = render(text).split("\n") - .map(line => line.trimEnd()) - .filter(line => line !== "") - .map(line => line.split(" ") as [string, string]) + const props: [string, string][] = render(text) + .split("\n") + .map((line) => line.trimEnd()) + .filter((line) => line !== "") + .map((line) => line.split(" ") as [string, string]); let maxPropNameLn = 0; for (const [propName] of props) { if (propName.length > maxPropNameLn) { - maxPropNameLn = propName.length + maxPropNameLn = propName.length; } } for (let i = 0; i < props.length; i++) { if (props[i][0].length < maxPropNameLn) { - props[i][0] += Array(maxPropNameLn - props[i][0].length).fill(" ").join(""); + props[i][0] += Array(maxPropNameLn - props[i][0].length) + .fill(" ") + .join(""); } props[i][0] = "\t" + props[i][0]; } - return props.map(v => v.join(" ")).join("\n") + "\n"; - } -} + return props.map((v) => v.join(" ")).join("\n") + "\n"; + }; +}; export const handleKeywords: MustacheFn = () => { return (text: string, render: (template: string) => string): string => { @@ -146,50 +161,46 @@ export const handleKeywords: MustacheFn = () => { export const toMsgPack: MustacheFn = () => { return (value: string, render: (template: string) => string) => { let type = render(value); - let modifier = ""; if (type[type.length - 1] === "!") { type = type.substring(0, type.length - 1); - } else { - modifier = "Optional"; } - let t = type; if (type.startsWith("[")) { t = "Array"; } else if (type.startsWith("Map")) { t = "Map"; } else if (type.startsWith("Int8")) { - t = "I8" + t = "I8"; } else if (type.startsWith("Int16")) { - t = "I16" + t = "I16"; } else if (type.startsWith("Int32")) { - t = "I32" + t = "I32"; } else if (type.startsWith("Int64")) { - t = "I64" + t = "I64"; } else if (type.startsWith("Int")) { - t = "I32" + t = "I32"; } else if (type.startsWith("UInt8")) { - t = "U8" + t = "U8"; } else if (type.startsWith("UInt16")) { - t = "U16" + t = "U16"; } else if (type.startsWith("UInt32")) { - t = "U32" + t = "U32"; } else if (type.startsWith("UInt64")) { - t = "U64" + t = "U64"; } else if (type.startsWith("UInt")) { - t = "U32" + t = "U32"; } else if (type.startsWith("String")) { - t = "String" + t = "String"; } else if (type.startsWith("Boolean")) { - t = "Bool" + t = "Bool"; } else if (type.startsWith("Bytes")) { - t = "Bytes" + t = "Bytes"; } else if (type.startsWith("BigInt")) { - t = "BigInt" + t = "BigInt"; } else if (type.startsWith("BigNumber")) { - t = "BigInt" + t = "BigInt"; } else if (type.startsWith("JSON")) { - t = "Json" + t = "Json"; } return t; }; @@ -311,13 +322,14 @@ const toWasmMap = (type: string, optional: boolean): string => { return applyOptional(`map[${keyType}]${valType}`, optional, false); }; -const applyOptional = ( - type: string, - optional: boolean, - isEnum: boolean -): string => { - if (optional && !type.startsWith("*") && !type.startsWith("[]") && !type.startsWith("map")) { - return `*${type}` +const applyOptional = (type: string, optional: boolean, _: boolean): string => { + if ( + optional && + !type.startsWith("*") && + !type.startsWith("[]") && + !type.startsWith("map") + ) { + return `*${type}`; } else { return type; } @@ -329,14 +341,6 @@ function replaceAt(str: string, index: number, replacement: string): string { ); } -function insertAt(str: string, index: number, insert: string): string { - return str.substr(0, index) + insert + str.substr(index); -} - -function removeAt(str: string, index: number): string { - return str.substr(0, index) + str.substr(index + 1); -} - export const toLower: MustacheFn = () => { return (value: string, render: (template: string) => string) => { let type = render(value); diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/index.ts b/packages/schema/bind/src/bindings/golang/wasm-go/index.ts index 025f9ed4e5..edb7df1988 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm-go/index.ts @@ -155,7 +155,11 @@ export const generateBinding: GenerateBindingFn = ( output.entries.push({ type: "Directory", name: "types", - data: renderTemplates(templatePath("object-type"), abi.envType, subTemplates), + data: renderTemplates( + templatePath("object-type"), + abi.envType, + subTemplates + ), }); } @@ -171,13 +175,15 @@ function mergePaths(array: OutputEntry[]): OutputEntry[] { for (let i = 0; i < array.length; i++) { switch (array[i].type) { case "File": - tmp[array[i].name] = array[i] + tmp[array[i].name] = array[i]; break; case "Directory": if (!tmp[array[i].name]) { - tmp[array[i].name] = array[i] + tmp[array[i].name] = array[i]; } else { - (tmp[array[i].name].data as OutputEntry[]).push(...(array[i].data as OutputEntry[])) + (tmp[array[i].name].data as OutputEntry[]).push( + ...(array[i].data as OutputEntry[]) + ); } break; } diff --git a/packages/schema/bind/src/bindings/utils.ts b/packages/schema/bind/src/bindings/utils.ts index 07e0d96949..6b91c0b3de 100644 --- a/packages/schema/bind/src/bindings/utils.ts +++ b/packages/schema/bind/src/bindings/utils.ts @@ -9,8 +9,9 @@ function transformName(str: string, view: unknown): string { return str; } const def = view as GenericDefinition; - str = str.replace("%type%", def.type) - .replace( /([A-Z])/g, "_$1") + str = str + .replace("%type%", def.type) + .replace(/([A-Z])/g, "_$1") .toLowerCase(); return str.startsWith("_") ? str.slice(1) : str; } diff --git a/packages/schema/bind/src/types.ts b/packages/schema/bind/src/types.ts index dca0689457..c7c5b8504a 100644 --- a/packages/schema/bind/src/types.ts +++ b/packages/schema/bind/src/types.ts @@ -1,7 +1,12 @@ import { OutputDirectory } from "@polywrap/os-js"; import { WrapAbi } from "@polywrap/schema-parse"; -export type BindLanguage = "wasm-as" | "wasm-rs" | "wasm-go" | "plugin-ts" | "app-ts"; +export type BindLanguage = + | "wasm-as" + | "wasm-rs" + | "wasm-go" + | "plugin-ts" + | "app-ts"; export interface BindOutput { output: OutputDirectory; From 99a31ac992da8329d32a390571ef06d227b5a650 Mon Sep 17 00:00:00 2001 From: ramil Date: Tue, 23 Aug 2022 15:43:02 +0300 Subject: [PATCH 010/181] don't filter for wasm-go codegen --- packages/schema/bind/src/__tests__/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/schema/bind/src/__tests__/index.ts b/packages/schema/bind/src/__tests__/index.ts index efe0d6ff43..1fd3557924 100644 --- a/packages/schema/bind/src/__tests__/index.ts +++ b/packages/schema/bind/src/__tests__/index.ts @@ -64,7 +64,6 @@ export function fetchTestCases(): TestCases { const outputLanguages = fs .readdirSync(outputDir, { withFileTypes: true }) .filter((item: fs.Dirent) => item.isDirectory()) - .filter((item: fs.Dirent) => item.name == "wasm-go") .map((item: fs.Dirent) => { return { language: item.name, From 6d637e4aee795435d83f48ad5c8afe7da9f28052 Mon Sep 17 00:00:00 2001 From: ramil Date: Tue, 23 Aug 2022 17:34:04 +0300 Subject: [PATCH 011/181] fix tests regarding latest changes from origin --- packages/schema/bind/src/__tests__/index.ts | 1 + .../golang/{wasm-go => }/functions.ts | 2 +- .../schema/bind/src/bindings/golang/index.ts | 3 + .../golang/{wasm-go => }/reservedWords.ts | 0 .../golang/{wasm-go/baseTypes.ts => types.ts} | 6 +- .../golang/{wasm-go => wasm}/index.ts | 155 ++++++++++-------- .../templates/deserialize_array.mustache | 0 .../templates/deserialize_enum.mustache | 0 .../templates/deserialize_map.mustache | 0 .../templates/deserialize_object.mustache | 0 .../templates/deserialize_scalar.mustache | 0 .../enum-type/Enum%type%-go.mustache | 0 .../templates/env-type/Env%type%-go.mustache | 0 .../Env%type%Serialization-go.mustache | 0 .../imported/enum-type/Enum%type%-go.mustache | 0 .../imported/env-type/Env%type%-go.mustache | 0 .../Env%type%Serialization-go.mustache | 0 .../interface-type/%type%-go.mustache | 0 .../%type%Serialization-go.mustache | 0 .../module-type/%type%Wrapped-go.mustache | 0 .../object-type/Object%type%-go.mustache | 0 .../Object%type%Serialization-go.mustache | 0 .../interface-type/%type%-go.mustache | 0 .../templates/main-go.mustache | 0 .../%type%Serialization-go.mustache | 0 .../module-type/%type%Wrapped-go.mustache | 0 .../object-type/Object%type%-go.mustache | 0 .../Object%type%Serialization-go.mustache | 0 .../templates/serialize_array.mustache | 0 .../templates/serialize_enum.mustache | 0 .../templates/serialize_map.mustache | 0 .../templates/serialize_object.mustache | 0 .../templates/serialize_scalar.mustache | 0 .../value_deserialize_array.mustache | 0 .../templates/value_deserialize_enum.mustache | 0 .../templates/value_deserialize_map.mustache | 0 .../value_deserialize_object.mustache | 0 .../value_deserialize_scalar.mustache | 0 .../templates/value_serialize_array.mustache | 0 .../templates/value_serialize_enum.mustache | 0 .../templates/value_serialize_map.mustache | 0 .../templates/value_serialize_object.mustache | 0 .../templates/value_serialize_scalar.mustache | 0 .../cases/bind/sanity/output/wasm-go/main.go | 2 + .../sanity/output/wasm-go/types/enumwhile.go | 38 +++++ .../wasm-go/types/module_serialization.go | 53 ++++++ .../output/wasm-go/types/module_wrapped.go | 9 + .../wasm-go/types/object_custom_map_value.go | 25 +++ .../object_custom_map_value_serialization.go | 56 +++++++ .../wasm-go/types/object_custom_type.go | 1 + .../types/object_custom_type_serialization.go | 40 ++++- .../sanity/output/wasm-go/types/objectelse.go | 25 +++ .../wasm-go/types/objectelse_serialization.go | 56 +++++++ 53 files changed, 399 insertions(+), 73 deletions(-) rename packages/schema/bind/src/bindings/golang/{wasm-go => }/functions.ts (99%) create mode 100644 packages/schema/bind/src/bindings/golang/index.ts rename packages/schema/bind/src/bindings/golang/{wasm-go => }/reservedWords.ts (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go/baseTypes.ts => types.ts} (71%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/index.ts (57%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/deserialize_array.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/deserialize_enum.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/deserialize_map.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/deserialize_object.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/deserialize_scalar.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/enum-type/Enum%type%-go.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/env-type/Env%type%-go.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/env-type/Env%type%Serialization-go.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/imported/enum-type/Enum%type%-go.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/imported/env-type/Env%type%-go.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/imported/env-type/Env%type%Serialization-go.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/imported/interface-type/%type%-go.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/imported/module-type/%type%Serialization-go.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/imported/module-type/%type%Wrapped-go.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/imported/object-type/Object%type%-go.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/imported/object-type/Object%type%Serialization-go.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/interface-type/%type%-go.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/main-go.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/module-type/%type%Serialization-go.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/module-type/%type%Wrapped-go.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/object-type/Object%type%-go.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/object-type/Object%type%Serialization-go.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/serialize_array.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/serialize_enum.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/serialize_map.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/serialize_object.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/serialize_scalar.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/value_deserialize_array.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/value_deserialize_enum.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/value_deserialize_map.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/value_deserialize_object.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/value_deserialize_scalar.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/value_serialize_array.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/value_serialize_enum.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/value_serialize_map.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/value_serialize_object.mustache (100%) rename packages/schema/bind/src/bindings/golang/{wasm-go => wasm}/templates/value_serialize_scalar.mustache (100%) create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/types/enumwhile.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value_serialization.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse.go create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse_serialization.go diff --git a/packages/schema/bind/src/__tests__/index.ts b/packages/schema/bind/src/__tests__/index.ts index 1fd3557924..efe0d6ff43 100644 --- a/packages/schema/bind/src/__tests__/index.ts +++ b/packages/schema/bind/src/__tests__/index.ts @@ -64,6 +64,7 @@ export function fetchTestCases(): TestCases { const outputLanguages = fs .readdirSync(outputDir, { withFileTypes: true }) .filter((item: fs.Dirent) => item.isDirectory()) + .filter((item: fs.Dirent) => item.name == "wasm-go") .map((item: fs.Dirent) => { return { language: item.name, diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts b/packages/schema/bind/src/bindings/golang/functions.ts similarity index 99% rename from packages/schema/bind/src/bindings/golang/wasm-go/functions.ts rename to packages/schema/bind/src/bindings/golang/functions.ts index d73d73fb4b..2590d0b782 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/functions.ts +++ b/packages/schema/bind/src/bindings/golang/functions.ts @@ -1,5 +1,5 @@ import { reservedWordsAS } from "./reservedWords"; -import { MustacheFn } from "../../types"; +import { MustacheFn } from "../types"; let num = -1; diff --git a/packages/schema/bind/src/bindings/golang/index.ts b/packages/schema/bind/src/bindings/golang/index.ts new file mode 100644 index 0000000000..a01310ad9e --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/index.ts @@ -0,0 +1,3 @@ +export * as Wasm from "./wasm"; +export * as Functions from "./functions"; +export * as Types from "./types"; diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/reservedWords.ts b/packages/schema/bind/src/bindings/golang/reservedWords.ts similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/reservedWords.ts rename to packages/schema/bind/src/bindings/golang/reservedWords.ts diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/baseTypes.ts b/packages/schema/bind/src/bindings/golang/types.ts similarity index 71% rename from packages/schema/bind/src/bindings/golang/wasm-go/baseTypes.ts rename to packages/schema/bind/src/bindings/golang/types.ts index e667344d20..e57c1b9b88 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/baseTypes.ts +++ b/packages/schema/bind/src/bindings/golang/types.ts @@ -1,4 +1,4 @@ -const baseTypes = { +const types = { u8: "u8", u16: "u16", u32: "u32", @@ -9,10 +9,10 @@ const baseTypes = { bool: "bool", }; -export type BaseTypes = typeof baseTypes; +export type BaseTypes = typeof types; export type BaseType = keyof BaseTypes; export function isBaseType(type: string): type is BaseType { - return type in baseTypes; + return type in types; } diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/index.ts b/packages/schema/bind/src/bindings/golang/wasm/index.ts similarity index 57% rename from packages/schema/bind/src/bindings/golang/wasm-go/index.ts rename to packages/schema/bind/src/bindings/golang/wasm/index.ts index edb7df1988..d1a7a96300 100644 --- a/packages/schema/bind/src/bindings/golang/wasm-go/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm/index.ts @@ -1,6 +1,7 @@ -import * as Functions from "./functions"; +import { Functions } from "../"; import { GenerateBindingFn } from "../.."; -import { renderTemplates, loadSubTemplates } from "../../utils/templates"; +import { renderTemplates } from "../.."; +import { loadSubTemplates } from "../../utils"; import { BindOptions, BindOutput } from "../../.."; import { @@ -37,71 +38,81 @@ export const generateBinding: GenerateBindingFn = ( const abi = applyTransforms(options.abi); // Generate object type folders - for (const objectType of abi.objectTypes) { - output.entries.push({ - type: "Directory", - name: "types", - data: renderTemplates( - templatePath("object-type"), - objectType, - subTemplates - ), - }); + if (abi.objectTypes) { + for (const objectType of abi.objectTypes) { + output.entries.push({ + type: "Directory", + name: "types", + data: renderTemplates( + templatePath("object-type"), + objectType, + subTemplates + ), + }); + } } // Generate imported folder const importEntries: OutputEntry[] = []; // Generate imported module type folders - for (const importedModuleType of abi.importedModuleTypes) { - importEntries.push({ - type: "Directory", - name: `${camel2snake(importedModuleType.namespace)}`, - data: renderTemplates( - templatePath("imported/module-type"), - importedModuleType, - subTemplates - ), - }); + if (abi.importedModuleTypes) { + for (const importedModuleType of abi.importedModuleTypes) { + importEntries.push({ + type: "Directory", + name: `${camel2snake(importedModuleType.namespace)}`, + data: renderTemplates( + templatePath("imported/module-type"), + importedModuleType, + subTemplates + ), + }); + } } // // Generate imported env type folders - for (const importedEnvType of abi.importedEnvTypes) { - importEntries.push({ - type: "Directory", - name: `${camel2snake(importedEnvType.namespace)}`, - data: renderTemplates( - templatePath("imported/env-type"), - importedEnvType, - subTemplates - ), - }); + if (abi.importedEnvTypes) { + for (const importedEnvType of abi.importedEnvTypes) { + importEntries.push({ + type: "Directory", + name: `${camel2snake(importedEnvType.namespace)}`, + data: renderTemplates( + templatePath("imported/env-type"), + importedEnvType, + subTemplates + ), + }); + } } // Generate imported enum type folders - for (const importedEnumType of abi.importedEnumTypes) { - importEntries.push({ - type: "Directory", - name: `${camel2snake(importedEnumType.namespace)}`, - data: renderTemplates( - templatePath("imported/enum-type"), - importedEnumType, - subTemplates - ), - }); + if (abi.importedEnumTypes) { + for (const importedEnumType of abi.importedEnumTypes) { + importEntries.push({ + type: "Directory", + name: `${camel2snake(importedEnumType.namespace)}`, + data: renderTemplates( + templatePath("imported/enum-type"), + importedEnumType, + subTemplates + ), + }); + } } // Generate imported object type folders - for (const importedObectType of abi.importedObjectTypes) { - importEntries.push({ - type: "Directory", - name: `${camel2snake(importedObectType.namespace)}`, - data: renderTemplates( - templatePath("imported/object-type"), - importedObectType, - subTemplates - ), - }); + if (abi.importedObjectTypes) { + for (const importedObectType of abi.importedObjectTypes) { + importEntries.push({ + type: "Directory", + name: `${camel2snake(importedObectType.namespace)}`, + data: renderTemplates( + templatePath("imported/object-type"), + importedObectType, + subTemplates + ), + }); + } } if (importEntries.length) { @@ -116,16 +127,18 @@ export const generateBinding: GenerateBindingFn = ( } // Generate interface type folders - for (const interfaceType of abi.interfaceTypes) { - output.entries.push({ - type: "Directory", - name: "interfaces", - data: renderTemplates( - templatePath("interface-type"), - interfaceType, - subTemplates - ), - }); + if (abi.interfaceTypes) { + for (const interfaceType of abi.interfaceTypes) { + output.entries.push({ + type: "Directory", + name: "interfaces", + data: renderTemplates( + templatePath("interface-type"), + interfaceType, + subTemplates + ), + }); + } } // Generate module type folders @@ -142,12 +155,18 @@ export const generateBinding: GenerateBindingFn = ( } // Generate enum type folders - for (const enumType of abi.enumTypes) { - output.entries.push({ - type: "Directory", - name: "types", - data: renderTemplates(templatePath("enum-type"), enumType, subTemplates), - }); + if (abi.enumTypes) { + for (const enumType of abi.enumTypes) { + output.entries.push({ + type: "Directory", + name: "types", + data: renderTemplates( + templatePath("enum-type"), + enumType, + subTemplates + ), + }); + } } // Generate env type folders diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_array.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_array.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_array.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_enum.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_enum.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_enum.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_enum.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_map.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_map.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_map.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_map.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_object.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_object.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_object.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_scalar.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_scalar.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/deserialize_scalar.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_scalar.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/enum-type/Enum%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/enum-type/Enum%type%-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/enum-type/Enum%type%-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/enum-type/Enum%type%-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/env-type/Env%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/env-type/Env%type%-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/env-type/Env%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/env-type/Env%type%Serialization-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/enum-type/Enum%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/enum-type/Enum%type%-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/enum-type/Enum%type%-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/imported/enum-type/Enum%type%-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/env-type/Env%type%Serialization-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/interface-type/%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/interface-type/%type%-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/interface-type/%type%-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/imported/interface-type/%type%-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Serialization-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/module-type/%type%Wrapped-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/imported/object-type/Object%type%Serialization-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/interface-type/%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/interface-type/%type%-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/interface-type/%type%-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/interface-type/%type%-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/main-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/main-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Serialization-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Serialization-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Serialization-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Wrapped-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/module-type/%type%Wrapped-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Wrapped-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/object-type/Object%type%Serialization-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/serialize_array.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_array.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/serialize_array.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_enum.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/serialize_enum.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_enum.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/serialize_enum.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_map.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/serialize_map.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_map.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/serialize_map.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/serialize_object.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_object.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/serialize_object.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_scalar.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/serialize_scalar.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/serialize_scalar.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/serialize_scalar.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_array.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_array.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_array.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_enum.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_enum.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_enum.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_enum.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_map.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_map.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_map.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_map.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_object.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_object.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_object.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_scalar.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_scalar.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/value_deserialize_scalar.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_scalar.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_array.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_array.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_array.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_enum.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_enum.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_enum.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_enum.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_map.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_map.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_map.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_map.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_object.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_object.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_object.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_scalar.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_scalar.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm-go/templates/value_serialize_scalar.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_scalar.mustache diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go index 23ef94b6fb..c3782bf700 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go @@ -15,6 +15,8 @@ func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { return polywrap.WrapInvoke(args, envSize, module.ObjectMethodWrapped) case "optionalEnvMethod": return polywrap.WrapInvoke(args, envSize, module.OptionalEnvMethodWrapped) + case "if": + return polywrap.WrapInvoke(args, envSize, module.IfWrapped) default: return polywrap.WrapInvoke(args, envSize, nil) } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/enumwhile.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/enumwhile.go new file mode 100644 index 0000000000..16ed26f498 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/enumwhile.go @@ -0,0 +1,38 @@ +package types + +type While int32 + +const ( + Whilefor = iota + Whilein = iota + whileMax = iota +) + +func SanitizeWhileValue(value int32) { + if !(value >= 0 && value < int32(whileMax)) { + panic("Invalid value for enum 'While'") + } +} + +func GetWhileValue(key string) While { + switch key { + case "for": + return Whilefor + case "in": + return Whilein + default: + panic("Invalid key for enum 'While'") + } +} + +func GetWhileKey(value While) string { + SanitizeWhileValue(int32(value)) + switch value { + case Whilefor: + return "for" + case Whilein: + return "in" + default: + panic("Invalid value for enum 'While'") + } +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_serialization.go index 8bbc6a75a0..c59b6436ef 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_serialization.go @@ -434,3 +434,56 @@ func WriteOptionalEnvMethodResult(writer msgpack.Write, value *AnotherType) { } writer.Context().Pop() } + +type ArgsIf struct { + M_if else +} + +func DeserializeIfArgs(argsBuf []byte) *ArgsIf { + ctx := msgpack.NewContext("Deserializing module-type: If") + reader := msgpack.NewReadDecoder(ctx, argsBuf) + + var ( + _if else + _ifSet bool + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type") + reader.Context().Pop() + switch field { + case "M_if": + reader.Context().Push(field, "else", "type found, reading property") + if v := ElseRead(reader); v != nil { + _if = *v + } + _ifSet = true + reader.Context().Pop() + } + } + + if !_ifSet { + panic(reader.Context().PrintWithContext("Missing required property: 'if: else'")) + } + + return &ArgsIf{ + M_if: _if, + } +} + +func SerializeIfResult(value else) []byte { + ctx := msgpack.NewContext("Serializing module-type: If") + encoder := msgpack.NewWriteEncoder(ctx) + WriteIfResult(encoder, value); + return encoder.Buffer() +} + +func WriteIfResult(writer msgpack.Write, value else) { + writer.Context().Push("if", "else", "writing property") + { + v := value + ElseWrite(writer, &v) + } + writer.Context().Pop() +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_wrapped.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_wrapped.go index 8b77f7a4a8..089b9e3704 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_wrapped.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_wrapped.go @@ -43,3 +43,12 @@ func OptionalEnvMethodWrapped(argsBuf []byte, envSize uint32) []byte { return SerializeOptionalEnvMethodResult(result) } +func IfWrapped(argsBuf []byte, envSize uint32) []byte { + var env *Env + + args := DeserializeIfArgs(argsBuf) + + result := methods.If(args) + return SerializeIfResult(result) +} + diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value.go new file mode 100644 index 0000000000..155d3c7d21 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value.go @@ -0,0 +1,25 @@ +package types + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) + +type CustomMapValue struct { + Foo string +} + +func CustomMapValueToBuffer(value *CustomMapValue) []byte { + return serializeCustomMapValue(value) +} + +func CustomMapValueFromBuffer(data []byte) *CustomMapValue { + return deserializeCustomMapValue(data) +} + +func CustomMapValueWrite(writer msgpack.Write, value *CustomMapValue) { + writeCustomMapValue(writer, value) +} + +func CustomMapValueRead(reader msgpack.Read) *CustomMapValue { + return readCustomMapValue(reader) +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value_serialization.go new file mode 100644 index 0000000000..2e0ee49210 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value_serialization.go @@ -0,0 +1,56 @@ +package types + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) + +func serializeCustomMapValue(value *CustomMapValue) []byte { + ctx := msgpack.NewContext("Serializing (encoding) env-type: CustomMapValue") + encoder := msgpack.NewWriteEncoder(ctx) + writeCustomMapValue(encoder, value) + return encoder.Buffer() +} + +func writeCustomMapValue(writer msgpack.Write, value *CustomMapValue) { + writer.WriteMapLength(1) + writer.Context().Push("Foo", "string", "writing property") + writer.WriteString("Foo") + { + v := value.Foo + writer.WriteString(v) + } + writer.Context().Pop() +} + +func deserializeCustomMapValue(data []byte) *CustomMapValue { + ctx := msgpack.NewContext("Deserializing (decoding) env-type: CustomMapValue") + reader := msgpack.NewReadDecoder(ctx, data) + return readCustomMapValue(reader) +} + +func readCustomMapValue(reader msgpack.Read) *CustomMapValue { + var ( + _foo string + _fooSet bool + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type") + switch field { + case "Foo": + reader.Context().Push(field, "string", "type found, reading property") + _foo = reader.ReadString() + _fooSet = true + reader.Context().Pop() + } + reader.Context().Pop() + } + + if !_fooSet { + panic(reader.Context().PrintWithContext("Missing required property: 'foo: String'")) + } + return &CustomMapValue{ + Foo: _foo, + } +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go index d2198e9826..129eedcb94 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go @@ -48,6 +48,7 @@ type CustomType struct { MapOfArr map[string][]int32 MapOfObj map[string]AnotherType MapOfArrOfObj map[string][]AnotherType + MapCustomValue map[string]*CustomMapValue } func CustomTypeToBuffer(value *CustomType) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go index 74d75efa54..743b468443 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go @@ -14,7 +14,7 @@ func serializeCustomType(value *CustomType) []byte { } func writeCustomType(writer msgpack.Write, value *CustomType) { - writer.WriteMapLength(41) + writer.WriteMapLength(42) writer.Context().Push("Str", "string", "writing property") writer.WriteString("Str") { @@ -554,6 +554,22 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } } writer.Context().Pop() + writer.Context().Push("MapCustomValue", "map[string]*CustomMapValue", "writing property") + writer.WriteString("MapCustomValue") + if value.MapCustomValue == nil { + writer.WriteNil() + } else if len(value.MapCustomValue) == 0 { + writer.WriteNil() + } else { + for i0 := range value.MapCustomValue { + writer.WriteString(i0) + { + v := value.MapCustomValue[i0] + CustomMapValueWrite(writer, v) + } + } + } + writer.Context().Pop() } func deserializeCustomType(data []byte) *CustomType { @@ -631,6 +647,8 @@ func readCustomType(reader msgpack.Read) *CustomType { _mapOfObjSet bool _mapOfArrOfObj map[string][]AnotherType _mapOfArrOfObjSet bool + _mapCustomValue map[string]*CustomMapValue + _mapCustomValueSet bool ) for i := int32(reader.ReadMapLength()); i > 0; i-- { @@ -1083,6 +1101,22 @@ func readCustomType(reader msgpack.Read) *CustomType { } _mapOfArrOfObjSet = true reader.Context().Pop() + case "MapCustomValue": + reader.Context().Push(field, "map[string]*CustomMapValue", "type found, reading property") + if reader.IsNil() { + _mapCustomValue = nil + } else { + ln0 := reader.ReadMapLength() + _mapCustomValue = make(map[string]*CustomMapValue) + for j0 := uint32(0); j0 < ln0; j0++ { + i0 := reader.ReadString() + if v := CustomMapValueRead(reader); v != nil { + _mapCustomValue[i0] = v + } + } + } + _mapCustomValueSet = true + reader.Context().Pop() } reader.Context().Pop() } @@ -1165,6 +1199,9 @@ func readCustomType(reader msgpack.Read) *CustomType { if !_mapOfArrOfObjSet { panic(reader.Context().PrintWithContext("Missing required property: 'mapOfArrOfObj: Map'")) } + if !_mapCustomValueSet { + panic(reader.Context().PrintWithContext("Missing required property: 'mapCustomValue: Map'")) + } return &CustomType{ Str: _str, OptStr: _optStr, @@ -1207,5 +1244,6 @@ func readCustomType(reader msgpack.Read) *CustomType { MapOfArr: _mapOfArr, MapOfObj: _mapOfObj, MapOfArrOfObj: _mapOfArrOfObj, + MapCustomValue: _mapCustomValue, } } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse.go new file mode 100644 index 0000000000..3a1d9679c3 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse.go @@ -0,0 +1,25 @@ +package types + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) + +type Else struct { + M_else string +} + +func ElseToBuffer(value *Else) []byte { + return serializeElse(value) +} + +func ElseFromBuffer(data []byte) *Else { + return deserializeElse(data) +} + +func ElseWrite(writer msgpack.Write, value *Else) { + writeElse(writer, value) +} + +func ElseRead(reader msgpack.Read) *Else { + return readElse(reader) +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse_serialization.go new file mode 100644 index 0000000000..5aa212aca2 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse_serialization.go @@ -0,0 +1,56 @@ +package types + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) + +func serializeElse(value *Else) []byte { + ctx := msgpack.NewContext("Serializing (encoding) env-type: Else") + encoder := msgpack.NewWriteEncoder(ctx) + writeElse(encoder, value) + return encoder.Buffer() +} + +func writeElse(writer msgpack.Write, value *Else) { + writer.WriteMapLength(1) + writer.Context().Push("M_else", "string", "writing property") + writer.WriteString("M_else") + { + v := value.M_else + writer.WriteString(v) + } + writer.Context().Pop() +} + +func deserializeElse(data []byte) *Else { + ctx := msgpack.NewContext("Deserializing (decoding) env-type: Else") + reader := msgpack.NewReadDecoder(ctx, data) + return readElse(reader) +} + +func readElse(reader msgpack.Read) *Else { + var ( + _else string + _elseSet bool + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type") + switch field { + case "M_else": + reader.Context().Push(field, "string", "type found, reading property") + _else = reader.ReadString() + _elseSet = true + reader.Context().Pop() + } + reader.Context().Pop() + } + + if !_elseSet { + panic(reader.Context().PrintWithContext("Missing required property: 'else: String'")) + } + return &Else{ + M_else: _else, + } +} From a34daeb761a8d7c6a4b5bfc9018a353a6aabac9c Mon Sep 17 00:00:00 2001 From: n0cte Date: Wed, 24 Aug 2022 14:16:52 +0300 Subject: [PATCH 012/181] add golang package injection --- packages/schema/bind/src/bindings/golang/wasm/index.ts | 3 ++- .../templates/imported/module-type/%type%Wrapped-go.mustache | 1 - .../wasm/templates/module-type/%type%Wrapped-go.mustache | 2 +- .../imported/test_import/test_import__module_wrapped.go | 1 - .../cases/bind/sanity/output/wasm-go/types/module_wrapped.go | 2 +- 5 files changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/wasm/index.ts b/packages/schema/bind/src/bindings/golang/wasm/index.ts index d1a7a96300..44a6c56acc 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm/index.ts @@ -36,6 +36,7 @@ export const generateBinding: GenerateBindingFn = ( }; const output = result.output; const abi = applyTransforms(options.abi); + const goImport = "github.com/testorg/testrepo"; // Generate object type folders if (abi.objectTypes) { @@ -148,7 +149,7 @@ export const generateBinding: GenerateBindingFn = ( name: "types", data: renderTemplates( templatePath("module-type"), - abi.moduleType, + { goImport, ...abi.moduleType }, subTemplates ), }); diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache index 1340695e91..74b5f3e794 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache @@ -3,7 +3,6 @@ package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} {{#methods.length}} import ( "github.com/consideritdone/polywrap-go/polywrap" - "some/library/to/methods" ) {{/methods.length}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Wrapped-go.mustache index 3941f19b41..1d85289bdc 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Wrapped-go.mustache @@ -3,7 +3,7 @@ package types {{#methods.length}} import ( "github.com/consideritdone/polywrap-go/polywrap" - "some/library/to/methods" + methods "{{goImport}}" ) {{/methods.length}} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go index 9b45b19f55..9273cd4e30 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go @@ -2,7 +2,6 @@ package test_import import ( "github.com/consideritdone/polywrap-go/polywrap" - "some/library/to/methods" ) func MethodImportedMethod(uri string, args *ArgsImportedMethod) (*TestImport_Object, error) { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_wrapped.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_wrapped.go index 089b9e3704..4a0fd678b3 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_wrapped.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_wrapped.go @@ -2,7 +2,7 @@ package types import ( "github.com/consideritdone/polywrap-go/polywrap" - "some/library/to/methods" + methods "github.com/testorg/testrepo" ) func ModuleMethodWrapped(argsBuf []byte, envSize uint32) []byte { From 91ce0a8d4c30f4a02ccba1d7c8edbb68c2ea9178 Mon Sep 17 00:00:00 2001 From: ramil Date: Tue, 23 Aug 2022 17:53:29 +0300 Subject: [PATCH 013/181] remove debug --- packages/schema/bind/src/__tests__/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/schema/bind/src/__tests__/index.ts b/packages/schema/bind/src/__tests__/index.ts index efe0d6ff43..1fd3557924 100644 --- a/packages/schema/bind/src/__tests__/index.ts +++ b/packages/schema/bind/src/__tests__/index.ts @@ -64,7 +64,6 @@ export function fetchTestCases(): TestCases { const outputLanguages = fs .readdirSync(outputDir, { withFileTypes: true }) .filter((item: fs.Dirent) => item.isDirectory()) - .filter((item: fs.Dirent) => item.name == "wasm-go") .map((item: fs.Dirent) => { return { language: item.name, From e2506a8f4ecdbdbe849b7e6f57634d4530be4f6d Mon Sep 17 00:00:00 2001 From: ramil Date: Wed, 24 Aug 2022 18:15:30 +0300 Subject: [PATCH 014/181] add compiler options override for Golang --- packages/cli/lang/en.json | 4 +- packages/cli/lang/es.json | 4 +- .../build-images/wasm/golang/index.ts | 43 +++++++++++++++++++ .../cli/src/lib/project/PolywrapProject.ts | 4 +- packages/cli/src/lib/project/Project.ts | 3 +- .../project/manifests/polywrap/languages.ts | 3 ++ 6 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 packages/cli/src/lib/defaults/build-images/wasm/golang/index.ts diff --git a/packages/cli/lang/en.json b/packages/cli/lang/en.json index 82fd6532eb..479ee7250d 100644 --- a/packages/cli/lang/en.json +++ b/packages/cli/lang/en.json @@ -4,6 +4,7 @@ "commands_build_description": "Builds a wrapper", "commands_build_error_manifestPathMissing": "{option} option missing {argument} argument", "commands_build_error_manifestNotFound": "Manifest not found. Search paths used: {paths}", + "commands_build_error_goModNotFound": "go.mod file not found. Search paths used: {paths}", "commands_build_error_outputDirMissingPath": "{option} option missing {argument} argument", "commands_build_keypressListener_exit": "Exit: [CTRL + C], [ESC], or [Q]", "commands_build_keypressListener_watching": "Watching", @@ -279,6 +280,7 @@ "lib_typescript_tsNodeNotInstalled": "Your project uses typescript, but ts-node is not installed", "lib_watcher_alreadyWatching": "Watcher session is already in progress. Directory: {dir}", "lib_wasm_rust_invalidModule": "Module paths must point to Cargo.toml files. Found: {path}", + "lib_wasm_golang_invalidModule": "Module paths must point to go.mod file. Found: {path}", "lib_docker_invalidImageId": "Invalid docker image ID returned: {imageId}", "lib_docker_noInstall": "Docker executable not found in PATH", "lib_infra_unrecognizedModule": "Unrecognized modules: {modules}. Default modules: {defaultModules}", @@ -286,4 +288,4 @@ "lib_helpers_wrap_manifest_outputText": "WRAP manifest written in {path}", "lib_helpers_wrap_manifest_outputError": "Error writing WRAP manifest in {path}", "lib_helpers_wrap_manifest_outputWarning": "Warning writing WRAP manifest in {path}" -} \ No newline at end of file +} diff --git a/packages/cli/lang/es.json b/packages/cli/lang/es.json index 71a843e9b5..04a8edde74 100644 --- a/packages/cli/lang/es.json +++ b/packages/cli/lang/es.json @@ -4,6 +4,7 @@ "commands_build_description": "Builds a wrapper", "commands_build_error_manifestPathMissing": "{option} option missing {argument} argument", "commands_build_error_manifestNotFound": "Manifest not found. Search paths used: {paths}", + "commands_build_error_goModNotFound": "go.mod file not found. Search paths used: {paths}", "commands_build_error_outputDirMissingPath": "{option} option missing {argument} argument", "commands_build_keypressListener_exit": "Exit: [CTRL + C], [ESC], or [Q]", "commands_build_keypressListener_watching": "Watching", @@ -279,6 +280,7 @@ "lib_typescript_tsNodeNotInstalled": "Your project uses typescript, but ts-node is not installed", "lib_watcher_alreadyWatching": "Watcher session is already in progress. Directory: {dir}", "lib_wasm_rust_invalidModule": "Module paths must point to Cargo.toml files. Found: {path}", + "lib_wasm_golang_invalidModule": "Module paths must point to go.mod file. Found: {path}", "lib_docker_invalidImageId": "Invalid docker image ID returned: {imageId}", "lib_docker_noInstall": "Docker executable not found in PATH", "lib_infra_unrecognizedModule": "Unrecognized modules: {modules}. Default modules: {defaultModules}", @@ -286,4 +288,4 @@ "lib_helpers_wrap_manifest_outputText": "WRAP manifest written in {path}", "lib_helpers_wrap_manifest_outputError": "Error writing WRAP manifest in {path}", "lib_helpers_wrap_manifest_outputWarning": "Warning writing WRAP manifest in {path}" -} \ No newline at end of file +} diff --git a/packages/cli/src/lib/defaults/build-images/wasm/golang/index.ts b/packages/cli/src/lib/defaults/build-images/wasm/golang/index.ts new file mode 100644 index 0000000000..c10376bbd2 --- /dev/null +++ b/packages/cli/src/lib/defaults/build-images/wasm/golang/index.ts @@ -0,0 +1,43 @@ +import { CompilerOverrides } from "../../../../Compiler"; +import { intlMsg } from "../../../../intl"; +import { resolvePathIfExists } from "../../../../system"; + +import { PolywrapManifest } from "@polywrap/polywrap-manifest-types-js"; + +/** go.mod + * module bla-bla + */ +export function getCompilerOverrides(): CompilerOverrides { + let golangModuleName = ""; + return { + validateManifest: (manifest: PolywrapManifest) => { + const module = manifest.source.module; + + if (!module || module.indexOf("go.mod") === -1) { + throw Error( + intlMsg.lib_wasm_golang_invalidModule({ path: module as string }) + ); + } + const goModPaths = [module as string]; + const goModFile = resolvePathIfExists(goModPaths); + if (!goModFile) { + throw Error( + intlMsg.commands_build_error_goModNotFound({ + paths: module as string, + }) + ); + } + + // file open + // file parse + const value = "github.com/consideritdone/testproject"; + golangModuleName = value; + }, + getCompilerOptions: (): Record => { + return { + golangModuleName, + }; + }, + generationSubPath: "wrap", + }; +} diff --git a/packages/cli/src/lib/project/PolywrapProject.ts b/packages/cli/src/lib/project/PolywrapProject.ts index ddddb4e71b..5d57365746 100644 --- a/packages/cli/src/lib/project/PolywrapProject.ts +++ b/packages/cli/src/lib/project/PolywrapProject.ts @@ -144,7 +144,8 @@ export class PolywrapProject extends Project { public async generateSchemaBindings( abi: WrapAbi, - generationSubPath?: string + generationSubPath?: string, + bindConfig?: Record ): Promise { const manifest = await this.getManifest(); const module = manifest.source.module as string; @@ -165,6 +166,7 @@ export class PolywrapProject extends Project { abi, outputDirAbs: moduleDirectory, bindLanguage, + config: bindConfig, }; return bindSchema(options); diff --git a/packages/cli/src/lib/project/Project.ts b/packages/cli/src/lib/project/Project.ts index 3c47c1c170..4985f31f05 100644 --- a/packages/cli/src/lib/project/Project.ts +++ b/packages/cli/src/lib/project/Project.ts @@ -67,7 +67,8 @@ export abstract class Project { public abstract generateSchemaBindings( abi: Abi, - generationSubPath?: string + generationSubPath?: string, + bindConfig?: Record ): Promise; public get quiet(): boolean { diff --git a/packages/cli/src/lib/project/manifests/polywrap/languages.ts b/packages/cli/src/lib/project/manifests/polywrap/languages.ts index e5b4a9fe64..ab23979fd6 100644 --- a/packages/cli/src/lib/project/manifests/polywrap/languages.ts +++ b/packages/cli/src/lib/project/manifests/polywrap/languages.ts @@ -5,6 +5,7 @@ import { BindLanguage } from "@polywrap/schema-bind"; export const polywrapManifestLanguages = { "wasm/assemblyscript": "wasm/assemblyscript", "wasm/rust": "wasm/rust", + "wasm/golang": "wasm/golang", interface: "interface", }; @@ -26,6 +27,8 @@ export function polywrapManifestLanguageToBindLanguage( return "wasm-as"; case "wasm/rust": return "wasm-rs"; + case "wasm/golang": + return "wasm-go"; case "interface": throw Error(intlMsg.lib_language_noInterfaceCodegen()); default: From b29151f2967fb0904bcf880b670ae6aa8f249f40 Mon Sep 17 00:00:00 2001 From: ramil Date: Wed, 24 Aug 2022 18:21:45 +0300 Subject: [PATCH 015/181] add compiler options override for Golang --- packages/cli/src/lib/Compiler.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/cli/src/lib/Compiler.ts b/packages/cli/src/lib/Compiler.ts index 90dcfc8e04..97ac14c49b 100644 --- a/packages/cli/src/lib/Compiler.ts +++ b/packages/cli/src/lib/Compiler.ts @@ -36,6 +36,7 @@ interface CompilerState { export interface CompilerOverrides { validateManifest: (manifest: PolywrapManifest) => void; generationSubPath: string; + getCompilerOptions: () => Record; } export interface CompilerConfig { @@ -214,7 +215,8 @@ export class Compiler { // Generate the bindings const binding = await project.generateSchemaBindings( abi, - compilerOverrides?.generationSubPath + compilerOverrides?.generationSubPath, + compilerOverrides?.getCompilerOptions() ); // Output the bindings From 81dae40db74f864b8803ca785fa97f965ccf82a5 Mon Sep 17 00:00:00 2001 From: ramil Date: Wed, 24 Aug 2022 20:07:18 +0300 Subject: [PATCH 016/181] fix build for rust fix unit tests for golang wasm --- .../lib/defaults/build-images/wasm/rust/index.ts | 3 +++ .../schema/bind/src/__tests__/test-cases.spec.ts | 15 ++++++++++++--- .../schema/bind/src/bindings/golang/wasm/index.ts | 6 ++++-- .../golang/wasm/templates/main-go.mustache | 4 ++-- .../cases/bind/sanity/output/wasm-go/main.go | 10 +++++----- 5 files changed, 26 insertions(+), 12 deletions(-) diff --git a/packages/cli/src/lib/defaults/build-images/wasm/rust/index.ts b/packages/cli/src/lib/defaults/build-images/wasm/rust/index.ts index 76a98ca4af..71bcd78b74 100644 --- a/packages/cli/src/lib/defaults/build-images/wasm/rust/index.ts +++ b/packages/cli/src/lib/defaults/build-images/wasm/rust/index.ts @@ -12,6 +12,9 @@ export function getCompilerOverrides(): CompilerOverrides { throw Error(intlMsg.lib_wasm_rust_invalidModule({ path: module })); } }, + getCompilerOptions(): Record { + return {}; + }, generationSubPath: "src/wrap", }; } diff --git a/packages/schema/bind/src/__tests__/test-cases.spec.ts b/packages/schema/bind/src/__tests__/test-cases.spec.ts index 9617eb6587..722590bdf9 100644 --- a/packages/schema/bind/src/__tests__/test-cases.spec.ts +++ b/packages/schema/bind/src/__tests__/test-cases.spec.ts @@ -2,7 +2,7 @@ import { fetchTestCases } from "./index"; import { bindSchema, BindLanguage, - BindOutput + BindOutput, BindOptions } from "../"; import { @@ -37,10 +37,19 @@ describe("Polywrap Binding Test Suite", () => { outputDirAbs: testCase.input.outputDirAbs, }; - const output = bindSchema({ + const bindOptions: BindOptions = { ...testCase.input, bindLanguage: language as BindLanguage, - }); + }; + + if (language == "wasm-go") { + if (!bindOptions.config) { + bindOptions.config = {}; + } + bindOptions.config.golangModuleName = "github.com/testorg/testrepo"; + } + + const output = bindSchema(bindOptions); const sort = (array: OutputEntry[]): OutputEntry[] => { array.forEach((entry) => { diff --git a/packages/schema/bind/src/bindings/golang/wasm/index.ts b/packages/schema/bind/src/bindings/golang/wasm/index.ts index 44a6c56acc..78f3307e0a 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm/index.ts @@ -36,7 +36,7 @@ export const generateBinding: GenerateBindingFn = ( }; const output = result.output; const abi = applyTransforms(options.abi); - const goImport = "github.com/testorg/testrepo"; + const goImport = options.config?.golangModuleName; // Generate object type folders if (abi.objectTypes) { @@ -184,7 +184,9 @@ export const generateBinding: GenerateBindingFn = ( } // Generate root entry file - output.entries.push(...renderTemplates(templatePath(""), abi, subTemplates)); + output.entries.push( + ...renderTemplates(templatePath(""), { goImport, ...abi }, subTemplates) + ); output.entries = mergePaths(output.entries); return result; diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache index 9e70cc5fbd..a9a4eeeecd 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache @@ -1,7 +1,7 @@ package main import ( - "github.com/consideritdone/polywrap-go/examples/demo1/wrap/module" + "{{goImport}}/wrap/types" "github.com/consideritdone/polywrap-go/polywrap" ) @@ -12,7 +12,7 @@ func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { {{#moduleType}} {{#methods}} case "{{name}}": - return polywrap.WrapInvoke(args, envSize, module.{{#toUpper}}{{name}}{{/toUpper}}Wrapped) + return polywrap.WrapInvoke(args, envSize, types.{{#toUpper}}{{name}}{{/toUpper}}Wrapped) {{/methods}} {{/moduleType}} default: diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go index c3782bf700..c58ac39081 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go @@ -1,7 +1,7 @@ package main import ( - "github.com/consideritdone/polywrap-go/examples/demo1/wrap/module" + "github.com/testorg/testrepo/wrap/types" "github.com/consideritdone/polywrap-go/polywrap" ) @@ -10,13 +10,13 @@ func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { args := polywrap.WrapInvokeArgs(methodSize, argsSize) switch args.Method { case "moduleMethod": - return polywrap.WrapInvoke(args, envSize, module.ModuleMethodWrapped) + return polywrap.WrapInvoke(args, envSize, types.ModuleMethodWrapped) case "objectMethod": - return polywrap.WrapInvoke(args, envSize, module.ObjectMethodWrapped) + return polywrap.WrapInvoke(args, envSize, types.ObjectMethodWrapped) case "optionalEnvMethod": - return polywrap.WrapInvoke(args, envSize, module.OptionalEnvMethodWrapped) + return polywrap.WrapInvoke(args, envSize, types.OptionalEnvMethodWrapped) case "if": - return polywrap.WrapInvoke(args, envSize, module.IfWrapped) + return polywrap.WrapInvoke(args, envSize, types.IfWrapped) default: return polywrap.WrapInvoke(args, envSize, nil) } From 2586cc4bc00c77ea0fb4e7f873bd734ebc8fe17d Mon Sep 17 00:00:00 2001 From: n0cte Date: Wed, 24 Aug 2022 21:31:58 +0300 Subject: [PATCH 017/181] move env variable to desired section --- .../golang/wasm/templates/module-type/%type%Wrapped-go.mustache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Wrapped-go.mustache index 1d85289bdc..26b51462dc 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Wrapped-go.mustache @@ -9,8 +9,8 @@ import ( {{#methods}} func {{#toUpper}}{{name}}{{/toUpper}}Wrapped(argsBuf []byte, envSize uint32) []byte { - var env *Env {{#env}} + var env *Env {{#required}} if envSize == 0 { panic("Environment is not set, and it is required by method 'objectMethod'") From 43755c7e4381be5acbeb39c159453cdf6ff97bfb Mon Sep 17 00:00:00 2001 From: n0cte Date: Wed, 24 Aug 2022 21:33:03 +0300 Subject: [PATCH 018/181] allow go-package allocation in imports --- packages/schema/bind/src/bindings/golang/functions.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/schema/bind/src/bindings/golang/functions.ts b/packages/schema/bind/src/bindings/golang/functions.ts index 2590d0b782..c111697c57 100644 --- a/packages/schema/bind/src/bindings/golang/functions.ts +++ b/packages/schema/bind/src/bindings/golang/functions.ts @@ -99,6 +99,12 @@ export const makeImports: MustacheFn = () => { return (text: string, render: (template: string) => string): string => { const types = render(text).split(","); const exist: { [key: string]: boolean } = {}; + const pattern = new RegExp('^(https?:\\/\\/)?'+ // protocol + '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|'+ // domain name + '((\\d{1,3}\\.){3}\\d{1,3}))'+ // OR ip (v4) address + '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*'+ // port and path + '(\\?[;&a-z\\d%_.~+=-]*)?'+ // query string + '(\\#[-a-z\\d_]*)?$','i'); for (const t of types) { switch (t) { case "*big.Int": @@ -109,6 +115,11 @@ export const makeImports: MustacheFn = () => { case "*fastjson.Value": exist["github.com/valyala/fastjson"] = true; break; + default: + if (pattern.test(t)) { + exist[t] = true; + } + break; } } const imports: Array = [ From a3f884705cc6c8cae7c15e788625f89784ff1894 Mon Sep 17 00:00:00 2001 From: n0cte Date: Wed, 24 Aug 2022 21:33:39 +0300 Subject: [PATCH 019/181] custom types must be capitalized --- packages/schema/bind/src/bindings/golang/functions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/schema/bind/src/bindings/golang/functions.ts b/packages/schema/bind/src/bindings/golang/functions.ts index c111697c57..553d0e24c0 100644 --- a/packages/schema/bind/src/bindings/golang/functions.ts +++ b/packages/schema/bind/src/bindings/golang/functions.ts @@ -291,7 +291,7 @@ export const toWasm: MustacheFn = () => { type = `${type.replace("Enum_", "")}`; isEnum = true; } else { - type = `${type}`; + type = type.charAt(0).toUpperCase() + type.slice(1); } } From 095377b1f1db45b77767a495bcf8d19d71c456d2 Mon Sep 17 00:00:00 2001 From: n0cte Date: Wed, 24 Aug 2022 22:04:39 +0300 Subject: [PATCH 020/181] add mustache fn for checking scalar prefix --- .../bind/src/bindings/golang/functions.ts | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/packages/schema/bind/src/bindings/golang/functions.ts b/packages/schema/bind/src/bindings/golang/functions.ts index 553d0e24c0..bbdf53240f 100644 --- a/packages/schema/bind/src/bindings/golang/functions.ts +++ b/packages/schema/bind/src/bindings/golang/functions.ts @@ -217,6 +217,35 @@ export const toMsgPack: MustacheFn = () => { }; }; +export const typeable: MustacheFn = () => { + return (value: string, render: (template: string) => string) => { + let type = render(value); + switch (type) { + case "int8": + case "int16": + case "int32": + case "int64": + case "uint32": + case "uint8": + case "uint16": + case "uint32": + case "uint64": + case "string": + case "bool": + case "[]byte": + case "*big.Int": + case "*big.Int": + case "*fastjson.Value": + return type; + default: + if (type.startsWith("*")) { + return `*types.${type.slice(1)}`; + } + return `types.${type}`; + } + } +} + export const toWasm: MustacheFn = () => { return (value: string, render: (template: string) => string) => { let type = render(value); From cf49e7b137bd75cfcca5ec0ac011791fd18655f6 Mon Sep 17 00:00:00 2001 From: n0cte Date: Wed, 24 Aug 2022 22:37:17 +0300 Subject: [PATCH 021/181] split the module into two packages --- .../bind/src/bindings/golang/wasm/index.ts | 11 ++- .../golang/wasm/templates/main-go.mustache | 4 +- .../%type%Serialization-go.mustache | 20 ++--- .../{ => module}/%type%Wrapped-go.mustache | 2 +- .../module-type/types/%type%Args-go.mustache | 16 ++++ .../templates/value_serialize_object.mustache | 4 +- .../cases/bind/sanity/output/wasm-go/main.go | 10 +-- .../{types => module}/module_serialization.go | 74 ++++++------------- .../{types => module}/module_wrapped.go | 4 +- .../output/wasm-go/types/module_args.go | 36 +++++++++ 10 files changed, 101 insertions(+), 80 deletions(-) rename packages/schema/bind/src/bindings/golang/wasm/templates/module-type/{ => module}/%type%Serialization-go.mustache (81%) rename packages/schema/bind/src/bindings/golang/wasm/templates/module-type/{ => module}/%type%Wrapped-go.mustache (98%) create mode 100644 packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache rename packages/test-cases/cases/bind/sanity/output/wasm-go/{types => module}/module_serialization.go (87%) rename packages/test-cases/cases/bind/sanity/output/wasm-go/{types => module}/module_wrapped.go (96%) create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go diff --git a/packages/schema/bind/src/bindings/golang/wasm/index.ts b/packages/schema/bind/src/bindings/golang/wasm/index.ts index 78f3307e0a..3102d038b3 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm/index.ts @@ -148,7 +148,16 @@ export const generateBinding: GenerateBindingFn = ( type: "Directory", name: "types", data: renderTemplates( - templatePath("module-type"), + templatePath("module-type/types"), + { goImport, ...abi.moduleType }, + subTemplates + ), + }); + output.entries.push({ + type: "Directory", + name: "module", + data: renderTemplates( + templatePath("module-type/module"), { goImport, ...abi.moduleType }, subTemplates ), diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache index a9a4eeeecd..6a3450710c 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache @@ -1,7 +1,7 @@ package main import ( - "{{goImport}}/wrap/types" + "{{goImport}}/wrap/module" "github.com/consideritdone/polywrap-go/polywrap" ) @@ -12,7 +12,7 @@ func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { {{#moduleType}} {{#methods}} case "{{name}}": - return polywrap.WrapInvoke(args, envSize, types.{{#toUpper}}{{name}}{{/toUpper}}Wrapped) + return polywrap.WrapInvoke(args, envSize, module.{{#toUpper}}{{name}}{{/toUpper}}Wrapped) {{/methods}} {{/moduleType}} default: diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache similarity index 81% rename from packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Serialization-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache index 292aa1978d..2da6b2f512 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache @@ -1,17 +1,9 @@ -package types +package module -{{#makeImports}}{{#arguments}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/arguments}}{{/makeImports}} +{{#makeImports}}{{goImport}}/wrap/types,{{#arguments}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/arguments}}{{/makeImports}} {{#methods}} -type Args{{#toUpper}}{{name}}{{/toUpper}} struct { -{{#stuctProps}} -{{#arguments}} -{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} -{{/arguments}} -{{/stuctProps}} -} - -func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *Args{{#toUpper}}{{name}}{{/toUpper}} { +func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *types.Args{{#toUpper}}{{name}}{{/toUpper}} { ctx := msgpack.NewContext("Deserializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") {{#arguments.length}} reader := msgpack.NewReadDecoder(ctx, argsBuf) @@ -71,7 +63,7 @@ func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *Args{{#toU {{/arguments}} {{/arguments.length}} - return &Args{{#toUpper}}{{name}}{{/toUpper}}{ + return &types.Args{{#toUpper}}{{name}}{{/toUpper}}{ {{#stuctProps}} {{#arguments}} {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, @@ -80,14 +72,14 @@ func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *Args{{#toU } } -func Serialize{{#toUpper}}{{name}}{{/toUpper}}Result(value {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}) []byte { +func Serialize{{#toUpper}}{{name}}{{/toUpper}}Result(value {{#return}}{{#typeable}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/typeable}}{{/return}}) []byte { ctx := msgpack.NewContext("Serializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") encoder := msgpack.NewWriteEncoder(ctx) Write{{#toUpper}}{{name}}{{/toUpper}}Result(encoder, value); return encoder.Buffer() } -func Write{{#toUpper}}{{name}}{{/toUpper}}Result(writer msgpack.Write, value {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}) { +func Write{{#toUpper}}{{name}}{{/toUpper}}Result(writer msgpack.Write, value {{#return}}{{#typeable}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/typeable}}{{/return}}) { {{#return}} writer.Context().Push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") {{#scalar}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache similarity index 98% rename from packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Wrapped-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache index 26b51462dc..737b7ea2ab 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache @@ -1,4 +1,4 @@ -package types +package module {{#methods.length}} import ( diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache new file mode 100644 index 0000000000..8e777aaa0e --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache @@ -0,0 +1,16 @@ +package types + +{{#makeImports}}{{#arguments}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/arguments}}{{/makeImports}} + +{{#methods}} +type Args{{#toUpper}}{{name}}{{/toUpper}} struct { +{{#stuctProps}} +{{#arguments}} +{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} +{{/arguments}} +{{/stuctProps}} +} +{{^last}} + +{{/last}} +{{/methods}} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_object.mustache index 3b6ae4d7c6..b01650869d 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_object.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_object.mustache @@ -1,9 +1,9 @@ { v := value{{#lastFullIter}}i{{/lastFullIter}} {{#required}} - {{#toUpper}}{{type}}{{/toUpper}}Write(writer, &v) + types.{{#toUpper}}{{type}}{{/toUpper}}Write(writer, &v) {{/required}} {{^required}} - {{#toUpper}}{{type}}{{/toUpper}}Write(writer, v) + types.{{#toUpper}}{{type}}{{/toUpper}}Write(writer, v) {{/required}} } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go index c58ac39081..605398790b 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go @@ -1,7 +1,7 @@ package main import ( - "github.com/testorg/testrepo/wrap/types" + "github.com/testorg/testrepo/wrap/module" "github.com/consideritdone/polywrap-go/polywrap" ) @@ -10,13 +10,13 @@ func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { args := polywrap.WrapInvokeArgs(methodSize, argsSize) switch args.Method { case "moduleMethod": - return polywrap.WrapInvoke(args, envSize, types.ModuleMethodWrapped) + return polywrap.WrapInvoke(args, envSize, module.ModuleMethodWrapped) case "objectMethod": - return polywrap.WrapInvoke(args, envSize, types.ObjectMethodWrapped) + return polywrap.WrapInvoke(args, envSize, module.ObjectMethodWrapped) case "optionalEnvMethod": - return polywrap.WrapInvoke(args, envSize, types.OptionalEnvMethodWrapped) + return polywrap.WrapInvoke(args, envSize, module.OptionalEnvMethodWrapped) case "if": - return polywrap.WrapInvoke(args, envSize, types.IfWrapped) + return polywrap.WrapInvoke(args, envSize, module.IfWrapped) default: return polywrap.WrapInvoke(args, envSize, nil) } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go similarity index 87% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_serialization.go rename to packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go index c59b6436ef..b076f507c3 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go @@ -1,23 +1,11 @@ -package types +package module import ( "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/testorg/testrepo/wrap/types" ) -type ArgsModuleMethod struct { - Str string - OptStr *string - En CustomEnum - OptEnum *CustomEnum - EnumArray []CustomEnum - OptEnumArray []*CustomEnum - Map map[string]int32 - MapOfArr map[string][]int32 - MapOfObj map[string]AnotherType - MapOfArrOfObj map[string][]AnotherType -} - -func DeserializeModuleMethodArgs(argsBuf []byte) *ArgsModuleMethod { +func DeserializeModuleMethodArgs(argsBuf []byte) *types.ArgsModuleMethod { ctx := msgpack.NewContext("Deserializing module-type: ModuleMethod") reader := msgpack.NewReadDecoder(ctx, argsBuf) @@ -203,7 +191,7 @@ func DeserializeModuleMethodArgs(argsBuf []byte) *ArgsModuleMethod { panic(reader.Context().PrintWithContext("Missing required property: 'mapOfArrOfObj: Map'")) } - return &ArgsModuleMethod{ + return &types.ArgsModuleMethod{ Str: _str, OptStr: _optStr, En: _en, @@ -233,14 +221,7 @@ func WriteModuleMethodResult(writer msgpack.Write, value int32) { writer.Context().Pop() } -type ArgsObjectMethod struct { - Object AnotherType - OptObject *AnotherType - ObjectArray []AnotherType - OptObjectArray []*AnotherType -} - -func DeserializeObjectMethodArgs(argsBuf []byte) *ArgsObjectMethod { +func DeserializeObjectMethodArgs(argsBuf []byte) *types.ArgsObjectMethod { ctx := msgpack.NewContext("Deserializing module-type: ObjectMethod") reader := msgpack.NewReadDecoder(ctx, argsBuf) @@ -310,7 +291,7 @@ func DeserializeObjectMethodArgs(argsBuf []byte) *ArgsObjectMethod { panic(reader.Context().PrintWithContext("Missing required property: 'objectArray: [AnotherType]'")) } - return &ArgsObjectMethod{ + return &types.ArgsObjectMethod{ Object: _object, OptObject: _optObject, ObjectArray: _objectArray, @@ -318,30 +299,23 @@ func DeserializeObjectMethodArgs(argsBuf []byte) *ArgsObjectMethod { } } -func SerializeObjectMethodResult(value *AnotherType) []byte { +func SerializeObjectMethodResult(value *types.AnotherType) []byte { ctx := msgpack.NewContext("Serializing module-type: ObjectMethod") encoder := msgpack.NewWriteEncoder(ctx) WriteObjectMethodResult(encoder, value); return encoder.Buffer() } -func WriteObjectMethodResult(writer msgpack.Write, value *AnotherType) { +func WriteObjectMethodResult(writer msgpack.Write, value *types.AnotherType) { writer.Context().Push("objectMethod", "*AnotherType", "writing property") { v := value - AnotherTypeWrite(writer, v) + types.AnotherTypeWrite(writer, v) } writer.Context().Pop() } -type ArgsOptionalEnvMethod struct { - Object AnotherType - OptObject *AnotherType - ObjectArray []AnotherType - OptObjectArray []*AnotherType -} - -func DeserializeOptionalEnvMethodArgs(argsBuf []byte) *ArgsOptionalEnvMethod { +func DeserializeOptionalEnvMethodArgs(argsBuf []byte) *types.ArgsOptionalEnvMethod { ctx := msgpack.NewContext("Deserializing module-type: OptionalEnvMethod") reader := msgpack.NewReadDecoder(ctx, argsBuf) @@ -411,7 +385,7 @@ func DeserializeOptionalEnvMethodArgs(argsBuf []byte) *ArgsOptionalEnvMethod { panic(reader.Context().PrintWithContext("Missing required property: 'objectArray: [AnotherType]'")) } - return &ArgsOptionalEnvMethod{ + return &types.ArgsOptionalEnvMethod{ Object: _object, OptObject: _optObject, ObjectArray: _objectArray, @@ -419,32 +393,28 @@ func DeserializeOptionalEnvMethodArgs(argsBuf []byte) *ArgsOptionalEnvMethod { } } -func SerializeOptionalEnvMethodResult(value *AnotherType) []byte { +func SerializeOptionalEnvMethodResult(value *types.AnotherType) []byte { ctx := msgpack.NewContext("Serializing module-type: OptionalEnvMethod") encoder := msgpack.NewWriteEncoder(ctx) WriteOptionalEnvMethodResult(encoder, value); return encoder.Buffer() } -func WriteOptionalEnvMethodResult(writer msgpack.Write, value *AnotherType) { +func WriteOptionalEnvMethodResult(writer msgpack.Write, value *types.AnotherType) { writer.Context().Push("optionalEnvMethod", "*AnotherType", "writing property") { v := value - AnotherTypeWrite(writer, v) + types.AnotherTypeWrite(writer, v) } writer.Context().Pop() } -type ArgsIf struct { - M_if else -} - -func DeserializeIfArgs(argsBuf []byte) *ArgsIf { +func DeserializeIfArgs(argsBuf []byte) *types.ArgsIf { ctx := msgpack.NewContext("Deserializing module-type: If") reader := msgpack.NewReadDecoder(ctx, argsBuf) var ( - _if else + _if Else _ifSet bool ) @@ -454,7 +424,7 @@ func DeserializeIfArgs(argsBuf []byte) *ArgsIf { reader.Context().Pop() switch field { case "M_if": - reader.Context().Push(field, "else", "type found, reading property") + reader.Context().Push(field, "Else", "type found, reading property") if v := ElseRead(reader); v != nil { _if = *v } @@ -467,23 +437,23 @@ func DeserializeIfArgs(argsBuf []byte) *ArgsIf { panic(reader.Context().PrintWithContext("Missing required property: 'if: else'")) } - return &ArgsIf{ + return &types.ArgsIf{ M_if: _if, } } -func SerializeIfResult(value else) []byte { +func SerializeIfResult(value types.Else) []byte { ctx := msgpack.NewContext("Serializing module-type: If") encoder := msgpack.NewWriteEncoder(ctx) WriteIfResult(encoder, value); return encoder.Buffer() } -func WriteIfResult(writer msgpack.Write, value else) { - writer.Context().Push("if", "else", "writing property") +func WriteIfResult(writer msgpack.Write, value types.Else) { + writer.Context().Push("if", "Else", "writing property") { v := value - ElseWrite(writer, &v) + types.ElseWrite(writer, &v) } writer.Context().Pop() } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_wrapped.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go similarity index 96% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_wrapped.go rename to packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go index 4a0fd678b3..3e003cad4b 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_wrapped.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go @@ -1,4 +1,4 @@ -package types +package module import ( "github.com/consideritdone/polywrap-go/polywrap" @@ -6,7 +6,6 @@ import ( ) func ModuleMethodWrapped(argsBuf []byte, envSize uint32) []byte { - var env *Env args := DeserializeModuleMethodArgs(argsBuf) @@ -44,7 +43,6 @@ func OptionalEnvMethodWrapped(argsBuf []byte, envSize uint32) []byte { } func IfWrapped(argsBuf []byte, envSize uint32) []byte { - var env *Env args := DeserializeIfArgs(argsBuf) diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go new file mode 100644 index 0000000000..fba2f3ead7 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go @@ -0,0 +1,36 @@ +package types + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack" +) + +type ArgsModuleMethod struct { + Str string + OptStr *string + En CustomEnum + OptEnum *CustomEnum + EnumArray []CustomEnum + OptEnumArray []*CustomEnum + Map map[string]int32 + MapOfArr map[string][]int32 + MapOfObj map[string]AnotherType + MapOfArrOfObj map[string][]AnotherType +} + +type ArgsObjectMethod struct { + Object AnotherType + OptObject *AnotherType + ObjectArray []AnotherType + OptObjectArray []*AnotherType +} + +type ArgsOptionalEnvMethod struct { + Object AnotherType + OptObject *AnotherType + ObjectArray []AnotherType + OptObjectArray []*AnotherType +} + +type ArgsIf struct { + M_if Else +} From 7b07dc124b59d9f388fb1e7896932a0a3acd6fc7 Mon Sep 17 00:00:00 2001 From: n0cte Date: Wed, 24 Aug 2022 22:42:19 +0300 Subject: [PATCH 022/181] fix code linting --- .../bind/src/bindings/golang/functions.ts | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/functions.ts b/packages/schema/bind/src/bindings/golang/functions.ts index bbdf53240f..132a5962c7 100644 --- a/packages/schema/bind/src/bindings/golang/functions.ts +++ b/packages/schema/bind/src/bindings/golang/functions.ts @@ -99,12 +99,15 @@ export const makeImports: MustacheFn = () => { return (text: string, render: (template: string) => string): string => { const types = render(text).split(","); const exist: { [key: string]: boolean } = {}; - const pattern = new RegExp('^(https?:\\/\\/)?'+ // protocol - '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|'+ // domain name - '((\\d{1,3}\\.){3}\\d{1,3}))'+ // OR ip (v4) address - '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*'+ // port and path - '(\\?[;&a-z\\d%_.~+=-]*)?'+ // query string - '(\\#[-a-z\\d_]*)?$','i'); + const pattern = new RegExp( + "^(https?:\\/\\/)?" + // protocol + "((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|" + // domain name + "((\\d{1,3}\\.){3}\\d{1,3}))" + // OR ip (v4) address + "(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*" + // port and path + "(\\?[;&a-z\\d%_.~+=-]*)?" + // query string + "(\\#[-a-z\\d_]*)?$", + "i" + ); for (const t of types) { switch (t) { case "*big.Int": @@ -219,13 +222,12 @@ export const toMsgPack: MustacheFn = () => { export const typeable: MustacheFn = () => { return (value: string, render: (template: string) => string) => { - let type = render(value); + const type = render(value); switch (type) { case "int8": case "int16": case "int32": case "int64": - case "uint32": case "uint8": case "uint16": case "uint32": @@ -234,7 +236,6 @@ export const typeable: MustacheFn = () => { case "bool": case "[]byte": case "*big.Int": - case "*big.Int": case "*fastjson.Value": return type; default: @@ -243,8 +244,8 @@ export const typeable: MustacheFn = () => { } return `types.${type}`; } - } -} + }; +}; export const toWasm: MustacheFn = () => { return (value: string, render: (template: string) => string) => { From d9f7b293a68eb3dd938a99cd9f461d52efc11c7c Mon Sep 17 00:00:00 2001 From: ramil Date: Thu, 25 Aug 2022 14:35:09 +0300 Subject: [PATCH 023/181] parse go.mod file --- packages/cli/lang/en.json | 2 ++ packages/cli/lang/es.json | 2 ++ .../build-images/wasm/golang/index.ts | 25 ++++++++++++++++--- .../module/%type%Wrapped-go.mustache | 2 +- .../module-type/types/%type%Args-go.mustache | 3 +-- 5 files changed, 27 insertions(+), 7 deletions(-) diff --git a/packages/cli/lang/en.json b/packages/cli/lang/en.json index 479ee7250d..454322da69 100644 --- a/packages/cli/lang/en.json +++ b/packages/cli/lang/en.json @@ -251,6 +251,8 @@ "lib_helpers_deployManifestExt_loadError": "Failed to load deploy manifest extension from {path}", "lib_helpers_deployManifestExt_loadText": "Load manifest extension from {path}", "lib_helpers_deployManifestExt_loadWarning": "No manifest extension found in {path}", + "lib_helpers_gomod_unableToLoad": "Unable to load go.mod: {path}", + "lib_helpers_gomod_invalid": "Invalid format of go.mod: {path}", "lib_helpers_manifest_outputError": "Failed to output manifest to {path}", "lib_helpers_manifest_outputText": "Manifest written to {path}", "lib_helpers_manifest_outputWarning": "Warnings writing manifest to {path}", diff --git a/packages/cli/lang/es.json b/packages/cli/lang/es.json index 04a8edde74..372c4cbe4f 100644 --- a/packages/cli/lang/es.json +++ b/packages/cli/lang/es.json @@ -251,6 +251,8 @@ "lib_helpers_deployManifestExt_loadError": "Failed to load deploy manifest extension from {path}", "lib_helpers_deployManifestExt_loadText": "Load manifest extension from {path}", "lib_helpers_deployManifestExt_loadWarning": "No manifest extension found in {path}", + "lib_helpers_gomod_unableToLoad": "Unable to load go.mod: {path}", + "lib_helpers_gomod_invalid": "Invalid format of go.mod: {path}", "lib_helpers_manifest_outputError": "Failed to output manifest to {path}", "lib_helpers_manifest_outputText": "Manifest written to {path}", "lib_helpers_manifest_outputWarning": "Warnings writing manifest to {path}", diff --git a/packages/cli/src/lib/defaults/build-images/wasm/golang/index.ts b/packages/cli/src/lib/defaults/build-images/wasm/golang/index.ts index c10376bbd2..28031cd73f 100644 --- a/packages/cli/src/lib/defaults/build-images/wasm/golang/index.ts +++ b/packages/cli/src/lib/defaults/build-images/wasm/golang/index.ts @@ -3,6 +3,7 @@ import { intlMsg } from "../../../../intl"; import { resolvePathIfExists } from "../../../../system"; import { PolywrapManifest } from "@polywrap/polywrap-manifest-types-js"; +import fs from "fs"; /** go.mod * module bla-bla @@ -28,10 +29,7 @@ export function getCompilerOverrides(): CompilerOverrides { ); } - // file open - // file parse - const value = "github.com/consideritdone/testproject"; - golangModuleName = value; + golangModuleName = loadGoModeFile(module); }, getCompilerOptions: (): Record => { return { @@ -41,3 +39,22 @@ export function getCompilerOverrides(): CompilerOverrides { generationSubPath: "wrap", }; } + +function loadGoModeFile(filePath: string): string { + const goMod = fs.readFileSync(filePath, "utf-8"); + + if (!goMod) { + const noLoadMessage = intlMsg.lib_helpers_gomod_unableToLoad({ + path: filePath, + }); + throw Error(noLoadMessage); + } + + const regex = /module (.+)/m; + const module = goMod.match(regex); + if (!module || module.length != 2) { + throw Error(intlMsg.lib_helpers_gomod_invalid({ path: filePath })); + } + + return module[1]; +} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache index 737b7ea2ab..e644f895e1 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache @@ -3,7 +3,7 @@ package module {{#methods.length}} import ( "github.com/consideritdone/polywrap-go/polywrap" - methods "{{goImport}}" + methods "{{goImport}}/module" ) {{/methods.length}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache index 8e777aaa0e..6beabd9e0e 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache @@ -1,6 +1,5 @@ package types -{{#makeImports}}{{#arguments}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/arguments}}{{/makeImports}} {{#methods}} type Args{{#toUpper}}{{name}}{{/toUpper}} struct { @@ -13,4 +12,4 @@ type Args{{#toUpper}}{{name}}{{/toUpper}} struct { {{^last}} {{/last}} -{{/methods}} \ No newline at end of file +{{/methods}} From 6bf4b44c2197ac8756610c46de2ce59bbde5873c Mon Sep 17 00:00:00 2001 From: ramil Date: Thu, 25 Aug 2022 19:03:52 +0300 Subject: [PATCH 024/181] dockerfile for golang build --- .../build-images/wasm/golang/Dockerfile.mustache | 13 +++++++++++++ .../build-images/wasm/golang/polywrap.build.yaml | 3 +++ .../module-type/module/%type%Wrapped-go.mustache | 2 ++ 3 files changed, 18 insertions(+) create mode 100644 packages/cli/src/lib/defaults/build-images/wasm/golang/Dockerfile.mustache create mode 100644 packages/cli/src/lib/defaults/build-images/wasm/golang/polywrap.build.yaml diff --git a/packages/cli/src/lib/defaults/build-images/wasm/golang/Dockerfile.mustache b/packages/cli/src/lib/defaults/build-images/wasm/golang/Dockerfile.mustache new file mode 100644 index 0000000000..695273b82d --- /dev/null +++ b/packages/cli/src/lib/defaults/build-images/wasm/golang/Dockerfile.mustache @@ -0,0 +1,13 @@ +FROM consideritdone/polywrap-base-go:0.1.0 + +WORKDIR /project + +COPY . . + +RUN tinygo build -o main.wasm -target wasm-memory wrap/main.go + +# Make the build directory +RUN rm -rf ./build +RUN mkdir ./build + +RUN wasm-snip -o ./build/wrap.wasm main.wasm -p syscall runtime.ticks fd_write diff --git a/packages/cli/src/lib/defaults/build-images/wasm/golang/polywrap.build.yaml b/packages/cli/src/lib/defaults/build-images/wasm/golang/polywrap.build.yaml new file mode 100644 index 0000000000..9df4ff713b --- /dev/null +++ b/packages/cli/src/lib/defaults/build-images/wasm/golang/polywrap.build.yaml @@ -0,0 +1,3 @@ +format: 0.1.0 +docker: + dockerfile: ./Dockerfile.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache index e644f895e1..ae82e5b3c5 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache @@ -2,7 +2,9 @@ package module {{#methods.length}} import ( + {{#env}} "github.com/consideritdone/polywrap-go/polywrap" + {{/env}} methods "{{goImport}}/module" ) {{/methods.length}} From bca807f7d1ea3a15a2cd1e0452a0b2a19474e138 Mon Sep 17 00:00:00 2001 From: ramil Date: Sat, 27 Aug 2022 01:10:52 +0300 Subject: [PATCH 025/181] fix golang code generated --- .../src/lib/defaults/build-images/wasm/golang/index.ts | 4 ++-- .../module-type/module/%type%Serialization-go.mustache | 10 +++++----- .../module-type/module/%type%Wrapped-go.mustache | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/cli/src/lib/defaults/build-images/wasm/golang/index.ts b/packages/cli/src/lib/defaults/build-images/wasm/golang/index.ts index 28031cd73f..365b99b78e 100644 --- a/packages/cli/src/lib/defaults/build-images/wasm/golang/index.ts +++ b/packages/cli/src/lib/defaults/build-images/wasm/golang/index.ts @@ -19,7 +19,7 @@ export function getCompilerOverrides(): CompilerOverrides { intlMsg.lib_wasm_golang_invalidModule({ path: module as string }) ); } - const goModPaths = [module as string]; + const goModPaths = [`../${module}`, module as string]; const goModFile = resolvePathIfExists(goModPaths); if (!goModFile) { throw Error( @@ -29,7 +29,7 @@ export function getCompilerOverrides(): CompilerOverrides { ); } - golangModuleName = loadGoModeFile(module); + golangModuleName = loadGoModeFile(goModFile); }, getCompilerOptions: (): Record => { return { diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache index 2da6b2f512..6bd9f9c0f1 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache @@ -3,7 +3,7 @@ package module {{#makeImports}}{{goImport}}/wrap/types,{{#arguments}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/arguments}}{{/makeImports}} {{#methods}} -func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *types.Args{{#toUpper}}{{name}}{{/toUpper}} { +func deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *types.Args{{#toUpper}}{{name}}{{/toUpper}} { ctx := msgpack.NewContext("Deserializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") {{#arguments.length}} reader := msgpack.NewReadDecoder(ctx, argsBuf) @@ -22,10 +22,9 @@ func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *types.Args for i := int32(reader.ReadMapLength()); i > 0; i-- { field := reader.ReadString() reader.Context().Push(field, "unknown", "searching for property type") - reader.Context().Pop() switch field { {{#arguments}} - case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": + case "{{#handleKeywords}}{{name}}{{/handleKeywords}}": reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") {{#scalar}} {{> deserialize_scalar}} @@ -52,7 +51,8 @@ func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *types.Args reader.Context().Pop() {{/arguments}} } - } + reader.Context().Pop() + } {{#arguments}} {{#required}} @@ -107,4 +107,4 @@ func Write{{#toUpper}}{{name}}{{/toUpper}}Result(writer msgpack.Write, value {{# {{^last}} {{/last}} -{{/methods}} \ No newline at end of file +{{/methods}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache index ae82e5b3c5..f3da3b7cfe 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache @@ -25,7 +25,7 @@ func {{#toUpper}}{{name}}{{/toUpper}}Wrapped(argsBuf []byte, envSize uint32) []b {{/env}} {{#arguments.length}} - args := Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf) + args := deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf) {{/arguments.length}} result := methods.{{#toUpper}}{{name}}{{/toUpper}}({{#arguments.length}}args{{/arguments.length}}{{^arguments.length}}nil{{/arguments.length}}{{#env}}, env{{/env}}) From 2ae2c81d52971cb820091319d40cf9297606681f Mon Sep 17 00:00:00 2001 From: Ilnur Date: Tue, 6 Sep 2022 17:55:00 +0300 Subject: [PATCH 026/181] Golang: add test cases (#1198) * add test cases for simple types * add test wrappers for golang generator * add "asyncify"-wrapper and add tags "go:generate" * update wrapper's test cases --- .../asyncify/abis/memory-storage.graphql | 5 + .../cases/wrappers/wasm-go/asyncify/go.mod | 7 ++ .../cases/wrappers/wasm-go/asyncify/go.sum | 4 + .../wasm-go/asyncify/module/method.go | 107 ++++++++++++++++++ .../wasm-go/asyncify/polywrap.build.yaml | 5 + .../wrappers/wasm-go/asyncify/polywrap.yaml | 12 ++ .../wrappers/wasm-go/asyncify/schema.graphql | 62 ++++++++++ .../cases/wrappers/wasm-go/bigint-type/go.mod | 7 ++ .../cases/wrappers/wasm-go/bigint-type/go.sum | 4 + .../wasm-go/bigint-type/module/method.go | 21 ++++ .../wasm-go/bigint-type/polywrap.build.yaml | 5 + .../wasm-go/bigint-type/polywrap.yaml | 9 ++ .../wasm-go/bigint-type/schema.graphql | 12 ++ .../cases/wrappers/wasm-go/bytes-type/go.mod | 7 ++ .../cases/wrappers/wasm-go/bytes-type/go.sum | 4 + .../wasm-go/bytes-type/module/bytesMethod.go | 18 +++ .../wasm-go/bytes-type/polywrap.build.yaml | 6 + .../wrappers/wasm-go/bytes-type/polywrap.yaml | 9 ++ .../wasm-go/bytes-type/schema.graphql | 9 ++ .../cases/wrappers/wasm-go/enum-types/go.mod | 7 ++ .../cases/wrappers/wasm-go/enum-types/go.sum | 4 + .../wasm-go/enum-types/module/module.go | 13 +++ .../wasm-go/enum-types/polywrap.build.yaml | 4 + .../wrappers/wasm-go/enum-types/polywrap.yaml | 9 ++ .../wasm-go/enum-types/schema.graphql | 17 +++ .../wasm-go/env-types/external/go.mod | 7 ++ .../wasm-go/env-types/external/go.sum | 4 + .../env-types/external/module/module.go | 8 ++ .../env-types/external/polywrap.build.yaml | 4 + .../wasm-go/env-types/external/polywrap.yaml | 9 ++ .../wasm-go/env-types/external/schema.graphql | 8 ++ .../test-interface/polywrap.yaml | 6 + .../test-interface/schema.graphql | 13 +++ .../implementations/test-use-getImpl/go.mod | 7 ++ .../implementations/test-use-getImpl/go.sum | 4 + .../test-use-getImpl/module/module.go | 20 ++++ .../test-use-getImpl/polywrap.build.yaml | 5 + .../test-use-getImpl/polywrap.yaml | 12 ++ .../test-use-getImpl/schema.graphql | 13 +++ .../implementations/test-wrapper/go.mod | 7 ++ .../implementations/test-wrapper/go.sum | 4 + .../test-wrapper/module/module.go | 15 +++ .../test-wrapper/polywrap.build.yaml | 3 + .../test-wrapper/polywrap.yaml | 12 ++ .../test-wrapper/schema.graphql | 11 ++ .../wrappers/wasm-go/invalid-types/go.mod | 7 ++ .../wrappers/wasm-go/invalid-types/go.sum | 4 + .../wasm-go/invalid-types/module/module.go | 26 +++++ .../wasm-go/invalid-types/polywrap.build.yaml | 3 + .../wasm-go/invalid-types/polywrap.yaml | 9 ++ .../wasm-go/invalid-types/schema.graphql | 21 ++++ .../cases/wrappers/wasm-go/json-type/go.mod | 8 ++ .../cases/wrappers/wasm-go/json-type/go.sum | 4 + .../wasm-go/json-type/module/module.go | 40 +++++++ .../wasm-go/json-type/polywrap.build.yaml | 3 + .../wrappers/wasm-go/json-type/polywrap.yaml | 9 ++ .../wrappers/wasm-go/json-type/schema.graphql | 24 ++++ .../cases/wrappers/wasm-go/map-type/go.mod | 7 ++ .../cases/wrappers/wasm-go/map-type/go.sum | 4 + .../wasm-go/map-type/module/module.go | 17 +++ .../wasm-go/map-type/polywrap.build.yaml | 3 + .../wrappers/wasm-go/map-type/polywrap.yaml | 9 ++ .../wrappers/wasm-go/map-type/schema.graphql | 18 +++ .../wrappers/wasm-go/number-types/go.mod | 7 ++ .../wrappers/wasm-go/number-types/go.sum | 4 + .../wasm-go/number-types/module/module.go | 29 +++++ .../wasm-go/number-types/polywrap.build.yaml | 3 + .../wasm-go/number-types/polywrap.yaml | 9 ++ .../wasm-go/number-types/schema.graphql | 32 ++++++ .../wrappers/wasm-go/object-types/go.mod | 7 ++ .../wrappers/wasm-go/object-types/go.sum | 4 + .../wasm-go/object-types/module/module.go | 55 +++++++++ .../wasm-go/object-types/polywrap.build.yaml | 3 + .../wasm-go/object-types/polywrap.yaml | 9 ++ .../wasm-go/object-types/schema.graphql | 45 ++++++++ 75 files changed, 962 insertions(+) create mode 100644 packages/test-cases/cases/wrappers/wasm-go/asyncify/abis/memory-storage.graphql create mode 100644 packages/test-cases/cases/wrappers/wasm-go/asyncify/go.mod create mode 100644 packages/test-cases/cases/wrappers/wasm-go/asyncify/go.sum create mode 100644 packages/test-cases/cases/wrappers/wasm-go/asyncify/module/method.go create mode 100644 packages/test-cases/cases/wrappers/wasm-go/asyncify/polywrap.build.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/asyncify/polywrap.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/asyncify/schema.graphql create mode 100644 packages/test-cases/cases/wrappers/wasm-go/bigint-type/go.mod create mode 100644 packages/test-cases/cases/wrappers/wasm-go/bigint-type/go.sum create mode 100644 packages/test-cases/cases/wrappers/wasm-go/bigint-type/module/method.go create mode 100644 packages/test-cases/cases/wrappers/wasm-go/bigint-type/polywrap.build.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/bigint-type/polywrap.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/bigint-type/schema.graphql create mode 100644 packages/test-cases/cases/wrappers/wasm-go/bytes-type/go.mod create mode 100644 packages/test-cases/cases/wrappers/wasm-go/bytes-type/go.sum create mode 100644 packages/test-cases/cases/wrappers/wasm-go/bytes-type/module/bytesMethod.go create mode 100644 packages/test-cases/cases/wrappers/wasm-go/bytes-type/polywrap.build.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/bytes-type/polywrap.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/bytes-type/schema.graphql create mode 100644 packages/test-cases/cases/wrappers/wasm-go/enum-types/go.mod create mode 100644 packages/test-cases/cases/wrappers/wasm-go/enum-types/go.sum create mode 100644 packages/test-cases/cases/wrappers/wasm-go/enum-types/module/module.go create mode 100644 packages/test-cases/cases/wrappers/wasm-go/enum-types/polywrap.build.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/enum-types/polywrap.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/enum-types/schema.graphql create mode 100644 packages/test-cases/cases/wrappers/wasm-go/env-types/external/go.mod create mode 100644 packages/test-cases/cases/wrappers/wasm-go/env-types/external/go.sum create mode 100644 packages/test-cases/cases/wrappers/wasm-go/env-types/external/module/module.go create mode 100644 packages/test-cases/cases/wrappers/wasm-go/env-types/external/polywrap.build.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/env-types/external/polywrap.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/env-types/external/schema.graphql create mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-interface/polywrap.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-interface/schema.graphql create mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/go.mod create mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/go.sum create mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/module/module.go create mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/polywrap.build.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/polywrap.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/schema.graphql create mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/go.mod create mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/go.sum create mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/module/module.go create mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/polywrap.build.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/polywrap.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/schema.graphql create mode 100644 packages/test-cases/cases/wrappers/wasm-go/invalid-types/go.mod create mode 100644 packages/test-cases/cases/wrappers/wasm-go/invalid-types/go.sum create mode 100644 packages/test-cases/cases/wrappers/wasm-go/invalid-types/module/module.go create mode 100644 packages/test-cases/cases/wrappers/wasm-go/invalid-types/polywrap.build.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/invalid-types/polywrap.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/invalid-types/schema.graphql create mode 100644 packages/test-cases/cases/wrappers/wasm-go/json-type/go.mod create mode 100644 packages/test-cases/cases/wrappers/wasm-go/json-type/go.sum create mode 100644 packages/test-cases/cases/wrappers/wasm-go/json-type/module/module.go create mode 100644 packages/test-cases/cases/wrappers/wasm-go/json-type/polywrap.build.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/json-type/polywrap.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/json-type/schema.graphql create mode 100644 packages/test-cases/cases/wrappers/wasm-go/map-type/go.mod create mode 100644 packages/test-cases/cases/wrappers/wasm-go/map-type/go.sum create mode 100644 packages/test-cases/cases/wrappers/wasm-go/map-type/module/module.go create mode 100644 packages/test-cases/cases/wrappers/wasm-go/map-type/polywrap.build.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/map-type/polywrap.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/map-type/schema.graphql create mode 100644 packages/test-cases/cases/wrappers/wasm-go/number-types/go.mod create mode 100644 packages/test-cases/cases/wrappers/wasm-go/number-types/go.sum create mode 100644 packages/test-cases/cases/wrappers/wasm-go/number-types/module/module.go create mode 100644 packages/test-cases/cases/wrappers/wasm-go/number-types/polywrap.build.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/number-types/polywrap.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/number-types/schema.graphql create mode 100644 packages/test-cases/cases/wrappers/wasm-go/object-types/go.mod create mode 100644 packages/test-cases/cases/wrappers/wasm-go/object-types/go.sum create mode 100644 packages/test-cases/cases/wrappers/wasm-go/object-types/module/module.go create mode 100644 packages/test-cases/cases/wrappers/wasm-go/object-types/polywrap.build.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/object-types/polywrap.yaml create mode 100644 packages/test-cases/cases/wrappers/wasm-go/object-types/schema.graphql diff --git a/packages/test-cases/cases/wrappers/wasm-go/asyncify/abis/memory-storage.graphql b/packages/test-cases/cases/wrappers/wasm-go/asyncify/abis/memory-storage.graphql new file mode 100644 index 0000000000..c10ae67370 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/asyncify/abis/memory-storage.graphql @@ -0,0 +1,5 @@ +type Module { + getData: Int32! + + setData(value: Int32!): Boolean! +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/asyncify/go.mod b/packages/test-cases/cases/wrappers/wasm-go/asyncify/go.mod new file mode 100644 index 0000000000..dbfd3f2ddf --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/asyncify/go.mod @@ -0,0 +1,7 @@ +module github.com/testorg/testrepo + +go 1.17 + +require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba + +require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/asyncify/go.sum b/packages/test-cases/cases/wrappers/wasm-go/asyncify/go.sum new file mode 100644 index 0000000000..89ffed76d2 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/asyncify/go.sum @@ -0,0 +1,4 @@ +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= +github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= +github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/asyncify/module/method.go b/packages/test-cases/cases/wrappers/wasm-go/asyncify/module/method.go new file mode 100644 index 0000000000..636b37e9be --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/asyncify/module/method.go @@ -0,0 +1,107 @@ +package module + +import ( + "strconv" + + "github.com/testorg/testrepo/wrap/imported/storage" + "github.com/testorg/testrepo/wrap/types" +) + +//go:generate polywrap build -v -m ../polywrap.yaml -o ../build + +func GetData() uint32 { + res, err := storage.MethodGetData(nil) + if err != nil { + panic(err) + } + return uint32(res) +} + +func ReturnTrue() bool { + return true +} + +func SetDataWithLargeArgs(args *types.MethodArgsSetDataWithLargeArgs) string { + largeString := args.Value + num, err := strconv.ParseInt(largeString, 10, 32) + if err != nil { + panic(err) + } + _, err = storage.MethodSetData(&storage.ArgsSetData{Value: int32(num)}) + if err != nil { + panic(err) + } + return largeString +} + +func SetDataWithManyArgs(args *types.MethodArgsSetDataWithManyArgs) string { + argsA := args.ValueA + argsB := args.ValueB + argsC := args.ValueC + argsD := args.ValueD + argsE := args.ValueE + argsF := args.ValueF + argsG := args.ValueG + argsH := args.ValueH + argsI := args.ValueI + argsJ := args.ValueJ + argsK := args.ValueK + argsL := args.ValueL + + _, err := storage.MethodSetData(&storage.ArgsSetData{Value: 55}) + if err != nil { + panic(err) + } + + return argsA + argsB + argsC + argsD + argsE + argsF + argsG + argsH + argsI + argsJ + argsK + argsL +} + +func SetDataWithManyStructuredArgs(args *types.MethodArgsSetDataWithManyStructuredArgs) bool { + _, err := storage.MethodSetData(&storage.ArgsSetData{Value: 44}) + if err != nil { + panic(err) + } + return true +} + +func LocalVarMethod() bool { + functionArg := false + functionArg = ReturnTrue() + + _, err := storage.MethodSetData(&storage.ArgsSetData{Value: 88}) + if err != nil { + panic(err) + } + + return functionArg +} + +var globalValue bool = false + +func GlobalVarMethod() bool { + globalValue = true + + _, err := storage.MethodSetData(&storage.ArgsSetData{Value: 77}) + if err != nil { + panic(err) + } + + return globalValue +} + +func SubsequentInvokes(args *types.MethodArgsSubsequentInvokes) []string { + result := make([]string, args.NumberOfTimes) + for i := int32(0); i < args.NumberOfTimes; i++ { + _, err := storage.MethodSetData(&storage.ArgsSetData{Value: i}) + if err != nil { + panic(err) + } + res, err := storage.MethodGetData(nil) + if err != nil { + panic(err) + } + result[i] = strconv.FormatInt(int64(res), 10) + } + + return result +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/asyncify/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/asyncify/polywrap.build.yaml new file mode 100644 index 0000000000..e768939364 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/asyncify/polywrap.build.yaml @@ -0,0 +1,5 @@ +format: 0.1.0 +docker: + name: asyncify-wasm-go +config: + node_version: "16.13.0" diff --git a/packages/test-cases/cases/wrappers/wasm-go/asyncify/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/asyncify/polywrap.yaml new file mode 100644 index 0000000000..374d0c2aae --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/asyncify/polywrap.yaml @@ -0,0 +1,12 @@ +format: 0.2.0 +project: + name: Asyncify + type: wasm/golang +source: + schema: ./schema.graphql + module: ./go.mod + import_abis: + - uri: "ens/memory-storage.polywrap.eth" + abi: ./abis/memory-storage.graphql +extensions: + build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/asyncify/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/asyncify/schema.graphql new file mode 100644 index 0000000000..2660ba2f06 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/asyncify/schema.graphql @@ -0,0 +1,62 @@ +#import { Module } into Storage from "wrap://ens/memory-storage.polywrap.eth" + +type Module { + getData: UInt32! + + setDataWithLargeArgs( + value: String! + ): String! + + setDataWithManyArgs( + valueA: String! + valueB: String! + valueC: String! + valueD: String! + valueE: String! + valueF: String! + valueG: String! + valueH: String! + valueI: String! + valueJ: String! + valueK: String! + valueL: String! + ): String! + + setDataWithManyStructuredArgs( + valueA: BigObj! + valueB: BigObj! + valueC: BigObj! + valueD: BigObj! + valueE: BigObj! + valueF: BigObj! + valueG: BigObj! + valueH: BigObj! + valueI: BigObj! + valueJ: BigObj! + valueK: BigObj! + valueL: BigObj! + ): Boolean! + + localVarMethod: Boolean! + + globalVarMethod: Boolean! + + subsequentInvokes( + numberOfTimes: Int! + ): [String!]! +} + +type BigObj { + propA: String! + propB: String! + propC: String! + propD: String! + propE: String! + propF: String! + propG: String! + propH: String! + propI: String! + propJ: String! + propK: String! + propL: String! +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/go.mod b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/go.mod new file mode 100644 index 0000000000..dbfd3f2ddf --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/go.mod @@ -0,0 +1,7 @@ +module github.com/testorg/testrepo + +go 1.17 + +require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba + +require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/go.sum b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/go.sum new file mode 100644 index 0000000000..89ffed76d2 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/go.sum @@ -0,0 +1,4 @@ +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= +github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= +github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/module/method.go b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/module/method.go new file mode 100644 index 0000000000..0b0b81b7d4 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/module/method.go @@ -0,0 +1,21 @@ +package module + +import ( + "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + "github.com/testorg/testrepo/wrap/types" +) + +//go:generate polywrap build -v -m ../polywrap.yaml -o ../build +func Method(args *types.MethodArgsMethod) *big.Int { + result := new(big.Int).Mul(args.Arg1, args.Obj.Prop1) + + if args.Arg2 != nil { + result = result.Mul(result, args.Arg2) + } + + if args.Obj.Prop2 != nil { + result = result.Mul(result, args.Obj.Prop2) + } + + return result +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/polywrap.build.yaml new file mode 100644 index 0000000000..46c036809b --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/polywrap.build.yaml @@ -0,0 +1,5 @@ +format: 0.1.0 +docker: + name: bigint-type-wasm-go +config: + node_version: "16.13.0" diff --git a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/polywrap.yaml new file mode 100644 index 0000000000..bea7b6b71b --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/polywrap.yaml @@ -0,0 +1,9 @@ +format: 0.2.0 +project: + name: BigInt + type: wasm/golang +source: + schema: ./schema.graphql + module: ./go.mod +extensions: + build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/schema.graphql new file mode 100644 index 0000000000..7696ac2202 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/schema.graphql @@ -0,0 +1,12 @@ +type Module { + method( + arg1: BigInt! + arg2: BigInt + obj: BigIntArg! + ): BigInt! +} + +type BigIntArg { + prop1: BigInt! + prop2: BigInt +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/go.mod b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/go.mod new file mode 100644 index 0000000000..dbfd3f2ddf --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/go.mod @@ -0,0 +1,7 @@ +module github.com/testorg/testrepo + +go 1.17 + +require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba + +require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/go.sum b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/go.sum new file mode 100644 index 0000000000..89ffed76d2 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/go.sum @@ -0,0 +1,4 @@ +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= +github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= +github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/module/bytesMethod.go b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/module/bytesMethod.go new file mode 100644 index 0000000000..c57eba5f50 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/module/bytesMethod.go @@ -0,0 +1,18 @@ +package module + +import ( + "bytes" + + "github.com/testorg/testrepo/wrap/types" +) + +//go:generate polywrap build -v -m ../polywrap.yaml -o ../build +func BytesMethod(args *types.MethodArgsBytesMethod) []byte { + return bytes.Join( + [][]byte{ + args.Arg.Prop, + []byte("Sanity!"), + }, + []byte(" "), + ) +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/polywrap.build.yaml new file mode 100644 index 0000000000..2657f101fd --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/polywrap.build.yaml @@ -0,0 +1,6 @@ +format: 0.1.0 +docker: + name: bytes-type-wasm-go +config: + node_version: "16.13.0" + diff --git a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/polywrap.yaml new file mode 100644 index 0000000000..292392bba4 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/polywrap.yaml @@ -0,0 +1,9 @@ +format: 0.2.0 +project: + name: BytesType + type: wasm/golang +source: + schema: ./schema.graphql + module: ./go.mod +extensions: + build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/schema.graphql new file mode 100644 index 0000000000..44dc183585 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/schema.graphql @@ -0,0 +1,9 @@ +type Module { + bytesMethod( + arg: Args! + ): Bytes! +} + +type Args { + prop: Bytes! +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/enum-types/go.mod b/packages/test-cases/cases/wrappers/wasm-go/enum-types/go.mod new file mode 100644 index 0000000000..dbfd3f2ddf --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/enum-types/go.mod @@ -0,0 +1,7 @@ +module github.com/testorg/testrepo + +go 1.17 + +require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba + +require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/enum-types/go.sum b/packages/test-cases/cases/wrappers/wasm-go/enum-types/go.sum new file mode 100644 index 0000000000..89ffed76d2 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/enum-types/go.sum @@ -0,0 +1,4 @@ +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= +github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= +github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/enum-types/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/enum-types/module/module.go new file mode 100644 index 0000000000..9e91033414 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/enum-types/module/module.go @@ -0,0 +1,13 @@ +package module + +import "github.com/testorg/testrepo/wrap/types" + +//go:generate polywrap build -v -m ../polywrap.yaml -o ../build + +func Method1(args *types.MethodArgsMethod1) types.SanityEnum { + return args.En +} + +func Method2(args *types.MethodArgsMethod2) []types.SanityEnum { + return args.EnumArray +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/enum-types/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/enum-types/polywrap.build.yaml new file mode 100644 index 0000000000..f41ac3765e --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/enum-types/polywrap.build.yaml @@ -0,0 +1,4 @@ +format: 0.1.0 +config: + node_version: "16.13.0" + diff --git a/packages/test-cases/cases/wrappers/wasm-go/enum-types/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/enum-types/polywrap.yaml new file mode 100644 index 0000000000..49939f942e --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/enum-types/polywrap.yaml @@ -0,0 +1,9 @@ +format: 0.2.0 +project: + name: EnumTypes + type: wasm/golang +source: + schema: ./schema.graphql + module: ./go.mod +extensions: + build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/enum-types/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/enum-types/schema.graphql new file mode 100644 index 0000000000..3bfbc465be --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/enum-types/schema.graphql @@ -0,0 +1,17 @@ +type Module { + method1( + en: SanityEnum! + optEnum: SanityEnum + ): SanityEnum! + + method2( + enumArray: [SanityEnum!]! + optEnumArray: [SanityEnum] + ): [SanityEnum!]! +} + +enum SanityEnum { + OPTION1 + OPTION2 + OPTION3 +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/go.mod b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/go.mod new file mode 100644 index 0000000000..dbfd3f2ddf --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/go.mod @@ -0,0 +1,7 @@ +module github.com/testorg/testrepo + +go 1.17 + +require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba + +require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/go.sum b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/go.sum new file mode 100644 index 0000000000..89ffed76d2 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/go.sum @@ -0,0 +1,4 @@ +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= +github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= +github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/module/module.go new file mode 100644 index 0000000000..63caecec92 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/module/module.go @@ -0,0 +1,8 @@ +package module + +import "github.com/testorg/testrepo/wrap/types" + +//go:generate polywrap build -v -m ../polywrap.yaml -o ../build +func ExternalEnvMethod(env *types.Env) types.Env { + return *env +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/polywrap.build.yaml new file mode 100644 index 0000000000..f41ac3765e --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/polywrap.build.yaml @@ -0,0 +1,4 @@ +format: 0.1.0 +config: + node_version: "16.13.0" + diff --git a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/polywrap.yaml new file mode 100644 index 0000000000..065819aec2 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/polywrap.yaml @@ -0,0 +1,9 @@ +format: 0.2.0 +project: + name: EnvTypeExternal + type: wasm/golang +source: + schema: ./schema.graphql + module: ./go.mod +extensions: + build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/schema.graphql new file mode 100644 index 0000000000..d2325113e2 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/schema.graphql @@ -0,0 +1,8 @@ +type Env { + externalArray: [UInt32!]! + externalString: String! +} + +type Module { + externalEnvMethod: Env! @env(required: true) +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-interface/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-interface/polywrap.yaml new file mode 100644 index 0000000000..b2e18e3c2f --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-interface/polywrap.yaml @@ -0,0 +1,6 @@ +format: 0.2.0 +project: + name: TestInterface + type: interface +source: + schema: ./schema.graphql diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-interface/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-interface/schema.graphql new file mode 100644 index 0000000000..b80a6e620b --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-interface/schema.graphql @@ -0,0 +1,13 @@ +type Module { + abstractModuleMethod( + arg: Argument! + ): String! +} + +type Argument { + str: String! +} + +type InterfaceType { + uint8: UInt8! +} \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/go.mod b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/go.mod new file mode 100644 index 0000000000..dbfd3f2ddf --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/go.mod @@ -0,0 +1,7 @@ +module github.com/testorg/testrepo + +go 1.17 + +require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba + +require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/go.sum b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/go.sum new file mode 100644 index 0000000000..89ffed76d2 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/go.sum @@ -0,0 +1,4 @@ +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= +github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= +github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/module/module.go new file mode 100644 index 0000000000..9e4d85a0b2 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/module/module.go @@ -0,0 +1,20 @@ +package module + +import ( + "github.com/testorg/testrepo/wrap/interfaces" + "github.com/testorg/testrepo/wrap/types" +) + +//go:generate polywrap build -v -m ../polywrap.yaml -o ../build + +func ModuleImplementations() []string { + return interfaces.InterfaceImplementations() +} + +func ModuleMethod(args *types.MethodArgsModuleMethod) types.ImplementationType { + return args.Arg +} + +func AbstractModuleMethod(args *types.MethodArgsAbstractModuleMethod) string { + return args.Arg.Str +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/polywrap.build.yaml new file mode 100644 index 0000000000..a7ca19eefa --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/polywrap.build.yaml @@ -0,0 +1,5 @@ +format: 0.1.0 +docker: + name: test-use-get-impl-wasm-as +config: + node_version: "16.13.0" diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/polywrap.yaml new file mode 100644 index 0000000000..7d275c3de4 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/polywrap.yaml @@ -0,0 +1,12 @@ +format: 0.2.0 +project: + name: TestUseGetImpl + type: wasm/golang +source: + schema: ./schema.graphql + module: ./go.mod + import_abis: + - uri: wrap://ens/interface.eth + abi: ../test-interface/build/wrap.info +extensions: + build: ./polywrap.build.yaml diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/schema.graphql new file mode 100644 index 0000000000..bd51ae7828 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/schema.graphql @@ -0,0 +1,13 @@ +#import { Module, InterfaceType } into Interface from "wrap://ens/interface.eth" +#use { getImplementations } for Interface + +type Module implements Interface_Module { + moduleImplementations: [String!]! + moduleMethod( + arg: ImplementationType! + ): ImplementationType! +} + +type ImplementationType implements Interface_InterfaceType { + str: String! +} \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/go.mod b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/go.mod new file mode 100644 index 0000000000..dbfd3f2ddf --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/go.mod @@ -0,0 +1,7 @@ +module github.com/testorg/testrepo + +go 1.17 + +require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba + +require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/go.sum b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/go.sum new file mode 100644 index 0000000000..89ffed76d2 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/go.sum @@ -0,0 +1,4 @@ +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= +github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= +github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/module/module.go new file mode 100644 index 0000000000..53dcaeb681 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/module/module.go @@ -0,0 +1,15 @@ +package module + +import ( + "github.com/testorg/testrepo/wrap/types" +) + +//go:generate polywrap build -v -m ../polywrap.yaml -o ../build + +func ModuleMethod(args *types.MethodArgsModuleMethod) types.ImplementationType { + return args.Arg +} + +func AbstractModuleMethod(args *types.MethodArgsAbstractModuleMethod) string { + return args.Arg.Str +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/polywrap.build.yaml new file mode 100644 index 0000000000..aa5f7201ed --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/polywrap.build.yaml @@ -0,0 +1,3 @@ +format: 0.1.0 +config: + node_version: "16.13.0" diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/polywrap.yaml new file mode 100644 index 0000000000..c9fafb06d2 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/polywrap.yaml @@ -0,0 +1,12 @@ +format: 0.2.0 +project: + name: TestWrapper + type: wasm/golang +source: + schema: ./schema.graphql + module: ./go.mod + import_abis: + - uri: wrap://ens/interface.eth + abi: ../test-interface/build/wrap.info +extensions: + build: ./polywrap.build.yaml diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/schema.graphql new file mode 100644 index 0000000000..0b28cfb495 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/schema.graphql @@ -0,0 +1,11 @@ +#import { Module, InterfaceType } into Interface from "wrap://ens/interface.eth" + +type Module implements Interface_Module { + moduleMethod( + arg: ImplementationType! + ): ImplementationType! +} + +type ImplementationType implements Interface_InterfaceType { + str: String! +} \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/go.mod b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/go.mod new file mode 100644 index 0000000000..dbfd3f2ddf --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/go.mod @@ -0,0 +1,7 @@ +module github.com/testorg/testrepo + +go 1.17 + +require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba + +require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/go.sum b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/go.sum new file mode 100644 index 0000000000..89ffed76d2 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/go.sum @@ -0,0 +1,4 @@ +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= +github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= +github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/module/module.go new file mode 100644 index 0000000000..5981ee38b3 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/module/module.go @@ -0,0 +1,26 @@ +package module + +import ( + "github.com/testorg/testrepo/wrap/types" +) + +//go:generate polywrap build -v -m ../polywrap.yaml -o ../build +func BoolMethod(args *types.MethodArgsBoolMethod) bool { + return args.Arg +} + +func IntMethod(args *types.MethodArgsIntMethod) int32 { + return args.Arg +} + +func UIntMethod(args *types.MethodArgsUIntMethod) uint32 { + return args.Arg +} + +func BytesMethod(args *types.MethodArgsBytesMethod) []byte { + return args.Arg +} + +func ArrayMethod(args *types.MethodArgsArrayMethod) []string { + return args.Arg +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/polywrap.build.yaml new file mode 100644 index 0000000000..aa5f7201ed --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/polywrap.build.yaml @@ -0,0 +1,3 @@ +format: 0.1.0 +config: + node_version: "16.13.0" diff --git a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/polywrap.yaml new file mode 100644 index 0000000000..5b2b05d01b --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/polywrap.yaml @@ -0,0 +1,9 @@ +format: 0.2.0 +project: + name: InvalidTypes + type: wasm/golang +source: + schema: ./schema.graphql + module: ./go.mod +extensions: + build: ./polywrap.build.yaml diff --git a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/schema.graphql new file mode 100644 index 0000000000..5df1ac9c73 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/schema.graphql @@ -0,0 +1,21 @@ +type Module { + boolMethod( + arg: Boolean! + ): Boolean! + + intMethod( + arg: Int32! + ): Int32! + + uIntMethod( + arg: UInt32! + ): UInt32! + + bytesMethod( + arg: Bytes! + ): Bytes! + + arrayMethod( + arg: [String!]! + ): [String!] +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/json-type/go.mod b/packages/test-cases/cases/wrappers/wasm-go/json-type/go.mod new file mode 100644 index 0000000000..6018d3c1c5 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/json-type/go.mod @@ -0,0 +1,8 @@ +module github.com/testorg/testrepo + +go 1.17 + +require ( + github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba + github.com/valyala/fastjson v1.6.3 +) diff --git a/packages/test-cases/cases/wrappers/wasm-go/json-type/go.sum b/packages/test-cases/cases/wrappers/wasm-go/json-type/go.sum new file mode 100644 index 0000000000..89ffed76d2 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/json-type/go.sum @@ -0,0 +1,4 @@ +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= +github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= +github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/json-type/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/json-type/module/module.go new file mode 100644 index 0000000000..62ab2b2d04 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/json-type/module/module.go @@ -0,0 +1,40 @@ +package module + +import ( + "github.com/testorg/testrepo/wrap/types" + "github.com/valyala/fastjson" +) + +//go:generate polywrap build -v -m ../polywrap.yaml -o ../build + +func Parse(args *types.MethodArgsParse) *fastjson.Value { + return fastjson.MustParse(args.Value) +} + +func Stringify(args *types.MethodArgsStringify) string { + str := "" + for i := range args.Values { + str += args.Values[i].String() + } + return str +} + +func StringifyObject(args *types.MethodArgsStringifyObject) string { + str := "" + str += args.Object.JsonA.String() + str += args.Object.JsonB.String() + return str +} + +func MethodJSON(args *types.MethodArgsMethodJSON) *fastjson.Value { + arena := new(fastjson.Arena) + result := arena.NewObject() + result.Set("valueA", arena.NewNumberInt(int(args.ValueA))) + result.Set("valueB", arena.NewString(args.ValueB)) + if args.ValueC { + result.Set("valueC", arena.NewTrue()) + } else { + result.Set("valueC", arena.NewFalse()) + } + return result +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/json-type/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/json-type/polywrap.build.yaml new file mode 100644 index 0000000000..aa5f7201ed --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/json-type/polywrap.build.yaml @@ -0,0 +1,3 @@ +format: 0.1.0 +config: + node_version: "16.13.0" diff --git a/packages/test-cases/cases/wrappers/wasm-go/json-type/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/json-type/polywrap.yaml new file mode 100644 index 0000000000..91efb8d20a --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/json-type/polywrap.yaml @@ -0,0 +1,9 @@ +format: 0.2.0 +project: + name: JsonType + type: wasm/golang +source: + schema: ./schema.graphql + module: ./go.mod +extensions: + build: ./polywrap.build.yaml diff --git a/packages/test-cases/cases/wrappers/wasm-go/json-type/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/json-type/schema.graphql new file mode 100644 index 0000000000..cb60b87271 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/json-type/schema.graphql @@ -0,0 +1,24 @@ +type Module { + parse( + value: String! + ): JSON! + + stringify( + values: [JSON!]! + ): String! + + stringifyObject( + object: Object! + ): String! + + methodJSON( + valueA: Int! + valueB: String! + valueC: Boolean! + ): JSON! +} + +type Object { + jsonA: JSON! + jsonB: JSON! +} \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/map-type/go.mod b/packages/test-cases/cases/wrappers/wasm-go/map-type/go.mod new file mode 100644 index 0000000000..dbfd3f2ddf --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/map-type/go.mod @@ -0,0 +1,7 @@ +module github.com/testorg/testrepo + +go 1.17 + +require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba + +require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/map-type/go.sum b/packages/test-cases/cases/wrappers/wasm-go/map-type/go.sum new file mode 100644 index 0000000000..89ffed76d2 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/map-type/go.sum @@ -0,0 +1,4 @@ +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= +github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= +github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/map-type/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/map-type/module/module.go new file mode 100644 index 0000000000..511395f40e --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/map-type/module/module.go @@ -0,0 +1,17 @@ +package module + +import "github.com/testorg/testrepo/wrap/types" + +//go:generate polywrap build -v -m ../polywrap.yaml -o ../build + +func GetKey(args *types.MethodArgsGetKey) int32 { + return args.Foo.M_map[args.Key] +} + +func ReturnMap(args *types.MethodArgsReturnMap) map[string]int32 { + return args.M_map +} + +func ReturnCustomMap(args *types.MethodArgsReturnCustomMap) types.CustomMap { + return args.Foo +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/map-type/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/map-type/polywrap.build.yaml new file mode 100644 index 0000000000..aa5f7201ed --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/map-type/polywrap.build.yaml @@ -0,0 +1,3 @@ +format: 0.1.0 +config: + node_version: "16.13.0" diff --git a/packages/test-cases/cases/wrappers/wasm-go/map-type/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/map-type/polywrap.yaml new file mode 100644 index 0000000000..292392bba4 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/map-type/polywrap.yaml @@ -0,0 +1,9 @@ +format: 0.2.0 +project: + name: BytesType + type: wasm/golang +source: + schema: ./schema.graphql + module: ./go.mod +extensions: + build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/map-type/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/map-type/schema.graphql new file mode 100644 index 0000000000..b79ca553c5 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/map-type/schema.graphql @@ -0,0 +1,18 @@ +type Module { + getKey( + key: String! + foo: CustomMap! + ): Int! + + returnMap( + map: Map! @annotate(type: "Map!") + ): Map! @annotate(type: "Map!") + + returnCustomMap( + foo: CustomMap! + ): CustomMap! +} + +type CustomMap { + map: Map! @annotate(type: "Map!") +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/number-types/go.mod b/packages/test-cases/cases/wrappers/wasm-go/number-types/go.mod new file mode 100644 index 0000000000..dbfd3f2ddf --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/number-types/go.mod @@ -0,0 +1,7 @@ +module github.com/testorg/testrepo + +go 1.17 + +require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba + +require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/number-types/go.sum b/packages/test-cases/cases/wrappers/wasm-go/number-types/go.sum new file mode 100644 index 0000000000..89ffed76d2 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/number-types/go.sum @@ -0,0 +1,4 @@ +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= +github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= +github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/number-types/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/number-types/module/module.go new file mode 100644 index 0000000000..35be7fc298 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/number-types/module/module.go @@ -0,0 +1,29 @@ +package module + +import "github.com/testorg/testrepo/wrap/types" + +//go:generate polywrap build -v -m ../polywrap.yaml -o ../build + +func I8Method(args *types.MethodArgsI8Method) int8 { + return args.First + args.Second +} + +func U8Method(args *types.MethodArgsU8Method) uint8 { + return args.First + args.Second +} + +func I16Method(args *types.MethodArgsI16Method) int16 { + return args.First + args.Second +} + +func U16Method(args *types.MethodArgsU16Method) uint16 { + return args.First + args.Second +} + +func I32Method(args *types.MethodArgsI32Method) int32 { + return args.First + args.Second +} + +func U32Method(args *types.MethodArgsU32Method) uint32 { + return args.First + args.Second +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/number-types/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/number-types/polywrap.build.yaml new file mode 100644 index 0000000000..d16e9c9f18 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/number-types/polywrap.build.yaml @@ -0,0 +1,3 @@ +format: 0.1.0 +config: + node_version: "16.13.0" \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/number-types/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/number-types/polywrap.yaml new file mode 100644 index 0000000000..cbef1cd38d --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/number-types/polywrap.yaml @@ -0,0 +1,9 @@ +format: 0.2.0 +project: + name: NumberTypes + type: wasm/golang +source: + schema: ./schema.graphql + module: ./go.mod +extensions: + build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/number-types/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/number-types/schema.graphql new file mode 100644 index 0000000000..81d5005b5a --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/number-types/schema.graphql @@ -0,0 +1,32 @@ +type Module { + + i8Method( + first: Int8! + second: Int8! + ): Int8! + + u8Method( + first: UInt8! + second: UInt8! + ): UInt8! + + i16Method( + first: Int16! + second: Int16! + ): Int16! + + u16Method( + first: UInt16! + second: UInt16! + ): UInt16! + + i32Method( + first: Int! + second: Int! + ): Int! + + u32Method( + first: UInt32! + second: UInt32! + ): UInt32! +} \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/object-types/go.mod b/packages/test-cases/cases/wrappers/wasm-go/object-types/go.mod new file mode 100644 index 0000000000..dbfd3f2ddf --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/object-types/go.mod @@ -0,0 +1,7 @@ +module github.com/testorg/testrepo + +go 1.17 + +require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba + +require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/object-types/go.sum b/packages/test-cases/cases/wrappers/wasm-go/object-types/go.sum new file mode 100644 index 0000000000..89ffed76d2 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/object-types/go.sum @@ -0,0 +1,4 @@ +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= +github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= +github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= +github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/object-types/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/object-types/module/module.go new file mode 100644 index 0000000000..9ecf0355cc --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/object-types/module/module.go @@ -0,0 +1,55 @@ +package module + +import "github.com/testorg/testrepo/wrap/types" + +//go:generate polywrap build -v -m ../polywrap.yaml -o ../build + +func Method1(args *types.MethodArgsMethod1) []types.Output { + out1 := types.Output{ + Prop: args.Arg1.Prop, + Nested: types.Nested{ + Prop: args.Arg1.Nested.Prop, + }, + } + out2 := types.Output{} + if args.Arg2 != nil { + out2 = types.Output{ + Prop: args.Arg2.Prop, + Nested: types.Nested{ + Prop: args.Arg2.Circular.Prop, + }, + } + } + return []types.Output{out1, out2} +} + +func Method2(args *types.MethodArgsMethod2) *types.Output { + if args == nil { + return nil + } + return &types.Output{ + Prop: args.Arg.Prop, + Nested: types.Nested{ + Prop: args.Arg.Nested.Prop, + }, + } +} + +func Method3(args *types.MethodArgsMethod3) []*types.Output { + out2 := &types.Output{ + Prop: args.Arg.Prop, + Nested: types.Nested{ + Prop: args.Arg.Nested.Prop, + }, + } + return []*types.Output{nil, out2} +} + +func Method5(args *types.MethodArgsMethod5) types.Output { + return types.Output{ + Prop: string(args.Arg.Prop), + Nested: types.Nested{ + Prop: "nested prop", + }, + } +} diff --git a/packages/test-cases/cases/wrappers/wasm-go/object-types/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/object-types/polywrap.build.yaml new file mode 100644 index 0000000000..d16e9c9f18 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/object-types/polywrap.build.yaml @@ -0,0 +1,3 @@ +format: 0.1.0 +config: + node_version: "16.13.0" \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/object-types/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/object-types/polywrap.yaml new file mode 100644 index 0000000000..1bf4bdb549 --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/object-types/polywrap.yaml @@ -0,0 +1,9 @@ +format: 0.2.0 +project: + name: ObjectTypes + type: wasm/golang +source: + schema: ./schema.graphql + module: ./go.mod +extensions: + build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/object-types/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/object-types/schema.graphql new file mode 100644 index 0000000000..03f068148a --- /dev/null +++ b/packages/test-cases/cases/wrappers/wasm-go/object-types/schema.graphql @@ -0,0 +1,45 @@ +type Module { + method1( + arg1: Arg1! + arg2: Arg2 + ): [Output!]! + + method2( + arg: Arg1! + ): Output + + method3( + arg: Arg1! + ): [Output]! + + method5( + arg: Arg3! + ): Output! +} + +type Arg1 { + prop: String! + nested: Nested! +} + +type Arg2 { + prop: String! + circular: Circular! +} + +type Arg3 { + prop: Bytes! +} + +type Output { + prop: String! + nested: Nested! +} + +type Nested { + prop: String! +} + +type Circular { + prop: String! +} From 9c5b9d34b38215a4ec60013079b543f66a219aa1 Mon Sep 17 00:00:00 2001 From: Ilnur Date: Tue, 6 Sep 2022 17:55:40 +0300 Subject: [PATCH 027/181] simplify package url matching (#1184) * simplify package url matching * remove unused import * fix template for imported module * add synonym for a imports * fix imported modules and remove spaces * fix import problem for module package in wrapper * fix import formatting * remove unused var from generated code * import types if env used * fix module deserialization in go-codegen * add sanitization for imported pkgs names and fix problem with similar struct's names * fix schema testcase location --- .../bind/src/bindings/golang/functions.ts | 147 +++++------------- .../bind/src/bindings/golang/reservedWords.ts | 25 +++ .../bind/src/bindings/golang/wasm/index.ts | 31 +++- .../templates/env-type/Env%type%-go.mustache | 2 +- .../Env%type%Serialization-go.mustache | 2 +- .../imported/enum-type/Enum%type%-go.mustache | 2 +- .../imported/env-type/Env%type%-go.mustache | 11 +- .../Env%type%Serialization-go.mustache | 11 +- .../interface-type/%type%-go.mustache | 2 +- .../%type%Serialization-go.mustache | 13 +- .../module-type/%type%Wrapped-go.mustache | 28 ++-- .../object-type/Object%type%-go.mustache | 11 +- .../Object%type%Serialization-go.mustache | 11 +- .../module/%type%Serialization-go.mustache | 29 ++-- .../module/%type%Wrapped-go.mustache | 22 ++- .../module-type/types/%type%Args-go.mustache | 16 +- .../object-type/Object%type%-go.mustache | 9 +- .../Object%type%Serialization-go.mustache | 9 +- .../templates/value_serialize_object.mustache | 4 +- .../test_import__module_wrapped.go | 26 +++- .../wasm-go/module/module_serialization.go | 84 +++++----- .../output/wasm-go/module/module_wrapped.go | 8 +- .../output/wasm-go/types/module_args.go | 14 +- .../wasm-go/types/object_custom_type.go | 2 +- .../types/object_custom_type_serialization.go | 16 +- 25 files changed, 282 insertions(+), 253 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/functions.ts b/packages/schema/bind/src/bindings/golang/functions.ts index 132a5962c7..6c5e836981 100644 --- a/packages/schema/bind/src/bindings/golang/functions.ts +++ b/packages/schema/bind/src/bindings/golang/functions.ts @@ -99,41 +99,38 @@ export const makeImports: MustacheFn = () => { return (text: string, render: (template: string) => string): string => { const types = render(text).split(","); const exist: { [key: string]: boolean } = {}; - const pattern = new RegExp( - "^(https?:\\/\\/)?" + // protocol - "((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|" + // domain name - "((\\d{1,3}\\.){3}\\d{1,3}))" + // OR ip (v4) address - "(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*" + // port and path - "(\\?[;&a-z\\d%_.~+=-]*)?" + // query string - "(\\#[-a-z\\d_]*)?$", - "i" - ); - for (const t of types) { - switch (t) { - case "*big.Int": - exist[ - "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" - ] = true; - break; - case "*fastjson.Value": - exist["github.com/valyala/fastjson"] = true; - break; - default: - if (pattern.test(t)) { - exist[t] = true; - } - break; + for (let t of types) { + t = t.trim(); + if (t.endsWith("big.Int")) { + exist[ + "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + ] = true; + } else if (t.endsWith("fastjson.Value")) { + exist["github.com/valyala/fastjson"] = true; + } else if (/([^/\s]+\/)(.*)/.test(t)) { + exist[t] = true; } } - const imports: Array = [ - "github.com/consideritdone/polywrap-go/polywrap/msgpack", - ]; + const imports: Array = []; imports.push(...Object.keys(exist)); const txt = imports .sort() - .map((imp) => `\t"${imp}"`) + .map((imp) => { + let res = ""; + if (imp.startsWith(". ")) { + res = `. "${imp.slice(2)}"`; + } else { + const parts = imp.split(" as "); + if (parts.length > 1) { + res = `${parts[1]} "${parts[0]}"`; + } else { + res = `"${imp}"`; + } + } + return `\t${res}`; + }) .join("\n"); - return `import (\n${txt}\n)`; + return txt !== "" ? `\nimport (\n${txt}\n)\n\n` : "\n"; }; }; @@ -220,33 +217,6 @@ export const toMsgPack: MustacheFn = () => { }; }; -export const typeable: MustacheFn = () => { - return (value: string, render: (template: string) => string) => { - const type = render(value); - switch (type) { - case "int8": - case "int16": - case "int32": - case "int64": - case "uint8": - case "uint16": - case "uint32": - case "uint64": - case "string": - case "bool": - case "[]byte": - case "*big.Int": - case "*fastjson.Value": - return type; - default: - if (type.startsWith("*")) { - return `*types.${type.slice(1)}`; - } - return `types.${type}`; - } - }; -}; - export const toWasm: MustacheFn = () => { return (value: string, render: (template: string) => string) => { let type = render(value); @@ -376,69 +346,32 @@ const applyOptional = (type: string, optional: boolean, _: boolean): string => { } }; -function replaceAt(str: string, index: number, replacement: string): string { - return ( - str.substr(0, index) + replacement + str.substr(index + replacement.length) - ); -} - export const toLower: MustacheFn = () => { return (value: string, render: (template: string) => string) => { - let type = render(value); - - for (let i = 0; i < type.length; ++i) { - const char = type.charAt(i); - const lower = char.toLowerCase(); - - if (char !== lower) { - // Replace the uppercase char w/ the lowercase version - type = replaceAt(type, i, lower); - - // if (i !== 0 && type[i - 1] !== "_") { - // // Make sure all lowercase conversions have an underscore before them - // type = insertAt(type, i, "_"); - // } - } - } - - return type; + return render(value) + .split("") + .map((v) => v.toLowerCase()) + .join(""); }; }; export const toFirstLower: MustacheFn = () => { return (value: string, render: (template: string) => string) => { - let type = render(value); - - // First character must always be upper case - const firstChar = type.charAt(0); - const firstLower = firstChar.toLowerCase(); - type = replaceAt(type, 0, firstLower); - - return type; + const type = render(value); + return type.charAt(0).toLowerCase() + type.slice(1); }; }; export const toUpper: MustacheFn = () => { return (value: string, render: (template: string) => string) => { - let type = render(value); - - // First character must always be upper case - const firstChar = type.charAt(0); - const firstUpper = firstChar.toUpperCase(); - type = replaceAt(type, 0, firstUpper); - - // Look for any underscores, remove them if they exist, and make next letter uppercase - // for (let i = 0; i < type.length; ++i) { - // const char = type.charAt(i); - // - // if (char === "_") { - // const nextChar = type.charAt(i + 1); - // const nextCharUpper = nextChar.toUpperCase(); - // type = replaceAt(type, i + 1, nextCharUpper); - // type = removeAt(type, i); - // } - // } + const type = render(value); + return type.charAt(0).toUpperCase() + type.slice(1); + }; +}; - return type; +export const pkgName: MustacheFn = () => { + return (text: string, render: (template: string) => string): string => { + const name = render(text); + return reservedWordsAS.has(name) ? `pkg${name}` : name; }; }; diff --git a/packages/schema/bind/src/bindings/golang/reservedWords.ts b/packages/schema/bind/src/bindings/golang/reservedWords.ts index f962c6f7b5..696a767cb4 100644 --- a/packages/schema/bind/src/bindings/golang/reservedWords.ts +++ b/packages/schema/bind/src/bindings/golang/reservedWords.ts @@ -198,4 +198,29 @@ export const reservedWordsAS: Set = new Set([ "__visit", "__newBuffer", "__newArray", + "break", + "default", + "func", + "interface", + "select", + "case", + "defer", + "go", + "map", + "struct", + "chan", + "else", + "goto", + "package", + "switch", + "const", + "fallthrough", + "if", + "range", + "type", + "continue", + "for", + "import", + "return", + "var", ]); diff --git a/packages/schema/bind/src/bindings/golang/wasm/index.ts b/packages/schema/bind/src/bindings/golang/wasm/index.ts index 3102d038b3..8eb30576ad 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm/index.ts @@ -3,6 +3,7 @@ import { GenerateBindingFn } from "../.."; import { renderTemplates } from "../.."; import { loadSubTemplates } from "../../utils"; import { BindOptions, BindOutput } from "../../.."; +import { reservedWordsAS } from "../reservedWords"; import { Abi, @@ -19,6 +20,10 @@ const subTemplates = loadSubTemplates(templatesDir.entries); const templatePath = (subpath: string) => path.join(__dirname, "./templates", subpath); +function pkgName(str: string): string { + return reservedWordsAS.has(str) ? `pkg${str}` : str; +} + function camel2snake(str: string): string { str = str.replace(/([A-Z])/g, "_$1"); str = str.startsWith("_") ? str.slice(1) : str; @@ -61,7 +66,7 @@ export const generateBinding: GenerateBindingFn = ( for (const importedModuleType of abi.importedModuleTypes) { importEntries.push({ type: "Directory", - name: `${camel2snake(importedModuleType.namespace)}`, + name: `${pkgName(camel2snake(importedModuleType.namespace))}`, data: renderTemplates( templatePath("imported/module-type"), importedModuleType, @@ -76,7 +81,7 @@ export const generateBinding: GenerateBindingFn = ( for (const importedEnvType of abi.importedEnvTypes) { importEntries.push({ type: "Directory", - name: `${camel2snake(importedEnvType.namespace)}`, + name: `${pkgName(camel2snake(importedEnvType.namespace))}`, data: renderTemplates( templatePath("imported/env-type"), importedEnvType, @@ -91,7 +96,7 @@ export const generateBinding: GenerateBindingFn = ( for (const importedEnumType of abi.importedEnumTypes) { importEntries.push({ type: "Directory", - name: `${camel2snake(importedEnumType.namespace)}`, + name: `${pkgName(camel2snake(importedEnumType.namespace))}`, data: renderTemplates( templatePath("imported/enum-type"), importedEnumType, @@ -106,7 +111,7 @@ export const generateBinding: GenerateBindingFn = ( for (const importedObectType of abi.importedObjectTypes) { importEntries.push({ type: "Directory", - name: `${camel2snake(importedObectType.namespace)}`, + name: `${pkgName(camel2snake(importedObectType.namespace))}`, data: renderTemplates( templatePath("imported/object-type"), importedObectType, @@ -144,12 +149,26 @@ export const generateBinding: GenerateBindingFn = ( // Generate module type folders if (abi.moduleType) { + const imports: { [key: string]: boolean } = {}; + abi.moduleType.methods?.forEach(function (method) { + method.arguments?.forEach(function (arg) { + const tp = abi.importedObjectTypes?.find(function (mt) { + return mt.type === arg.type; + }); + if (tp) { + imports[tp.namespace] = true; + } + }); + }); + const importedTypes = Object.keys(imports).map((namespace) => ({ + namespace, + })); output.entries.push({ type: "Directory", name: "types", data: renderTemplates( templatePath("module-type/types"), - { goImport, ...abi.moduleType }, + { importedTypes, goImport, ...abi.moduleType }, subTemplates ), }); @@ -158,7 +177,7 @@ export const generateBinding: GenerateBindingFn = ( name: "module", data: renderTemplates( templatePath("module-type/module"), - { goImport, ...abi.moduleType }, + { importedTypes, goImport, ...abi.moduleType }, subTemplates ), }); diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache index 4cc1a1eea6..5f8f4bb605 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache @@ -1,6 +1,6 @@ package types -{{#makeImports}}{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} +{{#makeImports}}github.com/consideritdone/polywrap-go/polywrap/msgpack,{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} type {{#toUpper}}{{type}}{{/toUpper}} struct { {{#stuctProps}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache index 0574f0e584..e5f6038776 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache @@ -1,6 +1,6 @@ package types -{{#makeImports}}{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} +{{#makeImports}}github.com/consideritdone/polywrap-go/polywrap/msgpack,{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { ctx := msgpack.NewContext("Serializing (encoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/enum-type/Enum%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/enum-type/Enum%type%-go.mustache index 1bd32360c5..72cd7bfeb6 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/enum-type/Enum%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/enum-type/Enum%type%-go.mustache @@ -1,4 +1,4 @@ -package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} +package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} type {{#toUpper}}{{type}}{{/toUpper}} int32 diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache index 7f50e2c6a6..b650c91755 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache @@ -1,7 +1,10 @@ -package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} - -{{#makeImports}}{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} - +package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} +{{#makeImports}} + github.com/consideritdone/polywrap-go/polywrap/msgpack, + {{#properties}} + {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} + {{/properties}} +{{/makeImports}} type {{#toUpper}}{{type}}{{/toUpper}} struct { {{#stuctProps}} {{#properties}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache index ac4ea04a6f..af9a965b12 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache @@ -1,7 +1,10 @@ -package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} - -{{#makeImports}}{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} - +package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} +{{#makeImports}} + github.com/consideritdone/polywrap-go/polywrap/msgpack, + {{#properties}} + {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} + {{/properties}} +{{/makeImports}} func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { ctx := msgpack.NewContext("Serializing (encoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") encoder := msgpack.NewWriteEncoder(ctx) diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/interface-type/%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/interface-type/%type%-go.mustache index c63551016a..c433d42468 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/interface-type/%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/interface-type/%type%-go.mustache @@ -1,4 +1,4 @@ -package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} +package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} {{#capabilities}} {{#getImplementations}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache index e908e48bfc..c30f7d21ec 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache @@ -1,7 +1,10 @@ -package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} - -{{#makeImports}}{{#arguments}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/arguments}}{{/makeImports}} - +package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} +{{#makeImports}} + github.com/consideritdone/polywrap-go/polywrap/msgpack, + {{#arguments}} + {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} + {{/arguments}} +{{/makeImports}} {{#methods}} type Args{{#toUpper}}{{name}}{{/toUpper}} struct { {{#stuctProps}} @@ -19,6 +22,7 @@ func Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(value *Args{{#toUpper}}{{name } func Write{{#toUpper}}{{name}}{{/toUpper}}Args(writer msgpack.Write, value *Args{{#toUpper}}{{name}}{{/toUpper}}) { + {{#arguments.length}} writer.WriteMapLength({{arguments.length}}) {{#arguments}} writer.Context().Push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") @@ -44,6 +48,7 @@ func Write{{#toUpper}}{{name}}{{/toUpper}}Args(writer msgpack.Write, value *Args {{/enum}} writer.Context().Pop() {{/arguments}} + {{/arguments.length}} } func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(argsBuf []byte) {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}} { diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache index 74b5f3e794..3f4fe38bd8 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache @@ -1,4 +1,4 @@ -package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} +package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} {{#methods.length}} import ( @@ -10,11 +10,16 @@ import ( {{#methods}} func {{#toUpper}}{{type}}{{/toUpper}}{{#toUpper}}{{name}}{{/toUpper}}(args *Args{{#toUpper}}{{name}}{{/toUpper}}) ({{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, error) { argsBuf := Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(args) - data, err := polywrap.WrapSubinvoke("{{uri}}", "{{name}}", argsBuf) - if err != nil { - return nil, result.Error() + var ( + err error + raw []byte + data {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}} + ) + raw, err = polywrap.WrapSubinvoke("{{uri}}", "{{name}}", argsBuf) + if err == nil { + data = Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(raw) } - return Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(result.unwrap()), nil + return data, err } {{^last}} @@ -25,11 +30,16 @@ func {{#toUpper}}{{type}}{{/toUpper}}{{#toUpper}}{{name}}{{/toUpper}}(args *Args {{#methods}} func {{#toUpper}}{{type}}{{/toUpper}}{{#toUpper}}{{name}}{{/toUpper}}(uri string, args *Args{{#toUpper}}{{name}}{{/toUpper}}) ({{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, error) { argsBuf := Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(args) - data, err := polywrap.WrapSubinvokeImplementation("{{uri}}", uri, "{{name}}", argsBuf) - if err != nil { - return nil, err + var ( + err error + raw []byte + data {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}} + ) + raw, err = polywrap.WrapSubinvokeImplementation("{{uri}}", uri, "{{name}}", argsBuf) + if err == nil { + data = Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(raw) } - return Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(data), nil + return data, err } {{^last}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache index 7f50e2c6a6..b650c91755 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache @@ -1,7 +1,10 @@ -package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} - -{{#makeImports}}{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} - +package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} +{{#makeImports}} + github.com/consideritdone/polywrap-go/polywrap/msgpack, + {{#properties}} + {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} + {{/properties}} +{{/makeImports}} type {{#toUpper}}{{type}}{{/toUpper}} struct { {{#stuctProps}} {{#properties}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache index 3274d8b9c4..8623350c71 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache @@ -1,7 +1,10 @@ -package {{#toSnakeCase}}{{namespace}}{{/toSnakeCase}} - -{{#makeImports}}{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} - +package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} +{{#makeImports}} + github.com/consideritdone/polywrap-go/polywrap/msgpack, + {{#properties}} + {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} + {{/properties}} +{{/makeImports}} func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { ctx := msgpack.NewContext("Serializing (encoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") encoder := msgpack.NewWriteEncoder(ctx) diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache index 6bd9f9c0f1..2cc45f280f 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache @@ -1,11 +1,18 @@ package module - -{{#makeImports}}{{goImport}}/wrap/types,{{#arguments}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/arguments}}{{/makeImports}} - +{{#makeImports}} + github.com/consideritdone/polywrap-go/polywrap/msgpack, + . {{goImport}}/wrap/types, + {{#importedTypes}} + . {{goImport}}/wrap/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, + {{/importedTypes}} + {{#methods}} + {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, + {{/methods}} +{{/makeImports}} {{#methods}} -func deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *types.Args{{#toUpper}}{{name}}{{/toUpper}} { +{{#arguments.length}} +func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *MethodArgs{{#toUpper}}{{name}}{{/toUpper}} { ctx := msgpack.NewContext("Deserializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") - {{#arguments.length}} reader := msgpack.NewReadDecoder(ctx, argsBuf) var ( @@ -51,8 +58,8 @@ func deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *types.Args reader.Context().Pop() {{/arguments}} } - reader.Context().Pop() - } + reader.Context().Pop() + } {{#arguments}} {{#required}} @@ -61,9 +68,8 @@ func deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *types.Args } {{/required}} {{/arguments}} - {{/arguments.length}} - return &types.Args{{#toUpper}}{{name}}{{/toUpper}}{ + return &MethodArgs{{#toUpper}}{{name}}{{/toUpper}}{ {{#stuctProps}} {{#arguments}} {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, @@ -71,15 +77,16 @@ func deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *types.Args {{/stuctProps}} } } +{{/arguments.length}} -func Serialize{{#toUpper}}{{name}}{{/toUpper}}Result(value {{#return}}{{#typeable}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/typeable}}{{/return}}) []byte { +func Serialize{{#toUpper}}{{name}}{{/toUpper}}Result(value {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}) []byte { ctx := msgpack.NewContext("Serializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") encoder := msgpack.NewWriteEncoder(ctx) Write{{#toUpper}}{{name}}{{/toUpper}}Result(encoder, value); return encoder.Buffer() } -func Write{{#toUpper}}{{name}}{{/toUpper}}Result(writer msgpack.Write, value {{#return}}{{#typeable}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/typeable}}{{/return}}) { +func Write{{#toUpper}}{{name}}{{/toUpper}}Result(writer msgpack.Write, value {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}) { {{#return}} writer.Context().Push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") {{#scalar}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache index f3da3b7cfe..65dd8ec082 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache @@ -1,14 +1,8 @@ package module - -{{#methods.length}} -import ( - {{#env}} - "github.com/consideritdone/polywrap-go/polywrap" - {{/env}} - methods "{{goImport}}/module" -) -{{/methods.length}} - +{{#makeImports}} + {{#methods}}{{#env}}github.com/consideritdone/polywrap-go/polywrap,. {{goImport}}/wrap/types,{{/env}}{{/methods}} + {{goImport}}/module as methods, +{{/makeImports}} {{#methods}} func {{#toUpper}}{{name}}{{/toUpper}}Wrapped(argsBuf []byte, envSize uint32) []byte { {{#env}} @@ -25,11 +19,13 @@ func {{#toUpper}}{{name}}{{/toUpper}}Wrapped(argsBuf []byte, envSize uint32) []b {{/env}} {{#arguments.length}} - args := deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf) + args := Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf) {{/arguments.length}} - result := methods.{{#toUpper}}{{name}}{{/toUpper}}({{#arguments.length}}args{{/arguments.length}}{{^arguments.length}}nil{{/arguments.length}}{{#env}}, env{{/env}}) + result := methods.{{#toUpper}}{{name}}{{/toUpper}}({{#arguments.length}}args{{#env}},{{/env}}{{/arguments.length}}{{#env}}env{{/env}}) return Serialize{{#toUpper}}{{name}}{{/toUpper}}Result(result) } +{{^last}} -{{/methods}} +{{/last}} +{{/methods}} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache index 6beabd9e0e..cfcdeba108 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache @@ -1,14 +1,24 @@ package types - - +{{#makeImports}} + {{#importedTypes}} + . {{goImport}}/wrap/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, + {{/importedTypes}} + {{#methods}} + {{#arguments}} + {{#toWasm}}{{toGraphQLType}}{{/toWasm}}, + {{/arguments}} + {{/methods}} +{{/makeImports}} {{#methods}} -type Args{{#toUpper}}{{name}}{{/toUpper}} struct { +{{#arguments.length}} +type MethodArgs{{#toUpper}}{{name}}{{/toUpper}} struct { {{#stuctProps}} {{#arguments}} {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} {{/arguments}} {{/stuctProps}} } +{{/arguments.length}} {{^last}} {{/last}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache index b17610926a..ad2d15cd14 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache @@ -1,7 +1,10 @@ package types - -{{#makeImports}}{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} - +{{#makeImports}} + github.com/consideritdone/polywrap-go/polywrap/msgpack, + {{#properties}} + {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} + {{/properties}} +{{/makeImports}} type {{#toUpper}}{{type}}{{/toUpper}} struct { {{#stuctProps}} {{#properties}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache index 93bec1a7d4..f5964d5008 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache @@ -1,7 +1,10 @@ package types - -{{#makeImports}}{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} - +{{#makeImports}} + github.com/consideritdone/polywrap-go/polywrap/msgpack, + {{#properties}} + {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} + {{/properties}} +{{/makeImports}} func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { ctx := msgpack.NewContext("Serializing (encoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") encoder := msgpack.NewWriteEncoder(ctx) diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_object.mustache index b01650869d..3b6ae4d7c6 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_object.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_object.mustache @@ -1,9 +1,9 @@ { v := value{{#lastFullIter}}i{{/lastFullIter}} {{#required}} - types.{{#toUpper}}{{type}}{{/toUpper}}Write(writer, &v) + {{#toUpper}}{{type}}{{/toUpper}}Write(writer, &v) {{/required}} {{^required}} - types.{{#toUpper}}{{type}}{{/toUpper}}Write(writer, v) + {{#toUpper}}{{type}}{{/toUpper}}Write(writer, v) {{/required}} } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go index 9273cd4e30..4a46374cc5 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go @@ -6,18 +6,28 @@ import ( func MethodImportedMethod(uri string, args *ArgsImportedMethod) (*TestImport_Object, error) { argsBuf := SerializeImportedMethodArgs(args) - data, err := polywrap.WrapSubinvokeImplementation("testimport.uri.eth", uri, "importedMethod", argsBuf) - if err != nil { - return nil, err + var ( + err error + raw []byte + data *TestImport_Object + ) + raw, err = polywrap.WrapSubinvokeImplementation("testimport.uri.eth", uri, "importedMethod", argsBuf) + if err == nil { + data = DeserializeImportedMethodResult(raw) } - return DeserializeImportedMethodResult(data), nil + return data, err } func MethodAnotherMethod(uri string, args *ArgsAnotherMethod) (int32, error) { argsBuf := SerializeAnotherMethodArgs(args) - data, err := polywrap.WrapSubinvokeImplementation("testimport.uri.eth", uri, "anotherMethod", argsBuf) - if err != nil { - return nil, err + var ( + err error + raw []byte + data int32 + ) + raw, err = polywrap.WrapSubinvokeImplementation("testimport.uri.eth", uri, "anotherMethod", argsBuf) + if err == nil { + data = DeserializeAnotherMethodResult(raw) } - return DeserializeAnotherMethodResult(data), nil + return data, err } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go index b076f507c3..2bc6f24e14 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go @@ -1,11 +1,11 @@ package module import ( + . "github.com/testorg/testrepo/wrap/types" "github.com/consideritdone/polywrap-go/polywrap/msgpack" - "github.com/testorg/testrepo/wrap/types" ) -func DeserializeModuleMethodArgs(argsBuf []byte) *types.ArgsModuleMethod { +func DeserializeModuleMethodArgs(argsBuf []byte) *MethodArgsModuleMethod { ctx := msgpack.NewContext("Deserializing module-type: ModuleMethod") reader := msgpack.NewReadDecoder(ctx, argsBuf) @@ -32,27 +32,26 @@ func DeserializeModuleMethodArgs(argsBuf []byte) *types.ArgsModuleMethod { for i := int32(reader.ReadMapLength()); i > 0; i-- { field := reader.ReadString() reader.Context().Push(field, "unknown", "searching for property type") - reader.Context().Pop() switch field { - case "Str": + case "str": reader.Context().Push(field, "string", "type found, reading property") _str = reader.ReadString() _strSet = true reader.Context().Pop() - case "OptStr": + case "optStr": reader.Context().Push(field, "*string", "type found, reading property") if !reader.IsNil() { v := reader.ReadString() _optStr = &v } reader.Context().Pop() - case "En": + case "en": reader.Context().Push(field, "CustomEnum", "type found, reading property") _en = CustomEnum(reader.ReadI32()) SanitizeCustomEnumValue(int32(_en)) _enSet = true reader.Context().Pop() - case "OptEnum": + case "optEnum": reader.Context().Push(field, "*CustomEnum", "type found, reading property") if !reader.IsNil() { v := CustomEnum(reader.ReadI32()) @@ -60,7 +59,7 @@ func DeserializeModuleMethodArgs(argsBuf []byte) *types.ArgsModuleMethod { _optEnum = &v } reader.Context().Pop() - case "EnumArray": + case "enumArray": reader.Context().Push(field, "[]CustomEnum", "type found, reading property") if reader.IsNil() { _enumArray = nil @@ -74,7 +73,7 @@ func DeserializeModuleMethodArgs(argsBuf []byte) *types.ArgsModuleMethod { } _enumArraySet = true reader.Context().Pop() - case "OptEnumArray": + case "optEnumArray": reader.Context().Push(field, "[]*CustomEnum", "type found, reading property") if reader.IsNil() { _optEnumArray = nil @@ -90,7 +89,7 @@ func DeserializeModuleMethodArgs(argsBuf []byte) *types.ArgsModuleMethod { } } reader.Context().Pop() - case "Map": + case "m_map": reader.Context().Push(field, "map[string]int32", "type found, reading property") if reader.IsNil() { _map = nil @@ -104,7 +103,7 @@ func DeserializeModuleMethodArgs(argsBuf []byte) *types.ArgsModuleMethod { } _mapSet = true reader.Context().Pop() - case "MapOfArr": + case "mapOfArr": reader.Context().Push(field, "map[string][]int32", "type found, reading property") if reader.IsNil() { _mapOfArr = nil @@ -126,7 +125,7 @@ func DeserializeModuleMethodArgs(argsBuf []byte) *types.ArgsModuleMethod { } _mapOfArrSet = true reader.Context().Pop() - case "MapOfObj": + case "mapOfObj": reader.Context().Push(field, "map[string]AnotherType", "type found, reading property") if reader.IsNil() { _mapOfObj = nil @@ -142,7 +141,7 @@ func DeserializeModuleMethodArgs(argsBuf []byte) *types.ArgsModuleMethod { } _mapOfObjSet = true reader.Context().Pop() - case "MapOfArrOfObj": + case "mapOfArrOfObj": reader.Context().Push(field, "map[string][]AnotherType", "type found, reading property") if reader.IsNil() { _mapOfArrOfObj = nil @@ -167,6 +166,7 @@ func DeserializeModuleMethodArgs(argsBuf []byte) *types.ArgsModuleMethod { _mapOfArrOfObjSet = true reader.Context().Pop() } + reader.Context().Pop() } if !_strSet { @@ -191,14 +191,14 @@ func DeserializeModuleMethodArgs(argsBuf []byte) *types.ArgsModuleMethod { panic(reader.Context().PrintWithContext("Missing required property: 'mapOfArrOfObj: Map'")) } - return &types.ArgsModuleMethod{ + return &MethodArgsModuleMethod{ Str: _str, OptStr: _optStr, En: _en, OptEnum: _optEnum, EnumArray: _enumArray, OptEnumArray: _optEnumArray, - Map: _map, + M_map: _map, MapOfArr: _mapOfArr, MapOfObj: _mapOfObj, MapOfArrOfObj: _mapOfArrOfObj, @@ -221,7 +221,7 @@ func WriteModuleMethodResult(writer msgpack.Write, value int32) { writer.Context().Pop() } -func DeserializeObjectMethodArgs(argsBuf []byte) *types.ArgsObjectMethod { +func DeserializeObjectMethodArgs(argsBuf []byte) *MethodArgsObjectMethod { ctx := msgpack.NewContext("Deserializing module-type: ObjectMethod") reader := msgpack.NewReadDecoder(ctx, argsBuf) @@ -237,22 +237,21 @@ func DeserializeObjectMethodArgs(argsBuf []byte) *types.ArgsObjectMethod { for i := int32(reader.ReadMapLength()); i > 0; i-- { field := reader.ReadString() reader.Context().Push(field, "unknown", "searching for property type") - reader.Context().Pop() switch field { - case "Object": + case "object": reader.Context().Push(field, "AnotherType", "type found, reading property") if v := AnotherTypeRead(reader); v != nil { _object = *v } _objectSet = true reader.Context().Pop() - case "OptObject": + case "optObject": reader.Context().Push(field, "*AnotherType", "type found, reading property") if v := AnotherTypeRead(reader); v != nil { _optObject = v } reader.Context().Pop() - case "ObjectArray": + case "objectArray": reader.Context().Push(field, "[]AnotherType", "type found, reading property") if reader.IsNil() { _objectArray = nil @@ -267,7 +266,7 @@ func DeserializeObjectMethodArgs(argsBuf []byte) *types.ArgsObjectMethod { } _objectArraySet = true reader.Context().Pop() - case "OptObjectArray": + case "optObjectArray": reader.Context().Push(field, "[]*AnotherType", "type found, reading property") if reader.IsNil() { _optObjectArray = nil @@ -282,6 +281,7 @@ func DeserializeObjectMethodArgs(argsBuf []byte) *types.ArgsObjectMethod { } reader.Context().Pop() } + reader.Context().Pop() } if !_objectSet { @@ -291,7 +291,7 @@ func DeserializeObjectMethodArgs(argsBuf []byte) *types.ArgsObjectMethod { panic(reader.Context().PrintWithContext("Missing required property: 'objectArray: [AnotherType]'")) } - return &types.ArgsObjectMethod{ + return &MethodArgsObjectMethod{ Object: _object, OptObject: _optObject, ObjectArray: _objectArray, @@ -299,23 +299,23 @@ func DeserializeObjectMethodArgs(argsBuf []byte) *types.ArgsObjectMethod { } } -func SerializeObjectMethodResult(value *types.AnotherType) []byte { +func SerializeObjectMethodResult(value *AnotherType) []byte { ctx := msgpack.NewContext("Serializing module-type: ObjectMethod") encoder := msgpack.NewWriteEncoder(ctx) WriteObjectMethodResult(encoder, value); return encoder.Buffer() } -func WriteObjectMethodResult(writer msgpack.Write, value *types.AnotherType) { +func WriteObjectMethodResult(writer msgpack.Write, value *AnotherType) { writer.Context().Push("objectMethod", "*AnotherType", "writing property") { v := value - types.AnotherTypeWrite(writer, v) + AnotherTypeWrite(writer, v) } writer.Context().Pop() } -func DeserializeOptionalEnvMethodArgs(argsBuf []byte) *types.ArgsOptionalEnvMethod { +func DeserializeOptionalEnvMethodArgs(argsBuf []byte) *MethodArgsOptionalEnvMethod { ctx := msgpack.NewContext("Deserializing module-type: OptionalEnvMethod") reader := msgpack.NewReadDecoder(ctx, argsBuf) @@ -331,22 +331,21 @@ func DeserializeOptionalEnvMethodArgs(argsBuf []byte) *types.ArgsOptionalEnvMeth for i := int32(reader.ReadMapLength()); i > 0; i-- { field := reader.ReadString() reader.Context().Push(field, "unknown", "searching for property type") - reader.Context().Pop() switch field { - case "Object": + case "object": reader.Context().Push(field, "AnotherType", "type found, reading property") if v := AnotherTypeRead(reader); v != nil { _object = *v } _objectSet = true reader.Context().Pop() - case "OptObject": + case "optObject": reader.Context().Push(field, "*AnotherType", "type found, reading property") if v := AnotherTypeRead(reader); v != nil { _optObject = v } reader.Context().Pop() - case "ObjectArray": + case "objectArray": reader.Context().Push(field, "[]AnotherType", "type found, reading property") if reader.IsNil() { _objectArray = nil @@ -361,7 +360,7 @@ func DeserializeOptionalEnvMethodArgs(argsBuf []byte) *types.ArgsOptionalEnvMeth } _objectArraySet = true reader.Context().Pop() - case "OptObjectArray": + case "optObjectArray": reader.Context().Push(field, "[]*AnotherType", "type found, reading property") if reader.IsNil() { _optObjectArray = nil @@ -376,6 +375,7 @@ func DeserializeOptionalEnvMethodArgs(argsBuf []byte) *types.ArgsOptionalEnvMeth } reader.Context().Pop() } + reader.Context().Pop() } if !_objectSet { @@ -385,7 +385,7 @@ func DeserializeOptionalEnvMethodArgs(argsBuf []byte) *types.ArgsOptionalEnvMeth panic(reader.Context().PrintWithContext("Missing required property: 'objectArray: [AnotherType]'")) } - return &types.ArgsOptionalEnvMethod{ + return &MethodArgsOptionalEnvMethod{ Object: _object, OptObject: _optObject, ObjectArray: _objectArray, @@ -393,23 +393,23 @@ func DeserializeOptionalEnvMethodArgs(argsBuf []byte) *types.ArgsOptionalEnvMeth } } -func SerializeOptionalEnvMethodResult(value *types.AnotherType) []byte { +func SerializeOptionalEnvMethodResult(value *AnotherType) []byte { ctx := msgpack.NewContext("Serializing module-type: OptionalEnvMethod") encoder := msgpack.NewWriteEncoder(ctx) WriteOptionalEnvMethodResult(encoder, value); return encoder.Buffer() } -func WriteOptionalEnvMethodResult(writer msgpack.Write, value *types.AnotherType) { +func WriteOptionalEnvMethodResult(writer msgpack.Write, value *AnotherType) { writer.Context().Push("optionalEnvMethod", "*AnotherType", "writing property") { v := value - types.AnotherTypeWrite(writer, v) + AnotherTypeWrite(writer, v) } writer.Context().Pop() } -func DeserializeIfArgs(argsBuf []byte) *types.ArgsIf { +func DeserializeIfArgs(argsBuf []byte) *MethodArgsIf { ctx := msgpack.NewContext("Deserializing module-type: If") reader := msgpack.NewReadDecoder(ctx, argsBuf) @@ -421,9 +421,8 @@ func DeserializeIfArgs(argsBuf []byte) *types.ArgsIf { for i := int32(reader.ReadMapLength()); i > 0; i-- { field := reader.ReadString() reader.Context().Push(field, "unknown", "searching for property type") - reader.Context().Pop() switch field { - case "M_if": + case "m_if": reader.Context().Push(field, "Else", "type found, reading property") if v := ElseRead(reader); v != nil { _if = *v @@ -431,29 +430,30 @@ func DeserializeIfArgs(argsBuf []byte) *types.ArgsIf { _ifSet = true reader.Context().Pop() } + reader.Context().Pop() } if !_ifSet { panic(reader.Context().PrintWithContext("Missing required property: 'if: else'")) } - return &types.ArgsIf{ + return &MethodArgsIf{ M_if: _if, } } -func SerializeIfResult(value types.Else) []byte { +func SerializeIfResult(value Else) []byte { ctx := msgpack.NewContext("Serializing module-type: If") encoder := msgpack.NewWriteEncoder(ctx) WriteIfResult(encoder, value); return encoder.Buffer() } -func WriteIfResult(writer msgpack.Write, value types.Else) { +func WriteIfResult(writer msgpack.Write, value Else) { writer.Context().Push("if", "Else", "writing property") { v := value - types.ElseWrite(writer, &v) + ElseWrite(writer, &v) } writer.Context().Pop() } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go index 3e003cad4b..286449f746 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go @@ -1,8 +1,9 @@ package module import ( + . "github.com/testorg/testrepo/wrap/types" "github.com/consideritdone/polywrap-go/polywrap" - methods "github.com/testorg/testrepo" + methods "github.com/testorg/testrepo/module" ) func ModuleMethodWrapped(argsBuf []byte, envSize uint32) []byte { @@ -25,7 +26,7 @@ func ObjectMethodWrapped(argsBuf []byte, envSize uint32) []byte { args := DeserializeObjectMethodArgs(argsBuf) - result := methods.ObjectMethod(args, env) + result := methods.ObjectMethod(args,env) return SerializeObjectMethodResult(result) } @@ -38,7 +39,7 @@ func OptionalEnvMethodWrapped(argsBuf []byte, envSize uint32) []byte { args := DeserializeOptionalEnvMethodArgs(argsBuf) - result := methods.OptionalEnvMethod(args, env) + result := methods.OptionalEnvMethod(args,env) return SerializeOptionalEnvMethodResult(result) } @@ -49,4 +50,3 @@ func IfWrapped(argsBuf []byte, envSize uint32) []byte { result := methods.If(args) return SerializeIfResult(result) } - diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go index fba2f3ead7..2ec6424513 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go @@ -1,36 +1,32 @@ package types -import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" -) - -type ArgsModuleMethod struct { +type MethodArgsModuleMethod struct { Str string OptStr *string En CustomEnum OptEnum *CustomEnum EnumArray []CustomEnum OptEnumArray []*CustomEnum - Map map[string]int32 + M_map map[string]int32 MapOfArr map[string][]int32 MapOfObj map[string]AnotherType MapOfArrOfObj map[string][]AnotherType } -type ArgsObjectMethod struct { +type MethodArgsObjectMethod struct { Object AnotherType OptObject *AnotherType ObjectArray []AnotherType OptObjectArray []*AnotherType } -type ArgsOptionalEnvMethod struct { +type MethodArgsOptionalEnvMethod struct { Object AnotherType OptObject *AnotherType ObjectArray []AnotherType OptObjectArray []*AnotherType } -type ArgsIf struct { +type MethodArgsIf struct { M_if Else } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go index 129eedcb94..ae268082e8 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go @@ -44,7 +44,7 @@ type CustomType struct { OptEnum *CustomEnum EnumArray []CustomEnum OptEnumArray []*CustomEnum - Map map[string]int32 + M_map map[string]int32 MapOfArr map[string][]int32 MapOfObj map[string]AnotherType MapOfArrOfObj map[string][]AnotherType diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go index 743b468443..67a836ae91 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go @@ -474,17 +474,17 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } } writer.Context().Pop() - writer.Context().Push("Map", "map[string]int32", "writing property") - writer.WriteString("Map") - if value.Map == nil { + writer.Context().Push("M_map", "map[string]int32", "writing property") + writer.WriteString("M_map") + if value.M_map == nil { writer.WriteNil() - } else if len(value.Map) == 0 { + } else if len(value.M_map) == 0 { writer.WriteNil() } else { - for i0 := range value.Map { + for i0 := range value.M_map { writer.WriteString(i0) { - v := value.Map[i0] + v := value.M_map[i0] writer.WriteI32(v) } } @@ -1025,7 +1025,7 @@ func readCustomType(reader msgpack.Read) *CustomType { } } reader.Context().Pop() - case "Map": + case "M_map": reader.Context().Push(field, "map[string]int32", "type found, reading property") if reader.IsNil() { _map = nil @@ -1240,7 +1240,7 @@ func readCustomType(reader msgpack.Read) *CustomType { OptEnum: _optEnum, EnumArray: _enumArray, OptEnumArray: _optEnumArray, - Map: _map, + M_map: _map, MapOfArr: _mapOfArr, MapOfObj: _mapOfObj, MapOfArrOfObj: _mapOfArrOfObj, From b39fcef624c89bdbcafc9fd184259ab3ed3c0ed8 Mon Sep 17 00:00:00 2001 From: Ilnur Date: Tue, 6 Sep 2022 21:33:06 +0300 Subject: [PATCH 028/181] fix logic of function toWasmMap (#1214) --- packages/schema/bind/src/bindings/golang/functions.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/functions.ts b/packages/schema/bind/src/bindings/golang/functions.ts index 6c5e836981..008da8bf54 100644 --- a/packages/schema/bind/src/bindings/golang/functions.ts +++ b/packages/schema/bind/src/bindings/golang/functions.ts @@ -320,15 +320,14 @@ const toWasmMap = (type: string, optional: boolean): string => { const keyValTypes = type .substring(firstOpenBracketIdx + 1, lastCloseBracketIdx) - .split(",") - .map((x) => x.trim()); + .split(","); - if (keyValTypes.length !== 2 || !keyValTypes[0] || !keyValTypes[1]) { + if (keyValTypes.length < 2) { throw new Error(`Invalid Map: ${type}`); } - const keyType = toWasm()(keyValTypes[0], (str) => str); - const valType = toWasm()(keyValTypes[1], (str) => str); + const keyType = toWasm()(keyValTypes[0].trim(), (str) => str); + const valType = toWasm()(keyValTypes.slice(1).join(",").trim(), (str) => str); return applyOptional(`map[${keyType}]${valType}`, optional, false); }; From ba2335df7921213f98ee64b97579ade930a465a1 Mon Sep 17 00:00:00 2001 From: Cesar Date: Mon, 24 Apr 2023 08:00:09 +0200 Subject: [PATCH 029/181] chore: first iteration of build strategies with golang + add tood --- .../strategies/DockerVMStrategy.ts | 5 ++ .../build-images/wasm/golang/index.ts | 60 ---------------- .../wasm/go/manifest.ext.json | 0 .../wasm/go/polywrap.build.yaml | 3 - .../wasm/golang/default.build.yaml | 4 ++ .../wasm/golang/image}/Dockerfile.mustache | 2 +- .../wasm/golang/manifest.ext.json | 22 ++++++ .../golang/wasm/templates/main-go.mustache | 2 +- .../module/%type%Serialization-go.mustache | 4 +- .../module/%type%Wrapped-go.mustache | 2 +- .../module-type/types/%type%Args-go.mustache | 2 +- todo | 7 ++ yarn.lock | 71 ++++++++++--------- 13 files changed, 83 insertions(+), 101 deletions(-) delete mode 100644 packages/cli/src/lib/defaults/build-images/wasm/golang/index.ts delete mode 100644 packages/cli/src/lib/defaults/build-strategies/wasm/go/manifest.ext.json delete mode 100644 packages/cli/src/lib/defaults/build-strategies/wasm/go/polywrap.build.yaml create mode 100644 packages/cli/src/lib/defaults/build-strategies/wasm/golang/default.build.yaml rename packages/cli/src/lib/defaults/{build-images/wasm/golang => build-strategies/wasm/golang/image}/Dockerfile.mustache (76%) create mode 100644 packages/cli/src/lib/defaults/build-strategies/wasm/golang/manifest.ext.json create mode 100644 todo diff --git a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts index 1cac9c1e9f..815e94dbcf 100644 --- a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts +++ b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts @@ -43,6 +43,11 @@ const CONFIGS: Record = { baseImage: "polywrap/vm-base-as", version: "0.2.0", }, + "wasm/golang": { + defaultIncludes: ["go.mod", "go.sum"], + baseImage: "consideritdone/polywrap-base-go", + version: "0.1.0" + } }; export class DockerVMBuildStrategy extends BuildStrategy { diff --git a/packages/cli/src/lib/defaults/build-images/wasm/golang/index.ts b/packages/cli/src/lib/defaults/build-images/wasm/golang/index.ts deleted file mode 100644 index 365b99b78e..0000000000 --- a/packages/cli/src/lib/defaults/build-images/wasm/golang/index.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { CompilerOverrides } from "../../../../Compiler"; -import { intlMsg } from "../../../../intl"; -import { resolvePathIfExists } from "../../../../system"; - -import { PolywrapManifest } from "@polywrap/polywrap-manifest-types-js"; -import fs from "fs"; - -/** go.mod - * module bla-bla - */ -export function getCompilerOverrides(): CompilerOverrides { - let golangModuleName = ""; - return { - validateManifest: (manifest: PolywrapManifest) => { - const module = manifest.source.module; - - if (!module || module.indexOf("go.mod") === -1) { - throw Error( - intlMsg.lib_wasm_golang_invalidModule({ path: module as string }) - ); - } - const goModPaths = [`../${module}`, module as string]; - const goModFile = resolvePathIfExists(goModPaths); - if (!goModFile) { - throw Error( - intlMsg.commands_build_error_goModNotFound({ - paths: module as string, - }) - ); - } - - golangModuleName = loadGoModeFile(goModFile); - }, - getCompilerOptions: (): Record => { - return { - golangModuleName, - }; - }, - generationSubPath: "wrap", - }; -} - -function loadGoModeFile(filePath: string): string { - const goMod = fs.readFileSync(filePath, "utf-8"); - - if (!goMod) { - const noLoadMessage = intlMsg.lib_helpers_gomod_unableToLoad({ - path: filePath, - }); - throw Error(noLoadMessage); - } - - const regex = /module (.+)/m; - const module = goMod.match(regex); - if (!module || module.length != 2) { - throw Error(intlMsg.lib_helpers_gomod_invalid({ path: filePath })); - } - - return module[1]; -} diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/go/manifest.ext.json b/packages/cli/src/lib/defaults/build-strategies/wasm/go/manifest.ext.json deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/go/polywrap.build.yaml b/packages/cli/src/lib/defaults/build-strategies/wasm/go/polywrap.build.yaml deleted file mode 100644 index 9df4ff713b..0000000000 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/go/polywrap.build.yaml +++ /dev/null @@ -1,3 +0,0 @@ -format: 0.1.0 -docker: - dockerfile: ./Dockerfile.mustache diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/default.build.yaml b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/default.build.yaml new file mode 100644 index 0000000000..2d69edd896 --- /dev/null +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/default.build.yaml @@ -0,0 +1,4 @@ +format: 0.2.0 +strategies: + image: + dockerfile: ./Dockerfile.mustache diff --git a/packages/cli/src/lib/defaults/build-images/wasm/golang/Dockerfile.mustache b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache similarity index 76% rename from packages/cli/src/lib/defaults/build-images/wasm/golang/Dockerfile.mustache rename to packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache index 695273b82d..9fcdde2e40 100644 --- a/packages/cli/src/lib/defaults/build-images/wasm/golang/Dockerfile.mustache +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache @@ -4,7 +4,7 @@ WORKDIR /project COPY . . -RUN tinygo build -o main.wasm -target wasm-memory wrap/main.go +RUN tinygo build -o main.wasm -target wasm-memory src/wrap/main.go # Make the build directory RUN rm -rf ./build diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/manifest.ext.json b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/manifest.ext.json new file mode 100644 index 0000000000..6894091f3d --- /dev/null +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/manifest.ext.json @@ -0,0 +1,22 @@ +{ + "properties": { + "strategies": { + "properties": { + "image": { + "type": "object", + "properties": { + "include": { + "description": "Files to include in docker image.", + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "local": { }, + "vm": { } + } +} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache index 6a3450710c..81d81a97d3 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache @@ -1,7 +1,7 @@ package main import ( - "{{goImport}}/wrap/module" + "{{goImport}}/src/wrap/module" "github.com/consideritdone/polywrap-go/polywrap" ) diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache index 2cc45f280f..2fbb08052a 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache @@ -1,9 +1,9 @@ package module {{#makeImports}} github.com/consideritdone/polywrap-go/polywrap/msgpack, - . {{goImport}}/wrap/types, + . {{goImport}}/src/wrap/types, {{#importedTypes}} - . {{goImport}}/wrap/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, + . {{goImport}}/src/wrap/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, {{/importedTypes}} {{#methods}} {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache index 65dd8ec082..7b20b03c06 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache @@ -1,6 +1,6 @@ package module {{#makeImports}} - {{#methods}}{{#env}}github.com/consideritdone/polywrap-go/polywrap,. {{goImport}}/wrap/types,{{/env}}{{/methods}} + {{#methods}}{{#env}}github.com/consideritdone/polywrap-go/polywrap,. {{goImport}}/src/wrap/types,{{/env}}{{/methods}} {{goImport}}/module as methods, {{/makeImports}} {{#methods}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache index cfcdeba108..424f8ed842 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache @@ -1,7 +1,7 @@ package types {{#makeImports}} {{#importedTypes}} - . {{goImport}}/wrap/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, + . {{goImport}}/src/wrap/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, {{/importedTypes}} {{#methods}} {{#arguments}} diff --git a/todo b/todo new file mode 100644 index 0000000000..a82ed17f37 --- /dev/null +++ b/todo @@ -0,0 +1,7 @@ +jordan notes: +- file names w/ '%'? +- objectelse -> object_else.go? Same with enumwhile.go +- create a template project +- missing test-cases? (bignumber, large-types, reserved-words, env-types) +- finish the go-ci workflow +- - setup submodule for wasm/go runtime \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index be8b9082a6..f784328a6e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2431,9 +2431,9 @@ "@types/json-schema" "*" "@types/estree@*": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" - integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" + integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== "@types/fs-extra@9.0.12": version "9.0.12" @@ -2516,9 +2516,9 @@ integrity sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw== "@types/lodash@^4.14.182": - version "4.14.192" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.192.tgz#5790406361a2852d332d41635d927f1600811285" - integrity sha512-km+Vyn3BYm5ytMO13k9KTp27O75rbQ0NFw+U//g+PX7VZyjCioXaRFisqSIJRECljcTv73G3i6BpglNGHgUQ5A== + version "4.14.194" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.194.tgz#b71eb6f7a0ff11bff59fc987134a093029258a76" + integrity sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g== "@types/minimatch@*", "@types/minimatch@^5.1.2": version "5.1.2" @@ -2541,9 +2541,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.15.12" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.12.tgz#833756634e78c829e1254db006468dadbb0c696b" + integrity sha512-Wha1UwsB3CYdqUm2PPzh/1gujGCNtWVUYF0mB00fJFoR4gTyWTDPjSm+zBF787Ahw8vSGgBja90MkgFwvB86Dg== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -3536,9 +3536,9 @@ camelcase@^6.0.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001449: - version "1.0.30001478" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001478.tgz#0ef8a1cf8b16be47a0f9fc4ecfc952232724b32a" - integrity sha512-gMhDyXGItTHipJj2ApIvR+iVB5hd0KP3svMWWXDvZOmjzJJassGLMfxRkQCSYgGd2gtdL/ReeiyvMSFD1Ss6Mw== + version "1.0.30001480" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001480.tgz#9bbd35ee44c2480a1e3a3b9f4496f5066817164a" + integrity sha512-q7cpoPPvZYgtyC4VaBSN0Bt+PJ4c4EYRf0DrduInOz2SkFpHD5p3LnvEpqBp7UnJn+8x1Ogl1s38saUxe+ihQQ== capture-exit@^2.0.0: version "2.0.0" @@ -4153,7 +4153,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== @@ -4357,9 +4357,9 @@ electron-fetch@^1.7.2: encoding "^0.1.13" electron-to-chromium@^1.4.284: - version "1.4.362" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.362.tgz#1dfd7a076fc4785a16941f06410d0668e1a7a1aa" - integrity sha512-PYzAoScDfUcAwZfJQvr6hK2xXzLsMocj/Wuz6LpW6TZQNVv9TflBSB+UoEPuFujc478BgAxCoCFarcVPmjzsog== + 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== elliptic@6.5.4: version "6.5.4" @@ -4606,9 +4606,9 @@ eslint-import-resolver-node@^0.3.4: resolve "^1.22.1" eslint-module-utils@^2.6.0: - version "2.7.4" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" - integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== + version "2.8.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" + integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== dependencies: debug "^3.2.7" @@ -5219,7 +5219,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== @@ -7286,9 +7286,9 @@ long@^4.0.0: integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== long@^5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/long/-/long-5.2.1.tgz#e27595d0083d103d2fa2c20c7699f8e0c92b897f" - integrity sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A== + version "5.2.3" + resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" + integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== lru-cache@^5.1.1: version "5.1.1" @@ -9062,13 +9062,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" @@ -9315,13 +9315,20 @@ semver@7.3.8: dependencies: lru-cache "^6.0.0" -semver@7.4.0, semver@7.x, semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: +semver@7.4.0: version "7.4.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.4.0.tgz#8481c92feffc531ab1e012a8ffc15bdd3a0f4318" integrity sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw== dependencies: lru-cache "^6.0.0" +semver@7.x, semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: + version "7.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.0.tgz#ed8c5dc8efb6c629c88b23d41dc9bf40c1d96cd0" + integrity sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA== + dependencies: + lru-cache "^6.0.0" + semver@^6.0.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" @@ -10343,9 +10350,9 @@ upath@^2.0.1: integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== update-browserslist-db@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + version "1.0.11" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== dependencies: escalade "^3.1.1" picocolors "^1.0.0" From 8d5c9cc60a9906d37d7a93e717b6e70fcc6f8512 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Tue, 30 May 2023 04:40:35 +0800 Subject: [PATCH 030/181] feat: add default deploy manifest --- packages/cli/src/commands/build.ts | 6 ++-- packages/cli/src/commands/codegen.ts | 4 +-- packages/cli/src/commands/deploy.ts | 6 ++-- packages/cli/src/commands/docgen.ts | 4 +-- packages/cli/src/commands/infra.ts | 6 ++-- packages/cli/src/commands/manifest.ts | 28 ++++++++-------- packages/cli/src/commands/test.ts | 6 ++-- .../lib/project/manifests/polywrap/load.ts | 33 ++++++++++++++++--- 8 files changed, 58 insertions(+), 35 deletions(-) diff --git a/packages/cli/src/commands/build.ts b/packages/cli/src/commands/build.ts index 4fd735e068..f5ed6572d7 100644 --- a/packages/cli/src/commands/build.ts +++ b/packages/cli/src/commands/build.ts @@ -5,7 +5,7 @@ import { PolywrapProject, SchemaComposer, intlMsg, - defaultPolywrapManifest, + defaultPolywrapManifestFiles, parseDirOption, parseClientConfigOption, parseManifestFileOption, @@ -34,7 +34,7 @@ import { PolywrapManifest } from "@polywrap/polywrap-manifest-types-js"; const defaultOutputDir = "./build"; const defaultStrategy = SupportedStrategies.VM; const strategyStr = Object.values(SupportedStrategies).join(" | "); -const defaultManifestStr = defaultPolywrapManifest.join(" | "); +const defaultManifestStr = defaultPolywrapManifestFiles.join(" | "); const pathStr = intlMsg.commands_build_options_o_path(); const supportedProjectTypes = [ @@ -106,7 +106,7 @@ export const build: Command = { await run({ manifestFile: parseManifestFileOption( options.manifestFile, - defaultPolywrapManifest + defaultPolywrapManifestFiles ), clientConfig: options.clientConfig || false, wrapperEnvs: options.wrapperEnvs || false, diff --git a/packages/cli/src/commands/codegen.ts b/packages/cli/src/commands/codegen.ts index 81b59da2b6..3968cdbf65 100644 --- a/packages/cli/src/commands/codegen.ts +++ b/packages/cli/src/commands/codegen.ts @@ -11,7 +11,7 @@ import { parseClientConfigOption, getProjectFromManifest, defaultProjectManifestFiles, - defaultPolywrapManifest, + defaultPolywrapManifestFiles, parseLogFileOption, parseWrapperEnvsOption, } from "../lib"; @@ -22,7 +22,7 @@ import { watchProject } from "../lib/watchProject"; import { PolywrapClient } from "@polywrap/client-js"; const pathStr = intlMsg.commands_codegen_options_o_path(); -const defaultManifestStr = defaultPolywrapManifest.join(" | "); +const defaultManifestStr = defaultPolywrapManifestFiles.join(" | "); export interface CodegenCommandOptions extends BaseCommandOptions { manifestFile: string; diff --git a/packages/cli/src/commands/deploy.ts b/packages/cli/src/commands/deploy.ts index 82d27e7565..153a4f197b 100644 --- a/packages/cli/src/commands/deploy.ts +++ b/packages/cli/src/commands/deploy.ts @@ -6,7 +6,7 @@ import { parseManifestFileOption, parseLogFileOption, Deployer, - defaultDeployManifest, + defaultDeployManifestFiles, DeployJobResult, } from "../lib"; @@ -14,7 +14,7 @@ import fs from "fs"; import path from "path"; import yaml from "yaml"; -const defaultManifestStr = defaultDeployManifest.join(" | "); +const defaultManifestStr = defaultDeployManifestFiles.join(" | "); const pathStr = intlMsg.commands_deploy_options_o_path(); export interface DeployCommandOptions extends BaseCommandOptions { @@ -48,7 +48,7 @@ export const deploy: Command = { await run({ manifestFile: parseManifestFileOption( options.manifestFile, - defaultDeployManifest + defaultDeployManifestFiles ), outputFile: options.outputFile || false, verbose: options.verbose || false, diff --git a/packages/cli/src/commands/docgen.ts b/packages/cli/src/commands/docgen.ts index 347b9ba058..bef30a58d6 100644 --- a/packages/cli/src/commands/docgen.ts +++ b/packages/cli/src/commands/docgen.ts @@ -1,6 +1,6 @@ /* eslint-disable prefer-const */ import { - defaultPolywrapManifest, + defaultPolywrapManifestFiles, SchemaComposer, intlMsg, parseClientConfigOption, @@ -78,7 +78,7 @@ export const docgen: Command = { .option( `-m, --manifest-file <${pathStr}>`, intlMsg.commands_docgen_options_m({ - default: defaultPolywrapManifest.join(" | "), + default: defaultPolywrapManifestFiles.join(" | "), }) ) .option( diff --git a/packages/cli/src/commands/infra.ts b/packages/cli/src/commands/infra.ts index 3841bcc13d..8071dc758b 100644 --- a/packages/cli/src/commands/infra.ts +++ b/packages/cli/src/commands/infra.ts @@ -2,7 +2,7 @@ import { intlMsg, Infra, loadInfraManifest, - defaultInfraManifest, + defaultInfraManifestFiles, resolvePathIfExists, parseLogFileOption, } from "../lib"; @@ -36,7 +36,7 @@ const DEFAULT_MODULES_PATH = path.join( "infra-modules" ); -const defaultManifestStr = defaultInfraManifest.join(" | "); +const defaultManifestStr = defaultInfraManifestFiles.join(" | "); const pathStr = intlMsg.commands_infra_options_m_path(); const moduleNameStr = intlMsg.commands_infra_options_o_module(); @@ -119,7 +119,7 @@ async function run( const manifest: string[] = manifestFile ? [manifestFile] - : defaultInfraManifest; + : defaultInfraManifestFiles; const manifestPath = resolvePathIfExists(manifest); let infraManifest: InfraManifest | undefined; diff --git a/packages/cli/src/commands/manifest.ts b/packages/cli/src/commands/manifest.ts index 2d19cdf53a..da1d0daec9 100644 --- a/packages/cli/src/commands/manifest.ts +++ b/packages/cli/src/commands/manifest.ts @@ -1,10 +1,10 @@ import { Argument, Command, Program, BaseCommandOptions } from "./types"; import { createLogger } from "./utils/createLogger"; import { - defaultBuildManifest, - defaultDeployManifest, - defaultInfraManifest, - defaultWorkflowManifest, + defaultBuildManifestFiles, + defaultDeployManifestFiles, + defaultInfraManifestFiles, + defaultWorkflowManifestFiles, getProjectManifestLanguage, intlMsg, isAppManifestLanguage, @@ -13,7 +13,7 @@ import { maybeGetManifestFormatVersion, parseManifestFileOption, CacheDirectory, - defaultPolywrapManifest, + defaultPolywrapManifestFiles, Logger, parseLogFileOption, } from "../lib"; @@ -63,7 +63,7 @@ import path from "path"; const pathStr = intlMsg.commands_manifest_options_m_path(); const formatStr = intlMsg.commands_manifest_options_m_format(); -const defaultProjectManifestStr = defaultPolywrapManifest.join(" | "); +const defaultProjectManifestStr = defaultPolywrapManifestFiles.join(" | "); const manifestTypes = [ "project", @@ -187,28 +187,28 @@ export const runSchemaCommand = async ( case "build": manifestfile = parseManifestFileOption( options.manifestFile, - defaultBuildManifest + defaultBuildManifestFiles ); break; case "deploy": manifestfile = parseManifestFileOption( options.manifestFile, - defaultDeployManifest + defaultDeployManifestFiles ); break; case "infra": manifestfile = parseManifestFileOption( options.manifestFile, - defaultInfraManifest + defaultInfraManifestFiles ); break; case "workflow": manifestfile = parseManifestFileOption( options.manifestFile, - defaultWorkflowManifest + defaultWorkflowManifestFiles ); break; } @@ -432,7 +432,7 @@ const runMigrateCommand = async ( logger ); migrateManifestFile( - parseManifestFileOption(options.manifestFile, defaultBuildManifest), + parseManifestFileOption(options.manifestFile, defaultBuildManifestFiles), migrateBuildExtensionManifest, options.format || latestBuildManifestFormat, logger @@ -446,7 +446,7 @@ const runMigrateCommand = async ( logger ); migrateManifestFile( - parseManifestFileOption(options.manifestFile, defaultDeployManifest), + parseManifestFileOption(options.manifestFile, defaultDeployManifestFiles), migrateDeployExtensionManifest, options.format || latestDeployManifestFormat, logger @@ -460,7 +460,7 @@ const runMigrateCommand = async ( logger ); migrateManifestFile( - parseManifestFileOption(options.manifestFile, defaultInfraManifest), + parseManifestFileOption(options.manifestFile, defaultInfraManifestFiles), migrateInfraExtensionManifest, options.format || latestInfraManifestFormat, logger @@ -474,7 +474,7 @@ const runMigrateCommand = async ( logger ); migrateManifestFile( - parseManifestFileOption(options.manifestFile, defaultWorkflowManifest), + parseManifestFileOption(options.manifestFile, defaultWorkflowManifestFiles), migrateWorkflow, options.format || latestPolywrapWorkflowFormat, logger diff --git a/packages/cli/src/commands/test.ts b/packages/cli/src/commands/test.ts index f20564a7e3..3c15168864 100644 --- a/packages/cli/src/commands/test.ts +++ b/packages/cli/src/commands/test.ts @@ -12,7 +12,7 @@ import { validateJobNames, validateOutput, WorkflowOutput, - defaultWorkflowManifest, + defaultWorkflowManifestFiles, parseManifestFileOption, parseLogFileOption, parseWrapperEnvsOption, @@ -33,7 +33,7 @@ export interface TestCommandOptions extends BaseCommandOptions { outputFile: string | false; } -const defaultManifestStr = defaultWorkflowManifest.join(" | "); +const defaultManifestStr = defaultWorkflowManifestFiles.join(" | "); const pathStr = intlMsg.commands_test_options_m_path(); export const test: Command = { @@ -74,7 +74,7 @@ export const test: Command = { await _run({ manifestFile: parseManifestFileOption( options.manifestFile, - defaultWorkflowManifest + defaultWorkflowManifestFiles ), clientConfig: options.clientConfig || false, wrapperEnvs: options.wrapperEnvs || false, diff --git a/packages/cli/src/lib/project/manifests/polywrap/load.ts b/packages/cli/src/lib/project/manifests/polywrap/load.ts index 3b80c234b6..c20bf0a8e4 100644 --- a/packages/cli/src/lib/project/manifests/polywrap/load.ts +++ b/packages/cli/src/lib/project/manifests/polywrap/load.ts @@ -23,7 +23,7 @@ import { Schema as JsonSchema } from "jsonschema"; import path from "path"; import fs from "fs"; -export const defaultPolywrapManifest = ["polywrap.yaml", "polywrap.yml"]; +export const defaultPolywrapManifestFiles = ["polywrap.yaml", "polywrap.yml"]; export async function loadPolywrapManifest( manifestPath: string, @@ -59,7 +59,7 @@ export async function loadPolywrapManifest( ); } -export const defaultBuildManifest = [ +export const defaultBuildManifestFiles = [ "polywrap.build.yaml", "polywrap.build.yml", ]; @@ -116,11 +116,28 @@ export async function loadBuildManifest( ); } -export const defaultDeployManifest = [ +export const defaultDeployManifestFiles = [ "polywrap.deploy.yaml", "polywrap.deploy.yml", ]; +export const defaultDeployManifest: DeployManifest = { + format: "0.3.0", + jobs: { + ipfs_deploy: { + steps: [{ + name: "deploy to ipfs.wrappers.io", + package: "ipfs", + uri: "file/./build", + config: { + gatewayUri: "https://ipfs.wrappers.io" + } + }] + } + }, + __type: "DeployManifest" +}; + export async function loadDeployManifest( manifestPath: string, logger: Logger @@ -129,6 +146,12 @@ export async function loadDeployManifest( const manifest = fs.readFileSync(manifestPath, "utf-8"); if (!manifest) { + // If the manifest wasn't found, and it was a default path, + // assume we should fallback to a default manifest. + if (defaultDeployManifestFiles.includes(manifestPath)) { + return Promise.resolve(defaultDeployManifest); + } + const noLoadMessage = intlMsg.lib_helpers_manifest_unableToLoad({ path: `${manifestPath}`, }); @@ -195,7 +218,7 @@ export async function loadDeployManifestExt( ); } -export const defaultInfraManifest = [ +export const defaultInfraManifestFiles = [ "polywrap.infra.yaml", "polywrap.infra.yml", ]; @@ -237,7 +260,7 @@ export async function loadInfraManifest( ); } -export const defaultWorkflowManifest = [ +export const defaultWorkflowManifestFiles = [ "polywrap.test.yaml", "polywrap.test.yml", ]; From 74ad743144addf586128f0cf89a95715009a5ca1 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Fri, 23 Jun 2023 14:23:47 -0400 Subject: [PATCH 031/181] chore: init structure --- packages/schema/bind/package.json | 1 + .../src/bindings/assemblyscript/wasm/index.ts | 2 +- packages/schema/bind/src/bindings/index.ts | 9 ++++--- .../bind/src/bindings/python/plugin/index.ts | 6 ++--- .../bind/src/bindings/rust/plugin/index.ts | 6 ++--- .../bind/src/bindings/rust/wasm/index.ts | 2 +- packages/schema/bind/src/bindings/types.ts | 2 +- .../src/bindings/typescript/plugin/index.ts | 6 ++--- .../schema/bind/src/bindings/wrap-bindgen.ts | 27 +++++++++++++++++++ packages/schema/bind/src/index.ts | 4 +-- packages/schema/bind/src/types.ts | 9 +++---- todo | 3 +++ yarn.lock | 2 +- 13 files changed, 56 insertions(+), 23 deletions(-) create mode 100644 packages/schema/bind/src/bindings/wrap-bindgen.ts create mode 100644 todo diff --git a/packages/schema/bind/package.json b/packages/schema/bind/package.json index 9873e0cb95..053a6b9056 100644 --- a/packages/schema/bind/package.json +++ b/packages/schema/bind/package.json @@ -19,6 +19,7 @@ "copy:templates": "copyfiles -u 1 src/**/*.mustache build/" }, "dependencies": { + "@polywrap/client-js": "~0.10.1", "@polywrap/os-js": "0.10.5", "@polywrap/schema-parse": "0.10.5", "@polywrap/wrap-manifest-types-js": "0.10.0", diff --git a/packages/schema/bind/src/bindings/assemblyscript/wasm/index.ts b/packages/schema/bind/src/bindings/assemblyscript/wasm/index.ts index 1bfdea57cc..a3fe54738f 100644 --- a/packages/schema/bind/src/bindings/assemblyscript/wasm/index.ts +++ b/packages/schema/bind/src/bindings/assemblyscript/wasm/index.ts @@ -28,7 +28,7 @@ export const generateBinding: GenerateBindingFn = ( outputDirAbs: options.outputDirAbs, }; const output = result.output; - const abi = applyTransforms(options.abi); + const abi = applyTransforms(options.wrapInfo.abi); // Generate object type folders if (abi.objectTypes) { diff --git a/packages/schema/bind/src/bindings/index.ts b/packages/schema/bind/src/bindings/index.ts index c6913c970c..a06c9f99f9 100644 --- a/packages/schema/bind/src/bindings/index.ts +++ b/packages/schema/bind/src/bindings/index.ts @@ -4,6 +4,7 @@ import * as AssemblyScript from "./assemblyscript"; import * as Rust from "./rust"; import * as Python from "./python"; import * as TypeScript from "./typescript"; +import * as WrapBindgen from "./wrap-bindgen"; export { AssemblyScript, Rust, TypeScript }; export * from "./types"; @@ -13,9 +14,11 @@ export function getGenerateBindingFn( bindLanguage: BindLanguage ): GenerateBindingFn { switch (bindLanguage) { - case "wasm-as": - return AssemblyScript.Wasm.generateBinding; - case "wasm-rs": + case "wrap-as": + return WrapBindgen.getGenerateBindingFn( + `file/${__dirname}/../../../../../../wrap-abi-bindgen/implementations/wrap-assemblyscript/build` + ); + case "wrap-rs": return Rust.Wasm.generateBinding; case "plugin-ts": return TypeScript.Plugin.generateBinding; diff --git a/packages/schema/bind/src/bindings/python/plugin/index.ts b/packages/schema/bind/src/bindings/python/plugin/index.ts index 086605fe7e..5cbd63d7ed 100644 --- a/packages/schema/bind/src/bindings/python/plugin/index.ts +++ b/packages/schema/bind/src/bindings/python/plugin/index.ts @@ -41,13 +41,13 @@ export const generateBinding: GenerateBindingFn = ( options: BindOptions ): BindOutput => { const escapedAbi = JSON.stringify( - sort((options.abi as unknown) as Record) + sort((options.wrapInfo.abi as unknown) as Record) ).replace(/\\n/g, "\\\\n"); const formattedAbi = JSON.stringify(JSON.parse(escapedAbi), null, 2); // Apply Abi transforms - const abi = applyTransforms(options.abi); + const abi = applyTransforms(options.wrapInfo.abi); // Generate Bindings const result: BindOutput = { @@ -58,7 +58,7 @@ export const generateBinding: GenerateBindingFn = ( }; const output = result.output; const manifest = { - name: options.projectName, + name: options.wrapInfo.name, type: "plugin", version: latestWrapManifestVersion, abi: formattedAbi, diff --git a/packages/schema/bind/src/bindings/rust/plugin/index.ts b/packages/schema/bind/src/bindings/rust/plugin/index.ts index 180a40ccdd..84eb6661ca 100644 --- a/packages/schema/bind/src/bindings/rust/plugin/index.ts +++ b/packages/schema/bind/src/bindings/rust/plugin/index.ts @@ -44,14 +44,14 @@ export const generateBinding: GenerateBindingFn = ( outputDirAbs: options.outputDirAbs, }; const output = result.output; - const abi = applyTransforms(options.abi); + const abi = applyTransforms(options.wrapInfo.abi); const manifest = { - name: options.projectName, + name: options.wrapInfo.name, type: "plugin", version: latestWrapManifestVersion, abi: JSON.stringify( - sort((options.abi as unknown) as Record), + sort((options.wrapInfo.abi as unknown) as Record), null, 2 ), diff --git a/packages/schema/bind/src/bindings/rust/wasm/index.ts b/packages/schema/bind/src/bindings/rust/wasm/index.ts index ff7fdcc617..8c4ce600f4 100644 --- a/packages/schema/bind/src/bindings/rust/wasm/index.ts +++ b/packages/schema/bind/src/bindings/rust/wasm/index.ts @@ -33,7 +33,7 @@ export const generateBinding: GenerateBindingFn = ( outputDirAbs: options.outputDirAbs, }; const output = result.output; - const abi = applyTransforms(options.abi); + const abi = applyTransforms(options.wrapInfo.abi); // Generate object type folders if (abi.objectTypes) { diff --git a/packages/schema/bind/src/bindings/types.ts b/packages/schema/bind/src/bindings/types.ts index cdae810318..db2cb6d8cf 100644 --- a/packages/schema/bind/src/bindings/types.ts +++ b/packages/schema/bind/src/bindings/types.ts @@ -1,6 +1,6 @@ import { BindOptions, BindOutput } from "../"; -export type GenerateBindingFn = (options: BindOptions) => BindOutput; +export type GenerateBindingFn = (options: BindOptions) => Promise | BindOutput; export type MustacheFn = () => ( value: string, diff --git a/packages/schema/bind/src/bindings/typescript/plugin/index.ts b/packages/schema/bind/src/bindings/typescript/plugin/index.ts index c6111472dc..b9ad051c9a 100644 --- a/packages/schema/bind/src/bindings/typescript/plugin/index.ts +++ b/packages/schema/bind/src/bindings/typescript/plugin/index.ts @@ -40,7 +40,7 @@ export const generateBinding: GenerateBindingFn = ( options: BindOptions ): BindOutput => { // Apply Abi transforms - const abi = applyTransforms(options.abi); + const abi = applyTransforms(options.wrapInfo.abi); // Generate Bindings const result: BindOutput = { @@ -51,11 +51,11 @@ export const generateBinding: GenerateBindingFn = ( }; const output = result.output; const manifest = { - name: options.projectName, + name: options.wrapInfo.name, type: "plugin", version: latestWrapManifestVersion, abi: JSON.stringify( - sort((options.abi as unknown) as Record), + sort((options.wrapInfo.abi as unknown) as Record), null, 2 ), diff --git a/packages/schema/bind/src/bindings/wrap-bindgen.ts b/packages/schema/bind/src/bindings/wrap-bindgen.ts new file mode 100644 index 0000000000..a0a1bf3c02 --- /dev/null +++ b/packages/schema/bind/src/bindings/wrap-bindgen.ts @@ -0,0 +1,27 @@ +import { BindOutput, BindOptions } from "../types"; +import { GenerateBindingFn } from "./types"; + +import { PolywrapClient } from "@polywrap/client-js"; + +export function getGenerateBindingFn( + uri: string +): GenerateBindingFn { + return (options: BindOptions) => + invokeBindgenWrap(uri, options); +} + +function invokeBindgenWrap( + uri: string, + options: BindOptions +): BindOutput { + const client = new PolywrapClient(); + // NOTE: might need to serialize config & wrapInfo.abi to a string + const result = client.invoke({ + uri, + method: "generateBindings", + args: { + wrapInfo: options.wrapInfo, + context: options.config + } + }); +} diff --git a/packages/schema/bind/src/index.ts b/packages/schema/bind/src/index.ts index ecdf3c5f15..422198454a 100644 --- a/packages/schema/bind/src/index.ts +++ b/packages/schema/bind/src/index.ts @@ -9,6 +9,6 @@ Mustache.escape = (value) => value; export * from "./types"; export * from "./bindings"; -export function bindSchema(options: BindOptions): BindOutput { - return getGenerateBindingFn(options.bindLanguage)(options); +export async function bindSchema(options: BindOptions): Promise { + return await getGenerateBindingFn(options.bindLanguage)(options); } diff --git a/packages/schema/bind/src/types.ts b/packages/schema/bind/src/types.ts index 8ba900f272..3085b9f44b 100644 --- a/packages/schema/bind/src/types.ts +++ b/packages/schema/bind/src/types.ts @@ -1,9 +1,9 @@ import { OutputDirectory } from "@polywrap/os-js"; -import { WrapAbi } from "@polywrap/schema-parse"; +import { WrapManifest } from "@polywrap/wrap-manifest-types-js"; export type BindLanguage = - | "wasm-as" - | "wasm-rs" + | "wrap-as" + | "wrap-rs" | "plugin-ts" | "plugin-rs" | "plugin-py" @@ -15,9 +15,8 @@ export interface BindOutput { } export interface BindOptions { - projectName: string; bindLanguage: BindLanguage; - abi: WrapAbi; + wrapInfo: WrapManifest; config?: Record; outputDirAbs: string; } diff --git a/todo b/todo new file mode 100644 index 0000000000..30a5410588 --- /dev/null +++ b/todo @@ -0,0 +1,3 @@ +- when codegen for wrap/assemblyscript, use wrap URI + - can add in schema-bind package +- add configuration option to override bindings with your own URI diff --git a/yarn.lock b/yarn.lock index 9b7acc0b81..544eac67c3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2204,7 +2204,7 @@ "@polywrap/uri-resolvers-js" "0.10.0" "@polywrap/wrap-manifest-types-js" "0.10.0" -"@polywrap/client-js@~0.10.0": +"@polywrap/client-js@~0.10.0", "@polywrap/client-js@~0.10.1": version "0.10.1" resolved "https://registry.yarnpkg.com/@polywrap/client-js/-/client-js-0.10.1.tgz#d324420b1558d7fb47c6928042c083eef7b3b6f6" integrity sha512-xIZoGOPPS+J2RjiyEF8A8huMIr0IyN+VEwHWcCUdp7NxTQ1xmve1lxQfbbdE0BC37o5Ni7lJwiIXmAUfhuMyGg== From 4d3feda236fca4c4838fc041116df0476d2b6d0c Mon Sep 17 00:00:00 2001 From: krisbitney Date: Fri, 30 Jun 2023 21:57:59 -0500 Subject: [PATCH 032/181] added wrap-bindgen logic; added kotlin plugin bindings; wrap-as tests failing due to spacing --- packages/cli/package.json | 18 +- .../src/lib/codegen/ScriptCodeGenerator.ts | 17 +- .../ens-recursive-name-register/index.ts | 17 +- .../lib/defaults/deploy-modules/ens/index.ts | 17 +- .../cli/src/lib/docgen/docusaurus/index.ts | 2 +- packages/cli/src/lib/docgen/jsdoc/index.ts | 2 +- packages/cli/src/lib/docgen/schema/index.ts | 2 +- .../src/lib/option-parsers/client-config.ts | 10 +- .../src/lib/option-parsers/wrapper-envs.ts | 4 +- packages/cli/src/lib/project/AppProject.ts | 32 +- packages/cli/src/lib/project/PluginProject.ts | 20 +- .../cli/src/lib/project/PolywrapProject.ts | 19 +- .../lib/project/manifests/plugin/languages.ts | 3 + .../project/manifests/polywrap/languages.ts | 4 +- .../cli/src/lib/test-env/client-config.ts | 51 ++-- packages/cli/src/lib/workflow/JobRunner.ts | 4 +- packages/schema/bind/package.json | 2 +- packages/schema/bind/src/__tests__/index.ts | 8 +- .../bind/src/__tests__/test-cases.spec.ts | 10 +- packages/schema/bind/src/bindings/index.ts | 23 +- packages/schema/bind/src/bindings/types.ts | 33 ++- .../bind/src/bindings/typescript/app/index.ts | 2 +- .../schema/bind/src/bindings/wrap-bindgen.ts | 75 ++++- packages/schema/bind/src/types.ts | 8 + .../bind/sanity/output/plugin-kt/module.kt | 142 +++++++++ .../bind/sanity/output/plugin-kt/types.kt | 223 ++++++++++++++ .../bind/sanity/output/plugin-kt/wrap.info.kt | 17 ++ .../bind/sanity/output/plugin-py/module.py | 1 - .../{wasm-as => wrap-as}/AnotherType/index.ts | 0 .../AnotherType/serialization.ts | 0 .../{wasm-as => wrap-as}/CustomEnum/index.ts | 0 .../CustomMapValue/index.ts | 0 .../CustomMapValue/serialization.ts | 0 .../{wasm-as => wrap-as}/CustomType/index.ts | 0 .../CustomType/serialization.ts | 0 .../output/{wasm-as => wrap-as}/Env/index.ts | 0 .../{wasm-as => wrap-as}/Env/serialization.ts | 0 .../{wasm-as => wrap-as}/Module/index.ts | 0 .../{wasm-as => wrap-as}/Module/module.ts | 0 .../Module/serialization.ts | 0 .../{wasm-as => wrap-as}/Module/wrapped.ts | 0 .../{wasm-as => wrap-as}/TestImport/index.ts | 0 .../output/{wasm-as => wrap-as}/else/index.ts | 0 .../else/serialization.ts | 0 .../output/{wasm-as => wrap-as}/entry.ts | 0 .../TestImport_AnotherObject/index.ts | 0 .../TestImport_AnotherObject/serialization.ts | 0 .../imported/TestImport_Enum/index.ts | 0 .../imported/TestImport_Enum_Return/index.ts | 0 .../imported/TestImport_Env/index.ts | 0 .../imported/TestImport_Env/serialization.ts | 0 .../imported/TestImport_Module/index.ts | 0 .../TestImport_Module/serialization.ts | 0 .../imported/TestImport_Object/index.ts | 0 .../TestImport_Object/serialization.ts | 0 .../{wasm-as => wrap-as}/imported/index.ts | 0 .../output/{wasm-as => wrap-as}/index.ts | 0 .../{wasm-as => wrap-as}/while/index.ts | 0 .../output/{wasm-rs => wrap-rs}/_else/mod.rs | 0 .../_else/serialization.rs | 0 .../output/{wasm-rs => wrap-rs}/_while/mod.rs | 0 .../{wasm-rs => wrap-rs}/another_type/mod.rs | 0 .../another_type/serialization.rs | 0 .../{wasm-rs => wrap-rs}/custom_enum/mod.rs | 0 .../custom_map_value/mod.rs | 0 .../custom_map_value/serialization.rs | 0 .../{wasm-rs => wrap-rs}/custom_type/mod.rs | 0 .../custom_type/serialization.rs | 0 .../output/{wasm-rs => wrap-rs}/entry.rs | 0 .../output/{wasm-rs => wrap-rs}/env/mod.rs | 0 .../{wasm-rs => wrap-rs}/env/serialization.rs | 0 .../{wasm-rs => wrap-rs}/imported/mod.rs | 0 .../test_import_another_object/mod.rs | 0 .../serialization.rs | 0 .../imported/test_import_enum/mod.rs | 0 .../imported/test_import_enum_return/mod.rs | 0 .../imported/test_import_env/mod.rs | 0 .../imported/test_import_env/serialization.rs | 0 .../imported/test_import_module/mod.rs | 0 .../test_import_module/serialization.rs | 0 .../imported/test_import_object/mod.rs | 0 .../test_import_object/serialization.rs | 0 .../sanity/output/{wasm-rs => wrap-rs}/mod.rs | 0 .../output/{wasm-rs => wrap-rs}/module/mod.rs | 0 .../{wasm-rs => wrap-rs}/module/module.rs | 0 .../module/serialization.rs | 0 .../{wasm-rs => wrap-rs}/module/wrapped.rs | 0 .../{wasm-rs => wrap-rs}/test_import/mod.rs | 0 yarn.lock | 280 ++++++++++++------ 89 files changed, 834 insertions(+), 212 deletions(-) create mode 100644 packages/test-cases/cases/bind/sanity/output/plugin-kt/module.kt create mode 100644 packages/test-cases/cases/bind/sanity/output/plugin-kt/types.kt create mode 100644 packages/test-cases/cases/bind/sanity/output/plugin-kt/wrap.info.kt rename packages/test-cases/cases/bind/sanity/output/{wasm-as => wrap-as}/AnotherType/index.ts (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-as => wrap-as}/AnotherType/serialization.ts (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-as => wrap-as}/CustomEnum/index.ts (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-as => wrap-as}/CustomMapValue/index.ts (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-as => wrap-as}/CustomMapValue/serialization.ts (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-as => wrap-as}/CustomType/index.ts (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-as => wrap-as}/CustomType/serialization.ts (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-as => wrap-as}/Env/index.ts (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-as => wrap-as}/Env/serialization.ts (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-as => wrap-as}/Module/index.ts (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-as => wrap-as}/Module/module.ts (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-as => wrap-as}/Module/serialization.ts (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-as => wrap-as}/Module/wrapped.ts (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-as => wrap-as}/TestImport/index.ts (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-as => wrap-as}/else/index.ts (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-as => wrap-as}/else/serialization.ts (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-as => wrap-as}/entry.ts (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-as => wrap-as}/imported/TestImport_AnotherObject/index.ts (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-as => wrap-as}/imported/TestImport_AnotherObject/serialization.ts (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-as => wrap-as}/imported/TestImport_Enum/index.ts (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-as => wrap-as}/imported/TestImport_Enum_Return/index.ts (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-as => wrap-as}/imported/TestImport_Env/index.ts (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-as => wrap-as}/imported/TestImport_Env/serialization.ts (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-as => wrap-as}/imported/TestImport_Module/index.ts (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-as => wrap-as}/imported/TestImport_Module/serialization.ts (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-as => wrap-as}/imported/TestImport_Object/index.ts (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-as => wrap-as}/imported/TestImport_Object/serialization.ts (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-as => wrap-as}/imported/index.ts (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-as => wrap-as}/index.ts (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-as => wrap-as}/while/index.ts (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-rs => wrap-rs}/_else/mod.rs (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-rs => wrap-rs}/_else/serialization.rs (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-rs => wrap-rs}/_while/mod.rs (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-rs => wrap-rs}/another_type/mod.rs (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-rs => wrap-rs}/another_type/serialization.rs (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-rs => wrap-rs}/custom_enum/mod.rs (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-rs => wrap-rs}/custom_map_value/mod.rs (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-rs => wrap-rs}/custom_map_value/serialization.rs (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-rs => wrap-rs}/custom_type/mod.rs (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-rs => wrap-rs}/custom_type/serialization.rs (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-rs => wrap-rs}/entry.rs (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-rs => wrap-rs}/env/mod.rs (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-rs => wrap-rs}/env/serialization.rs (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-rs => wrap-rs}/imported/mod.rs (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-rs => wrap-rs}/imported/test_import_another_object/mod.rs (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-rs => wrap-rs}/imported/test_import_another_object/serialization.rs (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-rs => wrap-rs}/imported/test_import_enum/mod.rs (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-rs => wrap-rs}/imported/test_import_enum_return/mod.rs (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-rs => wrap-rs}/imported/test_import_env/mod.rs (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-rs => wrap-rs}/imported/test_import_env/serialization.rs (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-rs => wrap-rs}/imported/test_import_module/mod.rs (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-rs => wrap-rs}/imported/test_import_module/serialization.rs (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-rs => wrap-rs}/imported/test_import_object/mod.rs (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-rs => wrap-rs}/imported/test_import_object/serialization.rs (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-rs => wrap-rs}/mod.rs (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-rs => wrap-rs}/module/mod.rs (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-rs => wrap-rs}/module/module.rs (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-rs => wrap-rs}/module/serialization.rs (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-rs => wrap-rs}/module/wrapped.rs (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-rs => wrap-rs}/test_import/mod.rs (100%) diff --git a/packages/cli/package.json b/packages/cli/package.json index d20311d753..7ad36f1670 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -46,22 +46,22 @@ "@ethersproject/providers": "5.6.8", "@ethersproject/wallet": "5.6.2", "@formatjs/intl": "1.8.2", - "@polywrap/asyncify-js": "0.10.0", - "@polywrap/client-config-builder-js": "0.10.0", - "@polywrap/client-js": "0.10.0", - "@polywrap/core-js": "0.10.0", + "@polywrap/asyncify-js": "0.11.0", + "@polywrap/client-config-builder-js": "0.11.0", + "@polywrap/client-js": "0.11.0", + "@polywrap/core-js": "0.11.0", "@polywrap/ethereum-provider-js-v1": "npm:@polywrap/ethereum-provider-js@~0.2.4", "@polywrap/logging-js": "0.10.6", "@polywrap/os-js": "0.10.6", "@polywrap/polywrap-manifest-types-js": "0.10.6", - "@polywrap/result": "0.10.0", + "@polywrap/result": "0.11.0", "@polywrap/schema-bind": "0.10.6", "@polywrap/schema-compose": "0.10.6", "@polywrap/schema-parse": "0.10.6", - "@polywrap/uri-resolver-extensions-js": "0.10.0", - "@polywrap/uri-resolvers-js": "0.10.0", - "@polywrap/wasm-js": "0.10.0", - "@polywrap/wrap-manifest-types-js": "0.10.0", + "@polywrap/uri-resolver-extensions-js": "0.11.0", + "@polywrap/uri-resolvers-js": "0.11.0", + "@polywrap/wasm-js": "0.11.0", + "@polywrap/wrap-manifest-types-js": "0.11.0", "axios": "0.21.2", "chalk": "4.1.0", "chokidar": "3.5.1", diff --git a/packages/cli/src/lib/codegen/ScriptCodeGenerator.ts b/packages/cli/src/lib/codegen/ScriptCodeGenerator.ts index 984bf4c7e5..c5487b6142 100644 --- a/packages/cli/src/lib/codegen/ScriptCodeGenerator.ts +++ b/packages/cli/src/lib/codegen/ScriptCodeGenerator.ts @@ -5,10 +5,15 @@ import { SchemaComposer } from "../SchemaComposer"; import { CodeGenerator } from "./CodeGenerator"; import { writeDirectorySync } from "@polywrap/os-js"; -import { BindLanguage, GenerateBindingFn } from "@polywrap/schema-bind"; +import { + BindLanguage, + bindLanguageToWrapInfoType, + GenerateBindingFn, +} from "@polywrap/schema-bind"; import { readFileSync } from "fs-extra"; import Mustache from "mustache"; import path from "path"; +import { latestWrapManifestVersion } from "@polywrap/wrap-manifest-types-js"; export class ScriptCodegenerator extends CodeGenerator { private readonly _script: string; @@ -62,11 +67,15 @@ export class ScriptCodegenerator extends CodeGenerator { ); const binding = await generateBinding({ - projectName: await this._config.project.getName(), - abi: await this._config.schemaComposer.getComposedAbis(), - outputDirAbs, bindLanguage, + wrapInfo: { + version: latestWrapManifestVersion, + name: await this._config.project.getName(), + type: bindLanguageToWrapInfoType(bindLanguage), + abi: await this._config.schemaComposer.getComposedAbis(), + }, config: this._mustacheView, + outputDirAbs, }); resetDir(outputDirAbs); diff --git a/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/index.ts b/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/index.ts index 05384bedbc..523912cbf1 100644 --- a/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/index.ts +++ b/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/index.ts @@ -5,9 +5,12 @@ import { invokeWithTimeout } from "./invokeWithTimeout"; import { Wallet } from "@ethersproject/wallet"; import { JsonRpcProvider } from "@ethersproject/providers"; -import { Uri } from "@polywrap/core-js"; -import { ClientConfigBuilder, PolywrapClient } from "@polywrap/client-js"; -import { DefaultBundle } from "@polywrap/client-config-builder-js"; +import { IWrapPackage, Uri } from "@polywrap/core-js"; +import { + PolywrapClientConfigBuilder, + PolywrapClient, +} from "@polywrap/client-js"; +import { Web3 } from "@polywrap/client-config-builder-js"; import { Connection, Connections, @@ -60,13 +63,13 @@ class ENSRecursiveNameRegisterPublisher implements DeployModule { defaultNetwork: network, }); - const clientConfig = new ClientConfigBuilder() + const clientConfig = new PolywrapClientConfigBuilder() .addDefaults() - .addPackage( - DefaultBundle.plugins.ethereumProviderV1.uri.uri, + .setPackage( + Web3.bundle.ethereumProviderV1.uri, ethereumProviderPlugin({ connections: connections, - }) + }) as IWrapPackage ) .build(); diff --git a/packages/cli/src/lib/defaults/deploy-modules/ens/index.ts b/packages/cli/src/lib/defaults/deploy-modules/ens/index.ts index 44cd35bdc6..b7ad57b527 100644 --- a/packages/cli/src/lib/defaults/deploy-modules/ens/index.ts +++ b/packages/cli/src/lib/defaults/deploy-modules/ens/index.ts @@ -5,9 +5,12 @@ import { invokeWithTimeout } from "./invokeWithTimeout"; import { Wallet } from "@ethersproject/wallet"; import { JsonRpcProvider } from "@ethersproject/providers"; -import { Uri } from "@polywrap/core-js"; -import { ClientConfigBuilder, PolywrapClient } from "@polywrap/client-js"; -import { DefaultBundle } from "@polywrap/client-config-builder-js"; +import { IWrapPackage, Uri } from "@polywrap/core-js"; +import { + PolywrapClient, + PolywrapClientConfigBuilder, +} from "@polywrap/client-js"; +import { Web3 } from "@polywrap/client-config-builder-js"; import { Connection, Connections, @@ -57,13 +60,13 @@ class ENSPublisher implements DeployModule { defaultNetwork: network, }); - const clientConfig = new ClientConfigBuilder() + const clientConfig = new PolywrapClientConfigBuilder() .addDefaults() - .addPackage( - DefaultBundle.plugins.ethereumProviderV1.uri.uri, + .setPackage( + Web3.bundle.ethereumProviderV1.uri, ethereumProviderPlugin({ connections: connections, - }) + }) as IWrapPackage ) .build(); diff --git a/packages/cli/src/lib/docgen/docusaurus/index.ts b/packages/cli/src/lib/docgen/docusaurus/index.ts index ef175f7dae..6876783821 100644 --- a/packages/cli/src/lib/docgen/docusaurus/index.ts +++ b/packages/cli/src/lib/docgen/docusaurus/index.ts @@ -35,7 +35,7 @@ export const generateBinding: GenerateBindingFn = ( outputDirAbs: options.outputDirAbs, }; const output = result.output; - const abi = applyTransforms(options.abi); + const abi = applyTransforms(options.wrapInfo.abi); sortObjectsInPlaceByType(abi); sortMethodsInPlaceByName(abi); diff --git a/packages/cli/src/lib/docgen/jsdoc/index.ts b/packages/cli/src/lib/docgen/jsdoc/index.ts index d9d95ce684..60c2c0a901 100644 --- a/packages/cli/src/lib/docgen/jsdoc/index.ts +++ b/packages/cli/src/lib/docgen/jsdoc/index.ts @@ -37,7 +37,7 @@ export const generateBinding: GenerateBindingFn = ( outputDirAbs: options.outputDirAbs, }; const output = result.output; - const abi = applyTransforms(options.abi); + const abi = applyTransforms(options.wrapInfo.abi); sortObjectsInPlaceByType(abi); sortMethodsInPlaceByName(abi); diff --git a/packages/cli/src/lib/docgen/schema/index.ts b/packages/cli/src/lib/docgen/schema/index.ts index 0f85d1254d..a66813abfa 100644 --- a/packages/cli/src/lib/docgen/schema/index.ts +++ b/packages/cli/src/lib/docgen/schema/index.ts @@ -38,7 +38,7 @@ export const generateBinding: GenerateBindingFn = ( // generate schema const schemaContext = { - schema: renderSchema(options.abi, true), + schema: renderSchema(options.wrapInfo.abi, true), }; renderTemplate( "./templates/schema.mustache", diff --git a/packages/cli/src/lib/option-parsers/client-config.ts b/packages/cli/src/lib/option-parsers/client-config.ts index 6d57d580e8..8206d3b91c 100644 --- a/packages/cli/src/lib/option-parsers/client-config.ts +++ b/packages/cli/src/lib/option-parsers/client-config.ts @@ -2,14 +2,16 @@ import { intlMsg } from "../intl"; import { importTypescriptModule } from "../system"; import { getTestEnvClientConfig } from "../test-env"; -import { ClientConfigBuilder } from "@polywrap/client-config-builder-js"; +import { + PolywrapClientConfigBuilder, + 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 | false -): Promise { - const builder = new ClientConfigBuilder().addDefaults(); +): Promise { + const builder = new PolywrapClientConfigBuilder().addDefaults(); try { builder.add(getTestEnvClientConfig()); diff --git a/packages/cli/src/lib/option-parsers/wrapper-envs.ts b/packages/cli/src/lib/option-parsers/wrapper-envs.ts index a386087c63..d34f1416b3 100644 --- a/packages/cli/src/lib/option-parsers/wrapper-envs.ts +++ b/packages/cli/src/lib/option-parsers/wrapper-envs.ts @@ -1,6 +1,6 @@ import { loadEnvironmentVariables } from "../system"; -import { ClientConfigBuilder } from "@polywrap/client-config-builder-js"; +import { PolywrapClientConfigBuilder } from "@polywrap/client-config-builder-js"; import fs from "fs"; import YAML from "yaml"; @@ -34,7 +34,7 @@ export async function parseWrapperEnvsOption( Record >; - const builder = new ClientConfigBuilder(); + const builder = new PolywrapClientConfigBuilder(); for (const env in wrapperEnvs) { builder.addEnv(env, wrapperEnvs[env]); diff --git a/packages/cli/src/lib/project/AppProject.ts b/packages/cli/src/lib/project/AppProject.ts index a57de16759..371786057a 100644 --- a/packages/cli/src/lib/project/AppProject.ts +++ b/packages/cli/src/lib/project/AppProject.ts @@ -8,9 +8,17 @@ import { } from "./manifests"; import { AppManifest } from "@polywrap/polywrap-manifest-types-js"; -import { bindSchema, BindOutput } from "@polywrap/schema-bind"; +import { + bindSchema, + BindOutput, + BindOptions, + bindLanguageToWrapInfoType, +} from "@polywrap/schema-bind"; import path from "path"; -import { WrapAbi } from "@polywrap/wrap-manifest-types-js"; +import { + latestWrapManifestVersion, + WrapAbi, +} from "@polywrap/wrap-manifest-types-js"; export interface AppProjectConfig extends ProjectConfig { appManifestPath: string; @@ -107,14 +115,20 @@ export class AppProject extends Project { abi: WrapAbi, generationSubPath?: string ): Promise { - return bindSchema({ - projectName: await this.getName(), - abi, + const bindLanguage = appManifestLanguageToBindLanguage( + await this.getManifestLanguage() + ); + const options: BindOptions = { + bindLanguage, + wrapInfo: { + version: latestWrapManifestVersion, + name: await this.getName(), + type: bindLanguageToWrapInfoType(bindLanguage), + abi, + }, outputDirAbs: await this.getGenerationDirectory(generationSubPath), - bindLanguage: appManifestLanguageToBindLanguage( - await this.getManifestLanguage() - ), - }); + }; + return bindSchema(options); } private _getGenerationDirectory( diff --git a/packages/cli/src/lib/project/PluginProject.ts b/packages/cli/src/lib/project/PluginProject.ts index d8b9f9f189..9da9a5d046 100644 --- a/packages/cli/src/lib/project/PluginProject.ts +++ b/packages/cli/src/lib/project/PluginProject.ts @@ -10,9 +10,15 @@ import { import { resetDir } from "../system"; import { PluginManifest } from "@polywrap/polywrap-manifest-types-js"; -import { bindSchema, BindOutput, BindOptions } from "@polywrap/schema-bind"; +import { + bindSchema, + BindOutput, + BindOptions, + bindLanguageToWrapInfoType, +} from "@polywrap/schema-bind"; import { WrapAbi } from "@polywrap/schema-parse"; import path from "path"; +import { latestWrapManifestVersion } from "@polywrap/wrap-manifest-types-js"; export interface PluginProjectConfig extends ProjectConfig { pluginManifestPath: string; @@ -113,22 +119,26 @@ export class PluginProject extends Project { abi: WrapAbi, generationSubPath?: string ): Promise { - const manifest = await this.getManifest(); const moduleDirectory = await this.getGenerationDirectory( generationSubPath ); // Clean the code generation resetDir(moduleDirectory); + const bindLanguage = pluginManifestLanguageToBindLanguage( await this.getManifestLanguage() ); const options: BindOptions = { - projectName: manifest.project.name, - abi, - outputDirAbs: moduleDirectory, bindLanguage, + wrapInfo: { + version: latestWrapManifestVersion, + name: await this.getName(), + type: bindLanguageToWrapInfoType(bindLanguage), + abi, + }, + outputDirAbs: moduleDirectory, }; return bindSchema(options); diff --git a/packages/cli/src/lib/project/PolywrapProject.ts b/packages/cli/src/lib/project/PolywrapProject.ts index 465a6fc2d3..f9c78c410f 100644 --- a/packages/cli/src/lib/project/PolywrapProject.ts +++ b/packages/cli/src/lib/project/PolywrapProject.ts @@ -19,12 +19,18 @@ import { PolywrapManifest, } from "@polywrap/polywrap-manifest-types-js"; import { normalizePath } from "@polywrap/os-js"; -import { BindOptions, BindOutput, bindSchema } from "@polywrap/schema-bind"; +import { + bindLanguageToWrapInfoType, + BindOptions, + BindOutput, + bindSchema, +} from "@polywrap/schema-bind"; import { WrapAbi } from "@polywrap/schema-parse"; import regexParser from "regex-parser"; import path from "path"; import fs from "fs"; import fsExtra from "fs-extra"; +import { latestWrapManifestVersion } from "@polywrap/wrap-manifest-types-js"; export interface PolywrapProjectConfig extends ProjectConfig { polywrapManifestPath: string; @@ -148,7 +154,6 @@ export class PolywrapProject extends Project { abi: WrapAbi, generationSubPath?: string ): Promise { - const manifest = await this.getManifest(); const codegenDirectory = await this.getGenerationDirectory( generationSubPath ); @@ -161,10 +166,14 @@ export class PolywrapProject extends Project { ); const options: BindOptions = { - projectName: manifest.project.name, - abi, - outputDirAbs: codegenDirectory, bindLanguage, + wrapInfo: { + version: latestWrapManifestVersion, + name: await this.getName(), + type: bindLanguageToWrapInfoType(bindLanguage), + abi, + }, + outputDirAbs: codegenDirectory, }; return bindSchema(options); diff --git a/packages/cli/src/lib/project/manifests/plugin/languages.ts b/packages/cli/src/lib/project/manifests/plugin/languages.ts index 72811e9c62..a18745db6b 100644 --- a/packages/cli/src/lib/project/manifests/plugin/languages.ts +++ b/packages/cli/src/lib/project/manifests/plugin/languages.ts @@ -6,6 +6,7 @@ export const pluginManifestLanguages = { "plugin/typescript": "plugin/typescript", "plugin/rust": "plugin/rust", "plugin/python": "plugin/python", + "plugin/kotlin": "plugin/kotlin", }; export type PluginManifestLanguages = typeof pluginManifestLanguages; @@ -28,6 +29,8 @@ export function pluginManifestLanguageToBindLanguage( return "plugin-rs"; case "plugin/python": return "plugin-py"; + case "plugin/kotlin": + return "plugin-kt"; default: throw Error( intlMsg.lib_language_unsupportedManifestLanguage({ diff --git a/packages/cli/src/lib/project/manifests/polywrap/languages.ts b/packages/cli/src/lib/project/manifests/polywrap/languages.ts index d12c067c01..8bf8795a0f 100644 --- a/packages/cli/src/lib/project/manifests/polywrap/languages.ts +++ b/packages/cli/src/lib/project/manifests/polywrap/languages.ts @@ -23,9 +23,9 @@ export function polywrapManifestLanguageToBindLanguage( ): BindLanguage { switch (manifestLanguage) { case "wasm/assemblyscript": - return "wasm-as"; + return "wrap-as"; case "wasm/rust": - return "wasm-rs"; + return "wrap-rs"; case "interface": throw Error(intlMsg.lib_language_noInterfaceCodegen()); default: diff --git a/packages/cli/src/lib/test-env/client-config.ts b/packages/cli/src/lib/test-env/client-config.ts index a9f719f6ef..42a1a01768 100644 --- a/packages/cli/src/lib/test-env/client-config.ts +++ b/packages/cli/src/lib/test-env/client-config.ts @@ -1,16 +1,15 @@ import { getTestEnvProviders } from "./providers"; import { ETH_ENS_IPFS_MODULE_CONSTANTS } from "../../lib"; -import { - BuilderConfig, - DefaultBundle, -} from "@polywrap/client-config-builder-js"; +import { BuilderConfig, Web3 } from "@polywrap/client-config-builder-js"; import { ExtendableUriResolver } from "@polywrap/uri-resolver-extensions-js"; import { ethereumProviderPlugin, Connections, Connection, } from "@polywrap/ethereum-provider-js-v1"; +import { PolywrapClientConfigBuilder } from "@polywrap/client-js"; +import { IWrapPackage } from "@polywrap/core-js"; export function getTestEnvClientConfig(): Partial { // TODO: move this into its own package, since it's being used everywhere? @@ -25,24 +24,23 @@ export function getTestEnvClientConfig(): Partial { const ensAddress = ETH_ENS_IPFS_MODULE_CONSTANTS.ensAddresses.ensAddress; - return { - envs: { - [DefaultBundle.embeds.ipfsResolver.uri.uri]: { + const builder = new PolywrapClientConfigBuilder() + .addEnvs({ + [Web3.bundle.ipfsResolver.uri]: { provider: ipfsProvider, - fallbackProviders: DefaultBundle.ipfsProviders, + fallbackProviders: Web3.ipfsProviders, retries: { tryResolveUri: 1, getFile: 1 }, }, "proxy/testnet-ens-uri-resolver-ext": { registryAddress: ensAddress, }, - }, - redirects: { + }) + .setRedirects({ "proxy/testnet-ens-uri-resolver-ext": "ens/wraps.eth:ens-uri-resolver-ext@1.0.1", - }, - packages: { - [DefaultBundle.plugins.ethereumProviderV1.uri - .uri]: ethereumProviderPlugin({ + }) + .setPackages({ + [Web3.bundle.ethereumProviderV1.uri]: ethereumProviderPlugin({ connections: new Connections({ networks: { testnet: new Connection({ @@ -58,15 +56,18 @@ export function getTestEnvClientConfig(): Partial { }), }, }), - }), - }, - interfaces: { - [ExtendableUriResolver.defaultExtInterfaceUris[0].uri]: new Set([ - "proxy/testnet-ens-uri-resolver-ext", - ...DefaultBundle.getConfig().interfaces[ - ExtendableUriResolver.defaultExtInterfaceUris[0].uri - ], - ]), - }, - }; + }) as IWrapPackage, + }); + + const resolverExtensions = + builder.config.interfaces[ + ExtendableUriResolver.defaultExtInterfaceUris[0].uri + ]; + + builder.addInterfaceImplementations( + ExtendableUriResolver.defaultExtInterfaceUris[0].uri, + ["proxy/testnet-ens-uri-resolver-ext", ...resolverExtensions] + ); + + return builder.config; } diff --git a/packages/cli/src/lib/workflow/JobRunner.ts b/packages/cli/src/lib/workflow/JobRunner.ts index e16a8d1c05..67e73275ee 100644 --- a/packages/cli/src/lib/workflow/JobRunner.ts +++ b/packages/cli/src/lib/workflow/JobRunner.ts @@ -1,6 +1,6 @@ import { JobResult, Status, Step } from "./types"; -import { IClientConfigBuilder, PolywrapClient } from "@polywrap/client-js"; +import { ClientConfigBuilder, PolywrapClient } from "@polywrap/client-js"; import { CoreClient, MaybeAsync, Uri } from "@polywrap/core-js"; import { WorkflowJobs } from "@polywrap/polywrap-manifest-types-js"; @@ -9,7 +9,7 @@ export class JobRunner { private _client: CoreClient; constructor( - private _configBuilder: IClientConfigBuilder, + private _configBuilder: ClientConfigBuilder, private _onExecution?: ( id: string, JobResult: JobResult diff --git a/packages/schema/bind/package.json b/packages/schema/bind/package.json index 5395b3699c..82c45b9196 100644 --- a/packages/schema/bind/package.json +++ b/packages/schema/bind/package.json @@ -22,7 +22,7 @@ "@polywrap/client-js": "~0.11.0", "@polywrap/os-js": "0.10.6", "@polywrap/schema-parse": "0.10.6", - "@polywrap/wrap-manifest-types-js": "0.10.0", + "@polywrap/wrap-manifest-types-js": "0.11.0", "mustache": "4.0.1" }, "devDependencies": { diff --git a/packages/schema/bind/src/__tests__/index.ts b/packages/schema/bind/src/__tests__/index.ts index 1fd3557924..43e2574058 100644 --- a/packages/schema/bind/src/__tests__/index.ts +++ b/packages/schema/bind/src/__tests__/index.ts @@ -75,9 +75,13 @@ export function fetchTestCases(): TestCases { const abi = parseSchema(schema); const input: BindOptions = { - projectName: "Test", + wrapInfo: { + name: "Test", + version: "0.1", + abi, + type: "TBD" as "wasm" | "plugin" | "interface", + }, bindLanguage: "TBD" as BindLanguage, - abi, outputDirAbs: path.join(root, "combined") }; diff --git a/packages/schema/bind/src/__tests__/test-cases.spec.ts b/packages/schema/bind/src/__tests__/test-cases.spec.ts index 7f3af50937..bb0b1c006b 100644 --- a/packages/schema/bind/src/__tests__/test-cases.spec.ts +++ b/packages/schema/bind/src/__tests__/test-cases.spec.ts @@ -2,7 +2,7 @@ import { fetchTestCases } from "./index"; import { bindSchema, BindLanguage, - BindOutput + BindOutput, bindLanguageToWrapInfoType, } from "../"; import { @@ -17,6 +17,8 @@ import path from "path"; import { deepCopy } from "./utils"; +jest.setTimeout(60000); + describe("Polywrap Binding Test Suite", () => { const cases = fetchTestCases(); @@ -39,8 +41,12 @@ describe("Polywrap Binding Test Suite", () => { outputDirAbs: testCase.input.outputDirAbs, }; - const output = bindSchema({ + const output = await bindSchema({ ...deepCopy(testCase.input), + wrapInfo: { + ...deepCopy(testCase.input.wrapInfo), + type: bindLanguageToWrapInfoType(language as BindLanguage) + }, bindLanguage: language as BindLanguage, }); diff --git a/packages/schema/bind/src/bindings/index.ts b/packages/schema/bind/src/bindings/index.ts index a06c9f99f9..84310656e1 100644 --- a/packages/schema/bind/src/bindings/index.ts +++ b/packages/schema/bind/src/bindings/index.ts @@ -2,7 +2,6 @@ import { GenerateBindingFn } from "./types"; import { BindLanguage } from "../"; import * as AssemblyScript from "./assemblyscript"; import * as Rust from "./rust"; -import * as Python from "./python"; import * as TypeScript from "./typescript"; import * as WrapBindgen from "./wrap-bindgen"; @@ -16,18 +15,30 @@ export function getGenerateBindingFn( switch (bindLanguage) { case "wrap-as": return WrapBindgen.getGenerateBindingFn( - `file/${__dirname}/../../../../../../wrap-abi-bindgen/implementations/wrap-assemblyscript/build` + "https://github.com/polywrap/wrap-abi-bindgen/tree/dev/implementations/wrap-assemblyscript" ); case "wrap-rs": return Rust.Wasm.generateBinding; case "plugin-ts": - return TypeScript.Plugin.generateBinding; + return WrapBindgen.getGenerateBindingFn( + "https://github.com/polywrap/wrap-abi-bindgen/tree/dev/implementations/plugin-typescript" + ); case "plugin-rs": - return Rust.Plugin.generateBinding; + return WrapBindgen.getGenerateBindingFn( + "https://github.com/polywrap/wrap-abi-bindgen/tree/dev/implementations/plugin-rust" + ); case "plugin-py": - return Python.Plugin.generateBinding; + return WrapBindgen.getGenerateBindingFn( + "https://github.com/polywrap/wrap-abi-bindgen/tree/dev/implementations/plugin-python" + ); + case "plugin-kt": + return WrapBindgen.getGenerateBindingFn( + "https://github.com/polywrap/wrap-abi-bindgen/tree/dev/implementations/plugin-kotlin" + ); case "app-ts": - return TypeScript.App.generateBinding; + return WrapBindgen.getGenerateBindingFn( + "https://github.com/polywrap/wrap-abi-bindgen/tree/dev/implementations/app-typescript" + ); default: throw Error(`Error: Language binding unsupported - ${bindLanguage}`); } diff --git a/packages/schema/bind/src/bindings/types.ts b/packages/schema/bind/src/bindings/types.ts index db2cb6d8cf..bb57623e20 100644 --- a/packages/schema/bind/src/bindings/types.ts +++ b/packages/schema/bind/src/bindings/types.ts @@ -1,8 +1,39 @@ import { BindOptions, BindOutput } from "../"; -export type GenerateBindingFn = (options: BindOptions) => Promise | BindOutput; +export type GenerateBindingFn = ( + options: BindOptions +) => Promise | BindOutput; export type MustacheFn = () => ( value: string, render: (template: string) => string ) => string; + +// eslint-disable-next-line @typescript-eslint/naming-convention +export interface Args_generateBindings { + wrapInfo: WrapInfo; + context?: string | null; // JSON string +} + +export interface WrapInfo { + version: string; + name: string; + type: string; + abi: string; // JSON string +} + +export interface Output { + files: Array; + dirs: Array; +} + +export interface File { + name: string; + data: string; +} + +export interface Directory { + name: string; + files: Array; + dirs: Array; +} diff --git a/packages/schema/bind/src/bindings/typescript/app/index.ts b/packages/schema/bind/src/bindings/typescript/app/index.ts index 4a3a71bd8a..1c0da51a6f 100644 --- a/packages/schema/bind/src/bindings/typescript/app/index.ts +++ b/packages/schema/bind/src/bindings/typescript/app/index.ts @@ -25,7 +25,7 @@ export const generateBinding: GenerateBindingFn = ( outputDirAbs: options.outputDirAbs, }; const output = result.output; - const abi = applyTransforms(options.abi); + const abi = applyTransforms(options.wrapInfo.abi); output.entries = renderTemplates( path.join(__dirname, "./templates"), diff --git a/packages/schema/bind/src/bindings/wrap-bindgen.ts b/packages/schema/bind/src/bindings/wrap-bindgen.ts index a0a1bf3c02..10f0bdae10 100644 --- a/packages/schema/bind/src/bindings/wrap-bindgen.ts +++ b/packages/schema/bind/src/bindings/wrap-bindgen.ts @@ -1,27 +1,70 @@ import { BindOutput, BindOptions } from "../types"; -import { GenerateBindingFn } from "./types"; +import { Args_generateBindings, GenerateBindingFn, Output } from "./types"; -import { PolywrapClient } from "@polywrap/client-js"; +import { + PolywrapClient, + PolywrapClientConfigBuilder, + ExtendableUriResolver, +} from "@polywrap/client-js"; +import { OutputEntry } from "@polywrap/os-js"; -export function getGenerateBindingFn( - uri: string -): GenerateBindingFn { - return (options: BindOptions) => - invokeBindgenWrap(uri, options); +export function getGenerateBindingFn(uri: string): GenerateBindingFn { + return (options: BindOptions) => invokeBindgenWrap(uri, options); } -function invokeBindgenWrap( +async function invokeBindgenWrap( uri: string, options: BindOptions -): BindOutput { - const client = new PolywrapClient(); - // NOTE: might need to serialize config & wrapInfo.abi to a string - const result = client.invoke({ +): Promise { + // TODO: Can simplify if github resolver is added to a default config bundle + const config = new PolywrapClientConfigBuilder() + .addInterfaceImplementation( + ExtendableUriResolver.defaultExtInterfaceUris[0].uri, + "wrap://ipfs/QmYPp2bQpRxR7WCoiAgWsWoiQzqxyFdqWxp1i65VW8wNv2" + ) + .addDefaults() + .build(); + + const client = new PolywrapClient(config); + const args: Args_generateBindings = { + wrapInfo: { + version: options.wrapInfo.version, + name: options.wrapInfo.name, + type: options.wrapInfo.type, + abi: JSON.stringify(options.wrapInfo.abi), + }, + context: options.config ? JSON.stringify(options.config) : undefined, + }; + + const result = await client.invoke({ uri, method: "generateBindings", - args: { - wrapInfo: options.wrapInfo, - context: options.config - } + args: (args as unknown) as Record, + }); + if (!result.ok) throw result.error; + const output = result.value; + + return { + output: { entries: toOutputEntries(output) }, + outputDirAbs: options.outputDirAbs, + }; +} + +function toOutputEntries(output: Output): OutputEntry[] { + const entries: OutputEntry[] = []; + output.files.forEach((file) => { + entries.push({ + type: "File", + name: file.name, + data: file.data, + }); + }); + output.dirs.forEach((dir) => { + entries.push({ + type: "Directory", + name: dir.name, + data: toOutputEntries(dir), + }); }); + return entries; } diff --git a/packages/schema/bind/src/types.ts b/packages/schema/bind/src/types.ts index 3085b9f44b..eb657dafa5 100644 --- a/packages/schema/bind/src/types.ts +++ b/packages/schema/bind/src/types.ts @@ -7,6 +7,7 @@ export type BindLanguage = | "plugin-ts" | "plugin-rs" | "plugin-py" + | "plugin-kt" | "app-ts"; export interface BindOutput { @@ -20,3 +21,10 @@ export interface BindOptions { config?: Record; outputDirAbs: string; } + +// TODO: Can I use types instead of hardcoded values here? +export function bindLanguageToWrapInfoType( + bindLanguage: BindLanguage +): "wasm" | "plugin" | "interface" { + return bindLanguage.startsWith("plugin") ? "plugin" : "wasm"; +} diff --git a/packages/test-cases/cases/bind/sanity/output/plugin-kt/module.kt b/packages/test-cases/cases/bind/sanity/output/plugin-kt/module.kt new file mode 100644 index 0000000000..c230059e30 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/plugin-kt/module.kt @@ -0,0 +1,142 @@ +/// NOTE: This is an auto-generated file. +/// All modifications will be overwritten. + +package test.wrap + +import io.polywrap.core.Invoker +import io.polywrap.core.msgpack.msgPackDecode +import io.polywrap.core.msgpack.msgPackEncode +import io.polywrap.core.msgpack.MsgPackMap +import io.polywrap.plugin.PluginMethod +import io.polywrap.plugin.PluginModule +import kotlinx.serialization.Serializable +import kotlinx.serialization.serializer + +@Serializable +data class ArgsModuleMethod( + val str: String, + val optStr: String? = null, + val en: CustomEnum, + val optEnum: CustomEnum? = null, + val enumArray: List, + val optEnumArray: List? = null, + val map: MsgPackMap, + val mapOfArr: MsgPackMap>, + val mapOfMap: MsgPackMap>, + val mapOfObj: MsgPackMap, + val mapOfArrOfObj: MsgPackMap>, +) + +@Serializable +data class ArgsObjectMethod( + val _object: AnotherType, + val optObject: AnotherType? = null, + val objectArray: List, + val optObjectArray: List? = null, +) + +@Serializable +data class ArgsOptionalEnvMethod( + val _object: AnotherType, + val optObject: AnotherType? = null, + val objectArray: List, + val optObjectArray: List? = null, +) + +@Serializable +data class ArgsIf( + val _if: Else, +) + +@Suppress("UNUSED_PARAMETER", "FunctionName") +abstract class Module(config: TConfig) : PluginModule(config) { + + final override val methods: Map = mapOf( + "moduleMethod" to ::__moduleMethod, + "objectMethod" to ::__objectMethod, + "optionalEnvMethod" to ::__optionalEnvMethod, + "if" to ::__if, + ) + + abstract suspend fun moduleMethod( + args: ArgsModuleMethod, + invoker: Invoker + ): Int + + abstract suspend fun objectMethod( + args: ArgsObjectMethod, + env: Env, + invoker: Invoker + ): AnotherType? + + abstract suspend fun optionalEnvMethod( + args: ArgsOptionalEnvMethod, + env: Env? = null, + invoker: Invoker + ): AnotherType? + + abstract suspend fun _if( + args: ArgsIf, + invoker: Invoker + ): Else + + private suspend fun __moduleMethod( + encodedArgs: ByteArray?, + encodedEnv: ByteArray?, + invoker: Invoker + ): ByteArray { + val args: ArgsModuleMethod = encodedArgs?.let { + msgPackDecode(ArgsModuleMethod.serializer(), it).getOrNull() + ?: throw Exception("Failed to decode args in invocation to plugin method 'moduleMethod'") + } ?: throw Exception("Missing args in invocation to plugin method 'moduleMethod'") + val response = moduleMethod(args, invoker) + return msgPackEncode(serializer(), response) + } + + private suspend fun __objectMethod( + encodedArgs: ByteArray?, + encodedEnv: ByteArray?, + invoker: Invoker + ): ByteArray { + val args: ArgsObjectMethod = encodedArgs?.let { + msgPackDecode(ArgsObjectMethod.serializer(), it).getOrNull() + ?: throw Exception("Failed to decode args in invocation to plugin method 'objectMethod'") + } ?: throw Exception("Missing args in invocation to plugin method 'objectMethod'") + val env: Env = encodedEnv?.let { + msgPackDecode(Env.serializer(), it).getOrNull() + ?: throw Exception("Failed to decode env in invocation to plugin method 'objectMethod'") + } ?: throw Exception("Missing env in invocation to plugin method 'objectMethod'") + val response = objectMethod(args, env, invoker) + return msgPackEncode(serializer(), response) + } + + private suspend fun __optionalEnvMethod( + encodedArgs: ByteArray?, + encodedEnv: ByteArray?, + invoker: Invoker + ): ByteArray { + val args: ArgsOptionalEnvMethod = encodedArgs?.let { + msgPackDecode(ArgsOptionalEnvMethod.serializer(), it).getOrNull() + ?: throw Exception("Failed to decode args in invocation to plugin method 'optionalEnvMethod'") + } ?: throw Exception("Missing args in invocation to plugin method 'optionalEnvMethod'") + val env: Env? = encodedEnv?.let { + msgPackDecode(Env.serializer(), it).getOrNull() + ?: throw Exception("Failed to decode env in invocation to plugin method 'optionalEnvMethod'") + } + val response = optionalEnvMethod(args, env, invoker) + return msgPackEncode(serializer(), response) + } + + private suspend fun __if( + encodedArgs: ByteArray?, + encodedEnv: ByteArray?, + invoker: Invoker + ): ByteArray { + val args: ArgsIf = encodedArgs?.let { + msgPackDecode(ArgsIf.serializer(), it).getOrNull() + ?: throw Exception("Failed to decode args in invocation to plugin method 'if'") + } ?: throw Exception("Missing args in invocation to plugin method 'if'") + val response = _if(args, invoker) + return msgPackEncode(serializer(), response) + } +} diff --git a/packages/test-cases/cases/bind/sanity/output/plugin-kt/types.kt b/packages/test-cases/cases/bind/sanity/output/plugin-kt/types.kt new file mode 100644 index 0000000000..639ab3bc55 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/plugin-kt/types.kt @@ -0,0 +1,223 @@ +/// NOTE: This is an auto-generated file. +/// All modifications will be overwritten. + +package test.wrap + +import io.polywrap.core.Invoker +import io.polywrap.core.InvokeResult +import io.polywrap.core.resolution.Uri +import io.polywrap.core.msgpack.MsgPackMap +import kotlinx.serialization.Serializable + +typealias BigInt = String +typealias BigNumber = String +typealias Json = String + +/// Env START /// +@Serializable +data class Env( + val prop: String, + val optProp: String? = null, + val optMap: MsgPackMap? = null, +) +/// Env END /// + +/// Objects START /// +@Serializable +data class CustomType( + val str: String, + val optStr: String? = null, + val u: UInt, + val optU: UInt? = null, + val u8: UByte, + val u16: UShort, + val u32: UInt, + val i: Int, + val i8: Byte, + val i16: Short, + val i32: Int, + val bigint: BigInt, + val optBigint: BigInt? = null, + val bignumber: BigNumber, + val optBignumber: BigNumber? = null, + val json: Json, + val optJson: Json? = null, + val bytes: ByteArray, + val optBytes: ByteArray? = null, + val boolean: Boolean, + val optBoolean: Boolean? = null, + val u_array: List, + val uOpt_array: List? = null, + val _opt_uOptArray: List? = null, + val optStrOptArray: List? = null, + val uArrayArray: List>, + val uOptArrayOptArray: List?>, + val uArrayOptArrayArray: List>?>, + val crazyArray: List?>>?>? = null, + val _object: AnotherType, + val optObject: AnotherType? = null, + val objectArray: List, + val optObjectArray: List? = null, + val en: CustomEnum, + val optEnum: CustomEnum? = null, + val enumArray: List, + val optEnumArray: List? = null, + val map: MsgPackMap, + val mapOfArr: MsgPackMap>, + val mapOfObj: MsgPackMap, + val mapOfArrOfObj: MsgPackMap>, + val mapCustomValue: MsgPackMap, +) + +@Serializable +data class AnotherType( + val prop: String? = null, + val circular: CustomType? = null, + val const: String? = null, +) + +@Serializable +data class CustomMapValue( + val foo: String, +) + +@Serializable +data class Else( + val _else: String, +) + +/// Objects END /// + +/// Enums START /// +@Serializable +enum class CustomEnum { + STRING, + BYTES +} + +@Serializable +enum class While { + _for, + _in +} + +/// Enums END /// + +/// Imported Objects START /// +/* URI: "testimport.uri.eth" */ +@Serializable +data class TestImportObject( + val _object: TestImportAnotherObject, + val optObject: TestImportAnotherObject? = null, + val objectArray: List, + val optObjectArray: List? = null, + val en: TestImportEnum, + val optEnum: TestImportEnum? = null, + val enumArray: List, + val optEnumArray: List? = null, +) + +/* URI: "testimport.uri.eth" */ +@Serializable +data class TestImportAnotherObject( + val prop: String, +) + +/* URI: "testimport.uri.eth" */ +@Serializable +enum class TestImportEnum { + STRING, + BYTES +} + +/* URI: "testimport.uri.eth" */ +@Serializable +enum class TestImportEnumReturn { + STRING, + BYTES +} + +/// Imported Objects END /// + +/// Imported Modules START /// +/* URI: "testimport.uri.eth" */ +@Serializable +data class TestImportModuleArgsImportedMethod( + val str: String, + val optStr: String? = null, + val u: UInt, + val optU: UInt? = null, + val uArrayArray: List?>, + val _object: TestImportObject, + val optObject: TestImportObject? = null, + val objectArray: List, + val optObjectArray: List? = null, + val en: TestImportEnum, + val optEnum: TestImportEnum? = null, + val enumArray: List, + val optEnumArray: List? = null, +) + +/* URI: "testimport.uri.eth" */ +@Serializable +data class TestImportModuleArgsAnotherMethod( + val arg: List, +) + +/* URI: "testimport.uri.eth" */ +@Serializable +data class TestImportModuleArgsReturnsArrayOfEnums( + val arg: String, +) + +/* URI: "testimport.uri.eth" */ +class TestImportModule(uri: String) { + companion object { + val interfaceUri: String = "testimport.uri.eth" + } + + val uri: Uri = Uri(uri) + + suspend fun importedMethod( + args: TestImportModuleArgsImportedMethod, + invoker: Invoker + ): InvokeResult { + return invoker.invoke( + uri = this.uri, + method = "importedMethod", + args = args + ); + } + + suspend fun anotherMethod( + args: TestImportModuleArgsAnotherMethod, + invoker: Invoker + ): InvokeResult { + return invoker.invoke( + uri = this.uri, + method = "anotherMethod", + args = args + ); + } + + suspend fun returnsArrayOfEnums( + args: TestImportModuleArgsReturnsArrayOfEnums, + invoker: Invoker + ): InvokeResult> { + return invoker.invoke( + uri = this.uri, + method = "returnsArrayOfEnums", + args = args + ); + } +} + +/// Imported Modules END /// + +object TestImport { + val uri: Uri = Uri("testimport.uri.eth"); + + suspend fun getImplementations(invoker: Invoker): Result> { + return invoker.getImplementations(this.uri) + } +} diff --git a/packages/test-cases/cases/bind/sanity/output/plugin-kt/wrap.info.kt b/packages/test-cases/cases/bind/sanity/output/plugin-kt/wrap.info.kt new file mode 100644 index 0000000000..803d28343d --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/plugin-kt/wrap.info.kt @@ -0,0 +1,17 @@ +/// NOTE: This is an auto-generated file. +/// All modifications will be overwritten. + +package test.wrap + +import io.polywrap.core.wrap.WrapManifest +import io.polywrap.core.wrap.formats.wrap01.abi.Abi01 +import io.polywrap.core.msgpack.msgPackDecode + +val manifest = WrapManifest( + name = "Test", + type = "plugin", + version = "0.1", + abi = msgPackDecode(Abi01.serializer(), byteArrayOf( + 200.toByte(),89.toByte(),48.toByte(),1.toByte(),138.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),115.toByte(),146.toByte(),199.toByte(),47.toByte(),1.toByte(),131.toByte(),169.toByte(),99.toByte(),111.toByte(),110.toByte(),115.toByte(),116.toByte(),97.toByte(),110.toByte(),116.toByte(),115.toByte(),146.toByte(),166.toByte(),83.toByte(),84.toByte(),82.toByte(),73.toByte(),78.toByte(),71.toByte(),165.toByte(),66.toByte(),89.toByte(),84.toByte(),69.toByte(),83.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),8.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),36.toByte(),1.toByte(),131.toByte(),169.toByte(),99.toByte(),111.toByte(),110.toByte(),115.toByte(),116.toByte(),97.toByte(),110.toByte(),116.toByte(),115.toByte(),146.toByte(),163.toByte(),102.toByte(),111.toByte(),114.toByte(),162.toByte(),105.toByte(),110.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),8.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),165.toByte(),119.toByte(),104.toByte(),105.toByte(),108.toByte(),101.toByte(),167.toByte(),101.toByte(),110.toByte(),118.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),200.toByte(),1.toByte(),163.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),206.toByte(),0.toByte(),1.toByte(),0.toByte(),0.toByte(),170.toByte(),112.toByte(),114.toByte(),111.toByte(),112.toByte(),101.toByte(),114.toByte(),116.toByte(),105.toByte(),101.toByte(),115.toByte(),147.toByte(),199.toByte(),88.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),164.toByte(),112.toByte(),114.toByte(),111.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),39.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),164.toByte(),112.toByte(),114.toByte(),111.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),199.toByte(),74.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),111.toByte(),112.toByte(),116.toByte(),80.toByte(),114.toByte(),111.toByte(),112.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),32.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),111.toByte(),112.toByte(),116.toByte(),80.toByte(),114.toByte(),111.toByte(),112.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),199.toByte(),216.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),199.toByte(),168.toByte(),1.toByte(),134.toByte(),163.toByte(),107.toByte(),101.toByte(),121.toByte(),199.toByte(),41.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),112.toByte(),116.toByte(),77.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),206.toByte(),0.toByte(),4.toByte(),0.toByte(),2.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),112.toByte(),116.toByte(),77.toByte(),97.toByte(),112.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),28.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),112.toByte(),116.toByte(),77.toByte(),97.toByte(),112.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),176.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),73.toByte(),110.toByte(),116.toByte(),62.toByte(),165.toByte(),118.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),199.toByte(),28.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),112.toByte(),116.toByte(),77.toByte(),97.toByte(),112.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),112.toByte(),116.toByte(),77.toByte(),97.toByte(),112.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),176.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),73.toByte(),110.toByte(),116.toByte(),62.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),69.toByte(),110.toByte(),118.toByte(),177.toByte(),105.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),101.toByte(),100.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),115.toByte(),146.toByte(),199.toByte(),114.toByte(),1.toByte(),134.toByte(),169.toByte(),99.toByte(),111.toByte(),110.toByte(),115.toByte(),116.toByte(),97.toByte(),110.toByte(),116.toByte(),115.toByte(),146.toByte(),166.toByte(),83.toByte(),84.toByte(),82.toByte(),73.toByte(),78.toByte(),71.toByte(),165.toByte(),66.toByte(),89.toByte(),84.toByte(),69.toByte(),83.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),2.toByte(),8.toByte(),169.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),115.toByte(),112.toByte(),97.toByte(),99.toByte(),101.toByte(),170.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),170.toByte(),110.toByte(),97.toByte(),116.toByte(),105.toByte(),118.toByte(),101.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),163.toByte(),117.toByte(),114.toByte(),105.toByte(),178.toByte(),116.toByte(),101.toByte(),115.toByte(),116.toByte(),105.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),46.toByte(),117.toByte(),114.toByte(),105.toByte(),46.toByte(),101.toByte(),116.toByte(),104.toByte(),199.toByte(),121.toByte(),1.toByte(),134.toByte(),169.toByte(),99.toByte(),111.toByte(),110.toByte(),115.toByte(),116.toByte(),97.toByte(),110.toByte(),116.toByte(),115.toByte(),146.toByte(),166.toByte(),83.toByte(),84.toByte(),82.toByte(),73.toByte(),78.toByte(),71.toByte(),165.toByte(),66.toByte(),89.toByte(),84.toByte(),69.toByte(),83.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),2.toByte(),8.toByte(),169.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),115.toByte(),112.toByte(),97.toByte(),99.toByte(),101.toByte(),170.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),170.toByte(),110.toByte(),97.toByte(),116.toByte(),105.toByte(),118.toByte(),101.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),182.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),95.toByte(),82.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),163.toByte(),117.toByte(),114.toByte(),105.toByte(),178.toByte(),116.toByte(),101.toByte(),115.toByte(),116.toByte(),105.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),46.toByte(),117.toByte(),114.toByte(),105.toByte(),46.toByte(),101.toByte(),116.toByte(),104.toByte(),176.toByte(),105.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),101.toByte(),100.toByte(),69.toByte(),110.toByte(),118.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),115.toByte(),145.toByte(),200.toByte(),6.toByte(),48.toByte(),1.toByte(),134.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),206.toByte(),0.toByte(),8.toByte(),0.toByte(),0.toByte(),169.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),115.toByte(),112.toByte(),97.toByte(),99.toByte(),101.toByte(),170.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),170.toByte(),110.toByte(),97.toByte(),116.toByte(),105.toByte(),118.toByte(),101.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),69.toByte(),110.toByte(),118.toByte(),170.toByte(),112.toByte(),114.toByte(),111.toByte(),112.toByte(),101.toByte(),114.toByte(),116.toByte(),105.toByte(),101.toByte(),115.toByte(),152.toByte(),199.toByte(),130.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),61.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),116.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),54.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),200.toByte(),1.toByte(),35.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),216.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),66.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),66.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),186.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),186.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),93.toByte(),200.toByte(),1.toByte(),7.toByte(),1.toByte(),132.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),195.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),59.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),59.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),186.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),186.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),93.toByte(),199.toByte(),102.toByte(),1.toByte(),133.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),48.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),101.toByte(),110.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),101.toByte(),110.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),92.toByte(),1.toByte(),132.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),43.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),245.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),181.toByte(),1.toByte(),134.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),55.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),55.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),199.toByte(),217.toByte(),1.toByte(),132.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),160.toByte(),1.toByte(),133.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),48.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),48.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),174.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),118.toByte(),163.toByte(),117.toByte(),114.toByte(),105.toByte(),178.toByte(),116.toByte(),101.toByte(),115.toByte(),116.toByte(),105.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),46.toByte(),117.toByte(),114.toByte(),105.toByte(),46.toByte(),101.toByte(),116.toByte(),104.toByte(),179.toByte(),105.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),101.toByte(),100.toByte(),77.toByte(),111.toByte(),100.toByte(),117.toByte(),108.toByte(),101.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),115.toByte(),145.toByte(),200.toByte(),12.toByte(),153.toByte(),1.toByte(),135.toByte(),171.toByte(),105.toByte(),115.toByte(),73.toByte(),110.toByte(),116.toByte(),101.toByte(),114.toByte(),102.toByte(),97.toByte(),99.toByte(),101.toByte(),195.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),1.toByte(),0.toByte(),167.toByte(),109.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),115.toByte(),147.toByte(),200.toByte(),8.toByte(),232.toByte(),1.toByte(),135.toByte(),169.toByte(),97.toByte(),114.toByte(),103.toByte(),117.toByte(),109.toByte(),101.toByte(),110.toByte(),116.toByte(),115.toByte(),157.toByte(),199.toByte(),86.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),115.toByte(),116.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),38.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),115.toByte(),116.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),199.toByte(),72.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),112.toByte(),116.toByte(),83.toByte(),116.toByte(),114.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),31.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),112.toByte(),116.toByte(),83.toByte(),116.toByte(),114.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),199.toByte(),78.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),161.toByte(),117.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),34.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),161.toByte(),117.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),199.toByte(),64.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),164.toByte(),111.toByte(),112.toByte(),116.toByte(),85.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),27.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),164.toByte(),111.toByte(),112.toByte(),116.toByte(),85.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),200.toByte(),1.toByte(),111.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),200.toByte(),1.toByte(),53.toByte(),1.toByte(),134.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),122.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),34.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),34.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),122.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),34.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),34.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),93.toByte(),199.toByte(),116.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),54.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),102.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),47.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),200.toByte(),1.toByte(),7.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),195.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),59.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),59.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),179.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),179.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),93.toByte(),199.toByte(),235.toByte(),1.toByte(),132.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),174.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),52.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),52.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),179.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),179.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),93.toByte(),199.toByte(),102.toByte(),1.toByte(),133.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),48.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),101.toByte(),110.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),101.toByte(),110.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),92.toByte(),1.toByte(),132.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),43.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),245.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),181.toByte(),1.toByte(),134.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),55.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),55.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),199.toByte(),217.toByte(),1.toByte(),132.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),160.toByte(),1.toByte(),133.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),48.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),48.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),163.toByte(),101.toByte(),110.toByte(),118.toByte(),199.toByte(),11.toByte(),1.toByte(),129.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),64.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),105.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),101.toByte(),100.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),114.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),199.toByte(),112.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),105.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),101.toByte(),100.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),52.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),105.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),101.toByte(),100.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),200.toByte(),1.toByte(),103.toByte(),1.toByte(),134.toByte(),169.toByte(),97.toByte(),114.toByte(),103.toByte(),117.toByte(),109.toByte(),101.toByte(),110.toByte(),116.toByte(),115.toByte(),145.toByte(),199.toByte(),183.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),134.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),38.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),97.toByte(),114.toByte(),103.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),97.toByte(),114.toByte(),103.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),38.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),97.toByte(),114.toByte(),103.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),97.toByte(),114.toByte(),103.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),64.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),97.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),114.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),199.toByte(),104.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),97.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),47.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),97.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),165.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),165.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),200.toByte(),1.toByte(),202.toByte(),1.toByte(),134.toByte(),169.toByte(),97.toByte(),114.toByte(),103.toByte(),117.toByte(),109.toByte(),101.toByte(),110.toByte(),116.toByte(),115.toByte(),145.toByte(),199.toByte(),86.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),97.toByte(),114.toByte(),103.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),38.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),97.toByte(),114.toByte(),103.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),64.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),114.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),115.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),102.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),115.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),114.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),200.toByte(),1.toByte(),37.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),212.toByte(),1.toByte(),134.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),62.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),114.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),115.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),102.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),115.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),182.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),95.toByte(),82.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),62.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),114.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),115.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),102.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),115.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),182.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),95.toByte(),82.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),114.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),115.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),102.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),115.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),95.toByte(),82.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),114.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),115.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),102.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),115.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),95.toByte(),82.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),93.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),169.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),115.toByte(),112.toByte(),97.toByte(),99.toByte(),101.toByte(),170.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),170.toByte(),110.toByte(),97.toByte(),116.toByte(),105.toByte(),118.toByte(),101.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),77.toByte(),111.toByte(),100.toByte(),117.toByte(),108.toByte(),101.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),77.toByte(),111.toByte(),100.toByte(),117.toByte(),108.toByte(),101.toByte(),163.toByte(),117.toByte(),114.toByte(),105.toByte(),178.toByte(),116.toByte(),101.toByte(),115.toByte(),116.toByte(),105.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),46.toByte(),117.toByte(),114.toByte(),105.toByte(),46.toByte(),101.toByte(),116.toByte(),104.toByte(),179.toByte(),105.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),101.toByte(),100.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),115.toByte(),146.toByte(),200.toByte(),6.toByte(),52.toByte(),1.toByte(),134.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),4.toByte(),1.toByte(),169.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),115.toByte(),112.toByte(),97.toByte(),99.toByte(),101.toByte(),170.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),170.toByte(),110.toByte(),97.toByte(),116.toByte(),105.toByte(),118.toByte(),101.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),170.toByte(),112.toByte(),114.toByte(),111.toByte(),112.toByte(),101.toByte(),114.toByte(),116.toByte(),105.toByte(),101.toByte(),115.toByte(),152.toByte(),199.toByte(),130.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),61.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),116.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),54.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),200.toByte(),1.toByte(),35.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),216.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),66.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),66.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),186.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),186.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),93.toByte(),200.toByte(),1.toByte(),7.toByte(),1.toByte(),132.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),195.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),59.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),59.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),186.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),186.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),93.toByte(),199.toByte(),102.toByte(),1.toByte(),133.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),48.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),101.toByte(),110.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),101.toByte(),110.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),92.toByte(),1.toByte(),132.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),43.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),245.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),181.toByte(),1.toByte(),134.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),55.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),55.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),199.toByte(),217.toByte(),1.toByte(),132.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),160.toByte(),1.toByte(),133.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),48.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),48.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),163.toByte(),117.toByte(),114.toByte(),105.toByte(),178.toByte(),116.toByte(),101.toByte(),115.toByte(),116.toByte(),105.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),46.toByte(),117.toByte(),114.toByte(),105.toByte(),46.toByte(),101.toByte(),116.toByte(),104.toByte(),199.toByte(),211.toByte(),1.toByte(),134.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),4.toByte(),1.toByte(),169.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),115.toByte(),112.toByte(),97.toByte(),99.toByte(),101.toByte(),170.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),170.toByte(),110.toByte(),97.toByte(),116.toByte(),105.toByte(),118.toByte(),101.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),173.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),170.toByte(),112.toByte(),114.toByte(),111.toByte(),112.toByte(),101.toByte(),114.toByte(),116.toByte(),105.toByte(),101.toByte(),115.toByte(),145.toByte(),199.toByte(),88.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),164.toByte(),112.toByte(),114.toByte(),111.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),39.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),164.toByte(),112.toByte(),114.toByte(),111.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),163.toByte(),117.toByte(),114.toByte(),105.toByte(),178.toByte(),116.toByte(),101.toByte(),115.toByte(),116.toByte(),105.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),46.toByte(),117.toByte(),114.toByte(),105.toByte(),46.toByte(),101.toByte(),116.toByte(),104.toByte(),174.toByte(),105.toByte(),110.toByte(),116.toByte(),101.toByte(),114.toByte(),102.toByte(),97.toByte(),99.toByte(),101.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),115.toByte(),145.toByte(),199.toByte(),139.toByte(),1.toByte(),134.toByte(),172.toByte(),99.toByte(),97.toByte(),112.toByte(),97.toByte(),98.toByte(),105.toByte(),108.toByte(),105.toByte(),116.toByte(),105.toByte(),101.toByte(),115.toByte(),199.toByte(),33.toByte(),1.toByte(),129.toByte(),178.toByte(),103.toByte(),101.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),108.toByte(),101.toByte(),109.toByte(),101.toByte(),110.toByte(),116.toByte(),97.toByte(),116.toByte(),105.toByte(),111.toByte(),110.toByte(),115.toByte(),199.toByte(),10.toByte(),1.toByte(),129.toByte(),167.toByte(),101.toByte(),110.toByte(),97.toByte(),98.toByte(),108.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),128.toByte(),0.toByte(),169.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),115.toByte(),112.toByte(),97.toByte(),99.toByte(),101.toByte(),170.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),170.toByte(),110.toByte(),97.toByte(),116.toByte(),105.toByte(),118.toByte(),101.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),169.toByte(),73.toByte(),110.toByte(),116.toByte(),101.toByte(),114.toByte(),102.toByte(),97.toByte(),99.toByte(),101.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),163.toByte(),117.toByte(),114.toByte(),105.toByte(),178.toByte(),116.toByte(),101.toByte(),115.toByte(),116.toByte(),105.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),46.toByte(),117.toByte(),114.toByte(),105.toByte(),46.toByte(),101.toByte(),116.toByte(),104.toByte(),170.toByte(),109.toByte(),111.toByte(),100.toByte(),117.toByte(),108.toByte(),101.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),200.toByte(),20.toByte(),173.toByte(),1.toByte(),132.toByte(),167.toByte(),105.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),115.toByte(),149.toByte(),199.toByte(),24.toByte(),1.toByte(),129.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),77.toByte(),111.toByte(),100.toByte(),117.toByte(),108.toByte(),101.toByte(),199.toByte(),24.toByte(),1.toByte(),129.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),31.toByte(),1.toByte(),129.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),22.toByte(),1.toByte(),129.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),29.toByte(),1.toByte(),129.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),182.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),95.toByte(),82.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),204.toByte(),128.toByte(),167.toByte(),109.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),115.toByte(),148.toByte(),200.toByte(),12.toByte(),107.toByte(),1.toByte(),134.toByte(),169.toByte(),97.toByte(),114.toByte(),103.toByte(),117.toByte(),109.toByte(),101.toByte(),110.toByte(),116.toByte(),115.toByte(),155.toByte(),199.toByte(),86.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),115.toByte(),116.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),38.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),115.toByte(),116.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),199.toByte(),72.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),112.toByte(),116.toByte(),83.toByte(),116.toByte(),114.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),31.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),112.toByte(),116.toByte(),83.toByte(),116.toByte(),114.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),199.toByte(),92.toByte(),1.toByte(),133.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),43.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),101.toByte(),110.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),101.toByte(),110.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),82.toByte(),1.toByte(),132.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),38.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),225.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),166.toByte(),1.toByte(),134.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),50.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),50.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),172.toByte(),91.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),172.toByte(),91.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),199.toByte(),197.toByte(),1.toByte(),132.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),145.toByte(),1.toByte(),133.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),43.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),43.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),172.toByte(),91.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),172.toByte(),91.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),199.toByte(),241.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),199.toByte(),186.toByte(),1.toByte(),135.toByte(),163.toByte(),107.toByte(),101.toByte(),121.toByte(),199.toByte(),38.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),206.toByte(),0.toByte(),4.toByte(),0.toByte(),2.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),35.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),176.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),73.toByte(),110.toByte(),116.toByte(),62.toByte(),165.toByte(),118.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),199.toByte(),35.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),176.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),73.toByte(),110.toByte(),116.toByte(),62.toByte(),200.toByte(),1.toByte(),214.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),200.toByte(),1.toByte(),151.toByte(),1.toByte(),135.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),140.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),40.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),40.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),165.toByte(),91.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),163.toByte(),107.toByte(),101.toByte(),121.toByte(),199.toByte(),43.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),206.toByte(),0.toByte(),4.toByte(),0.toByte(),2.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),178.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),91.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),62.toByte(),165.toByte(),118.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),199.toByte(),140.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),40.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),40.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),165.toByte(),91.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),178.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),91.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),62.toByte(),200.toByte(),2.toByte(),110.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),200.toByte(),2.toByte(),36.toByte(),1.toByte(),135.toByte(),163.toByte(),107.toByte(),101.toByte(),121.toByte(),199.toByte(),43.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),77.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),206.toByte(),0.toByte(),4.toByte(),0.toByte(),2.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),199.toByte(),206.toByte(),1.toByte(),135.toByte(),163.toByte(),107.toByte(),101.toByte(),121.toByte(),199.toByte(),43.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),77.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),206.toByte(),0.toByte(),4.toByte(),0.toByte(),2.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),77.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),40.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),77.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),176.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),73.toByte(),110.toByte(),116.toByte(),62.toByte(),165.toByte(),118.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),199.toByte(),40.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),77.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),77.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),189.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),73.toByte(),110.toByte(),116.toByte(),62.toByte(),62.toByte(),165.toByte(),118.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),199.toByte(),206.toByte(),1.toByte(),135.toByte(),163.toByte(),107.toByte(),101.toByte(),121.toByte(),199.toByte(),43.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),77.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),206.toByte(),0.toByte(),4.toByte(),0.toByte(),2.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),77.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),40.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),77.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),176.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),73.toByte(),110.toByte(),116.toByte(),62.toByte(),165.toByte(),118.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),199.toByte(),40.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),77.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),77.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),189.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),73.toByte(),110.toByte(),116.toByte(),62.toByte(),62.toByte(),200.toByte(),1.toByte(),46.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),199.toByte(),234.toByte(),1.toByte(),135.toByte(),163.toByte(),107.toByte(),101.toByte(),121.toByte(),199.toByte(),43.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),206.toByte(),0.toByte(),4.toByte(),0.toByte(),2.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),50.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),62.toByte(),165.toByte(),118.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),199.toByte(),50.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),62.toByte(),200.toByte(),2.toByte(),75.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),200.toByte(),1.toByte(),255.toByte(),1.toByte(),135.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),183.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),55.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),55.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),173.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),163.toByte(),107.toByte(),101.toByte(),121.toByte(),199.toByte(),48.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),206.toByte(),0.toByte(),4.toByte(),0.toByte(),2.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),186.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),62.toByte(),165.toByte(),118.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),199.toByte(),183.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),55.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),55.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),173.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),186.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),62.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),64.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),109.toByte(),111.toByte(),100.toByte(),117.toByte(),108.toByte(),101.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),114.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),199.toByte(),98.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),109.toByte(),111.toByte(),100.toByte(),117.toByte(),108.toByte(),101.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),44.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),109.toByte(),111.toByte(),100.toByte(),117.toByte(),108.toByte(),101.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),200.toByte(),3.toByte(),70.toByte(),1.toByte(),135.toByte(),169.toByte(),97.toByte(),114.toByte(),103.toByte(),117.toByte(),109.toByte(),101.toByte(),110.toByte(),116.toByte(),115.toByte(),148.toByte(),199.toByte(),104.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),48.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),199.toByte(),90.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),41.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),199.toByte(),239.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),177.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),53.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),53.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),173.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),173.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),199.toByte(),211.toByte(),1.toByte(),132.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),156.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),46.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),46.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),173.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),173.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),163.toByte(),101.toByte(),110.toByte(),118.toByte(),199.toByte(),11.toByte(),1.toByte(),129.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),64.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),114.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),199.toByte(),96.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),44.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),200.toByte(),3.toByte(),85.toByte(),1.toByte(),135.toByte(),169.toByte(),97.toByte(),114.toByte(),103.toByte(),117.toByte(),109.toByte(),101.toByte(),110.toByte(),116.toByte(),115.toByte(),148.toByte(),199.toByte(),104.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),48.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),199.toByte(),90.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),41.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),199.toByte(),239.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),177.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),53.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),53.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),173.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),173.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),199.toByte(),211.toByte(),1.toByte(),132.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),156.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),46.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),46.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),173.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),173.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),163.toByte(),101.toByte(),110.toByte(),118.toByte(),199.toByte(),11.toByte(),1.toByte(),129.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),194.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),64.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),177.toByte(),111.toByte(),112.toByte(),116.toByte(),105.toByte(),111.toByte(),110.toByte(),97.toByte(),108.toByte(),69.toByte(),110.toByte(),118.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),114.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),199.toByte(),106.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),177.toByte(),111.toByte(),112.toByte(),116.toByte(),105.toByte(),111.toByte(),110.toByte(),97.toByte(),108.toByte(),69.toByte(),110.toByte(),118.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),49.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),177.toByte(),111.toByte(),112.toByte(),116.toByte(),105.toByte(),111.toByte(),110.toByte(),97.toByte(),108.toByte(),69.toByte(),110.toByte(),118.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),199.toByte(),225.toByte(),1.toByte(),134.toByte(),169.toByte(),97.toByte(),114.toByte(),103.toByte(),117.toByte(),109.toByte(),101.toByte(),110.toByte(),116.toByte(),115.toByte(),145.toByte(),199.toByte(),82.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),105.toByte(),102.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),37.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),105.toByte(),102.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),101.toByte(),108.toByte(),115.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),101.toByte(),108.toByte(),115.toByte(),101.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),64.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),105.toByte(),102.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),114.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),199.toByte(),82.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),105.toByte(),102.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),37.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),105.toByte(),102.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),101.toByte(),108.toByte(),115.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),101.toByte(),108.toByte(),115.toByte(),101.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),77.toByte(),111.toByte(),100.toByte(),117.toByte(),108.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),115.toByte(),148.toByte(),200.toByte(),36.toByte(),119.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),1.toByte(),170.toByte(),112.toByte(),114.toByte(),111.toByte(),112.toByte(),101.toByte(),114.toByte(),116.toByte(),105.toByte(),101.toByte(),115.toByte(),220.toByte(),0.toByte(),42.toByte(),199.toByte(),86.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),115.toByte(),116.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),38.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),115.toByte(),116.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),199.toByte(),72.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),112.toByte(),116.toByte(),83.toByte(),116.toByte(),114.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),31.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),112.toByte(),116.toByte(),83.toByte(),116.toByte(),114.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),199.toByte(),78.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),161.toByte(),117.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),34.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),161.toByte(),117.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),199.toByte(),64.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),164.toByte(),111.toByte(),112.toByte(),116.toByte(),85.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),27.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),164.toByte(),111.toByte(),112.toByte(),116.toByte(),85.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),199.toByte(),82.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),117.toByte(),56.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),36.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),117.toByte(),56.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),165.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),56.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),165.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),56.toByte(),199.toByte(),86.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),117.toByte(),49.toByte(),54.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),38.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),117.toByte(),49.toByte(),54.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),49.toByte(),54.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),49.toByte(),54.toByte(),199.toByte(),86.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),117.toByte(),51.toByte(),50.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),38.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),117.toByte(),51.toByte(),50.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),199.toByte(),76.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),161.toByte(),105.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),33.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),161.toByte(),105.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),199.toByte(),80.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),105.toByte(),56.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),35.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),105.toByte(),56.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),73.toByte(),110.toByte(),116.toByte(),56.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),73.toByte(),110.toByte(),116.toByte(),56.toByte(),199.toByte(),84.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),105.toByte(),49.toByte(),54.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),37.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),105.toByte(),49.toByte(),54.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),165.toByte(),73.toByte(),110.toByte(),116.toByte(),49.toByte(),54.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),165.toByte(),73.toByte(),110.toByte(),116.toByte(),49.toByte(),54.toByte(),199.toByte(),84.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),105.toByte(),51.toByte(),50.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),37.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),105.toByte(),51.toByte(),50.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),165.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),165.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),199.toByte(),92.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),98.toByte(),105.toByte(),103.toByte(),105.toByte(),110.toByte(),116.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),41.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),98.toByte(),105.toByte(),103.toByte(),105.toByte(),110.toByte(),116.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),66.toByte(),105.toByte(),103.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),66.toByte(),105.toByte(),103.toByte(),73.toByte(),110.toByte(),116.toByte(),199.toByte(),78.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),111.toByte(),112.toByte(),116.toByte(),66.toByte(),105.toByte(),103.toByte(),105.toByte(),110.toByte(),116.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),34.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),111.toByte(),112.toByte(),116.toByte(),66.toByte(),105.toByte(),103.toByte(),105.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),66.toByte(),105.toByte(),103.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),66.toByte(),105.toByte(),103.toByte(),73.toByte(),110.toByte(),116.toByte(),199.toByte(),104.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),98.toByte(),105.toByte(),103.toByte(),110.toByte(),117.toByte(),109.toByte(),98.toByte(),101.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),47.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),98.toByte(),105.toByte(),103.toByte(),110.toByte(),117.toByte(),109.toByte(),98.toByte(),101.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),169.toByte(),66.toByte(),105.toByte(),103.toByte(),78.toByte(),117.toByte(),109.toByte(),98.toByte(),101.toByte(),114.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),169.toByte(),66.toByte(),105.toByte(),103.toByte(),78.toByte(),117.toByte(),109.toByte(),98.toByte(),101.toByte(),114.toByte(),199.toByte(),90.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),66.toByte(),105.toByte(),103.toByte(),110.toByte(),117.toByte(),109.toByte(),98.toByte(),101.toByte(),114.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),40.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),66.toByte(),105.toByte(),103.toByte(),110.toByte(),117.toByte(),109.toByte(),98.toByte(),101.toByte(),114.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),169.toByte(),66.toByte(),105.toByte(),103.toByte(),78.toByte(),117.toByte(),109.toByte(),98.toByte(),101.toByte(),114.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),169.toByte(),66.toByte(),105.toByte(),103.toByte(),78.toByte(),117.toByte(),109.toByte(),98.toByte(),101.toByte(),114.toByte(),199.toByte(),84.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),164.toByte(),106.toByte(),115.toByte(),111.toByte(),110.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),37.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),164.toByte(),106.toByte(),115.toByte(),111.toByte(),110.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),74.toByte(),83.toByte(),79.toByte(),78.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),74.toByte(),83.toByte(),79.toByte(),78.toByte(),199.toByte(),70.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),111.toByte(),112.toByte(),116.toByte(),74.toByte(),115.toByte(),111.toByte(),110.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),30.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),111.toByte(),112.toByte(),116.toByte(),74.toByte(),115.toByte(),111.toByte(),110.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),74.toByte(),83.toByte(),79.toByte(),78.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),74.toByte(),83.toByte(),79.toByte(),78.toByte(),199.toByte(),88.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),165.toByte(),98.toByte(),121.toByte(),116.toByte(),101.toByte(),115.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),39.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),165.toByte(),98.toByte(),121.toByte(),116.toByte(),101.toByte(),115.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),165.toByte(),66.toByte(),121.toByte(),116.toByte(),101.toByte(),115.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),165.toByte(),66.toByte(),121.toByte(),116.toByte(),101.toByte(),115.toByte(),199.toByte(),74.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),111.toByte(),112.toByte(),116.toByte(),66.toByte(),121.toByte(),116.toByte(),101.toByte(),115.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),32.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),111.toByte(),112.toByte(),116.toByte(),66.toByte(),121.toByte(),116.toByte(),101.toByte(),115.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),165.toByte(),66.toByte(),121.toByte(),116.toByte(),101.toByte(),115.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),165.toByte(),66.toByte(),121.toByte(),116.toByte(),101.toByte(),115.toByte(),199.toByte(),96.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),98.toByte(),111.toByte(),111.toByte(),108.toByte(),101.toByte(),97.toByte(),110.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),43.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),98.toByte(),111.toByte(),111.toByte(),108.toByte(),101.toByte(),97.toByte(),110.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),167.toByte(),66.toByte(),111.toByte(),111.toByte(),108.toByte(),101.toByte(),97.toByte(),110.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),167.toByte(),66.toByte(),111.toByte(),111.toByte(),108.toByte(),101.toByte(),97.toByte(),110.toByte(),199.toByte(),82.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),111.toByte(),112.toByte(),116.toByte(),66.toByte(),111.toByte(),111.toByte(),108.toByte(),101.toByte(),97.toByte(),110.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),36.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),111.toByte(),112.toByte(),116.toByte(),66.toByte(),111.toByte(),111.toByte(),108.toByte(),101.toByte(),97.toByte(),110.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),167.toByte(),66.toByte(),111.toByte(),111.toByte(),108.toByte(),101.toByte(),97.toByte(),110.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),167.toByte(),66.toByte(),111.toByte(),111.toByte(),108.toByte(),101.toByte(),97.toByte(),110.toByte(),199.toByte(),191.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),140.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),40.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),117.toByte(),95.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),117.toByte(),95.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),40.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),117.toByte(),95.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),117.toByte(),95.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),199.toByte(),183.toByte(),1.toByte(),132.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),139.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),43.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),117.toByte(),79.toByte(),112.toByte(),116.toByte(),95.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),117.toByte(),79.toByte(),112.toByte(),116.toByte(),95.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),43.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),117.toByte(),79.toByte(),112.toByte(),116.toByte(),95.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),117.toByte(),79.toByte(),112.toByte(),116.toByte(),95.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),199.toByte(),179.toByte(),1.toByte(),132.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),131.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),37.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),95.toByte(),111.toByte(),112.toByte(),116.toByte(),95.toByte(),117.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),95.toByte(),111.toByte(),112.toByte(),116.toByte(),95.toByte(),117.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),37.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),95.toByte(),111.toByte(),112.toByte(),116.toByte(),95.toByte(),117.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),95.toByte(),111.toByte(),112.toByte(),116.toByte(),95.toByte(),117.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),199.toByte(),187.toByte(),1.toByte(),132.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),137.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),39.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),83.toByte(),116.toByte(),114.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),83.toByte(),116.toByte(),114.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),39.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),83.toByte(),116.toByte(),114.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),83.toByte(),116.toByte(),114.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),93.toByte(),200.toByte(),1.toByte(),171.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),200.toByte(),1.toByte(),113.toByte(),1.toByte(),134.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),152.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),44.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),44.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),152.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),44.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),44.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),93.toByte(),200.toByte(),1.toByte(),175.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),200.toByte(),1.toByte(),109.toByte(),1.toByte(),134.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),146.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),42.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),177.toByte(),117.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),177.toByte(),117.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),42.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),177.toByte(),117.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),146.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),42.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),177.toByte(),117.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),177.toByte(),117.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),42.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),177.toByte(),117.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),177.toByte(),117.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),177.toByte(),117.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),93.toByte(),200.toByte(),3.toByte(),239.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),200.toByte(),3.toByte(),169.toByte(),1.toByte(),134.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),200.toByte(),1.toByte(),173.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),182.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),54.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),54.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),182.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),54.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),54.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),93.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),200.toByte(),1.toByte(),173.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),182.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),54.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),54.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),182.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),54.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),54.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),172.toByte(),91.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),93.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),172.toByte(),91.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),93.toByte(),93.toByte(),200.toByte(),6.toByte(),123.toByte(),1.toByte(),132.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),200.toByte(),6.toByte(),70.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),200.toByte(),3.toByte(),4.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),200.toByte(),1.toByte(),100.toByte(),1.toByte(),134.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),145.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),45.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),45.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),145.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),45.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),45.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),93.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),200.toByte(),1.toByte(),100.toByte(),1.toByte(),134.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),145.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),45.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),45.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),145.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),45.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),45.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),172.toByte(),91.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),93.toByte(),93.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),200.toByte(),3.toByte(),4.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),200.toByte(),1.toByte(),100.toByte(),1.toByte(),134.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),145.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),45.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),45.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),145.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),45.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),45.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),93.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),200.toByte(),1.toByte(),100.toByte(),1.toByte(),134.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),145.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),45.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),45.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),145.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),45.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),45.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),172.toByte(),91.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),93.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),174.toByte(),91.toByte(),91.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),93.toByte(),93.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),174.toByte(),91.toByte(),91.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),93.toByte(),93.toByte(),93.toByte(),199.toByte(),104.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),48.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),199.toByte(),90.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),41.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),199.toByte(),239.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),177.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),53.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),53.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),173.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),173.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),199.toByte(),211.toByte(),1.toByte(),132.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),156.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),46.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),46.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),173.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),173.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),199.toByte(),92.toByte(),1.toByte(),133.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),43.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),101.toByte(),110.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),101.toByte(),110.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),82.toByte(),1.toByte(),132.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),38.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),225.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),166.toByte(),1.toByte(),134.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),50.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),50.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),172.toByte(),91.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),172.toByte(),91.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),199.toByte(),197.toByte(),1.toByte(),132.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),145.toByte(),1.toByte(),133.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),43.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),43.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),172.toByte(),91.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),172.toByte(),91.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),199.toByte(),241.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),199.toByte(),186.toByte(),1.toByte(),135.toByte(),163.toByte(),107.toByte(),101.toByte(),121.toByte(),199.toByte(),38.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),206.toByte(),0.toByte(),4.toByte(),0.toByte(),2.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),35.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),176.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),73.toByte(),110.toByte(),116.toByte(),62.toByte(),165.toByte(),118.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),199.toByte(),35.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),176.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),73.toByte(),110.toByte(),116.toByte(),62.toByte(),200.toByte(),1.toByte(),214.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),200.toByte(),1.toByte(),151.toByte(),1.toByte(),135.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),140.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),40.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),40.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),165.toByte(),91.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),163.toByte(),107.toByte(),101.toByte(),121.toByte(),199.toByte(),43.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),206.toByte(),0.toByte(),4.toByte(),0.toByte(),2.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),178.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),91.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),62.toByte(),165.toByte(),118.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),199.toByte(),140.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),40.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),40.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),165.toByte(),91.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),178.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),91.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),62.toByte(),200.toByte(),1.toByte(),46.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),199.toByte(),234.toByte(),1.toByte(),135.toByte(),163.toByte(),107.toByte(),101.toByte(),121.toByte(),199.toByte(),43.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),206.toByte(),0.toByte(),4.toByte(),0.toByte(),2.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),50.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),62.toByte(),165.toByte(),118.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),199.toByte(),50.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),62.toByte(),200.toByte(),2.toByte(),75.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),200.toByte(),1.toByte(),255.toByte(),1.toByte(),135.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),183.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),55.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),55.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),173.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),163.toByte(),107.toByte(),101.toByte(),121.toByte(),199.toByte(),48.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),206.toByte(),0.toByte(),4.toByte(),0.toByte(),2.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),186.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),62.toByte(),165.toByte(),118.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),199.toByte(),183.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),55.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),55.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),173.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),186.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),62.toByte(),200.toByte(),1.toByte(),68.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),199.toByte(),247.toByte(),1.toByte(),135.toByte(),163.toByte(),107.toByte(),101.toByte(),121.toByte(),199.toByte(),49.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),109.toByte(),97.toByte(),112.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),86.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),206.toByte(),0.toByte(),4.toByte(),0.toByte(),2.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),109.toByte(),97.toByte(),112.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),86.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),49.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),109.toByte(),97.toByte(),112.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),86.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),174.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),77.toByte(),97.toByte(),112.toByte(),86.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),187.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),77.toByte(),97.toByte(),112.toByte(),86.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),62.toByte(),165.toByte(),118.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),199.toByte(),49.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),109.toByte(),97.toByte(),112.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),86.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),174.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),77.toByte(),97.toByte(),112.toByte(),86.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),109.toByte(),97.toByte(),112.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),86.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),187.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),77.toByte(),97.toByte(),112.toByte(),86.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),62.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),200.toByte(),1.toByte(),13.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),1.toByte(),170.toByte(),112.toByte(),114.toByte(),111.toByte(),112.toByte(),101.toByte(),114.toByte(),116.toByte(),105.toByte(),101.toByte(),115.toByte(),147.toByte(),199.toByte(),68.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),164.toByte(),112.toByte(),114.toByte(),111.toByte(),112.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),29.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),164.toByte(),112.toByte(),114.toByte(),111.toByte(),112.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),199.toByte(),86.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),99.toByte(),105.toByte(),114.toByte(),99.toByte(),117.toByte(),108.toByte(),97.toByte(),114.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),39.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),99.toByte(),105.toByte(),114.toByte(),99.toByte(),117.toByte(),108.toByte(),97.toByte(),114.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),199.toByte(),70.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),165.toByte(),99.toByte(),111.toByte(),110.toByte(),115.toByte(),116.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),30.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),165.toByte(),99.toByte(),111.toByte(),110.toByte(),115.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),199.toByte(),128.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),1.toByte(),170.toByte(),112.toByte(),114.toByte(),111.toByte(),112.toByte(),101.toByte(),114.toByte(),116.toByte(),105.toByte(),101.toByte(),115.toByte(),145.toByte(),199.toByte(),86.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),102.toByte(),111.toByte(),111.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),38.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),102.toByte(),111.toByte(),111.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),174.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),77.toByte(),97.toByte(),112.toByte(),86.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),199.toByte(),120.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),1.toByte(),170.toByte(),112.toByte(),114.toByte(),111.toByte(),112.toByte(),101.toByte(),114.toByte(),116.toByte(),105.toByte(),101.toByte(),115.toByte(),145.toByte(),199.toByte(),88.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),164.toByte(),101.toByte(),108.toByte(),115.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),39.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),164.toByte(),101.toByte(),108.toByte(),115.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),101.toByte(),108.toByte(),115.toByte(),101.toByte(),167.toByte(),118.toByte(),101.toByte(),114.toByte(),115.toByte(),105.toByte(),111.toByte(),110.toByte(),163.toByte(),48.toByte(),46.toByte(),49.toByte() + )).getOrThrow() + ) diff --git a/packages/test-cases/cases/bind/sanity/output/plugin-py/module.py b/packages/test-cases/cases/bind/sanity/output/plugin-py/module.py index b9cb94ba2a..836ffbc767 100644 --- a/packages/test-cases/cases/bind/sanity/output/plugin-py/module.py +++ b/packages/test-cases/cases/bind/sanity/output/plugin-py/module.py @@ -92,4 +92,3 @@ def r_if( env: None ) -> "Else": pass - diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-as/AnotherType/index.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/AnotherType/index.ts similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-as/AnotherType/index.ts rename to packages/test-cases/cases/bind/sanity/output/wrap-as/AnotherType/index.ts diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-as/AnotherType/serialization.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/AnotherType/serialization.ts similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-as/AnotherType/serialization.ts rename to packages/test-cases/cases/bind/sanity/output/wrap-as/AnotherType/serialization.ts diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-as/CustomEnum/index.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/CustomEnum/index.ts similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-as/CustomEnum/index.ts rename to packages/test-cases/cases/bind/sanity/output/wrap-as/CustomEnum/index.ts diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-as/CustomMapValue/index.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/CustomMapValue/index.ts similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-as/CustomMapValue/index.ts rename to packages/test-cases/cases/bind/sanity/output/wrap-as/CustomMapValue/index.ts diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-as/CustomMapValue/serialization.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/CustomMapValue/serialization.ts similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-as/CustomMapValue/serialization.ts rename to packages/test-cases/cases/bind/sanity/output/wrap-as/CustomMapValue/serialization.ts diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-as/CustomType/index.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/CustomType/index.ts similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-as/CustomType/index.ts rename to packages/test-cases/cases/bind/sanity/output/wrap-as/CustomType/index.ts diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-as/CustomType/serialization.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/CustomType/serialization.ts similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-as/CustomType/serialization.ts rename to packages/test-cases/cases/bind/sanity/output/wrap-as/CustomType/serialization.ts diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-as/Env/index.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/Env/index.ts similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-as/Env/index.ts rename to packages/test-cases/cases/bind/sanity/output/wrap-as/Env/index.ts diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-as/Env/serialization.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/Env/serialization.ts similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-as/Env/serialization.ts rename to packages/test-cases/cases/bind/sanity/output/wrap-as/Env/serialization.ts diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-as/Module/index.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/Module/index.ts similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-as/Module/index.ts rename to packages/test-cases/cases/bind/sanity/output/wrap-as/Module/index.ts diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-as/Module/module.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/Module/module.ts similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-as/Module/module.ts rename to packages/test-cases/cases/bind/sanity/output/wrap-as/Module/module.ts diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-as/Module/serialization.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/Module/serialization.ts similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-as/Module/serialization.ts rename to packages/test-cases/cases/bind/sanity/output/wrap-as/Module/serialization.ts diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-as/Module/wrapped.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/Module/wrapped.ts similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-as/Module/wrapped.ts rename to packages/test-cases/cases/bind/sanity/output/wrap-as/Module/wrapped.ts diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-as/TestImport/index.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/TestImport/index.ts similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-as/TestImport/index.ts rename to packages/test-cases/cases/bind/sanity/output/wrap-as/TestImport/index.ts diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-as/else/index.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/else/index.ts similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-as/else/index.ts rename to packages/test-cases/cases/bind/sanity/output/wrap-as/else/index.ts diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-as/else/serialization.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/else/serialization.ts similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-as/else/serialization.ts rename to packages/test-cases/cases/bind/sanity/output/wrap-as/else/serialization.ts diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-as/entry.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/entry.ts similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-as/entry.ts rename to packages/test-cases/cases/bind/sanity/output/wrap-as/entry.ts diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-as/imported/TestImport_AnotherObject/index.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_AnotherObject/index.ts similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-as/imported/TestImport_AnotherObject/index.ts rename to packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_AnotherObject/index.ts diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-as/imported/TestImport_AnotherObject/serialization.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_AnotherObject/serialization.ts similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-as/imported/TestImport_AnotherObject/serialization.ts rename to packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_AnotherObject/serialization.ts diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-as/imported/TestImport_Enum/index.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Enum/index.ts similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-as/imported/TestImport_Enum/index.ts rename to packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Enum/index.ts diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-as/imported/TestImport_Enum_Return/index.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Enum_Return/index.ts similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-as/imported/TestImport_Enum_Return/index.ts rename to packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Enum_Return/index.ts diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-as/imported/TestImport_Env/index.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Env/index.ts similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-as/imported/TestImport_Env/index.ts rename to packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Env/index.ts diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-as/imported/TestImport_Env/serialization.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Env/serialization.ts similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-as/imported/TestImport_Env/serialization.ts rename to packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Env/serialization.ts diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-as/imported/TestImport_Module/index.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Module/index.ts similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-as/imported/TestImport_Module/index.ts rename to packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Module/index.ts diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-as/imported/TestImport_Module/serialization.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Module/serialization.ts similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-as/imported/TestImport_Module/serialization.ts rename to packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Module/serialization.ts diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-as/imported/TestImport_Object/index.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Object/index.ts similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-as/imported/TestImport_Object/index.ts rename to packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Object/index.ts diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-as/imported/TestImport_Object/serialization.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Object/serialization.ts similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-as/imported/TestImport_Object/serialization.ts rename to packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Object/serialization.ts diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-as/imported/index.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/index.ts similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-as/imported/index.ts rename to packages/test-cases/cases/bind/sanity/output/wrap-as/imported/index.ts diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-as/index.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/index.ts similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-as/index.ts rename to packages/test-cases/cases/bind/sanity/output/wrap-as/index.ts diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-as/while/index.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/while/index.ts similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-as/while/index.ts rename to packages/test-cases/cases/bind/sanity/output/wrap-as/while/index.ts diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-rs/_else/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/_else/mod.rs similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-rs/_else/mod.rs rename to packages/test-cases/cases/bind/sanity/output/wrap-rs/_else/mod.rs diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-rs/_else/serialization.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/_else/serialization.rs similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-rs/_else/serialization.rs rename to packages/test-cases/cases/bind/sanity/output/wrap-rs/_else/serialization.rs diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-rs/_while/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/_while/mod.rs similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-rs/_while/mod.rs rename to packages/test-cases/cases/bind/sanity/output/wrap-rs/_while/mod.rs diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-rs/another_type/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/another_type/mod.rs similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-rs/another_type/mod.rs rename to packages/test-cases/cases/bind/sanity/output/wrap-rs/another_type/mod.rs diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-rs/another_type/serialization.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/another_type/serialization.rs similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-rs/another_type/serialization.rs rename to packages/test-cases/cases/bind/sanity/output/wrap-rs/another_type/serialization.rs diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-rs/custom_enum/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_enum/mod.rs similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-rs/custom_enum/mod.rs rename to packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_enum/mod.rs diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-rs/custom_map_value/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_map_value/mod.rs similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-rs/custom_map_value/mod.rs rename to packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_map_value/mod.rs diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-rs/custom_map_value/serialization.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_map_value/serialization.rs similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-rs/custom_map_value/serialization.rs rename to packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_map_value/serialization.rs diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-rs/custom_type/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_type/mod.rs similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-rs/custom_type/mod.rs rename to packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_type/mod.rs diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-rs/custom_type/serialization.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_type/serialization.rs similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-rs/custom_type/serialization.rs rename to packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_type/serialization.rs diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-rs/entry.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/entry.rs similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-rs/entry.rs rename to packages/test-cases/cases/bind/sanity/output/wrap-rs/entry.rs diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-rs/env/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/env/mod.rs similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-rs/env/mod.rs rename to packages/test-cases/cases/bind/sanity/output/wrap-rs/env/mod.rs diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-rs/env/serialization.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/env/serialization.rs similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-rs/env/serialization.rs rename to packages/test-cases/cases/bind/sanity/output/wrap-rs/env/serialization.rs diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-rs/imported/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/mod.rs similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-rs/imported/mod.rs rename to packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/mod.rs diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-rs/imported/test_import_another_object/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_another_object/mod.rs similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-rs/imported/test_import_another_object/mod.rs rename to packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_another_object/mod.rs diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-rs/imported/test_import_another_object/serialization.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_another_object/serialization.rs similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-rs/imported/test_import_another_object/serialization.rs rename to packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_another_object/serialization.rs diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-rs/imported/test_import_enum/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_enum/mod.rs similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-rs/imported/test_import_enum/mod.rs rename to packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_enum/mod.rs diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-rs/imported/test_import_enum_return/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_enum_return/mod.rs similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-rs/imported/test_import_enum_return/mod.rs rename to packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_enum_return/mod.rs diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-rs/imported/test_import_env/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_env/mod.rs similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-rs/imported/test_import_env/mod.rs rename to packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_env/mod.rs diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-rs/imported/test_import_env/serialization.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_env/serialization.rs similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-rs/imported/test_import_env/serialization.rs rename to packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_env/serialization.rs diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-rs/imported/test_import_module/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_module/mod.rs similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-rs/imported/test_import_module/mod.rs rename to packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_module/mod.rs diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-rs/imported/test_import_module/serialization.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_module/serialization.rs similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-rs/imported/test_import_module/serialization.rs rename to packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_module/serialization.rs diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-rs/imported/test_import_object/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_object/mod.rs similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-rs/imported/test_import_object/mod.rs rename to packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_object/mod.rs diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-rs/imported/test_import_object/serialization.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_object/serialization.rs similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-rs/imported/test_import_object/serialization.rs rename to packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_object/serialization.rs diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-rs/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/mod.rs similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-rs/mod.rs rename to packages/test-cases/cases/bind/sanity/output/wrap-rs/mod.rs diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-rs/module/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/module/mod.rs similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-rs/module/mod.rs rename to packages/test-cases/cases/bind/sanity/output/wrap-rs/module/mod.rs diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-rs/module/module.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/module/module.rs similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-rs/module/module.rs rename to packages/test-cases/cases/bind/sanity/output/wrap-rs/module/module.rs diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-rs/module/serialization.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/module/serialization.rs similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-rs/module/serialization.rs rename to packages/test-cases/cases/bind/sanity/output/wrap-rs/module/serialization.rs diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-rs/module/wrapped.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/module/wrapped.rs similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-rs/module/wrapped.rs rename to packages/test-cases/cases/bind/sanity/output/wrap-rs/module/wrapped.rs diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-rs/test_import/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/test_import/mod.rs similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-rs/test_import/mod.rs rename to packages/test-cases/cases/bind/sanity/output/wrap-rs/test_import/mod.rs diff --git a/yarn.lock b/yarn.lock index 8c8d94e50f..548fb42b5d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2149,32 +2149,15 @@ resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.6.0.tgz#ed410c9eb0070491cff9fe914246ce41f88d6f74" integrity sha512-aPfcBeLErM/PPiAuAbNFLN5sNbZLc3KZlar27uohllN8Zs6jJbHyJU1y7cMA6W/zuq+thkaG8mujiS+3iD/FWQ== -"@polywrap/asyncify-js@0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@polywrap/asyncify-js/-/asyncify-js-0.10.0.tgz#0570ce34501e91710274285b6b4740f1094f08a3" - integrity sha512-/ZhREKykF1hg5H/mm8vQHqv7MSedfCnwzbsNwYuLmH/IUtQi2t7NyD2XXavSLq5PFOHA/apPueatbSFTeIgBdA== - "@polywrap/asyncify-js@0.10.1": version "0.10.1" resolved "https://registry.yarnpkg.com/@polywrap/asyncify-js/-/asyncify-js-0.10.1.tgz#00d656a39bfd54c1b8af82adf648264b0415259b" integrity sha512-qXD2GNAoG18sDLPOtN3bbdEJUM+5hhII2EJkcAREJSBpi4g7yFxlySz/qQGzDnlIRNl9MGNgaf+TYbpQnNBeLw== -"@polywrap/client-config-builder-js@0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@polywrap/client-config-builder-js/-/client-config-builder-js-0.10.0.tgz#e583f32dca97dfe0b9575db244fdad74a4f42d6f" - integrity sha512-9hZd5r/5rkLoHdeB76NDUNOYcUCzS+b8WjCI9kv5vNQiOR83dZnW3rTnQmcXOWWErRY70h6xvAQWWQ1WrW/SpQ== - dependencies: - "@polywrap/concurrent-plugin-js" "~0.10.0-pre" - "@polywrap/core-js" "0.10.0" - "@polywrap/ethereum-provider-js" "npm:@polywrap/ethereum-provider-js@~0.3.0" - "@polywrap/ethereum-provider-js-v1" "npm:@polywrap/ethereum-provider-js@~0.2.4" - "@polywrap/file-system-plugin-js" "~0.10.0-pre" - "@polywrap/http-plugin-js" "~0.10.0-pre" - "@polywrap/logger-plugin-js" "0.10.0-pre.10" - "@polywrap/uri-resolver-extensions-js" "0.10.0" - "@polywrap/uri-resolvers-js" "0.10.0" - "@polywrap/wasm-js" "0.10.0" - base64-to-uint8array "1.0.0" +"@polywrap/asyncify-js@0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@polywrap/asyncify-js/-/asyncify-js-0.11.0.tgz#a5ad2661184c49aa249ef6042579b2ca835a2781" + integrity sha512-rZ5poZ4lFp1si8T6jbNXNd14QHf5RcNi4db/1ODp6r+x70KtbOiL9Ob+Pnlc7tVWvP4RkP82Xld+xWvudKOYlA== "@polywrap/client-config-builder-js@0.10.1": version "0.10.1" @@ -2193,23 +2176,37 @@ "@polywrap/wasm-js" "0.10.1" base64-to-uint8array "1.0.0" -"@polywrap/client-js@0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@polywrap/client-js/-/client-js-0.10.0.tgz#607c24cd65c03f57ca8325f4a8ecc02a5485c993" - integrity sha512-wRr4HZ7a4oLrKuw8CchM5JYcE8er43GGKQnhtf/ylld5Q7FpNpfzhsi8eWknORugQYuvR3CSG7qZey4Ijgj6qQ== - dependencies: - "@polywrap/client-config-builder-js" "0.10.0" - "@polywrap/core-client-js" "0.10.0" - "@polywrap/core-js" "0.10.0" - "@polywrap/msgpack-js" "0.10.0" - "@polywrap/plugin-js" "0.10.0" - "@polywrap/result" "0.10.0" - "@polywrap/tracing-js" "0.10.0" - "@polywrap/uri-resolver-extensions-js" "0.10.0" - "@polywrap/uri-resolvers-js" "0.10.0" - "@polywrap/wrap-manifest-types-js" "0.10.0" - -"@polywrap/client-js@~0.10.0", "@polywrap/client-js@~0.10.1": +"@polywrap/client-config-builder-js@0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@polywrap/client-config-builder-js/-/client-config-builder-js-0.11.0.tgz#efdc95b24cd434eab40e8010f79c9e57330f6aad" + integrity sha512-jdw4iv6BHBOlTGgDyK672/uMFxltf9QaqbYB8c38tVaXZlHOYdBf86ez/cBiEMAd7Gomt3aYjSUSunEgYfm2Wg== + dependencies: + "@polywrap/config-bundle-types-js" "0.11.0" + "@polywrap/core-js" "0.11.0" + "@polywrap/plugin-js" "0.11.0" + "@polywrap/sys-config-bundle-js" "0.11.0" + "@polywrap/uri-resolver-extensions-js" "0.11.0" + "@polywrap/uri-resolvers-js" "0.11.0" + "@polywrap/wasm-js" "0.11.0" + "@polywrap/web3-config-bundle-js" "0.11.0" + +"@polywrap/client-js@0.11.0", "@polywrap/client-js@~0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@polywrap/client-js/-/client-js-0.11.0.tgz#9359ce9ebf838ff26b834cd482f2e77357b8f482" + integrity sha512-2QGTtuDfbyClomx1GmHExWbvlbTGRsX+e918olvJryGawUcYgAwmOmZQIyH+0KTWtEXGrKbbk4SW1z1yjj2lTQ== + dependencies: + "@polywrap/client-config-builder-js" "0.11.0" + "@polywrap/core-client-js" "0.11.0" + "@polywrap/core-js" "0.11.0" + "@polywrap/msgpack-js" "0.11.0" + "@polywrap/plugin-js" "0.11.0" + "@polywrap/result" "0.11.0" + "@polywrap/tracing-js" "0.11.0" + "@polywrap/uri-resolver-extensions-js" "0.11.0" + "@polywrap/uri-resolvers-js" "0.11.0" + "@polywrap/wrap-manifest-types-js" "0.11.0" + +"@polywrap/client-js@~0.10.0": version "0.10.1" resolved "https://registry.yarnpkg.com/@polywrap/client-js/-/client-js-0.10.1.tgz#d324420b1558d7fb47c6928042c083eef7b3b6f6" integrity sha512-xIZoGOPPS+J2RjiyEF8A8huMIr0IyN+VEwHWcCUdp7NxTQ1xmve1lxQfbbdE0BC37o5Ni7lJwiIXmAUfhuMyGg== @@ -2225,7 +2222,7 @@ "@polywrap/uri-resolvers-js" "0.10.1" "@polywrap/wrap-manifest-types-js" "0.10.1" -"@polywrap/concurrent-plugin-js@~0.10.0", "@polywrap/concurrent-plugin-js@~0.10.0-pre": +"@polywrap/concurrent-plugin-js@~0.10.0": version "0.10.0" resolved "https://registry.yarnpkg.com/@polywrap/concurrent-plugin-js/-/concurrent-plugin-js-0.10.0.tgz#662e49976f75f30632b302d515bd22c7643afc44" integrity sha512-sc11ffs34ScBHPB9uHFZuTmF8yPtZT81sBpBj7f4MlmrRDxtJS56Y7k/qL6L1xuwsnmeFipi5JGau1CcBaYmJQ== @@ -2234,16 +2231,12 @@ "@polywrap/msgpack-js" "0.10.0" "@polywrap/plugin-js" "0.10.0" -"@polywrap/core-client-js@0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@polywrap/core-client-js/-/core-client-js-0.10.0.tgz#bec91479d1294ca86b7fa77f5ed407dab4d2a0b4" - integrity sha512-Sv1fVHM/5ynobtT2N25jbXOKNju1y0Wk4TwFnTJXrAUcARrRMoAfmwLVfTwrqRZ2OjWMQ/AWTc7ziNBtH5dNAg== +"@polywrap/config-bundle-types-js@0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@polywrap/config-bundle-types-js/-/config-bundle-types-js-0.11.0.tgz#76bfa64c5af2d5f13f4a08a8b7c51d8e12c23f8c" + integrity sha512-SqlpwTzcLuh0qAEXjy4OwUpyQnD+Mq/6SQJ+Dwf1xQ19NzBIeELOvX+96LRcuK9SR2ZCIzlfgmCBMy2/ExVy1A== dependencies: - "@polywrap/core-js" "0.10.0" - "@polywrap/msgpack-js" "0.10.0" - "@polywrap/result" "0.10.0" - "@polywrap/tracing-js" "0.10.0" - "@polywrap/wrap-manifest-types-js" "0.10.0" + "@polywrap/core-js" "0.11.0" "@polywrap/core-client-js@0.10.1": version "0.10.1" @@ -2256,6 +2249,17 @@ "@polywrap/tracing-js" "0.10.1" "@polywrap/wrap-manifest-types-js" "0.10.1" +"@polywrap/core-client-js@0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@polywrap/core-client-js/-/core-client-js-0.11.0.tgz#92a6ceb074dc32409641915d8672358377d1825d" + integrity sha512-nii7Z2QhTcuKjE3xp505VdMh/vzO5wKwFPw8ibhqOp1jKl9R3/LK0EIZUI67NSWkaklhM1lv/hJ0h4ubhSaHtw== + dependencies: + "@polywrap/core-js" "0.11.0" + "@polywrap/msgpack-js" "0.11.0" + "@polywrap/result" "0.11.0" + "@polywrap/tracing-js" "0.11.0" + "@polywrap/wrap-manifest-types-js" "0.11.0" + "@polywrap/core-js@0.10.0": version "0.10.0" resolved "https://registry.yarnpkg.com/@polywrap/core-js/-/core-js-0.10.0.tgz#5ddc31ff47019342659a2208eec05299b072b216" @@ -2274,7 +2278,7 @@ "@polywrap/tracing-js" "0.10.0-pre.10" "@polywrap/wrap-manifest-types-js" "0.10.0-pre.10" -"@polywrap/core-js@0.10.1", "@polywrap/core-js@~0.10.0": +"@polywrap/core-js@0.10.1", "@polywrap/core-js@~0.10.0", "@polywrap/core-js@~0.10.1": version "0.10.1" resolved "https://registry.yarnpkg.com/@polywrap/core-js/-/core-js-0.10.1.tgz#09405c745f591d5f7ec243db95a61540a05296cb" integrity sha512-BJpWDikfd/6h64Lf7FKy0g5O3a5OKaL915boni1pHP54wF4xBWdHkKixLGD8w4BZWRiW9v42PpYBhWqYZwSNGg== @@ -2283,6 +2287,23 @@ "@polywrap/tracing-js" "0.10.1" "@polywrap/wrap-manifest-types-js" "0.10.1" +"@polywrap/core-js@0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@polywrap/core-js/-/core-js-0.11.0.tgz#9c42edf4c4693a7a27d48c09d00115b0074ece21" + integrity sha512-pSgaiHAxybAZ2jBY+QaRMrumdzQw7ZdlwFd7+fA9NIHonoDQaA/lFd1EhUy7pN7rT24aVEgMNT9d5GeWvvTe3Q== + dependencies: + "@polywrap/result" "0.11.0" + "@polywrap/tracing-js" "0.11.0" + "@polywrap/wrap-manifest-types-js" "0.11.0" + +"@polywrap/datetime-plugin-js@~0.10.0": + version "0.10.1" + resolved "https://registry.yarnpkg.com/@polywrap/datetime-plugin-js/-/datetime-plugin-js-0.10.1.tgz#8042673034c09155f3d0972eef87d87cb53b1914" + integrity sha512-eB6osYgISVQjnz6SDJ+02Z5HIC3Qg82hU6m1b02fTCsAsJqIDTSoe5AUugd0KqQ3C+MHv03TlGuFn6ekjyutGg== + dependencies: + "@polywrap/core-js" "~0.10.1" + "@polywrap/plugin-js" "~0.10.1" + "@polywrap/ethereum-provider-js-v1@npm:@polywrap/ethereum-provider-js@~0.2.4": version "0.2.4" resolved "https://registry.yarnpkg.com/@polywrap/ethereum-provider-js/-/ethereum-provider-js-0.2.4.tgz#3df1a6548da191618bb5cae7928c7427e69e0030" @@ -2294,7 +2315,7 @@ "@polywrap/plugin-js" "0.10.0-pre.10" ethers "5.7.0" -"@polywrap/ethereum-provider-js@npm:@polywrap/ethereum-provider-js@~0.3.0", "@polywrap/ethereum-provider-js@npm:@polywrap/ethereum-provider-js@~0.3.1": +"@polywrap/ethereum-provider-js@npm:@polywrap/ethereum-provider-js@~0.3.1": version "0.3.1" resolved "https://registry.yarnpkg.com/@polywrap/ethereum-provider-js/-/ethereum-provider-js-0.3.1.tgz#ffdb9425c819ee76d3e3d5ade7d1b044077037e0" integrity sha512-El2d3gE2CFdGNzKQhO+IPP79lhyQmkAGlpQadaW/EDyFDjERLckYDLPrwUCXG0agUcQZcNY1nHn2hknumw/yWg== @@ -2305,7 +2326,7 @@ "@polywrap/plugin-js" "0.10.0" ethers "5.7.0" -"@polywrap/file-system-plugin-js@~0.10.0", "@polywrap/file-system-plugin-js@~0.10.0-pre": +"@polywrap/file-system-plugin-js@~0.10.0": version "0.10.0" resolved "https://registry.yarnpkg.com/@polywrap/file-system-plugin-js/-/file-system-plugin-js-0.10.0.tgz#7814e0b1c0bb170ab85500f67aca6af4c17ec19f" integrity sha512-QWDpeVBACeK8PqZUwby/zlozG/07fpvJN5kQtw5e7ha4K5blX1j1i6ixgLKlYyQsaaTBxS6aAF3C0ryt4BsJcQ== @@ -2313,7 +2334,7 @@ "@polywrap/core-js" "0.10.0" "@polywrap/plugin-js" "0.10.0" -"@polywrap/http-plugin-js@~0.10.0", "@polywrap/http-plugin-js@~0.10.0-pre": +"@polywrap/http-plugin-js@~0.10.0": version "0.10.0" resolved "https://registry.yarnpkg.com/@polywrap/http-plugin-js/-/http-plugin-js-0.10.0.tgz#930ec9dbaa762b71d8905ad02a77d5d574707642" integrity sha512-t/yvoOAGUwsuS37ZQkkBZOogNbeJadtHwitMMA6XGs1jDANP1Xim/xWXWBYC3W1YJ8pbUeO8bHZHTBaJ7SC0cA== @@ -2323,15 +2344,7 @@ axios "0.21.4" form-data "4.0.0" -"@polywrap/logger-plugin-js@0.10.0-pre.10": - version "0.10.0-pre.10" - resolved "https://registry.yarnpkg.com/@polywrap/logger-plugin-js/-/logger-plugin-js-0.10.0-pre.10.tgz#de4a995c083edc26d72abb7420628b40d81efed2" - integrity sha512-6wBgBvphQRI+LP22+xi1KPcCq4B9dUMB/ZAXOpVTb/X/fOqdNBOS1LTXV+BtCe2KfdqGS6DKIXwGITcMOxIDCg== - dependencies: - "@polywrap/core-js" "0.10.0-pre.10" - "@polywrap/plugin-js" "0.10.0-pre.10" - -"@polywrap/logger-plugin-js@~0.10.1": +"@polywrap/logger-plugin-js@~0.10.0", "@polywrap/logger-plugin-js@~0.10.1": version "0.10.1" resolved "https://registry.yarnpkg.com/@polywrap/logger-plugin-js/-/logger-plugin-js-0.10.1.tgz#220cc248cb1381aa46c1f773ed8ce77da420280c" integrity sha512-ipqS7A6Mc0Fp0e/qg8RyGIulfk6mGS9acKii3kQoJ59/Zf/Yy4Eg3HWDtnlgBIdIgwyZKD8amiF42VKRO6R3Ig== @@ -2360,6 +2373,13 @@ dependencies: "@msgpack/msgpack" "2.7.2" +"@polywrap/msgpack-js@0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@polywrap/msgpack-js/-/msgpack-js-0.11.0.tgz#e354f5e6a4fc096bae3714eb81db5483c2df4005" + integrity sha512-+sH6+NO3OmizdEyT2BfEe5dSIUbAaH6GKlb1r9rCIP8TzdrjcK04HHBH0I6/qvL1skil1SZFNJnoT3hjfhlgVQ== + dependencies: + "@msgpack/msgpack" "2.7.2" + "@polywrap/plugin-js@0.10.0": version "0.10.0" resolved "https://registry.yarnpkg.com/@polywrap/plugin-js/-/plugin-js-0.10.0.tgz#e3bc81bf7832df9c84a4a319515228b159a05ba5" @@ -2382,7 +2402,7 @@ "@polywrap/tracing-js" "0.10.0-pre.10" "@polywrap/wrap-manifest-types-js" "0.10.0-pre.10" -"@polywrap/plugin-js@0.10.1", "@polywrap/plugin-js@~0.10.0": +"@polywrap/plugin-js@0.10.1", "@polywrap/plugin-js@~0.10.0", "@polywrap/plugin-js@~0.10.1": version "0.10.1" resolved "https://registry.yarnpkg.com/@polywrap/plugin-js/-/plugin-js-0.10.1.tgz#e11ce19dde01245750c297a62f2f75fd58ef9ced" integrity sha512-WBk4ZUrI5m6FG4bIocLHo7XS+QMeNa23odli6Ss6onUyo7mPIo1wlceEgw7Cu4gd/3bmuc6VGoCKRA1/glBT3g== @@ -2393,6 +2413,17 @@ "@polywrap/tracing-js" "0.10.1" "@polywrap/wrap-manifest-types-js" "0.10.1" +"@polywrap/plugin-js@0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@polywrap/plugin-js/-/plugin-js-0.11.0.tgz#cee0e8d14e7b4d1b7dc78bef7d092de06ece280d" + integrity sha512-5DGUGorf43MTB2SehkVs8jL7gGdlOT/mRqRi0/R5bnK+A+q75F6/kj26wnytrh42393WoIWghZtwZFkGN4EbYw== + dependencies: + "@polywrap/core-js" "0.11.0" + "@polywrap/msgpack-js" "0.11.0" + "@polywrap/result" "0.11.0" + "@polywrap/tracing-js" "0.11.0" + "@polywrap/wrap-manifest-types-js" "0.11.0" + "@polywrap/result@0.10.0": version "0.10.0" resolved "https://registry.yarnpkg.com/@polywrap/result/-/result-0.10.0.tgz#712339223fba524dfabfb0bf868411f357d52e34" @@ -2408,6 +2439,25 @@ resolved "https://registry.yarnpkg.com/@polywrap/result/-/result-0.10.1.tgz#e60122396521fc07edda6951915ada4aaa5f6694" integrity sha512-9EoS/JUgKFwRk396lQ+3tDAGbZExsOf26SUG4l41HJv4FZLLLOL5ksppJK8StvjtbpQOIgFls23c83CXzS1hBQ== +"@polywrap/result@0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@polywrap/result/-/result-0.11.0.tgz#a64af3f419318d2cd0ed797249e1f87af40f0798" + integrity sha512-FIhVioaNYFWMYuEb8dSHCdtpoXkmJuPsLCI4+GqATBWoEy2v4shlu/ILjVzeo8dk5OPr/MeIrqbt+KlFPUYk1g== + +"@polywrap/sys-config-bundle-js@0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@polywrap/sys-config-bundle-js/-/sys-config-bundle-js-0.11.0.tgz#4a1c379c323e281703c5a5174739dc9c93a275c8" + integrity sha512-yoy1HQxzHgbC1kCARPgo6kwWkkCcnSURXVGe8pNeHRYssfVXm1HEyZThzCkcJVaRf60pD6DKLjqFwIZbzFWlUQ== + dependencies: + "@polywrap/concurrent-plugin-js" "~0.10.0" + "@polywrap/config-bundle-types-js" "0.11.0" + "@polywrap/datetime-plugin-js" "~0.10.0" + "@polywrap/file-system-plugin-js" "~0.10.0" + "@polywrap/http-plugin-js" "~0.10.0" + "@polywrap/logger-plugin-js" "~0.10.0" + "@polywrap/uri-resolver-extensions-js" "0.11.0" + base64-to-uint8array "1.0.0" + "@polywrap/tracing-js@0.10.0": version "0.10.0" resolved "https://registry.yarnpkg.com/@polywrap/tracing-js/-/tracing-js-0.10.0.tgz#31d7ca9cc73a1dbd877fc684000652aa2c22acdc" @@ -2444,16 +2494,17 @@ "@opentelemetry/sdk-trace-base" "1.6.0" "@opentelemetry/sdk-trace-web" "1.6.0" -"@polywrap/uri-resolver-extensions-js@0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@polywrap/uri-resolver-extensions-js/-/uri-resolver-extensions-js-0.10.0.tgz#ef0012e9b2231be44b0739f57b023a1c009c1b2b" - integrity sha512-mP8nLESuQFImhxeEV646m4qzJ1rc3d2LLgly9vPFUffXM7YMfJriL0nYNTzbyvZbhvH7PHfeEQ/m5DZFADMc7w== +"@polywrap/tracing-js@0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@polywrap/tracing-js/-/tracing-js-0.11.0.tgz#3ea7a09fef41b6f582d6dc5e75be00d6178fe259" + integrity sha512-vg1UZ2QMKHey3FiuBfNpc4MYHf7x1HS/kqL8jvlbpiii/r5t4M8sGRTE6czwflLV23fOCtZp7MULwfhHCJBo/g== dependencies: - "@polywrap/core-js" "0.10.0" - "@polywrap/result" "0.10.0" - "@polywrap/uri-resolvers-js" "0.10.0" - "@polywrap/wasm-js" "0.10.0" - "@polywrap/wrap-manifest-types-js" "0.10.0" + "@fetsorn/opentelemetry-console-exporter" "0.0.3" + "@opentelemetry/api" "1.2.0" + "@opentelemetry/exporter-trace-otlp-http" "0.32.0" + "@opentelemetry/resources" "1.6.0" + "@opentelemetry/sdk-trace-base" "1.6.0" + "@opentelemetry/sdk-trace-web" "1.6.0" "@polywrap/uri-resolver-extensions-js@0.10.1": version "0.10.1" @@ -2466,14 +2517,16 @@ "@polywrap/wasm-js" "0.10.1" "@polywrap/wrap-manifest-types-js" "0.10.1" -"@polywrap/uri-resolvers-js@0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@polywrap/uri-resolvers-js/-/uri-resolvers-js-0.10.0.tgz#d80163666a5110a4a7bd36be7e0961364af761ce" - integrity sha512-lZP+sN4lnp8xRklYWkrAJFECFNXDsBawGqVk7jUrbcw1CX8YODHyDEB0dSV8vN30DMP4h70W7V4QeNwPiE1EzQ== +"@polywrap/uri-resolver-extensions-js@0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@polywrap/uri-resolver-extensions-js/-/uri-resolver-extensions-js-0.11.0.tgz#ff2b04b733e9f1404d85e61575dc149590c856d3" + integrity sha512-iMYDuRJ3bxUrU1EPl8KSKG5YCc8xoeNEOW05uY2iPHo7Aa/5nUhP+v81YdHhBHsjZQgndCoFtvS8NzNUa+bx2w== dependencies: - "@polywrap/core-js" "0.10.0" - "@polywrap/result" "0.10.0" - "@polywrap/wrap-manifest-types-js" "0.10.0" + "@polywrap/core-js" "0.11.0" + "@polywrap/result" "0.11.0" + "@polywrap/uri-resolvers-js" "0.11.0" + "@polywrap/wasm-js" "0.11.0" + "@polywrap/wrap-manifest-types-js" "0.11.0" "@polywrap/uri-resolvers-js@0.10.1": version "0.10.1" @@ -2484,17 +2537,14 @@ "@polywrap/result" "0.10.1" "@polywrap/wrap-manifest-types-js" "0.10.1" -"@polywrap/wasm-js@0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@polywrap/wasm-js/-/wasm-js-0.10.0.tgz#6947b44669514cc0cb0653db8278f40631c45c7d" - integrity sha512-kI0Q9DQ/PlA0BTEj+Mye4fdt/aLh07l8YHjhbXQheuu46mcZuG9vfgnn78eug9c7wjGEECxlsK+B4hy/FPgYxQ== +"@polywrap/uri-resolvers-js@0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@polywrap/uri-resolvers-js/-/uri-resolvers-js-0.11.0.tgz#5ad22e8baddef48814756ff56bc7051bffe7e9d2" + integrity sha512-vNNur0TuzpcNGaTJRbqNnzOaexga4sCfAgUUkcvrl8dyozFbhcDqqt1Ok6v0vGHD8MXPpSHNk1JNzPP5xnE9FQ== dependencies: - "@polywrap/asyncify-js" "0.10.0" - "@polywrap/core-js" "0.10.0" - "@polywrap/msgpack-js" "0.10.0" - "@polywrap/result" "0.10.0" - "@polywrap/tracing-js" "0.10.0" - "@polywrap/wrap-manifest-types-js" "0.10.0" + "@polywrap/core-js" "0.11.0" + "@polywrap/result" "0.11.0" + "@polywrap/wrap-manifest-types-js" "0.11.0" "@polywrap/wasm-js@0.10.1": version "0.10.1" @@ -2508,6 +2558,31 @@ "@polywrap/tracing-js" "0.10.1" "@polywrap/wrap-manifest-types-js" "0.10.1" +"@polywrap/wasm-js@0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@polywrap/wasm-js/-/wasm-js-0.11.0.tgz#19846787b1135e85087a348d65c1814b838cfef2" + integrity sha512-mgr40pTQMd1fmeKa5DhrxXDxUoS5XlT0lPy74b/Ai/i2KEyLrNLKhvVtkw0U1C5jVbCFteWR43cxRhuvsb3xfQ== + dependencies: + "@polywrap/asyncify-js" "0.11.0" + "@polywrap/core-js" "0.11.0" + "@polywrap/msgpack-js" "0.11.0" + "@polywrap/result" "0.11.0" + "@polywrap/tracing-js" "0.11.0" + "@polywrap/wrap-manifest-types-js" "0.11.0" + +"@polywrap/web3-config-bundle-js@0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@polywrap/web3-config-bundle-js/-/web3-config-bundle-js-0.11.0.tgz#3c96fa76f6c2a00e3d3d8de7cf8e5975fb606593" + integrity sha512-A4Wo3ghkCv1jkXPvOaj8oYSHiJCS3EXA44aK0/8GvfX/SSF1tW2oZxxmzsK69G+Tm/9wYODhkAsgjD6Swe9vKw== + dependencies: + "@polywrap/config-bundle-types-js" "0.11.0" + "@polywrap/ethereum-provider-js" "npm:@polywrap/ethereum-provider-js@~0.3.1" + "@polywrap/ethereum-provider-js-v1" "npm:@polywrap/ethereum-provider-js@~0.2.4" + "@polywrap/sys-config-bundle-js" "0.11.0" + "@polywrap/uri-resolver-extensions-js" "0.11.0" + "@polywrap/wasm-js" "0.11.0" + base64-to-uint8array "1.0.0" + "@polywrap/wrap-manifest-types-js@0.10.0": version "0.10.0" resolved "https://registry.yarnpkg.com/@polywrap/wrap-manifest-types-js/-/wrap-manifest-types-js-0.10.0.tgz#f009a69d1591ee770dd13d67989d88f51e345d36" @@ -2536,6 +2611,15 @@ jsonschema "1.4.0" semver "7.5.0" +"@polywrap/wrap-manifest-types-js@0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@polywrap/wrap-manifest-types-js/-/wrap-manifest-types-js-0.11.0.tgz#b9b55312d83aab5988e60c4b8740c9d10d37fc13" + integrity sha512-0Oc6m+x1NSvsYop3wHfk9wgt+nATbglHN3m5sapAMRu6yZBNCIuMTlGyAK3/KLpKvCBDsCMo8+Gj5d8uBDApYA== + dependencies: + "@polywrap/msgpack-js" "0.11.0" + ajv "8.12.0" + semver "7.5.0" + "@sinclair/typebox@^0.24.1": version "0.24.51" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" @@ -3062,6 +3146,16 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" +ajv@8.12.0, ajv@^8.0.1: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -3072,16 +3166,6 @@ ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.1: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - ansi-colors@^4.1.1: version "4.1.3" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" From ce0190c65e6f3bfacce320954a65e0ad02067762 Mon Sep 17 00:00:00 2001 From: krisbitney Date: Mon, 3 Jul 2023 11:35:53 -0500 Subject: [PATCH 033/181] fixed cli test env client config and custom configs in test cases --- packages/cli/src/__tests__/e2e/helpers/testCliOutput.ts | 6 ++++++ packages/cli/src/lib/test-env/client-config.ts | 1 + .../cli/build-cmd/plugin/005-custom-config/config.ts | 6 +++--- .../wasm/assemblyscript/010-custom-config/config.ts | 6 +++--- .../wasm/assemblyscript/014-override-config/config.ts | 8 ++++---- .../cases/cli/codegen/app/004-custom-config/config.ts | 6 +++--- .../cases/cli/codegen/plugin/005-custom-config/config.ts | 6 +++--- .../cases/cli/codegen/wasm/005-custom-config/config.ts | 6 +++--- .../test-cases/cases/cli/test/008-custom-config/config.ts | 6 +++--- 9 files changed, 29 insertions(+), 22 deletions(-) diff --git a/packages/cli/src/__tests__/e2e/helpers/testCliOutput.ts b/packages/cli/src/__tests__/e2e/helpers/testCliOutput.ts index 72b72310ed..c6af8a2a94 100644 --- a/packages/cli/src/__tests__/e2e/helpers/testCliOutput.ts +++ b/packages/cli/src/__tests__/e2e/helpers/testCliOutput.ts @@ -19,6 +19,12 @@ export const testCliOutput = ( ) ); + if (expected.exitCode && exitCode !== expected.exitCode) { + console.error(error) + } else if (exitCode !== 0) { + console.error(error) + } + if (expected.stdout) { if (Array.isArray(expected.stdout)) { for (const line of expected.stdout) { diff --git a/packages/cli/src/lib/test-env/client-config.ts b/packages/cli/src/lib/test-env/client-config.ts index 42a1a01768..0baa9661c2 100644 --- a/packages/cli/src/lib/test-env/client-config.ts +++ b/packages/cli/src/lib/test-env/client-config.ts @@ -25,6 +25,7 @@ export function getTestEnvClientConfig(): Partial { const ensAddress = ETH_ENS_IPFS_MODULE_CONSTANTS.ensAddresses.ensAddress; const builder = new PolywrapClientConfigBuilder() + .addDefaults() .addEnvs({ [Web3.bundle.ipfsResolver.uri]: { provider: ipfsProvider, diff --git a/packages/test-cases/cases/cli/build-cmd/plugin/005-custom-config/config.ts b/packages/test-cases/cases/cli/build-cmd/plugin/005-custom-config/config.ts index 97850e3b0d..215a5f860b 100644 --- a/packages/test-cases/cases/cli/build-cmd/plugin/005-custom-config/config.ts +++ b/packages/test-cases/cases/cli/build-cmd/plugin/005-custom-config/config.ts @@ -1,4 +1,4 @@ -import { IClientConfigBuilder } from "@polywrap/client-config-builder-js"; +import { ClientConfigBuilder } 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,6 +37,6 @@ const mockPlugin = () => { }); }; -export function configure(builder: IClientConfigBuilder): IClientConfigBuilder { - return builder.addPackage("wrap://ens/mock.eth", mockPlugin()); +export function configure(builder: ClientConfigBuilder): ClientConfigBuilder { + return builder.setPackage("wrap://ens/mock.eth", mockPlugin()); } diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/assemblyscript/010-custom-config/config.ts b/packages/test-cases/cases/cli/build-cmd/wasm/assemblyscript/010-custom-config/config.ts index 78d89bef30..8c503db0c6 100644 --- a/packages/test-cases/cases/cli/build-cmd/wasm/assemblyscript/010-custom-config/config.ts +++ b/packages/test-cases/cases/cli/build-cmd/wasm/assemblyscript/010-custom-config/config.ts @@ -1,4 +1,4 @@ -import { IClientConfigBuilder } from "@polywrap/client-config-builder-js"; +import { ClientConfigBuilder } from "@polywrap/client-config-builder-js"; import { PluginModule, PluginPackage } from "@polywrap/plugin-js"; import { latestWrapManifestVersion } from "@polywrap/wrap-manifest-types-js"; @@ -119,6 +119,6 @@ const mockPlugin = () => { ); }; -export function configure(builder: IClientConfigBuilder): IClientConfigBuilder { - return builder.addPackage("wrap://ens/mock.eth", mockPlugin()); +export function configure(builder: ClientConfigBuilder): ClientConfigBuilder { + return builder.setPackage("wrap://ens/mock.eth", mockPlugin()); } diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/assemblyscript/014-override-config/config.ts b/packages/test-cases/cases/cli/build-cmd/wasm/assemblyscript/014-override-config/config.ts index c6cac57534..b3bb8df976 100644 --- a/packages/test-cases/cases/cli/build-cmd/wasm/assemblyscript/014-override-config/config.ts +++ b/packages/test-cases/cases/cli/build-cmd/wasm/assemblyscript/014-override-config/config.ts @@ -1,6 +1,6 @@ import { - IClientConfigBuilder, ClientConfigBuilder, + PolywrapClientConfigBuilder, } from "@polywrap/client-js"; import { PluginModule, PluginPackage } from "@polywrap/plugin-js"; import { latestWrapManifestVersion } from "@polywrap/wrap-manifest-types-js"; @@ -122,8 +122,8 @@ const mockPlugin = () => { ); }; -export function configure(_: IClientConfigBuilder): IClientConfigBuilder { - return new ClientConfigBuilder() +export function configure(_: ClientConfigBuilder): ClientConfigBuilder { + return new PolywrapClientConfigBuilder() .addDefaults() - .addPackage("wrap://ens/mock.eth", mockPlugin()); + .setPackage("wrap://ens/mock.eth", mockPlugin()); } diff --git a/packages/test-cases/cases/cli/codegen/app/004-custom-config/config.ts b/packages/test-cases/cases/cli/codegen/app/004-custom-config/config.ts index e1a1c1fb38..4fb529f0fe 100644 --- a/packages/test-cases/cases/cli/codegen/app/004-custom-config/config.ts +++ b/packages/test-cases/cases/cli/codegen/app/004-custom-config/config.ts @@ -1,4 +1,4 @@ -import { IClientConfigBuilder } from "@polywrap/client-config-builder-js"; +import { ClientConfigBuilder } from "@polywrap/client-config-builder-js"; import { PluginModule, PluginPackage } from "@polywrap/plugin-js"; import { latestWrapManifestVersion, @@ -28,8 +28,8 @@ const mockPlugin = () => { return PluginPackage.from(new MockPlugin({ val: 0 }), mockPluginManifest); }; -export function configure(builder: IClientConfigBuilder): IClientConfigBuilder { - return builder.addPackage("wrap://ens/mock.eth", mockPlugin()); +export function configure(builder: ClientConfigBuilder): ClientConfigBuilder { + return builder.setPackage("wrap://ens/mock.eth", mockPlugin()); } export const mockPluginManifest: WrapManifest = { diff --git a/packages/test-cases/cases/cli/codegen/plugin/005-custom-config/config.ts b/packages/test-cases/cases/cli/codegen/plugin/005-custom-config/config.ts index 97850e3b0d..215a5f860b 100644 --- a/packages/test-cases/cases/cli/codegen/plugin/005-custom-config/config.ts +++ b/packages/test-cases/cases/cli/codegen/plugin/005-custom-config/config.ts @@ -1,4 +1,4 @@ -import { IClientConfigBuilder } from "@polywrap/client-config-builder-js"; +import { ClientConfigBuilder } 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,6 +37,6 @@ const mockPlugin = () => { }); }; -export function configure(builder: IClientConfigBuilder): IClientConfigBuilder { - return builder.addPackage("wrap://ens/mock.eth", mockPlugin()); +export function configure(builder: ClientConfigBuilder): ClientConfigBuilder { + return builder.setPackage("wrap://ens/mock.eth", mockPlugin()); } diff --git a/packages/test-cases/cases/cli/codegen/wasm/005-custom-config/config.ts b/packages/test-cases/cases/cli/codegen/wasm/005-custom-config/config.ts index 3dd8b8bacc..bb9f2ee52e 100644 --- a/packages/test-cases/cases/cli/codegen/wasm/005-custom-config/config.ts +++ b/packages/test-cases/cases/cli/codegen/wasm/005-custom-config/config.ts @@ -1,4 +1,4 @@ -import { IClientConfigBuilder } from "@polywrap/client-config-builder-js"; +import { ClientConfigBuilder } from "@polywrap/client-config-builder-js"; import { IWrapPackage } from "@polywrap/core-js"; import { PluginModule, PluginPackage } from "@polywrap/plugin-js"; import { @@ -34,8 +34,8 @@ const mockPlugin = (): IWrapPackage => { }); }; -export function configure(builder: IClientConfigBuilder): IClientConfigBuilder { - return builder.addPackage("wrap://ens/mock.eth", mockPlugin()); +export function configure(builder: ClientConfigBuilder): ClientConfigBuilder { + return builder.setPackage("wrap://ens/mock.eth", mockPlugin()); } const abi: WrapAbi = { 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 1d12fce783..f938e60c8d 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,11 +1,11 @@ -import { IClientConfigBuilder } from "@polywrap/client-config-builder-js"; +import { ClientConfigBuilder } from "@polywrap/client-config-builder-js"; import path from "path"; -export function configure(builder: IClientConfigBuilder): IClientConfigBuilder { +export function configure(builder: ClientConfigBuilder): ClientConfigBuilder { const wrapperPath = path.join(__dirname, "..", "run-test-wrapper"); const wrapperUri = `fs/${path.resolve(wrapperPath)}/build`; return builder - .addRedirect("wrap://ens/test.eth", wrapperUri) + .setRedirect("wrap://ens/test.eth", wrapperUri) .addEnv( wrapperUri, { From 5bd3b147c06176d9c5f7dca7e827173151835987 Mon Sep 17 00:00:00 2001 From: krisbitney Date: Mon, 3 Jul 2023 12:22:36 -0500 Subject: [PATCH 034/181] removed extraneous return char in python plugin test case --- .../cases/cli/codegen/plugin/008-python/expected/wrap/module.py | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/test-cases/cases/cli/codegen/plugin/008-python/expected/wrap/module.py b/packages/test-cases/cases/cli/codegen/plugin/008-python/expected/wrap/module.py index 6ca1f63a5c..66d15b7acc 100644 --- a/packages/test-cases/cases/cli/codegen/plugin/008-python/expected/wrap/module.py +++ b/packages/test-cases/cases/cli/codegen/plugin/008-python/expected/wrap/module.py @@ -34,4 +34,3 @@ def sample_method( env: None ) -> str: pass - From 096d67be4878041e20b392b23a23e8639187f3e3 Mon Sep 17 00:00:00 2001 From: krisbitney Date: Mon, 3 Jul 2023 12:25:15 -0500 Subject: [PATCH 035/181] fixed missed custom config test case --- .../cases/cli/codegen/wasm/007-override-config/config.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/test-cases/cases/cli/codegen/wasm/007-override-config/config.ts b/packages/test-cases/cases/cli/codegen/wasm/007-override-config/config.ts index 8aabb19cdd..9e67a9fd70 100644 --- a/packages/test-cases/cases/cli/codegen/wasm/007-override-config/config.ts +++ b/packages/test-cases/cases/cli/codegen/wasm/007-override-config/config.ts @@ -1,6 +1,6 @@ import { - IClientConfigBuilder, ClientConfigBuilder, + PolywrapClientConfigBuilder, } from "@polywrap/client-js"; import { PluginModule, PluginPackage } from "@polywrap/plugin-js"; import { latestWrapManifestVersion } from "@polywrap/schema-parse"; @@ -122,8 +122,8 @@ const mockPlugin = () => { ); }; -export function configure(_: IClientConfigBuilder): IClientConfigBuilder { - return new ClientConfigBuilder() +export function configure(_: ClientConfigBuilder): ClientConfigBuilder { + return new PolywrapClientConfigBuilder() .addDefaults() - .addPackage("wrap://ens/mock.eth", mockPlugin()); + .setPackage("wrap://ens/mock.eth", mockPlugin()); } From 0bc90cd2748ea9de12178293459712597676a41f Mon Sep 17 00:00:00 2001 From: krisbitney Date: Mon, 3 Jul 2023 17:04:54 -0500 Subject: [PATCH 036/181] fixed docgen custom config test case and overwrote ethereum module test case output --- .../cases/cli/docgen/002-custom-config/config.ts | 6 +++--- .../docgen/004-app/expected/docs/Ethereum_module.md | 13 +++++++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) 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 e1a1c1fb38..4fb529f0fe 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 { IClientConfigBuilder } from "@polywrap/client-config-builder-js"; +import { ClientConfigBuilder } from "@polywrap/client-config-builder-js"; import { PluginModule, PluginPackage } from "@polywrap/plugin-js"; import { latestWrapManifestVersion, @@ -28,8 +28,8 @@ const mockPlugin = () => { return PluginPackage.from(new MockPlugin({ val: 0 }), mockPluginManifest); }; -export function configure(builder: IClientConfigBuilder): IClientConfigBuilder { - return builder.addPackage("wrap://ens/mock.eth", mockPlugin()); +export function configure(builder: ClientConfigBuilder): ClientConfigBuilder { + return builder.setPackage("wrap://ens/mock.eth", mockPlugin()); } export const mockPluginManifest: WrapManifest = { diff --git a/packages/test-cases/cases/cli/docgen/004-app/expected/docs/Ethereum_module.md b/packages/test-cases/cases/cli/docgen/004-app/expected/docs/Ethereum_module.md index 30ec3c9c04..577d8eaeaf 100644 --- a/packages/test-cases/cases/cli/docgen/004-app/expected/docs/Ethereum_module.md +++ b/packages/test-cases/cases/cli/docgen/004-app/expected/docs/Ethereum_module.md @@ -9,6 +9,8 @@ sidebar_position: 1 ```graphql awaitTransaction( txHash: String! + confirmations: UInt32! + timeout: UInt32 connection: Ethereum_Connection ): Ethereum_TxReceipt! ``` @@ -238,6 +240,17 @@ signMessageBytes( ): String! ``` +### signTransaction + +_Sign a transaction and return the signature. Requires wallet signer (i.e. signer with private key)_ + +```graphql +signTransaction( + tx: Ethereum_TxRequest! + connection: Ethereum_Connection +): String! +``` + ### toEth ```graphql From ad23081cac583ffaf7a623390d2fd481ae906bb1 Mon Sep 17 00:00:00 2001 From: krisbitney Date: Tue, 4 Jul 2023 09:16:44 -0500 Subject: [PATCH 037/181] fixed docgen 004-app test case output --- .../docgen/004-app/expected/docs/Ethereum_module.md | 13 ------------- .../docgen/004-app/expected/docs/Logger_enums.md | 4 ++-- .../docgen/004-app/expected/docs/Logger_module.md | 2 +- 3 files changed, 3 insertions(+), 16 deletions(-) diff --git a/packages/test-cases/cases/cli/docgen/004-app/expected/docs/Ethereum_module.md b/packages/test-cases/cases/cli/docgen/004-app/expected/docs/Ethereum_module.md index 577d8eaeaf..30ec3c9c04 100644 --- a/packages/test-cases/cases/cli/docgen/004-app/expected/docs/Ethereum_module.md +++ b/packages/test-cases/cases/cli/docgen/004-app/expected/docs/Ethereum_module.md @@ -9,8 +9,6 @@ sidebar_position: 1 ```graphql awaitTransaction( txHash: String! - confirmations: UInt32! - timeout: UInt32 connection: Ethereum_Connection ): Ethereum_TxReceipt! ``` @@ -240,17 +238,6 @@ signMessageBytes( ): String! ``` -### signTransaction - -_Sign a transaction and return the signature. Requires wallet signer (i.e. signer with private key)_ - -```graphql -signTransaction( - tx: Ethereum_TxRequest! - connection: Ethereum_Connection -): String! -``` - ### toEth ```graphql diff --git a/packages/test-cases/cases/cli/docgen/004-app/expected/docs/Logger_enums.md b/packages/test-cases/cases/cli/docgen/004-app/expected/docs/Logger_enums.md index c4cac40698..def66581fe 100644 --- a/packages/test-cases/cases/cli/docgen/004-app/expected/docs/Logger_enums.md +++ b/packages/test-cases/cases/cli/docgen/004-app/expected/docs/Logger_enums.md @@ -5,10 +5,10 @@ sidebar_position: 3 --- -### Logger_Logger_LogLevel +### Logger_LogLevel ```graphql -enum Logger_Logger_LogLevel { +enum Logger_LogLevel { DEBUG INFO WARN diff --git a/packages/test-cases/cases/cli/docgen/004-app/expected/docs/Logger_module.md b/packages/test-cases/cases/cli/docgen/004-app/expected/docs/Logger_module.md index c483edc248..484aa7390f 100644 --- a/packages/test-cases/cases/cli/docgen/004-app/expected/docs/Logger_module.md +++ b/packages/test-cases/cases/cli/docgen/004-app/expected/docs/Logger_module.md @@ -8,7 +8,7 @@ sidebar_position: 1 ```graphql log( - level: Logger_Logger_LogLevel! + level: Logger_LogLevel! message: String! ): Boolean! ``` From 7f52987cfdfb2611e5b7667fa37588fcff4db902 Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Wed, 5 Jul 2023 12:02:06 +0800 Subject: [PATCH 038/181] fix: issues --- packages/test-cases/yarn.lock | 338 ---------------------------------- yarn.lock | 173 +++++++---------- 2 files changed, 70 insertions(+), 441 deletions(-) delete mode 100644 packages/test-cases/yarn.lock diff --git a/packages/test-cases/yarn.lock b/packages/test-cases/yarn.lock deleted file mode 100644 index 3a95d739de..0000000000 --- a/packages/test-cases/yarn.lock +++ /dev/null @@ -1,338 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@jridgewell/resolve-uri@^3.0.3": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@polywrap/os-js@0.10.5": - version "0.10.5" - resolved "https://registry.yarnpkg.com/@polywrap/os-js/-/os-js-0.10.5.tgz#b9ecae978f69edc341aedec1867161d1e609eb3a" - integrity sha512-Xh7KqCQy2aEoHDGQE5eV2ykCDjhCRzUVryiF+P/HbfxG//bW6Wte4e97H4tcuD8RkApYVaGjmUTAlvX+g+26AQ== - -"@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" - integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== - -"@types/adm-zip@0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@types/adm-zip/-/adm-zip-0.5.0.tgz#94c90a837ce02e256c7c665a6a1eb295906333c1" - integrity sha512-FCJBJq9ODsQZUNURo5ILAQueuA8WJhRvuihS3ke2iI25mJlfV2LK8jG2Qj2z2AWg8U0FtWWqBHVRetceLskSaw== - dependencies: - "@types/node" "*" - -"@types/glob@*": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-8.1.0.tgz#b63e70155391b0584dce44e7ea25190bbc38f2fc" - integrity sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w== - dependencies: - "@types/minimatch" "^5.1.2" - "@types/node" "*" - -"@types/minimatch@^5.1.2": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" - integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== - -"@types/node@*": - version "20.3.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.2.tgz#fa6a90f2600e052a03c18b8cb3fd83dd4e599898" - integrity sha512-vOBLVQeCQfIcF/2Y7eKFTqrMnizK5lRNQ7ykML/5RuwVXVWxYkgwS7xbt4B6fKCUPgbSL5FSsjHQpaGQP/dQmw== - -"@types/shelljs@0.8.9": - version "0.8.9" - resolved "https://registry.yarnpkg.com/@types/shelljs/-/shelljs-0.8.9.tgz#45dd8501aa9882976ca3610517dac3831c2fbbf4" - integrity sha512-flVe1dvlrCyQJN/SGrnBxqHG+RzXrVKsmjD8WS/qYHpq5UPjfq7UWFBENP0ZuOl0g6OpAlL6iBoLSvKYUUmyQw== - dependencies: - "@types/glob" "*" - "@types/node" "*" - -acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^8.4.1: - version "8.9.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.9.0.tgz#78a16e3b2bcc198c10822786fa6679e245db5b59" - integrity sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ== - -adm-zip@0.5.10: - version "0.5.10" - resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.5.10.tgz#4a51d5ab544b1f5ce51e1b9043139b639afff45b" - integrity sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ== - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -axios@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.2.2.tgz#72681724c6e6a43a9fea860fc558127dbe32f9f1" - integrity sha512-bz/J4gS2S3I7mpN/YZfGFTqhXTYzRho8Ay38w2otuuDR322KzFIWm/4W2K6gIwvWaws5n+mnb7D1lN9uD+QH6Q== - dependencies: - follow-redirects "^1.15.0" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -follow-redirects@^1.15.0: - version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== - -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -glob@^7.0.0: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - -is-core-module@^2.11.0: - version "2.12.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" - integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== - dependencies: - has "^1.0.3" - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== - dependencies: - resolve "^1.1.6" - -resolve@^1.1.6: - version "1.22.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== - dependencies: - is-core-module "^2.11.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -shelljs@0.8.5: - version "0.8.5" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" - integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -ts-node@10.9.1: - version "10.9.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== diff --git a/yarn.lock b/yarn.lock index 8c54b48b48..6f02a84c0c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -113,31 +113,31 @@ dependencies: "@babel/highlight" "^7.22.5" -"@babel/compat-data@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.5.tgz#b1f6c86a02d85d2dd3368a2b67c09add8cd0c255" - integrity sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA== +"@babel/compat-data@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.6.tgz#15606a20341de59ba02cd2fcc5086fcbe73bf544" + integrity sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg== "@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.5.tgz#d67d9747ecf26ee7ecd3ebae1ee22225fe902a89" - integrity sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg== + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.6.tgz#aafafbe86e9a1679d876b99dc46382964ef72494" + integrity sha512-HPIyDa6n+HKw5dEuway3vVAhBboYCtREBMp+IWeseZy6TFtzn6MHkCH2KKYUOC/vKKwgSMHQW4htBOrmuRPXfw== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.22.5" "@babel/generator" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.6" "@babel/helper-module-transforms" "^7.22.5" - "@babel/helpers" "^7.22.5" - "@babel/parser" "^7.22.5" + "@babel/helpers" "^7.22.6" + "@babel/parser" "^7.22.6" "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.5" + "@babel/traverse" "^7.22.6" "@babel/types" "^7.22.5" + "@nicolo-ribaudo/semver-v6" "^6.3.3" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.2" - semver "^6.3.0" "@babel/generator@^7.22.5": version "7.22.5" @@ -149,16 +149,16 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/helper-compilation-targets@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz#fc7319fc54c5e2fa14b2909cf3c5fd3046813e02" - integrity sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw== +"@babel/helper-compilation-targets@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz#e30d61abe9480aa5a83232eb31c111be922d2e52" + integrity sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA== dependencies: - "@babel/compat-data" "^7.22.5" + "@babel/compat-data" "^7.22.6" "@babel/helper-validator-option" "^7.22.5" - browserslist "^4.21.3" + "@nicolo-ribaudo/semver-v6" "^6.3.3" + browserslist "^4.21.9" lru-cache "^5.1.1" - semver "^6.3.0" "@babel/helper-environment-visitor@^7.22.5": version "7.22.5" @@ -213,10 +213,10 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-split-export-declaration@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz#88cf11050edb95ed08d596f7a044462189127a08" - integrity sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ== +"@babel/helper-split-export-declaration@^7.22.5", "@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== dependencies: "@babel/types" "^7.22.5" @@ -235,13 +235,13 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== -"@babel/helpers@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.5.tgz#74bb4373eb390d1ceed74a15ef97767e63120820" - integrity sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q== +"@babel/helpers@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.6.tgz#8e61d3395a4f0c5a8060f309fb008200969b5ecd" + integrity sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA== dependencies: "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.5" + "@babel/traverse" "^7.22.6" "@babel/types" "^7.22.5" "@babel/highlight@^7.22.5": @@ -253,10 +253,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.5.tgz#721fd042f3ce1896238cf1b341c77eb7dee7dbea" - integrity sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.5", "@babel/parser@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.6.tgz#201f8b47be20c76c7c5743b9c16129760bf9a975" + integrity sha512-EIQu22vNkceq3LbjAq7knDf/UmtI2qbcNI8GRBlijez6TpQLvSodJPYfydQmNA5buwkxxxa/PVI44jjYZ+/cLw== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -351,18 +351,18 @@ "@babel/parser" "^7.22.5" "@babel/types" "^7.22.5" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.5.tgz#44bd276690db6f4940fdb84e1cb4abd2f729ccd1" - integrity sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.22.5", "@babel/traverse@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.6.tgz#8f2f83a5c588251584914debeee38f35f661a300" + integrity sha512-53CijMvKlLIDlOTrdWiHileRddlIiwUIyCKqYa7lYnnPldXCG5dUSN38uT0cA6i7rHWNKJLH0VU/Kxdr1GzB3w== dependencies: "@babel/code-frame" "^7.22.5" "@babel/generator" "^7.22.5" "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-function-name" "^7.22.5" "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.5" - "@babel/parser" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.22.6" "@babel/types" "^7.22.5" debug "^4.1.0" globals "^11.1.0" @@ -1863,6 +1863,11 @@ resolved "https://registry.yarnpkg.com/@multiformats/base-x/-/base-x-4.0.1.tgz#95ff0fa58711789d53aefb2590a8b7a4e715d121" integrity sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw== +"@nicolo-ribaudo/semver-v6@^6.3.3": + version "6.3.3" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz#ea6d23ade78a325f7a52750aab1526b02b628c29" + integrity sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -2765,14 +2770,14 @@ integrity sha512-wH6Tu9mbiOt0n5EvdoWy0VGQaJMHfLIxY/6wS0xLC7CV1taM6gESEzcYy0ZlWvxxiiljYvfDIvz4hHbUUDRlhw== "@types/node@*": - version "20.3.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.2.tgz#fa6a90f2600e052a03c18b8cb3fd83dd4e599898" - integrity sha512-vOBLVQeCQfIcF/2Y7eKFTqrMnizK5lRNQ7ykML/5RuwVXVWxYkgwS7xbt4B6fKCUPgbSL5FSsjHQpaGQP/dQmw== + version "20.3.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.3.tgz#329842940042d2b280897150e023e604d11657d6" + integrity sha512-wheIYdr4NYML61AjC8MKj/2jrR/kDQri/CIpVoZwldwhnIrD/j9jIU5bJ8yBKuB2VhpFV7Ab6G2XkBjv9r9Zzw== "@types/node@^18.14.6": - version "18.16.18" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.18.tgz#85da09bafb66d4bc14f7c899185336d0c1736390" - integrity sha512-/aNaQZD0+iSBAGnvvN2Cx92HqE5sZCPZtx2TsK+4nvV23fFe09jVDvpArXr2j9DnYlzuU9WuoykDDc6wqvpNcw== + version "18.16.19" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.19.tgz#cb03fca8910fdeb7595b755126a8a78144714eea" + integrity sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -3603,7 +3608,7 @@ browser-readablestream-to-it@^1.0.1, browser-readablestream-to-it@^1.0.3: resolved "https://registry.yarnpkg.com/browser-readablestream-to-it/-/browser-readablestream-to-it-1.0.3.tgz#ac3e406c7ee6cdf0a502dd55db33bab97f7fba76" integrity sha512-+12sHB+Br8HIh6VAMVEG5r3UXCyESIgDW7kzk3BjIXa43DVqVwL7GC5TW3jeh+72dtcH99pPVpw0X8i0jt+/kw== -browserslist@^4.21.3: +browserslist@^4.21.9: version "4.21.9" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== @@ -3750,9 +3755,9 @@ camelcase@^6.0.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001503: - version "1.0.30001509" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001509.tgz#2b7ad5265392d6d2de25cd8776d1ab3899570d14" - integrity sha512-2uDDk+TRiTX5hMcUYT/7CSyzMZxjfGu0vAUjS2g0LSD8UoXOv0LtpH4LxGMemsiPq6LCVIUjNwVM0erkOkGCDA== + version "1.0.30001512" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001512.tgz#7450843fb581c39f290305a83523c7a9ef0d4cb4" + integrity sha512-2S9nK0G/mE+jasCUsMPlARhRCts1ebcp2Ji8Y8PWi4NDE1iRdLCnEPHkEfeBrGC45L4isBx5ur3IQ6yTE2mRZw== capture-exit@^2.0.0: version "2.0.0" @@ -4345,7 +4350,7 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== -deep-is@^0.1.3, deep-is@~0.1.3: +deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== @@ -4558,9 +4563,9 @@ electron-fetch@^1.7.2: encoding "^0.1.13" electron-to-chromium@^1.4.431: - version "1.4.445" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.445.tgz#058d2c5f3a2981ab1a37440f5a5e42d15672aa6d" - integrity sha512-++DB+9VK8SBJwC+X1zlMfJ1tMA3F0ipi39GdEp+x3cV2TyBihqAgad8cNMWtLDEkbH39nlDQP7PfGrDr3Dr7HA== + version "1.4.450" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.450.tgz#df232c961ee9bf4e8980f86e96a6e9f291720138" + integrity sha512-BLG5HxSELlrMx7dJ2s+8SFlsCtJp37Zpk2VAxyC6CZtbc+9AJeZHfYHbrlSgdXp6saQ8StMqOTEDaBKgA7u1sw== elliptic@6.5.4: version "6.5.4" @@ -4760,14 +4765,13 @@ escape-string-regexp@^2.0.0: integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== dependencies: esprima "^4.0.1" estraverse "^5.2.0" esutils "^2.0.2" - optionator "^0.8.1" optionalDependencies: source-map "~0.6.1" @@ -5169,9 +5173,9 @@ fast-fifo@^1.0.0: integrity sha512-IgfweLvEpwyA4WgiQe9Nx6VV2QkML2NkvZnk1oKnIzXgXdWxuhF7zw4DvLTPZJn6PIUneiAXPF24QmoEqHTjyw== fast-glob@^3.2.5, fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + version "3.3.0" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.0.tgz#7c40cb491e1e2ed5664749e87bfb516dbe8727c0" + integrity sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -5184,7 +5188,7 @@ fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== @@ -7314,14 +7318,6 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - libnpmaccess@^4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-4.0.3.tgz#dfb0e5b0a53c315a2610d300e46b4ddeb66e7eec" @@ -8100,9 +8096,9 @@ nice-try@^1.0.4: integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.7: - version "2.6.11" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.11.tgz#cde7fc71deef3131ef80a738919f999e6edfff25" - integrity sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w== + version "2.6.12" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.12.tgz#02eb8e22074018e3d5a83016649d04df0e348fba" + integrity sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g== dependencies: whatwg-url "^5.0.0" @@ -8339,9 +8335,9 @@ number-is-nan@^1.0.0: integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== nwsapi@^2.2.0: - version "2.2.5" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.5.tgz#a52744c61b3889dd44b0a158687add39b8d935e2" - integrity sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ== + version "2.2.6" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.6.tgz#f876bd7ae9509cac72c640826355abf63d3c326a" + integrity sha512-vSZ4miHQ4FojLjmz2+ux4B0/XA16jfwt/LBzIUftDpRd8tujHFkXjMyLwjS08fIZCzesj2z7gJukOKJwqebJAQ== oauth-sign@~0.9.0: version "0.9.0" @@ -8430,18 +8426,6 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - optionator@^0.9.1: version "0.9.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" @@ -8799,11 +8783,6 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - prettier-linter-helpers@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" @@ -10310,13 +10289,6 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" - type-detect@4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" @@ -10785,11 +10757,6 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2 || 3 || 4" -word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" From beadf2973ebb507c87efe09b802282674faa6052 Mon Sep 17 00:00:00 2001 From: krisbitney Date: Wed, 5 Jul 2023 11:39:13 -0500 Subject: [PATCH 039/181] using ethereum provider v2 in cli --- packages/cli/package.json | 2 +- packages/cli/src/__tests__/unit/jobrunner.spec.ts | 8 ++++---- .../ens-recursive-name-register/index.ts | 10 +++++----- .../cli/src/lib/defaults/deploy-modules/ens/index.ts | 10 +++++----- packages/cli/src/lib/test-env/client-config.ts | 4 ++-- yarn.lock | 2 +- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 7ad36f1670..708325690a 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -50,7 +50,7 @@ "@polywrap/client-config-builder-js": "0.11.0", "@polywrap/client-js": "0.11.0", "@polywrap/core-js": "0.11.0", - "@polywrap/ethereum-provider-js-v1": "npm:@polywrap/ethereum-provider-js@~0.2.4", + "@polywrap/ethereum-provider-js": "0.3.1", "@polywrap/logging-js": "0.10.6", "@polywrap/os-js": "0.10.6", "@polywrap/polywrap-manifest-types-js": "0.10.6", diff --git a/packages/cli/src/__tests__/unit/jobrunner.spec.ts b/packages/cli/src/__tests__/unit/jobrunner.spec.ts index fb141f3ab1..5cacf302ab 100644 --- a/packages/cli/src/__tests__/unit/jobrunner.spec.ts +++ b/packages/cli/src/__tests__/unit/jobrunner.spec.ts @@ -1,16 +1,16 @@ import path from "path"; import { GetPathToTestWrappers } from "@polywrap/test-cases"; -import { ClientConfigBuilder, IClientConfigBuilder } from "@polywrap/client-config-builder-js"; +import { ClientConfigBuilder, PolywrapClientConfigBuilder } from "@polywrap/client-config-builder-js"; import { testCases } from "./jobrunner-test-cases"; import { JobRunner } from "../../lib"; jest.setTimeout(200000); describe("workflow JobRunner", () => { - let configBuilder: IClientConfigBuilder; + let configBuilder: ClientConfigBuilder; beforeAll(async () => { - configBuilder = new ClientConfigBuilder(); + configBuilder = new PolywrapClientConfigBuilder(); const subinvokeUri = `fs/${path.join( GetPathToTestWrappers(), "subinvoke", @@ -27,7 +27,7 @@ describe("workflow JobRunner", () => { "rs" )}` - configBuilder.addRedirect("ens/imported-invoke.eth", invokeUri).addRedirect("ens/imported-subinvoke.eth", subinvokeUri); + configBuilder.setRedirect("ens/imported-invoke.eth", invokeUri).setRedirect("ens/imported-subinvoke.eth", subinvokeUri); configBuilder.addDefaults(); }); diff --git a/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/index.ts b/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/index.ts index 523912cbf1..55107399fe 100644 --- a/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/index.ts +++ b/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/index.ts @@ -15,7 +15,7 @@ import { Connection, Connections, ethereumProviderPlugin, -} from "@polywrap/ethereum-provider-js-v1"; +} from "@polywrap/ethereum-provider-js"; class ENSRecursiveNameRegisterPublisher implements DeployModule { async execute( @@ -66,7 +66,7 @@ class ENSRecursiveNameRegisterPublisher implements DeployModule { const clientConfig = new PolywrapClientConfigBuilder() .addDefaults() .setPackage( - Web3.bundle.ethereumProviderV1.uri, + Web3.bundle.ethereumProviderV2.uri, ethereumProviderPlugin({ connections: connections, }) as IWrapPackage @@ -77,7 +77,7 @@ class ENSRecursiveNameRegisterPublisher implements DeployModule { const signerAddress = await client.invoke({ method: "getSignerAddress", - uri: "ens/wraps.eth:ethereum@1.0.0", + uri: "ens/wraps.eth:ethereum@2.0.0", args: { connection: { networkNameOrChainId: network, @@ -93,7 +93,7 @@ class ENSRecursiveNameRegisterPublisher implements DeployModule { { tx: { hash: string }; didRegister: boolean }[] >({ method: "registerDomainAndSubdomainsRecursively", - uri: "ens/wraps.eth:ens@1.0.0", + uri: "ens/wraps.eth:ens@1.1.0", args: { domain: ensDomain, owner: signerAddress.value, @@ -120,7 +120,7 @@ class ENSRecursiveNameRegisterPublisher implements DeployModule { client, { method: "awaitTransaction", - uri: Uri.from("ens/wraps.eth:ethereum@1.0.0"), + uri: Uri.from("ens/wraps.eth:ethereum@2.0.0"), args: { txHash: registerData.value[0].tx.hash, connection: { diff --git a/packages/cli/src/lib/defaults/deploy-modules/ens/index.ts b/packages/cli/src/lib/defaults/deploy-modules/ens/index.ts index b7ad57b527..d7831aef04 100644 --- a/packages/cli/src/lib/defaults/deploy-modules/ens/index.ts +++ b/packages/cli/src/lib/defaults/deploy-modules/ens/index.ts @@ -15,7 +15,7 @@ import { Connection, Connections, ethereumProviderPlugin, -} from "@polywrap/ethereum-provider-js-v1"; +} from "@polywrap/ethereum-provider-js"; const contentHash = require("content-hash"); @@ -63,7 +63,7 @@ class ENSPublisher implements DeployModule { const clientConfig = new PolywrapClientConfigBuilder() .addDefaults() .setPackage( - Web3.bundle.ethereumProviderV1.uri, + Web3.bundle.ethereumProviderV2.uri, ethereumProviderPlugin({ connections: connections, }) as IWrapPackage @@ -74,7 +74,7 @@ class ENSPublisher implements DeployModule { const resolver = await client.invoke({ method: "getResolver", - uri: "ens/wraps.eth:ens@1.0.0", + uri: "ens/wraps.eth:ens@1.1.0", args: { registryAddress: config.ensRegistryAddress, domain: config.domainName, @@ -98,7 +98,7 @@ class ENSPublisher implements DeployModule { const setContenthashData = await client.invoke<{ hash: string }>({ method: "setContentHash", - uri: "ens/wraps.eth:ens@1.0.0", + uri: "ens/wraps.eth:ens@1.1.0", args: { domain: config.domainName, cid: hash, @@ -119,7 +119,7 @@ class ENSPublisher implements DeployModule { client, { method: "awaitTransaction", - uri: Uri.from("ens/wraps.eth:ethereum@1.0.0"), + uri: Uri.from("ens/wraps.eth:ethereum@2.0.0"), args: { txHash: setContenthashData.value.hash, connection: { diff --git a/packages/cli/src/lib/test-env/client-config.ts b/packages/cli/src/lib/test-env/client-config.ts index 0baa9661c2..ff7f064aa0 100644 --- a/packages/cli/src/lib/test-env/client-config.ts +++ b/packages/cli/src/lib/test-env/client-config.ts @@ -7,7 +7,7 @@ import { ethereumProviderPlugin, Connections, Connection, -} from "@polywrap/ethereum-provider-js-v1"; +} from "@polywrap/ethereum-provider-js"; import { PolywrapClientConfigBuilder } from "@polywrap/client-js"; import { IWrapPackage } from "@polywrap/core-js"; @@ -41,7 +41,7 @@ export function getTestEnvClientConfig(): Partial { "ens/wraps.eth:ens-uri-resolver-ext@1.0.1", }) .setPackages({ - [Web3.bundle.ethereumProviderV1.uri]: ethereumProviderPlugin({ + [Web3.bundle.ethereumProviderV2.uri]: ethereumProviderPlugin({ connections: new Connections({ networks: { testnet: new Connection({ diff --git a/yarn.lock b/yarn.lock index 548fb42b5d..31ef27d5e9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2315,7 +2315,7 @@ "@polywrap/plugin-js" "0.10.0-pre.10" ethers "5.7.0" -"@polywrap/ethereum-provider-js@npm:@polywrap/ethereum-provider-js@~0.3.1": +"@polywrap/ethereum-provider-js@0.3.1", "@polywrap/ethereum-provider-js@npm:@polywrap/ethereum-provider-js@~0.3.1": version "0.3.1" resolved "https://registry.yarnpkg.com/@polywrap/ethereum-provider-js/-/ethereum-provider-js-0.3.1.tgz#ffdb9425c819ee76d3e3d5ade7d1b044077037e0" integrity sha512-El2d3gE2CFdGNzKQhO+IPP79lhyQmkAGlpQadaW/EDyFDjERLckYDLPrwUCXG0agUcQZcNY1nHn2hknumw/yWg== From 208054b695e070d2b2bd248e5e329782fadeb7c7 Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Thu, 6 Jul 2023 03:20:40 +0800 Subject: [PATCH 040/181] fix: issues --- .../build-strategies/strategies/DockerVMStrategy.ts | 11 +++++++++-- .../build-strategies/wasm/golang/vm/Dockerfile | 2 ++ .../lib/defaults/build-strategies/wasm/golang/vm/NAME | 1 + .../defaults/build-strategies/wasm/golang/vm/VERSION | 1 + .../wasm/golang/vm/vm-script.mustache | 9 +++++++++ ...ize_array.mustache => $deserialize_array.mustache} | 0 ...alize_enum.mustache => $deserialize_enum.mustache} | 0 ...rialize_map.mustache => $deserialize_map.mustache} | 0 ...e_object.mustache => $deserialize_object.mustache} | 0 ...e_scalar.mustache => $deserialize_scalar.mustache} | 0 ...alize_array.mustache => $serialize_array.mustache} | 0 ...rialize_enum.mustache => $serialize_enum.mustache} | 0 ...serialize_map.mustache => $serialize_map.mustache} | 0 ...ize_object.mustache => $serialize_object.mustache} | 0 ...ize_scalar.mustache => $serialize_scalar.mustache} | 0 ...ray.mustache => $value_deserialize_array.mustache} | 0 ...enum.mustache => $value_deserialize_enum.mustache} | 0 ...e_map.mustache => $value_deserialize_map.mustache} | 0 ...ct.mustache => $value_deserialize_object.mustache} | 0 ...ar.mustache => $value_deserialize_scalar.mustache} | 0 ...array.mustache => $value_serialize_array.mustache} | 0 ...e_enum.mustache => $value_serialize_enum.mustache} | 0 ...ize_map.mustache => $value_serialize_map.mustache} | 0 ...ject.mustache => $value_serialize_object.mustache} | 0 ...alar.mustache => $value_serialize_scalar.mustache} | 0 25 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile create mode 100644 packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/NAME create mode 100644 packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION create mode 100644 packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache rename packages/schema/bind/src/bindings/golang/wasm/templates/{deserialize_array.mustache => $deserialize_array.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{deserialize_enum.mustache => $deserialize_enum.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{deserialize_map.mustache => $deserialize_map.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{deserialize_object.mustache => $deserialize_object.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{deserialize_scalar.mustache => $deserialize_scalar.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{serialize_array.mustache => $serialize_array.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{serialize_enum.mustache => $serialize_enum.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{serialize_map.mustache => $serialize_map.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{serialize_object.mustache => $serialize_object.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{serialize_scalar.mustache => $serialize_scalar.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{value_deserialize_array.mustache => $value_deserialize_array.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{value_deserialize_enum.mustache => $value_deserialize_enum.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{value_deserialize_map.mustache => $value_deserialize_map.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{value_deserialize_object.mustache => $value_deserialize_object.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{value_deserialize_scalar.mustache => $value_deserialize_scalar.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{value_serialize_array.mustache => $value_serialize_array.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{value_serialize_enum.mustache => $value_serialize_enum.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{value_serialize_map.mustache => $value_serialize_map.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{value_serialize_object.mustache => $value_serialize_object.mustache} (100%) rename packages/schema/bind/src/bindings/golang/wasm/templates/{value_serialize_scalar.mustache => $value_serialize_scalar.mustache} (100%) diff --git a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts index dfd46b787e..c3ed56d638 100644 --- a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts +++ b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts @@ -46,8 +46,8 @@ const CONFIGS: Record = { "wasm/golang": { defaultIncludes: ["go.mod", "go.sum"], baseImage: "consideritdone/polywrap-base-go", - version: "0.1.0" - } + version: "0.1.0", + }, }; export class DockerVMBuildStrategy extends BuildStrategy { @@ -77,10 +77,13 @@ export class DockerVMBuildStrategy extends BuildStrategy { } public async buildSources(): Promise { + console.log("Docker checking...") await ensureDockerDaemonRunning(this.project.logger); + console.log("Building sources...") await this._buildSources(); + console.log("Copying build output...") await this._copyBuildOutput(); } @@ -90,13 +93,17 @@ export class DockerVMBuildStrategy extends BuildStrategy { const buildManifest = await this.project.getBuildManifest(); const buildManifestConfig = buildManifest.config as BuildManifestConfig; + console.log("Copy manifests...") // Copy manifests buildManifestConfig.polywrap_manifests.forEach((manifestPath) => { + console.log(path.join(manifestDir, manifestPath)); + console.log(path.join(this._volumePaths.project, manifestPath)); fse.copySync( path.join(manifestDir, manifestPath), path.join(this._volumePaths.project, manifestPath) ); }); + console.log("Copying manifests done...") const language = (await this.project.getManifestLanguage()) as BuildableLanguage; diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile new file mode 100644 index 0000000000..b4182dac01 --- /dev/null +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile @@ -0,0 +1,2 @@ +FROM consideritdone/polywrap-base-go:0.1.0 +WORKDIR /project diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/NAME b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/NAME new file mode 100644 index 0000000000..97d7c2778e --- /dev/null +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/NAME @@ -0,0 +1 @@ +polywrap/vm-base-go \ No newline at end of file diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION new file mode 100644 index 0000000000..6c6aa7cb09 --- /dev/null +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION @@ -0,0 +1 @@ +0.1.0 \ No newline at end of file diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache new file mode 100644 index 0000000000..74782a6e6e --- /dev/null +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache @@ -0,0 +1,9 @@ +set -e + +tinygo build -o main.wasm -target wasm-memory src/wrap/main.go + +# Make the build directory +rm -rf ./build +mkdir ./build + +wasm-snip -o ./build/wrap.wasm main.wasm -p syscall runtime.ticks fd_write diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$deserialize_array.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_array.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$deserialize_array.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_enum.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$deserialize_enum.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_enum.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$deserialize_enum.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_map.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$deserialize_map.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_map.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$deserialize_map.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$deserialize_object.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_object.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$deserialize_object.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_scalar.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$deserialize_scalar.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/deserialize_scalar.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$deserialize_scalar.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/serialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$serialize_array.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/serialize_array.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$serialize_array.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/serialize_enum.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$serialize_enum.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/serialize_enum.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$serialize_enum.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/serialize_map.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$serialize_map.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/serialize_map.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$serialize_map.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/serialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$serialize_object.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/serialize_object.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$serialize_object.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/serialize_scalar.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$serialize_scalar.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/serialize_scalar.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$serialize_scalar.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$value_deserialize_array.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_array.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$value_deserialize_array.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_enum.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$value_deserialize_enum.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_enum.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$value_deserialize_enum.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_map.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$value_deserialize_map.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_map.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$value_deserialize_map.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$value_deserialize_object.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_object.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$value_deserialize_object.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_scalar.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$value_deserialize_scalar.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/value_deserialize_scalar.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$value_deserialize_scalar.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$value_serialize_array.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_array.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$value_serialize_array.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_enum.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$value_serialize_enum.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_enum.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$value_serialize_enum.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_map.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$value_serialize_map.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_map.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$value_serialize_map.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_object.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$value_serialize_object.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_object.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$value_serialize_object.mustache diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_scalar.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$value_serialize_scalar.mustache similarity index 100% rename from packages/schema/bind/src/bindings/golang/wasm/templates/value_serialize_scalar.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/$value_serialize_scalar.mustache From e9f82056f1a10a5cba98e9632a10442e09e6af98 Mon Sep 17 00:00:00 2001 From: krisbitney Date: Wed, 5 Jul 2023 14:29:21 -0500 Subject: [PATCH 041/181] added rust bindgen wrap --- packages/schema/bind/src/bindings/index.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/schema/bind/src/bindings/index.ts b/packages/schema/bind/src/bindings/index.ts index 84310656e1..f446c1ebd4 100644 --- a/packages/schema/bind/src/bindings/index.ts +++ b/packages/schema/bind/src/bindings/index.ts @@ -18,7 +18,9 @@ export function getGenerateBindingFn( "https://github.com/polywrap/wrap-abi-bindgen/tree/dev/implementations/wrap-assemblyscript" ); case "wrap-rs": - return Rust.Wasm.generateBinding; + return WrapBindgen.getGenerateBindingFn( + "https://github.com/polywrap/wrap-abi-bindgen/tree/kris/wrap-rust/implementations/wrap-rust" + ); case "plugin-ts": return WrapBindgen.getGenerateBindingFn( "https://github.com/polywrap/wrap-abi-bindgen/tree/dev/implementations/plugin-typescript" From 12e39256575a83c0fd349e75ecca1109ec11ec5a Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Wed, 5 Jul 2023 22:49:07 +0200 Subject: [PATCH 042/181] chore: lint fix --- .../build-strategies/strategies/DockerVMStrategy.ts | 10 +++++----- yarn.lock | 12 ++++++------ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts index c3ed56d638..cbf143803b 100644 --- a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts +++ b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts @@ -77,13 +77,13 @@ export class DockerVMBuildStrategy extends BuildStrategy { } public async buildSources(): Promise { - console.log("Docker checking...") + console.log("Docker checking..."); await ensureDockerDaemonRunning(this.project.logger); - console.log("Building sources...") + console.log("Building sources..."); await this._buildSources(); - console.log("Copying build output...") + console.log("Copying build output..."); await this._copyBuildOutput(); } @@ -93,7 +93,7 @@ export class DockerVMBuildStrategy extends BuildStrategy { const buildManifest = await this.project.getBuildManifest(); const buildManifestConfig = buildManifest.config as BuildManifestConfig; - console.log("Copy manifests...") + console.log("Copy manifests..."); // Copy manifests buildManifestConfig.polywrap_manifests.forEach((manifestPath) => { console.log(path.join(manifestDir, manifestPath)); @@ -103,7 +103,7 @@ export class DockerVMBuildStrategy extends BuildStrategy { path.join(this._volumePaths.project, manifestPath) ); }); - console.log("Copying manifests done...") + console.log("Copying manifests done..."); const language = (await this.project.getManifestLanguage()) as BuildableLanguage; diff --git a/yarn.lock b/yarn.lock index 6f02a84c0c..701a6d61ae 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3024,9 +3024,9 @@ acorn@^7.1.1, acorn@^7.4.0: integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.2.4, acorn@^8.4.1: - version "8.9.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.9.0.tgz#78a16e3b2bcc198c10822786fa6679e245db5b59" - integrity sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ== + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== add-stream@^1.0.0: version "1.0.0" @@ -3968,9 +3968,9 @@ code-point-at@^1.0.0: integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + version "1.0.2" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== collection-visit@^1.0.0: version "1.0.0" From f04db97a25d85094816e82ecdf0f9cc264e5b87b Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Wed, 5 Jul 2023 22:53:42 +0200 Subject: [PATCH 043/181] chore: fix schema-bind test-case.spec.ts --- packages/schema/bind/src/__tests__/test-cases.spec.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/schema/bind/src/__tests__/test-cases.spec.ts b/packages/schema/bind/src/__tests__/test-cases.spec.ts index a60590c970..d9a29f9024 100644 --- a/packages/schema/bind/src/__tests__/test-cases.spec.ts +++ b/packages/schema/bind/src/__tests__/test-cases.spec.ts @@ -2,7 +2,8 @@ import { fetchTestCases } from "./index"; import { bindSchema, BindLanguage, - BindOutput, BindOptions + BindOutput, + BindOptions } from "../"; import { @@ -39,11 +40,11 @@ describe("Polywrap Binding Test Suite", () => { outputDirAbs: testCase.input.outputDirAbs, }; - const output = bindSchema({ + const bindOptions: BindOptions = { ...deepCopy(testCase.input), - bindLanguage: language as BindLanguage, + bindLanguage: language as BindLanguage }; - + if (language == "wasm-go") { if (!bindOptions.config) { bindOptions.config = {}; From 9866405a287707b0cecb845aca1871b2d4af0d64 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Wed, 5 Jul 2023 22:57:26 +0200 Subject: [PATCH 044/181] chore: migrate from consideritdone/polywrap-go to polywrap/go-wrap --- packages/schema/bind/src/bindings/golang/functions.ts | 2 +- .../golang/wasm/templates/env-type/Env%type%-go.mustache | 2 +- .../templates/env-type/Env%type%Serialization-go.mustache | 2 +- .../wasm/templates/imported/env-type/Env%type%-go.mustache | 2 +- .../imported/env-type/Env%type%Serialization-go.mustache | 2 +- .../wasm/templates/imported/interface-type/%type%-go.mustache | 2 +- .../imported/module-type/%type%Serialization-go.mustache | 2 +- .../templates/imported/module-type/%type%Wrapped-go.mustache | 2 +- .../templates/imported/object-type/Object%type%-go.mustache | 2 +- .../object-type/Object%type%Serialization-go.mustache | 2 +- .../golang/wasm/templates/interface-type/%type%-go.mustache | 2 +- .../bind/src/bindings/golang/wasm/templates/main-go.mustache | 2 +- .../module-type/module/%type%Serialization-go.mustache | 2 +- .../templates/module-type/module/%type%Wrapped-go.mustache | 2 +- .../wasm/templates/object-type/Object%type%-go.mustache | 2 +- .../object-type/Object%type%Serialization-go.mustache | 2 +- .../wasm-go/imported/test_import/env_test_import__env.go | 2 +- .../test_import/env_test_import__env_serialization.go | 2 +- .../test_import/object_test_import__another_object.go | 2 +- .../object_test_import__another_object_serialization.go | 2 +- .../imported/test_import/object_test_import__object.go | 2 +- .../test_import/object_test_import__object_serialization.go | 2 +- .../imported/test_import/test_import__module_serialization.go | 2 +- .../imported/test_import/test_import__module_wrapped.go | 2 +- .../bind/sanity/output/wasm-go/interfaces/test_import.go | 2 +- packages/test-cases/cases/bind/sanity/output/wasm-go/main.go | 2 +- .../bind/sanity/output/wasm-go/module/module_serialization.go | 2 +- .../cases/bind/sanity/output/wasm-go/module/module_wrapped.go | 2 +- .../bind/sanity/output/wasm-go/types/object_another_type.go | 2 +- .../output/wasm-go/types/object_another_type_serialization.go | 2 +- .../sanity/output/wasm-go/types/object_custom_map_value.go | 2 +- .../wasm-go/types/object_custom_map_value_serialization.go | 2 +- .../bind/sanity/output/wasm-go/types/object_custom_type.go | 4 ++-- .../output/wasm-go/types/object_custom_type_serialization.go | 4 ++-- .../cases/bind/sanity/output/wasm-go/types/object_env.go | 2 +- .../sanity/output/wasm-go/types/object_env_serialization.go | 2 +- .../cases/bind/sanity/output/wasm-go/types/objectelse.go | 2 +- .../sanity/output/wasm-go/types/objectelse_serialization.go | 2 +- 38 files changed, 40 insertions(+), 40 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/functions.ts b/packages/schema/bind/src/bindings/golang/functions.ts index 008da8bf54..25fab09a04 100644 --- a/packages/schema/bind/src/bindings/golang/functions.ts +++ b/packages/schema/bind/src/bindings/golang/functions.ts @@ -103,7 +103,7 @@ export const makeImports: MustacheFn = () => { t = t.trim(); if (t.endsWith("big.Int")) { exist[ - "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + "github.com/polywrap/go-wrap/polywrap/msgpack/big" ] = true; } else if (t.endsWith("fastjson.Value")) { exist["github.com/valyala/fastjson"] = true; diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache index 5f8f4bb605..2fbba933cb 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache @@ -1,6 +1,6 @@ package types -{{#makeImports}}github.com/consideritdone/polywrap-go/polywrap/msgpack,{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} +{{#makeImports}}github.com/polywrap/go-wrap/polywrap/msgpack,{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} type {{#toUpper}}{{type}}{{/toUpper}} struct { {{#stuctProps}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache index e5f6038776..a959eaf7f2 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache @@ -1,6 +1,6 @@ package types -{{#makeImports}}github.com/consideritdone/polywrap-go/polywrap/msgpack,{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} +{{#makeImports}}github.com/polywrap/go-wrap/polywrap/msgpack,{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { ctx := msgpack.NewContext("Serializing (encoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache index b650c91755..9901f3f3a7 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache @@ -1,6 +1,6 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} {{#makeImports}} - github.com/consideritdone/polywrap-go/polywrap/msgpack, + github.com/polywrap/go-wrap/polywrap/msgpack, {{#properties}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} {{/properties}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache index af9a965b12..a715b7bd59 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache @@ -1,6 +1,6 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} {{#makeImports}} - github.com/consideritdone/polywrap-go/polywrap/msgpack, + github.com/polywrap/go-wrap/polywrap/msgpack, {{#properties}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} {{/properties}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/interface-type/%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/interface-type/%type%-go.mustache index c433d42468..48534a0418 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/interface-type/%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/interface-type/%type%-go.mustache @@ -3,7 +3,7 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} {{#capabilities}} {{#getImplementations}} {{#enabled}} -import "github.com/consideritdone/polywrap-go/polywrap" +import "github.com/polywrap/go-wrap/polywrap" {{/enabled}} {{/getImplementations}} {{/capabilities}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache index c30f7d21ec..039023a802 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache @@ -1,6 +1,6 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} {{#makeImports}} - github.com/consideritdone/polywrap-go/polywrap/msgpack, + github.com/polywrap/go-wrap/polywrap/msgpack, {{#arguments}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} {{/arguments}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache index 3f4fe38bd8..6354293f91 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache @@ -2,7 +2,7 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} {{#methods.length}} import ( - "github.com/consideritdone/polywrap-go/polywrap" + "github.com/polywrap/go-wrap/polywrap" ) {{/methods.length}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache index b650c91755..9901f3f3a7 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache @@ -1,6 +1,6 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} {{#makeImports}} - github.com/consideritdone/polywrap-go/polywrap/msgpack, + github.com/polywrap/go-wrap/polywrap/msgpack, {{#properties}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} {{/properties}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache index 8623350c71..11f4aa2f0a 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache @@ -1,6 +1,6 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} {{#makeImports}} - github.com/consideritdone/polywrap-go/polywrap/msgpack, + github.com/polywrap/go-wrap/polywrap/msgpack, {{#properties}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} {{/properties}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/interface-type/%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/interface-type/%type%-go.mustache index 861f5555e7..4e32c4aeea 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/interface-type/%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/interface-type/%type%-go.mustache @@ -3,7 +3,7 @@ package interfaces {{#capabilities}} {{#getImplementations}} {{#enabled}} -import "github.com/consideritdone/polywrap-go/polywrap" +import "github.com/polywrap/go-wrap/polywrap" {{/enabled}} {{/getImplementations}} {{/capabilities}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache index 81d81a97d3..314c61d9ab 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache @@ -2,7 +2,7 @@ package main import ( "{{goImport}}/src/wrap/module" - "github.com/consideritdone/polywrap-go/polywrap" + "github.com/polywrap/go-wrap/polywrap" ) //export _wrap_invoke diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache index 2fbb08052a..330361cbf3 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache @@ -1,6 +1,6 @@ package module {{#makeImports}} - github.com/consideritdone/polywrap-go/polywrap/msgpack, + github.com/polywrap/go-wrap/polywrap/msgpack, . {{goImport}}/src/wrap/types, {{#importedTypes}} . {{goImport}}/src/wrap/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache index 7b20b03c06..ca99702f61 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache @@ -1,6 +1,6 @@ package module {{#makeImports}} - {{#methods}}{{#env}}github.com/consideritdone/polywrap-go/polywrap,. {{goImport}}/src/wrap/types,{{/env}}{{/methods}} + {{#methods}}{{#env}}github.com/polywrap/go-wrap/polywrap,. {{goImport}}/src/wrap/types,{{/env}}{{/methods}} {{goImport}}/module as methods, {{/makeImports}} {{#methods}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache index ad2d15cd14..6485d72865 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache @@ -1,6 +1,6 @@ package types {{#makeImports}} - github.com/consideritdone/polywrap-go/polywrap/msgpack, + github.com/polywrap/go-wrap/polywrap/msgpack, {{#properties}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} {{/properties}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache index f5964d5008..249c10f617 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache @@ -1,6 +1,6 @@ package types {{#makeImports}} - github.com/consideritdone/polywrap-go/polywrap/msgpack, + github.com/polywrap/go-wrap/polywrap/msgpack, {{#properties}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} {{/properties}} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go index a82fa76d57..a924f65eb8 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go @@ -1,7 +1,7 @@ package test_import import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack" ) type TestImport_Env struct { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go index f0bca14901..837a93f923 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go @@ -1,7 +1,7 @@ package test_import import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack" ) func serializeTestImport_Env(value *TestImport_Env) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object.go index 8e38e568f2..027a991bc5 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object.go @@ -1,7 +1,7 @@ package test_import import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack" ) type TestImport_AnotherObject struct { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object_serialization.go index 8fd5893842..36168acfb1 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object_serialization.go @@ -1,7 +1,7 @@ package test_import import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack" ) func serializeTestImport_AnotherObject(value *TestImport_AnotherObject) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object.go index 6b60414f31..c4c6cafbc6 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object.go @@ -1,7 +1,7 @@ package test_import import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack" ) type TestImport_Object struct { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go index e9e87399a2..d3c17cc26d 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go @@ -1,7 +1,7 @@ package test_import import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack" ) func serializeTestImport_Object(value *TestImport_Object) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go index 3189323eff..c9e912ee41 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go @@ -1,7 +1,7 @@ package test_import import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack" ) type ArgsImportedMethod struct { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go index 4a46374cc5..3b4014acad 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go @@ -1,7 +1,7 @@ package test_import import ( - "github.com/consideritdone/polywrap-go/polywrap" + "github.com/polywrap/go-wrap/polywrap" ) func MethodImportedMethod(uri string, args *ArgsImportedMethod) (*TestImport_Object, error) { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/interfaces/test_import.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/interfaces/test_import.go index c82ec76871..405f79c9a7 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/interfaces/test_import.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/interfaces/test_import.go @@ -1,6 +1,6 @@ package interfaces -import "github.com/consideritdone/polywrap-go/polywrap" +import "github.com/polywrap/go-wrap/polywrap" func TestImportImplementations() []string { return polywrap.WrapGetImplementations("testimport.uri.eth") diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go index 605398790b..8c1f02b09d 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go @@ -2,7 +2,7 @@ package main import ( "github.com/testorg/testrepo/wrap/module" - "github.com/consideritdone/polywrap-go/polywrap" + "github.com/polywrap/go-wrap/polywrap" ) //export _wrap_invoke diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go index 2bc6f24e14..0e3f6bc9e3 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go @@ -2,7 +2,7 @@ package module import ( . "github.com/testorg/testrepo/wrap/types" - "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack" ) func DeserializeModuleMethodArgs(argsBuf []byte) *MethodArgsModuleMethod { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go index 286449f746..9aa00c68b4 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go @@ -2,7 +2,7 @@ package module import ( . "github.com/testorg/testrepo/wrap/types" - "github.com/consideritdone/polywrap-go/polywrap" + "github.com/polywrap/go-wrap/polywrap" methods "github.com/testorg/testrepo/module" ) diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type.go index c66983302c..7b41639530 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type.go @@ -1,7 +1,7 @@ package types import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack" ) type AnotherType struct { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type_serialization.go index 3bb5d8f434..dc10397874 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type_serialization.go @@ -1,7 +1,7 @@ package types import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack" ) func serializeAnotherType(value *AnotherType) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value.go index 155d3c7d21..881760040a 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value.go @@ -1,7 +1,7 @@ package types import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack" ) type CustomMapValue struct { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value_serialization.go index 2e0ee49210..11ca1da95e 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value_serialization.go @@ -1,7 +1,7 @@ package types import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack" ) func serializeCustomMapValue(value *CustomMapValue) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go index ae268082e8..123a0997e1 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go @@ -1,8 +1,8 @@ package types import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack/big" "github.com/valyala/fastjson" ) diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go index 67a836ae91..b3ebfa9d1a 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go @@ -1,8 +1,8 @@ package types import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" - "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" + "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack/big" "github.com/valyala/fastjson" ) diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env.go index 3ee18a765c..469e63df31 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env.go @@ -1,7 +1,7 @@ package types import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack" ) type Env struct { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env_serialization.go index 802539ef32..bac49ecae9 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env_serialization.go @@ -1,7 +1,7 @@ package types import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack" ) func serializeEnv(value *Env) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse.go index 3a1d9679c3..1bfac78946 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse.go @@ -1,7 +1,7 @@ package types import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack" ) type Else struct { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse_serialization.go index 5aa212aca2..925f93a1ea 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse_serialization.go @@ -1,7 +1,7 @@ package types import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack" + "github.com/polywrap/go-wrap/polywrap/msgpack" ) func serializeElse(value *Else) []byte { From 1a3d102503565ec266c6a777ce8d11b64f1b97c6 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Wed, 5 Jul 2023 23:26:55 +0200 Subject: [PATCH 045/181] chore: schema-bind tests pass --- .../enum_test_import__enum__return.go | 38 +++ .../test_import/env_test_import__env.go | 9 +- .../env_test_import__env_serialization.go | 224 ++++++++++++++++-- .../test_import__module_serialization.go | 45 ++++ .../test_import__module_wrapped.go | 14 ++ .../cases/bind/sanity/output/wasm-go/main.go | 2 +- .../wasm-go/module/module_serialization.go | 31 ++- .../output/wasm-go/module/module_wrapped.go | 2 +- .../output/wasm-go/types/module_args.go | 1 + .../wasm-go/types/object_custom_type.go | 6 +- .../types/object_custom_type_serialization.go | 80 +++---- 11 files changed, 391 insertions(+), 61 deletions(-) create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/enum_test_import__enum__return.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/enum_test_import__enum__return.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/enum_test_import__enum__return.go new file mode 100644 index 0000000000..893faccee3 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/enum_test_import__enum__return.go @@ -0,0 +1,38 @@ +package test_import + +type TestImport_Enum_Return int32 + +const ( + TestImport_Enum_ReturnSTRING = iota + TestImport_Enum_ReturnBYTES = iota + testImport_Enum_ReturnMax = iota +) + +func SanitizeTestImport_Enum_ReturnValue(value int32) { + if !(value >= 0 && value < int32(testImport_Enum_ReturnMax)) { + panic("Invalid value for enum 'TestImport_Enum_Return'") + } +} + +func GetTestImport_Enum_ReturnValue(key string) TestImport_Enum_Return { + switch key { + case "STRING": + return TestImport_Enum_ReturnSTRING + case "BYTES": + return TestImport_Enum_ReturnBYTES + default: + panic("Invalid key for enum 'TestImport_Enum_Return'") + } +} + +func GetTestImport_Enum_ReturnKey(value TestImport_Enum_Return) string { + SanitizeTestImport_Enum_ReturnValue(int32(value)) + switch value { + case TestImport_Enum_ReturnSTRING: + return "STRING" + case TestImport_Enum_ReturnBYTES: + return "BYTES" + default: + panic("Invalid value for enum 'TestImport_Enum_Return'") + } +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go index a924f65eb8..fea45b5c0f 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go @@ -5,7 +5,14 @@ import ( ) type TestImport_Env struct { - EnviroProp string + Object TestImport_AnotherObject + OptObject *TestImport_AnotherObject + ObjectArray []TestImport_AnotherObject + OptObjectArray []*TestImport_AnotherObject + En TestImport_Enum + OptEnum *TestImport_Enum + EnumArray []TestImport_Enum + OptEnumArray []*TestImport_Enum } func TestImport_EnvToBuffer(value *TestImport_Env) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go index 837a93f923..592d639a05 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go @@ -12,12 +12,101 @@ func serializeTestImport_Env(value *TestImport_Env) []byte { } func writeTestImport_Env(writer msgpack.Write, value *TestImport_Env) { - writer.WriteMapLength(1) - writer.Context().Push("EnviroProp", "string", "writing property") - writer.WriteString("EnviroProp") + writer.WriteMapLength(8) + writer.Context().Push("Object", "TestImport_AnotherObject", "writing property") + writer.WriteString("Object") { - v := value.EnviroProp - writer.WriteString(v) + v := value.Object + TestImport_AnotherObjectWrite(writer, &v) + } + writer.Context().Pop() + writer.Context().Push("OptObject", "*TestImport_AnotherObject", "writing property") + writer.WriteString("OptObject") + { + v := value.OptObject + TestImport_AnotherObjectWrite(writer, v) + } + writer.Context().Pop() + writer.Context().Push("ObjectArray", "[]TestImport_AnotherObject", "writing property") + writer.WriteString("ObjectArray") + if value.ObjectArray == nil { + writer.WriteNil() + } else if len(value.ObjectArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.ObjectArray { + { + v := value.ObjectArray[i0] + TestImport_AnotherObjectWrite(writer, &v) + } + } + } + writer.Context().Pop() + writer.Context().Push("OptObjectArray", "[]*TestImport_AnotherObject", "writing property") + writer.WriteString("OptObjectArray") + if value.OptObjectArray == nil { + writer.WriteNil() + } else if len(value.OptObjectArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.OptObjectArray { + { + v := value.OptObjectArray[i0] + TestImport_AnotherObjectWrite(writer, v) + } + } + } + writer.Context().Pop() + writer.Context().Push("En", "TestImport_Enum", "writing property") + writer.WriteString("En") + { + v := value.En + writer.WriteI32(int32(v)) + } + writer.Context().Pop() + writer.Context().Push("OptEnum", "*TestImport_Enum", "writing property") + writer.WriteString("OptEnum") + { + v := value.OptEnum + if v == nil { + writer.WriteNil() + } else { + writer.WriteI32(int32(*v)) + } + } + writer.Context().Pop() + writer.Context().Push("EnumArray", "[]TestImport_Enum", "writing property") + writer.WriteString("EnumArray") + if value.EnumArray == nil { + writer.WriteNil() + } else if len(value.EnumArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.EnumArray { + { + v := value.EnumArray[i0] + writer.WriteI32(int32(v)) + } + } + } + writer.Context().Pop() + writer.Context().Push("OptEnumArray", "[]*TestImport_Enum", "writing property") + writer.WriteString("OptEnumArray") + if value.OptEnumArray == nil { + writer.WriteNil() + } else if len(value.OptEnumArray) == 0 { + writer.WriteNil() + } else { + for i0 := range value.OptEnumArray { + { + v := value.OptEnumArray[i0] + if v == nil { + writer.WriteNil() + } else { + writer.WriteI32(int32(*v)) + } + } + } } writer.Context().Pop() } @@ -30,28 +119,135 @@ func deserializeTestImport_Env(data []byte) *TestImport_Env { func readTestImport_Env(reader msgpack.Read) *TestImport_Env { var ( - _enviroProp string - _enviroPropSet bool + _object TestImport_AnotherObject + _objectSet bool + _optObject *TestImport_AnotherObject + _objectArray []TestImport_AnotherObject + _objectArraySet bool + _optObjectArray []*TestImport_AnotherObject + _en TestImport_Enum + _enSet bool + _optEnum *TestImport_Enum + _enumArray []TestImport_Enum + _enumArraySet bool + _optEnumArray []*TestImport_Enum ) for i := int32(reader.ReadMapLength()); i > 0; i-- { field := reader.ReadString() reader.Context().Push(field, "unknown", "searching for property type") switch field { - case "EnviroProp": - reader.Context().Push(field, "string", "type found, reading property") - _enviroProp = reader.ReadString() - _enviroPropSet = true + case "Object": + reader.Context().Push(field, "TestImport_AnotherObject", "type found, reading property") + if v := TestImport_AnotherObjectRead(reader); v != nil { + _object = *v + } + _objectSet = true + reader.Context().Pop() + case "OptObject": + reader.Context().Push(field, "*TestImport_AnotherObject", "type found, reading property") + if v := TestImport_AnotherObjectRead(reader); v != nil { + _optObject = v + } + reader.Context().Pop() + case "ObjectArray": + reader.Context().Push(field, "[]TestImport_AnotherObject", "type found, reading property") + if reader.IsNil() { + _objectArray = nil + } else { + ln0 := reader.ReadArrayLength() + _objectArray = make([]TestImport_AnotherObject, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if v := TestImport_AnotherObjectRead(reader); v != nil { + _objectArray[i0] = *v + } + } + } + _objectArraySet = true + reader.Context().Pop() + case "OptObjectArray": + reader.Context().Push(field, "[]*TestImport_AnotherObject", "type found, reading property") + if reader.IsNil() { + _optObjectArray = nil + } else { + ln0 := reader.ReadArrayLength() + _optObjectArray = make([]*TestImport_AnotherObject, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if v := TestImport_AnotherObjectRead(reader); v != nil { + _optObjectArray[i0] = v + } + } + } + reader.Context().Pop() + case "En": + reader.Context().Push(field, "TestImport_Enum", "type found, reading property") + _en = TestImport_Enum(reader.ReadI32()) + SanitizeTestImport_EnumValue(int32(_en)) + _enSet = true + reader.Context().Pop() + case "OptEnum": + reader.Context().Push(field, "*TestImport_Enum", "type found, reading property") + if !reader.IsNil() { + v := TestImport_Enum(reader.ReadI32()) + SanitizeTestImport_EnumValue(int32(v)) + _optEnum = &v + } + reader.Context().Pop() + case "EnumArray": + reader.Context().Push(field, "[]TestImport_Enum", "type found, reading property") + if reader.IsNil() { + _enumArray = nil + } else { + ln0 := reader.ReadArrayLength() + _enumArray = make([]TestImport_Enum, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + _enumArray[i0] = TestImport_Enum(reader.ReadI32()) + SanitizeTestImport_EnumValue(int32(_enumArray[i0])) + } + } + _enumArraySet = true + reader.Context().Pop() + case "OptEnumArray": + reader.Context().Push(field, "[]*TestImport_Enum", "type found, reading property") + if reader.IsNil() { + _optEnumArray = nil + } else { + ln0 := reader.ReadArrayLength() + _optEnumArray = make([]*TestImport_Enum, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if !reader.IsNil() { + v := TestImport_Enum(reader.ReadI32()) + SanitizeTestImport_EnumValue(int32(v)) + _optEnumArray[i0] = &v + } + } + } reader.Context().Pop() } reader.Context().Pop() } - if !_enviroPropSet { - panic(reader.Context().PrintWithContext("Missing required property: 'enviroProp: String'")) + if !_objectSet { + panic(reader.Context().PrintWithContext("Missing required property: 'object: TestImport_AnotherObject'")) + } + if !_objectArraySet { + panic(reader.Context().PrintWithContext("Missing required property: 'objectArray: [TestImport_AnotherObject]'")) + } + if !_enSet { + panic(reader.Context().PrintWithContext("Missing required property: 'en: TestImport_Enum'")) + } + if !_enumArraySet { + panic(reader.Context().PrintWithContext("Missing required property: 'enumArray: [TestImport_Enum]'")) } return &TestImport_Env{ - EnviroProp: _enviroProp, + Object: _object, + OptObject: _optObject, + ObjectArray: _objectArray, + OptObjectArray: _optObjectArray, + En: _en, + OptEnum: _optEnum, + EnumArray: _enumArray, + OptEnumArray: _optEnumArray, } } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go index c9e912ee41..032f87aa14 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go @@ -243,3 +243,48 @@ func DeserializeAnotherMethodResult(argsBuf []byte) int32 { reader.Context().Pop() return value } + +type ArgsReturnsArrayOfEnums struct { + Arg string +} + +func SerializeReturnsArrayOfEnumsArgs(value *ArgsReturnsArrayOfEnums) []byte { + ctx := msgpack.NewContext("Serializing module-type: ReturnsArrayOfEnums") + encoder := msgpack.NewWriteEncoder(ctx) + WriteReturnsArrayOfEnumsArgs(encoder, value) + return encoder.Buffer() +} + +func WriteReturnsArrayOfEnumsArgs(writer msgpack.Write, value *ArgsReturnsArrayOfEnums) { + writer.WriteMapLength(1) + writer.Context().Push("arg", "string", "writing property") + writer.WriteString("arg") + { + v := value.Arg + writer.WriteString(v) + } + writer.Context().Pop() +} + +func DeserializeReturnsArrayOfEnumsResult(argsBuf []byte) []*TestImport_Enum_Return { + ctx := msgpack.NewContext("Deserializing module-type: ReturnsArrayOfEnums") + reader := msgpack.NewReadDecoder(ctx, argsBuf) + + reader.Context().Push("returnsArrayOfEnums", "[]*TestImport_Enum_Return", "reading function output") + var value []*TestImport_Enum_Return + if reader.IsNil() { + value = nil + } else { + ln0 := reader.ReadArrayLength() + value = make([]*TestImport_Enum_Return, ln0) + for i0 := uint32(0); i0 < ln0; i0++ { + if !reader.IsNil() { + v := TestImport_Enum_Return(reader.ReadI32()) + SanitizeTestImport_Enum_ReturnValue(int32(v)) + _returnsArrayOfEnums[i0] = &v + } + } + } + reader.Context().Pop() + return value +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go index 3b4014acad..bb1cefafe8 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go @@ -31,3 +31,17 @@ func MethodAnotherMethod(uri string, args *ArgsAnotherMethod) (int32, error) { } return data, err } + +func MethodReturnsArrayOfEnums(uri string, args *ArgsReturnsArrayOfEnums) ([]*TestImport_Enum_Return, error) { + argsBuf := SerializeReturnsArrayOfEnumsArgs(args) + var ( + err error + raw []byte + data []*TestImport_Enum_Return + ) + raw, err = polywrap.WrapSubinvokeImplementation("testimport.uri.eth", uri, "returnsArrayOfEnums", argsBuf) + if err == nil { + data = DeserializeReturnsArrayOfEnumsResult(raw) + } + return data, err +} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go index 8c1f02b09d..5a4fb1b074 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go @@ -1,7 +1,7 @@ package main import ( - "github.com/testorg/testrepo/wrap/module" + "github.com/testorg/testrepo/src/wrap/module" "github.com/polywrap/go-wrap/polywrap" ) diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go index 0e3f6bc9e3..980351923c 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go @@ -1,7 +1,7 @@ package module import ( - . "github.com/testorg/testrepo/wrap/types" + . "github.com/testorg/testrepo/src/wrap/types" "github.com/polywrap/go-wrap/polywrap/msgpack" ) @@ -23,6 +23,8 @@ func DeserializeModuleMethodArgs(argsBuf []byte) *MethodArgsModuleMethod { _mapSet bool _mapOfArr map[string][]int32 _mapOfArrSet bool + _mapOfMap map[string]map[string]int32 + _mapOfMapSet bool _mapOfObj map[string]AnotherType _mapOfObjSet bool _mapOfArrOfObj map[string][]AnotherType @@ -125,6 +127,29 @@ func DeserializeModuleMethodArgs(argsBuf []byte) *MethodArgsModuleMethod { } _mapOfArrSet = true reader.Context().Pop() + case "mapOfMap": + reader.Context().Push(field, "map[string]map[string]int32", "type found, reading property") + if reader.IsNil() { + _mapOfMap = nil + } else { + ln0 := reader.ReadMapLength() + _mapOfMap = make(map[string]map[string]int32) + for j0 := uint32(0); j0 < ln0; j0++ { + i0 := reader.ReadString() + if reader.IsNil() { + _mapOfMap[i0] = nil + } else { + ln1 := reader.ReadMapLength() + _mapOfMap[i0] = make(map[string]int32) + for j1 := uint32(0); j1 < ln1; j1++ { + i1 := reader.ReadString() + _mapOfMap[i0][i1] = reader.ReadI32() + } + } + } + } + _mapOfMapSet = true + reader.Context().Pop() case "mapOfObj": reader.Context().Push(field, "map[string]AnotherType", "type found, reading property") if reader.IsNil() { @@ -184,6 +209,9 @@ func DeserializeModuleMethodArgs(argsBuf []byte) *MethodArgsModuleMethod { if !_mapOfArrSet { panic(reader.Context().PrintWithContext("Missing required property: 'mapOfArr: Map'")) } + if !_mapOfMapSet { + panic(reader.Context().PrintWithContext("Missing required property: 'mapOfMap: Map>'")) + } if !_mapOfObjSet { panic(reader.Context().PrintWithContext("Missing required property: 'mapOfObj: Map'")) } @@ -200,6 +228,7 @@ func DeserializeModuleMethodArgs(argsBuf []byte) *MethodArgsModuleMethod { OptEnumArray: _optEnumArray, M_map: _map, MapOfArr: _mapOfArr, + MapOfMap: _mapOfMap, MapOfObj: _mapOfObj, MapOfArrOfObj: _mapOfArrOfObj, } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go index 9aa00c68b4..e9ff1de025 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go @@ -1,7 +1,7 @@ package module import ( - . "github.com/testorg/testrepo/wrap/types" + . "github.com/testorg/testrepo/src/wrap/types" "github.com/polywrap/go-wrap/polywrap" methods "github.com/testorg/testrepo/module" ) diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go index 2ec6424513..118f13d50e 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go @@ -9,6 +9,7 @@ type MethodArgsModuleMethod struct { OptEnumArray []*CustomEnum M_map map[string]int32 MapOfArr map[string][]int32 + MapOfMap map[string]map[string]int32 MapOfObj map[string]AnotherType MapOfArrOfObj map[string][]AnotherType } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go index 123a0997e1..280ee1c01d 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go @@ -28,9 +28,9 @@ type CustomType struct { OptBytes []byte M_boolean bool OptBoolean *bool - UArray []uint32 - UOptArray []uint32 - OptUOptArray []*uint32 + U_array []uint32 + UOpt_array []uint32 + _opt_uOptArray []*uint32 OptStrOptArray []*string UArrayArray [][]uint32 UOptArrayOptArray [][]*uint32 diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go index b3ebfa9d1a..2275a4e94c 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go @@ -190,46 +190,46 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } } writer.Context().Pop() - writer.Context().Push("UArray", "[]uint32", "writing property") - writer.WriteString("UArray") - if value.UArray == nil { + writer.Context().Push("U_array", "[]uint32", "writing property") + writer.WriteString("U_array") + if value.U_array == nil { writer.WriteNil() - } else if len(value.UArray) == 0 { + } else if len(value.U_array) == 0 { writer.WriteNil() } else { - for i0 := range value.UArray { + for i0 := range value.U_array { { - v := value.UArray[i0] + v := value.U_array[i0] writer.WriteU32(v) } } } writer.Context().Pop() - writer.Context().Push("UOptArray", "[]uint32", "writing property") - writer.WriteString("UOptArray") - if value.UOptArray == nil { + writer.Context().Push("UOpt_array", "[]uint32", "writing property") + writer.WriteString("UOpt_array") + if value.UOpt_array == nil { writer.WriteNil() - } else if len(value.UOptArray) == 0 { + } else if len(value.UOpt_array) == 0 { writer.WriteNil() } else { - for i0 := range value.UOptArray { + for i0 := range value.UOpt_array { { - v := value.UOptArray[i0] + v := value.UOpt_array[i0] writer.WriteU32(v) } } } writer.Context().Pop() - writer.Context().Push("OptUOptArray", "[]*uint32", "writing property") - writer.WriteString("OptUOptArray") - if value.OptUOptArray == nil { + writer.Context().Push("_opt_uOptArray", "[]*uint32", "writing property") + writer.WriteString("_opt_uOptArray") + if value._opt_uOptArray == nil { writer.WriteNil() - } else if len(value.OptUOptArray) == 0 { + } else if len(value._opt_uOptArray) == 0 { writer.WriteNil() } else { - for i0 := range value.OptUOptArray { + for i0 := range value._opt_uOptArray { { - v := value.OptUOptArray[i0] + v := value._opt_uOptArray[i0] if v == nil { writer.WriteNil() } else { @@ -615,10 +615,10 @@ func readCustomType(reader msgpack.Read) *CustomType { _boolean bool _booleanSet bool _optBoolean *bool - _uArray []uint32 - _uArraySet bool - _uOptArray []uint32 - _optUOptArray []*uint32 + _u_array []uint32 + _u_arraySet bool + _uOpt_array []uint32 + __opt_uOptArray []*uint32 _optStrOptArray []*string _uArrayArray [][]uint32 _uArrayArraySet bool @@ -774,42 +774,42 @@ func readCustomType(reader msgpack.Read) *CustomType { _optBoolean = &v } reader.Context().Pop() - case "UArray": + case "U_array": reader.Context().Push(field, "[]uint32", "type found, reading property") if reader.IsNil() { - _uArray = nil + _u_array = nil } else { ln0 := reader.ReadArrayLength() - _uArray = make([]uint32, ln0) + _u_array = make([]uint32, ln0) for i0 := uint32(0); i0 < ln0; i0++ { - _uArray[i0] = reader.ReadU32() + _u_array[i0] = reader.ReadU32() } } - _uArraySet = true + _u_arraySet = true reader.Context().Pop() - case "UOptArray": + case "UOpt_array": reader.Context().Push(field, "[]uint32", "type found, reading property") if reader.IsNil() { - _uOptArray = nil + _uOpt_array = nil } else { ln0 := reader.ReadArrayLength() - _uOptArray = make([]uint32, ln0) + _uOpt_array = make([]uint32, ln0) for i0 := uint32(0); i0 < ln0; i0++ { - _uOptArray[i0] = reader.ReadU32() + _uOpt_array[i0] = reader.ReadU32() } } reader.Context().Pop() - case "OptUOptArray": + case "_opt_uOptArray": reader.Context().Push(field, "[]*uint32", "type found, reading property") if reader.IsNil() { - _optUOptArray = nil + __opt_uOptArray = nil } else { ln0 := reader.ReadArrayLength() - _optUOptArray = make([]*uint32, ln0) + __opt_uOptArray = make([]*uint32, ln0) for i0 := uint32(0); i0 < ln0; i0++ { if !reader.IsNil() { v := reader.ReadU32() - _optUOptArray[i0] = &v + __opt_uOptArray[i0] = &v } } } @@ -1163,8 +1163,8 @@ func readCustomType(reader msgpack.Read) *CustomType { if !_booleanSet { panic(reader.Context().PrintWithContext("Missing required property: 'boolean: Boolean'")) } - if !_uArraySet { - panic(reader.Context().PrintWithContext("Missing required property: 'uArray: [UInt]'")) + if !_u_arraySet { + panic(reader.Context().PrintWithContext("Missing required property: 'u_array: [UInt]'")) } if !_uArrayArraySet { panic(reader.Context().PrintWithContext("Missing required property: 'uArrayArray: [[UInt]]'")) @@ -1224,9 +1224,9 @@ func readCustomType(reader msgpack.Read) *CustomType { OptBytes: _optBytes, M_boolean: _boolean, OptBoolean: _optBoolean, - UArray: _uArray, - UOptArray: _uOptArray, - OptUOptArray: _optUOptArray, + U_array: _u_array, + UOpt_array: _uOpt_array, + _opt_uOptArray: __opt_uOptArray, OptStrOptArray: _optStrOptArray, UArrayArray: _uArrayArray, UOptArrayOptArray: _uOptArrayOptArray, From b2692d042d8f815447547ae35a3176d1890715e6 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Thu, 6 Jul 2023 01:41:03 +0200 Subject: [PATCH 046/181] fix: emit resources for wasm & interface builds --- packages/cli/src/lib/Compiler.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/cli/src/lib/Compiler.ts b/packages/cli/src/lib/Compiler.ts index 6946f6ee3b..bc41d306f3 100644 --- a/packages/cli/src/lib/Compiler.ts +++ b/packages/cli/src/lib/Compiler.ts @@ -42,10 +42,15 @@ export class Compiler { // Output: wrap.info await this._outputWrapManifest(); - if (await this._isWasm()) { + const buildModules = await this._isWasm(); + const emitResourcesAndDocs = buildModules || (await this._isInterface()); + + if (buildModules) { // Build & Output: wasm.wrap await this._buildModules(); + } + if (emitResourcesAndDocs) { // Copy: Resources folder await this._copyResourcesFolder(); @@ -76,6 +81,12 @@ export class Compiler { return manifest.project.type.startsWith("wasm/"); } + private async _isInterface(): Promise { + const { project } = this._config; + const manifest = await project.getManifest(); + return manifest.project.type === "interface"; + } + private async _buildModules(): Promise { const { outputDir, project } = this._config; From 5e45c99015d85da86e7b4f4df020941871ff89b8 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Thu, 6 Jul 2023 04:23:49 +0200 Subject: [PATCH 047/181] chore: add back compiler & codegen overrides --- .../cli/src/__tests__/e2e/build-go.spec.ts | 72 ++++++++++++++++++ .../lib/build-strategies/BuildOverrides.ts | 36 +++++++++ .../src/lib/build-strategies/BuildStrategy.ts | 23 ++++-- .../cli/src/lib/build-strategies/index.ts | 1 + .../strategies/DockerImageStrategy.ts | 6 +- .../strategies/DockerVMStrategy.ts | 13 +--- packages/cli/src/lib/codegen/CodeGenerator.ts | 16 +++- .../cli/src/lib/codegen/CodegenOverrides.ts | 35 +++++++++ packages/cli/src/lib/codegen/index.ts | 1 + .../language-overrides/wasm/golang/index.ts | 73 +++++++++++++++++++ .../language-overrides/wasm/rust/index.ts | 18 +++++ 11 files changed, 272 insertions(+), 22 deletions(-) create mode 100644 packages/cli/src/__tests__/e2e/build-go.spec.ts create mode 100644 packages/cli/src/lib/build-strategies/BuildOverrides.ts create mode 100644 packages/cli/src/lib/codegen/CodegenOverrides.ts create mode 100644 packages/cli/src/lib/defaults/language-overrides/wasm/golang/index.ts create mode 100644 packages/cli/src/lib/defaults/language-overrides/wasm/rust/index.ts diff --git a/packages/cli/src/__tests__/e2e/build-go.spec.ts b/packages/cli/src/__tests__/e2e/build-go.spec.ts new file mode 100644 index 0000000000..138a00f6f4 --- /dev/null +++ b/packages/cli/src/__tests__/e2e/build-go.spec.ts @@ -0,0 +1,72 @@ +import { polywrapCli } from "./utils"; +import { Commands } from "@polywrap/cli-js"; +import { GetPathToCliTestFiles } from "@polywrap/test-cases"; +import fs from "fs"; +import path from "path"; + +jest.setTimeout(1500000); + +describe("e2e tests for build command", () => { + const testCaseRoot = path.join(GetPathToCliTestFiles(), "build-cmd/wasm/go"); + const testCases = fs + .readdirSync(testCaseRoot, { withFileTypes: true }) + .filter((dirent) => dirent.isDirectory()) + .map((dirent) => dirent.name); + + const getTestCaseDir = (index: number) => + path.join(testCaseRoot, testCases[index]); + + describe("Image strategy", () => { + it("Builds for go", async () => { + const { exitCode: code, stdout: output } = await Commands.build({ + strategy: "image", + verbose: true + }, { + cwd: getTestCaseDir(0), + cli: polywrapCli, + }); + const buildDir = `./build`; + + expect(code).toEqual(0); + expect(output).toContain(`Artifacts written to ${buildDir}`); + expect(output).toContain(`WRAP manifest written in ${buildDir}/wrap.info`); + }); + }) + + // NOTE: Skipped because CI needs system prequisites: golang + describe.skip("Local strategy", () => { + it("Builds for rust", async () => { + const { exitCode: code, stdout: output } = await Commands.build({ + strategy: "local", + verbose: true + }, { + cwd: getTestCaseDir(0), + cli: polywrapCli, + }); + + const buildDir = `./build`; + + expect(code).toEqual(0); + expect(output).toContain(`Artifacts written to ${buildDir}`); + expect(output).toContain(`WRAP manifest written in ${buildDir}/wrap.info`); + }); + }) + + describe("VM strategy", () => { + it("Builds for go", async () => { + const { exitCode: code, stdout: output } = await Commands.build({ + strategy: "vm", + verbose: true + }, { + cwd: getTestCaseDir(0), + cli: polywrapCli, + }); + + const buildDir = `./build`; + + expect(code).toEqual(0); + expect(output).toContain(`Artifacts written to ${buildDir}`); + expect(output).toContain(`WRAP manifest written in ${buildDir}/wrap.info`); + }); + }) +}); diff --git a/packages/cli/src/lib/build-strategies/BuildOverrides.ts b/packages/cli/src/lib/build-strategies/BuildOverrides.ts new file mode 100644 index 0000000000..cd1836af2b --- /dev/null +++ b/packages/cli/src/lib/build-strategies/BuildOverrides.ts @@ -0,0 +1,36 @@ +import { PolywrapManifestLanguage } from "../"; + +import { PolywrapManifest } from "@polywrap/polywrap-manifest-types-js"; +import path from "path"; +import fs from "fs"; + +export interface BuildOverrides { + validateManifest: ( + manifest: PolywrapManifest + ) => Promise; +} + +export async function tryGetBuildOverrides( + language: PolywrapManifestLanguage +): Promise { + const modulePath = path.join( + __dirname, + "..", + "defaults", + "language-overrides", + language, + "index.js" + ); + let overrides: BuildOverrides | undefined; + + if (fs.existsSync(modulePath)) { + const module = await import(modulePath); + + // Get any build overrides for the given build-image + if (module.getBuildOverrides) { + overrides = module.getBuildOverrides() as BuildOverrides; + } + } + + return Promise.resolve(overrides); +} diff --git a/packages/cli/src/lib/build-strategies/BuildStrategy.ts b/packages/cli/src/lib/build-strategies/BuildStrategy.ts index 9b0086903c..0e5054c0a0 100644 --- a/packages/cli/src/lib/build-strategies/BuildStrategy.ts +++ b/packages/cli/src/lib/build-strategies/BuildStrategy.ts @@ -1,9 +1,10 @@ +import { tryGetBuildOverrides } from "./BuildOverrides"; import { PolywrapProject } from "../project"; import fse from "fs-extra"; import path from "path"; -export interface BuildStrategyArgs { +export interface BuildStrategyConfig { project: PolywrapProject; outputDir: string; } @@ -12,7 +13,7 @@ export abstract class BuildStrategy { protected project: PolywrapProject; protected outputDir: string; - constructor({ project, outputDir }: BuildStrategyArgs) { + constructor({ project, outputDir }: BuildStrategyConfig) { this.project = project; this.outputDir = outputDir; } @@ -23,7 +24,7 @@ export abstract class BuildStrategy { async build(): Promise { const language = await this.project.getManifestLanguage(); - const defaultsOfStrategyUsed = path.join( + const buildStrategyDir = path.join( __dirname, "..", "defaults", @@ -31,17 +32,27 @@ export abstract class BuildStrategy { language, this.getStrategyName() ); + + // Cache all build strategy files const strategyUsedCacheDir = this.project.getCachePath( PolywrapProject.cacheLayout.buildStrategyUsed ); - if (fse.existsSync(strategyUsedCacheDir)) { fse.removeSync(strategyUsedCacheDir); } - fse.mkdirSync(strategyUsedCacheDir, { recursive: true }); + fse.copySync(buildStrategyDir, strategyUsedCacheDir); + + // Check if build overrides exist + const overrides = await tryGetBuildOverrides(language); + + // If they do, ensure the manifest if valid before build starts + if (overrides) { + await overrides.validateManifest( + await this.project.getManifest() + ); + } - fse.copySync(defaultsOfStrategyUsed, strategyUsedCacheDir); return this.buildSources(); } } diff --git a/packages/cli/src/lib/build-strategies/index.ts b/packages/cli/src/lib/build-strategies/index.ts index 6aa24c9e22..1daa4e6083 100644 --- a/packages/cli/src/lib/build-strategies/index.ts +++ b/packages/cli/src/lib/build-strategies/index.ts @@ -1,3 +1,4 @@ +export * from "./BuildOverrides"; export * from "./BuildStrategy"; export * from "./strategies"; diff --git a/packages/cli/src/lib/build-strategies/strategies/DockerImageStrategy.ts b/packages/cli/src/lib/build-strategies/strategies/DockerImageStrategy.ts index 0de8d4552a..d200659b5a 100644 --- a/packages/cli/src/lib/build-strategies/strategies/DockerImageStrategy.ts +++ b/packages/cli/src/lib/build-strategies/strategies/DockerImageStrategy.ts @@ -7,7 +7,7 @@ import { runCommand, runCommandSync, } from "../../system"; -import { BuildStrategyArgs, BuildStrategy } from "../BuildStrategy"; +import { BuildStrategyConfig, BuildStrategy } from "../BuildStrategy"; import { intlMsg } from "../../intl"; import { logActivity } from "../../logging"; @@ -21,8 +21,8 @@ type BuildImageId = string; export class DockerImageBuildStrategy extends BuildStrategy { private _dockerLock: FileLock; - constructor(args: BuildStrategyArgs) { - super(args); + constructor(config: BuildStrategyConfig) { + super(config); if (!isDockerInstalled(this.project.logger)) { throw new Error(intlMsg.lib_docker_noInstall()); diff --git a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts index cbf143803b..5ac3ab5285 100644 --- a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts +++ b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts @@ -4,7 +4,7 @@ import { isDockerInstalled, runCommand, } from "../../system"; -import { BuildStrategyArgs, BuildStrategy } from "../BuildStrategy"; +import { BuildStrategyConfig, BuildStrategy } from "../BuildStrategy"; import { intlMsg } from "../../intl"; import { BuildManifestConfig, @@ -55,8 +55,8 @@ export class DockerVMBuildStrategy extends BuildStrategy { project: string; linkedPackages: string; }; - constructor(args: BuildStrategyArgs) { - super(args); + constructor(config: BuildStrategyConfig) { + super(config); if (!isDockerInstalled(this.project.logger)) { throw new Error(intlMsg.lib_docker_noInstall()); @@ -77,13 +77,10 @@ export class DockerVMBuildStrategy extends BuildStrategy { } public async buildSources(): Promise { - console.log("Docker checking..."); await ensureDockerDaemonRunning(this.project.logger); - console.log("Building sources..."); await this._buildSources(); - console.log("Copying build output..."); await this._copyBuildOutput(); } @@ -93,17 +90,13 @@ export class DockerVMBuildStrategy extends BuildStrategy { const buildManifest = await this.project.getBuildManifest(); const buildManifestConfig = buildManifest.config as BuildManifestConfig; - console.log("Copy manifests..."); // Copy manifests buildManifestConfig.polywrap_manifests.forEach((manifestPath) => { - console.log(path.join(manifestDir, manifestPath)); - console.log(path.join(this._volumePaths.project, manifestPath)); fse.copySync( path.join(manifestDir, manifestPath), path.join(this._volumePaths.project, manifestPath) ); }); - console.log("Copying manifests done..."); const language = (await this.project.getManifestLanguage()) as BuildableLanguage; diff --git a/packages/cli/src/lib/codegen/CodeGenerator.ts b/packages/cli/src/lib/codegen/CodeGenerator.ts index affc649213..1fd3a14da2 100644 --- a/packages/cli/src/lib/codegen/CodeGenerator.ts +++ b/packages/cli/src/lib/codegen/CodeGenerator.ts @@ -20,6 +20,7 @@ import { SchemaComposer } from "../SchemaComposer"; import path from "path"; import { BindLanguage } from "@polywrap/schema-bind"; import { writeDirectorySync } from "@polywrap/os-js"; +import { CodegenOverrides, tryGetCodegenOverrides } from "./CodegenOverrides"; export interface CodeGeneratorConfig { project: Project; @@ -48,13 +49,16 @@ export class CodeGenerator { ); } + // Get overrides if they exist + const overrides = await tryGetCodegenOverrides(language); + await logActivity( this._config.project.logger, intlMsg.lib_codeGenerator_genCodeText(), intlMsg.lib_codeGenerator_genCodeError(), intlMsg.lib_codeGenerator_genCodeWarning(), async () => { - return this.runCodegen(bindLanguage); + return this.runCodegen(bindLanguage, overrides); } ); @@ -65,7 +69,8 @@ export class CodeGenerator { } } - protected async runCodegen(_: BindLanguage): Promise { + protected async runCodegen(_: BindLanguage, overrides?: CodegenOverrides): Promise { + // TODO: move codegen dir overrides into the new "language-overrides" const codegenDir = this._config.codegenDirAbs ? path.relative( this._config.project.getManifestDir(), @@ -73,10 +78,15 @@ export class CodeGenerator { ) : undefined; + const bindConfig = overrides ? await overrides.getSchemaBindConfig( + this._config.project + ) : {}; + const abi = await this._config.schemaComposer.getComposedAbis(); const binding = await this._config.project.generateSchemaBindings( abi, - codegenDir + codegenDir, + bindConfig ); resetDir(binding.outputDirAbs); diff --git a/packages/cli/src/lib/codegen/CodegenOverrides.ts b/packages/cli/src/lib/codegen/CodegenOverrides.ts new file mode 100644 index 0000000000..dd224839b5 --- /dev/null +++ b/packages/cli/src/lib/codegen/CodegenOverrides.ts @@ -0,0 +1,35 @@ +import { Project, AnyProjectManifest, AnyProjectManifestLanguage } from "../"; + +import path from "path"; +import fs from "fs"; + +export interface CodegenOverrides { + getSchemaBindConfig: ( + project: Project + ) => Promise>; +} + +export async function tryGetCodegenOverrides( + language: AnyProjectManifestLanguage +): Promise { + const modulePath = path.join( + __dirname, + "..", + "defaults", + "language-overrides", + language, + "index.js" + ); + let overrides: CodegenOverrides | undefined; + + if (fs.existsSync(modulePath)) { + const module = await import(modulePath); + + // Get any build overrides for the given build-image + if (module.getCodegenOverrides) { + overrides = module.getCodegenOverrides() as CodegenOverrides; + } + } + + return Promise.resolve(overrides); +} diff --git a/packages/cli/src/lib/codegen/index.ts b/packages/cli/src/lib/codegen/index.ts index fb9b3a2ef5..cd95e5446c 100644 --- a/packages/cli/src/lib/codegen/index.ts +++ b/packages/cli/src/lib/codegen/index.ts @@ -1,2 +1,3 @@ export * from "./CodeGenerator"; +export * from "./CodegenOverrides"; export * from "./ScriptCodeGenerator"; diff --git a/packages/cli/src/lib/defaults/language-overrides/wasm/golang/index.ts b/packages/cli/src/lib/defaults/language-overrides/wasm/golang/index.ts new file mode 100644 index 0000000000..8d383921ee --- /dev/null +++ b/packages/cli/src/lib/defaults/language-overrides/wasm/golang/index.ts @@ -0,0 +1,73 @@ +import { BuildOverrides } from "../../../../build-strategies"; +import { CodegenOverrides } from "../../../../codegen"; +import { PolywrapProject } from "../../../../project"; +import { resolvePathIfExists } from "../../../../system"; +import { intlMsg } from "../../../../intl"; + +import { PolywrapManifest } from "@polywrap/polywrap-manifest-types-js"; +import fs from "fs"; + +export function getBuildOverrides(): BuildOverrides { + return { + validateManifest: (manifest: PolywrapManifest) => { + getGoModulePath(manifest); + return Promise.resolve(); + } + } +} + +export function getCodegenOverrides(): CodegenOverrides { + return { + getSchemaBindConfig: async (project: PolywrapProject) => { + const manifest = await project.getManifest(); + const goModpath = getGoModulePath(manifest); + console.log(goModpath); + const goModuleName = readGoModuleName(goModpath); + console.log(goModuleName); + return { + goModuleName + }; + } + } +} + +function getGoModulePath(manifest: PolywrapManifest): string { + // Ensure `module: ...` is pointing to a `go.mod` file + const module = manifest.source.module; + if (!module || module.indexOf("go.mod") === -1) { + throw Error( + intlMsg.lib_wasm_golang_invalidModule({ path: module || "N/A" }) + ); + } + + // Ensure the `go.mod` file exists + const goModFile = resolvePathIfExists([module]); + if (!goModFile) { + throw Error( + intlMsg.commands_build_error_goModNotFound({ + paths: module, + }) + ); + } + + return goModFile; +} + +function readGoModuleName(filePath: string): string { + const goMod = fs.readFileSync(filePath, "utf-8"); + + if (!goMod) { + const noLoadMessage = intlMsg.lib_helpers_gomod_unableToLoad({ + path: filePath, + }); + throw Error(noLoadMessage); + } + + const regex = /module (.+)/m; + const module = goMod.match(regex); + if (!module || module.length != 2) { + throw Error(intlMsg.lib_helpers_gomod_invalid({ path: filePath })); + } + + return module[1]; +} diff --git a/packages/cli/src/lib/defaults/language-overrides/wasm/rust/index.ts b/packages/cli/src/lib/defaults/language-overrides/wasm/rust/index.ts new file mode 100644 index 0000000000..714b6c4736 --- /dev/null +++ b/packages/cli/src/lib/defaults/language-overrides/wasm/rust/index.ts @@ -0,0 +1,18 @@ +import { BuildOverrides } from "../../../../build-strategies"; +import { intlMsg } from "../../../../intl"; + +import { PolywrapManifest } from "@polywrap/polywrap-manifest-types-js"; + +export function getBuildOverrides(): BuildOverrides { + return { + validateManifest: (manifest: PolywrapManifest) => { + const module = manifest.source.module; + + if (module && module.indexOf("Cargo.toml") === -1) { + throw Error(intlMsg.lib_wasm_rust_invalidModule({ path: module })); + } + + return Promise.resolve(); + } + } +} From 1b1a0eed0593bd01d7a5977496c558a87d7fc6b4 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Thu, 6 Jul 2023 04:24:12 +0200 Subject: [PATCH 048/181] chore: building test case --- .../bind/src/__tests__/test-cases.spec.ts | 2 +- .../bind/src/bindings/golang/wasm/index.ts | 6 ++- .../wasm/go/001-sanity/module/go.mod | 7 +++ .../wasm/go/001-sanity/module/mod.go | 7 +++ .../wasm/go/001-sanity/polywrap.yaml | 7 +++ .../wasm/go/001-sanity/schema.graphql | 5 ++ .../wasm/go/001-sanity/this-builds/build.sh | 3 ++ .../go/001-sanity/this-builds/module/go.mod | 7 +++ .../go/001-sanity/this-builds/module/go.sum | 4 ++ .../this-builds/module/main/main.go | 21 ++++++++ .../module_wrapped/module_serialization.go | 53 +++++++++++++++++++ .../main/module_wrapped/module_wrapped.go | 13 +++++ .../module/main/types/module_args.go | 5 ++ .../go/001-sanity/this-builds/module/mod.go | 7 +++ .../001-sanity/this-builds/polywrap-build.sh | 9 ++++ .../go/001-sanity/this-builds/polywrap.yaml | 7 +++ .../001-sanity/this-builds/wasm-memory.json | 25 +++++++++ 17 files changed, 186 insertions(+), 2 deletions(-) create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/go.mod create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/mod.go create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/polywrap.yaml create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/schema.graphql create mode 100755 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/build.sh create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/go.mod create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/go.sum create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/main.go create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/module_wrapped/module_serialization.go create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/module_wrapped/module_wrapped.go create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/types/module_args.go create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/mod.go create mode 100755 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/polywrap-build.sh create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/polywrap.yaml create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/wasm-memory.json diff --git a/packages/schema/bind/src/__tests__/test-cases.spec.ts b/packages/schema/bind/src/__tests__/test-cases.spec.ts index d9a29f9024..6fd98b00d7 100644 --- a/packages/schema/bind/src/__tests__/test-cases.spec.ts +++ b/packages/schema/bind/src/__tests__/test-cases.spec.ts @@ -49,7 +49,7 @@ describe("Polywrap Binding Test Suite", () => { if (!bindOptions.config) { bindOptions.config = {}; } - bindOptions.config.golangModuleName = "github.com/testorg/testrepo"; + bindOptions.config.goModuleName = "github.com/testorg/testrepo"; } const output = bindSchema(bindOptions); diff --git a/packages/schema/bind/src/bindings/golang/wasm/index.ts b/packages/schema/bind/src/bindings/golang/wasm/index.ts index 8eb30576ad..72643987a5 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm/index.ts @@ -41,7 +41,11 @@ export const generateBinding: GenerateBindingFn = ( }; const output = result.output; const abi = applyTransforms(options.abi); - const goImport = options.config?.golangModuleName; + const goImport = options.config?.goModuleName; + + if (!goImport) { + throw Error("wasm/golang bindings requires the config property 'goModuleName' to be set"); + } // Generate object type folders if (abi.objectTypes) { diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/go.mod b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/go.mod new file mode 100644 index 0000000000..e6eb3ba066 --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/go.mod @@ -0,0 +1,7 @@ +module test.com/go-wrap-test + +go 1.18 + +require ( + github.com/polywrap/go-wrap 29691688fe81720d8fcbe1c19ba6492eed96f9ba +) diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/mod.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/mod.go new file mode 100644 index 0000000000..6266c33bf5 --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/mod.go @@ -0,0 +1,7 @@ +package module + +import "github.com/polywrap/cli/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/wrap/types" + +func Method(args *types.ArgsMethod) string { + return args.Arg +} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/polywrap.yaml b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/polywrap.yaml new file mode 100644 index 0000000000..a287b38b27 --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/polywrap.yaml @@ -0,0 +1,7 @@ +format: 0.4.0 +project: + name: ObjectTypes + type: wasm/golang +source: + schema: ./schema.graphql + module: ./module/go.mod diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/schema.graphql b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/schema.graphql new file mode 100644 index 0000000000..325e224971 --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/schema.graphql @@ -0,0 +1,5 @@ +type Module { + method( + arg: String! + ): String! +} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/build.sh b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/build.sh new file mode 100755 index 0000000000..c75f4d5791 --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/build.sh @@ -0,0 +1,3 @@ +cd module +tinygo build -o wrap.wasm -target ../wasm-memory.json ./main/main.go +wasm-snip -o ./wrap_snip.wasm wrap.wasm -p syscall runtime.ticks fd_write diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/go.mod b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/go.mod new file mode 100644 index 0000000000..06586f28bb --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/go.mod @@ -0,0 +1,7 @@ +module example.com/go-wrap-test + +go 1.18 + +require github.com/polywrap/go-wrap v0.0.0-20230706013513-29691688fe81 + +require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/go.sum b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/go.sum new file mode 100644 index 0000000000..4c9c458017 --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/go.sum @@ -0,0 +1,4 @@ +github.com/polywrap/go-wrap v0.0.0-20230706013513-29691688fe81 h1:6aeLyP7nvw2xD7rteUCFE+iB/3kvtRoqUuVcLaMLaW0= +github.com/polywrap/go-wrap v0.0.0-20230706013513-29691688fe81/go.mod h1:rxqhIFKUzn/M46+zjnA1RHlCzLGQn2BiLWalezhLj/k= +github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= +github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/main.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/main.go new file mode 100644 index 0000000000..dd51c895e5 --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/main.go @@ -0,0 +1,21 @@ +package main + +import ( + moduleWrapped "example.com/go-wrap-test/main/module_wrapped" + "github.com/polywrap/go-wrap/polywrap" +) + +//export _wrap_invoke +func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { + args := polywrap.WrapInvokeArgs(methodSize, argsSize) + switch args.Method { + case "method": + return polywrap.WrapInvoke(args, envSize, moduleWrapped.MethodWrapped) + default: + return polywrap.WrapInvoke(args, envSize, nil) + } +} + +func main() { + +} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/module_wrapped/module_serialization.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/module_wrapped/module_serialization.go new file mode 100644 index 0000000000..0a1e13d3db --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/module_wrapped/module_serialization.go @@ -0,0 +1,53 @@ +package module_wrapped + +import ( + . "example.com/go-wrap-test/main/types" + "github.com/polywrap/go-wrap/polywrap/msgpack" +) + +func DeserializeMethodArgs(argsBuf []byte) *MethodArgsMethod { + ctx := msgpack.NewContext("Deserializing module-type: Method") + reader := msgpack.NewReadDecoder(ctx, argsBuf) + + var ( + _arg string + _argSet bool + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type") + switch field { + case "arg": + reader.Context().Push(field, "string", "type found, reading property") + _arg = reader.ReadString() + _argSet = true + reader.Context().Pop() + } + reader.Context().Pop() + } + + if !_argSet { + panic(reader.Context().PrintWithContext("Missing required property: 'arg: String'")) + } + + return &MethodArgsMethod{ + Arg: _arg, + } +} + +func SerializeMethodResult(value string) []byte { + ctx := msgpack.NewContext("Serializing module-type: Method") + encoder := msgpack.NewWriteEncoder(ctx) + WriteMethodResult(encoder, value); + return encoder.Buffer() +} + +func WriteMethodResult(writer msgpack.Write, value string) { + writer.Context().Push("method", "string", "writing property") + { + v := value + writer.WriteString(v) + } + writer.Context().Pop() +} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/module_wrapped/module_wrapped.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/module_wrapped/module_wrapped.go new file mode 100644 index 0000000000..a5efc02dda --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/module_wrapped/module_wrapped.go @@ -0,0 +1,13 @@ +package module_wrapped + +import ( + methods "example.com/go-wrap-test" +) + +func MethodWrapped(argsBuf []byte, envSize uint32) []byte { + + args := DeserializeMethodArgs(argsBuf) + + result := methods.Method(args) + return SerializeMethodResult(result) +} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/types/module_args.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/types/module_args.go new file mode 100644 index 0000000000..b69e2ed8fa --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/types/module_args.go @@ -0,0 +1,5 @@ +package types + +type MethodArgsMethod struct { + Arg string +} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/mod.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/mod.go new file mode 100644 index 0000000000..53d394725c --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/mod.go @@ -0,0 +1,7 @@ +package module + +import "example.com/go-wrap-test/main/types" + +func Method(args *types.MethodArgsMethod) string { + return args.Arg +} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/polywrap-build.sh b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/polywrap-build.sh new file mode 100755 index 0000000000..74782a6e6e --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/polywrap-build.sh @@ -0,0 +1,9 @@ +set -e + +tinygo build -o main.wasm -target wasm-memory src/wrap/main.go + +# Make the build directory +rm -rf ./build +mkdir ./build + +wasm-snip -o ./build/wrap.wasm main.wasm -p syscall runtime.ticks fd_write diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/polywrap.yaml b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/polywrap.yaml new file mode 100644 index 0000000000..a287b38b27 --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/polywrap.yaml @@ -0,0 +1,7 @@ +format: 0.4.0 +project: + name: ObjectTypes + type: wasm/golang +source: + schema: ./schema.graphql + module: ./module/go.mod diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/wasm-memory.json b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/wasm-memory.json new file mode 100644 index 0000000000..e714908734 --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/wasm-memory.json @@ -0,0 +1,25 @@ +{ + "llvm-target": "wasm32-unknown-wasi", + "cpu": "generic", + "features": "+bulk-memory,+nontrapping-fptoint,+sign-ext", + "build-tags": ["tinygo.wasm"], + "goos": "js", + "goarch": "wasm", + "linker": "wasm-ld", + "libc": "wasi-libc", + "scheduler": "asyncify", + "default-stack-size": 16384, + "cflags": [ + "-mbulk-memory", + "-mnontrapping-fptoint", + "-msign-ext" + ], + "ldflags": [ + "--allow-undefined", + "--stack-first", + "--no-demangle", + "--import-memory" + ], + "emulator": "node {root}/targets/wasm_exec.js {}", + "wasm-abi": "js" +} \ No newline at end of file From 483fb8acafb48a89234bada309116846675afee2 Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Thu, 6 Jul 2023 22:56:34 +0800 Subject: [PATCH 049/181] wip: checkpoint --- .../strategies/DockerVMStrategy.ts | 2 +- .../wasm/golang/local/local.sh | 11 ++++ .../wasm/golang/local}/wasm-memory.json | 0 .../wasm/golang/vm/Dockerfile | 10 +++- .../wasm/golang/vm/wasm-memory.json | 26 +++++++++ .../project/manifests/polywrap/languages.ts | 2 + .../wasm/go/001-sanity/module/go.mod | 8 +-- .../wasm/go/001-sanity/module/go.sum | 4 ++ .../wasm/go/001-sanity/module/main/main.go | 21 +++++++ .../module_wrapped/module_serialization.go | 53 ++++++++++++++++++ .../main/module_wrapped/module_wrapped.go | 13 +++++ .../module/main/types/module_args.go | 5 ++ .../wasm/go/001-sanity/module/mod.go | 4 +- .../wasm/go/001-sanity/module/wrap.wasm | Bin 0 -> 481987 bytes .../wasm/go/001-sanity/module/wrap_snip.wasm | Bin 0 -> 198443 bytes .../001-sanity/this-builds/module/wrap.wasm | Bin 0 -> 482011 bytes .../this-builds/module/wrap_snip.wasm | Bin 0 -> 198443 bytes 17 files changed, 151 insertions(+), 8 deletions(-) create mode 100644 packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh rename packages/{test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds => cli/src/lib/defaults/build-strategies/wasm/golang/local}/wasm-memory.json (100%) create mode 100644 packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-memory.json create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/go.sum create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/main.go create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_serialization.go create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_wrapped.go create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/types/module_args.go create mode 100755 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/wrap.wasm create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/wrap_snip.wasm create mode 100755 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/wrap.wasm create mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/wrap_snip.wasm diff --git a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts index 5ac3ab5285..47dfac8cdc 100644 --- a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts +++ b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts @@ -45,7 +45,7 @@ const CONFIGS: Record = { }, "wasm/golang": { defaultIncludes: ["go.mod", "go.sum"], - baseImage: "consideritdone/polywrap-base-go", + baseImage: "polywrap/vm-base-go", version: "0.1.0", }, }; diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh new file mode 100644 index 0000000000..0d936dfb13 --- /dev/null +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh @@ -0,0 +1,11 @@ +rm -Rf build/ +mkdir build/ + +cd module + +tinygo build -o ../build/wrap.wasm -target ../.polywrap/wasm/build/strategy-used/wasm-memory.json ./main/main.go +wasm-snip -o ../build/wrap_snip.wasm ../build/wrap.wasm -p syscall runtime.ticks fd_write + +cd ../build +rm wrap.wasm +mv wrap_snip.wasm wrap.wasm diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/wasm-memory.json b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/wasm-memory.json similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/wasm-memory.json rename to packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/wasm-memory.json diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile index b4182dac01..5eb21a821a 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile @@ -1,2 +1,10 @@ -FROM consideritdone/polywrap-base-go:0.1.0 +FROM --platform=arm64 rust:1.60.0 as rust + +RUN cargo install -f wasm-snip + +FROM --platform=arm64 tinygo/tinygo:0.24.0 + +# Copy wasm-snip +COPY --from=rust /usr/local/cargo/bin/wasm-snip /usr/local/bin/ +COPY wasm-memory.json /usr/local/tinygo/targets/ WORKDIR /project diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-memory.json b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-memory.json new file mode 100644 index 0000000000..54768a7408 --- /dev/null +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-memory.json @@ -0,0 +1,26 @@ + +{ + "llvm-target": "wasm32-unknown-wasi", + "cpu": "generic", + "features": "+bulk-memory,+nontrapping-fptoint,+sign-ext", + "build-tags": ["tinygo.wasm"], + "goos": "js", + "goarch": "wasm", + "linker": "wasm-ld", + "libc": "wasi-libc", + "scheduler": "asyncify", + "default-stack-size": 16384, + "cflags": [ + "-mbulk-memory", + "-mnontrapping-fptoint", + "-msign-ext" + ], + "ldflags": [ + "--allow-undefined", + "--stack-first", + "--no-demangle", + "--import-memory" + ], + "emulator": "node {root}/targets/wasm_exec.js {}", + "wasm-abi": "js" +} \ No newline at end of file diff --git a/packages/cli/src/lib/project/manifests/polywrap/languages.ts b/packages/cli/src/lib/project/manifests/polywrap/languages.ts index 9fcf065408..5a3e8897fe 100644 --- a/packages/cli/src/lib/project/manifests/polywrap/languages.ts +++ b/packages/cli/src/lib/project/manifests/polywrap/languages.ts @@ -51,6 +51,8 @@ export function polywrapManifestOverrideCodegenDir( // the codegen directory to be `./src/wrap` case "wasm/rust": return "./src/wrap"; + case "wasm/golang": + return "./main"; default: return undefined; } diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/go.mod b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/go.mod index e6eb3ba066..24d82683b1 100644 --- a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/go.mod +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/go.mod @@ -1,7 +1,7 @@ -module test.com/go-wrap-test +module example.com/go-wrap-test go 1.18 -require ( - github.com/polywrap/go-wrap 29691688fe81720d8fcbe1c19ba6492eed96f9ba -) +require github.com/polywrap/go-wrap v0.0.0-20230706013513-29691688fe81 + +require github.com/valyala/fastjson v1.6.3 // indirect \ No newline at end of file diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/go.sum b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/go.sum new file mode 100644 index 0000000000..4c9c458017 --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/go.sum @@ -0,0 +1,4 @@ +github.com/polywrap/go-wrap v0.0.0-20230706013513-29691688fe81 h1:6aeLyP7nvw2xD7rteUCFE+iB/3kvtRoqUuVcLaMLaW0= +github.com/polywrap/go-wrap v0.0.0-20230706013513-29691688fe81/go.mod h1:rxqhIFKUzn/M46+zjnA1RHlCzLGQn2BiLWalezhLj/k= +github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= +github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/main.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/main.go new file mode 100644 index 0000000000..dd51c895e5 --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/main.go @@ -0,0 +1,21 @@ +package main + +import ( + moduleWrapped "example.com/go-wrap-test/main/module_wrapped" + "github.com/polywrap/go-wrap/polywrap" +) + +//export _wrap_invoke +func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { + args := polywrap.WrapInvokeArgs(methodSize, argsSize) + switch args.Method { + case "method": + return polywrap.WrapInvoke(args, envSize, moduleWrapped.MethodWrapped) + default: + return polywrap.WrapInvoke(args, envSize, nil) + } +} + +func main() { + +} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_serialization.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_serialization.go new file mode 100644 index 0000000000..0a1e13d3db --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_serialization.go @@ -0,0 +1,53 @@ +package module_wrapped + +import ( + . "example.com/go-wrap-test/main/types" + "github.com/polywrap/go-wrap/polywrap/msgpack" +) + +func DeserializeMethodArgs(argsBuf []byte) *MethodArgsMethod { + ctx := msgpack.NewContext("Deserializing module-type: Method") + reader := msgpack.NewReadDecoder(ctx, argsBuf) + + var ( + _arg string + _argSet bool + ) + + for i := int32(reader.ReadMapLength()); i > 0; i-- { + field := reader.ReadString() + reader.Context().Push(field, "unknown", "searching for property type") + switch field { + case "arg": + reader.Context().Push(field, "string", "type found, reading property") + _arg = reader.ReadString() + _argSet = true + reader.Context().Pop() + } + reader.Context().Pop() + } + + if !_argSet { + panic(reader.Context().PrintWithContext("Missing required property: 'arg: String'")) + } + + return &MethodArgsMethod{ + Arg: _arg, + } +} + +func SerializeMethodResult(value string) []byte { + ctx := msgpack.NewContext("Serializing module-type: Method") + encoder := msgpack.NewWriteEncoder(ctx) + WriteMethodResult(encoder, value); + return encoder.Buffer() +} + +func WriteMethodResult(writer msgpack.Write, value string) { + writer.Context().Push("method", "string", "writing property") + { + v := value + writer.WriteString(v) + } + writer.Context().Pop() +} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_wrapped.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_wrapped.go new file mode 100644 index 0000000000..a5efc02dda --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_wrapped.go @@ -0,0 +1,13 @@ +package module_wrapped + +import ( + methods "example.com/go-wrap-test" +) + +func MethodWrapped(argsBuf []byte, envSize uint32) []byte { + + args := DeserializeMethodArgs(argsBuf) + + result := methods.Method(args) + return SerializeMethodResult(result) +} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/types/module_args.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/types/module_args.go new file mode 100644 index 0000000000..b69e2ed8fa --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/types/module_args.go @@ -0,0 +1,5 @@ +package types + +type MethodArgsMethod struct { + Arg string +} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/mod.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/mod.go index 6266c33bf5..53d394725c 100644 --- a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/mod.go +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/mod.go @@ -1,7 +1,7 @@ package module -import "github.com/polywrap/cli/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/wrap/types" +import "example.com/go-wrap-test/main/types" -func Method(args *types.ArgsMethod) string { +func Method(args *types.MethodArgsMethod) string { return args.Arg } diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/wrap.wasm b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/wrap.wasm new file mode 100755 index 0000000000000000000000000000000000000000..ee4d20906fd806e77883706b7a34fcab22fc8038 GIT binary patch literal 481987 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

        sHiGt_%Q7UO}=;x`-IULXz!o|E(`BftDxt? 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₊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 SbQ77+<*i-EtH-k&h5jE!*vS(B literal 0 HcmV?d00001 diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/wrap_snip.wasm b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/wrap_snip.wasm new file mode 100644 index 0000000000000000000000000000000000000000..d68c73b42607a54f25b8e538e9f3cea83f4d4704 GIT binary patch literal 198443 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 Date: Thu, 6 Jul 2023 23:41:35 +0800 Subject: [PATCH 050/181] wip: working local build --- packages/cli/src/lib/project/PolywrapProject.ts | 11 +++++++++++ .../src/lib/project/manifests/polywrap/languages.ts | 2 +- .../schema/bind/src/bindings/golang/wasm/index.ts | 4 ++-- .../bindings/golang/wasm/templates/main-go.mustache | 4 ++-- .../%type%Serialization-go.mustache | 4 ++-- .../%type%Wrapped-go.mustache | 4 ++-- .../module-type/types/%type%Args-go.mustache | 2 +- .../wasm/go/001-sanity/module/main/main.go | 1 - .../main/module_wrapped/module_serialization.go | 2 +- .../module/main/module_wrapped/module_wrapped.go | 2 +- .../wasm/{go/001-sanity => }/this-builds/build.sh | 0 .../{go/001-sanity => }/this-builds/module/go.mod | 0 .../{go/001-sanity => }/this-builds/module/go.sum | 0 .../001-sanity => }/this-builds/module/main/main.go | 0 .../main/module_wrapped/module_serialization.go | 0 .../module/main/module_wrapped/module_wrapped.go | 0 .../this-builds/module/main/types/module_args.go | 0 .../{go/001-sanity => }/this-builds/module/mod.go | 0 .../001-sanity => }/this-builds/module/wrap.wasm | Bin .../this-builds/module/wrap_snip.wasm | Bin .../001-sanity => }/this-builds/polywrap-build.sh | 0 .../{go/001-sanity => }/this-builds/polywrap.yaml | 0 22 files changed, 23 insertions(+), 13 deletions(-) rename packages/schema/bind/src/bindings/golang/wasm/templates/module-type/{module => module_wrapped}/%type%Serialization-go.mustache (95%) rename packages/schema/bind/src/bindings/golang/wasm/templates/module-type/{module => module_wrapped}/%type%Wrapped-go.mustache (91%) rename packages/test-cases/cases/cli/build-cmd/wasm/{go/001-sanity => }/this-builds/build.sh (100%) rename packages/test-cases/cases/cli/build-cmd/wasm/{go/001-sanity => }/this-builds/module/go.mod (100%) rename packages/test-cases/cases/cli/build-cmd/wasm/{go/001-sanity => }/this-builds/module/go.sum (100%) rename packages/test-cases/cases/cli/build-cmd/wasm/{go/001-sanity => }/this-builds/module/main/main.go (100%) rename packages/test-cases/cases/cli/build-cmd/wasm/{go/001-sanity => }/this-builds/module/main/module_wrapped/module_serialization.go (100%) rename packages/test-cases/cases/cli/build-cmd/wasm/{go/001-sanity => }/this-builds/module/main/module_wrapped/module_wrapped.go (100%) rename packages/test-cases/cases/cli/build-cmd/wasm/{go/001-sanity => }/this-builds/module/main/types/module_args.go (100%) rename packages/test-cases/cases/cli/build-cmd/wasm/{go/001-sanity => }/this-builds/module/mod.go (100%) rename packages/test-cases/cases/cli/build-cmd/wasm/{go/001-sanity => }/this-builds/module/wrap.wasm (100%) rename packages/test-cases/cases/cli/build-cmd/wasm/{go/001-sanity => }/this-builds/module/wrap_snip.wasm (100%) rename packages/test-cases/cases/cli/build-cmd/wasm/{go/001-sanity => }/this-builds/polywrap-build.sh (100%) rename packages/test-cases/cases/cli/build-cmd/wasm/{go/001-sanity => }/this-builds/polywrap.yaml (100%) diff --git a/packages/cli/src/lib/project/PolywrapProject.ts b/packages/cli/src/lib/project/PolywrapProject.ts index 8aed37043b..39465bf236 100644 --- a/packages/cli/src/lib/project/PolywrapProject.ts +++ b/packages/cli/src/lib/project/PolywrapProject.ts @@ -150,6 +150,7 @@ export class PolywrapProject extends Project { bindConfig?: Record ): Promise { const manifest = await this.getManifest(); + console.log("GENERATION SUB PATH", generationSubPath) const codegenDirectory = await this.getGenerationDirectory( generationSubPath ); @@ -363,6 +364,16 @@ export class PolywrapProject extends Project { // 4. Use the default defaultDir; + console.log("#######################"); + console.log(useDefinedPath); + console.log( + polywrapManifestOverrideCodegenDir( + manifest.project.type as PolywrapManifestLanguage + ) + ); + console.log(genPath); + console.log("##############################"); + if (path.isAbsolute(genPath)) { return genPath; } else { diff --git a/packages/cli/src/lib/project/manifests/polywrap/languages.ts b/packages/cli/src/lib/project/manifests/polywrap/languages.ts index 5a3e8897fe..12fc2d4fb2 100644 --- a/packages/cli/src/lib/project/manifests/polywrap/languages.ts +++ b/packages/cli/src/lib/project/manifests/polywrap/languages.ts @@ -52,7 +52,7 @@ export function polywrapManifestOverrideCodegenDir( case "wasm/rust": return "./src/wrap"; case "wasm/golang": - return "./main"; + return "./module/main"; default: return undefined; } diff --git a/packages/schema/bind/src/bindings/golang/wasm/index.ts b/packages/schema/bind/src/bindings/golang/wasm/index.ts index 72643987a5..5910015b9d 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm/index.ts @@ -178,9 +178,9 @@ export const generateBinding: GenerateBindingFn = ( }); output.entries.push({ type: "Directory", - name: "module", + name: "module_wrapped", data: renderTemplates( - templatePath("module-type/module"), + templatePath("module-type/module_wrapped"), { importedTypes, goImport, ...abi.moduleType }, subTemplates ), diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache index 314c61d9ab..9268da2bff 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache @@ -1,7 +1,7 @@ package main import ( - "{{goImport}}/src/wrap/module" + moduleWrapped "{{goImport}}/main/module_wrapped" "github.com/polywrap/go-wrap/polywrap" ) @@ -12,7 +12,7 @@ func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { {{#moduleType}} {{#methods}} case "{{name}}": - return polywrap.WrapInvoke(args, envSize, module.{{#toUpper}}{{name}}{{/toUpper}}Wrapped) + return polywrap.WrapInvoke(args, envSize, moduleWrapped.{{#toUpper}}{{name}}{{/toUpper}}Wrapped) {{/methods}} {{/moduleType}} default: diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache similarity index 95% rename from packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache index 330361cbf3..9b77f51089 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache @@ -1,9 +1,9 @@ package module {{#makeImports}} github.com/polywrap/go-wrap/polywrap/msgpack, - . {{goImport}}/src/wrap/types, + . {{goImport}}/main/types, {{#importedTypes}} - . {{goImport}}/src/wrap/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, + . {{goImport}}/main/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, {{/importedTypes}} {{#methods}} {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache similarity index 91% rename from packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache index ca99702f61..847825d77b 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache @@ -1,7 +1,7 @@ package module {{#makeImports}} - {{#methods}}{{#env}}github.com/polywrap/go-wrap/polywrap,. {{goImport}}/src/wrap/types,{{/env}}{{/methods}} - {{goImport}}/module as methods, + {{#methods}}{{#env}}github.com/polywrap/go-wrap/polywrap,. {{goImport}}/main/types,{{/env}}{{/methods}} + {{goImport}} as methods, {{/makeImports}} {{#methods}} func {{#toUpper}}{{name}}{{/toUpper}}Wrapped(argsBuf []byte, envSize uint32) []byte { diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache index 424f8ed842..153e903ae0 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache @@ -1,7 +1,7 @@ package types {{#makeImports}} {{#importedTypes}} - . {{goImport}}/src/wrap/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, + . {{goImport}}/main/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, {{/importedTypes}} {{#methods}} {{#arguments}} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/main.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/main.go index dd51c895e5..9d976ff215 100644 --- a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/main.go +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/main.go @@ -17,5 +17,4 @@ func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { } func main() { - } diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_serialization.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_serialization.go index 0a1e13d3db..5fcee5679a 100644 --- a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_serialization.go +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_serialization.go @@ -1,4 +1,4 @@ -package module_wrapped +package module import ( . "example.com/go-wrap-test/main/types" diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_wrapped.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_wrapped.go index a5efc02dda..fa2ae39875 100644 --- a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_wrapped.go +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_wrapped.go @@ -1,4 +1,4 @@ -package module_wrapped +package module import ( methods "example.com/go-wrap-test" diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/build.sh b/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/build.sh similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/build.sh rename to packages/test-cases/cases/cli/build-cmd/wasm/this-builds/build.sh diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/go.mod b/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/go.mod similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/go.mod rename to packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/go.mod diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/go.sum b/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/go.sum similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/go.sum rename to packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/go.sum diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/main.go b/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/main.go similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/main.go rename to packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/main.go diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/module_wrapped/module_serialization.go b/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/module_wrapped/module_serialization.go similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/module_wrapped/module_serialization.go rename to packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/module_wrapped/module_serialization.go diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/module_wrapped/module_wrapped.go b/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/module_wrapped/module_wrapped.go similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/module_wrapped/module_wrapped.go rename to packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/module_wrapped/module_wrapped.go diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/types/module_args.go b/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/types/module_args.go similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/main/types/module_args.go rename to packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/types/module_args.go diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/mod.go b/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/mod.go similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/mod.go rename to packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/mod.go diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/wrap.wasm b/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/wrap.wasm similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/wrap.wasm rename to packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/wrap.wasm diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/wrap_snip.wasm b/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/wrap_snip.wasm similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/module/wrap_snip.wasm rename to packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/wrap_snip.wasm diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/polywrap-build.sh b/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/polywrap-build.sh similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/polywrap-build.sh rename to packages/test-cases/cases/cli/build-cmd/wasm/this-builds/polywrap-build.sh diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/polywrap.yaml b/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/polywrap.yaml similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/this-builds/polywrap.yaml rename to packages/test-cases/cases/cli/build-cmd/wasm/this-builds/polywrap.yaml From 255dc1ace4ae4e3cfa8a5fcb1092226f6478bd4b Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Fri, 7 Jul 2023 00:10:35 +0800 Subject: [PATCH 051/181] wip: local strategy fully working --- packages/cli/src/commands/build.ts | 7 ++- .../wasm/golang/local/local.sh | 3 - .../wasm/golang/vm/Dockerfile | 4 +- .../wasm/go/001-sanity/module/wrap.wasm | Bin 481987 -> 0 bytes .../wasm/go/001-sanity/module/wrap_snip.wasm | Bin 198443 -> 0 bytes .../cli/build-cmd/wasm/this-builds/build.sh | 3 - .../build-cmd/wasm/this-builds/module/go.mod | 7 --- .../build-cmd/wasm/this-builds/module/go.sum | 4 -- .../wasm/this-builds/module/main/main.go | 21 ------- .../module_wrapped/module_serialization.go | 53 ------------------ .../main/module_wrapped/module_wrapped.go | 13 ----- .../module/main/types/module_args.go | 5 -- .../build-cmd/wasm/this-builds/module/mod.go | 7 --- .../wasm/this-builds/module/wrap.wasm | Bin 482011 -> 0 bytes .../wasm/this-builds/module/wrap_snip.wasm | Bin 198443 -> 0 bytes .../wasm/this-builds/polywrap-build.sh | 9 --- .../build-cmd/wasm/this-builds/polywrap.yaml | 7 --- 17 files changed, 6 insertions(+), 137 deletions(-) delete mode 100755 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/wrap.wasm delete mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/wrap_snip.wasm delete mode 100755 packages/test-cases/cases/cli/build-cmd/wasm/this-builds/build.sh delete mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/go.mod delete mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/go.sum delete mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/main.go delete mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/module_wrapped/module_serialization.go delete mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/module_wrapped/module_wrapped.go delete mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/types/module_args.go delete mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/mod.go delete mode 100755 packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/wrap.wasm delete mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/wrap_snip.wasm delete mode 100755 packages/test-cases/cases/cli/build-cmd/wasm/this-builds/polywrap-build.sh delete mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/this-builds/polywrap.yaml diff --git a/packages/cli/src/commands/build.ts b/packages/cli/src/commands/build.ts index 4fd735e068..695e132aee 100644 --- a/packages/cli/src/commands/build.ts +++ b/packages/cli/src/commands/build.ts @@ -15,6 +15,7 @@ import { polywrapManifestLanguages, pluginManifestLanguages, parseWrapperEnvsOption, + parseDirOptionNoDefault, } from "../lib"; import { CodeGenerator } from "../lib/codegen"; import { @@ -48,7 +49,7 @@ export interface BuildCommandOptions extends BaseCommandOptions { clientConfig: string | false; wrapperEnvs: string | false; noCodegen: boolean; - codegenDir: string; + codegenDir: string | false; watch: boolean; strategy: `${SupportedStrategies}`; } @@ -112,7 +113,7 @@ export const build: Command = { wrapperEnvs: options.wrapperEnvs || false, outputDir: parseDirOption(options.outputDir, defaultOutputDir), noCodegen: !options.codegen || false, - codegenDir: parseDirOption(options.codegenDir, DEFAULT_CODEGEN_DIR), + codegenDir: parseDirOptionNoDefault(options.codegenDir), strategy: options.strategy || defaultStrategy, watch: options.watch || false, verbose: options.verbose || false, @@ -241,7 +242,7 @@ async function run(options: Required) { const codeGenerator = new CodeGenerator({ project, schemaComposer, - codegenDirAbs: codegenDir, + codegenDirAbs: codegenDir || undefined, }); const codegenSuccess = await codeGenerator.generate(); diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh index 0d936dfb13..c02517347f 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh @@ -1,6 +1,3 @@ -rm -Rf build/ -mkdir build/ - cd module tinygo build -o ../build/wrap.wasm -target ../.polywrap/wasm/build/strategy-used/wasm-memory.json ./main/main.go diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile index 5eb21a821a..015f6ff9ce 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile @@ -1,8 +1,8 @@ -FROM --platform=arm64 rust:1.60.0 as rust +FROM rust:1.60.0 as rust RUN cargo install -f wasm-snip -FROM --platform=arm64 tinygo/tinygo:0.24.0 +FROM tinygo/tinygo:0.24.0 # Copy wasm-snip COPY --from=rust /usr/local/cargo/bin/wasm-snip /usr/local/bin/ diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/wrap.wasm b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/wrap.wasm deleted file mode 100755 index ee4d20906fd806e77883706b7a34fcab22fc8038..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 481987 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 0; i-- { - field := reader.ReadString() - reader.Context().Push(field, "unknown", "searching for property type") - switch field { - case "arg": - reader.Context().Push(field, "string", "type found, reading property") - _arg = reader.ReadString() - _argSet = true - reader.Context().Pop() - } - reader.Context().Pop() - } - - if !_argSet { - panic(reader.Context().PrintWithContext("Missing required property: 'arg: String'")) - } - - return &MethodArgsMethod{ - Arg: _arg, - } -} - -func SerializeMethodResult(value string) []byte { - ctx := msgpack.NewContext("Serializing module-type: Method") - encoder := msgpack.NewWriteEncoder(ctx) - WriteMethodResult(encoder, value); - return encoder.Buffer() -} - -func WriteMethodResult(writer msgpack.Write, value string) { - writer.Context().Push("method", "string", "writing property") - { - v := value - writer.WriteString(v) - } - writer.Context().Pop() -} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/module_wrapped/module_wrapped.go b/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/module_wrapped/module_wrapped.go deleted file mode 100644 index a5efc02dda..0000000000 --- a/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/module_wrapped/module_wrapped.go +++ /dev/null @@ -1,13 +0,0 @@ -package module_wrapped - -import ( - methods "example.com/go-wrap-test" -) - -func MethodWrapped(argsBuf []byte, envSize uint32) []byte { - - args := DeserializeMethodArgs(argsBuf) - - result := methods.Method(args) - return SerializeMethodResult(result) -} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/types/module_args.go b/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/types/module_args.go deleted file mode 100644 index b69e2ed8fa..0000000000 --- a/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/main/types/module_args.go +++ /dev/null @@ -1,5 +0,0 @@ -package types - -type MethodArgsMethod struct { - Arg string -} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/mod.go b/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/mod.go deleted file mode 100644 index 53d394725c..0000000000 --- a/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/mod.go +++ /dev/null @@ -1,7 +0,0 @@ -package module - -import "example.com/go-wrap-test/main/types" - -func Method(args *types.MethodArgsMethod) string { - return args.Arg -} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/wrap.wasm b/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/wrap.wasm deleted file mode 100755 index 9be041ebb3efe0e073057bc75e5b6809dcef7276..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 482011 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

              sHiGt_%Q7UO}=;x`-IULXz!o|E(`BftDxt? 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₊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 SbQ77+<*i-EtH-k&h5jE!*vS(B diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/wrap_snip.wasm b/packages/test-cases/cases/cli/build-cmd/wasm/this-builds/module/wrap_snip.wasm deleted file mode 100644 index d68c73b42607a54f25b8e538e9f3cea83f4d4704..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 198443 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 Date: Fri, 7 Jul 2023 00:13:25 +0800 Subject: [PATCH 052/181] refactor: remove debug leftover --- .../defaults/language-overrides/wasm/golang/index.ts | 12 +++++------- packages/cli/src/lib/project/PolywrapProject.ts | 11 ----------- 2 files changed, 5 insertions(+), 18 deletions(-) diff --git a/packages/cli/src/lib/defaults/language-overrides/wasm/golang/index.ts b/packages/cli/src/lib/defaults/language-overrides/wasm/golang/index.ts index 8d383921ee..248f9191f5 100644 --- a/packages/cli/src/lib/defaults/language-overrides/wasm/golang/index.ts +++ b/packages/cli/src/lib/defaults/language-overrides/wasm/golang/index.ts @@ -12,8 +12,8 @@ export function getBuildOverrides(): BuildOverrides { validateManifest: (manifest: PolywrapManifest) => { getGoModulePath(manifest); return Promise.resolve(); - } - } + }, + }; } export function getCodegenOverrides(): CodegenOverrides { @@ -21,14 +21,12 @@ export function getCodegenOverrides(): CodegenOverrides { getSchemaBindConfig: async (project: PolywrapProject) => { const manifest = await project.getManifest(); const goModpath = getGoModulePath(manifest); - console.log(goModpath); const goModuleName = readGoModuleName(goModpath); - console.log(goModuleName); return { - goModuleName + goModuleName, }; - } - } + }, + }; } function getGoModulePath(manifest: PolywrapManifest): string { diff --git a/packages/cli/src/lib/project/PolywrapProject.ts b/packages/cli/src/lib/project/PolywrapProject.ts index 39465bf236..8aed37043b 100644 --- a/packages/cli/src/lib/project/PolywrapProject.ts +++ b/packages/cli/src/lib/project/PolywrapProject.ts @@ -150,7 +150,6 @@ export class PolywrapProject extends Project { bindConfig?: Record ): Promise { const manifest = await this.getManifest(); - console.log("GENERATION SUB PATH", generationSubPath) const codegenDirectory = await this.getGenerationDirectory( generationSubPath ); @@ -364,16 +363,6 @@ export class PolywrapProject extends Project { // 4. Use the default defaultDir; - console.log("#######################"); - console.log(useDefinedPath); - console.log( - polywrapManifestOverrideCodegenDir( - manifest.project.type as PolywrapManifestLanguage - ) - ); - console.log(genPath); - console.log("##############################"); - if (path.isAbsolute(genPath)) { return genPath; } else { From e698d6def93c2dad7a972faf7cde831210ca6d4f Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Thu, 6 Jul 2023 21:20:31 +0200 Subject: [PATCH 053/181] feat: add golang vm base image --- .github/workflows/cd-containers.yaml | 12 +++++++++ .../wasm/golang/vm/Dockerfile | 10 ++++++++ .../build-strategies/wasm/golang/vm/NAME | 1 + .../build-strategies/wasm/golang/vm/VERSION | 1 + .../wasm/golang/vm/wasm-memory.json | 25 +++++++++++++++++++ 5 files changed, 49 insertions(+) create mode 100644 packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile create mode 100644 packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/NAME create mode 100644 packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION create mode 100644 packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-memory.json diff --git a/.github/workflows/cd-containers.yaml b/.github/workflows/cd-containers.yaml index 3479718c6c..b7d9fe1c29 100644 --- a/.github/workflows/cd-containers.yaml +++ b/.github/workflows/cd-containers.yaml @@ -42,6 +42,7 @@ jobs: run: | echo IMAGE_RS_VM_DIR=./packages/cli/src/lib/defaults/build-strategies/wasm/rust/vm >> $GITHUB_ENV echo IMAGE_AS_VM_DIR=./packages/cli/src/lib/defaults/build-strategies/wasm/assemblyscript/vm >> $GITHUB_ENV + echo IMAGE_GO_VM_DIR=./packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm >> $GITHUB_ENV - name: Read Image VERSION & NAME into env.IMAGE_..._VERSION/NAME run: | @@ -49,11 +50,14 @@ jobs: echo IMAGE_RS_VM_VERSION=$(cat $IMAGE_RS_VM_DIR/VERSION) >> $GITHUB_ENV echo IMAGE_AS_VM_NAME=$(cat $IMAGE_AS_VM_DIR/NAME) >> $GITHUB_ENV echo IMAGE_AS_VM_VERSION=$(cat $IMAGE_AS_VM_DIR/VERSION) >> $GITHUB_ENV + echo IMAGE_GO_VM_NAME=$(cat $IMAGE_GO_VM_DIR/NAME) >> $GITHUB_ENV + echo IMAGE_GO_VM_VERSION=$(cat $IMAGE_GO_VM_DIR/VERSION) >> $GITHUB_ENV - name: Check if image tags already exist run: | echo IMAGE_RS_VM_UNPUBLISHED=$(! curl -s "https://hub.docker.com/v2/repositories/$IMAGE_RS_VM_NAME/tags/$IMAGE_RS_VM_VERSION" | grep -q "error 404" > /dev/null ; echo $?) >> $GITHUB_ENV echo IMAGE_AS_VM_UNPUBLISHED=$(! curl -s "https://hub.docker.com/v2/repositories/$IMAGE_AS_VM_NAME/tags/$IMAGE_AS_VM_VERSION" | grep -q "error 404" > /dev/null ; echo $?) >> $GITHUB_ENV + echo IMAGE_GO_VM_UNPUBLISHED=$(! curl -s "https://hub.docker.com/v2/repositories/$IMAGE_GO_VM_NAME/tags/$IMAGE_GO_VM_VERSION" | grep -q "error 404" > /dev/null ; echo $?) >> $GITHUB_ENV - name: Build & Publish RS VM Image if: env.IMAGE_RS_VM_UNPUBLISHED == '1' @@ -70,3 +74,11 @@ jobs: docker buildx create --use --name as-vm-builder docker buildx build . --platform=linux/amd64,linux/arm64 -t $IMAGE_AS_VM_NAME:latest -t $IMAGE_AS_VM_NAME:$IMAGE_AS_VM_VERSION --output type=registry docker buildx rm as-vm-builder + + - name: Build & Publish GO VM Image + if: env.IMAGE_GO_VM_UNPUBLISHED == '1' + working-directory: ${{env.IMAGE_GO_VM_DIR}} + run: | + docker buildx create --use --name go-vm-builder + docker buildx build . --platform=linux/amd64,linux/arm64 -t $IMAGE_GO_VM_NAME:latest -t $IMAGE_GO_VM_NAME:$IMAGE_GO_VM_VERSION --output type=registry + docker buildx rm go-vm-builder diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile new file mode 100644 index 0000000000..5eb21a821a --- /dev/null +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile @@ -0,0 +1,10 @@ +FROM --platform=arm64 rust:1.60.0 as rust + +RUN cargo install -f wasm-snip + +FROM --platform=arm64 tinygo/tinygo:0.24.0 + +# Copy wasm-snip +COPY --from=rust /usr/local/cargo/bin/wasm-snip /usr/local/bin/ +COPY wasm-memory.json /usr/local/tinygo/targets/ +WORKDIR /project diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/NAME b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/NAME new file mode 100644 index 0000000000..97d7c2778e --- /dev/null +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/NAME @@ -0,0 +1 @@ +polywrap/vm-base-go \ No newline at end of file diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION new file mode 100644 index 0000000000..6c6aa7cb09 --- /dev/null +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION @@ -0,0 +1 @@ +0.1.0 \ No newline at end of file diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-memory.json b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-memory.json new file mode 100644 index 0000000000..0d97f75678 --- /dev/null +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-memory.json @@ -0,0 +1,25 @@ +{ + "llvm-target": "wasm32-unknown-wasi", + "cpu": "generic", + "features": "+bulk-memory,+nontrapping-fptoint,+sign-ext", + "build-tags": ["tinygo.wasm"], + "goos": "js", + "goarch": "wasm", + "linker": "wasm-ld", + "libc": "wasi-libc", + "scheduler": "asyncify", + "default-stack-size": 16384, + "cflags": [ + "-mbulk-memory", + "-mnontrapping-fptoint", + "-msign-ext" + ], + "ldflags": [ + "--allow-undefined", + "--stack-first", + "--no-demangle", + "--import-memory" + ], + "emulator": "node {root}/targets/wasm_exec.js {}", + "wasm-abi": "js" +} From 2497dc2e6a4f0fdc6eb264bb23b7fe292fdf5c67 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Thu, 6 Jul 2023 23:12:37 +0200 Subject: [PATCH 054/181] chore: update bindings --- .../schema/bind/src/bindings/golang/wasm/index.ts | 13 ++++++++++--- .../wasm/templates/{ => main}/main-go.mustache | 4 ++-- .../module_wrapped/%type%Serialization-go.mustache | 6 +++--- .../module_wrapped/%type%Wrapped-go.mustache | 6 +++--- .../module-type/types/%type%Args-go.mustache | 2 +- 5 files changed, 19 insertions(+), 12 deletions(-) rename packages/schema/bind/src/bindings/golang/wasm/templates/{ => main}/main-go.mustache (72%) diff --git a/packages/schema/bind/src/bindings/golang/wasm/index.ts b/packages/schema/bind/src/bindings/golang/wasm/index.ts index 5910015b9d..d9c97a1b3f 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm/index.ts @@ -216,9 +216,16 @@ export const generateBinding: GenerateBindingFn = ( } // Generate root entry file - output.entries.push( - ...renderTemplates(templatePath(""), { goImport, ...abi }, subTemplates) - ); + output.entries.push({ + type: "Directory", + name: "main", + data: renderTemplates( + templatePath("main"), + { goImport, ...abi }, + subTemplates + ), + }); + output.entries = mergePaths(output.entries); return result; diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/main/main-go.mustache similarity index 72% rename from packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache rename to packages/schema/bind/src/bindings/golang/wasm/templates/main/main-go.mustache index 9268da2bff..dfd495835a 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/main-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/main/main-go.mustache @@ -1,7 +1,7 @@ package main import ( - moduleWrapped "{{goImport}}/main/module_wrapped" + "{{goImport}}/module/wrap/module_wrapped" "github.com/polywrap/go-wrap/polywrap" ) @@ -12,7 +12,7 @@ func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { {{#moduleType}} {{#methods}} case "{{name}}": - return polywrap.WrapInvoke(args, envSize, moduleWrapped.{{#toUpper}}{{name}}{{/toUpper}}Wrapped) + return polywrap.WrapInvoke(args, envSize, module_wrapped.{{#toUpper}}{{name}}{{/toUpper}}Wrapped) {{/methods}} {{/moduleType}} default: diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache index 9b77f51089..d77db20f3f 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache @@ -1,9 +1,9 @@ -package module +package module_wrapped {{#makeImports}} github.com/polywrap/go-wrap/polywrap/msgpack, - . {{goImport}}/main/types, + . {{goImport}}/module/wrap/types, {{#importedTypes}} - . {{goImport}}/main/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, + . {{goImport}}/module/wrap/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, {{/importedTypes}} {{#methods}} {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache index 847825d77b..24ac51d231 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache @@ -1,7 +1,7 @@ -package module +package module_wrapped {{#makeImports}} - {{#methods}}{{#env}}github.com/polywrap/go-wrap/polywrap,. {{goImport}}/main/types,{{/env}}{{/methods}} - {{goImport}} as methods, + {{#methods}}{{#env}}github.com/polywrap/go-wrap/polywrap,. {{goImport}}/module/wrap/types,{{/env}}{{/methods}} + {{goImport}}/module as methods, {{/makeImports}} {{#methods}} func {{#toUpper}}{{name}}{{/toUpper}}Wrapped(argsBuf []byte, envSize uint32) []byte { diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache index 153e903ae0..d20db1c755 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache @@ -1,7 +1,7 @@ package types {{#makeImports}} {{#importedTypes}} - . {{goImport}}/main/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, + . {{goImport}}/module/wrap/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, {{/importedTypes}} {{#methods}} {{#arguments}} From 8259f248fdc2cd020252334e698c0ca0a8e712ff Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Thu, 6 Jul 2023 23:13:18 +0200 Subject: [PATCH 055/181] chore: update bind test-case --- .../bind/sanity/output/wasm-go/{ => main}/main.go | 10 +++++----- .../{module => module_wrapped}/module_serialization.go | 4 ++-- .../{module => module_wrapped}/module_wrapped.go | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) rename packages/test-cases/cases/bind/sanity/output/wasm-go/{ => main}/main.go (51%) rename packages/test-cases/cases/bind/sanity/output/wasm-go/{module => module_wrapped}/module_serialization.go (99%) rename packages/test-cases/cases/bind/sanity/output/wasm-go/{module => module_wrapped}/module_wrapped.go (94%) diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/main/main.go similarity index 51% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/main.go rename to packages/test-cases/cases/bind/sanity/output/wasm-go/main/main.go index 5a4fb1b074..4c9f9939cf 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/main.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/main/main.go @@ -1,7 +1,7 @@ package main import ( - "github.com/testorg/testrepo/src/wrap/module" + "github.com/testorg/testrepo/module/wrap/module_wrapped" "github.com/polywrap/go-wrap/polywrap" ) @@ -10,13 +10,13 @@ func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { args := polywrap.WrapInvokeArgs(methodSize, argsSize) switch args.Method { case "moduleMethod": - return polywrap.WrapInvoke(args, envSize, module.ModuleMethodWrapped) + return polywrap.WrapInvoke(args, envSize, module_wrapped.ModuleMethodWrapped) case "objectMethod": - return polywrap.WrapInvoke(args, envSize, module.ObjectMethodWrapped) + return polywrap.WrapInvoke(args, envSize, module_wrapped.ObjectMethodWrapped) case "optionalEnvMethod": - return polywrap.WrapInvoke(args, envSize, module.OptionalEnvMethodWrapped) + return polywrap.WrapInvoke(args, envSize, module_wrapped.OptionalEnvMethodWrapped) case "if": - return polywrap.WrapInvoke(args, envSize, module.IfWrapped) + return polywrap.WrapInvoke(args, envSize, module_wrapped.IfWrapped) default: return polywrap.WrapInvoke(args, envSize, nil) } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_serialization.go similarity index 99% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go rename to packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_serialization.go index 980351923c..e3e502b889 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_serialization.go @@ -1,7 +1,7 @@ -package module +package module_wrapped import ( - . "github.com/testorg/testrepo/src/wrap/types" + . "github.com/testorg/testrepo/module/wrap/types" "github.com/polywrap/go-wrap/polywrap/msgpack" ) diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_wrapped.go similarity index 94% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go rename to packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_wrapped.go index e9ff1de025..69e5da455d 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/module/module_wrapped.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_wrapped.go @@ -1,7 +1,7 @@ -package module +package module_wrapped import ( - . "github.com/testorg/testrepo/src/wrap/types" + . "github.com/testorg/testrepo/module/wrap/types" "github.com/polywrap/go-wrap/polywrap" methods "github.com/testorg/testrepo/module" ) From 8c8efcdc3c5c75d635e9800f5bc0a4f504445e3e Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Thu, 6 Jul 2023 23:45:39 +0200 Subject: [PATCH 056/181] chore: local build working for test project --- .../lib/build-strategies/BuildOverrides.ts | 4 +- .../src/lib/build-strategies/BuildStrategy.ts | 9 ++-- .../strategies/DockerVMStrategy.ts | 26 ++++----- .../wasm/golang/image/Dockerfile.mustache | 8 +-- .../wasm/golang/local/local.sh | 11 ++-- .../wasm/golang/local/wasm-memory.json | 48 ++++++++--------- .../wasm/golang/vm/vm-script.mustache | 6 ++- .../wasm/golang/vm/wasm-memory.json | 49 +++++++++-------- .../language-overrides/wasm/golang/index.ts | 1 + .../language-overrides/wasm/rust/index.ts | 3 +- .../project/manifests/polywrap/languages.ts | 2 +- .../bind/src/bindings/golang/wasm/index.ts | 5 ++ .../golang/wasm/templates/wrap-go.mustache | 1 + .../cases/bind/sanity/output/wasm-go/wrap.go | 1 + .../wasm/go/001-sanity/{module => }/go.mod | 2 +- .../wasm/go/001-sanity/{module => }/go.sum | 0 .../wasm/go/001-sanity/module/main/main.go | 20 ------- .../module_wrapped/module_serialization.go | 53 ------------------- .../main/module_wrapped/module_wrapped.go | 13 ----- .../module/main/types/module_args.go | 5 -- .../001-sanity/module/{mod.go => module.go} | 2 +- .../wasm/go/001-sanity/polywrap.yaml | 2 +- 22 files changed, 95 insertions(+), 176 deletions(-) create mode 100644 packages/schema/bind/src/bindings/golang/wasm/templates/wrap-go.mustache create mode 100644 packages/test-cases/cases/bind/sanity/output/wasm-go/wrap.go rename packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/{module => }/go.mod (67%) rename packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/{module => }/go.sum (100%) delete mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/main.go delete mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_serialization.go delete mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_wrapped.go delete mode 100644 packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/types/module_args.go rename packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/{mod.go => module.go} (62%) diff --git a/packages/cli/src/lib/build-strategies/BuildOverrides.ts b/packages/cli/src/lib/build-strategies/BuildOverrides.ts index cd1836af2b..38f0609917 100644 --- a/packages/cli/src/lib/build-strategies/BuildOverrides.ts +++ b/packages/cli/src/lib/build-strategies/BuildOverrides.ts @@ -5,9 +5,11 @@ import path from "path"; import fs from "fs"; export interface BuildOverrides { - validateManifest: ( + validateManifest?: ( manifest: PolywrapManifest ) => Promise; + + sourcesSubDirectory?: string; } export async function tryGetBuildOverrides( diff --git a/packages/cli/src/lib/build-strategies/BuildStrategy.ts b/packages/cli/src/lib/build-strategies/BuildStrategy.ts index 0e5054c0a0..8d521238ab 100644 --- a/packages/cli/src/lib/build-strategies/BuildStrategy.ts +++ b/packages/cli/src/lib/build-strategies/BuildStrategy.ts @@ -1,4 +1,4 @@ -import { tryGetBuildOverrides } from "./BuildOverrides"; +import { BuildOverrides, tryGetBuildOverrides } from "./BuildOverrides"; import { PolywrapProject } from "../project"; import fse from "fs-extra"; @@ -12,6 +12,7 @@ export interface BuildStrategyConfig { export abstract class BuildStrategy { protected project: PolywrapProject; protected outputDir: string; + protected overrides?: BuildOverrides; constructor({ project, outputDir }: BuildStrategyConfig) { this.project = project; @@ -44,11 +45,11 @@ export abstract class BuildStrategy { fse.copySync(buildStrategyDir, strategyUsedCacheDir); // Check if build overrides exist - const overrides = await tryGetBuildOverrides(language); + this.overrides = await tryGetBuildOverrides(language); // If they do, ensure the manifest if valid before build starts - if (overrides) { - await overrides.validateManifest( + if (this.overrides && this.overrides.validateManifest) { + await this.overrides.validateManifest( await this.project.getManifest() ); } diff --git a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts index 47dfac8cdc..8135c31f9b 100644 --- a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts +++ b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts @@ -138,21 +138,17 @@ export class DockerVMBuildStrategy extends BuildStrategy { // Copy sources and build if (buildManifestConfig.polywrap_module) { - // HACK: moduleDir is path to Cargo.toml in Rust - if (language === "wasm/rust") { - fse.copySync( - path.join(manifestDir, "src"), - path.join(this._volumePaths.project, "src") - ); - } else { - fse.copySync( - path.join(manifestDir, buildManifestConfig.polywrap_module.dir), - path.join( - this._volumePaths.project, - buildManifestConfig.polywrap_module.dir - ) - ); - } + const sourcesSubDirectory = + this.overrides?.sourcesSubDirectory || + buildManifestConfig.polywrap_module.dir; + + fse.copySync( + path.join(manifestDir, sourcesSubDirectory), + path.join( + this._volumePaths.project, + sourcesSubDirectory + ) + ); const scriptTemplate = fse.readFileSync( path.join( diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache index 9fcdde2e40..84b096a922 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache @@ -1,13 +1,15 @@ -FROM consideritdone/polywrap-base-go:0.1.0 +FROM polywrap/vm-base-go:0.1.0 WORKDIR /project COPY . . -RUN tinygo build -o main.wasm -target wasm-memory src/wrap/main.go +RUN go mod tidy + +RUN tinygo build -o main.wasm -target wasm-memory ./module/wrap/main/main.go # Make the build directory RUN rm -rf ./build RUN mkdir ./build -RUN wasm-snip -o ./build/wrap.wasm main.wasm -p syscall runtime.ticks fd_write +RUN wasm-snip -o ./build/wrap.wasm main.wasm -p syscall runtime.ticks fd_write tinygo diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh index c02517347f..9d6cf95724 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh @@ -1,8 +1,7 @@ -cd module +go mod tidy -tinygo build -o ../build/wrap.wasm -target ../.polywrap/wasm/build/strategy-used/wasm-memory.json ./main/main.go -wasm-snip -o ../build/wrap_snip.wasm ../build/wrap.wasm -p syscall runtime.ticks fd_write +tinygo build -o ./build/main.wasm -target ./.polywrap/wasm/build/strategy-used/wasm-memory.json ./module/wrap/main/main.go -cd ../build -rm wrap.wasm -mv wrap_snip.wasm wrap.wasm +wasm-snip -o ./build/wrap.wasm ./build/main.wasm -p syscall runtime.ticks fd_write tinygo + +rm ./build/main.wasm diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/wasm-memory.json b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/wasm-memory.json index e714908734..3ba36c6805 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/wasm-memory.json +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/wasm-memory.json @@ -1,25 +1,25 @@ { - "llvm-target": "wasm32-unknown-wasi", - "cpu": "generic", - "features": "+bulk-memory,+nontrapping-fptoint,+sign-ext", - "build-tags": ["tinygo.wasm"], - "goos": "js", - "goarch": "wasm", - "linker": "wasm-ld", - "libc": "wasi-libc", - "scheduler": "asyncify", - "default-stack-size": 16384, - "cflags": [ - "-mbulk-memory", - "-mnontrapping-fptoint", - "-msign-ext" - ], - "ldflags": [ - "--allow-undefined", - "--stack-first", - "--no-demangle", - "--import-memory" - ], - "emulator": "node {root}/targets/wasm_exec.js {}", - "wasm-abi": "js" -} \ No newline at end of file + "llvm-target": "wasm32-unknown-wasi", + "cpu": "generic", + "features": "+bulk-memory,+nontrapping-fptoint,+sign-ext", + "build-tags": ["tinygo.wasm"], + "goos": "js", + "goarch": "wasm", + "linker": "wasm-ld", + "libc": "wasi-libc", + "scheduler": "asyncify", + "default-stack-size": 16384, + "cflags": [ + "-mbulk-memory", + "-mnontrapping-fptoint", + "-msign-ext" + ], + "ldflags": [ + "--allow-undefined", + "--stack-first", + "--no-demangle", + "--import-memory" + ], + "emulator": "node {root}/targets/wasm_exec.js {}", + "wasm-abi": "js" +} diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache index 74782a6e6e..cbda5ef9eb 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache @@ -1,9 +1,11 @@ set -e -tinygo build -o main.wasm -target wasm-memory src/wrap/main.go +go mod tidy + +tinygo build -o main.wasm -target wasm-memory ./module/wrap/main/main.go # Make the build directory rm -rf ./build mkdir ./build -wasm-snip -o ./build/wrap.wasm main.wasm -p syscall runtime.ticks fd_write +wasm-snip -o ./build/wrap.wasm main.wasm -p syscall runtime.ticks fd_write tinygo diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-memory.json b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-memory.json index 54768a7408..3ba36c6805 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-memory.json +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-memory.json @@ -1,26 +1,25 @@ - { - "llvm-target": "wasm32-unknown-wasi", - "cpu": "generic", - "features": "+bulk-memory,+nontrapping-fptoint,+sign-ext", - "build-tags": ["tinygo.wasm"], - "goos": "js", - "goarch": "wasm", - "linker": "wasm-ld", - "libc": "wasi-libc", - "scheduler": "asyncify", - "default-stack-size": 16384, - "cflags": [ - "-mbulk-memory", - "-mnontrapping-fptoint", - "-msign-ext" - ], - "ldflags": [ - "--allow-undefined", - "--stack-first", - "--no-demangle", - "--import-memory" - ], - "emulator": "node {root}/targets/wasm_exec.js {}", - "wasm-abi": "js" -} \ No newline at end of file + "llvm-target": "wasm32-unknown-wasi", + "cpu": "generic", + "features": "+bulk-memory,+nontrapping-fptoint,+sign-ext", + "build-tags": ["tinygo.wasm"], + "goos": "js", + "goarch": "wasm", + "linker": "wasm-ld", + "libc": "wasi-libc", + "scheduler": "asyncify", + "default-stack-size": 16384, + "cflags": [ + "-mbulk-memory", + "-mnontrapping-fptoint", + "-msign-ext" + ], + "ldflags": [ + "--allow-undefined", + "--stack-first", + "--no-demangle", + "--import-memory" + ], + "emulator": "node {root}/targets/wasm_exec.js {}", + "wasm-abi": "js" +} diff --git a/packages/cli/src/lib/defaults/language-overrides/wasm/golang/index.ts b/packages/cli/src/lib/defaults/language-overrides/wasm/golang/index.ts index 248f9191f5..3c745d1f8a 100644 --- a/packages/cli/src/lib/defaults/language-overrides/wasm/golang/index.ts +++ b/packages/cli/src/lib/defaults/language-overrides/wasm/golang/index.ts @@ -13,6 +13,7 @@ export function getBuildOverrides(): BuildOverrides { getGoModulePath(manifest); return Promise.resolve(); }, + sourcesSubDirectory: "module" }; } diff --git a/packages/cli/src/lib/defaults/language-overrides/wasm/rust/index.ts b/packages/cli/src/lib/defaults/language-overrides/wasm/rust/index.ts index 714b6c4736..656c1c0807 100644 --- a/packages/cli/src/lib/defaults/language-overrides/wasm/rust/index.ts +++ b/packages/cli/src/lib/defaults/language-overrides/wasm/rust/index.ts @@ -13,6 +13,7 @@ export function getBuildOverrides(): BuildOverrides { } return Promise.resolve(); - } + }, + sourcesSubDirectory: "src" } } diff --git a/packages/cli/src/lib/project/manifests/polywrap/languages.ts b/packages/cli/src/lib/project/manifests/polywrap/languages.ts index 12fc2d4fb2..d4c49fdc2d 100644 --- a/packages/cli/src/lib/project/manifests/polywrap/languages.ts +++ b/packages/cli/src/lib/project/manifests/polywrap/languages.ts @@ -52,7 +52,7 @@ export function polywrapManifestOverrideCodegenDir( case "wasm/rust": return "./src/wrap"; case "wasm/golang": - return "./module/main"; + return "./module/wrap"; default: return undefined; } diff --git a/packages/schema/bind/src/bindings/golang/wasm/index.ts b/packages/schema/bind/src/bindings/golang/wasm/index.ts index d9c97a1b3f..4533a4f3c7 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm/index.ts @@ -226,6 +226,11 @@ export const generateBinding: GenerateBindingFn = ( ), }); + // Render the root directory + output.entries.push( + ...renderTemplates(templatePath(""), { goImport, ...abi }, subTemplates) + ); + output.entries = mergePaths(output.entries); return result; diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/wrap-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/wrap-go.mustache new file mode 100644 index 0000000000..a1080fa322 --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/wrap-go.mustache @@ -0,0 +1 @@ +package wrap diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/wrap.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/wrap.go new file mode 100644 index 0000000000..a1080fa322 --- /dev/null +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/wrap.go @@ -0,0 +1 @@ +package wrap diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/go.mod b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/go.mod similarity index 67% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/go.mod rename to packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/go.mod index 24d82683b1..06586f28bb 100644 --- a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/go.mod +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/go.mod @@ -4,4 +4,4 @@ go 1.18 require github.com/polywrap/go-wrap v0.0.0-20230706013513-29691688fe81 -require github.com/valyala/fastjson v1.6.3 // indirect \ No newline at end of file +require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/go.sum b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/go.sum similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/go.sum rename to packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/go.sum diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/main.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/main.go deleted file mode 100644 index 9d976ff215..0000000000 --- a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/main.go +++ /dev/null @@ -1,20 +0,0 @@ -package main - -import ( - moduleWrapped "example.com/go-wrap-test/main/module_wrapped" - "github.com/polywrap/go-wrap/polywrap" -) - -//export _wrap_invoke -func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { - args := polywrap.WrapInvokeArgs(methodSize, argsSize) - switch args.Method { - case "method": - return polywrap.WrapInvoke(args, envSize, moduleWrapped.MethodWrapped) - default: - return polywrap.WrapInvoke(args, envSize, nil) - } -} - -func main() { -} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_serialization.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_serialization.go deleted file mode 100644 index 5fcee5679a..0000000000 --- a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_serialization.go +++ /dev/null @@ -1,53 +0,0 @@ -package module - -import ( - . "example.com/go-wrap-test/main/types" - "github.com/polywrap/go-wrap/polywrap/msgpack" -) - -func DeserializeMethodArgs(argsBuf []byte) *MethodArgsMethod { - ctx := msgpack.NewContext("Deserializing module-type: Method") - reader := msgpack.NewReadDecoder(ctx, argsBuf) - - var ( - _arg string - _argSet bool - ) - - for i := int32(reader.ReadMapLength()); i > 0; i-- { - field := reader.ReadString() - reader.Context().Push(field, "unknown", "searching for property type") - switch field { - case "arg": - reader.Context().Push(field, "string", "type found, reading property") - _arg = reader.ReadString() - _argSet = true - reader.Context().Pop() - } - reader.Context().Pop() - } - - if !_argSet { - panic(reader.Context().PrintWithContext("Missing required property: 'arg: String'")) - } - - return &MethodArgsMethod{ - Arg: _arg, - } -} - -func SerializeMethodResult(value string) []byte { - ctx := msgpack.NewContext("Serializing module-type: Method") - encoder := msgpack.NewWriteEncoder(ctx) - WriteMethodResult(encoder, value); - return encoder.Buffer() -} - -func WriteMethodResult(writer msgpack.Write, value string) { - writer.Context().Push("method", "string", "writing property") - { - v := value - writer.WriteString(v) - } - writer.Context().Pop() -} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_wrapped.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_wrapped.go deleted file mode 100644 index fa2ae39875..0000000000 --- a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/module_wrapped/module_wrapped.go +++ /dev/null @@ -1,13 +0,0 @@ -package module - -import ( - methods "example.com/go-wrap-test" -) - -func MethodWrapped(argsBuf []byte, envSize uint32) []byte { - - args := DeserializeMethodArgs(argsBuf) - - result := methods.Method(args) - return SerializeMethodResult(result) -} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/types/module_args.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/types/module_args.go deleted file mode 100644 index b69e2ed8fa..0000000000 --- a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/main/types/module_args.go +++ /dev/null @@ -1,5 +0,0 @@ -package types - -type MethodArgsMethod struct { - Arg string -} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/mod.go b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/module.go similarity index 62% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/mod.go rename to packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/module.go index 53d394725c..5517c49168 100644 --- a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/mod.go +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/module.go @@ -1,6 +1,6 @@ package module -import "example.com/go-wrap-test/main/types" +import "example.com/go-wrap-test/module/wrap/types" func Method(args *types.MethodArgsMethod) string { return args.Arg diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/polywrap.yaml b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/polywrap.yaml index a287b38b27..07650dd125 100644 --- a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/polywrap.yaml +++ b/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/polywrap.yaml @@ -4,4 +4,4 @@ project: type: wasm/golang source: schema: ./schema.graphql - module: ./module/go.mod + module: ./go.mod From 88e8f9afbc1d60e74b9ec136457b46243cf6f1ce Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Thu, 6 Jul 2023 23:50:24 +0200 Subject: [PATCH 057/181] fix: properly support multi-platform builds --- .../lib/defaults/build-strategies/wasm/golang/vm/Dockerfile | 4 ++-- .../src/lib/defaults/build-strategies/wasm/golang/vm/VERSION | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile index 5eb21a821a..015f6ff9ce 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile @@ -1,8 +1,8 @@ -FROM --platform=arm64 rust:1.60.0 as rust +FROM rust:1.60.0 as rust RUN cargo install -f wasm-snip -FROM --platform=arm64 tinygo/tinygo:0.24.0 +FROM tinygo/tinygo:0.24.0 # Copy wasm-snip COPY --from=rust /usr/local/cargo/bin/wasm-snip /usr/local/bin/ diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION index 6c6aa7cb09..6da28dde76 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION @@ -1 +1 @@ -0.1.0 \ No newline at end of file +0.1.1 \ No newline at end of file From 015c7aa474512cc4f3b0b2f772faa6d240adffae Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Fri, 7 Jul 2023 00:28:56 +0200 Subject: [PATCH 058/181] chore: vm builds --- .../cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts index 8135c31f9b..397376e33b 100644 --- a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts +++ b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts @@ -46,7 +46,7 @@ const CONFIGS: Record = { "wasm/golang": { defaultIncludes: ["go.mod", "go.sum"], baseImage: "polywrap/vm-base-go", - version: "0.1.0", + version: "0.1.1", }, }; From fae0bd69183ef115a1880f2824ad138d1ca26518 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Fri, 7 Jul 2023 00:36:00 +0200 Subject: [PATCH 059/181] chore: add cli test cases for golang --- .github/workflows/ci-golang.yaml | 45 +++++++++++++++++++ packages/cli/jest.config.js | 3 +- packages/cli/jest.go.config.js | 22 +++++++++ packages/cli/package.json | 1 + .../cli/src/__tests__/e2e/build-go.spec.ts | 2 +- .../wasm/{go => golang}/001-sanity/go.mod | 0 .../wasm/{go => golang}/001-sanity/go.sum | 0 .../001-sanity/module/module.go | 0 .../{go => golang}/001-sanity/polywrap.yaml | 0 .../{go => golang}/001-sanity/schema.graphql | 0 .../008-sanity-golang/expected/stdout.json | 4 ++ .../cli/codegen/wasm/008-sanity-golang/go.mod | 7 +++ .../wasm/008-sanity-golang/module/module.go | 7 +++ .../wasm/008-sanity-golang/polywrap.yaml | 7 +++ .../wasm/008-sanity-golang/schema.graphql | 5 +++ 15 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/ci-golang.yaml create mode 100644 packages/cli/jest.go.config.js rename packages/test-cases/cases/cli/build-cmd/wasm/{go => golang}/001-sanity/go.mod (100%) rename packages/test-cases/cases/cli/build-cmd/wasm/{go => golang}/001-sanity/go.sum (100%) rename packages/test-cases/cases/cli/build-cmd/wasm/{go => golang}/001-sanity/module/module.go (100%) rename packages/test-cases/cases/cli/build-cmd/wasm/{go => golang}/001-sanity/polywrap.yaml (100%) rename packages/test-cases/cases/cli/build-cmd/wasm/{go => golang}/001-sanity/schema.graphql (100%) create mode 100644 packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/expected/stdout.json create mode 100644 packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/go.mod create mode 100644 packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/module/module.go create mode 100644 packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/polywrap.yaml create mode 100644 packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/schema.graphql diff --git a/.github/workflows/ci-golang.yaml b/.github/workflows/ci-golang.yaml new file mode 100644 index 0000000000..4a28418d0b --- /dev/null +++ b/.github/workflows/ci-golang.yaml @@ -0,0 +1,45 @@ +name: CI-Golang + +on: + push: + branches: + - origin + - origin-dev + pull_request: + +jobs: + Test-Cli: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Read .nvmrc + run: echo ::set-output name=NVMRC::$(cat .nvmrc) + id: nvm + + - name: Setup Node.js + uses: actions/setup-node@master + with: + node-version: '${{ steps.nvm.outputs.NVMRC }}' + + - name: Get yarn cache directory path + id: yarn-cache-dir-path + run: echo "::set-output name=dir::$(yarn cache dir)" + + - uses: actions/cache@v2 + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-yarn- + + - name: Install dependencies + run: yarn install --nonInteractive --frozen-lockfile --prefer-offline + + - name: Build + run: yarn build + + - name: Test + run: yarn test:golang + working-directory: ./packages/cli diff --git a/packages/cli/jest.config.js b/packages/cli/jest.config.js index aef0111dbf..57c9519473 100644 --- a/packages/cli/jest.config.js +++ b/packages/cli/jest.config.js @@ -11,7 +11,8 @@ module.exports = { modulePathIgnorePatterns: [ "/build", "/src/__tests__/project/.polywrap", - "/src/__tests__/e2e/build-rs.spec.ts" + "/src/__tests__/e2e/build-rs.spec.ts", + "/src/__tests__/e2e/build-go.spec.ts" ], testPathIgnorePatterns: [ "/src/__tests__/project/.polywrap" diff --git a/packages/cli/jest.go.config.js b/packages/cli/jest.go.config.js new file mode 100644 index 0000000000..7465b45559 --- /dev/null +++ b/packages/cli/jest.go.config.js @@ -0,0 +1,22 @@ +module.exports = { + collectCoverage: true, + preset: "ts-jest", + testEnvironment: "node", + globals: { + "ts-jest": { + diagnostics: false + }, + }, + modulePathIgnorePatterns: [ + "/build", + "/src/__tests__/project/.polywrap" + ], + testPathIgnorePatterns: [ + "/src/__tests__/project/.polywrap" + ], + transformIgnorePatterns: [ + "/src/__tests__/project/.polywrap" + ], + setupFilesAfterEnv: ["./jest.setup.js"], + testMatch: ["**/build-go.spec.ts"] +}; diff --git a/packages/cli/package.json b/packages/cli/package.json index d20311d753..ddcc04cf2b 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -36,6 +36,7 @@ "test:e2e:p1": "yarn test:cmd -- ./src/__tests__/e2e/p1/*.spec.ts", "test:e2e:p2": "yarn test:cmd -- ./src/__tests__/e2e/p2/*.spec.ts", "test:rust": "yarn test:cmd -- --config ./jest.rs.config.js", + "test:golang": "yarn test:cmd -- --config ./jest.go.config.js", "test:watch": "yarn test -- --watch" }, "resolutions": { diff --git a/packages/cli/src/__tests__/e2e/build-go.spec.ts b/packages/cli/src/__tests__/e2e/build-go.spec.ts index 138a00f6f4..8c9606fe0f 100644 --- a/packages/cli/src/__tests__/e2e/build-go.spec.ts +++ b/packages/cli/src/__tests__/e2e/build-go.spec.ts @@ -7,7 +7,7 @@ import path from "path"; jest.setTimeout(1500000); describe("e2e tests for build command", () => { - const testCaseRoot = path.join(GetPathToCliTestFiles(), "build-cmd/wasm/go"); + const testCaseRoot = path.join(GetPathToCliTestFiles(), "build-cmd/wasm/golang"); const testCases = fs .readdirSync(testCaseRoot, { withFileTypes: true }) .filter((dirent) => dirent.isDirectory()) diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/go.mod b/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/go.mod similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/go.mod rename to packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/go.mod diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/go.sum b/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/go.sum similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/go.sum rename to packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/go.sum diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/module.go b/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/module/module.go similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/module/module.go rename to packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/module/module.go diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/polywrap.yaml b/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/polywrap.yaml similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/polywrap.yaml rename to packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/polywrap.yaml diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/schema.graphql b/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/schema.graphql similarity index 100% rename from packages/test-cases/cases/cli/build-cmd/wasm/go/001-sanity/schema.graphql rename to packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/schema.graphql diff --git a/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/expected/stdout.json b/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/expected/stdout.json new file mode 100644 index 0000000000..735a6dca2c --- /dev/null +++ b/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/expected/stdout.json @@ -0,0 +1,4 @@ +{ + "stdout": "Types were generated successfully", + "exitCode": 0 +} diff --git a/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/go.mod b/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/go.mod new file mode 100644 index 0000000000..06586f28bb --- /dev/null +++ b/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/go.mod @@ -0,0 +1,7 @@ +module example.com/go-wrap-test + +go 1.18 + +require github.com/polywrap/go-wrap v0.0.0-20230706013513-29691688fe81 + +require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/module/module.go b/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/module/module.go new file mode 100644 index 0000000000..5517c49168 --- /dev/null +++ b/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/module/module.go @@ -0,0 +1,7 @@ +package module + +import "example.com/go-wrap-test/module/wrap/types" + +func Method(args *types.MethodArgsMethod) string { + return args.Arg +} diff --git a/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/polywrap.yaml b/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/polywrap.yaml new file mode 100644 index 0000000000..07650dd125 --- /dev/null +++ b/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/polywrap.yaml @@ -0,0 +1,7 @@ +format: 0.4.0 +project: + name: ObjectTypes + type: wasm/golang +source: + schema: ./schema.graphql + module: ./go.mod diff --git a/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/schema.graphql b/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/schema.graphql new file mode 100644 index 0000000000..3dc66d388a --- /dev/null +++ b/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/schema.graphql @@ -0,0 +1,5 @@ +type Module { + method( + arg: String! + ): String! +} \ No newline at end of file From f82f4f689590019a1e72277f2bbff432df732b31 Mon Sep 17 00:00:00 2001 From: krisbitney Date: Mon, 10 Jul 2023 12:28:48 -0500 Subject: [PATCH 060/181] reverted to use of mustache rust bindings (will update to bindgen wrap in different PR) --- packages/schema/bind/src/bindings/index.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/schema/bind/src/bindings/index.ts b/packages/schema/bind/src/bindings/index.ts index f446c1ebd4..84310656e1 100644 --- a/packages/schema/bind/src/bindings/index.ts +++ b/packages/schema/bind/src/bindings/index.ts @@ -18,9 +18,7 @@ export function getGenerateBindingFn( "https://github.com/polywrap/wrap-abi-bindgen/tree/dev/implementations/wrap-assemblyscript" ); case "wrap-rs": - return WrapBindgen.getGenerateBindingFn( - "https://github.com/polywrap/wrap-abi-bindgen/tree/kris/wrap-rust/implementations/wrap-rust" - ); + return Rust.Wasm.generateBinding; case "plugin-ts": return WrapBindgen.getGenerateBindingFn( "https://github.com/polywrap/wrap-abi-bindgen/tree/dev/implementations/plugin-typescript" From a2680a9bc21ebdb893c1961cb7cd1d18b3b15c05 Mon Sep 17 00:00:00 2001 From: krisbitney Date: Mon, 10 Jul 2023 13:59:07 -0500 Subject: [PATCH 061/181] rewrote IPFS deployer module using polywrap client --- .../lib/defaults/deploy-modules/ipfs/index.ts | 103 +++++++++++++++--- 1 file changed, 85 insertions(+), 18 deletions(-) diff --git a/packages/cli/src/lib/defaults/deploy-modules/ipfs/index.ts b/packages/cli/src/lib/defaults/deploy-modules/ipfs/index.ts index 9a9de9c00f..85c697e8f6 100644 --- a/packages/cli/src/lib/defaults/deploy-modules/ipfs/index.ts +++ b/packages/cli/src/lib/defaults/deploy-modules/ipfs/index.ts @@ -1,14 +1,73 @@ import { DeployModule } from "../../../deploy"; import { Uri } from "@polywrap/core-js"; - -// eslint-disable-next-line @typescript-eslint/no-require-imports,@typescript-eslint/no-var-requires,@typescript-eslint/naming-convention -const IPFSClient = require("ipfs-http-client"); -const { globSource } = IPFSClient; +import { PolywrapClient } from "@polywrap/client-js"; +import { DefaultBundle } from "@polywrap/client-config-builder-js"; +import fs from "fs"; const isValidUri = (uri: Uri) => uri.authority === "fs" || uri.authority === "file"; +interface FileEntry { + name: string; + data: Uint8Array; +} + +interface DirectoryEntry { + name: string; + directories?: DirectoryEntry[]; + files?: FileEntry[]; +} + +interface AddOptions { + pin?: boolean; + onlyHash?: boolean; + wrapWithDirectory?: boolean; +} + +interface AddResult { + name: string; + hash: string; + size: string; +} + +interface ArgsAddDir { + data: DirectoryEntry; + ipfsProvider: string; + timeout?: number; + addOptions?: AddOptions; +} + +const readDirContents = async ( + path: string, + dirName: string +): Promise => { + const dirents: fs.Dirent[] = await fs.promises.readdir(path, { + withFileTypes: true, + }); + const data: DirectoryEntry = { name: dirName }; + + for (const dirent of dirents) { + if (dirent.isDirectory()) { + const subDir = await readDirContents( + `${path}/${dirent.name}`, + `${dirName}/${dirent.name}` + ); + data.directories = data.directories ?? []; + data.directories?.push(subDir); + } else { + const fileData = await fs.promises.readFile(`${path}/${dirent.name}`); + data.files = data.files ?? []; + data.files?.push({ + name: dirent.name, + data: fileData, + }); + } + } + + return data; +}; + class IPFSDeployer implements DeployModule { async execute(uri: Uri, config?: { gatewayUri: string }): Promise { if (!isValidUri(uri)) { @@ -18,26 +77,34 @@ class IPFSDeployer implements DeployModule { } const path = uri.path; + const data: DirectoryEntry = await readDirContents(path, ""); - const ipfsUrl = config?.gatewayUri ?? "http://localhost:5001"; + const ipfsProvider = config?.gatewayUri ?? "http://localhost:5001"; - const client = new IPFSClient({ url: ipfsUrl }); - const globOptions = { - recursive: true, + const args: ArgsAddDir = { + data, + ipfsProvider, + addOptions: { + pin: true, + wrapWithDirectory: false, + }, + timeout: 10000, }; - const addOptions = { - wrapWithDirectory: false, - }; + const client = new PolywrapClient(); - let rootCID = ""; + const result = await client.invoke({ + uri: DefaultBundle.embeds.ipfsHttpClient.uri.uri, + method: "addDir", + args: (args as unknown) as Record, + }); - for await (const file of client.addAll( - globSource(path, globOptions), - addOptions - )) { - if (file.path.indexOf("/") === -1) { - rootCID = file.cid.toString(); + if (!result.ok) throw result.error; + + let rootCID = ""; + for (const addResult of result.value) { + if (addResult.name.indexOf("/") === -1) { + rootCID = addResult.hash; } } From 43c4ed1fc2692f2bbd82ed125e65755ff1af8cc4 Mon Sep 17 00:00:00 2001 From: krisbitney Date: Mon, 10 Jul 2023 14:25:27 -0500 Subject: [PATCH 062/181] removed unused bindings from schema-bind package --- .../src/bindings/assemblyscript/functions.ts | 254 ------------------ .../bind/src/bindings/assemblyscript/index.ts | 3 - .../bind/src/bindings/assemblyscript/types.ts | 233 ---------------- .../src/bindings/assemblyscript/wasm/index.ts | 195 -------------- .../templates/$deserialize_array.mustache | 23 -- .../wasm/templates/$deserialize_enum.mustache | 26 -- .../templates/$deserialize_map_value.mustache | 23 -- .../templates/$deserialize_object.mustache | 9 - .../templates/$serialization_imports.mustache | 12 - .../wasm/templates/$serialize_array.mustache | 21 -- .../wasm/templates/$serialize_enum.mustache | 6 - .../templates/$serialize_map_value.mustache | 35 --- .../wasm/templates/$serialize_object.mustache | 10 - .../wasm/templates/entry-ts.mustache | 57 ---- .../templates/enum-type/index-ts.mustache | 35 --- .../wasm/templates/env-type/index-ts.mustache | 37 --- .../env-type/serialization-ts.mustache | 149 ---------- .../imported/enum-type/index-ts.mustache | 35 --- .../imported/env-type/index-ts.mustache | 42 --- .../env-type/serialization-ts.mustache | 149 ---------- .../wasm/templates/imported/index-ts.mustache | 12 - .../imported/module-type/index-ts.mustache | 91 ------- .../module-type/serialization-ts.mustache | 250 ----------------- .../imported/object-type/index-ts.mustache | 40 --- .../object-type/serialization-ts.mustache | 149 ---------- .../wasm/templates/index-ts.mustache | 55 ---- .../interface-type/index-ts.mustache | 23 -- .../templates/module-type/index-ts.mustache | 14 - .../templates/module-type/module-ts.mustache | 20 -- .../module-type/serialization-ts.mustache | 248 ----------------- .../templates/module-type/wrapped-ts.mustache | 49 ---- .../templates/object-type/index-ts.mustache | 37 --- .../object-type/serialization-ts.mustache | 149 ---------- packages/schema/bind/src/bindings/index.ts | 3 +- .../bind/src/bindings/python/functions.ts | 174 ------------ .../schema/bind/src/bindings/python/index.ts | 3 - .../bind/src/bindings/python/plugin/index.ts | 86 ------ .../plugin/templates/__init__-py.mustache | 6 - .../plugin/templates/module-py.mustache | 54 ---- .../python/plugin/templates/types-py.mustache | 169 ------------ .../plugin/templates/wrap_info-py.mustache | 20 -- .../bind/src/bindings/python/transformers.ts | 29 -- .../schema/bind/src/bindings/python/types.ts | 199 -------------- .../schema/bind/src/bindings/rust/index.ts | 1 - .../bind/src/bindings/rust/plugin/index.ts | 80 ------ .../rust/plugin/templates/mod-rs.mustache | 7 - .../rust/plugin/templates/module-rs.mustache | 30 --- .../rust/plugin/templates/types-rs.mustache | 180 ------------- .../plugin/templates/wrap.info-rs.mustache | 15 -- .../bind/src/bindings/typescript/app/index.ts | 51 ---- .../app/templates/index-ts.mustache | 1 - .../app/templates/types-ts.mustache | 121 --------- .../bind/src/bindings/typescript/index.ts | 2 - .../src/bindings/typescript/plugin/index.ts | 82 ------ .../plugin/templates/index-ts.mustache | 8 - .../plugin/templates/module-ts.mustache | 34 --- .../plugin/templates/types-ts.mustache | 184 ------------- .../plugin/templates/wrap.info-ts.mustache | 12 - 58 files changed, 1 insertion(+), 4041 deletions(-) delete mode 100644 packages/schema/bind/src/bindings/assemblyscript/functions.ts delete mode 100644 packages/schema/bind/src/bindings/assemblyscript/index.ts delete mode 100644 packages/schema/bind/src/bindings/assemblyscript/types.ts delete mode 100644 packages/schema/bind/src/bindings/assemblyscript/wasm/index.ts delete mode 100644 packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$deserialize_array.mustache delete mode 100644 packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$deserialize_enum.mustache delete mode 100644 packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$deserialize_map_value.mustache delete mode 100644 packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$deserialize_object.mustache delete mode 100644 packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$serialization_imports.mustache delete mode 100644 packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$serialize_array.mustache delete mode 100644 packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$serialize_enum.mustache delete mode 100644 packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$serialize_map_value.mustache delete mode 100644 packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$serialize_object.mustache delete mode 100644 packages/schema/bind/src/bindings/assemblyscript/wasm/templates/entry-ts.mustache delete mode 100644 packages/schema/bind/src/bindings/assemblyscript/wasm/templates/enum-type/index-ts.mustache delete mode 100644 packages/schema/bind/src/bindings/assemblyscript/wasm/templates/env-type/index-ts.mustache delete mode 100644 packages/schema/bind/src/bindings/assemblyscript/wasm/templates/env-type/serialization-ts.mustache delete mode 100644 packages/schema/bind/src/bindings/assemblyscript/wasm/templates/imported/enum-type/index-ts.mustache delete mode 100644 packages/schema/bind/src/bindings/assemblyscript/wasm/templates/imported/env-type/index-ts.mustache delete mode 100644 packages/schema/bind/src/bindings/assemblyscript/wasm/templates/imported/env-type/serialization-ts.mustache delete mode 100644 packages/schema/bind/src/bindings/assemblyscript/wasm/templates/imported/index-ts.mustache delete mode 100644 packages/schema/bind/src/bindings/assemblyscript/wasm/templates/imported/module-type/index-ts.mustache delete mode 100644 packages/schema/bind/src/bindings/assemblyscript/wasm/templates/imported/module-type/serialization-ts.mustache delete mode 100644 packages/schema/bind/src/bindings/assemblyscript/wasm/templates/imported/object-type/index-ts.mustache delete mode 100644 packages/schema/bind/src/bindings/assemblyscript/wasm/templates/imported/object-type/serialization-ts.mustache delete mode 100644 packages/schema/bind/src/bindings/assemblyscript/wasm/templates/index-ts.mustache delete mode 100644 packages/schema/bind/src/bindings/assemblyscript/wasm/templates/interface-type/index-ts.mustache delete mode 100644 packages/schema/bind/src/bindings/assemblyscript/wasm/templates/module-type/index-ts.mustache delete mode 100644 packages/schema/bind/src/bindings/assemblyscript/wasm/templates/module-type/module-ts.mustache delete mode 100644 packages/schema/bind/src/bindings/assemblyscript/wasm/templates/module-type/serialization-ts.mustache delete mode 100644 packages/schema/bind/src/bindings/assemblyscript/wasm/templates/module-type/wrapped-ts.mustache delete mode 100644 packages/schema/bind/src/bindings/assemblyscript/wasm/templates/object-type/index-ts.mustache delete mode 100644 packages/schema/bind/src/bindings/assemblyscript/wasm/templates/object-type/serialization-ts.mustache delete mode 100644 packages/schema/bind/src/bindings/python/functions.ts delete mode 100644 packages/schema/bind/src/bindings/python/index.ts delete mode 100644 packages/schema/bind/src/bindings/python/plugin/index.ts delete mode 100644 packages/schema/bind/src/bindings/python/plugin/templates/__init__-py.mustache delete mode 100644 packages/schema/bind/src/bindings/python/plugin/templates/module-py.mustache delete mode 100644 packages/schema/bind/src/bindings/python/plugin/templates/types-py.mustache delete mode 100644 packages/schema/bind/src/bindings/python/plugin/templates/wrap_info-py.mustache delete mode 100644 packages/schema/bind/src/bindings/python/transformers.ts delete mode 100644 packages/schema/bind/src/bindings/python/types.ts delete mode 100644 packages/schema/bind/src/bindings/rust/plugin/index.ts delete mode 100644 packages/schema/bind/src/bindings/rust/plugin/templates/mod-rs.mustache delete mode 100644 packages/schema/bind/src/bindings/rust/plugin/templates/module-rs.mustache delete mode 100644 packages/schema/bind/src/bindings/rust/plugin/templates/types-rs.mustache delete mode 100644 packages/schema/bind/src/bindings/rust/plugin/templates/wrap.info-rs.mustache delete mode 100644 packages/schema/bind/src/bindings/typescript/app/index.ts delete mode 100644 packages/schema/bind/src/bindings/typescript/app/templates/index-ts.mustache delete mode 100644 packages/schema/bind/src/bindings/typescript/app/templates/types-ts.mustache delete mode 100644 packages/schema/bind/src/bindings/typescript/plugin/index.ts delete mode 100644 packages/schema/bind/src/bindings/typescript/plugin/templates/index-ts.mustache delete mode 100644 packages/schema/bind/src/bindings/typescript/plugin/templates/module-ts.mustache delete mode 100644 packages/schema/bind/src/bindings/typescript/plugin/templates/types-ts.mustache delete mode 100644 packages/schema/bind/src/bindings/typescript/plugin/templates/wrap.info-ts.mustache diff --git a/packages/schema/bind/src/bindings/assemblyscript/functions.ts b/packages/schema/bind/src/bindings/assemblyscript/functions.ts deleted file mode 100644 index f58c5d5e12..0000000000 --- a/packages/schema/bind/src/bindings/assemblyscript/functions.ts +++ /dev/null @@ -1,254 +0,0 @@ -import { MustacheFn } from "../types"; -import { isBaseType, isKeyword } from "./types"; - -// check if any of the keywords match the property name; -// if there's a match, insert `_` at the beginning of the property name. -export const detectKeyword: MustacheFn = () => { - return (value: string, render: (template: string) => string): string => { - const type = render(value); - if (isKeyword(type)) { - return "_" + type; - } - return type; - }; -}; - -export const toMsgPack: MustacheFn = () => { - return (value: string, render: (template: string) => string) => { - let type = render(value); - - let modifier = ""; - if (type[type.length - 1] === "!") { - type = type.substring(0, type.length - 1); - } else { - modifier = "Optional"; - } - - if (type[0] === "[") { - return modifier + "Array"; - } - if (type.startsWith("Map<")) { - return modifier + "ExtGenericMap"; - } - switch (type) { - case "Int": - return modifier + "Int32"; - case "UInt": - return modifier + "UInt32"; - case "Boolean": - return modifier + "Bool"; - default: - return modifier + type; - } - }; -}; - -export const toWasmInit: MustacheFn = () => { - return (value: string, render: (template: string) => string) => { - let type = render(value); - - if (type[type.length - 1] === "!") { - type = type.substring(0, type.length - 1); - } else { - const nullType = toWasm()(value, render); - const nullOptional = "| null"; - - if (nullType.endsWith(nullOptional)) { - return "null"; - } - } - - if (type[0] === "[") { - return "[]"; - } - - if (type.startsWith("Map<")) { - const firstOpenBracketIdx = type.indexOf("<"); - const lastCloseBracketIdx = type.lastIndexOf(">"); - if (firstOpenBracketIdx === -1 || lastCloseBracketIdx === -1) { - throw new Error(`Invalid Map: ${type}`); - } - - const keyValTypes = type.substring( - firstOpenBracketIdx + 1, - lastCloseBracketIdx - ); - - const firstCommaIdx = keyValTypes.indexOf(","); - if (firstCommaIdx === -1) { - throw new Error(`Invalid Map: ${type}`); - } - - const keyType = keyValTypes.substring(0, firstCommaIdx).trim(); - const valType = keyValTypes.substring(firstCommaIdx + 1).trim(); - - const wasmKeyType = toWasm()(keyType, (str) => str); - const wasmValType = toWasm()(valType, (str) => str); - - return `new Map<${wasmKeyType}, ${wasmValType}>()`; - } - - switch (type) { - case "Int": - case "Int8": - case "Int16": - case "Int32": - case "UInt": - case "UInt8": - case "UInt16": - case "UInt32": - return "0"; - case "String": - return `""`; - case "Boolean": - return "false"; - case "Bytes": - return `new ArrayBuffer(0)`; - case "BigInt": - return `BigInt.fromUInt16(0)`; - case "BigNumber": - return `new BigNumber(BigInt.fromUInt16(0), 0, 0)`; - case "JSON": - return `JSON.Value.Null()`; - default: - if (type.includes("Enum_")) { - return "0"; - } else { - type = detectKeyword()(type, (str) => str); - return `new Types.${type}()`; - } - } - }; -}; - -export const toWasm: MustacheFn = () => { - return (value: string, render: (template: string) => string) => { - let type = render(value); - let isEnum = false; - - let optional = false; - if (type[type.length - 1] === "!") { - type = type.substring(0, type.length - 1); - } else { - optional = true; - } - - if (type[0] === "[") { - return toWasmArray(type, optional); - } - - if (type.startsWith("Map<")) { - return toWasmMap(type, optional); - } - - switch (type) { - case "Int": - type = "i32"; - break; - case "Int8": - type = "i8"; - break; - case "Int16": - type = "i16"; - break; - case "Int32": - type = "i32"; - break; - case "UInt": - case "UInt32": - type = "u32"; - break; - case "UInt8": - type = "u8"; - break; - case "UInt16": - type = "u16"; - break; - case "String": - type = "string"; - break; - case "Boolean": - type = "bool"; - break; - case "Bytes": - type = "ArrayBuffer"; - break; - case "BigInt": - type = "BigInt"; - break; - case "BigNumber": - type = "BigNumber"; - break; - case "JSON": - type = "JSON.Value"; - break; - default: - if (type.includes("Enum_")) { - type = type.replace("Enum_", ""); - isEnum = true; - } - type = detectKeyword()(type, (str) => str); - type = `Types.${type}`; - } - - return applyOptional(type, optional, isEnum); - }; -}; - -const toWasmArray = (type: string, optional: boolean): string => { - const result = type.match(/(\[)([[\]A-Za-z0-9_.!]+)(\])/); - - if (!result || result.length !== 4) { - throw Error(`Invalid Array: ${type}`); - } - - const wasmType = toWasm()(result[2], (str) => str); - return applyOptional("Array<" + wasmType + ">", optional, false); -}; - -const toWasmMap = (type: string, optional: boolean): string => { - const firstOpenBracketIdx = type.indexOf("<"); - const lastCloseBracketIdx = type.lastIndexOf(">"); - - if (firstOpenBracketIdx === -1 || lastCloseBracketIdx === -1) { - throw new Error(`Invalid Map: ${type}`); - } - - const keyValTypes = type.substring( - firstOpenBracketIdx + 1, - lastCloseBracketIdx - ); - - const firstCommaIdx = keyValTypes.indexOf(","); - if (firstCommaIdx === -1) { - throw new Error(`Invalid Map: ${type}`); - } - - const keyType = keyValTypes.substring(0, firstCommaIdx).trim(); - const valType = keyValTypes.substring(firstCommaIdx + 1).trim(); - - const wasmKeyType = toWasm()(keyType, (str) => str); - const wasmValType = toWasm()(valType, (str) => str); - - return applyOptional(`Map<${wasmKeyType}, ${wasmValType}>`, optional, false); -}; - -const applyOptional = ( - type: string, - optional: boolean, - isEnum: boolean -): string => { - if (optional) { - if ( - type.indexOf("Array") === 0 || - type.indexOf("string") === 0 || - (!isEnum && !isBaseType(type)) - ) { - return `${type} | null`; - } else { - return `Box<${type}> | null`; - } - } else { - return type; - } -}; diff --git a/packages/schema/bind/src/bindings/assemblyscript/index.ts b/packages/schema/bind/src/bindings/assemblyscript/index.ts deleted file mode 100644 index a01310ad9e..0000000000 --- a/packages/schema/bind/src/bindings/assemblyscript/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * as Wasm from "./wasm"; -export * as Functions from "./functions"; -export * as Types from "./types"; diff --git a/packages/schema/bind/src/bindings/assemblyscript/types.ts b/packages/schema/bind/src/bindings/assemblyscript/types.ts deleted file mode 100644 index 6961a87298..0000000000 --- a/packages/schema/bind/src/bindings/assemblyscript/types.ts +++ /dev/null @@ -1,233 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ - -const baseTypes = { - u8: "u8", - u16: "u16", - u32: "u32", - i8: "i8", - i16: "i16", - i32: "i32", - string: "string", - bool: "bool", -}; - -export type BaseTypes = typeof baseTypes; - -export type BaseType = keyof BaseTypes; - -export function isBaseType(type: string): type is BaseType { - return type in baseTypes; -} - -// based on: -// - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#keywords -// - https://github.com/AssemblyScript/assemblyscript/blob/f54dbfb527842f3d68f18643bb614d104b4f0160/src/common.ts#L107 -// - https://github.com/AssemblyScript/assemblyscript/blob/f54dbfb527842f3d68f18643bb614d104b4f0160/src/tokenizer.ts#L181 -const keywords = { - async: "async", - await: "await", - arguments: "arguments", - abstract: "abstract", - as: "as", - break: "break", - const: "const", - class: "class", - catch: "catch", - case: "case", - continue: "continue", - constructor: "constructor", - default: "default", - declare: "declare", - do: "do", - delete: "delete", - debugger: "debugger", - else: "else", - enum: "enum", - export: "export", - extends: "extends", - for: "for", - from: "from", - function: "function", - finally: "finally", - // get: "get", - if: "if", - in: "in", - is: "is", - implements: "implements", - import: "import", - instanceof: "instanceof", - interface: "interface", - keyof: "keyof", - let: "let", - module: "module", - new: "new", - namespace: "namespace", - of: "of", - private: "private", - package: "package", - public: "public", - protected: "protected", - return: "return", - readonly: "readonly", - switch: "switch", - static: "static", - // set: "set", - super: "super", - this: "this", - type: "type", - try: "try", - throw: "throw", - typeof: "typeof", - var: "var", - while: "while", - with: "with", - yield: "yield", - // types - i8: "i8", - i16: "i16", - i32: "i32", - i64: "i64", - isize: "isize", - u8: "u8", - u16: "u16", - u32: "u32", - u64: "u64", - usize: "usize", - bool: "bool", - f32: "f32", - f64: "f64", - v128: "v128", - funcref: "funcref", - externref: "externref", - anyref: "anyref", - eqref: "eqref", - i31ref: "i31ref", - dataref: "dataref", - i8x16: "i8x16", - u8x16: "u8x16", - i16x8: "i16x8", - u16x8: "u16x8", - i32x4: "i32x4", - u32x4: "u32x4", - i64x2: "i64x2", - u64x2: "u64x2", - f32x4: "f32x4", - f64x2: "f64x2", - void: "void", - number: "number", - boolean: "boolean", - string: "string", - native: "native", - indexof: "indexof", - valueof: "valueof", - returnof: "returnof", - nonnull: "nonnull", - // aliases - null: "null", - true: "true", - false: "false", - // constants - ASC_TARGET: "ASC_TARGET", - ASC_RUNTIME: "ASC_RUNTIME", - ASC_NO_ASSERT: "ASC_NO_ASSERT", - ASC_MEMORY_BASE: "ASC_MEMORY_BASE", - ASC_TABLE_BASE: "ASC_TABLE_BASE", - ASC_OPTIMIZE_LEVEL: "ASC_OPTIMIZE_LEVEL", - ASC_SHRINK_LEVEL: "ASC_SHRINK_LEVEL", - ASC_LOW_MEMORY_LIMIT: "ASC_LOW_MEMORY_LIMIT", - ASC_EXPORT_RUNTIME: "ASC_EXPORT_RUNTIME", - ASC_WASI: "ASC_WASI", - ASC_FEATURE_SIGN_EXTENSION: "ASC_FEATURE_SIGN_EXTENSION", - ASC_FEATURE_MUTABLE_GLOBALS: "ASC_FEATURE_MUTABLE_GLOBALS", - ASC_FEATURE_NONTRAPPING_F2I: "ASC_FEATURE_NONTRAPPING_F2I", - ASC_FEATURE_BULK_MEMORY: "ASC_FEATURE_BULK_MEMORY", - ASC_FEATURE_SIMD: "ASC_FEATURE_SIMD", - ASC_FEATURE_THREADS: "ASC_FEATURE_THREADS", - ASC_FEATURE_EXCEPTION_HANDLING: "ASC_FEATURE_EXCEPTION_HANDLING", - ASC_FEATURE_TAIL_CALLS: "ASC_FEATURE_TAIL_CALLS", - ASC_FEATURE_REFERENCE_TYPES: "ASC_FEATURE_REFERENCE_TYPES", - ASC_FEATURE_MULTI_VALUE: "ASC_FEATURE_MULTI_VALUE", - ASC_FEATURE_GC: "ASC_FEATURE_GC", - ASC_FEATURE_MEMORY64: "ASC_FEATURE_MEMORY64", - ASC_VERSION_MAJOR: "ASC_VERSION_MAJOR", - ASC_VERSION_MINOR: "ASC_VERSION_MINOR", - ASC_VERSION_PATCH: "ASC_VERSION_PATCH", - // classes - I8: "I8", - I16: "I16", - I32: "I32", - I64: "I64", - Isize: "Isize", - U8: "U8", - U16: "U16", - U32: "U32", - U64: "U64", - Usize: "Usize", - Bool: "Bool", - F32: "F32", - F64: "F64", - V128: "V128", - Funcref: "Funcref", - Externref: "Externref", - Anyref: "Anyref", - Eqref: "Eqref", - I31ref: "I31ref", - Dataref: "Dataref", - String: "String", - Object: "Object", - Array: "Array", - StaticArray: "StaticArray", - Set: "Set", - Map: "Map", - Function: "Function", - ArrayBufferView: "ArrayBufferView", - ArrayBuffer: "ArrayBuffer", - Math: "Math", - Mathf: "Mathf", - NativeMath: "NativeMath", - NativeMathf: "NativeMathf", - Int8Array: "Int8Array", - Int16Array: "Int16Array", - Int32Array: "Int32Array", - Int64Array: "Int64Array", - Uint8Array: "Uint8Array", - Uint8ClampedArray: "Uint8ClampedArray", - Uint16Array: "Uint16Array", - Uint32Array: "Uint32Array", - Uint64Array: "Uint64Array", - Float32Array: "Float32Array", - Float64Array: "Float64Array", - TemplateStringsArray: "TemplateStringsArray", - Error: "Error", - Result: "Result", - Box: "Box", - JSON: "JSON", - // runtime - abort: "abort", - trace: "trace", - seed: "seed", - pow: "pow", - ipow32: "ipow32", - ipow64: "ipow64", - mod: "mod", - __alloc: "__alloc", - __realloc: "__realloc", - __free: "__free", - __new: "__new", - __renew: "__renew", - __link: "__link", - __collect: "__collect", - __typeinfo: "__typeinfo", - __instanceof: "__instanceof", - __visit: "__visit", - __newBuffer: "__newBuffer", - __newArray: "__newArray", -}; - -export type Keywords = typeof keywords; - -export type Keyword = keyof Keywords; - -export function isKeyword(keyword: string): keyword is Keyword { - return keyword in keywords; -} diff --git a/packages/schema/bind/src/bindings/assemblyscript/wasm/index.ts b/packages/schema/bind/src/bindings/assemblyscript/wasm/index.ts deleted file mode 100644 index a3fe54738f..0000000000 --- a/packages/schema/bind/src/bindings/assemblyscript/wasm/index.ts +++ /dev/null @@ -1,195 +0,0 @@ -import { Functions } from "../"; -import { GenerateBindingFn, renderTemplates } from "../.."; -import { loadSubTemplates } from "../../utils"; -import { BindOptions, BindOutput } from "../../.."; - -import { - transformAbi, - addFirstLast, - extendType, - toPrefixedGraphQLType, -} from "@polywrap/schema-parse"; -import { OutputEntry, readDirectorySync } from "@polywrap/os-js"; -import path from "path"; -import { WrapAbi } from "@polywrap/wrap-manifest-types-js/src"; - -const templatesDir = readDirectorySync(path.join(__dirname, "./templates")); -const subTemplates = loadSubTemplates(templatesDir.entries); -const templatePath = (subpath: string) => - path.join(__dirname, "./templates", subpath); - -export const generateBinding: GenerateBindingFn = ( - options: BindOptions -): BindOutput => { - const result: BindOutput = { - output: { - entries: [], - }, - outputDirAbs: options.outputDirAbs, - }; - const output = result.output; - const abi = applyTransforms(options.wrapInfo.abi); - - // Generate object type folders - if (abi.objectTypes) { - for (const objectType of abi.objectTypes) { - output.entries.push({ - type: "Directory", - name: objectType.type, - data: renderTemplates( - templatePath("object-type"), - objectType, - subTemplates - ), - }); - } - } - - // Generate imported folder - const importEntries: OutputEntry[] = []; - - // Generate imported module type folders - if (abi.importedModuleTypes) { - for (const importedModuleType of abi.importedModuleTypes) { - importEntries.push({ - type: "Directory", - name: importedModuleType.type, - data: renderTemplates( - templatePath("imported/module-type"), - importedModuleType, - subTemplates - ), - }); - } - } - - // Generate imported env type folders - if (abi.importedEnvTypes) { - for (const importedEnvType of abi.importedEnvTypes) { - importEntries.push({ - type: "Directory", - name: importedEnvType.type, - data: renderTemplates( - templatePath("imported/env-type"), - importedEnvType, - subTemplates - ), - }); - } - } - - // Generate imported enum type folders - if (abi.importedEnumTypes) { - for (const importedEnumType of abi.importedEnumTypes) { - importEntries.push({ - type: "Directory", - name: importedEnumType.type, - data: renderTemplates( - templatePath("imported/enum-type"), - importedEnumType, - subTemplates - ), - }); - } - } - - // Generate imported object type folders - if (abi.importedObjectTypes) { - for (const importedObectType of abi.importedObjectTypes) { - importEntries.push({ - type: "Directory", - name: importedObectType.type, - data: renderTemplates( - templatePath("imported/object-type"), - importedObectType, - subTemplates - ), - }); - } - } - - if (importEntries.length) { - output.entries.push({ - type: "Directory", - name: "imported", - data: [ - ...importEntries, - ...renderTemplates(templatePath("imported"), abi, subTemplates), - ], - }); - } - - // Generate interface type folders - if (abi.interfaceTypes) { - for (const interfaceType of abi.interfaceTypes) { - output.entries.push({ - type: "Directory", - name: interfaceType.type, - data: renderTemplates( - templatePath("interface-type"), - interfaceType, - subTemplates - ), - }); - } - } - - // Generate module type folders - if (abi.moduleType) { - output.entries.push({ - type: "Directory", - name: abi.moduleType.type, - data: renderTemplates( - templatePath("module-type"), - abi.moduleType, - subTemplates - ), - }); - } - - // Generate enum type folders - if (abi.enumTypes) { - for (const enumType of abi.enumTypes) { - output.entries.push({ - type: "Directory", - name: enumType.type, - data: renderTemplates( - templatePath("enum-type"), - enumType, - subTemplates - ), - }); - } - } - - // Generate env type folders - if (abi.envType) { - output.entries.push({ - type: "Directory", - name: abi.envType.type, - data: renderTemplates( - templatePath("env-type"), - abi.envType, - subTemplates - ), - }); - } - - // Generate root entry file - output.entries.push(...renderTemplates(templatePath(""), abi, subTemplates)); - - return result; -}; - -function applyTransforms(abi: WrapAbi): WrapAbi { - const transforms = [ - extendType(Functions), - addFirstLast, - toPrefixedGraphQLType, - ]; - - for (const transform of transforms) { - abi = transformAbi(abi, transform); - } - return abi; -} diff --git a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$deserialize_array.mustache b/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$deserialize_array.mustache deleted file mode 100644 index 5ee4a8a43b..0000000000 --- a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$deserialize_array.mustache +++ /dev/null @@ -1,23 +0,0 @@ -{{#scalar}} -return reader.read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(); -{{/scalar}} -{{#array}} -return reader.read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}((reader: Read): {{#item}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/item}} => { - {{> deserialize_array}} -}); -{{/array}} -{{#map}} -return reader.read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}((reader: Read): {{#key}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/key}} => { - return reader.read{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}(); -}, (reader: Read): {{#value}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/value}} => { - {{> deserialize_map_value}} -}); -{{/map}} -{{#enum}} -{{> deserialize_enum}} -return value; -{{/enum}} -{{#object}} -{{> deserialize_object}} -return object; -{{/object}} diff --git a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$deserialize_enum.mustache b/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$deserialize_enum.mustache deleted file mode 100644 index 6702368f21..0000000000 --- a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$deserialize_enum.mustache +++ /dev/null @@ -1,26 +0,0 @@ -{{#required}} -let value: Types.{{#detectKeyword}}{{type}}{{/detectKeyword}}; -if (reader.isNextString()) { - value = Types.get{{type}}Value(reader.readString()); -} else { - value = reader.readInt32(); - Types.sanitize{{type}}Value(value); -} -{{/required}} -{{^required}} -let value: Box | null; -if (!reader.isNextNil()) { - if (reader.isNextString()) { - value = Box.from( - Types.get{{type}}Value(reader.readString()) - ); - } else { - value = Box.from( - reader.readInt32() - ); - Types.sanitize{{type}}Value(value.unwrap()); - } -} else { - value = null; -} -{{/required}} diff --git a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$deserialize_map_value.mustache b/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$deserialize_map_value.mustache deleted file mode 100644 index 5ee4a8a43b..0000000000 --- a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$deserialize_map_value.mustache +++ /dev/null @@ -1,23 +0,0 @@ -{{#scalar}} -return reader.read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(); -{{/scalar}} -{{#array}} -return reader.read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}((reader: Read): {{#item}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/item}} => { - {{> deserialize_array}} -}); -{{/array}} -{{#map}} -return reader.read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}((reader: Read): {{#key}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/key}} => { - return reader.read{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}(); -}, (reader: Read): {{#value}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/value}} => { - {{> deserialize_map_value}} -}); -{{/map}} -{{#enum}} -{{> deserialize_enum}} -return value; -{{/enum}} -{{#object}} -{{> deserialize_object}} -return object; -{{/object}} diff --git a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$deserialize_object.mustache b/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$deserialize_object.mustache deleted file mode 100644 index 18f27d1c1e..0000000000 --- a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$deserialize_object.mustache +++ /dev/null @@ -1,9 +0,0 @@ -{{#required}} -const object = Types.{{#detectKeyword}}{{type}}{{/detectKeyword}}.read(reader); -{{/required}} -{{^required}} -let object: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = null; -if (!reader.isNextNil()) { - object = Types.{{#detectKeyword}}{{type}}{{/detectKeyword}}.read(reader); -} -{{/required}} diff --git a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$serialization_imports.mustache b/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$serialization_imports.mustache deleted file mode 100644 index 933d73f458..0000000000 --- a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$serialization_imports.mustache +++ /dev/null @@ -1,12 +0,0 @@ -import { - Read, - ReadDecoder, - Write, - WriteSizer, - WriteEncoder, - Box, - BigInt, - BigNumber, - JSON, - Context -} from "@polywrap/wasm-as"; diff --git a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$serialize_array.mustache b/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$serialize_array.mustache deleted file mode 100644 index a32a8fbfb0..0000000000 --- a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$serialize_array.mustache +++ /dev/null @@ -1,21 +0,0 @@ -{{#scalar}} -writer.write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(item); -{{/scalar}} -{{#array}} -writer.write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(item, (writer: Write, item: {{#item}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/item}}): void => { - {{> serialize_array}} -}); -{{/array}} -{{#map}} -writer.write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(item, (writer: Write, key: {{#key}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/key}}) => { - writer.write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(key); -}, (writer: Write, value: {{#value}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/value}}): void => { - {{> serialize_map_value}} -}); -{{/map}} -{{#enum}} -{{> serialize_enum}} -{{/enum}} -{{#object}} -{{> serialize_object}} -{{/object}} diff --git a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$serialize_enum.mustache b/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$serialize_enum.mustache deleted file mode 100644 index 36c482f6ce..0000000000 --- a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$serialize_enum.mustache +++ /dev/null @@ -1,6 +0,0 @@ -{{#required}} -writer.writeInt32(item); -{{/required}} -{{^required}} -writer.writeOptionalInt32(item); -{{/required}} diff --git a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$serialize_map_value.mustache b/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$serialize_map_value.mustache deleted file mode 100644 index 4dc36f8422..0000000000 --- a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$serialize_map_value.mustache +++ /dev/null @@ -1,35 +0,0 @@ -{{#scalar}} -writer.write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(value); -{{/scalar}} -{{#array}} -writer.write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(value, (writer: Write, item: {{#item}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/item}}): void => { - {{> serialize_array}} -}); -{{/array}} -{{#map}} -writer.write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(value, (writer: Write, key: {{#key}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/key}}) => { - writer.write{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}(key); -}, (writer: Write, value: {{#value}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/value}}): void => { - {{> serialize_map_value}} -}); -{{/map}} -{{#enum}} -{{#required}} -writer.writeInt32(value); -{{/required}} -{{^required}} -writer.writeOptionalInt32(value); -{{/required}} -{{/enum}} -{{#object}} -{{#required}} -Types.{{#detectKeyword}}{{type}}{{/detectKeyword}}.write(writer, value); -{{/required}} -{{^required}} -if (value) { - Types.{{#detectKeyword}}{{type}}{{/detectKeyword}}.write(writer, value as Types.{{#detectKeyword}}{{type}}{{/detectKeyword}}); -} else { - writer.writeNil(); -} -{{/required}} -{{/object}} diff --git a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$serialize_object.mustache b/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$serialize_object.mustache deleted file mode 100644 index 10a177af22..0000000000 --- a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/$serialize_object.mustache +++ /dev/null @@ -1,10 +0,0 @@ -{{#required}} -Types.{{#detectKeyword}}{{type}}{{/detectKeyword}}.write(writer, item); -{{/required}} -{{^required}} -if (item) { - Types.{{#detectKeyword}}{{type}}{{/detectKeyword}}.write(writer, item as Types.{{#detectKeyword}}{{type}}{{/detectKeyword}}); -} else { - writer.writeNil(); -} -{{/required}} diff --git a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/entry-ts.mustache b/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/entry-ts.mustache deleted file mode 100644 index c3a24bd116..0000000000 --- a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/entry-ts.mustache +++ /dev/null @@ -1,57 +0,0 @@ -import { - wrap_invoke_args, - wrap_invoke_result, - wrap_invoke_error, - wrap_abort, - InvokeArgs -} from "@polywrap/wasm-as"; - -{{#moduleType}} -{{#methods.length}} -import { - {{#methods}} - {{name}}Wrapped{{^last}},{{/last}} - {{/methods}} -} from "./{{type}}/wrapped"; -{{/methods.length}} -{{/moduleType}} - -import { Module } from "../index"; - -export function _wrap_invoke(method_size: u32, args_size: u32, env_size: u32): bool { - const module = new Module(); - const args: InvokeArgs = wrap_invoke_args( - method_size, - args_size - ); - let result: ArrayBuffer; - {{#moduleType}} - {{#methods}} - {{^first}}else {{/first}}if (args.method == "{{name}}") { - result = {{name}}Wrapped(module, args.args, env_size); - } - {{/methods}} - {{/moduleType}} - else { - wrap_invoke_error( - `Could not find invoke function "${args.method}"` - ); - return false; - } - wrap_invoke_result(result); - return true; -} - -export function wrapAbort( - msg: string | null, - file: string | null, - line: u32, - column: u32 -): void { - wrap_abort( - msg ? msg : "", - file ? file : "", - line, - column - ); -} diff --git a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/enum-type/index-ts.mustache b/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/enum-type/index-ts.mustache deleted file mode 100644 index c738d94e84..0000000000 --- a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/enum-type/index-ts.mustache +++ /dev/null @@ -1,35 +0,0 @@ -export enum {{#detectKeyword}}{{type}}{{/detectKeyword}} { - {{#constants}} - {{#detectKeyword}}{{.}}{{/detectKeyword}}, - {{/constants}} - _MAX_ -} - -export function sanitize{{type}}Value(value: i32): void { - const valid = value >= 0 && value < {{#detectKeyword}}{{type}}{{/detectKeyword}}._MAX_; - if (!valid) { - throw new Error("Invalid value for enum '{{#detectKeyword}}{{type}}{{/detectKeyword}}': " + value.toString()); - } -} - -export function get{{type}}Value(key: string): {{#detectKeyword}}{{type}}{{/detectKeyword}} { - {{#constants}} - if (key == "{{#detectKeyword}}{{.}}{{/detectKeyword}}") { - return {{#detectKeyword}}{{type}}{{/detectKeyword}}.{{#detectKeyword}}{{.}}{{/detectKeyword}}; - } - {{/constants}} - - throw new Error("Invalid key for enum '{{#detectKeyword}}{{type}}{{/detectKeyword}}': " + key); -} - -export function get{{type}}Key(value: {{#detectKeyword}}{{type}}{{/detectKeyword}}): string { - sanitize{{type}}Value(value); - - switch (value) { - {{#constants}} - case {{#detectKeyword}}{{type}}{{/detectKeyword}}.{{#detectKeyword}}{{.}}{{/detectKeyword}}: return "{{#detectKeyword}}{{.}}{{/detectKeyword}}"; - {{/constants}} - default: - throw new Error("Invalid value for enum '{{#detectKeyword}}{{type}}{{/detectKeyword}}': " + value.toString()); - } -} diff --git a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/env-type/index-ts.mustache b/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/env-type/index-ts.mustache deleted file mode 100644 index 8199149c0d..0000000000 --- a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/env-type/index-ts.mustache +++ /dev/null @@ -1,37 +0,0 @@ -import { - Read, - Write, - Box, - BigInt, - BigNumber, - JSON -} from "@polywrap/wasm-as"; -import { - serialize{{type}}, - deserialize{{type}}, - write{{type}}, - read{{type}} -} from "./serialization"; -import * as Types from ".."; - -export class {{#detectKeyword}}{{type}}{{/detectKeyword}} { - {{#properties}} - {{#detectKeyword}}{{name}}{{/detectKeyword}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}}; - {{/properties}} - - static toBuffer(type: {{#detectKeyword}}{{type}}{{/detectKeyword}}): ArrayBuffer { - return serialize{{type}}(type); - } - - static fromBuffer(buffer: ArrayBuffer): {{#detectKeyword}}{{type}}{{/detectKeyword}} { - return deserialize{{type}}(buffer); - } - - static write(writer: Write, type: {{#detectKeyword}}{{type}}{{/detectKeyword}}): void { - write{{type}}(writer, type); - } - - static read(reader: Read): {{#detectKeyword}}{{type}}{{/detectKeyword}} { - return read{{type}}(reader); - } -} diff --git a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/env-type/serialization-ts.mustache b/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/env-type/serialization-ts.mustache deleted file mode 100644 index 5b9a53d9b6..0000000000 --- a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/env-type/serialization-ts.mustache +++ /dev/null @@ -1,149 +0,0 @@ -{{> serialization_imports}} -import { {{#detectKeyword}}{{type}}{{/detectKeyword}} } from "./"; -import * as Types from ".."; - -export function serialize{{type}}(type: {{#detectKeyword}}{{type}}{{/detectKeyword}}): ArrayBuffer { - const sizerContext: Context = new Context("Serializing (sizing) env-type: {{type}}"); - const sizer = new WriteSizer(sizerContext); - write{{type}}(sizer, type); - const buffer = new ArrayBuffer(sizer.length); - const encoderContext: Context = new Context("Serializing (encoding) env-type: {{type}}"); - const encoder = new WriteEncoder(buffer, sizer, encoderContext); - write{{type}}(encoder, type); - return buffer; -} - -export function write{{type}}(writer: Write, type: {{#detectKeyword}}{{type}}{{/detectKeyword}}): void { - {{#properties.length}} - writer.writeMapLength({{properties.length}}); - {{/properties.length}} - {{^properties}} - writer.writeMapLength(0); - {{/properties}} - {{#properties}} - writer.context().push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property"); - writer.writeString("{{name}}"); - {{#scalar}} - writer.write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(type.{{#detectKeyword}}{{name}}{{/detectKeyword}}); - {{/scalar}} - {{#array}} - writer.write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(type.{{#detectKeyword}}{{name}}{{/detectKeyword}}, (writer: Write, item: {{#item}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/item}}): void => { - {{> serialize_array}} - }); - {{/array}} - {{#map}} - writer.write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(type.{{#detectKeyword}}{{name}}{{/detectKeyword}}, (writer: Write, key: {{#key}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/key}}) => { - writer.write{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}(key); - }, (writer: Write, value: {{#value}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/value}}): void => { - {{> serialize_map_value}} - }); - {{/map}} - {{#object}} - {{#required}} - Types.{{#detectKeyword}}{{type}}{{/detectKeyword}}.write(writer, type.{{#detectKeyword}}{{name}}{{/detectKeyword}}); - {{/required}} - {{^required}} - if (type.{{#detectKeyword}}{{name}}{{/detectKeyword}}) { - Types.{{#detectKeyword}}{{type}}{{/detectKeyword}}.write(writer, type.{{#detectKeyword}}{{name}}{{/detectKeyword}} as Types.{{#detectKeyword}}{{type}}{{/detectKeyword}}); - } else { - writer.writeNil(); - } - {{/required}} - {{/object}} - {{#enum}} - {{#required}} - writer.writeInt32(type.{{#detectKeyword}}{{name}}{{/detectKeyword}}); - {{/required}} - {{^required}} - writer.writeOptionalInt32(type.{{#detectKeyword}}{{name}}{{/detectKeyword}}); - {{/required}} - {{/enum}} - writer.context().pop(); - {{/properties}} -} - -export function deserialize{{type}}(buffer: ArrayBuffer): {{#detectKeyword}}{{type}}{{/detectKeyword}} { - const context: Context = new Context("Deserializing env-type {{type}}"); - const reader = new ReadDecoder(buffer, context); - return read{{type}}(reader); -} - -export function read{{type}}(reader: Read): {{#detectKeyword}}{{type}}{{/detectKeyword}} { - let numFields = reader.readMapLength(); - - {{#properties}} - {{^object}} - let _{{name}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = {{#toWasmInit}}{{toGraphQLType}}{{/toWasmInit}}; - {{/object}} - {{#object}} - {{#required}} - let _{{name}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} | null = null; - {{/required}} - {{^required}} - let _{{name}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = {{#toWasmInit}}{{toGraphQLType}}{{/toWasmInit}}; - {{/required}} - {{/object}} - {{#required}} - let _{{name}}Set: bool = false; - {{/required}} - {{/properties}} - - while (numFields > 0) { - numFields--; - const field = reader.readString(); - - reader.context().push(field, "unknown", "searching for property type"); - {{#properties}} - {{^first}}else {{/first}}if (field == "{{name}}") { - reader.context().push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property"); - {{#scalar}} - _{{name}} = reader.read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(); - {{/scalar}} - {{#array}} - _{{name}} = reader.read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}((reader: Read): {{#item}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/item}} => { - {{> deserialize_array}} - }); - {{/array}} - {{#map}} - _{{name}} = reader.read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}((reader: Read): {{#key}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/key}} => { - return reader.read{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}(); - }, (reader: Read): {{#value}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/value}} => { - {{> deserialize_map_value}} - }); - {{/map}} - {{#enum}} - {{> deserialize_enum}} - _{{name}} = value; - {{/enum}} - {{#object}} - {{> deserialize_object }} - _{{name}} = object; - {{/object}} - {{#required}} - _{{name}}Set = true; - {{/required}} - reader.context().pop(); - } - {{/properties}} - reader.context().pop(); - } - - {{#properties}} - {{#required}} - {{^object}} - if (!_{{name}}Set) { - {{/object}} - {{#object}} - if (!_{{name}} || !_{{name}}Set) { - {{/object}} - throw new Error(reader.context().printWithContext("Missing required property: '{{name}}: {{type}}'")); - } - {{/required}} - {{/properties}} - - return { - {{#properties}} - {{#detectKeyword}}{{name}}{{/detectKeyword}}: _{{name}}{{^last}},{{/last}} - {{/properties}} - }; -} diff --git a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/imported/enum-type/index-ts.mustache b/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/imported/enum-type/index-ts.mustache deleted file mode 100644 index c738d94e84..0000000000 --- a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/imported/enum-type/index-ts.mustache +++ /dev/null @@ -1,35 +0,0 @@ -export enum {{#detectKeyword}}{{type}}{{/detectKeyword}} { - {{#constants}} - {{#detectKeyword}}{{.}}{{/detectKeyword}}, - {{/constants}} - _MAX_ -} - -export function sanitize{{type}}Value(value: i32): void { - const valid = value >= 0 && value < {{#detectKeyword}}{{type}}{{/detectKeyword}}._MAX_; - if (!valid) { - throw new Error("Invalid value for enum '{{#detectKeyword}}{{type}}{{/detectKeyword}}': " + value.toString()); - } -} - -export function get{{type}}Value(key: string): {{#detectKeyword}}{{type}}{{/detectKeyword}} { - {{#constants}} - if (key == "{{#detectKeyword}}{{.}}{{/detectKeyword}}") { - return {{#detectKeyword}}{{type}}{{/detectKeyword}}.{{#detectKeyword}}{{.}}{{/detectKeyword}}; - } - {{/constants}} - - throw new Error("Invalid key for enum '{{#detectKeyword}}{{type}}{{/detectKeyword}}': " + key); -} - -export function get{{type}}Key(value: {{#detectKeyword}}{{type}}{{/detectKeyword}}): string { - sanitize{{type}}Value(value); - - switch (value) { - {{#constants}} - case {{#detectKeyword}}{{type}}{{/detectKeyword}}.{{#detectKeyword}}{{.}}{{/detectKeyword}}: return "{{#detectKeyword}}{{.}}{{/detectKeyword}}"; - {{/constants}} - default: - throw new Error("Invalid value for enum '{{#detectKeyword}}{{type}}{{/detectKeyword}}': " + value.toString()); - } -} diff --git a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/imported/env-type/index-ts.mustache b/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/imported/env-type/index-ts.mustache deleted file mode 100644 index d06607f9f6..0000000000 --- a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/imported/env-type/index-ts.mustache +++ /dev/null @@ -1,42 +0,0 @@ -import { - Read, - Write, - Box, - BigInt, - BigNumber, - JSON, -} from "@polywrap/wasm-as"; -import { - serialize{{type}}, - deserialize{{type}}, - write{{type}}, - read{{type}} -} from "./serialization"; -import * as Types from "../.."; - -@serializable -export class {{#detectKeyword}}{{type}}{{/detectKeyword}} { - - public static uri: string = "{{uri}}"; - - {{#properties}} - {{#detectKeyword}}{{name}}{{/detectKeyword}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}}; - {{/properties}} - - static toBuffer(type: {{#detectKeyword}}{{type}}{{/detectKeyword}}): ArrayBuffer { - return serialize{{type}}(type); - } - - static fromBuffer(buffer: ArrayBuffer): {{#detectKeyword}}{{type}}{{/detectKeyword}} { - return deserialize{{type}}(buffer); - } - - static write(writer: Write, type: {{#detectKeyword}}{{type}}{{/detectKeyword}}): void { - write{{type}}(writer, type); - } - - static read(reader: Read): {{#detectKeyword}}{{type}}{{/detectKeyword}} { - return read{{type}}(reader); - } - {{> json_methods}} -} diff --git a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/imported/env-type/serialization-ts.mustache b/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/imported/env-type/serialization-ts.mustache deleted file mode 100644 index 9d524437cf..0000000000 --- a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/imported/env-type/serialization-ts.mustache +++ /dev/null @@ -1,149 +0,0 @@ -{{> serialization_imports}} -import { {{#detectKeyword}}{{type}}{{/detectKeyword}} } from "./"; -import * as Types from "../.."; - -export function serialize{{type}}(type: {{#detectKeyword}}{{type}}{{/detectKeyword}}): ArrayBuffer { - const sizerContext: Context = new Context("Serializing (sizing) imported env-type: {{type}}"); - const sizer = new WriteSizer(sizerContext); - write{{type}}(sizer, type); - const buffer = new ArrayBuffer(sizer.length); - const encoderContext: Context = new Context("Serializing (encoding) imported env-type: {{type}}"); - const encoder = new WriteEncoder(buffer, sizer, encoderContext); - write{{type}}(encoder, type); - return buffer; -} - -export function write{{type}}(writer: Write, type: {{#detectKeyword}}{{type}}{{/detectKeyword}}): void { - {{#properties.length}} - writer.writeMapLength({{properties.length}}); - {{/properties.length}} - {{^properties}} - writer.writeMapLength(0); - {{/properties}} - {{#properties}} - writer.context().push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property"); - writer.writeString("{{name}}"); - {{#scalar}} - writer.write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(type.{{#detectKeyword}}{{name}}{{/detectKeyword}}); - {{/scalar}} - {{#array}} - writer.write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(type.{{#detectKeyword}}{{name}}{{/detectKeyword}}, (writer: Write, item: {{#item}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/item}}): void => { - {{> serialize_array}} - }); - {{/array}} - {{#map}} - writer.write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(type.{{#detectKeyword}}{{name}}{{/detectKeyword}}, (writer: Write, key: {{#key}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/key}}) => { - writer.write{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}(key); - }, (writer: Write, value: {{#value}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/value}}): void => { - {{> serialize_map_value}} - }); - {{/map}} - {{#object}} - {{#required}} - Types.{{#detectKeyword}}{{type}}{{/detectKeyword}}.write(writer, type.{{#detectKeyword}}{{name}}{{/detectKeyword}}); - {{/required}} - {{^required}} - if (type.{{#detectKeyword}}{{name}}{{/detectKeyword}}) { - Types.{{#detectKeyword}}{{type}}{{/detectKeyword}}.write(writer, type.{{#detectKeyword}}{{name}}{{/detectKeyword}} as Types.{{#detectKeyword}}{{type}}{{/detectKeyword}}); - } else { - writer.writeNil(); - } - {{/required}} - {{/object}} - {{#enum}} - {{#required}} - writer.writeInt32(type.{{#detectKeyword}}{{name}}{{/detectKeyword}}); - {{/required}} - {{^required}} - writer.writeOptionalInt32(type.{{#detectKeyword}}{{name}}{{/detectKeyword}}); - {{/required}} - {{/enum}} - writer.context().pop(); - {{/properties}} -} - -export function deserialize{{type}}(buffer: ArrayBuffer): {{#detectKeyword}}{{type}}{{/detectKeyword}} { - const context: Context = new Context("Deserializing imported env-type {{type}}"); - const reader = new ReadDecoder(buffer, context); - return read{{type}}(reader); -} - -export function read{{type}}(reader: Read): {{#detectKeyword}}{{type}}{{/detectKeyword}} { - let numFields = reader.readMapLength(); - - {{#properties}} - {{^object}} - let _{{name}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = {{#toWasmInit}}{{toGraphQLType}}{{/toWasmInit}}; - {{/object}} - {{#object}} - {{#required}} - let _{{name}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} | null = null; - {{/required}} - {{^required}} - let _{{name}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = {{#toWasmInit}}{{toGraphQLType}}{{/toWasmInit}}; - {{/required}} - {{/object}} - {{#required}} - let _{{name}}Set: bool = false; - {{/required}} - {{/properties}} - - while (numFields > 0) { - numFields--; - const field = reader.readString(); - - reader.context().push(field, "unknown", "searching for property type"); - {{#properties}} - {{^first}}else {{/first}}if (field == "{{name}}") { - reader.context().push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property"); - {{#scalar}} - _{{name}} = reader.read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(); - {{/scalar}} - {{#array}} - _{{name}} = reader.read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}((reader: Read): {{#item}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/item}} => { - {{> deserialize_array}} - }); - {{/array}} - {{#map}} - _{{name}} = reader.read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}((reader: Read): {{#key}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/key}} => { - return reader.read{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}(); - }, (reader: Read): {{#value}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/value}} => { - {{> deserialize_map_value}} - }); - {{/map}} - {{#enum}} - {{> deserialize_enum}} - _{{name}} = value; - {{/enum}} - {{#object}} - {{> deserialize_object }} - _{{name}} = object; - {{/object}} - {{#required}} - _{{name}}Set = true; - {{/required}} - reader.context().pop(); - } - {{/properties}} - reader.context().pop(); - } - - {{#properties}} - {{#required}} - {{^object}} - if (!_{{name}}Set) { - {{/object}} - {{#object}} - if (!_{{name}} || !_{{name}}Set) { - {{/object}} - throw new Error(reader.context().printWithContext("Missing required property: '{{name}}: {{type}}'")); - } - {{/required}} - {{/properties}} - - return { - {{#properties}} - {{#detectKeyword}}{{name}}{{/detectKeyword}}: _{{name}}{{^last}},{{/last}} - {{/properties}} - }; -} diff --git a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/imported/index-ts.mustache b/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/imported/index-ts.mustache deleted file mode 100644 index f37a0641b8..0000000000 --- a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/imported/index-ts.mustache +++ /dev/null @@ -1,12 +0,0 @@ -{{#importedModuleTypes}} -export * from "./{{type}}"; -{{/importedModuleTypes}} -{{#importedObjectTypes}} -export * from "./{{type}}"; -{{/importedObjectTypes}} -{{#importedEnumTypes}} -export * from "./{{type}}"; -{{/importedEnumTypes}} -{{#importedEnvTypes}} -export * from "./{{type}}"; -{{/importedEnvTypes}} diff --git a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/imported/module-type/index-ts.mustache b/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/imported/module-type/index-ts.mustache deleted file mode 100644 index a1b0abaa22..0000000000 --- a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/imported/module-type/index-ts.mustache +++ /dev/null @@ -1,91 +0,0 @@ -import { - wrap_subinvoke, - wrap_subinvokeImplementation, - Box, - BigInt, - BigNumber, - JSON, - Result -} from "@polywrap/wasm-as"; -{{#methods.length}} -import { - {{#methods}} - serialize{{name}}Args, - deserialize{{name}}Result, - Args_{{#detectKeyword}}{{name}}{{/detectKeyword}}{{^last}},{{/last}} - {{/methods}} -} from "./serialization"; -{{/methods.length}} -import * as Types from "../.."; - -{{^isInterface}} -export class {{#detectKeyword}}{{type}}{{/detectKeyword}} { - - public static uri: string = "{{uri}}"; - - {{#methods}} - public static {{name}}( - args: Args_{{#detectKeyword}}{{name}}{{/detectKeyword}} - ): Result<{{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, string> { - const argsBuf = serialize{{name}}Args(args); - const result = wrap_subinvoke( - "{{uri}}", - "{{name}}", - argsBuf - ); - - if (result.isErr) { - return Result.Err<{{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, string>( - result.unwrapErr() - ); - } - - return Result.Ok<{{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, string>( - deserialize{{name}}Result(result.unwrap()) - ); - } - {{^last}} - - {{/last}} - {{/methods}} -} -{{/isInterface}} -{{#isInterface}} -export class {{#detectKeyword}}{{type}}{{/detectKeyword}} { - - public static interfaceUri: string = "{{uri}}"; - - public uri: string; - - constructor(uri: string) { - this.uri = uri; - } - - {{#methods}} - public {{name}}( - args: Args_{{#detectKeyword}}{{name}}{{/detectKeyword}} - ): Result<{{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, string> { - const argsBuf = serialize{{name}}Args(args); - const result = wrap_subinvokeImplementation( - "{{uri}}", - this.uri, - "{{name}}", - argsBuf - ); - - if (result.isErr) { - return Result.Err<{{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, string>( - result.unwrapErr() - ); - } - - return Result.Ok<{{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, string>( - deserialize{{name}}Result(result.unwrap()) - ); - } - {{^last}} - - {{/last}} - {{/methods}} -} -{{/isInterface}} diff --git a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/imported/module-type/serialization-ts.mustache b/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/imported/module-type/serialization-ts.mustache deleted file mode 100644 index f63acad622..0000000000 --- a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/imported/module-type/serialization-ts.mustache +++ /dev/null @@ -1,250 +0,0 @@ -{{#methods.length}} -{{> serialization_imports}} -import * as Types from "../.."; - -{{#methods}} -export class Args_{{#detectKeyword}}{{name}}{{/detectKeyword}} { - {{#arguments}} - {{#detectKeyword}}{{name}}{{/detectKeyword}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}}; - {{/arguments}} -} - -export function deserialize{{name}}Args(argsBuf: ArrayBuffer): Args_{{#detectKeyword}}{{name}}{{/detectKeyword}} { - const context: Context = new Context("Deserializing imported module-type: {{name}} Args"); - {{#arguments.length}} - const reader = new ReadDecoder(argsBuf, context); - let numFields = reader.readMapLength(); - - {{#arguments}} - {{^object}} - let _{{name}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = {{#toWasmInit}}{{toGraphQLType}}{{/toWasmInit}}; - {{/object}} - {{#object}} - {{#required}} - let _{{name}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} | null = null; - {{/required}} - {{^required}} - let _{{name}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = {{#toWasmInit}}{{toGraphQLType}}{{/toWasmInit}}; - {{/required}} - {{/object}} - {{#required}} - let _{{name}}Set: bool = false; - {{/required}} - {{/arguments}} - - while (numFields > 0) { - numFields--; - const field = reader.readString(); - - reader.context().push(field, "unknown", "searching for property type"); - {{#arguments}} - {{^first}}else {{/first}}if (field == "{{name}}") { - reader.context().push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property"); - {{#scalar}} - _{{name}} = reader.read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(); - {{/scalar}} - {{#array}} - _{{name}} = reader.read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}((reader: Read): {{#item}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/item}} => { - {{> deserialize_array}} - }); - {{/array}} - {{#map}} - _{{name}} = reader.read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}((reader: Read): {{#key}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/key}} => { - return reader.read{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}(); - }, (reader: Read): {{#value}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/value}} => { - {{> deserialize_map_value}} - }); - {{/map}} - {{#enum}} - {{> deserialize_enum}} - _{{name}} = value; - {{/enum}} - {{#object}} - {{> deserialize_object}} - _{{name}} = object; - {{/object}} - {{#required}} - _{{name}}Set = true; - {{/required}} - reader.context().pop(); - } - {{/arguments}} - reader.context().pop(); - } - - {{#arguments}} - {{#required}} - {{^object}} - if (!_{{name}}Set) { - {{/object}} - {{#object}} - if (!_{{name}} || !_{{name}}Set) { - {{/object}} - throw new Error(reader.context().printWithContext("Missing required argument: '{{name}}: {{type}}'")); - } - {{/required}} - {{/arguments}} - {{/arguments.length}} - - return { - {{#arguments}} - {{#detectKeyword}}{{name}}{{/detectKeyword}}: _{{name}}{{^last}},{{/last}} - {{/arguments}} - }; -} - -export function serialize{{name}}Args(args: Args_{{#detectKeyword}}{{name}}{{/detectKeyword}}): ArrayBuffer { - const sizerContext: Context = new Context("Serializing (sizing) imported module-type: {{name}} Args"); - const sizer = new WriteSizer(sizerContext); - write{{name}}Args(sizer, args); - const buffer = new ArrayBuffer(sizer.length); - const encoderContext: Context = new Context("Serializing (encoding) imported module-type: {{name}} Args"); - const encoder = new WriteEncoder(buffer, sizer, encoderContext); - write{{name}}Args(encoder, args); - return buffer; -} - -export function write{{name}}Args( - writer: Write, - args: Args_{{#detectKeyword}}{{name}}{{/detectKeyword}} -): void { - {{#arguments.length}} - writer.writeMapLength({{arguments.length}}); - {{/arguments.length}} - {{^arguments}} - writer.writeMapLength(0); - {{/arguments}} - {{#arguments}} - writer.context().push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property"); - writer.writeString("{{name}}"); - {{#scalar}} - writer.write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(args.{{#detectKeyword}}{{name}}{{/detectKeyword}}); - {{/scalar}} - {{#array}} - writer.write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(args.{{#detectKeyword}}{{name}}{{/detectKeyword}}, (writer: Write, item: {{#item}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/item}}): void => { - {{> serialize_array}} - }); - {{/array}} - {{#map}} - writer.write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(args.{{#detectKeyword}}{{name}}{{/detectKeyword}}, (writer: Write, key: {{#key}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/key}}) => { - writer.write{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}(key); - }, (writer: Write, value: {{#value}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/value}}): void => { - {{> serialize_map_value}} - }); - {{/map}} - {{#enum}} - {{#required}} - writer.writeInt32(args.{{#detectKeyword}}{{name}}{{/detectKeyword}}); - {{/required}} - {{^required}} - writer.writeOptionalInt32(args.{{#detectKeyword}}{{name}}{{/detectKeyword}}); - {{/required}} - {{/enum}} - {{#object}} - {{#required}} - Types.{{#detectKeyword}}{{type}}{{/detectKeyword}}.write(writer, args.{{#detectKeyword}}{{name}}{{/detectKeyword}}); - {{/required}} - {{^required}} - if (args.{{#detectKeyword}}{{name}}{{/detectKeyword}}) { - Types.{{#detectKeyword}}{{type}}{{/detectKeyword}}.write(writer, args.{{#detectKeyword}}{{name}}{{/detectKeyword}} as Types.{{#detectKeyword}}{{type}}{{/detectKeyword}}); - } else { - writer.writeNil(); - } - {{/required}} - {{/object}} - writer.context().pop(); - {{/arguments}} -} - -export function serialize{{name}}Result(result: {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}): ArrayBuffer { - const sizerContext: Context = new Context("Serializing (sizing) imported module-type: {{name}} Result"); - const sizer = new WriteSizer(sizerContext); - write{{name}}Result(sizer, result); - const buffer = new ArrayBuffer(sizer.length); - const encoderContext: Context = new Context("Serializing (encoding) imported module-type: {{name}} Result"); - const encoder = new WriteEncoder(buffer, sizer, encoderContext); - write{{name}}Result(encoder, result); - return buffer; -} - -export function write{{name}}Result(writer: Write, result: {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}): void { - {{#return}} - writer.context().push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property"); - {{#scalar}} - writer.write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(result); - {{/scalar}} - {{#array}} - writer.write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(result, (writer: Write, item: {{#item}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/item}}): void => { - {{> serialize_array}} - }); - {{/array}} - {{#map}} - writer.write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(result, (writer: Write, key: {{#key}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/key}}) => { - writer.write{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}(key); - }, (writer: Write, value: {{#value}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/value}}): void => { - {{> serialize_map_value}} - }); - {{/map}} - {{#enum}} - {{#required}} - writer.writeInt32(result); - {{/required}} - {{^required}} - writer.writeOptionalInt32(result); - {{/required}} - {{/enum}} - {{#object}} - {{#required}} - Types.{{#detectKeyword}}{{type}}{{/detectKeyword}}.write(writer, result); - {{/required}} - {{^required}} - if (result) { - Types.{{#detectKeyword}}{{type}}{{/detectKeyword}}.write(writer, result as Types.{{#detectKeyword}}{{type}}{{/detectKeyword}}); - } else { - writer.writeNil(); - } - {{/required}} - {{/object}} - writer.context().pop(); - {{/return}} -} - -export function deserialize{{name}}Result(buffer: ArrayBuffer): {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}} { - const context: Context = new Context("Deserializing imported module-type: {{name}} Result"); - const reader = new ReadDecoder(buffer, context); - - {{#return}} - reader.context().push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "reading function output"); - {{#scalar}} - const res: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = reader.read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(); - {{/scalar}} - {{#array}} - const res: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = reader.read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}((reader: Read): {{#item}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/item}} => { - {{> deserialize_array}} - }); - {{/array}} - {{#map}} - const res: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = reader.read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}((reader: Read): {{#key}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/key}} => { - return reader.read{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}(); - }, (reader: Read): {{#value}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/value}} => { - {{> deserialize_map_value}} - }); - {{/map}} - {{#enum}} - {{> deserialize_enum}} - const res: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = value; - {{/enum}} - {{#object}} - {{> deserialize_object}} - const res: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = object; - {{/object}} - {{/return}} - reader.context().pop(); - - return res; -} -{{^last}} - -{{/last}} -{{/methods}} -{{/methods.length}} diff --git a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/imported/object-type/index-ts.mustache b/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/imported/object-type/index-ts.mustache deleted file mode 100644 index 3d914e5ae1..0000000000 --- a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/imported/object-type/index-ts.mustache +++ /dev/null @@ -1,40 +0,0 @@ -import { - Read, - Write, - Box, - BigInt, - BigNumber, - JSON -} from "@polywrap/wasm-as"; -import { - serialize{{type}}, - deserialize{{type}}, - write{{type}}, - read{{type}} -} from "./serialization"; -import * as Types from "../.."; - -export class {{#detectKeyword}}{{type}}{{/detectKeyword}} { - - public static uri: string = "{{uri}}"; - - {{#properties}} - {{#detectKeyword}}{{name}}{{/detectKeyword}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}}; - {{/properties}} - - static toBuffer(type: {{#detectKeyword}}{{type}}{{/detectKeyword}}): ArrayBuffer { - return serialize{{type}}(type); - } - - static fromBuffer(buffer: ArrayBuffer): {{#detectKeyword}}{{type}}{{/detectKeyword}} { - return deserialize{{type}}(buffer); - } - - static write(writer: Write, type: {{#detectKeyword}}{{type}}{{/detectKeyword}}): void { - write{{type}}(writer, type); - } - - static read(reader: Read): {{#detectKeyword}}{{type}}{{/detectKeyword}} { - return read{{type}}(reader); - } -} diff --git a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/imported/object-type/serialization-ts.mustache b/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/imported/object-type/serialization-ts.mustache deleted file mode 100644 index c2b2bb40ec..0000000000 --- a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/imported/object-type/serialization-ts.mustache +++ /dev/null @@ -1,149 +0,0 @@ -{{> serialization_imports}} -import { {{#detectKeyword}}{{type}}{{/detectKeyword}} } from "./"; -import * as Types from "../.."; - -export function serialize{{type}}(type: {{#detectKeyword}}{{type}}{{/detectKeyword}}): ArrayBuffer { - const sizerContext: Context = new Context("Serializing (sizing) imported object-type: {{type}}"); - const sizer = new WriteSizer(sizerContext); - write{{type}}(sizer, type); - const buffer = new ArrayBuffer(sizer.length); - const encoderContext: Context = new Context("Serializing (encoding) import object-type: {{type}}"); - const encoder = new WriteEncoder(buffer, sizer, encoderContext); - write{{type}}(encoder, type); - return buffer; -} - -export function write{{type}}(writer: Write, type: {{#detectKeyword}}{{type}}{{/detectKeyword}}): void { - {{#properties.length}} - writer.writeMapLength({{properties.length}}); - {{/properties.length}} - {{^properties}} - writer.writeMapLength(0); - {{/properties}} - {{#properties}} - writer.context().push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property"); - writer.writeString("{{name}}"); - {{#scalar}} - writer.write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(type.{{#detectKeyword}}{{name}}{{/detectKeyword}}); - {{/scalar}} - {{#array}} - writer.write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(type.{{#detectKeyword}}{{name}}{{/detectKeyword}}, (writer: Write, item: {{#item}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/item}}): void => { - {{> serialize_array}} - }); - {{/array}} - {{#map}} - writer.write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(type.{{#detectKeyword}}{{name}}{{/detectKeyword}}, (writer: Write, key: {{#key}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/key}}) => { - writer.write{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}(key); - }, (writer: Write, value: {{#value}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/value}}): void => { - {{> serialize_map_value}} - }); - {{/map}} - {{#object}} - {{#required}} - Types.{{#detectKeyword}}{{type}}{{/detectKeyword}}.write(writer, type.{{#detectKeyword}}{{name}}{{/detectKeyword}}); - {{/required}} - {{^required}} - if (type.{{#detectKeyword}}{{name}}{{/detectKeyword}}) { - Types.{{#detectKeyword}}{{type}}{{/detectKeyword}}.write(writer, type.{{#detectKeyword}}{{name}}{{/detectKeyword}} as Types.{{#detectKeyword}}{{type}}{{/detectKeyword}}); - } else { - writer.writeNil(); - } - {{/required}} - {{/object}} - {{#enum}} - {{#required}} - writer.writeInt32(type.{{#detectKeyword}}{{name}}{{/detectKeyword}}); - {{/required}} - {{^required}} - writer.writeOptionalInt32(type.{{#detectKeyword}}{{name}}{{/detectKeyword}}); - {{/required}} - {{/enum}} - writer.context().pop(); - {{/properties}} -} - -export function deserialize{{type}}(buffer: ArrayBuffer): {{#detectKeyword}}{{type}}{{/detectKeyword}} { - const context: Context = new Context("Deserializing imported object-type {{type}}"); - const reader = new ReadDecoder(buffer, context); - return read{{type}}(reader); -} - -export function read{{type}}(reader: Read): {{#detectKeyword}}{{type}}{{/detectKeyword}} { - let numFields = reader.readMapLength(); - - {{#properties}} - {{^object}} - let _{{name}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = {{#toWasmInit}}{{toGraphQLType}}{{/toWasmInit}}; - {{/object}} - {{#object}} - {{#required}} - let _{{name}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} | null = null; - {{/required}} - {{^required}} - let _{{name}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = {{#toWasmInit}}{{toGraphQLType}}{{/toWasmInit}}; - {{/required}} - {{/object}} - {{#required}} - let _{{name}}Set: bool = false; - {{/required}} - {{/properties}} - - while (numFields > 0) { - numFields--; - const field = reader.readString(); - - reader.context().push(field, "unknown", "searching for property type"); - {{#properties}} - {{^first}}else {{/first}}if (field == "{{name}}") { - reader.context().push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property"); - {{#scalar}} - _{{name}} = reader.read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(); - {{/scalar}} - {{#array}} - _{{name}} = reader.read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}((reader: Read): {{#item}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/item}} => { - {{> deserialize_array}} - }); - {{/array}} - {{#map}} - _{{name}} = reader.read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}((reader: Read): {{#key}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/key}} => { - return reader.read{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}(); - }, (reader: Read): {{#value}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/value}} => { - {{> deserialize_map_value}} - }); - {{/map}} - {{#enum}} - {{> deserialize_enum}} - _{{name}} = value; - {{/enum}} - {{#object}} - {{> deserialize_object }} - _{{name}} = object; - {{/object}} - {{#required}} - _{{name}}Set = true; - {{/required}} - reader.context().pop(); - } - {{/properties}} - reader.context().pop(); - } - - {{#properties}} - {{#required}} - {{^object}} - if (!_{{name}}Set) { - {{/object}} - {{#object}} - if (!_{{name}} || !_{{name}}Set) { - {{/object}} - throw new Error(reader.context().printWithContext("Missing required property: '{{name}}: {{type}}'")); - } - {{/required}} - {{/properties}} - - return { - {{#properties}} - {{#detectKeyword}}{{name}}{{/detectKeyword}}: _{{name}}{{^last}},{{/last}} - {{/properties}} - }; -} diff --git a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/index-ts.mustache b/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/index-ts.mustache deleted file mode 100644 index 626b0cda60..0000000000 --- a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/index-ts.mustache +++ /dev/null @@ -1,55 +0,0 @@ -{{#moduleType}} -{{#methods.length}} -import { - {{#methods}} - Args_{{#detectKeyword}}{{name}}{{/detectKeyword}}{{^last}},{{/last}} - {{/methods}} -} from "./{{type}}"; -{{/methods.length}} -{{/moduleType}} -{{#moduleType}} -{{#methods.length}} -export { - {{#methods}} - Args_{{#detectKeyword}}{{name}}{{/detectKeyword}}{{^last}},{{/last}} - {{/methods}} -}; -{{/methods.length}} -{{/moduleType}} -{{#moduleType}} -export { ModuleBase } from "./Module"; -{{/moduleType}} -{{#objectTypes}} -export { {{#detectKeyword}}{{type}}{{/detectKeyword}} } from "./{{type}}"; -{{/objectTypes}} -{{#enumTypes}} -export { - {{#detectKeyword}}{{type}}{{/detectKeyword}}, - get{{type}}Key, - get{{type}}Value, - sanitize{{type}}Value -} from "./{{type}}"; -{{/enumTypes}} -{{#importedModuleTypes}} -export { {{#detectKeyword}}{{type}}{{/detectKeyword}} } from "./imported/{{type}}"; -{{/importedModuleTypes}} -{{#importedObjectTypes}} -export { {{#detectKeyword}}{{type}}{{/detectKeyword}} } from "./imported/{{type}}"; -{{/importedObjectTypes}} -{{#importedEnvTypes}} -export { {{#detectKeyword}}{{type}}{{/detectKeyword}} } from "./imported/{{type}}"; -{{/importedEnvTypes}} -{{#importedEnumTypes}} -export { - {{#detectKeyword}}{{type}}{{/detectKeyword}}, - get{{type}}Key, - get{{type}}Value, - sanitize{{type}}Value -} from "./imported/{{type}}"; -{{/importedEnumTypes}} -{{#interfaceTypes}} -export { {{#detectKeyword}}{{namespace}}{{/detectKeyword}} } from "./{{namespace}}"; -{{/interfaceTypes}} -{{#envType}} -export { Env } from "./Env"; -{{/envType}} diff --git a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/interface-type/index-ts.mustache b/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/interface-type/index-ts.mustache deleted file mode 100644 index 25239251f4..0000000000 --- a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/interface-type/index-ts.mustache +++ /dev/null @@ -1,23 +0,0 @@ -{{#capabilities}} -{{#getImplementations}} -{{#enabled}} -import { - wrap_getImplementations -} from "@polywrap/wasm-as"; -{{/enabled}} -{{/getImplementations}} -{{/capabilities}} - -export class {{#detectKeyword}}{{namespace}}{{/detectKeyword}} { - static uri: string = "{{uri}}" - - {{#capabilities}} - {{#getImplementations}} - {{#enabled}} - public static getImplementations(): string[] { - return wrap_getImplementations(this.uri); - } - {{/enabled}} - {{/getImplementations}} - {{/capabilities}} -} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/module-type/index-ts.mustache b/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/module-type/index-ts.mustache deleted file mode 100644 index 654a54f746..0000000000 --- a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/module-type/index-ts.mustache +++ /dev/null @@ -1,14 +0,0 @@ -{{#methods.length}} -import { - {{#methods}} - Args_{{#detectKeyword}}{{name}}{{/detectKeyword}}{{^last}},{{/last}} - {{/methods}} -} from "./serialization"; - -export { - {{#methods}} - Args_{{#detectKeyword}}{{name}}{{/detectKeyword}}{{^last}},{{/last}} - {{/methods}} -}; -export { ModuleBase } from "./module"; -{{/methods.length}} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/module-type/module-ts.mustache b/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/module-type/module-ts.mustache deleted file mode 100644 index 728479210d..0000000000 --- a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/module-type/module-ts.mustache +++ /dev/null @@ -1,20 +0,0 @@ -import * as Types from ".."; - -import { - BigInt, - BigNumber, - Box, - JSON, -} from "@polywrap/wasm-as"; - -export abstract class ModuleBase { - {{#methods}} - abstract {{#detectKeyword}}{{name}}{{/detectKeyword}}( - args: Types.Args_{{#detectKeyword}}{{name}}{{/detectKeyword}}{{#env}}, - env: {{#required}}Types.Env{{/required}}{{^required}}Types.Env | null{{/required}}{{/env}} - ): {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}; - {{^last}} - - {{/last}} - {{/methods}} -} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/module-type/serialization-ts.mustache b/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/module-type/serialization-ts.mustache deleted file mode 100644 index 415a33a2fb..0000000000 --- a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/module-type/serialization-ts.mustache +++ /dev/null @@ -1,248 +0,0 @@ -{{> serialization_imports}} -import * as Types from ".."; - -{{#methods}} -export class Args_{{#detectKeyword}}{{name}}{{/detectKeyword}} { - {{#arguments}} - {{#detectKeyword}}{{name}}{{/detectKeyword}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}}; - {{/arguments}} -} - -export function deserialize{{name}}Args(argsBuf: ArrayBuffer): Args_{{#detectKeyword}}{{name}}{{/detectKeyword}} { - const context: Context = new Context("Deserializing module-type: {{name}} Args"); - {{#arguments.length}} - const reader = new ReadDecoder(argsBuf, context); - let numFields = reader.readMapLength(); - - {{#arguments}} - {{^object}} - let _{{name}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = {{#toWasmInit}}{{toGraphQLType}}{{/toWasmInit}}; - {{/object}} - {{#object}} - {{#required}} - let _{{name}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} | null = null; - {{/required}} - {{^required}} - let _{{name}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = {{#toWasmInit}}{{toGraphQLType}}{{/toWasmInit}}; - {{/required}} - {{/object}} - {{#required}} - let _{{name}}Set: bool = false; - {{/required}} - {{/arguments}} - - while (numFields > 0) { - numFields--; - const field = reader.readString(); - - reader.context().push(field, "unknown", "searching for property type"); - {{#arguments}} - {{^first}}else {{/first}}if (field == "{{name}}") { - reader.context().push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property"); - {{#scalar}} - _{{name}} = reader.read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(); - {{/scalar}} - {{#array}} - _{{name}} = reader.read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}((reader: Read): {{#item}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/item}} => { - {{> deserialize_array}} - }); - {{/array}} - {{#map}} - _{{name}} = reader.read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}((reader: Read): {{#key}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/key}} => { - return reader.read{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}(); - }, (reader: Read): {{#value}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/value}} => { - {{> deserialize_map_value}} - }); - {{/map}} - {{#enum}} - {{> deserialize_enum}} - _{{name}} = value; - {{/enum}} - {{#object}} - {{> deserialize_object}} - _{{name}} = object; - {{/object}} - {{#required}} - _{{name}}Set = true; - {{/required}} - reader.context().pop(); - } - {{/arguments}} - reader.context().pop(); - } - - {{#arguments}} - {{#required}} - {{^object}} - if (!_{{name}}Set) { - {{/object}} - {{#object}} - if (!_{{name}} || !_{{name}}Set) { - {{/object}} - throw new Error(reader.context().printWithContext("Missing required argument: '{{name}}: {{type}}'")); - } - {{/required}} - {{/arguments}} - {{/arguments.length}} - - return { - {{#arguments}} - {{#detectKeyword}}{{name}}{{/detectKeyword}}: _{{name}}{{^last}},{{/last}} - {{/arguments}} - }; -} - -export function serialize{{name}}Args(args: Args_{{#detectKeyword}}{{name}}{{/detectKeyword}}): ArrayBuffer { - const sizerContext: Context = new Context("Serializing (sizing) module-type: {{name}} Args"); - const sizer = new WriteSizer(sizerContext); - write{{name}}Args(sizer, args); - const buffer = new ArrayBuffer(sizer.length); - const encoderContext: Context = new Context("Serializing (encoding) module-type: {{name}} Args"); - const encoder = new WriteEncoder(buffer, sizer, encoderContext); - write{{name}}Args(encoder, args); - return buffer; -} - -export function write{{name}}Args( - writer: Write, - args: Args_{{#detectKeyword}}{{name}}{{/detectKeyword}} -): void { - {{#arguments.length}} - writer.writeMapLength({{arguments.length}}); - {{/arguments.length}} - {{^arguments}} - writer.writeMapLength(0); - {{/arguments}} - {{#arguments}} - writer.context().push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property"); - writer.writeString("{{name}}"); - {{#scalar}} - writer.write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(args.{{#detectKeyword}}{{name}}{{/detectKeyword}}); - {{/scalar}} - {{#array}} - writer.write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(args.{{#detectKeyword}}{{name}}{{/detectKeyword}}, (writer: Write, item: {{#item}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/item}}): void => { - {{> serialize_array}} - }); - {{/array}} - {{#map}} - writer.write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(args.{{#detectKeyword}}{{name}}{{/detectKeyword}}, (writer: Write, key: {{#key}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/key}}) => { - writer.write{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}(key); - }, (writer: Write, value: {{#value}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/value}}): void => { - {{> serialize_map_value}} - }); - {{/map}} - {{#enum}} - {{#required}} - writer.writeInt32(args.{{#detectKeyword}}{{name}}{{/detectKeyword}}); - {{/required}} - {{^required}} - writer.writeOptionalInt32(args.{{#detectKeyword}}{{name}}{{/detectKeyword}}); - {{/required}} - {{/enum}} - {{#object}} - {{#required}} - Types.{{#detectKeyword}}{{type}}{{/detectKeyword}}.write(writer, args.{{#detectKeyword}}{{name}}{{/detectKeyword}}); - {{/required}} - {{^required}} - if (args.{{#detectKeyword}}{{name}}{{/detectKeyword}}) { - Types.{{#detectKeyword}}{{type}}{{/detectKeyword}}.write(writer, args.{{#detectKeyword}}{{name}}{{/detectKeyword}} as Types.{{#detectKeyword}}{{type}}{{/detectKeyword}}); - } else { - writer.writeNil(); - } - {{/required}} - {{/object}} - writer.context().pop(); - {{/arguments}} -} - -export function serialize{{name}}Result(result: {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}): ArrayBuffer { - const sizerContext: Context = new Context("Serializing (sizing) module-type: {{name}} Result"); - const sizer = new WriteSizer(sizerContext); - write{{name}}Result(sizer, result); - const buffer = new ArrayBuffer(sizer.length); - const encoderContext: Context = new Context("Serializing (encoding) module-type: {{name}} Result"); - const encoder = new WriteEncoder(buffer, sizer, encoderContext); - write{{name}}Result(encoder, result); - return buffer; -} - -export function write{{name}}Result(writer: Write, result: {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}): void { - {{#return}} - writer.context().push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property"); - {{#scalar}} - writer.write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(result); - {{/scalar}} - {{#array}} - writer.write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(result, (writer: Write, item: {{#item}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/item}}): void => { - {{> serialize_array}} - }); - {{/array}} - {{#map}} - writer.write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(result, (writer: Write, key: {{#key}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/key}}) => { - writer.write{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}(key); - }, (writer: Write, value: {{#value}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/value}}): void => { - {{> serialize_map_value}} - }); - {{/map}} - {{#enum}} - {{#required}} - writer.writeInt32(result); - {{/required}} - {{^required}} - writer.writeOptionalInt32(result); - {{/required}} - {{/enum}} - {{#object}} - {{#required}} - Types.{{#detectKeyword}}{{type}}{{/detectKeyword}}.write(writer, result); - {{/required}} - {{^required}} - if (result) { - Types.{{#detectKeyword}}{{type}}{{/detectKeyword}}.write(writer, result as Types.{{#detectKeyword}}{{type}}{{/detectKeyword}}); - } else { - writer.writeNil(); - } - {{/required}} - {{/object}} - writer.context().pop(); - {{/return}} -} - -export function deserialize{{name}}Result(buffer: ArrayBuffer): {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}} { - const context: Context = new Context("Deserializing module-type: {{name}} Result"); - const reader = new ReadDecoder(buffer, context); - - {{#return}} - reader.context().push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "reading function output"); - {{#scalar}} - const res: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = reader.read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(); - {{/scalar}} - {{#array}} - const res: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = reader.read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}((reader: Read): {{#item}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/item}} => { - {{> deserialize_array}} - }); - {{/array}} - {{#map}} - const res: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = reader.read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}((reader: Read): {{#key}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/key}} => { - return reader.read{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}(); - }, (reader: Read): {{#value}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/value}} => { - {{> deserialize_map_value}} - }); - {{/map}} - {{#enum}} - {{> deserialize_enum}} - const res: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = value; - {{/enum}} - {{#object}} - {{> deserialize_object}} - const res: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = object; - {{/object}} - {{/return}} - reader.context().pop(); - - return res; -} -{{^last}} - -{{/last}} -{{/methods}} diff --git a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/module-type/wrapped-ts.mustache b/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/module-type/wrapped-ts.mustache deleted file mode 100644 index c2f461f292..0000000000 --- a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/module-type/wrapped-ts.mustache +++ /dev/null @@ -1,49 +0,0 @@ -{{#methods.length}} -import { wrap_load_env } from "@polywrap/wasm-as"; -import { - {{#methods}} - deserialize{{name}}Args, - serialize{{name}}Result{{^last}},{{/last}} - {{/methods}} -} from "./serialization"; -{{/methods.length}} -import { ModuleBase } from "./module"; -import * as Types from ".."; - -{{#methods}} -export function {{name}}Wrapped(module: ModuleBase, argsBuf: ArrayBuffer, env_size: u32): ArrayBuffer { - {{#env}} - {{#required}} - if (env_size == 0) { - throw new Error("Environment is not set, and it is required by method '{{name}}'") - } - - const envBuf = wrap_load_env(env_size); - const env = Types.Env.fromBuffer(envBuf); - {{/required}} - {{^required}} - let env: Types.Env | null = null; - if (env_size > 0) { - const envBuf = wrap_load_env(env_size); - env = Types.Env.fromBuffer(envBuf); - } - {{/required}} - {{/env}} - {{#arguments.length}} - const args = deserialize{{name}}Args(argsBuf); - {{/arguments.length}} - - const result = module.{{#detectKeyword}}{{name}}{{/detectKeyword}}({{#arguments.length}} - { - {{#arguments}} - {{#detectKeyword}}{{name}}{{/detectKeyword}}: args.{{#detectKeyword}}{{name}}{{/detectKeyword}}{{^last}},{{/last}} - {{/arguments}} - }{{/arguments.length}}{{^arguments.length}}{}{{/arguments.length}}{{#env}}, - env{{/env}} - ); - return serialize{{name}}Result(result); -} -{{^last}} - -{{/last}} -{{/methods}} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/object-type/index-ts.mustache b/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/object-type/index-ts.mustache deleted file mode 100644 index 8199149c0d..0000000000 --- a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/object-type/index-ts.mustache +++ /dev/null @@ -1,37 +0,0 @@ -import { - Read, - Write, - Box, - BigInt, - BigNumber, - JSON -} from "@polywrap/wasm-as"; -import { - serialize{{type}}, - deserialize{{type}}, - write{{type}}, - read{{type}} -} from "./serialization"; -import * as Types from ".."; - -export class {{#detectKeyword}}{{type}}{{/detectKeyword}} { - {{#properties}} - {{#detectKeyword}}{{name}}{{/detectKeyword}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}}; - {{/properties}} - - static toBuffer(type: {{#detectKeyword}}{{type}}{{/detectKeyword}}): ArrayBuffer { - return serialize{{type}}(type); - } - - static fromBuffer(buffer: ArrayBuffer): {{#detectKeyword}}{{type}}{{/detectKeyword}} { - return deserialize{{type}}(buffer); - } - - static write(writer: Write, type: {{#detectKeyword}}{{type}}{{/detectKeyword}}): void { - write{{type}}(writer, type); - } - - static read(reader: Read): {{#detectKeyword}}{{type}}{{/detectKeyword}} { - return read{{type}}(reader); - } -} diff --git a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/object-type/serialization-ts.mustache b/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/object-type/serialization-ts.mustache deleted file mode 100644 index 831b72a573..0000000000 --- a/packages/schema/bind/src/bindings/assemblyscript/wasm/templates/object-type/serialization-ts.mustache +++ /dev/null @@ -1,149 +0,0 @@ -{{> serialization_imports}} -import { {{#detectKeyword}}{{type}}{{/detectKeyword}} } from "./"; -import * as Types from ".."; - -export function serialize{{type}}(type: {{#detectKeyword}}{{type}}{{/detectKeyword}}): ArrayBuffer { - const sizerContext: Context = new Context("Serializing (sizing) object-type: {{type}}"); - const sizer = new WriteSizer(sizerContext); - write{{type}}(sizer, type); - const buffer = new ArrayBuffer(sizer.length); - const encoderContext: Context = new Context("Serializing (encoding) object-type: {{type}}"); - const encoder = new WriteEncoder(buffer, sizer, encoderContext); - write{{type}}(encoder, type); - return buffer; -} - -export function write{{type}}(writer: Write, type: {{#detectKeyword}}{{type}}{{/detectKeyword}}): void { - {{#properties.length}} - writer.writeMapLength({{properties.length}}); - {{/properties.length}} - {{^properties}} - writer.writeMapLength(0); - {{/properties}} - {{#properties}} - writer.context().push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property"); - writer.writeString("{{name}}"); - {{#scalar}} - writer.write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(type.{{#detectKeyword}}{{name}}{{/detectKeyword}}); - {{/scalar}} - {{#array}} - writer.write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(type.{{#detectKeyword}}{{name}}{{/detectKeyword}}, (writer: Write, item: {{#item}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/item}}): void => { - {{> serialize_array}} - }); - {{/array}} - {{#map}} - writer.write{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(type.{{#detectKeyword}}{{name}}{{/detectKeyword}}, (writer: Write, key: {{#key}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/key}}) => { - writer.write{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}(key); - }, (writer: Write, value: {{#value}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/value}}): void => { - {{> serialize_map_value}} - }); - {{/map}} - {{#object}} - {{#required}} - Types.{{#detectKeyword}}{{type}}{{/detectKeyword}}.write(writer, type.{{#detectKeyword}}{{name}}{{/detectKeyword}}); - {{/required}} - {{^required}} - if (type.{{#detectKeyword}}{{name}}{{/detectKeyword}}) { - Types.{{#detectKeyword}}{{type}}{{/detectKeyword}}.write(writer, type.{{#detectKeyword}}{{name}}{{/detectKeyword}} as Types.{{#detectKeyword}}{{type}}{{/detectKeyword}}); - } else { - writer.writeNil(); - } - {{/required}} - {{/object}} - {{#enum}} - {{#required}} - writer.writeInt32(type.{{#detectKeyword}}{{name}}{{/detectKeyword}}); - {{/required}} - {{^required}} - writer.writeOptionalInt32(type.{{#detectKeyword}}{{name}}{{/detectKeyword}}); - {{/required}} - {{/enum}} - writer.context().pop(); - {{/properties}} -} - -export function deserialize{{type}}(buffer: ArrayBuffer): {{#detectKeyword}}{{type}}{{/detectKeyword}} { - const context: Context = new Context("Deserializing object-type {{type}}"); - const reader = new ReadDecoder(buffer, context); - return read{{type}}(reader); -} - -export function read{{type}}(reader: Read): {{#detectKeyword}}{{type}}{{/detectKeyword}} { - let numFields = reader.readMapLength(); - - {{#properties}} - {{^object}} - let _{{name}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = {{#toWasmInit}}{{toGraphQLType}}{{/toWasmInit}}; - {{/object}} - {{#object}} - {{#required}} - let _{{name}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} | null = null; - {{/required}} - {{^required}} - let _{{name}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = {{#toWasmInit}}{{toGraphQLType}}{{/toWasmInit}}; - {{/required}} - {{/object}} - {{#required}} - let _{{name}}Set: bool = false; - {{/required}} - {{/properties}} - - while (numFields > 0) { - numFields--; - const field = reader.readString(); - - reader.context().push(field, "unknown", "searching for property type"); - {{#properties}} - {{^first}}else {{/first}}if (field == "{{name}}") { - reader.context().push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property"); - {{#scalar}} - _{{name}} = reader.read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}(); - {{/scalar}} - {{#array}} - _{{name}} = reader.read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}((reader: Read): {{#item}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/item}} => { - {{> deserialize_array}} - }); - {{/array}} - {{#map}} - _{{name}} = reader.read{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}((reader: Read): {{#key}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/key}} => { - return reader.read{{#key}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/key}}(); - }, (reader: Read): {{#value}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/value}} => { - {{> deserialize_map_value}} - }); - {{/map}} - {{#enum}} - {{> deserialize_enum}} - _{{name}} = value; - {{/enum}} - {{#object}} - {{> deserialize_object }} - _{{name}} = object; - {{/object}} - {{#required}} - _{{name}}Set = true; - {{/required}} - reader.context().pop(); - } - {{/properties}} - reader.context().pop(); - } - - {{#properties}} - {{#required}} - {{^object}} - if (!_{{name}}Set) { - {{/object}} - {{#object}} - if (!_{{name}} || !_{{name}}Set) { - {{/object}} - throw new Error(reader.context().printWithContext("Missing required property: '{{name}}: {{type}}'")); - } - {{/required}} - {{/properties}} - - return { - {{#properties}} - {{#detectKeyword}}{{name}}{{/detectKeyword}}: _{{name}}{{^last}},{{/last}} - {{/properties}} - }; -} diff --git a/packages/schema/bind/src/bindings/index.ts b/packages/schema/bind/src/bindings/index.ts index 84310656e1..34b27eee75 100644 --- a/packages/schema/bind/src/bindings/index.ts +++ b/packages/schema/bind/src/bindings/index.ts @@ -1,11 +1,10 @@ import { GenerateBindingFn } from "./types"; import { BindLanguage } from "../"; -import * as AssemblyScript from "./assemblyscript"; import * as Rust from "./rust"; import * as TypeScript from "./typescript"; import * as WrapBindgen from "./wrap-bindgen"; -export { AssemblyScript, Rust, TypeScript }; +export { Rust, TypeScript }; export * from "./types"; export * from "./utils"; diff --git a/packages/schema/bind/src/bindings/python/functions.ts b/packages/schema/bind/src/bindings/python/functions.ts deleted file mode 100644 index 6aa4e0119c..0000000000 --- a/packages/schema/bind/src/bindings/python/functions.ts +++ /dev/null @@ -1,174 +0,0 @@ -import { MustacheFn } from "../types"; -import { isKeyword } from "./types"; - -// check if any of the keywords match the property name; -// if there's a match, insert `r_` at the beginning of the property name. -// `_` has special meaning in Python, so we use `r_` to avoid conflicts. -export const detectKeyword: MustacheFn = () => { - return (value: string, render: (template: string) => string): string => { - const type = render(value); - if (isKeyword(type)) { - return "r_" + type; // `r_` is the prefix we use for reserved keywords - } - return type; - }; -}; - -function replaceAt(str: string, index: number, replacement: string): string { - return ( - str.substr(0, index) + replacement + str.substr(index + replacement.length) - ); -} - -function insertAt(str: string, index: number, insert: string): string { - return str.substr(0, index) + insert + str.substr(index); -} - -function removeAt(str: string, index: number): string { - return str.substr(0, index) + str.substr(index + 1); -} - -export const toLower: MustacheFn = () => { - return (value: string, render: (template: string) => string) => { - let type = render(value); - - for (let i = 0; i < type.length; ++i) { - const char = type.charAt(i); - const lower = char.toLowerCase(); - - if (char !== lower) { - // Replace the uppercase char w/ the lowercase version - type = replaceAt(type, i, lower); - - if (i !== 0 && type[i - 1] !== "_") { - // Make sure all lowercase conversions have an underscore before them - type = insertAt(type, i, "_"); - } - } - } - - return type; - }; -}; - -export const toUpper: MustacheFn = () => { - return (value: string, render: (template: string) => string) => { - let type = render(value); - - // First character must always be upper case - const firstChar = type.charAt(0); - const firstUpper = firstChar.toUpperCase(); - type = replaceAt(type, 0, firstUpper); - - // Look for any underscores, remove them if they exist, and make next letter uppercase - for (let i = 0; i < type.length; ++i) { - const char = type.charAt(i); - - if (char === "_") { - const nextChar = type.charAt(i + 1); - const nextCharUpper = nextChar.toUpperCase(); - type = replaceAt(type, i + 1, nextCharUpper); - type = removeAt(type, i); - } - } - - return type; - }; -}; - -export const toPython: MustacheFn = () => { - return _toPython; -}; - -const _toPython = (value: string, render: (template: string) => string) => { - let type = render(value); - - let optional = false; - if (type[type.length - 1] === "!") { - type = type.substring(0, type.length - 1); - } else { - optional = true; - } - - if (type[0] === "[") { - return toPythonList(type, optional); - } - - if (type.startsWith("Map<")) { - return toPythonGenericMap(type, optional); - } - - switch (type) { - case "Int": - case "Int8": - case "Int16": - case "Int32": - case "Int64": - case "UInt": - case "UInt32": - case "UInt8": - case "UInt16": - case "UInt64": - type = "int"; - break; - case "JSON": - case "String": - case "BigInt": - case "BigNumber": - type = "str"; - break; - case "Boolean": - type = "bool"; - break; - case "Bytes": - type = "bytes"; - break; - default: - if (type.includes("Enum_")) { - type = type.replace("Enum_", ""); - } - type = toUpper()(type, (str) => str); - type = detectKeyword()(type, (str) => str); - type = `"${type}"`; - } - - return applyOptional(type, optional); -}; - -const toPythonList = (type: string, optional: boolean): string => { - const result = type.match(/(\[)([[\]A-Za-z0-9_.!]+)(\])/); - - if (!result || result.length !== 4) { - throw Error(`Invalid List: ${type}`); - } - - const tsType = _toPython(result[2], (str) => str); - return applyOptional("list[" + tsType + "]", optional); -}; - -const toPythonGenericMap = (type: string, optional: boolean): string => { - const openAngleBracketIdx = type.indexOf("<"); - const closeAngleBracketIdx = type.lastIndexOf(">"); - - const keyValTypes = type.substring( - openAngleBracketIdx + 1, - closeAngleBracketIdx - ); - - const firstCommaIdx = keyValTypes.indexOf(","); - const keyType = keyValTypes.substring(0, firstCommaIdx).trim(); - const valType = keyValTypes.substring(firstCommaIdx + 1).trim(); - - const tsKeyType = _toPython(keyType, (str) => str); - const tsValType = _toPython(valType, (str) => str); - - return applyOptional(`GenericMap[${tsKeyType}, ${tsValType}]`, optional); -}; - -const applyOptional = (type: string, optional: boolean): string => { - if (optional) { - return `Optional[${type}]`; - } else { - return type; - } -}; diff --git a/packages/schema/bind/src/bindings/python/index.ts b/packages/schema/bind/src/bindings/python/index.ts deleted file mode 100644 index 8587b3391c..0000000000 --- a/packages/schema/bind/src/bindings/python/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * as Plugin from "./plugin"; -export * as Functions from "./functions"; -export * as Types from "./types"; diff --git a/packages/schema/bind/src/bindings/python/plugin/index.ts b/packages/schema/bind/src/bindings/python/plugin/index.ts deleted file mode 100644 index 5cbd63d7ed..0000000000 --- a/packages/schema/bind/src/bindings/python/plugin/index.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -import * as Functions from "../functions"; -import { GenerateBindingFn, renderTemplates } from "../.."; -import { BindOptions, BindOutput } from "../../.."; -import { addEnumMembers } from "../transformers"; - -import { - transformAbi, - extendType, - addFirstLast, - toPrefixedGraphQLType, - methodParentPointers, - interfaceUris, -} from "@polywrap/schema-parse"; -import { WrapAbi } from "@polywrap/wrap-manifest-types-js"; -import path from "path"; -import { latestWrapManifestVersion } from "@polywrap/wrap-manifest-types-js"; - -export { Functions }; - -const templatePath = (subpath: string) => - path.join(__dirname, "./templates", subpath); - -const sort = (obj: Record) => - Object.keys(obj || {}) - .sort() - .reduce((map: Record, key: string) => { - if (typeof obj[key] === "object") { - map[key] = sort(obj[key] as Record); - - if (Array.isArray(obj[key])) { - map[key] = Object.values(map[key] as Record); - } - } else { - map[key] = obj[key]; - } - return map; - }, {}); - -export const generateBinding: GenerateBindingFn = ( - options: BindOptions -): BindOutput => { - const escapedAbi = JSON.stringify( - sort((options.wrapInfo.abi as unknown) as Record) - ).replace(/\\n/g, "\\\\n"); - - const formattedAbi = JSON.stringify(JSON.parse(escapedAbi), null, 2); - - // Apply Abi transforms - const abi = applyTransforms(options.wrapInfo.abi); - - // Generate Bindings - const result: BindOutput = { - output: { - entries: [], - }, - outputDirAbs: options.outputDirAbs, - }; - const output = result.output; - const manifest = { - name: options.wrapInfo.name, - type: "plugin", - version: latestWrapManifestVersion, - abi: formattedAbi, - }; - - output.entries = renderTemplates(templatePath(""), { ...abi, manifest }, {}); - - return result; -}; - -function applyTransforms(abi: WrapAbi): WrapAbi { - const transforms = [ - extendType(Functions), - addFirstLast, - toPrefixedGraphQLType, - methodParentPointers(), - interfaceUris(), - addEnumMembers, - ]; - - for (const transform of transforms) { - abi = transformAbi(abi, transform); - } - return abi; -} diff --git a/packages/schema/bind/src/bindings/python/plugin/templates/__init__-py.mustache b/packages/schema/bind/src/bindings/python/plugin/templates/__init__-py.mustache deleted file mode 100644 index d2ad6b3725..0000000000 --- a/packages/schema/bind/src/bindings/python/plugin/templates/__init__-py.mustache +++ /dev/null @@ -1,6 +0,0 @@ -# NOTE: This is an auto-generated file. All modifications will be overwritten. -# type: ignore - -from .types import * -from .module import * -from .wrap_info import * diff --git a/packages/schema/bind/src/bindings/python/plugin/templates/module-py.mustache b/packages/schema/bind/src/bindings/python/plugin/templates/module-py.mustache deleted file mode 100644 index 76184395ef..0000000000 --- a/packages/schema/bind/src/bindings/python/plugin/templates/module-py.mustache +++ /dev/null @@ -1,54 +0,0 @@ -# NOTE: This is an auto-generated file. All modifications will be overwritten. -# type: ignore -from __future__ import annotations - -from abc import abstractmethod -from typing import TypeVar, Generic, TypedDict, Optional - -from .types import * - -from polywrap_core import InvokerClient -from polywrap_plugin import PluginModule -from polywrap_msgpack import GenericMap - -TConfig = TypeVar("TConfig") - - -{{#moduleType}} -{{#methods}} -Args{{#toUpper}}{{name}}{{/toUpper}} = TypedDict("Args{{#toUpper}}{{name}}{{/toUpper}}", { - {{#arguments}} - "{{name}}": {{#toPython}}{{toGraphQLType}}{{/toPython}}{{^last}},{{/last}} - {{/arguments}} -}) - -{{/methods}} -{{/moduleType}} - -class Module(Generic[TConfig], PluginModule[TConfig]): - def __new__(cls, *args, **kwargs): - # NOTE: This is used to dynamically add WRAP ABI compatible methods to the class - instance = super().__new__(cls) - {{#moduleType}} - {{#methods}} - setattr(instance, "{{name}}", instance.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}) - {{/methods}} - {{/moduleType}} - return instance - - {{#moduleType}} - {{#methods}} - @abstractmethod - def {{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}( - self, - args: Args{{#toUpper}}{{name}}{{/toUpper}}, - client: InvokerClient, - {{^env}}env: None{{/env}}{{#env}}env: {{^required}}Optional[{{/required}}Env{{^required}}] = None{{/required}}{{/env}} - ) -> {{#return}}{{#toPython}}{{toGraphQLType}}{{/toPython}}{{/return}}: - pass - {{^last}} - - {{/last}} - {{/methods}} - {{/moduleType}} - diff --git a/packages/schema/bind/src/bindings/python/plugin/templates/types-py.mustache b/packages/schema/bind/src/bindings/python/plugin/templates/types-py.mustache deleted file mode 100644 index ea1a1886a2..0000000000 --- a/packages/schema/bind/src/bindings/python/plugin/templates/types-py.mustache +++ /dev/null @@ -1,169 +0,0 @@ -# NOTE: This is an auto-generated file. All modifications will be overwritten. -# type: ignore -from __future__ import annotations - -from typing import TypedDict, Optional -from enum import IntEnum - -from polywrap_core import InvokerClient, Uri -from polywrap_msgpack import GenericMap - - -### Env START ### - -{{#envType}} -{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} = TypedDict("{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}", { - {{#properties}} - "{{name}}": {{#toPython}}{{toGraphQLType}}{{/toPython}}, - {{/properties}} -}) - -{{/envType}} -### Env END ### - -### Objects START ### - -{{#objectTypes}} -{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} = TypedDict("{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}", { - {{#properties}} - "{{name}}": {{#toPython}}{{toGraphQLType}}{{/toPython}}, - {{/properties}} -}) - -{{/objectTypes}} -### Objects END ### - -### Enums START ### -{{#enumTypes}} -class {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}(IntEnum): - {{#members}} - {{#detectKeyword}}{{name}}{{/detectKeyword}} = {{value}}, "{{value}}", "{{name}}" - {{/members}} - - def __new__(cls, value: int, *aliases: str): - obj = int.__new__(cls) - obj._value_ = value - for alias in aliases: - cls._value2member_map_[alias] = obj - return obj - -{{/enumTypes}} -### Enums END ### - -### Imported Objects START ### - -{{#importedObjectTypes}} -# URI: "{{uri}}" # -{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} = TypedDict("{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}", { - {{#properties}} - "{{name}}": {{#toPython}}{{toGraphQLType}}{{/toPython}}, - {{/properties}} -}) - -{{/importedObjectTypes}} -### Imported Objects END ### - -### Imported Enums START ### - -{{#importedEnumTypes}} -# URI: "{{uri}}" # -class {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}(IntEnum): - {{#members}} - {{#detectKeyword}}{{name}}{{/detectKeyword}} = {{value}}, "{{value}}", "{{name}}" - {{/members}} - - def __new__(cls, value: int, *aliases: str): - obj = int.__new__(cls) - obj._value_ = value - for alias in aliases: - cls._value2member_map_[alias] = obj - return obj - -{{/importedEnumTypes}} - -### Imported Enums END ### - -### Imported Modules START ### - -{{#importedModuleTypes}} -{{#methods}} -# URI: "{{parent.uri}}" # -{{#toUpper}}{{parent.type}}{{/toUpper}}Args{{#toUpper}}{{name}}{{/toUpper}} = TypedDict("{{#toUpper}}{{parent.type}}{{/toUpper}}Args{{#toUpper}}{{name}}{{/toUpper}}", { - {{#arguments}} - "{{name}}": {{#toPython}}{{toGraphQLType}}{{/toPython}}, - {{/arguments}} -}) - -{{/methods}} -# URI: "{{uri}}" # -{{^isInterface}} -class {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}: - {{#methods}} - @staticmethod - def {{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}( - args: {{#toUpper}}{{parent.type}}{{/toUpper}}Args{{#toUpper}}{{name}}{{/toUpper}}, - client: InvokerClient - ) -> {{#return}}{{#toPython}}{{toGraphQLType}}{{/toPython}}{{/return}}: - return client.invoke( - uri=Uri.from_str("{{parent.uri}}"), - method="{{name}}", - args=args, - ) - {{^last}} - - {{/last}} - {{/methods}} - - -{{/isInterface}} -{{#isInterface}} -class {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}: - INTERFACE_URI: Uri = Uri.from_str("{{uri}}") - uri: Uri - - def __init__(self, uri: Uri): - self.uri = uri - - {{#methods}} - def {{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}( - self, - args: {{#toUpper}}{{parent.type}}{{/toUpper}}Args{{#toUpper}}{{name}}{{/toUpper}}, - client: InvokerClient - ) -> {{#return}}{{#toPython}}{{toGraphQLType}}{{/toPython}}{{/return}}: - return client.invoke( - uri=self.uri, - method="{{name}}", - args=args, - ) - {{^last}} - - {{/last}} - {{/methods}} - -{{/isInterface}} -{{/importedModuleTypes}} -### Imported Modules END ### - -### Interface START ### - -{{#interfaceTypes.length}} -{{#interfaceTypes}} - -class {{#detectKeyword}}{{#toUpper}}{{namespace}}{{/toUpper}}{{/detectKeyword}}: - URI: Uri = Uri.from_str("{{uri}}") - - {{#capabilities}} - {{#getImplementations}} - {{#enabled}} - def get_implementations( - client: InvokerClient - ) -> list[str]: - impls = client.getImplementations(self.uri) - return [impl.uri for impl in impls] - {{/enabled}} - {{/getImplementations}} - {{/capabilities}} -{{/interfaceTypes}} -{{/interfaceTypes.length}} - -### Interface END ### diff --git a/packages/schema/bind/src/bindings/python/plugin/templates/wrap_info-py.mustache b/packages/schema/bind/src/bindings/python/plugin/templates/wrap_info-py.mustache deleted file mode 100644 index a8f991aa58..0000000000 --- a/packages/schema/bind/src/bindings/python/plugin/templates/wrap_info-py.mustache +++ /dev/null @@ -1,20 +0,0 @@ -# NOTE: This is an auto-generated file. All modifications will be overwritten. -# type: ignore -from __future__ import annotations - -import json - -from polywrap_manifest import WrapManifest - -{{#manifest}} -abi = json.loads(""" -{{abi}} -""") - -manifest = WrapManifest.parse_obj({ - "name": "{{name}}", - "type": "{{type}}", - "version": "{{version}}", - "abi": abi, -}) -{{/manifest}} diff --git a/packages/schema/bind/src/bindings/python/transformers.ts b/packages/schema/bind/src/bindings/python/transformers.ts deleted file mode 100644 index a74fd5c9b2..0000000000 --- a/packages/schema/bind/src/bindings/python/transformers.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { AbiTransforms } from "@polywrap/schema-parse"; -import { EnumDefinition } from "@polywrap/wrap-manifest-types-js"; - -export const addEnumMembers: AbiTransforms = { - enter: { - // eslint-disable-next-line @typescript-eslint/naming-convention - EnumDefinition: (def: EnumDefinition): EnumDefinition => { - if (!def.constants) { - return { ...def }; - } - - const members: Array> = []; - let value = 0; - - for (const constant of def.constants) { - members.push({ - name: constant, - value: value, - }); - value += 1; - } - - return { - ...def, - members, - } as EnumDefinition; - }, - }, -}; diff --git a/packages/schema/bind/src/bindings/python/types.ts b/packages/schema/bind/src/bindings/python/types.ts deleted file mode 100644 index 7e5d045ccf..0000000000 --- a/packages/schema/bind/src/bindings/python/types.ts +++ /dev/null @@ -1,199 +0,0 @@ -// based on: -// - https://github.com/python/cpython/blob/3.11/Lib/keyword.py - -const keywords = new Set([ - "False", - "None", - "True", - "and", - "as", - "assert", - "async", - "await", - "break", - "class", - "continue", - "def", - "del", - "elif", - "else", - "except", - "finally", - "for", - "from", - "global", - "if", - "import", - "in", - "is", - "lambda", - "nonlocal", - "not", - "or", - "pass", - "raise", - "return", - "try", - "while", - "with", - "yield", -]); - -const builtins = new Set([ - "ArithmeticError", - "AssertionError", - "AttributeError", - "BaseException", - "BlockingIOError", - "BrokenPipeError", - "BufferError", - "BytesWarning", - "ChildProcessError", - "ConnectionAbortedError", - "ConnectionError", - "ConnectionRefusedError", - "ConnectionResetError", - "DeprecationWarning", - "EOFError", - "Ellipsis", - "EnvironmentError", - "Exception", - "False", - "FileExistsError", - "FileNotFoundError", - "FloatingPointError", - "FutureWarning", - "GeneratorExit", - "IOError", - "ImportError", - "ImportWarning", - "IndentationError", - "IndexError", - "InterruptedError", - "IsADirectoryError", - "KeyError", - "KeyboardInterrupt", - "LookupError", - "MemoryError", - "ModuleNotFoundError", - "NameError", - "None", - "NotADirectoryError", - "NotImplemented", - "NotImplementedError", - "OSError", - "OverflowError", - "PendingDeprecationWarning", - "PermissionError", - "ProcessLookupError", - "RecursionError", - "ReferenceError", - "ResourceWarning", - "RuntimeError", - "RuntimeWarning", - "StopAsyncIteration", - "StopIteration", - "SyntaxError", - "SyntaxWarning", - "SystemError", - "SystemExit", - "TabError", - "TimeoutError", - "True", - "TypeError", - "UnboundLocalError", - "UnicodeDecodeError", - "UnicodeEncodeError", - "UnicodeError", - "UnicodeTranslateError", - "UnicodeWarning", - "UserWarning", - "ValueError", - "Warning", - "ZeroDivisionError", - "__build_class__", - "__debug__", - "__doc__", - "__import__", - "__loader__", - "__name__", - "__package__", - "__spec__", - "abs", - "all", - "any", - "ascii", - "bin", - "bool", - "breakpoint", - "bytearray", - "bytes", - "callable", - "chr", - "classmethod", - "compile", - "complex", - "copyright", - "credits", - "delattr", - "dict", - "dir", - "divmod", - "enumerate", - "eval", - "exec", - "exit", - "filter", - "float", - "format", - "frozenset", - "getattr", - "globals", - "hasattr", - "hash", - "help", - "hex", - "id", - "input", - "int", - "isinstance", - "issubclass", - "iter", - "len", - "license", - "list", - "locals", - "map", - "max", - "memoryview", - "min", - "next", - "object", - "oct", - "open", - "ord", - "pow", - "print", - "property", - "quit", - "range", - "repr", - "reversed", - "round", - "set", - "setattr", - "slice", - "sorted", - "staticmethod", - "str", - "sum", - "super", - "tuple", - "type", - "vars", - "zip", -]); - -export function isKeyword(keyword: string): boolean { - return keywords.has(keyword) || builtins.has(keyword); -} diff --git a/packages/schema/bind/src/bindings/rust/index.ts b/packages/schema/bind/src/bindings/rust/index.ts index 7bdebbf2d4..a01310ad9e 100644 --- a/packages/schema/bind/src/bindings/rust/index.ts +++ b/packages/schema/bind/src/bindings/rust/index.ts @@ -1,4 +1,3 @@ export * as Wasm from "./wasm"; -export * as Plugin from "./plugin"; export * as Functions from "./functions"; export * as Types from "./types"; diff --git a/packages/schema/bind/src/bindings/rust/plugin/index.ts b/packages/schema/bind/src/bindings/rust/plugin/index.ts deleted file mode 100644 index 84eb6661ca..0000000000 --- a/packages/schema/bind/src/bindings/rust/plugin/index.ts +++ /dev/null @@ -1,80 +0,0 @@ -import * as Transforms from "../transforms"; -import { Functions } from "../"; -import { GenerateBindingFn, renderTemplates } from "../.."; -import { BindOptions, BindOutput } from "../../.."; - -import { - transformAbi, - extendType, - addFirstLast, - toPrefixedGraphQLType, - hasImports, - methodParentPointers, - latestWrapManifestVersion, -} from "@polywrap/schema-parse"; -import path from "path"; -import { WrapAbi } from "@polywrap/wrap-manifest-types-js/src"; - -const templatePath = (subpath: string) => - path.join(__dirname, "./templates", subpath); - -const sort = (obj: Record) => - Object.keys(obj) - .sort() - .reduce((map: Record, key: string) => { - if (typeof obj[key] === "object") { - map[key] = sort(obj[key] as Record); - - if (Array.isArray(obj[key])) { - map[key] = Object.values(map[key] as Record); - } - } else { - map[key] = obj[key]; - } - return map; - }, {}); - -export const generateBinding: GenerateBindingFn = ( - options: BindOptions -): BindOutput => { - const result: BindOutput = { - output: { - entries: [], - }, - outputDirAbs: options.outputDirAbs, - }; - const output = result.output; - const abi = applyTransforms(options.wrapInfo.abi); - - const manifest = { - name: options.wrapInfo.name, - type: "plugin", - version: latestWrapManifestVersion, - abi: JSON.stringify( - sort((options.wrapInfo.abi as unknown) as Record), - null, - 2 - ), - }; - - output.entries = renderTemplates(templatePath(""), { ...abi, manifest }, {}); - - return result; -}; - -function applyTransforms(abi: WrapAbi): WrapAbi { - const transforms = [ - extendType(Functions), - addFirstLast, - toPrefixedGraphQLType, - hasImports, - methodParentPointers(), - Transforms.propertyDeps(), - Transforms.byRef(), - ]; - - for (const transform of transforms) { - abi = transformAbi(abi, transform); - } - return abi; -} diff --git a/packages/schema/bind/src/bindings/rust/plugin/templates/mod-rs.mustache b/packages/schema/bind/src/bindings/rust/plugin/templates/mod-rs.mustache deleted file mode 100644 index 88b7de7bdf..0000000000 --- a/packages/schema/bind/src/bindings/rust/plugin/templates/mod-rs.mustache +++ /dev/null @@ -1,7 +0,0 @@ -/// NOTE: This is an auto-generated file. -/// All modifications will be overwritten. - -pub mod types; -#[path = "wrap.info.rs"] -pub mod wrap_info; -pub mod module; \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/rust/plugin/templates/module-rs.mustache b/packages/schema/bind/src/bindings/rust/plugin/templates/module-rs.mustache deleted file mode 100644 index 568a5d64d6..0000000000 --- a/packages/schema/bind/src/bindings/rust/plugin/templates/module-rs.mustache +++ /dev/null @@ -1,30 +0,0 @@ -/// NOTE: This is an auto-generated file. -/// All modifications will be overwritten. - -use std::sync::Arc; -use polywrap_core::invoke::Invoker; -use polywrap_plugin::{error::PluginError, module::PluginModule}; -use serde::{Serialize, Deserialize}; -use super::types::*; - -{{#moduleType}} -{{#methods}} -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct Args{{#toUpper}}{{name}}{{/toUpper}} { - {{#arguments}} - {{#serdeAnnotateIfBytes}}{{#scalar}}{{type}}{{/scalar}}{{/serdeAnnotateIfBytes}}{{#serdeRenameIfCaseMismatch}}{{name}}{{/serdeRenameIfCaseMismatch}}pub {{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}}, - {{/arguments}} -} - -{{/methods}} -{{/moduleType}} -pub trait Module: PluginModule { - {{#moduleType}} - {{#methods}} - fn {{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}(&mut self, args: &Args{{#toUpper}}{{name}}{{/toUpper}}, invoker: Arc{{#env}}, env: {{^required}}Option<{{/required}}Env{{^required}}>{{/required}}{{/env}}) -> Result<{{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, PluginError>; - {{^last}} - - {{/last}} - {{/methods}} - {{/moduleType}} -} diff --git a/packages/schema/bind/src/bindings/rust/plugin/templates/types-rs.mustache b/packages/schema/bind/src/bindings/rust/plugin/templates/types-rs.mustache deleted file mode 100644 index 746eea972b..0000000000 --- a/packages/schema/bind/src/bindings/rust/plugin/templates/types-rs.mustache +++ /dev/null @@ -1,180 +0,0 @@ -#![allow(unused_imports)] -#![allow(non_camel_case_types)] - -// NOTE: This is an auto-generated file. -// All modifications will be overwritten. -use polywrap_core::{invoke::Invoker, uri::Uri}; -use polywrap_msgpack::{decode, serialize}; -use polywrap_plugin::{error::PluginError, BigInt, BigNumber, Map, JSON}; -use serde::{Serialize, Deserialize}; -{{#importedModuleTypes}} -use std::sync::Arc; -{{/importedModuleTypes}} - -// Env START // - -{{#envType}} -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - {{#properties}} - {{#serdeAnnotateIfBytes}}{{#scalar}}{{type}}{{/scalar}}{{/serdeAnnotateIfBytes}}{{#serdeRenameIfCaseMismatch}}{{name}}{{/serdeRenameIfCaseMismatch}}pub {{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}}, - {{/properties}} -} -{{/envType}} -// Env END // - -// Objects START // - -{{#objectTypes}} -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - {{#properties}} - {{#serdeAnnotateIfBytes}}{{#scalar}}{{type}}{{/scalar}}{{/serdeAnnotateIfBytes}}{{#serdeRenameIfCaseMismatch}}{{name}}{{/serdeRenameIfCaseMismatch}}pub {{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}}, - {{/properties}} -} -{{/objectTypes}} -// Objects END // - -// Enums START // - -{{#enumTypes}} -#[derive(Clone, Copy, Debug, Deserialize, Serialize)] -pub enum {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - {{#constants}} - {{#serdeRenameIfCaseMismatch}}{{name}}{{/serdeRenameIfCaseMismatch}}{{#detectKeyword}}{{.}}{{/detectKeyword}}, - {{/constants}} - _MAX_ -} -{{/enumTypes}} -// Enums END // - -// Imported objects START // - -{{#importedObjectTypes}} -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - {{#properties}} - {{#serdeAnnotateIfBytes}}{{#scalar}}{{type}}{{/scalar}}{{/serdeAnnotateIfBytes}}{{#serdeRenameIfCaseMismatch}}{{name}}{{/serdeRenameIfCaseMismatch}}pub {{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}}, - {{/properties}} -} -{{/importedObjectTypes}} -// Imported objects END // - -// Imported envs START // - -{{#importedEnvType}} -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - {{#properties}} - {{#serdeAnnotateIfBytes}}{{#scalar}}{{type}}{{/scalar}}{{/serdeAnnotateIfBytes}}{{#serdeRenameIfCaseMismatch}}{{name}}{{/serdeRenameIfCaseMismatch}}pub {{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}}, - {{/properties}} -} -{{/importedEnvType}} -// Imported envs END // - -// Imported enums START // - -{{#importedEnumTypes}} -#[derive(Clone, Copy, Debug, Deserialize, Serialize)] -pub enum {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - {{#constants}} - {{#serdeRenameIfCaseMismatch}}{{name}}{{/serdeRenameIfCaseMismatch}}{{#detectKeyword}}{{.}}{{/detectKeyword}}, - {{/constants}} - _MAX_ -} -{{/importedEnumTypes}} -// Imported enums END // - -// Imported Modules START // - -{{#importedModuleTypes}} -{{#methods}} -// URI: "{{parent.uri}}" // -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct {{#toUpper}}{{parent.type}}{{/toUpper}}Args{{#toUpper}}{{name}}{{/toUpper}} { - {{#arguments}} - {{#serdeAnnotateIfBytes}}{{#scalar}}{{type}}{{/scalar}}{{/serdeAnnotateIfBytes}}{{#serdeRenameIfCaseMismatch}}{{name}}{{/serdeRenameIfCaseMismatch}}pub {{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}}, - {{/arguments}} -} - -{{/methods}} -{{^isInterface}} -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} {} - -impl {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - pub const URI: &'static str = "{{uri}}"; - - pub fn new() -> {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} {} - } - - {{#methods}} - pub fn {{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}(args: &{{#toUpper}}{{parent.type}}{{/toUpper}}Args{{#toUpper}}{{name}}{{/toUpper}}, invoker: Arc) -> Result<{{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, PluginError> { - let uri = {{#parent}}{{#toUpper}}{{type}}{{/toUpper}}{{/parent}}::URI; - let serialized_args = serialize(args.clone()).unwrap(); - let opt_args = Some(serialized_args.as_slice()); - let uri = Uri::try_from(uri).unwrap(); - let result = invoker.invoke_raw( - &uri, - "{{name}}", - opt_args, - None, - None - ) - .map_err(|e| PluginError::SubinvocationError { - uri: uri.to_string(), - method: "{{name}}".to_string(), - args: JSON::to_string(&args).unwrap(), - exception: e.to_string(), - })?; - - Ok({{#return}}{{^required}}Some({{/required}}{{/return}}decode(result.as_slice())?{{#return}}{{^required}}){{/required}}{{/return}}) - } - {{^last}} - - {{/last}} - {{/methods}} -} -{{/isInterface}} -{{#isInterface}} -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}<'a> { - {{#isInterface}}uri: &'a str{{/isInterface}} -} - -impl<'a> {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}<'a> { - pub const INTERFACE_URI: &'static str = "{{uri}}"; - - pub fn new(uri: &'a str) -> {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}<'a> { - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { uri: uri } - } - - {{#methods}} - pub fn {{#toLower}}{{name}}{{/toLower}}(&self, args: &{{#toUpper}}{{parent.type}}{{/toUpper}}Args{{#toUpper}}{{name}}{{/toUpper}}) -> Result<{{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, PluginError> { - let uri = self.uri; - let serialized_args = serialize(args.clone()).unwrap(); - let result = invoker.invoke_raw( - uri, - "{{name}}", - serialized_args, - None, - None - ) - .map_err(|e| PluginError::SubinvocationError { - uri: uri.to_string(), - method: "{{name}}".to_string(), - args: JSON::to_string(&args).unwrap(), - exception: e.to_string(), - })?; - - Ok({{#return}}{{^required}}Some({{/required}}{{/return}}decode(result.as_slice())?{{#return}}{{^required}}){{/required}}{{/return}}) - } - {{^last}} - - {{/last}} - {{/methods}} -} -{{/isInterface}} -{{/importedModuleTypes}} -// Imported Modules END // diff --git a/packages/schema/bind/src/bindings/rust/plugin/templates/wrap.info-rs.mustache b/packages/schema/bind/src/bindings/rust/plugin/templates/wrap.info-rs.mustache deleted file mode 100644 index 096aec98b4..0000000000 --- a/packages/schema/bind/src/bindings/rust/plugin/templates/wrap.info-rs.mustache +++ /dev/null @@ -1,15 +0,0 @@ -/// NOTE: This is an auto-generated file. -/// All modifications will be overwritten. -use polywrap_plugin::JSON::{from_value, json}; -use wrap_manifest_schemas::versions::{WrapManifest, WrapManifestAbi}; - -{{#manifest}} -pub fn get_manifest() -> WrapManifest { - WrapManifest { - name: "{{name}}".to_string(), - type_: "{{type}}".to_string(), - version: "{{version}}".to_string(), - abi: from_value::(json!({{abi}})).unwrap() - } -} -{{/manifest}} diff --git a/packages/schema/bind/src/bindings/typescript/app/index.ts b/packages/schema/bind/src/bindings/typescript/app/index.ts deleted file mode 100644 index 1c0da51a6f..0000000000 --- a/packages/schema/bind/src/bindings/typescript/app/index.ts +++ /dev/null @@ -1,51 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -import * as Functions from "../functions"; -import { GenerateBindingFn, renderTemplates } from "../.."; -import { BindOptions, BindOutput } from "../../.."; - -import { - transformAbi, - extendType, - addFirstLast, - toPrefixedGraphQLType, - methodParentPointers, -} from "@polywrap/schema-parse"; -import { WrapAbi } from "@polywrap/wrap-manifest-types-js"; -import path from "path"; - -export { Functions }; - -export const generateBinding: GenerateBindingFn = ( - options: BindOptions -): BindOutput => { - const result: BindOutput = { - output: { - entries: [], - }, - outputDirAbs: options.outputDirAbs, - }; - const output = result.output; - const abi = applyTransforms(options.wrapInfo.abi); - - output.entries = renderTemplates( - path.join(__dirname, "./templates"), - abi, - {} - ); - - return result; -}; - -function applyTransforms(abi: WrapAbi): WrapAbi { - const transforms = [ - extendType(Functions), - addFirstLast, - toPrefixedGraphQLType, - methodParentPointers(), - ]; - - for (const transform of transforms) { - abi = transformAbi(abi, transform); - } - return abi; -} diff --git a/packages/schema/bind/src/bindings/typescript/app/templates/index-ts.mustache b/packages/schema/bind/src/bindings/typescript/app/templates/index-ts.mustache deleted file mode 100644 index eea524d655..0000000000 --- a/packages/schema/bind/src/bindings/typescript/app/templates/index-ts.mustache +++ /dev/null @@ -1 +0,0 @@ -export * from "./types"; diff --git a/packages/schema/bind/src/bindings/typescript/app/templates/types-ts.mustache b/packages/schema/bind/src/bindings/typescript/app/templates/types-ts.mustache deleted file mode 100644 index bd3f9732ca..0000000000 --- a/packages/schema/bind/src/bindings/typescript/app/templates/types-ts.mustache +++ /dev/null @@ -1,121 +0,0 @@ -// @ts-ignore -import * as Types from "./"; - -// @ts-ignore -import { - CoreClient, - InvokeResult, - Uri, -} from "@polywrap/core-js"; - -export type UInt = number; -export type UInt8 = number; -export type UInt16 = number; -export type UInt32 = number; -export type Int = number; -export type Int8 = number; -export type Int16 = number; -export type Int32 = number; -export type Bytes = Uint8Array; -export type BigInt = string; -export type BigNumber = string; -export type Json = string; -export type String = string; -export type Boolean = boolean; -{{#objectTypes}} - -export interface {{#detectKeyword}}{{type}}{{/detectKeyword}} { - {{#properties}} - {{name}}{{^required}}?{{/required}}: {{#toTypescript}}{{toGraphQLType}}{{/toTypescript}}; - {{/properties}} -} -{{/objectTypes}} -{{#enumTypes}} - -export enum {{type}}Enum { - {{#constants}} - {{.}}, - {{/constants}} -} - -export type {{type}}String = - {{#constants}} - | "{{.}}" - {{/constants}} - -export type {{#detectKeyword}}{{type}}{{/detectKeyword}} = {{type}}Enum | {{type}}String; -{{/enumTypes}} -{{#importedObjectTypes.length}} - -/// Imported Objects START /// -{{#importedObjectTypes}} - -/* URI: "{{uri}}" */ -export interface {{#detectKeyword}}{{type}}{{/detectKeyword}} { - {{#properties}} - {{name}}{{^required}}?{{/required}}: {{#toTypescript}}{{toGraphQLType}}{{/toTypescript}}; - {{/properties}} -} -{{/importedObjectTypes}} - -/// Imported Objects END /// -{{/importedObjectTypes.length}} -{{#importedEnumTypes.length}} - -/// Imported Enums START /// -{{#importedEnumTypes}} - -/* URI: "{{uri}}" */ -export enum {{type}}Enum { - {{#constants}} - {{.}}, - {{/constants}} -} - -export type {{type}}String = - {{#constants}} - | "{{.}}" - {{/constants}} - -export type {{#detectKeyword}}{{type}}{{/detectKeyword}} = {{type}}Enum | {{type}}String; -{{/importedEnumTypes}} - -/// Imported Enums END /// -{{/importedEnumTypes.length}} -{{#importedModuleTypes.length}} - -/// Imported Modules START /// -{{#importedModuleTypes}} -{{#methods}} - -/* URI: "{{parent.uri}}" */ -export interface {{parent.type}}_Args_{{name}} { - {{#arguments}} - {{name}}{{^required}}?{{/required}}: {{#toTypescript}}{{toGraphQLType}}{{/toTypescript}}; - {{/arguments}} -} -{{/methods}} - -/* URI: "{{uri}}" */ -export const {{type}} = { - {{#methods}} - {{name}}: async ( - args: {{parent.type}}_Args_{{name}}, - client: CoreClient, - uri: string = "{{parent.uri}}" - ): Promise> => { - return client.invoke<{{#return}}{{#toTypescript}}{{toGraphQLType}}{{/toTypescript}}{{/return}}>({ - uri: Uri.from(uri), - method: "{{name}}", - args: (args as unknown) as Record, - }); - }{{^last}},{{/last}} - {{^last}} - - {{/last}} - {{/methods}} -}; -{{/importedModuleTypes}} - -/// Imported Modules END /// -{{/importedModuleTypes.length}} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/typescript/index.ts b/packages/schema/bind/src/bindings/typescript/index.ts index 4d7a06f114..af50109879 100644 --- a/packages/schema/bind/src/bindings/typescript/index.ts +++ b/packages/schema/bind/src/bindings/typescript/index.ts @@ -1,4 +1,2 @@ -export * as App from "./app"; -export * as Plugin from "./plugin"; export * as Functions from "./functions"; export * as Types from "./types"; diff --git a/packages/schema/bind/src/bindings/typescript/plugin/index.ts b/packages/schema/bind/src/bindings/typescript/plugin/index.ts deleted file mode 100644 index b9ad051c9a..0000000000 --- a/packages/schema/bind/src/bindings/typescript/plugin/index.ts +++ /dev/null @@ -1,82 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -import * as Functions from "../functions"; -import { GenerateBindingFn, renderTemplates } from "../.."; -import { BindOptions, BindOutput } from "../../.."; - -import { - transformAbi, - extendType, - addFirstLast, - toPrefixedGraphQLType, - methodParentPointers, - interfaceUris, -} from "@polywrap/schema-parse"; -import { WrapAbi } from "@polywrap/wrap-manifest-types-js"; -import path from "path"; -import { latestWrapManifestVersion } from "@polywrap/wrap-manifest-types-js"; - -export { Functions }; - -const templatePath = (subpath: string) => - path.join(__dirname, "./templates", subpath); - -const sort = (obj: Record) => - Object.keys(obj) - .sort() - .reduce((map: Record, key: string) => { - if (typeof obj[key] === "object") { - map[key] = sort(obj[key] as Record); - - if (Array.isArray(obj[key])) { - map[key] = Object.values(map[key] as Record); - } - } else { - map[key] = obj[key]; - } - return map; - }, {}); - -export const generateBinding: GenerateBindingFn = ( - options: BindOptions -): BindOutput => { - // Apply Abi transforms - const abi = applyTransforms(options.wrapInfo.abi); - - // Generate Bindings - const result: BindOutput = { - output: { - entries: [], - }, - outputDirAbs: options.outputDirAbs, - }; - const output = result.output; - const manifest = { - name: options.wrapInfo.name, - type: "plugin", - version: latestWrapManifestVersion, - abi: JSON.stringify( - sort((options.wrapInfo.abi as unknown) as Record), - null, - 2 - ), - }; - - output.entries = renderTemplates(templatePath(""), { ...abi, manifest }, {}); - - return result; -}; - -function applyTransforms(abi: WrapAbi): WrapAbi { - const transforms = [ - extendType(Functions), - addFirstLast, - toPrefixedGraphQLType, - methodParentPointers(), - interfaceUris(), - ]; - - for (const transform of transforms) { - abi = transformAbi(abi, transform); - } - return abi; -} diff --git a/packages/schema/bind/src/bindings/typescript/plugin/templates/index-ts.mustache b/packages/schema/bind/src/bindings/typescript/plugin/templates/index-ts.mustache deleted file mode 100644 index 4f5ca809d5..0000000000 --- a/packages/schema/bind/src/bindings/typescript/plugin/templates/index-ts.mustache +++ /dev/null @@ -1,8 +0,0 @@ -/// NOTE: This is an auto-generated file. -/// All modifications will be overwritten. - -export * from "./wrap.info"; -export * from "./module"; -export * from "./types"; - -export { CoreClient } from "@polywrap/core-js"; diff --git a/packages/schema/bind/src/bindings/typescript/plugin/templates/module-ts.mustache b/packages/schema/bind/src/bindings/typescript/plugin/templates/module-ts.mustache deleted file mode 100644 index ac87418014..0000000000 --- a/packages/schema/bind/src/bindings/typescript/plugin/templates/module-ts.mustache +++ /dev/null @@ -1,34 +0,0 @@ -/// NOTE: This is an auto-generated file. -/// All modifications will be overwritten. - -// @ts-ignore -import * as Types from "./types"; - -// @ts-ignore -import { CoreClient, MaybeAsync } from "@polywrap/core-js"; -import { PluginModule } from "@polywrap/plugin-js"; -{{#moduleType}} -{{#methods}} - -export interface Args_{{name}} { - {{#arguments}} - {{name}}{{^required}}?{{/required}}: {{#toTypescript}}{{toGraphQLType}}{{/toTypescript}}; - {{/arguments}} -} -{{/methods}} -{{/moduleType}} - -export abstract class Module extends PluginModule { - {{#moduleType}} - {{#methods}} - abstract {{name}}( - args: Args_{{name}}, - client: CoreClient, - {{^env}}env?: null{{/env}}{{#env}}env{{^required}}?{{/required}}: Types.Env{{^required}} | null{{/required}}{{/env}} - ): MaybeAsync<{{#return}}{{#toTypescript}}{{toGraphQLType}}{{/toTypescript}}{{/return}}>; - {{^last}} - - {{/last}} - {{/methods}} - {{/moduleType}} -} diff --git a/packages/schema/bind/src/bindings/typescript/plugin/templates/types-ts.mustache b/packages/schema/bind/src/bindings/typescript/plugin/templates/types-ts.mustache deleted file mode 100644 index 35673f6a5d..0000000000 --- a/packages/schema/bind/src/bindings/typescript/plugin/templates/types-ts.mustache +++ /dev/null @@ -1,184 +0,0 @@ -/// NOTE: This is an auto-generated file. -/// All modifications will be overwritten. - -// @ts-ignore -import * as Types from "./"; - -// @ts-ignore -import { - CoreClient,{{#interfaceTypes.length}} - Result,{{/interfaceTypes.length}} - InvokeResult, - Uri, -} from "@polywrap/core-js"; - -export type UInt = number; -export type UInt8 = number; -export type UInt16 = number; -export type UInt32 = number; -export type Int = number; -export type Int8 = number; -export type Int16 = number; -export type Int32 = number; -export type Bytes = Uint8Array; -export type BigInt = string; -export type BigNumber = string; -export type Json = string; -export type String = string; -export type Boolean = boolean; - -/// Env START /// -{{#envType}} -export interface {{#detectKeyword}}{{type}}{{/detectKeyword}} extends Record { - {{#properties}} - {{name}}{{^required}}?{{/required}}: {{#toTypescript}}{{toGraphQLType}}{{/toTypescript}}; - {{/properties}} -} -{{/envType}} -/// Env END /// - -/// Objects START /// -{{#objectTypes}} -export interface {{#detectKeyword}}{{type}}{{/detectKeyword}} { - {{#properties}} - {{name}}{{^required}}?{{/required}}: {{#toTypescript}}{{toGraphQLType}}{{/toTypescript}}; - {{/properties}} -} - -{{/objectTypes}} -/// Objects END /// - -/// Enums START /// -{{#enumTypes}} -export enum {{type}}Enum { - {{#constants}} - {{.}}, - {{/constants}} -} - -export type {{type}}String = - {{#constants}} - | "{{.}}" - {{/constants}} - -export type {{#detectKeyword}}{{type}}{{/detectKeyword}} = {{type}}Enum | {{type}}String; - -{{/enumTypes}} -/// Enums END /// - -/// Imported Objects START /// - -{{#importedObjectTypes}} -/* URI: "{{uri}}" */ -export interface {{#detectKeyword}}{{type}}{{/detectKeyword}} { - {{#properties}} - {{name}}{{^required}}?{{/required}}: {{#toTypescript}}{{toGraphQLType}}{{/toTypescript}}; - {{/properties}} -} - -{{/importedObjectTypes}} -{{#importedEnumTypes}} -/* URI: "{{uri}}" */ -export enum {{type}}Enum { - {{#constants}} - {{.}}, - {{/constants}} -} - -export type {{type}}String = - {{#constants}} - | "{{.}}" - {{/constants}} - -export type {{#detectKeyword}}{{type}}{{/detectKeyword}} = {{type}}Enum | {{type}}String; - -{{/importedEnumTypes}} -/// Imported Objects END /// - -/// Imported Modules START /// - -{{#importedModuleTypes}} -{{#methods}} -/* URI: "{{parent.uri}}" */ -export interface {{parent.type}}_Args_{{name}} { - {{#arguments}} - {{name}}{{^required}}?{{/required}}: {{#toTypescript}}{{toGraphQLType}}{{/toTypescript}}; - {{/arguments}} -} - -{{/methods}} -/* URI: "{{uri}}" */ -{{^isInterface}} -export const {{type}} = { - {{#methods}} - {{name}}: async ( - args: {{parent.type}}_Args_{{name}}, - client: CoreClient - ): Promise> => { - return client.invoke<{{#return}}{{#toTypescript}}{{toGraphQLType}}{{/toTypescript}}{{/return}}>({ - uri: Uri.from("{{parent.uri}}"), - method: "{{name}}", - args: (args as unknown) as Record, - }); - }{{^last}},{{/last}} - {{^last}} - - {{/last}} - {{/methods}} -} - -{{/isInterface}} -{{#isInterface}} -export class {{#detectKeyword}}{{type}}{{/detectKeyword}} { - public static interfaceUri: string = "{{uri}}"; - public uri: Uri; - - constructor(uri: string) { - this.uri = Uri.from(uri); - } - - {{#methods}} - public async {{name}}( - args: {{parent.type}}_Args_{{name}}, - client: CoreClient - ): Promise> { - return client.invoke<{{#return}}{{#toTypescript}}{{toGraphQLType}}{{/toTypescript}}{{/return}}>({ - uri: this.uri, - method: "{{name}}", - args: (args as unknown) as Record, - }); - } - {{^last}} - - {{/last}} - {{/methods}} -} - -{{/isInterface}} -{{/importedModuleTypes}} -/// Imported Modules END /// -{{#interfaceTypes.length}} -{{#interfaceTypes}} - -export class {{#detectKeyword}}{{namespace}}{{/detectKeyword}} { - static uri: Uri = Uri.from("{{uri}}"); - - {{#capabilities}} - {{#getImplementations}} - {{#enabled}} - public static async getImplementations( - client: CoreClient - ): Promise> { - const impls = await client.getImplementations(this.uri, {}); - if (!impls.ok) { - return { ok: false, error: impls.error}; - } - - return { ok: true, value: impls.value.map((impl) => (impl.uri))}; - } - {{/enabled}} - {{/getImplementations}} - {{/capabilities}} -} -{{/interfaceTypes}} -{{/interfaceTypes.length}} diff --git a/packages/schema/bind/src/bindings/typescript/plugin/templates/wrap.info-ts.mustache b/packages/schema/bind/src/bindings/typescript/plugin/templates/wrap.info-ts.mustache deleted file mode 100644 index 32296868a0..0000000000 --- a/packages/schema/bind/src/bindings/typescript/plugin/templates/wrap.info-ts.mustache +++ /dev/null @@ -1,12 +0,0 @@ -/// NOTE: This is an auto-generated file. -/// All modifications will be overwritten. -import { WrapManifest } from "@polywrap/wrap-manifest-types-js" - -{{#manifest}} -export const manifest: WrapManifest = { - name: "{{name}}", - type: "{{type}}", - version: "{{version}}", - abi: {{abi}} -} -{{/manifest}} From 52fc21b73cc9092d2b843f23b010248649524261 Mon Sep 17 00:00:00 2001 From: krisbitney Date: Mon, 10 Jul 2023 14:35:54 -0500 Subject: [PATCH 063/181] removed docgen command --- packages/cli/lang/en.json | 10 - packages/cli/lang/es.json | 10 - packages/cli/package.json | 6 +- .../cli/src/__tests__/e2e/p1/docgen.spec.ts | 228 ------------------ packages/cli/src/commands/docgen.ts | 185 -------------- packages/cli/src/commands/index.ts | 6 - .../cli/src/lib/docgen/docusaurus/index.ts | 188 --------------- .../templates/docusaurus-enums.mustache | 19 -- .../templates/docusaurus-env.mustache | 19 -- .../templates/docusaurus-module.mustache | 18 -- .../templates/docusaurus-objects.mustache | 19 -- packages/cli/src/lib/docgen/functions.ts | 76 ------ packages/cli/src/lib/docgen/jsdoc/index.ts | 188 --------------- .../jsdoc/templates/jsdoc-enums.mustache | 12 - .../docgen/jsdoc/templates/jsdoc-env.mustache | 16 -- .../jsdoc/templates/jsdoc-module.mustache | 22 -- .../jsdoc/templates/jsdoc-objects.mustache | 16 -- packages/cli/src/lib/docgen/schema/index.ts | 50 ---- .../docgen/schema/templates/schema.mustache | 1 - packages/cli/src/lib/docgen/utils.ts | 56 ----- .../js/cli/src/__tests__/commands.spec.ts | 7 - packages/js/cli/src/commands/index.ts | 1 - 22 files changed, 1 insertion(+), 1152 deletions(-) delete mode 100644 packages/cli/src/__tests__/e2e/p1/docgen.spec.ts delete mode 100644 packages/cli/src/commands/docgen.ts delete mode 100644 packages/cli/src/lib/docgen/docusaurus/index.ts delete mode 100644 packages/cli/src/lib/docgen/docusaurus/templates/docusaurus-enums.mustache delete mode 100644 packages/cli/src/lib/docgen/docusaurus/templates/docusaurus-env.mustache delete mode 100644 packages/cli/src/lib/docgen/docusaurus/templates/docusaurus-module.mustache delete mode 100644 packages/cli/src/lib/docgen/docusaurus/templates/docusaurus-objects.mustache delete mode 100644 packages/cli/src/lib/docgen/functions.ts delete mode 100644 packages/cli/src/lib/docgen/jsdoc/index.ts delete mode 100644 packages/cli/src/lib/docgen/jsdoc/templates/jsdoc-enums.mustache delete mode 100644 packages/cli/src/lib/docgen/jsdoc/templates/jsdoc-env.mustache delete mode 100644 packages/cli/src/lib/docgen/jsdoc/templates/jsdoc-module.mustache delete mode 100644 packages/cli/src/lib/docgen/jsdoc/templates/jsdoc-objects.mustache delete mode 100644 packages/cli/src/lib/docgen/schema/index.ts delete mode 100644 packages/cli/src/lib/docgen/schema/templates/schema.mustache delete mode 100644 packages/cli/src/lib/docgen/utils.ts diff --git a/packages/cli/lang/en.json b/packages/cli/lang/en.json index d5abbed875..84a566036e 100644 --- a/packages/cli/lang/en.json +++ b/packages/cli/lang/en.json @@ -94,16 +94,6 @@ "commands_codegen_success": "Types were generated successfully", "commands_codegen_project_load_error": "Failed to load project, please make sure {manifestPath} is a valid Project manifest", "commands_codegen_options_publish": "Output path for the built schema and manifest (default: {default})", - "commands_docgen_description": "Generate wrapper documentation", - "commands_docgen_success": "Docs were generated successfully", - "commands_docgen_default": "default", - "commands_docgen_options_c": "Output directory for generated docs (default: {default})", - "commands_docgen_options_m": "Path to the project manifest file (default: {default})", - "commands_docgen_options_schema": "Generate GraphQL schema", - "commands_docgen_options_markdown": "Generate {framework} markdown", - "commands_docgen_options_i": "Also generate docs for dependencies", - "commands_docgen_error_manifestNotFound": "Manifest not found. Search paths used: {paths}", - "commands_docgen_error_projectLoadFailed": "Could not load project form the given manifest. Manifest: `{manifestFile}`", "commands_create_description": "Create New Projects", "commands_create_directoryExists": "Directory with name {dir} already exists", "commands_create_error_commandFail": "Command failed: {error}", diff --git a/packages/cli/lang/es.json b/packages/cli/lang/es.json index d5abbed875..84a566036e 100644 --- a/packages/cli/lang/es.json +++ b/packages/cli/lang/es.json @@ -94,16 +94,6 @@ "commands_codegen_success": "Types were generated successfully", "commands_codegen_project_load_error": "Failed to load project, please make sure {manifestPath} is a valid Project manifest", "commands_codegen_options_publish": "Output path for the built schema and manifest (default: {default})", - "commands_docgen_description": "Generate wrapper documentation", - "commands_docgen_success": "Docs were generated successfully", - "commands_docgen_default": "default", - "commands_docgen_options_c": "Output directory for generated docs (default: {default})", - "commands_docgen_options_m": "Path to the project manifest file (default: {default})", - "commands_docgen_options_schema": "Generate GraphQL schema", - "commands_docgen_options_markdown": "Generate {framework} markdown", - "commands_docgen_options_i": "Also generate docs for dependencies", - "commands_docgen_error_manifestNotFound": "Manifest not found. Search paths used: {paths}", - "commands_docgen_error_projectLoadFailed": "Could not load project form the given manifest. Manifest: `{manifestFile}`", "commands_create_description": "Create New Projects", "commands_create_directoryExists": "Directory with name {dir} already exists", "commands_create_error_commandFail": "Command failed: {error}", diff --git a/packages/cli/package.json b/packages/cli/package.json index d20311d753..fc54d6e1eb 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -19,14 +19,10 @@ "types": "build/types/index.d.ts", "scripts": { "build": "yarn build:intl && yarn build:fast", - "build:fast": "rimraf ./build && tsc --project tsconfig.build.json && yarn build:build-strategies && yarn build:deploy-modules && yarn build:infra-modules && yarn build:docgen-templates", + "build:fast": "rimraf ./build && tsc --project tsconfig.build.json && yarn build:build-strategies && yarn build:deploy-modules && yarn build:infra-modules", "build:build-strategies": "ts-node ./scripts/copyfiles ./src/lib/defaults/build-strategies ./build/lib/defaults/build-strategies", "build:deploy-modules": "copyfiles ./src/lib/defaults/deploy-modules/**/polywrap.deploy.ext.json ./build/lib/defaults/deploy-modules -u 4", "build:infra-modules": "ts-node ./scripts/copyfiles ./src/lib/defaults/infra-modules ./build/lib/defaults/infra-modules", - "build:docgen-templates": "yarn build:docgen-templates:docusaurus && yarn build:docgen-templates:jsdoc && yarn build:docgen-templates:schema", - "build:docgen-templates:docusaurus": "ts-node ./scripts/copyfiles ./src/lib/docgen/docusaurus/templates ./build/lib/docgen/docusaurus/templates", - "build:docgen-templates:jsdoc": "ts-node ./scripts/copyfiles ./src/lib/docgen/jsdoc/templates ./build/lib/docgen/jsdoc/templates", - "build:docgen-templates:schema": "ts-node ./scripts/copyfiles ./src/lib/docgen/schema/templates ./build/lib/docgen/schema/templates", "build:intl": "ts-node ./scripts/generateIntlTypes.ts", "install:tracer": "ts-node ./scripts/installTracerInfraModule.ts", "lint": "eslint --color -c ../../.eslintrc.js .", diff --git a/packages/cli/src/__tests__/e2e/p1/docgen.spec.ts b/packages/cli/src/__tests__/e2e/p1/docgen.spec.ts deleted file mode 100644 index 332a8bff82..0000000000 --- a/packages/cli/src/__tests__/e2e/p1/docgen.spec.ts +++ /dev/null @@ -1,228 +0,0 @@ -import { clearStyle, polywrapCli } from "../utils"; -import { DocgenCommandOptions } from "../../../commands"; - -import { Commands, runCli } from "@polywrap/cli-js"; -import { GetPathToCliTestFiles } from "@polywrap/test-cases"; -import path from "path"; -import fs from "fs"; -import os from "os"; -import rimraf from "rimraf"; -import { compareSync } from "dir-compare"; - -const HELP = `Usage: polywrap docgen|o [options] - -Generate wrapper documentation - -Arguments: - action - schema Generate GraphQL schema - docusaurus Generate Docusaurus markdown - jsdoc Generate JSDoc markdown - (choices: "schema", "docusaurus", "jsdoc") - -Options: - -m, --manifest-file Path to the project manifest file - (default: polywrap.yaml | polywrap.yml) - -g, --docgen-dir Output directory for generated docs - (default: ./docs) - -c, --client-config Add custom configuration to the - PolywrapClient - --wrapper-envs Path to a JSON file containing wrapper - envs - -i, --imports Also generate docs for dependencies - -v, --verbose Verbose output (default: false) - -q, --quiet Suppress output (default: false) - -l, --log-file [path] Log file to save console output to - -h, --help display help for command -`; - -describe("e2e tests for docgen command", () => { - const testCaseRoot = path.join(GetPathToCliTestFiles(), "docgen"); - const testCases = fs - .readdirSync(testCaseRoot, { withFileTypes: true }) - .filter((dirent) => dirent.isDirectory()) - .map((dirent) => dirent.name); - const getTestCaseDir = (index: number) => - path.join(testCaseRoot, testCases[index]); - - const testCliOutput = ( - testCaseDir: string, - exitCode: number, - stdout: string, - stder: string - ) => { - const output = clearStyle(stdout); - const error = clearStyle(stder); - - const expected = JSON.parse( - fs.readFileSync( - path.join(testCaseDir, "expected", "stdout.json"), - "utf-8" - ) - ); - - if (expected.stdout) { - if (Array.isArray(expected.stdout)) { - for (const line of expected.stdout) { - expect(output).toContain(line); - } - } else { - expect(output).toContain(expected.stdout); - } - } - - if (expected.stderr) { - if (Array.isArray(expected.stderr)) { - for (const line of expected.stderr) { - expect(error).toContain(line); - } - } else { - expect(error).toContain(expected.stderr); - } - } - - if (expected.exitCode) { - expect(exitCode).toEqual(expected.exitCode); - } - - if (expected.files) { - for (const file of expected.files) { - expect(fs.existsSync(path.join(testCaseDir, file))).toBeTruthy(); - } - } - }; - - const testDocgenOutput = (testCaseDir: string, docgenDir: string) => { - if (fs.existsSync(path.join(testCaseDir, "expected", "docs"))) { - const expectedTypesResult = compareSync( - docgenDir, - path.join(testCaseDir, "expected", "docs"), - { compareContent: true } - ); - expect(expectedTypesResult.differences).toBe(0); - } - }; - - test("Should show help text", async () => { - const { exitCode: code, stdout: output, stderr: error } = await runCli({ - args: ["docgen", "--help"], - config: { - cwd: getTestCaseDir(0), - cli: polywrapCli, - } - }); - - expect(error).toBe(""); - expect(code).toEqual(0); - expect(clearStyle(output)).toEqual(HELP); - }); - - it("Should throw error for unknown option --invalid", async () => { - const { exitCode: code, stdout: output, stderr: error } = await Commands.docgen("docusaurus",{ - args: ["--invalid"], - }, { - cwd: getTestCaseDir(0), - cli: polywrapCli, - }); - - - expect(code).toEqual(1); - expect(error).toBe("error: unknown option '--invalid'\n"); - expect(output).toEqual(``); - }); - - describe("missing option arguments", () => { - const missingOptionArgs = { - "--manifest-file": "-m, --manifest-file ", - "--docgen-dir": "-g, --docgen-dir ", - "--client-config": "-c, --client-config ", - }; - - for (const [option, errorMessage] of Object.entries(missingOptionArgs)) { - it(`Should throw error if params not specified for ${option} option`, async () => { - const { exitCode: code, stdout: output, stderr: error } = await Commands.docgen("docusaurus", { - args: [option], - }, { - cwd: getTestCaseDir(0), - cli: polywrapCli, - }); - - expect(code).toEqual(1); - expect(error).toBe( - `error: option '${errorMessage}' argument missing\n` - ); - expect(output).toEqual(``); - }); - } - }); - - it("Should store build files in specified docgen dir", async () => { - const docgenDir = fs.mkdtempSync( - path.join(os.tmpdir(), `polywrap-cli-tests`) - ); - const testCaseDir = getTestCaseDir(0); - const { exitCode: code, stdout: output, stderr: error } = await Commands.docgen("docusaurus", { - args: ["docgen", "docusaurus", "--docgen-dir", docgenDir], - }, { - cwd: testCaseDir, - cli: polywrapCli, - }); - - expect(error).toBe(""); - expect(code).toEqual(0); - expect(clearStyle(output)).toContain( - `šŸ”„ Docs were generated successfully šŸ”„` - ); - }); - - it("Should successfully generate docs", async () => { - rimraf.sync(`${getTestCaseDir(0)}/docs`); - - const { exitCode: code, stdout: output, stderr: error } = await Commands.docgen("docusaurus", {}, { - cwd: getTestCaseDir(0), - cli: polywrapCli, - }); - - expect(code).toEqual(0); - expect(error).toBe(""); - expect(clearStyle(output)).toContain( - `šŸ”„ Docs were generated successfully šŸ”„` - ); - - rimraf.sync(`${getTestCaseDir(0)}/docs`); - }); - - describe("test-cases", () => { - for (let i = 0; i < testCases.length; ++i) { - const testCaseName = testCases[i]; - const testCaseDir = getTestCaseDir(i); - - let docgenDir = path.join(testCaseDir, "docs"); - let args: Partial & { doc: string } = { doc: "docusaurus" }; - let cmdFile = path.join(testCaseDir, "cmd.json"); - if (fs.existsSync(cmdFile)) { - const cmdConfig = JSON.parse(fs.readFileSync(cmdFile, "utf-8")); - if (cmdConfig) { - args = cmdConfig; - } - - if(cmdConfig.docgenDir) { - docgenDir = path.join(testCaseDir, cmdConfig.docgenDir); - } - } - - const docType = args.doc as "docusaurus" | "jsdoc" | "schema"; - // @ts-ignore - delete args.doc; - test(testCaseName, async () => { - let { exitCode, stdout, stderr } = await Commands.docgen(docType, args, { - cwd: testCaseDir, - cli: polywrapCli, - }); - - testCliOutput(testCaseDir, exitCode, stdout, stderr); - testDocgenOutput(testCaseDir, docgenDir); - }); - } - }); -}); diff --git a/packages/cli/src/commands/docgen.ts b/packages/cli/src/commands/docgen.ts deleted file mode 100644 index 347b9ba058..0000000000 --- a/packages/cli/src/commands/docgen.ts +++ /dev/null @@ -1,185 +0,0 @@ -/* eslint-disable prefer-const */ -import { - defaultPolywrapManifest, - SchemaComposer, - intlMsg, - parseClientConfigOption, - parseDirOption, - parseManifestFileOption, - defaultProjectManifestFiles, - getProjectFromManifest, - parseLogFileOption, - parseWrapperEnvsOption, -} from "../lib"; -import { Command, Program, BaseCommandOptions } from "./types"; -import { createLogger } from "./utils/createLogger"; -import { scriptPath as docusaurusScriptPath } from "../lib/docgen/docusaurus"; -import { scriptPath as jsdocScriptPath } from "../lib/docgen/jsdoc"; -import { scriptPath as schemaScriptPath } from "../lib/docgen/schema"; -import { ScriptCodegenerator } from "../lib/codegen/ScriptCodeGenerator"; - -import { PolywrapClient } from "@polywrap/client-js"; -import chalk from "chalk"; -import { Argument } from "commander"; - -const commandToPathMap: Record = { - schema: schemaScriptPath, - docusaurus: docusaurusScriptPath, - jsdoc: jsdocScriptPath, -}; - -const defaultDocgenDir = "./docs"; -const pathStr = intlMsg.commands_codegen_options_o_path(); - -export enum DocgenActions { - SCHEMA = "schema", - DOCUSAURUS = "docusaurus", - JSDOC = "jsdoc", -} - -export interface DocgenCommandOptions extends BaseCommandOptions { - manifestFile: string; - docgenDir: string; - clientConfig: string | false; - wrapperEnvs: string | false; - imports: boolean; -} - -const argumentsDescription = ` - ${chalk.bold( - DocgenActions.SCHEMA - )} ${intlMsg.commands_docgen_options_schema()} - ${chalk.bold( - DocgenActions.DOCUSAURUS - )} ${intlMsg.commands_docgen_options_markdown({ - framework: "Docusaurus", -})} - ${chalk.bold( - DocgenActions.JSDOC - )} ${intlMsg.commands_docgen_options_markdown({ - framework: "JSDoc", -})} -`; - -export const docgen: Command = { - setup: (program: Program) => { - program - .command("docgen") - .alias("o") - .description(intlMsg.commands_docgen_description()) - .usage(" [options]") - .addArgument( - new Argument("", argumentsDescription).choices([ - DocgenActions.SCHEMA, - DocgenActions.DOCUSAURUS, - DocgenActions.JSDOC, - ]) - ) - .option( - `-m, --manifest-file <${pathStr}>`, - intlMsg.commands_docgen_options_m({ - default: defaultPolywrapManifest.join(" | "), - }) - ) - .option( - `-g, --docgen-dir <${pathStr}>`, - intlMsg.commands_docgen_options_c({ - default: `${defaultDocgenDir}`, - }) - ) - .option( - `-c, --client-config <${intlMsg.commands_common_options_configPath()}>`, - `${intlMsg.commands_common_options_config()}` - ) - .option( - `--wrapper-envs <${intlMsg.commands_common_options_wrapperEnvsPath()}>`, - `${intlMsg.commands_common_options_wrapperEnvs()}` - ) - .option(`-i, --imports`, `${intlMsg.commands_docgen_options_i()}`) - .option("-v, --verbose", intlMsg.commands_common_options_verbose()) - .option("-q, --quiet", intlMsg.commands_common_options_quiet()) - .option( - `-l, --log-file [${pathStr}]`, - `${intlMsg.commands_build_options_l()}` - ) - .action(async (action, options: Partial) => { - await run(action, { - manifestFile: parseManifestFileOption( - options.manifestFile, - defaultProjectManifestFiles - ), - docgenDir: parseDirOption(options.docgenDir, defaultDocgenDir), - clientConfig: options.clientConfig || false, - wrapperEnvs: options.wrapperEnvs || false, - imports: options.imports || false, - verbose: options.verbose || false, - quiet: options.quiet || false, - logFile: parseLogFileOption(options.logFile), - }); - }); - }, -}; - -async function run( - action: DocgenActions, - options: Required -) { - const { - manifestFile, - clientConfig, - wrapperEnvs, - docgenDir, - imports, - verbose, - quiet, - logFile, - } = options; - const logger = createLogger({ verbose, quiet, logFile }); - - const envs = await parseWrapperEnvsOption(wrapperEnvs); - const configBuilder = await parseClientConfigOption(clientConfig); - - if (envs) { - configBuilder.addEnvs(envs); - } - - let project = await getProjectFromManifest(manifestFile, logger); - - if (!project) { - logger.error( - intlMsg.commands_docgen_error_projectLoadFailed({ - manifestFile: manifestFile, - }) - ); - - process.exit(1); - } - - await project.validate(); - - // Resolve custom script - const customScript = require.resolve(commandToPathMap[action]); - - const client = new PolywrapClient(configBuilder.build()); - - const schemaComposer = new SchemaComposer({ - project, - client, - }); - - const codeGenerator = new ScriptCodegenerator({ - project, - schemaComposer, - script: customScript, - codegenDirAbs: docgenDir, - omitHeader: true, - mustacheView: { imports }, - }); - - if (await codeGenerator.generate()) { - logger.info(`šŸ”„ ${intlMsg.commands_docgen_success()} šŸ”„`); - process.exit(0); - } else { - process.exit(1); - } -} diff --git a/packages/cli/src/commands/index.ts b/packages/cli/src/commands/index.ts index 03027c008c..10cb79abb9 100644 --- a/packages/cli/src/commands/index.ts +++ b/packages/cli/src/commands/index.ts @@ -2,7 +2,6 @@ export * from "./build"; export * from "./codegen"; export * from "./create"; export * from "./deploy"; -export * from "./docgen"; export * from "./infra"; export * from "./manifest"; export * from "./test"; @@ -18,7 +17,6 @@ import { SupportedWasmLangs, } from "./create"; import { DeployCommandOptions } from "./deploy"; -import { DocgenCommandOptions, DocgenActions } from "./docgen"; import { InfraCommandOptions, InfraActions } from "./infra"; import { ManifestSchemaCommandOptions, @@ -50,10 +48,6 @@ export interface CommandTypings { }; }; deploy: DeployCommandOptions; - docgen: { - options: DocgenCommandOptions; - arguments: [action: `${DocgenActions}`]; - }; infra: { options: InfraCommandOptions; arguments: [action: `${InfraActions}`]; diff --git a/packages/cli/src/lib/docgen/docusaurus/index.ts b/packages/cli/src/lib/docgen/docusaurus/index.ts deleted file mode 100644 index ef175f7dae..0000000000 --- a/packages/cli/src/lib/docgen/docusaurus/index.ts +++ /dev/null @@ -1,188 +0,0 @@ -import * as Functions from "./../functions"; -import { - arrangeByNamespace, - sortMethodsInPlaceByName, - sortObjectsInPlaceByType, -} from "../utils"; - -import { - WrapAbi, - transformAbi, - addFirstLast, - toPrefixedGraphQLType, - extendType, - methodParentPointers, -} from "@polywrap/schema-parse"; -import { - BindOptions, - BindOutput, - GenerateBindingFn, - TypeScript, -} from "@polywrap/schema-bind"; -import Mustache from "mustache"; -import path from "path"; -import { readFileSync } from "fs"; - -export const scriptPath = path.join(__dirname, "index.js"); - -export const generateBinding: GenerateBindingFn = ( - options: BindOptions -): BindOutput => { - const result: BindOutput = { - output: { - entries: [], - }, - outputDirAbs: options.outputDirAbs, - }; - const output = result.output; - const abi = applyTransforms(options.abi); - sortObjectsInPlaceByType(abi); - sortMethodsInPlaceByName(abi); - - const renderTemplate = ( - subPath: string, - context: unknown, - fileName: string - ) => { - const absPath = path.join(__dirname, subPath); - const template = readFileSync(absPath, { encoding: "utf-8" }); - - output.entries.push({ - type: "File", - name: fileName, - data: Mustache.render(template, context), - }); - }; - - // generate modules - if (abi.moduleType) { - renderTemplate( - "./templates/docusaurus-module.mustache", - abi.moduleType, - "module.md" - ); - } - - // generate object types - if (abi.objectTypes && abi.objectTypes.length > 0) { - const objectContext = { - objectTypes: abi.objectTypes, - }; - renderTemplate( - "./templates/docusaurus-objects.mustache", - objectContext, - "objects.md" - ); - } - - // generate enum types - if (abi.enumTypes && abi.enumTypes.length > 0) { - const enumContext = { - enumTypes: abi.enumTypes, - }; - renderTemplate( - "./templates/docusaurus-enums.mustache", - enumContext, - "enums.md" - ); - } - - // generate env type - if (abi.envType) { - const envContext = { - envType: abi.envType, - }; - renderTemplate("./templates/docusaurus-env.mustache", envContext, "env.md"); - } - - if (options.config?.["imports"]) { - // TODO: for imported modules, module.type contains the namespace. Should it? - // generate imported modules - if (abi.importedModuleTypes) { - for (const module of abi.importedModuleTypes) { - const moduleType = module.type.split("_")[1]; - const moduleContext = { - ...module, - type: moduleType, - imported: { namespace: module.namespace }, - }; - renderTemplate( - "./templates/docusaurus-module.mustache", - moduleContext, - `${module.namespace}_${moduleType.toLowerCase()}.md` - ); - } - } - - // generated imported object types - if (abi.importedObjectTypes) { - const importedObjects = arrangeByNamespace(abi.importedObjectTypes); - for (const [namespace, objectTypes] of Object.entries(importedObjects)) { - if (objectTypes.length > 0) { - const objectContext = { - objectTypes, - imported: { namespace }, - }; - renderTemplate( - "./templates/docusaurus-objects.mustache", - objectContext, - `${namespace}_objects.md` - ); - } - } - } - - // generate imported enum types - if (abi.importedEnumTypes) { - const importedEnums = arrangeByNamespace(abi.importedEnumTypes); - for (const [namespace, enumTypes] of Object.entries(importedEnums)) { - if (enumTypes.length > 0) { - const enumContext = { - enumTypes, - imported: { namespace }, - }; - renderTemplate( - "./templates/docusaurus-enums.mustache", - enumContext, - `${namespace}_enums.md` - ); - } - } - } - - // generate imported env types - if (abi.importedEnvTypes) { - const importedEnvs = arrangeByNamespace(abi.importedEnvTypes); - for (const [namespace, envType] of Object.entries(importedEnvs)) { - if (envType) { - const envContext = { - envType, - imported: { namespace }, - }; - renderTemplate( - "./templates/docusaurus-env.mustache", - envContext, - `${namespace}_env.md` - ); - } - } - } - } - - return result; -}; - -function applyTransforms(abi: WrapAbi): WrapAbi { - const transforms = [ - extendType(Functions), - extendType(TypeScript.Functions), - addFirstLast, - toPrefixedGraphQLType, - methodParentPointers(), - ]; - - for (const transform of transforms) { - abi = transformAbi(abi, transform); - } - return abi; -} diff --git a/packages/cli/src/lib/docgen/docusaurus/templates/docusaurus-enums.mustache b/packages/cli/src/lib/docgen/docusaurus/templates/docusaurus-enums.mustache deleted file mode 100644 index ad9003cc5f..0000000000 --- a/packages/cli/src/lib/docgen/docusaurus/templates/docusaurus-enums.mustache +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: {{#imported}}{{namespace}}_{{/imported}}enums -title: {{#imported}}{{namespace}} {{/imported}}Enum Types -sidebar_position: 3 ---- - - -{{#enumTypes}} -### {{type}} -{{#addReturnsIfText}}{{#markdownItalics}}{{comment}}{{/markdownItalics}}{{/addReturnsIfText}} -```graphql -enum {{type}} { - {{#constants}} - {{.}} - {{/constants}} -} -``` - -{{/enumTypes}} \ No newline at end of file diff --git a/packages/cli/src/lib/docgen/docusaurus/templates/docusaurus-env.mustache b/packages/cli/src/lib/docgen/docusaurus/templates/docusaurus-env.mustache deleted file mode 100644 index d25872b38c..0000000000 --- a/packages/cli/src/lib/docgen/docusaurus/templates/docusaurus-env.mustache +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: {{#imported}}{{namespace}}_{{/imported}}env -title: {{#imported}}{{namespace}} {{/imported}}Env Type -sidebar_position: 4 ---- - - -{{#envType}} -### {{type}} {{#addImplements}}{{#interfaces}} {{name}}{{/interfaces}}{{/addImplements}} -{{#addReturnsIfText}}{{#markdownItalics}}{{comment}}{{/markdownItalics}}{{/addReturnsIfText}} -```graphql -type {{type}} { - {{#properties}} - {{name}}: {{#typeFormatFilter}}{{type}}{{/typeFormatFilter}}{{#required}}!{{/required}} {{#hashtagPrefix}}{{comment}}{{/hashtagPrefix}} - {{/properties}} -} -``` - -{{/envType}} \ No newline at end of file diff --git a/packages/cli/src/lib/docgen/docusaurus/templates/docusaurus-module.mustache b/packages/cli/src/lib/docgen/docusaurus/templates/docusaurus-module.mustache deleted file mode 100644 index 70419c35b5..0000000000 --- a/packages/cli/src/lib/docgen/docusaurus/templates/docusaurus-module.mustache +++ /dev/null @@ -1,18 +0,0 @@ ---- -id: {{#imported}}{{namespace}}_{{/imported}}{{#toLowerCase}}{{type}}{{/toLowerCase}} -title: {{#toTitle}}{{#imported}}{{namespace}} {{/imported}}{{type}}{{/toTitle}} -sidebar_position: 1 ---- - -{{#methods}} -### {{name}} {{#addImplements}}{{#interfaces}} {{name}}{{/interfaces}}{{/addImplements}} -{{#addReturnsIfText}}{{#markdownItalics}}{{comment}}{{/markdownItalics}}{{/addReturnsIfText}} -```graphql -{{name}}( - {{#arguments}} - {{name}}: {{#typeFormatFilter}}{{type}}{{/typeFormatFilter}}{{#required}}!{{/required}} {{#hashtagPrefix}}{{comment}}{{/hashtagPrefix}} - {{/arguments}} -): {{#return}}{{#typeFormatFilter}}{{type}}{{/typeFormatFilter}}{{#required}}!{{/required}}{{/return}} -``` - -{{/methods}} \ No newline at end of file diff --git a/packages/cli/src/lib/docgen/docusaurus/templates/docusaurus-objects.mustache b/packages/cli/src/lib/docgen/docusaurus/templates/docusaurus-objects.mustache deleted file mode 100644 index 6cd78c2ae7..0000000000 --- a/packages/cli/src/lib/docgen/docusaurus/templates/docusaurus-objects.mustache +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: {{#imported}}{{namespace}}_{{/imported}}objects -title: {{#imported}}{{namespace}} {{/imported}}Object Types -sidebar_position: 2 ---- - - -{{#objectTypes}} -### {{type}} {{#addImplements}}{{#interfaces}} {{name}}{{/interfaces}}{{/addImplements}} -{{#addReturnsIfText}}{{#markdownItalics}}{{comment}}{{/markdownItalics}}{{/addReturnsIfText}} -```graphql -type {{type}} { - {{#properties}} - {{name}}: {{#typeFormatFilter}}{{type}}{{/typeFormatFilter}}{{#required}}!{{/required}} {{#hashtagPrefix}}{{comment}}{{/hashtagPrefix}} - {{/properties}} -} -``` - -{{/objectTypes}} \ No newline at end of file diff --git a/packages/cli/src/lib/docgen/functions.ts b/packages/cli/src/lib/docgen/functions.ts deleted file mode 100644 index 91d7b03f36..0000000000 --- a/packages/cli/src/lib/docgen/functions.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { MustacheFn } from "@polywrap/schema-bind"; - -export const typeFormatFilter: MustacheFn = () => { - return (text: string, render: (template: string) => string): string => { - const rendered: string = render(text); - if (rendered.startsWith("[")) { - return rendered.substring(1, rendered.length - 1) + "[]"; - } - return rendered; - }; -}; - -export const hashtagPrefix: MustacheFn = () => { - return (text: string, render: (template: string) => string): string => { - const rendered: string = render(text); - if (rendered === "") { - return ""; - } - return "# " + rendered; - }; -}; - -export const markdownItalics: MustacheFn = () => { - return (text: string, render: (template: string) => string): string => { - const rendered: string = render(text); - if (rendered === "") { - return ""; - } - return "_" + rendered + "_"; - }; -}; - -export const addReturnsIfText: MustacheFn = () => { - return (text: string, render: (template: string) => string): string => { - const rendered: string = render(text); - if (rendered === "") { - return ""; - } - return "\n" + rendered + "\n"; - }; -}; - -export const toTitle: MustacheFn = () => { - return (text: string, render: (template: string) => string): string => { - const rendered: string = render(text); - const tokens: string[] = rendered.split("_"); - for (let i = 0; i < tokens.length; i++) { - tokens[i] = tokens[i].charAt(0).toUpperCase() + tokens[i].substring(1); - } - return tokens.join(" "); - }; -}; - -export const addImplements: MustacheFn = () => { - return (text: string, render: (template: string) => string): string => { - const rendered: string = render(text); - const trimmed: string = rendered.trim(); - if (!trimmed) { - return ""; - } - const tokens: string[] = trimmed.split(" "); - return "implements " + tokens.join(", "); - }; -}; - -export const addExtends: MustacheFn = () => { - return (text: string, render: (template: string) => string): string => { - const rendered: string = render(text); - const trimmed: string = rendered.trim(); - if (!trimmed) { - return ""; - } - const tokens: string[] = trimmed.split(" "); - return "@extends " + tokens.join(", "); - }; -}; diff --git a/packages/cli/src/lib/docgen/jsdoc/index.ts b/packages/cli/src/lib/docgen/jsdoc/index.ts deleted file mode 100644 index d9d95ce684..0000000000 --- a/packages/cli/src/lib/docgen/jsdoc/index.ts +++ /dev/null @@ -1,188 +0,0 @@ -import * as Functions from "../functions"; -import { - arrangeByNamespace, - sortMethodsInPlaceByName, - sortObjectsInPlaceByType, -} from "../utils"; - -import { - transformAbi, - addFirstLast, - toPrefixedGraphQLType, - extendType, - methodParentPointers, - ImportedDefinition, - ModuleDefinition, - WrapAbi, -} from "@polywrap/schema-parse"; -import { - BindOptions, - BindOutput, - GenerateBindingFn, - TypeScript, -} from "@polywrap/schema-bind"; -import Mustache from "mustache"; -import path from "path"; -import { readFileSync } from "fs"; - -export const scriptPath = path.join(__dirname, "index.js"); - -export const generateBinding: GenerateBindingFn = ( - options: BindOptions -): BindOutput => { - const result: BindOutput = { - output: { - entries: [], - }, - outputDirAbs: options.outputDirAbs, - }; - const output = result.output; - const abi = applyTransforms(options.abi); - sortObjectsInPlaceByType(abi); - sortMethodsInPlaceByName(abi); - - const renderTemplate = ( - subPath: string, - context: unknown, - fileName: string - ) => { - const absPath = path.join(__dirname, subPath); - const template = readFileSync(absPath, { encoding: "utf-8" }); - - output.entries.push({ - type: "File", - name: fileName, - data: Mustache.render(template, context), - }); - }; - - // generate modules - if (abi.moduleType) { - const module: ModuleDefinition = abi.moduleType; - renderTemplate( - "./templates/jsdoc-module.mustache", - module, - `${module.type.toLowerCase()}.js` - ); - } - - // generate object types - if (abi.objectTypes && abi.objectTypes.length > 0) { - renderTemplate("./templates/jsdoc-objects.mustache", abi, "objects.js"); - } - - // generate enum types - if (abi.enumTypes && abi.enumTypes.length > 0) { - renderTemplate("./templates/jsdoc-enums.mustache", abi, "enums.js"); - } - - // generate env type - if (abi.envType) { - const envContext = { - envType: abi.envType, - }; - renderTemplate("./templates/jsdoc-env.mustache", envContext, "env.js"); - } - - if (options.config?.["imports"]) { - // TODO: for imported modules, module.type contains the namespace. Should it? - // generate imported modules - if (abi.importedModuleTypes) { - for (const module of abi.importedModuleTypes) { - const moduleContext = { - ...module, - imported: { namespace: module.namespace }, - }; - renderTemplate( - "./templates/jsdoc-module.mustache", - moduleContext, - `${module.type}.js` - ); - } - } - - // generated imported object types - if (abi.importedObjectTypes) { - const importedObjects = sortByNamespace(abi.importedObjectTypes); - for (const [namespace, objectTypes] of Object.entries(importedObjects)) { - if (objectTypes.length > 0) { - const objectContext = { - objectTypes, - imported: { namespace }, - }; - renderTemplate( - "./templates/jsdoc-objects.mustache", - objectContext, - `${namespace}_objects.js` - ); - } - } - } - - // generate imported enum types - if (abi.importedEnumTypes) { - const importedEnums = sortByNamespace(abi.importedEnumTypes); - for (const [namespace, enumTypes] of Object.entries(importedEnums)) { - if (enumTypes.length > 0) { - const enumContext = { - enumTypes, - imported: { namespace }, - }; - renderTemplate( - "./templates/jsdoc-enums.mustache", - enumContext, - `${namespace}_enums.js` - ); - } - } - } - - // generate imported env types - if (abi.importedEnvTypes) { - const importedEnvs = arrangeByNamespace(abi.importedEnvTypes); - for (const [namespace, envType] of Object.entries(importedEnvs)) { - if (envType) { - const envContext = { - envType, - imported: { namespace }, - }; - renderTemplate( - "./templates/jsdoc-env.mustache", - envContext, - `${namespace}_env.js` - ); - } - } - } - } - - return result; -}; - -function applyTransforms(abi: WrapAbi): WrapAbi { - const transforms = [ - extendType(Functions), - extendType(TypeScript.Functions), - addFirstLast, - toPrefixedGraphQLType, - methodParentPointers(), - ]; - - for (const transform of transforms) { - abi = transformAbi(abi, transform); - } - return abi; -} - -function sortByNamespace( - definitions: Array -): Record> { - const result: Record> = {}; - for (const val of definitions) { - if (!result[val.namespace]) { - result[val.namespace] = new Array(); - } - result[val.namespace].push(val); - } - return result; -} diff --git a/packages/cli/src/lib/docgen/jsdoc/templates/jsdoc-enums.mustache b/packages/cli/src/lib/docgen/jsdoc/templates/jsdoc-enums.mustache deleted file mode 100644 index 8efd65fac8..0000000000 --- a/packages/cli/src/lib/docgen/jsdoc/templates/jsdoc-enums.mustache +++ /dev/null @@ -1,12 +0,0 @@ -/** -* {{#imported}}{{namespace}} {{/imported}}Enum Types -* @module {{#imported}}{{namespace}}_{{/imported}}enums -*/ - -{{#enumTypes}} -/** -* {{comment}} -* @typedef { {{#unionTypeTrim}}{{#constants}}"{{.}}" | {{/constants}}{{/unionTypeTrim}} } module:{{#imported}}{{namespace}}_{{/imported}}enums.{{type}} {{comment}} -*/ - -{{/enumTypes}} \ No newline at end of file diff --git a/packages/cli/src/lib/docgen/jsdoc/templates/jsdoc-env.mustache b/packages/cli/src/lib/docgen/jsdoc/templates/jsdoc-env.mustache deleted file mode 100644 index 3d39df8f1a..0000000000 --- a/packages/cli/src/lib/docgen/jsdoc/templates/jsdoc-env.mustache +++ /dev/null @@ -1,16 +0,0 @@ -/** -* {{#imported}}{{namespace}} {{/imported}}Env Type -* @module {{#imported}}{{namespace}}_{{/imported}}env -*/ - -{{#envType}} -/** -* {{comment}} -* @typedef {Object} module:{{#imported}}{{namespace}}_{{/imported}}objects.{{type}} -* {{#addExtends}}{{#interfaces}} {{name}}{{/interfaces}}{{/addExtends}} -{{#properties}} -* @property { {{#typeFormatFilter}}{{type}}{{/typeFormatFilter}} } {{name}} {{comment}} -{{/properties}} -*/ - -{{/envType}} \ No newline at end of file diff --git a/packages/cli/src/lib/docgen/jsdoc/templates/jsdoc-module.mustache b/packages/cli/src/lib/docgen/jsdoc/templates/jsdoc-module.mustache deleted file mode 100644 index 7db6635b8a..0000000000 --- a/packages/cli/src/lib/docgen/jsdoc/templates/jsdoc-module.mustache +++ /dev/null @@ -1,22 +0,0 @@ -/** -* {{#toTitle}}{{type}}{{/toTitle}} -* @module {{#toLowerCase}}{{type}}{{/toLowerCase}} -* {{#addImplements}}{{#interfaces}} {{name}}{{/interfaces}}{{/addImplements}} -*/ - -{{#methods}} -/** -* {{comment}} -* @function module:{{#toLowerCase}}{{type}}{{/toLowerCase}}.{{name}} -{{#arguments}} - {{#required}} -* @param { {{#typeFormatFilter}}{{type}}{{/typeFormatFilter}} } {{name}} {{comment}} - {{/required}} - {{^required}} -* @param { {{#typeFormatFilter}}{{type}}{{/typeFormatFilter}} | null } {{name}} {{comment}} - {{/required}} -{{/arguments}} -* @returns { {{#return}}{{#typeFormatFilter}}{{type}}{{/typeFormatFilter}}{{/return}} } -*/ - -{{/methods}} \ No newline at end of file diff --git a/packages/cli/src/lib/docgen/jsdoc/templates/jsdoc-objects.mustache b/packages/cli/src/lib/docgen/jsdoc/templates/jsdoc-objects.mustache deleted file mode 100644 index 91411cb1b8..0000000000 --- a/packages/cli/src/lib/docgen/jsdoc/templates/jsdoc-objects.mustache +++ /dev/null @@ -1,16 +0,0 @@ -/** -* {{#imported}}{{namespace}} {{/imported}}Object Types -* @module {{#imported}}{{namespace}}_{{/imported}}objects -*/ - -{{#objectTypes}} -/** -* {{comment}} -* @typedef {Object} module:{{#imported}}{{namespace}}_{{/imported}}objects.{{type}} -* {{#addExtends}}{{#interfaces}} {{name}}{{/interfaces}}{{/addExtends}} -{{#properties}} -* @property { {{#typeFormatFilter}}{{type}}{{/typeFormatFilter}} } {{name}} {{comment}} -{{/properties}} -*/ - -{{/objectTypes}} \ No newline at end of file diff --git a/packages/cli/src/lib/docgen/schema/index.ts b/packages/cli/src/lib/docgen/schema/index.ts deleted file mode 100644 index 0f85d1254d..0000000000 --- a/packages/cli/src/lib/docgen/schema/index.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { - BindOptions, - BindOutput, - GenerateBindingFn, -} from "@polywrap/schema-bind"; -import Mustache from "mustache"; -import path from "path"; -import { readFileSync } from "fs"; -import { renderSchema } from "@polywrap/schema-compose"; - -export const scriptPath = path.join(__dirname, "index.js"); - -export const generateBinding: GenerateBindingFn = ( - options: BindOptions -): BindOutput => { - const result: BindOutput = { - output: { - entries: [], - }, - outputDirAbs: options.outputDirAbs, - }; - const output = result.output; - - const renderTemplate = ( - subPath: string, - context: unknown, - fileName: string - ) => { - const absPath = path.join(__dirname, subPath); - const template = readFileSync(absPath, { encoding: "utf-8" }); - - output.entries.push({ - type: "File", - name: fileName, - data: Mustache.render(template, context), - }); - }; - - // generate schema - const schemaContext = { - schema: renderSchema(options.abi, true), - }; - renderTemplate( - "./templates/schema.mustache", - schemaContext, - "generated-schema.graphql" - ); - - return result; -}; diff --git a/packages/cli/src/lib/docgen/schema/templates/schema.mustache b/packages/cli/src/lib/docgen/schema/templates/schema.mustache deleted file mode 100644 index 45b42444e3..0000000000 --- a/packages/cli/src/lib/docgen/schema/templates/schema.mustache +++ /dev/null @@ -1 +0,0 @@ -{{schema}} diff --git a/packages/cli/src/lib/docgen/utils.ts b/packages/cli/src/lib/docgen/utils.ts deleted file mode 100644 index e41b84045e..0000000000 --- a/packages/cli/src/lib/docgen/utils.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { - ImportedDefinition, - MethodDefinition, - Abi, - GenericDefinition, -} from "@polywrap/schema-parse"; - -export function arrangeByNamespace( - definitions: Array -): Record> { - const result: Record> = {}; - for (const val of definitions) { - if (!result[val.namespace]) { - result[val.namespace] = new Array(); - } - result[val.namespace].push(val); - } - return result; -} - -export function sortObjectsInPlaceByType(abi: Abi): void { - const typesToSort: (GenericDefinition[] | undefined)[] = [ - abi.objectTypes, - abi.enumTypes, - abi.importedObjectTypes, - abi.importedEnumTypes, - ]; - for (const definitions of typesToSort) { - if (definitions) { - definitions.sort((a: { type: string }, b: { type: string }) => - a.type.localeCompare(b.type) - ); - } - } -} - -export function sortMethodsInPlaceByName(abi: Abi): void { - const methodsToSort: MethodDefinition[][] = []; - if (abi.moduleType && abi.moduleType.methods) { - methodsToSort.push(abi.moduleType.methods); - } - if (abi.importedModuleTypes) { - for (const moduleType of abi.importedModuleTypes) { - if (moduleType.methods) { - methodsToSort.push(moduleType.methods); - } - } - } - - for (const definitions of methodsToSort) { - definitions.sort((a: MethodDefinition, b: MethodDefinition) => { - if (!a.name || !b.name) return 0; - return a.name.localeCompare(b.name); - }); - } -} diff --git a/packages/js/cli/src/__tests__/commands.spec.ts b/packages/js/cli/src/__tests__/commands.spec.ts index 93eab7113f..1d94776636 100644 --- a/packages/js/cli/src/__tests__/commands.spec.ts +++ b/packages/js/cli/src/__tests__/commands.spec.ts @@ -167,13 +167,6 @@ const testData: CommandTestCaseData = { await Commands.infra("down", { modules: ["eth-ens-ipfs"]}); } }], - docgen: [{ - cwd: path.join(GetPathToCliTestFiles(), "docgen", "001-sanity"), - arguments: ["docusaurus"], - after: (_, stdout) => { - expect(stdout).toContain("Docs were generated successfully"); - } - }], infra: [{ cwd: path.join(GetPathToCliTestFiles(), "infra/001-sanity"), env: { diff --git a/packages/js/cli/src/commands/index.ts b/packages/js/cli/src/commands/index.ts index 131504f557..d7511a7fb9 100644 --- a/packages/js/cli/src/commands/index.ts +++ b/packages/js/cli/src/commands/index.ts @@ -43,7 +43,6 @@ export const commands: CommandFns = { ), }, deploy: execCommandFn("deploy"), - docgen: execCommandWithArgsFn("docgen"), infra: execCommandWithArgsFn("infra"), manifest: { migrate: execCommandWithArgsFn( From dbf35c2fe4209665ad7e3989a31231d2eeb7bd79 Mon Sep 17 00:00:00 2001 From: krisbitney Date: Mon, 10 Jul 2023 14:37:04 -0500 Subject: [PATCH 064/181] removed docgen command test cases --- .../cases/cli/docgen/001-sanity/.gitignore | 2 - .../cases/cli/docgen/001-sanity/cmd.json | 3 - .../docgen/001-sanity/expected/docs/module.md | 14 - .../docgen/001-sanity/expected/stdout.json | 4 - .../cases/cli/docgen/001-sanity/package.json | 15 - .../cli/docgen/001-sanity/polywrap.build.yaml | 9 - .../cases/cli/docgen/001-sanity/polywrap.yaml | 9 - .../cli/docgen/001-sanity/schema.graphql | 5 - .../cases/cli/docgen/001-sanity/src/index.ts | 5 - .../cli/docgen/002-custom-config/.gitignore | 2 - .../cli/docgen/002-custom-config/cmd.json | 4 - .../cli/docgen/002-custom-config/config.ts | 116 ----- .../002-custom-config/expected/docs/module.md | 21 - .../002-custom-config/expected/stdout.json | 6 - .../cli/docgen/002-custom-config/package.json | 15 - .../002-custom-config/polywrap.build.yaml | 9 - .../docgen/002-custom-config/polywrap.yaml | 9 - .../docgen/002-custom-config/schema.graphql | 9 - .../cli/docgen/002-custom-config/src/index.ts | 9 - .../003-custom-manifest-file/.gitignore | 2 - .../docgen/003-custom-manifest-file/cmd.json | 4 - .../expected/docs/module.md | 14 - .../expected/stdout.json | 4 - .../003-custom-manifest-file/package.json | 15 - .../polywrap.custom.build.yaml | 9 - .../polywrap.custom.yaml | 9 - .../003-custom-manifest-file/schema.graphql | 5 - .../003-custom-manifest-file/src/index.ts | 5 - .../cases/cli/docgen/004-app/.gitignore | 2 - .../cases/cli/docgen/004-app/cmd.json | 4 - .../004-app/expected/docs/Ethereum_module.md | 256 ---------- .../004-app/expected/docs/Ethereum_objects.md | 149 ------ .../004-app/expected/docs/Logger_enums.md | 18 - .../004-app/expected/docs/Logger_module.md | 15 - .../cli/docgen/004-app/expected/stdout.json | 4 - .../cli/docgen/004-app/polywrap.app.yaml | 6 - .../cases/cli/docgen/004-app/schema.graphql | 2 - .../cases/cli/docgen/005-wasm/.gitignore | 2 - .../cases/cli/docgen/005-wasm/cmd.json | 3 - .../docgen/005-wasm/expected/docs/module.md | 14 - .../docgen/005-wasm/expected/docs/objects.md | 17 - .../cli/docgen/005-wasm/expected/stdout.json | 4 - .../cases/cli/docgen/005-wasm/package.json | 15 - .../cli/docgen/005-wasm/polywrap-norun.gen.js | 0 .../cli/docgen/005-wasm/polywrap.build.yaml | 9 - .../cases/cli/docgen/005-wasm/polywrap.yaml | 9 - .../cases/cli/docgen/005-wasm/schema.graphql | 11 - .../cases/cli/docgen/005-wasm/src/index.ts | 5 - .../cases/cli/docgen/006-plugin/.gitignore | 2 - .../cases/cli/docgen/006-plugin/cmd.json | 3 - .../docgen/006-plugin/expected/docs/env.md | 15 - .../docgen/006-plugin/expected/docs/module.md | 23 - .../006-plugin/expected/docs/objects.md | 17 - .../docgen/006-plugin/expected/stdout.json | 4 - .../docgen/006-plugin/polywrap.plugin.yaml | 7 - .../cli/docgen/006-plugin/schema.graphql | 22 - .../cases/cli/docgen/006-plugin/src/index.ts | 1 - .../cli/docgen/007-docusaurus/.gitignore | 2 - .../cases/cli/docgen/007-docusaurus/cmd.json | 3 - .../007-docusaurus/expected/docs/enums.md | 16 - .../007-docusaurus/expected/docs/module.md | 15 - .../007-docusaurus/expected/docs/objects.md | 39 -- .../007-docusaurus/expected/stdout.json | 4 - .../docgen/007-docusaurus/polywrap.build.yaml | 9 - .../cli/docgen/007-docusaurus/polywrap.yaml | 9 - .../cli/docgen/007-docusaurus/schema.graphql | 35 -- .../cli/docgen/007-docusaurus/src/index.ts | 1 - .../cases/cli/docgen/008-jsdoc/.gitignore | 2 - .../cases/cli/docgen/008-jsdoc/cmd.json | 3 - .../docgen/008-jsdoc/expected/docs/enums.js | 10 - .../docgen/008-jsdoc/expected/docs/module.js | 14 - .../docgen/008-jsdoc/expected/docs/objects.js | 32 -- .../cli/docgen/008-jsdoc/expected/stdout.json | 4 - .../cli/docgen/008-jsdoc/polywrap.build.yaml | 9 - .../cases/cli/docgen/008-jsdoc/polywrap.yaml | 9 - .../cases/cli/docgen/008-jsdoc/schema.graphql | 35 -- .../cases/cli/docgen/008-jsdoc/src/index.ts | 1 - .../cases/cli/docgen/009-schema/.gitignore | 2 - .../cases/cli/docgen/009-schema/cmd.json | 3 - .../expected/docs/generated-schema.graphql | 436 ------------------ .../docgen/009-schema/expected/stdout.json | 4 - .../cli/docgen/009-schema/polywrap.build.yaml | 9 - .../cases/cli/docgen/009-schema/polywrap.yaml | 9 - .../cli/docgen/009-schema/schema.graphql | 35 -- .../cases/cli/docgen/009-schema/src/index.ts | 1 - 85 files changed, 1723 deletions(-) delete mode 100644 packages/test-cases/cases/cli/docgen/001-sanity/.gitignore delete mode 100644 packages/test-cases/cases/cli/docgen/001-sanity/cmd.json delete mode 100644 packages/test-cases/cases/cli/docgen/001-sanity/expected/docs/module.md delete mode 100644 packages/test-cases/cases/cli/docgen/001-sanity/expected/stdout.json delete mode 100644 packages/test-cases/cases/cli/docgen/001-sanity/package.json delete mode 100644 packages/test-cases/cases/cli/docgen/001-sanity/polywrap.build.yaml delete mode 100644 packages/test-cases/cases/cli/docgen/001-sanity/polywrap.yaml delete mode 100644 packages/test-cases/cases/cli/docgen/001-sanity/schema.graphql delete mode 100644 packages/test-cases/cases/cli/docgen/001-sanity/src/index.ts delete mode 100644 packages/test-cases/cases/cli/docgen/002-custom-config/.gitignore delete mode 100644 packages/test-cases/cases/cli/docgen/002-custom-config/cmd.json delete mode 100644 packages/test-cases/cases/cli/docgen/002-custom-config/config.ts delete mode 100644 packages/test-cases/cases/cli/docgen/002-custom-config/expected/docs/module.md delete mode 100644 packages/test-cases/cases/cli/docgen/002-custom-config/expected/stdout.json delete mode 100644 packages/test-cases/cases/cli/docgen/002-custom-config/package.json delete mode 100644 packages/test-cases/cases/cli/docgen/002-custom-config/polywrap.build.yaml delete mode 100644 packages/test-cases/cases/cli/docgen/002-custom-config/polywrap.yaml delete mode 100644 packages/test-cases/cases/cli/docgen/002-custom-config/schema.graphql delete mode 100644 packages/test-cases/cases/cli/docgen/002-custom-config/src/index.ts delete mode 100644 packages/test-cases/cases/cli/docgen/003-custom-manifest-file/.gitignore delete mode 100644 packages/test-cases/cases/cli/docgen/003-custom-manifest-file/cmd.json delete mode 100644 packages/test-cases/cases/cli/docgen/003-custom-manifest-file/expected/docs/module.md delete mode 100644 packages/test-cases/cases/cli/docgen/003-custom-manifest-file/expected/stdout.json delete mode 100644 packages/test-cases/cases/cli/docgen/003-custom-manifest-file/package.json delete mode 100644 packages/test-cases/cases/cli/docgen/003-custom-manifest-file/polywrap.custom.build.yaml delete mode 100644 packages/test-cases/cases/cli/docgen/003-custom-manifest-file/polywrap.custom.yaml delete mode 100644 packages/test-cases/cases/cli/docgen/003-custom-manifest-file/schema.graphql delete mode 100644 packages/test-cases/cases/cli/docgen/003-custom-manifest-file/src/index.ts delete mode 100644 packages/test-cases/cases/cli/docgen/004-app/.gitignore delete mode 100644 packages/test-cases/cases/cli/docgen/004-app/cmd.json delete mode 100644 packages/test-cases/cases/cli/docgen/004-app/expected/docs/Ethereum_module.md delete mode 100644 packages/test-cases/cases/cli/docgen/004-app/expected/docs/Ethereum_objects.md delete mode 100644 packages/test-cases/cases/cli/docgen/004-app/expected/docs/Logger_enums.md delete mode 100644 packages/test-cases/cases/cli/docgen/004-app/expected/docs/Logger_module.md delete mode 100644 packages/test-cases/cases/cli/docgen/004-app/expected/stdout.json delete mode 100644 packages/test-cases/cases/cli/docgen/004-app/polywrap.app.yaml delete mode 100644 packages/test-cases/cases/cli/docgen/004-app/schema.graphql delete mode 100644 packages/test-cases/cases/cli/docgen/005-wasm/.gitignore delete mode 100644 packages/test-cases/cases/cli/docgen/005-wasm/cmd.json delete mode 100644 packages/test-cases/cases/cli/docgen/005-wasm/expected/docs/module.md delete mode 100644 packages/test-cases/cases/cli/docgen/005-wasm/expected/docs/objects.md delete mode 100644 packages/test-cases/cases/cli/docgen/005-wasm/expected/stdout.json delete mode 100644 packages/test-cases/cases/cli/docgen/005-wasm/package.json delete mode 100644 packages/test-cases/cases/cli/docgen/005-wasm/polywrap-norun.gen.js delete mode 100644 packages/test-cases/cases/cli/docgen/005-wasm/polywrap.build.yaml delete mode 100644 packages/test-cases/cases/cli/docgen/005-wasm/polywrap.yaml delete mode 100644 packages/test-cases/cases/cli/docgen/005-wasm/schema.graphql delete mode 100644 packages/test-cases/cases/cli/docgen/005-wasm/src/index.ts delete mode 100644 packages/test-cases/cases/cli/docgen/006-plugin/.gitignore delete mode 100644 packages/test-cases/cases/cli/docgen/006-plugin/cmd.json delete mode 100644 packages/test-cases/cases/cli/docgen/006-plugin/expected/docs/env.md delete mode 100644 packages/test-cases/cases/cli/docgen/006-plugin/expected/docs/module.md delete mode 100644 packages/test-cases/cases/cli/docgen/006-plugin/expected/docs/objects.md delete mode 100644 packages/test-cases/cases/cli/docgen/006-plugin/expected/stdout.json delete mode 100644 packages/test-cases/cases/cli/docgen/006-plugin/polywrap.plugin.yaml delete mode 100644 packages/test-cases/cases/cli/docgen/006-plugin/schema.graphql delete mode 100644 packages/test-cases/cases/cli/docgen/006-plugin/src/index.ts delete mode 100644 packages/test-cases/cases/cli/docgen/007-docusaurus/.gitignore delete mode 100644 packages/test-cases/cases/cli/docgen/007-docusaurus/cmd.json delete mode 100644 packages/test-cases/cases/cli/docgen/007-docusaurus/expected/docs/enums.md delete mode 100644 packages/test-cases/cases/cli/docgen/007-docusaurus/expected/docs/module.md delete mode 100644 packages/test-cases/cases/cli/docgen/007-docusaurus/expected/docs/objects.md delete mode 100644 packages/test-cases/cases/cli/docgen/007-docusaurus/expected/stdout.json delete mode 100644 packages/test-cases/cases/cli/docgen/007-docusaurus/polywrap.build.yaml delete mode 100644 packages/test-cases/cases/cli/docgen/007-docusaurus/polywrap.yaml delete mode 100644 packages/test-cases/cases/cli/docgen/007-docusaurus/schema.graphql delete mode 100644 packages/test-cases/cases/cli/docgen/007-docusaurus/src/index.ts delete mode 100644 packages/test-cases/cases/cli/docgen/008-jsdoc/.gitignore delete mode 100644 packages/test-cases/cases/cli/docgen/008-jsdoc/cmd.json delete mode 100644 packages/test-cases/cases/cli/docgen/008-jsdoc/expected/docs/enums.js delete mode 100644 packages/test-cases/cases/cli/docgen/008-jsdoc/expected/docs/module.js delete mode 100644 packages/test-cases/cases/cli/docgen/008-jsdoc/expected/docs/objects.js delete mode 100644 packages/test-cases/cases/cli/docgen/008-jsdoc/expected/stdout.json delete mode 100644 packages/test-cases/cases/cli/docgen/008-jsdoc/polywrap.build.yaml delete mode 100644 packages/test-cases/cases/cli/docgen/008-jsdoc/polywrap.yaml delete mode 100644 packages/test-cases/cases/cli/docgen/008-jsdoc/schema.graphql delete mode 100644 packages/test-cases/cases/cli/docgen/008-jsdoc/src/index.ts delete mode 100644 packages/test-cases/cases/cli/docgen/009-schema/.gitignore delete mode 100644 packages/test-cases/cases/cli/docgen/009-schema/cmd.json delete mode 100644 packages/test-cases/cases/cli/docgen/009-schema/expected/docs/generated-schema.graphql delete mode 100644 packages/test-cases/cases/cli/docgen/009-schema/expected/stdout.json delete mode 100644 packages/test-cases/cases/cli/docgen/009-schema/polywrap.build.yaml delete mode 100644 packages/test-cases/cases/cli/docgen/009-schema/polywrap.yaml delete mode 100644 packages/test-cases/cases/cli/docgen/009-schema/schema.graphql delete mode 100644 packages/test-cases/cases/cli/docgen/009-schema/src/index.ts diff --git a/packages/test-cases/cases/cli/docgen/001-sanity/.gitignore b/packages/test-cases/cases/cli/docgen/001-sanity/.gitignore deleted file mode 100644 index 29d09945fc..0000000000 --- a/packages/test-cases/cases/cli/docgen/001-sanity/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -docs -!expected/** \ No newline at end of file diff --git a/packages/test-cases/cases/cli/docgen/001-sanity/cmd.json b/packages/test-cases/cases/cli/docgen/001-sanity/cmd.json deleted file mode 100644 index e88975e499..0000000000 --- a/packages/test-cases/cases/cli/docgen/001-sanity/cmd.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "doc": "docusaurus" -} \ No newline at end of file diff --git a/packages/test-cases/cases/cli/docgen/001-sanity/expected/docs/module.md b/packages/test-cases/cases/cli/docgen/001-sanity/expected/docs/module.md deleted file mode 100644 index a2abb12a0a..0000000000 --- a/packages/test-cases/cases/cli/docgen/001-sanity/expected/docs/module.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -id: module -title: Module -sidebar_position: 1 ---- - -### method - -```graphql -method( - arg: String! -): String! -``` - diff --git a/packages/test-cases/cases/cli/docgen/001-sanity/expected/stdout.json b/packages/test-cases/cases/cli/docgen/001-sanity/expected/stdout.json deleted file mode 100644 index a7621f6c30..0000000000 --- a/packages/test-cases/cases/cli/docgen/001-sanity/expected/stdout.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "stdout": "Docs were generated successfully", - "exitCode": 0 -} diff --git a/packages/test-cases/cases/cli/docgen/001-sanity/package.json b/packages/test-cases/cases/cli/docgen/001-sanity/package.json deleted file mode 100644 index 3360b30d0f..0000000000 --- a/packages/test-cases/cases/cli/docgen/001-sanity/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "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/docgen/001-sanity/polywrap.build.yaml b/packages/test-cases/cases/cli/docgen/001-sanity/polywrap.build.yaml deleted file mode 100644 index c3dcbe22cb..0000000000 --- a/packages/test-cases/cases/cli/docgen/001-sanity/polywrap.build.yaml +++ /dev/null @@ -1,9 +0,0 @@ -format: 0.2.0 -strategies: - image: - node_version: "14.16.0" - include: - - ./package.json -linked_packages: - - name: "@polywrap/wasm-as" - path: ../../../../../../wasm/as diff --git a/packages/test-cases/cases/cli/docgen/001-sanity/polywrap.yaml b/packages/test-cases/cases/cli/docgen/001-sanity/polywrap.yaml deleted file mode 100644 index ee9034f333..0000000000 --- a/packages/test-cases/cases/cli/docgen/001-sanity/polywrap.yaml +++ /dev/null @@ -1,9 +0,0 @@ -format: 0.4.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/docgen/001-sanity/schema.graphql b/packages/test-cases/cases/cli/docgen/001-sanity/schema.graphql deleted file mode 100644 index 325e224971..0000000000 --- a/packages/test-cases/cases/cli/docgen/001-sanity/schema.graphql +++ /dev/null @@ -1,5 +0,0 @@ -type Module { - method( - arg: String! - ): String! -} diff --git a/packages/test-cases/cases/cli/docgen/001-sanity/src/index.ts b/packages/test-cases/cases/cli/docgen/001-sanity/src/index.ts deleted file mode 100644 index 862d4cb226..0000000000 --- a/packages/test-cases/cases/cli/docgen/001-sanity/src/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Args_method } from "./wrap"; - -export function method(args: Args_method): string { - return args.arg; -} diff --git a/packages/test-cases/cases/cli/docgen/002-custom-config/.gitignore b/packages/test-cases/cases/cli/docgen/002-custom-config/.gitignore deleted file mode 100644 index 29d09945fc..0000000000 --- a/packages/test-cases/cases/cli/docgen/002-custom-config/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -docs -!expected/** \ No newline at end of file diff --git a/packages/test-cases/cases/cli/docgen/002-custom-config/cmd.json b/packages/test-cases/cases/cli/docgen/002-custom-config/cmd.json deleted file mode 100644 index 831f18e391..0000000000 --- a/packages/test-cases/cases/cli/docgen/002-custom-config/cmd.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "clientConfig": "./config.ts", - "doc": "docusaurus" -} \ No newline at end of file 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 deleted file mode 100644 index e1a1c1fb38..0000000000 --- a/packages/test-cases/cases/cli/docgen/002-custom-config/config.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { IClientConfigBuilder } from "@polywrap/client-config-builder-js"; -import { PluginModule, PluginPackage } from "@polywrap/plugin-js"; -import { - latestWrapManifestVersion, - WrapManifest, -} from "@polywrap/wrap-manifest-types-js"; - -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 }), mockPluginManifest); -}; - -export function configure(builder: IClientConfigBuilder): IClientConfigBuilder { - return builder.addPackage("wrap://ens/mock.eth", mockPlugin()); -} - -export const mockPluginManifest: WrapManifest = { - name: "mock", - type: "plugin", - version: latestWrapManifestVersion, - abi: { - version: "0.1", - moduleType: { - type: "Module", - kind: 128, - methods: [ - { - type: "Method", - name: "getData", - required: true, - kind: 64, - 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, - return: { - type: "String", - name: "deployContract", - required: true, - kind: 34, - scalar: { - type: "String", - name: "deployContract", - required: true, - kind: 4, - }, - }, - }, - ], - }, - }, -}; diff --git a/packages/test-cases/cases/cli/docgen/002-custom-config/expected/docs/module.md b/packages/test-cases/cases/cli/docgen/002-custom-config/expected/docs/module.md deleted file mode 100644 index 46bf7e0d15..0000000000 --- a/packages/test-cases/cases/cli/docgen/002-custom-config/expected/docs/module.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: module -title: Module -sidebar_position: 1 ---- - -### deployContract - -```graphql -deployContract( -): String! -``` - -### method - -```graphql -method( - arg: String! -): String! -``` - diff --git a/packages/test-cases/cases/cli/docgen/002-custom-config/expected/stdout.json b/packages/test-cases/cases/cli/docgen/002-custom-config/expected/stdout.json deleted file mode 100644 index 249fae9c62..0000000000 --- a/packages/test-cases/cases/cli/docgen/002-custom-config/expected/stdout.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "stdout": [ - "Docs were generated successfully" - ], - "exitCode": 0 -} diff --git a/packages/test-cases/cases/cli/docgen/002-custom-config/package.json b/packages/test-cases/cases/cli/docgen/002-custom-config/package.json deleted file mode 100644 index 3360b30d0f..0000000000 --- a/packages/test-cases/cases/cli/docgen/002-custom-config/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "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/docgen/002-custom-config/polywrap.build.yaml b/packages/test-cases/cases/cli/docgen/002-custom-config/polywrap.build.yaml deleted file mode 100644 index c3dcbe22cb..0000000000 --- a/packages/test-cases/cases/cli/docgen/002-custom-config/polywrap.build.yaml +++ /dev/null @@ -1,9 +0,0 @@ -format: 0.2.0 -strategies: - image: - node_version: "14.16.0" - include: - - ./package.json -linked_packages: - - name: "@polywrap/wasm-as" - path: ../../../../../../wasm/as diff --git a/packages/test-cases/cases/cli/docgen/002-custom-config/polywrap.yaml b/packages/test-cases/cases/cli/docgen/002-custom-config/polywrap.yaml deleted file mode 100644 index ee9034f333..0000000000 --- a/packages/test-cases/cases/cli/docgen/002-custom-config/polywrap.yaml +++ /dev/null @@ -1,9 +0,0 @@ -format: 0.4.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/docgen/002-custom-config/schema.graphql b/packages/test-cases/cases/cli/docgen/002-custom-config/schema.graphql deleted file mode 100644 index 928ed3bdb9..0000000000 --- a/packages/test-cases/cases/cli/docgen/002-custom-config/schema.graphql +++ /dev/null @@ -1,9 +0,0 @@ -#import * into Mock from "wrap://ens/mock.eth" - -type Module { - method( - arg: String! - ): String! - - deployContract: String! -} diff --git a/packages/test-cases/cases/cli/docgen/002-custom-config/src/index.ts b/packages/test-cases/cases/cli/docgen/002-custom-config/src/index.ts deleted file mode 100644 index 2c9e567878..0000000000 --- a/packages/test-cases/cases/cli/docgen/002-custom-config/src/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -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/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/.gitignore b/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/.gitignore deleted file mode 100644 index 29d09945fc..0000000000 --- a/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -docs -!expected/** \ No newline at end of file diff --git a/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/cmd.json b/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/cmd.json deleted file mode 100644 index 7ff8530b42..0000000000 --- a/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/cmd.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "doc": "docusaurus", - "manifestFile": "./polywrap.custom.yaml" -} \ No newline at end of file diff --git a/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/expected/docs/module.md b/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/expected/docs/module.md deleted file mode 100644 index a2abb12a0a..0000000000 --- a/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/expected/docs/module.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -id: module -title: Module -sidebar_position: 1 ---- - -### method - -```graphql -method( - arg: String! -): String! -``` - diff --git a/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/expected/stdout.json b/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/expected/stdout.json deleted file mode 100644 index a7621f6c30..0000000000 --- a/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/expected/stdout.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "stdout": "Docs were generated successfully", - "exitCode": 0 -} diff --git a/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/package.json b/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/package.json deleted file mode 100644 index 3360b30d0f..0000000000 --- a/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "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/docgen/003-custom-manifest-file/polywrap.custom.build.yaml b/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/polywrap.custom.build.yaml deleted file mode 100644 index c3dcbe22cb..0000000000 --- a/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/polywrap.custom.build.yaml +++ /dev/null @@ -1,9 +0,0 @@ -format: 0.2.0 -strategies: - image: - node_version: "14.16.0" - include: - - ./package.json -linked_packages: - - name: "@polywrap/wasm-as" - path: ../../../../../../wasm/as diff --git a/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/polywrap.custom.yaml b/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/polywrap.custom.yaml deleted file mode 100644 index 24250643cf..0000000000 --- a/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/polywrap.custom.yaml +++ /dev/null @@ -1,9 +0,0 @@ -format: 0.4.0 -project: - name: test-project - type: wasm/assemblyscript -source: - schema: ./schema.graphql - module: ./src/index.ts -extensions: - build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/schema.graphql b/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/schema.graphql deleted file mode 100644 index 325e224971..0000000000 --- a/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/schema.graphql +++ /dev/null @@ -1,5 +0,0 @@ -type Module { - method( - arg: String! - ): String! -} diff --git a/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/src/index.ts b/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/src/index.ts deleted file mode 100644 index 862d4cb226..0000000000 --- a/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/src/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Args_method } from "./wrap"; - -export function method(args: Args_method): string { - return args.arg; -} diff --git a/packages/test-cases/cases/cli/docgen/004-app/.gitignore b/packages/test-cases/cases/cli/docgen/004-app/.gitignore deleted file mode 100644 index 29d09945fc..0000000000 --- a/packages/test-cases/cases/cli/docgen/004-app/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -docs -!expected/** \ No newline at end of file diff --git a/packages/test-cases/cases/cli/docgen/004-app/cmd.json b/packages/test-cases/cases/cli/docgen/004-app/cmd.json deleted file mode 100644 index bdf40463c7..0000000000 --- a/packages/test-cases/cases/cli/docgen/004-app/cmd.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "imports": true, - "doc": "docusaurus" -} \ No newline at end of file diff --git a/packages/test-cases/cases/cli/docgen/004-app/expected/docs/Ethereum_module.md b/packages/test-cases/cases/cli/docgen/004-app/expected/docs/Ethereum_module.md deleted file mode 100644 index 30ec3c9c04..0000000000 --- a/packages/test-cases/cases/cli/docgen/004-app/expected/docs/Ethereum_module.md +++ /dev/null @@ -1,256 +0,0 @@ ---- -id: Ethereum_module -title: Ethereum Module -sidebar_position: 1 ---- - -### awaitTransaction - -```graphql -awaitTransaction( - txHash: String! - connection: Ethereum_Connection -): Ethereum_TxReceipt! -``` - -### callContractMethod - -```graphql -callContractMethod( - address: String! - method: String! - args: String[] - options: Ethereum_TxOptions - connection: Ethereum_Connection -): Ethereum_TxResponse! -``` - -### callContractMethodAndWait - -```graphql -callContractMethodAndWait( - address: String! - method: String! - args: String[] - options: Ethereum_TxOptions - connection: Ethereum_Connection -): Ethereum_TxReceipt! -``` - -### callContractStatic - -```graphql -callContractStatic( - address: String! - method: String! - args: String[] - options: Ethereum_TxOptions - connection: Ethereum_Connection -): Ethereum_StaticTxResult! -``` - -### callContractView - -```graphql -callContractView( - address: String! - method: String! - args: String[] - connection: Ethereum_Connection -): String! -``` - -### checkAddress - -```graphql -checkAddress( - address: String! - connection: Ethereum_Connection -): Boolean! -``` - -### decodeFunction - -```graphql -decodeFunction( - method: String! - data: String! - connection: Ethereum_Connection -): String[]! -``` - -### deployContract - -```graphql -deployContract( - abi: String! - bytecode: String! - args: String[] - options: Ethereum_TxOptions - connection: Ethereum_Connection -): String! -``` - -### encodeFunction - -```graphql -encodeFunction( - method: String! - args: String[] - connection: Ethereum_Connection -): String! -``` - -### encodeParams - -```graphql -encodeParams( - types: String[]! - values: String[]! - connection: Ethereum_Connection -): String! -``` - -### estimateContractCallGas - -```graphql -estimateContractCallGas( - address: String! - method: String! - args: String[] - options: Ethereum_TxOptions - connection: Ethereum_Connection -): BigInt! -``` - -### estimateEip1559Fees - -```graphql -estimateEip1559Fees( - connection: Ethereum_Connection -): Ethereum_Eip1559FeesEstimate! -``` - -### estimateTransactionGas - -```graphql -estimateTransactionGas( - tx: Ethereum_TxRequest! - connection: Ethereum_Connection -): BigInt! -``` - -### getBalance - -```graphql -getBalance( - address: String! - blockTag: BigInt - connection: Ethereum_Connection -): BigInt! -``` - -### getChainId - -```graphql -getChainId( - connection: Ethereum_Connection -): String! -``` - -### getGasPrice - -```graphql -getGasPrice( - connection: Ethereum_Connection -): BigInt! -``` - -### getSignerAddress - -```graphql -getSignerAddress( - connection: Ethereum_Connection -): String! -``` - -### getSignerBalance - -```graphql -getSignerBalance( - blockTag: BigInt - connection: Ethereum_Connection -): BigInt! -``` - -### getSignerTransactionCount - -```graphql -getSignerTransactionCount( - blockTag: BigInt - connection: Ethereum_Connection -): BigInt! -``` - -### sendRpc - -```graphql -sendRpc( - method: String! - params: String[]! - connection: Ethereum_Connection -): String! -``` - -### sendTransaction - -```graphql -sendTransaction( - tx: Ethereum_TxRequest! - connection: Ethereum_Connection -): Ethereum_TxResponse! -``` - -### sendTransactionAndWait - -```graphql -sendTransactionAndWait( - tx: Ethereum_TxRequest! - connection: Ethereum_Connection -): Ethereum_TxReceipt! -``` - -### signMessage - -```graphql -signMessage( - message: String! - connection: Ethereum_Connection -): String! -``` - -### signMessageBytes - -```graphql -signMessageBytes( - bytes: Bytes! - connection: Ethereum_Connection -): String! -``` - -### toEth - -```graphql -toEth( - wei: String! -): String! -``` - -### toWei - -```graphql -toWei( - eth: String! -): String! -``` - diff --git a/packages/test-cases/cases/cli/docgen/004-app/expected/docs/Ethereum_objects.md b/packages/test-cases/cases/cli/docgen/004-app/expected/docs/Ethereum_objects.md deleted file mode 100644 index 0bee987edc..0000000000 --- a/packages/test-cases/cases/cli/docgen/004-app/expected/docs/Ethereum_objects.md +++ /dev/null @@ -1,149 +0,0 @@ ---- -id: Ethereum_objects -title: Ethereum Object Types -sidebar_position: 2 ---- - - -### Ethereum_AccessItem - -```graphql -type Ethereum_AccessItem { - address: String! - storageKeys: String[]! -} -``` - -### Ethereum_Connection - -```graphql -type Ethereum_Connection { - node: String - networkNameOrChainId: String -} -``` - -### Ethereum_Eip1559FeesEstimate - -```graphql -type Ethereum_Eip1559FeesEstimate { - maxFeePerGas: BigInt! - maxPriorityFeePerGas: BigInt! -} -``` - -### Ethereum_Log - -```graphql -type Ethereum_Log { - blockNumber: BigInt! - blockHash: String! - transactionIndex: UInt32! - removed: Boolean! - address: String! - data: String! - topics: String[]! - transactionHash: String! - logIndex: UInt32! -} -``` - -### Ethereum_StaticTxResult - -```graphql -type Ethereum_StaticTxResult { - result: String! - error: Boolean! -} -``` - -### Ethereum_TxOptions - -```graphql -type Ethereum_TxOptions { - gasLimit: BigInt # Gas supplied for the transaction - maxFeePerGas: BigInt # The max total fee to pay per unit of gas. -The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is ā€œrefundedā€ to the user. -This property is ignored when gasPrice is not null. - maxPriorityFeePerGas: BigInt # The gas price paid is baseFeePerGas + maxPriorityFeePerGas. -The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is ā€œrefundedā€ to the user. -This property is ignored when gasPrice is not null. - gasPrice: BigInt # The gas price for legacy transactions. -If this property is not null, a legacy transaction will be sent and maxFeePerGas and maxPriorityFeePerGas will be ignored. - value: BigInt # Ether value sent with transaction - nonce: UInt32 # Override default nonce -} -``` - -### Ethereum_TxReceipt - -```graphql -type Ethereum_TxReceipt { - to: String! - from: String! - contractAddress: String! - transactionIndex: UInt32! - root: String - gasUsed: BigInt! - logsBloom: String! - transactionHash: String! - logs: Ethereum_Log[]! - blockNumber: BigInt! - blockHash: String! - confirmations: UInt32! - cumulativeGasUsed: BigInt! - effectiveGasPrice: BigInt! - type: UInt32! - status: UInt32 -} -``` - -### Ethereum_TxRequest - -```graphql -type Ethereum_TxRequest { - to: String - from: String - data: String - type: UInt32 - chainId: BigInt - accessList: Ethereum_AccessItem[] - gasLimit: BigInt # Gas supplied for the transaction - maxFeePerGas: BigInt # The max total fee to pay per unit of gas. -The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is ā€œrefundedā€ to the user. -This property is ignored when gasPrice is not null. - maxPriorityFeePerGas: BigInt # The gas price paid is baseFeePerGas + maxPriorityFeePerGas. -The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is ā€œrefundedā€ to the user. -This property is ignored when gasPrice is not null. - gasPrice: BigInt # The gas price for legacy transactions. -If this property is not null, a legacy transaction will be sent and maxFeePerGas and maxPriorityFeePerGas will be ignored. - value: BigInt # Ether value sent with transaction - nonce: UInt32 # Override default nonce -} -``` - -### Ethereum_TxResponse - -```graphql -type Ethereum_TxResponse { - hash: String! - to: String - from: String! - nonce: UInt32! - gasLimit: BigInt! - maxFeePerGas: BigInt - maxPriorityFeePerGas: BigInt - gasPrice: BigInt - value: BigInt! - chainId: BigInt! - blockNumber: BigInt - blockHash: String - timestamp: UInt32 - r: String - s: String - v: UInt32 - type: UInt32 - accessList: Ethereum_AccessItem[] -} -``` - diff --git a/packages/test-cases/cases/cli/docgen/004-app/expected/docs/Logger_enums.md b/packages/test-cases/cases/cli/docgen/004-app/expected/docs/Logger_enums.md deleted file mode 100644 index c4cac40698..0000000000 --- a/packages/test-cases/cases/cli/docgen/004-app/expected/docs/Logger_enums.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -id: Logger_enums -title: Logger Enum Types -sidebar_position: 3 ---- - - -### Logger_Logger_LogLevel - -```graphql -enum Logger_Logger_LogLevel { - DEBUG - INFO - WARN - ERROR -} -``` - diff --git a/packages/test-cases/cases/cli/docgen/004-app/expected/docs/Logger_module.md b/packages/test-cases/cases/cli/docgen/004-app/expected/docs/Logger_module.md deleted file mode 100644 index c483edc248..0000000000 --- a/packages/test-cases/cases/cli/docgen/004-app/expected/docs/Logger_module.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: Logger_module -title: Logger Module -sidebar_position: 1 ---- - -### log - -```graphql -log( - level: Logger_Logger_LogLevel! - message: String! -): Boolean! -``` - diff --git a/packages/test-cases/cases/cli/docgen/004-app/expected/stdout.json b/packages/test-cases/cases/cli/docgen/004-app/expected/stdout.json deleted file mode 100644 index a7621f6c30..0000000000 --- a/packages/test-cases/cases/cli/docgen/004-app/expected/stdout.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "stdout": "Docs were generated successfully", - "exitCode": 0 -} diff --git a/packages/test-cases/cases/cli/docgen/004-app/polywrap.app.yaml b/packages/test-cases/cases/cli/docgen/004-app/polywrap.app.yaml deleted file mode 100644 index 40f884e2a9..0000000000 --- a/packages/test-cases/cases/cli/docgen/004-app/polywrap.app.yaml +++ /dev/null @@ -1,6 +0,0 @@ -format: 0.2.0 -project: - name: test-app - type: app/typescript -source: - schema: ./schema.graphql diff --git a/packages/test-cases/cases/cli/docgen/004-app/schema.graphql b/packages/test-cases/cases/cli/docgen/004-app/schema.graphql deleted file mode 100644 index 09a2a6a315..0000000000 --- a/packages/test-cases/cases/cli/docgen/004-app/schema.graphql +++ /dev/null @@ -1,2 +0,0 @@ -#import * into Ethereum from "wrap://ens/wraps.eth:ethereum@1.0.0" -#import * into Logger from "wrap://ens/wraps.eth:logger@1.0.0" diff --git a/packages/test-cases/cases/cli/docgen/005-wasm/.gitignore b/packages/test-cases/cases/cli/docgen/005-wasm/.gitignore deleted file mode 100644 index 29d09945fc..0000000000 --- a/packages/test-cases/cases/cli/docgen/005-wasm/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -docs -!expected/** \ No newline at end of file diff --git a/packages/test-cases/cases/cli/docgen/005-wasm/cmd.json b/packages/test-cases/cases/cli/docgen/005-wasm/cmd.json deleted file mode 100644 index e88975e499..0000000000 --- a/packages/test-cases/cases/cli/docgen/005-wasm/cmd.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "doc": "docusaurus" -} \ No newline at end of file diff --git a/packages/test-cases/cases/cli/docgen/005-wasm/expected/docs/module.md b/packages/test-cases/cases/cli/docgen/005-wasm/expected/docs/module.md deleted file mode 100644 index a2abb12a0a..0000000000 --- a/packages/test-cases/cases/cli/docgen/005-wasm/expected/docs/module.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -id: module -title: Module -sidebar_position: 1 ---- - -### method - -```graphql -method( - arg: String! -): String! -``` - diff --git a/packages/test-cases/cases/cli/docgen/005-wasm/expected/docs/objects.md b/packages/test-cases/cases/cli/docgen/005-wasm/expected/docs/objects.md deleted file mode 100644 index 656ab28e09..0000000000 --- a/packages/test-cases/cases/cli/docgen/005-wasm/expected/docs/objects.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -id: objects -title: Object Types -sidebar_position: 2 ---- - - -### Object - -```graphql -type Object { - uint: UInt! - bools: Boolean[]! - bites: Bytes -} -``` - diff --git a/packages/test-cases/cases/cli/docgen/005-wasm/expected/stdout.json b/packages/test-cases/cases/cli/docgen/005-wasm/expected/stdout.json deleted file mode 100644 index a7621f6c30..0000000000 --- a/packages/test-cases/cases/cli/docgen/005-wasm/expected/stdout.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "stdout": "Docs were generated successfully", - "exitCode": 0 -} diff --git a/packages/test-cases/cases/cli/docgen/005-wasm/package.json b/packages/test-cases/cases/cli/docgen/005-wasm/package.json deleted file mode 100644 index 3360b30d0f..0000000000 --- a/packages/test-cases/cases/cli/docgen/005-wasm/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "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/docgen/005-wasm/polywrap-norun.gen.js b/packages/test-cases/cases/cli/docgen/005-wasm/polywrap-norun.gen.js deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/packages/test-cases/cases/cli/docgen/005-wasm/polywrap.build.yaml b/packages/test-cases/cases/cli/docgen/005-wasm/polywrap.build.yaml deleted file mode 100644 index c3dcbe22cb..0000000000 --- a/packages/test-cases/cases/cli/docgen/005-wasm/polywrap.build.yaml +++ /dev/null @@ -1,9 +0,0 @@ -format: 0.2.0 -strategies: - image: - node_version: "14.16.0" - include: - - ./package.json -linked_packages: - - name: "@polywrap/wasm-as" - path: ../../../../../../wasm/as diff --git a/packages/test-cases/cases/cli/docgen/005-wasm/polywrap.yaml b/packages/test-cases/cases/cli/docgen/005-wasm/polywrap.yaml deleted file mode 100644 index 24250643cf..0000000000 --- a/packages/test-cases/cases/cli/docgen/005-wasm/polywrap.yaml +++ /dev/null @@ -1,9 +0,0 @@ -format: 0.4.0 -project: - name: test-project - type: wasm/assemblyscript -source: - schema: ./schema.graphql - module: ./src/index.ts -extensions: - build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/cli/docgen/005-wasm/schema.graphql b/packages/test-cases/cases/cli/docgen/005-wasm/schema.graphql deleted file mode 100644 index d52b08ea00..0000000000 --- a/packages/test-cases/cases/cli/docgen/005-wasm/schema.graphql +++ /dev/null @@ -1,11 +0,0 @@ -type Module { - method( - arg: String! - ): String! -} - -type Object { - uint: UInt! - bools: [Boolean!]! - bites: Bytes -} diff --git a/packages/test-cases/cases/cli/docgen/005-wasm/src/index.ts b/packages/test-cases/cases/cli/docgen/005-wasm/src/index.ts deleted file mode 100644 index 862d4cb226..0000000000 --- a/packages/test-cases/cases/cli/docgen/005-wasm/src/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Args_method } from "./wrap"; - -export function method(args: Args_method): string { - return args.arg; -} diff --git a/packages/test-cases/cases/cli/docgen/006-plugin/.gitignore b/packages/test-cases/cases/cli/docgen/006-plugin/.gitignore deleted file mode 100644 index 29d09945fc..0000000000 --- a/packages/test-cases/cases/cli/docgen/006-plugin/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -docs -!expected/** \ No newline at end of file diff --git a/packages/test-cases/cases/cli/docgen/006-plugin/cmd.json b/packages/test-cases/cases/cli/docgen/006-plugin/cmd.json deleted file mode 100644 index e88975e499..0000000000 --- a/packages/test-cases/cases/cli/docgen/006-plugin/cmd.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "doc": "docusaurus" -} \ No newline at end of file diff --git a/packages/test-cases/cases/cli/docgen/006-plugin/expected/docs/env.md b/packages/test-cases/cases/cli/docgen/006-plugin/expected/docs/env.md deleted file mode 100644 index 277239ca0a..0000000000 --- a/packages/test-cases/cases/cli/docgen/006-plugin/expected/docs/env.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: env -title: Env Type -sidebar_position: 4 ---- - - -### Env - -```graphql -type Env { - arg1: String! -} -``` - diff --git a/packages/test-cases/cases/cli/docgen/006-plugin/expected/docs/module.md b/packages/test-cases/cases/cli/docgen/006-plugin/expected/docs/module.md deleted file mode 100644 index 678ec7c901..0000000000 --- a/packages/test-cases/cases/cli/docgen/006-plugin/expected/docs/module.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: module -title: Module -sidebar_position: 1 ---- - -### methodOne - -```graphql -methodOne( - str: String! - optStr: String -): Object! -``` - -### methodTwo - -```graphql -methodTwo( - arg: UInt32! -): String! -``` - diff --git a/packages/test-cases/cases/cli/docgen/006-plugin/expected/docs/objects.md b/packages/test-cases/cases/cli/docgen/006-plugin/expected/docs/objects.md deleted file mode 100644 index 794ce00c0a..0000000000 --- a/packages/test-cases/cases/cli/docgen/006-plugin/expected/docs/objects.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -id: objects -title: Object Types -sidebar_position: 2 ---- - - -### Object - -```graphql -type Object { - u: UInt! - array: Boolean[]! - bytes: Bytes -} -``` - diff --git a/packages/test-cases/cases/cli/docgen/006-plugin/expected/stdout.json b/packages/test-cases/cases/cli/docgen/006-plugin/expected/stdout.json deleted file mode 100644 index a7621f6c30..0000000000 --- a/packages/test-cases/cases/cli/docgen/006-plugin/expected/stdout.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "stdout": "Docs were generated successfully", - "exitCode": 0 -} diff --git a/packages/test-cases/cases/cli/docgen/006-plugin/polywrap.plugin.yaml b/packages/test-cases/cases/cli/docgen/006-plugin/polywrap.plugin.yaml deleted file mode 100644 index fefc4fe360..0000000000 --- a/packages/test-cases/cases/cli/docgen/006-plugin/polywrap.plugin.yaml +++ /dev/null @@ -1,7 +0,0 @@ -format: 0.2.0 -project: - name: Test - type: plugin/typescript -source: - schema: ./schema.graphql - module: ./src/index.ts diff --git a/packages/test-cases/cases/cli/docgen/006-plugin/schema.graphql b/packages/test-cases/cases/cli/docgen/006-plugin/schema.graphql deleted file mode 100644 index 4406bc74ce..0000000000 --- a/packages/test-cases/cases/cli/docgen/006-plugin/schema.graphql +++ /dev/null @@ -1,22 +0,0 @@ -#import { Module } into Ethereum from "ens/wraps.eth:ethereum@1.0.0" - -type Module { - methodOne( - str: String! - optStr: String - ): Object! - - methodTwo( - arg: UInt32! - ): String! -} - -type Object { - u: UInt! - array: [Boolean!]! - bytes: Bytes -} - -type Env { - arg1: String! -} diff --git a/packages/test-cases/cases/cli/docgen/006-plugin/src/index.ts b/packages/test-cases/cases/cli/docgen/006-plugin/src/index.ts deleted file mode 100644 index 5bb85ff3e4..0000000000 --- a/packages/test-cases/cases/cli/docgen/006-plugin/src/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./wrap"; diff --git a/packages/test-cases/cases/cli/docgen/007-docusaurus/.gitignore b/packages/test-cases/cases/cli/docgen/007-docusaurus/.gitignore deleted file mode 100644 index 29d09945fc..0000000000 --- a/packages/test-cases/cases/cli/docgen/007-docusaurus/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -docs -!expected/** \ No newline at end of file diff --git a/packages/test-cases/cases/cli/docgen/007-docusaurus/cmd.json b/packages/test-cases/cases/cli/docgen/007-docusaurus/cmd.json deleted file mode 100644 index e88975e499..0000000000 --- a/packages/test-cases/cases/cli/docgen/007-docusaurus/cmd.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "doc": "docusaurus" -} \ No newline at end of file diff --git a/packages/test-cases/cases/cli/docgen/007-docusaurus/expected/docs/enums.md b/packages/test-cases/cases/cli/docgen/007-docusaurus/expected/docs/enums.md deleted file mode 100644 index f5467760a0..0000000000 --- a/packages/test-cases/cases/cli/docgen/007-docusaurus/expected/docs/enums.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -id: enums -title: Enum Types -sidebar_position: 3 ---- - - -### test - -```graphql -enum test { - ARG1 - ARG2 -} -``` - diff --git a/packages/test-cases/cases/cli/docgen/007-docusaurus/expected/docs/module.md b/packages/test-cases/cases/cli/docgen/007-docusaurus/expected/docs/module.md deleted file mode 100644 index d194ca9215..0000000000 --- a/packages/test-cases/cases/cli/docgen/007-docusaurus/expected/docs/module.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: module -title: Module -sidebar_position: 1 ---- - -### method - -```graphql -method( - str: String! - optStr: String -): Object! -``` - diff --git a/packages/test-cases/cases/cli/docgen/007-docusaurus/expected/docs/objects.md b/packages/test-cases/cases/cli/docgen/007-docusaurus/expected/docs/objects.md deleted file mode 100644 index 96a0bbdbc9..0000000000 --- a/packages/test-cases/cases/cli/docgen/007-docusaurus/expected/docs/objects.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -id: objects -title: Object Types -sidebar_position: 2 ---- - - -### Object - -```graphql -type Object { - u: UInt! - array: Boolean[]! - bytes: Bytes -} -``` - -### Object2 - -_Test Comment_ - -```graphql -type Object2 { - u: UInt! # Test Comment - array: Boolean[]! # Test Comment - bytes: Bytes # Test Comment -} -``` - -### Object3 - -```graphql -type Object3 { - u: UInt! - array: Boolean[]! - bytes: Bytes -} -``` - diff --git a/packages/test-cases/cases/cli/docgen/007-docusaurus/expected/stdout.json b/packages/test-cases/cases/cli/docgen/007-docusaurus/expected/stdout.json deleted file mode 100644 index a7621f6c30..0000000000 --- a/packages/test-cases/cases/cli/docgen/007-docusaurus/expected/stdout.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "stdout": "Docs were generated successfully", - "exitCode": 0 -} diff --git a/packages/test-cases/cases/cli/docgen/007-docusaurus/polywrap.build.yaml b/packages/test-cases/cases/cli/docgen/007-docusaurus/polywrap.build.yaml deleted file mode 100644 index 479e3042fe..0000000000 --- a/packages/test-cases/cases/cli/docgen/007-docusaurus/polywrap.build.yaml +++ /dev/null @@ -1,9 +0,0 @@ -format: 0.2.0 -strategies: - image: - node_version: "16.13.0" - include: - - ./package.json -linked_packages: - - name: "@polywrap/wasm-as" - path: ../../../../../../wasm/as diff --git a/packages/test-cases/cases/cli/docgen/007-docusaurus/polywrap.yaml b/packages/test-cases/cases/cli/docgen/007-docusaurus/polywrap.yaml deleted file mode 100644 index 24250643cf..0000000000 --- a/packages/test-cases/cases/cli/docgen/007-docusaurus/polywrap.yaml +++ /dev/null @@ -1,9 +0,0 @@ -format: 0.4.0 -project: - name: test-project - type: wasm/assemblyscript -source: - schema: ./schema.graphql - module: ./src/index.ts -extensions: - build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/cli/docgen/007-docusaurus/schema.graphql b/packages/test-cases/cases/cli/docgen/007-docusaurus/schema.graphql deleted file mode 100644 index ec37fec197..0000000000 --- a/packages/test-cases/cases/cli/docgen/007-docusaurus/schema.graphql +++ /dev/null @@ -1,35 +0,0 @@ -#import { Module } into Ethereum from "ens/wraps.eth:ethereum@1.0.0" - -type Module { - method( - str: String! - optStr: String - ): Object! -} - -type Object { - u: UInt! - array: [Boolean!]! - bytes: Bytes -} - -"""Test Comment""" -type Object2 { - """Test Comment""" - u: UInt! - """Test Comment""" - array: [Boolean!]! - """Test Comment""" - bytes: Bytes -} - -type Object3 { - u: UInt! - array: [Boolean!]! - bytes: Bytes -} - -enum test { - ARG1, - ARG2 -} diff --git a/packages/test-cases/cases/cli/docgen/007-docusaurus/src/index.ts b/packages/test-cases/cases/cli/docgen/007-docusaurus/src/index.ts deleted file mode 100644 index 5bb85ff3e4..0000000000 --- a/packages/test-cases/cases/cli/docgen/007-docusaurus/src/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./wrap"; diff --git a/packages/test-cases/cases/cli/docgen/008-jsdoc/.gitignore b/packages/test-cases/cases/cli/docgen/008-jsdoc/.gitignore deleted file mode 100644 index 29d09945fc..0000000000 --- a/packages/test-cases/cases/cli/docgen/008-jsdoc/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -docs -!expected/** \ No newline at end of file diff --git a/packages/test-cases/cases/cli/docgen/008-jsdoc/cmd.json b/packages/test-cases/cases/cli/docgen/008-jsdoc/cmd.json deleted file mode 100644 index e26e2d0da8..0000000000 --- a/packages/test-cases/cases/cli/docgen/008-jsdoc/cmd.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "doc": "jsdoc" -} \ No newline at end of file diff --git a/packages/test-cases/cases/cli/docgen/008-jsdoc/expected/docs/enums.js b/packages/test-cases/cases/cli/docgen/008-jsdoc/expected/docs/enums.js deleted file mode 100644 index 81d229be22..0000000000 --- a/packages/test-cases/cases/cli/docgen/008-jsdoc/expected/docs/enums.js +++ /dev/null @@ -1,10 +0,0 @@ -/** -* Enum Types -* @module enums -*/ - -/** -* -* @typedef { } module:enums.test -*/ - diff --git a/packages/test-cases/cases/cli/docgen/008-jsdoc/expected/docs/module.js b/packages/test-cases/cases/cli/docgen/008-jsdoc/expected/docs/module.js deleted file mode 100644 index 1cea6bda95..0000000000 --- a/packages/test-cases/cases/cli/docgen/008-jsdoc/expected/docs/module.js +++ /dev/null @@ -1,14 +0,0 @@ -/** -* Module -* @module module -* -*/ - -/** -* -* @function module:method.method -* @param { String } str -* @param { String | null } optStr -* @returns { Object } -*/ - diff --git a/packages/test-cases/cases/cli/docgen/008-jsdoc/expected/docs/objects.js b/packages/test-cases/cases/cli/docgen/008-jsdoc/expected/docs/objects.js deleted file mode 100644 index 5ebf119cd0..0000000000 --- a/packages/test-cases/cases/cli/docgen/008-jsdoc/expected/docs/objects.js +++ /dev/null @@ -1,32 +0,0 @@ -/** -* Object Types -* @module objects -*/ - -/** -* -* @typedef {Object} module:objects.Object -* -* @property { UInt } u -* @property { Boolean[] } array -* @property { Bytes } bytes -*/ - -/** -* Test Comment -* @typedef {Object} module:objects.Object2 -* -* @property { UInt } u Test Comment -* @property { Boolean[] } array Test Comment -* @property { Bytes } bytes Test Comment -*/ - -/** -* -* @typedef {Object} module:objects.Object3 -* -* @property { UInt } u -* @property { Boolean[] } array -* @property { Bytes } bytes -*/ - diff --git a/packages/test-cases/cases/cli/docgen/008-jsdoc/expected/stdout.json b/packages/test-cases/cases/cli/docgen/008-jsdoc/expected/stdout.json deleted file mode 100644 index a7621f6c30..0000000000 --- a/packages/test-cases/cases/cli/docgen/008-jsdoc/expected/stdout.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "stdout": "Docs were generated successfully", - "exitCode": 0 -} diff --git a/packages/test-cases/cases/cli/docgen/008-jsdoc/polywrap.build.yaml b/packages/test-cases/cases/cli/docgen/008-jsdoc/polywrap.build.yaml deleted file mode 100644 index 479e3042fe..0000000000 --- a/packages/test-cases/cases/cli/docgen/008-jsdoc/polywrap.build.yaml +++ /dev/null @@ -1,9 +0,0 @@ -format: 0.2.0 -strategies: - image: - node_version: "16.13.0" - include: - - ./package.json -linked_packages: - - name: "@polywrap/wasm-as" - path: ../../../../../../wasm/as diff --git a/packages/test-cases/cases/cli/docgen/008-jsdoc/polywrap.yaml b/packages/test-cases/cases/cli/docgen/008-jsdoc/polywrap.yaml deleted file mode 100644 index 24250643cf..0000000000 --- a/packages/test-cases/cases/cli/docgen/008-jsdoc/polywrap.yaml +++ /dev/null @@ -1,9 +0,0 @@ -format: 0.4.0 -project: - name: test-project - type: wasm/assemblyscript -source: - schema: ./schema.graphql - module: ./src/index.ts -extensions: - build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/cli/docgen/008-jsdoc/schema.graphql b/packages/test-cases/cases/cli/docgen/008-jsdoc/schema.graphql deleted file mode 100644 index ec37fec197..0000000000 --- a/packages/test-cases/cases/cli/docgen/008-jsdoc/schema.graphql +++ /dev/null @@ -1,35 +0,0 @@ -#import { Module } into Ethereum from "ens/wraps.eth:ethereum@1.0.0" - -type Module { - method( - str: String! - optStr: String - ): Object! -} - -type Object { - u: UInt! - array: [Boolean!]! - bytes: Bytes -} - -"""Test Comment""" -type Object2 { - """Test Comment""" - u: UInt! - """Test Comment""" - array: [Boolean!]! - """Test Comment""" - bytes: Bytes -} - -type Object3 { - u: UInt! - array: [Boolean!]! - bytes: Bytes -} - -enum test { - ARG1, - ARG2 -} diff --git a/packages/test-cases/cases/cli/docgen/008-jsdoc/src/index.ts b/packages/test-cases/cases/cli/docgen/008-jsdoc/src/index.ts deleted file mode 100644 index 5bb85ff3e4..0000000000 --- a/packages/test-cases/cases/cli/docgen/008-jsdoc/src/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./wrap"; diff --git a/packages/test-cases/cases/cli/docgen/009-schema/.gitignore b/packages/test-cases/cases/cli/docgen/009-schema/.gitignore deleted file mode 100644 index 29d09945fc..0000000000 --- a/packages/test-cases/cases/cli/docgen/009-schema/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -docs -!expected/** \ No newline at end of file diff --git a/packages/test-cases/cases/cli/docgen/009-schema/cmd.json b/packages/test-cases/cases/cli/docgen/009-schema/cmd.json deleted file mode 100644 index 4127e26415..0000000000 --- a/packages/test-cases/cases/cli/docgen/009-schema/cmd.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "doc": "schema" -} \ No newline at end of file diff --git a/packages/test-cases/cases/cli/docgen/009-schema/expected/docs/generated-schema.graphql b/packages/test-cases/cases/cli/docgen/009-schema/expected/docs/generated-schema.graphql deleted file mode 100644 index 398f33cac6..0000000000 --- a/packages/test-cases/cases/cli/docgen/009-schema/expected/docs/generated-schema.graphql +++ /dev/null @@ -1,436 +0,0 @@ -### Polywrap Header START ### -scalar UInt -scalar UInt8 -scalar UInt16 -scalar UInt32 -scalar Int -scalar Int8 -scalar Int16 -scalar Int32 -scalar Bytes -scalar BigInt -scalar BigNumber -scalar JSON -scalar Map - -directive @imported( - uri: String! - namespace: String! - nativeType: String! -) on OBJECT | ENUM - -directive @imports( - types: [String!]! -) on OBJECT - -directive @capability( - type: String! - uri: String! - namespace: String! -) repeatable on OBJECT - -directive @enabled_interface on OBJECT - -directive @annotate(type: String!) on FIELD - -directive @env(required: Boolean!) on FIELD_DEFINITION - -### Polywrap Header END ### - -type Module @imports( - types: [ - "Ethereum_Module", - "Ethereum_Connection", - "Ethereum_TxOptions", - "Ethereum_StaticTxResult", - "Ethereum_Eip1559FeesEstimate", - "Ethereum_TxRequest", - "Ethereum_AccessItem", - "Ethereum_TxReceipt", - "Ethereum_Log", - "Ethereum_TxResponse" - ] -) { - method( - str: String! - optStr: String - ): Object! -} - -type Object { - u: UInt! - array: [Boolean!]! - bytes: Bytes -} - -""" -Test Comment -""" -type Object2 { - """ - Test Comment - """ - u: UInt! - """ - Test Comment - """ - array: [Boolean!]! - """ - Test Comment - """ - bytes: Bytes -} - -type Object3 { - u: UInt! - array: [Boolean!]! - bytes: Bytes -} - -enum test { - ARG1 - ARG2 -} - -### Imported Modules START ### - -type Ethereum_Module @imported( - uri: "ens/wraps.eth:ethereum@1.0.0", - namespace: "Ethereum", - nativeType: "Module" -) { - getChainId( - connection: Ethereum_Connection - ): String! - - callContractView( - address: String! - method: String! - args: [String!] - connection: Ethereum_Connection - ): String! - - callContractStatic( - address: String! - method: String! - args: [String!] - options: Ethereum_TxOptions - connection: Ethereum_Connection - ): Ethereum_StaticTxResult! - - encodeParams( - types: [String!]! - values: [String!]! - connection: Ethereum_Connection - ): String! - - encodeFunction( - method: String! - args: [String!] - connection: Ethereum_Connection - ): String! - - decodeFunction( - method: String! - data: String! - connection: Ethereum_Connection - ): [String!]! - - getSignerAddress( - connection: Ethereum_Connection - ): String! - - getSignerBalance( - blockTag: BigInt - connection: Ethereum_Connection - ): BigInt! - - getBalance( - address: String! - blockTag: BigInt - connection: Ethereum_Connection - ): BigInt! - - getGasPrice( - connection: Ethereum_Connection - ): BigInt! - - estimateEip1559Fees( - connection: Ethereum_Connection - ): Ethereum_Eip1559FeesEstimate! - - sendRpc( - method: String! - params: [String!]! - connection: Ethereum_Connection - ): String! - - getSignerTransactionCount( - blockTag: BigInt - connection: Ethereum_Connection - ): BigInt! - - checkAddress( - address: String! - connection: Ethereum_Connection - ): Boolean! - - toWei( - eth: String! - ): String! - - toEth( - wei: String! - ): String! - - estimateTransactionGas( - tx: Ethereum_TxRequest! - connection: Ethereum_Connection - ): BigInt! - - awaitTransaction( - txHash: String! - connection: Ethereum_Connection - ): Ethereum_TxReceipt! - - sendTransaction( - tx: Ethereum_TxRequest! - connection: Ethereum_Connection - ): Ethereum_TxResponse! - - sendTransactionAndWait( - tx: Ethereum_TxRequest! - connection: Ethereum_Connection - ): Ethereum_TxReceipt! - - deployContract( - abi: String! - bytecode: String! - args: [String!] - options: Ethereum_TxOptions - connection: Ethereum_Connection - ): String! - - estimateContractCallGas( - address: String! - method: String! - args: [String!] - options: Ethereum_TxOptions - connection: Ethereum_Connection - ): BigInt! - - callContractMethod( - address: String! - method: String! - args: [String!] - options: Ethereum_TxOptions - connection: Ethereum_Connection - ): Ethereum_TxResponse! - - callContractMethodAndWait( - address: String! - method: String! - args: [String!] - options: Ethereum_TxOptions - connection: Ethereum_Connection - ): Ethereum_TxReceipt! - - signMessage( - message: String! - connection: Ethereum_Connection - ): String! - - signMessageBytes( - bytes: Bytes! - connection: Ethereum_Connection - ): String! -} - -### Imported Modules END ### - -### Imported Objects START ### - -type Ethereum_Connection @imported( - uri: "ens/wraps.eth:ethereum@1.0.0", - namespace: "Ethereum", - nativeType: "Connection" -) { - node: String - networkNameOrChainId: String -} - -type Ethereum_TxOptions @imported( - uri: "ens/wraps.eth:ethereum@1.0.0", - namespace: "Ethereum", - nativeType: "TxOptions" -) { - """ - Gas supplied for the transaction - """ - gasLimit: BigInt - """ - The max total fee to pay per unit of gas. -The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is ā€œrefundedā€ to the user. -This property is ignored when gasPrice is not null. - """ - maxFeePerGas: BigInt - """ - The gas price paid is baseFeePerGas + maxPriorityFeePerGas. -The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is ā€œrefundedā€ to the user. -This property is ignored when gasPrice is not null. - """ - maxPriorityFeePerGas: BigInt - """ - The gas price for legacy transactions. -If this property is not null, a legacy transaction will be sent and maxFeePerGas and maxPriorityFeePerGas will be ignored. - """ - gasPrice: BigInt - """ - Ether value sent with transaction - """ - value: BigInt - """ - Override default nonce - """ - nonce: UInt32 -} - -type Ethereum_StaticTxResult @imported( - uri: "ens/wraps.eth:ethereum@1.0.0", - namespace: "Ethereum", - nativeType: "StaticTxResult" -) { - result: String! - error: Boolean! -} - -type Ethereum_Eip1559FeesEstimate @imported( - uri: "ens/wraps.eth:ethereum@1.0.0", - namespace: "Ethereum", - nativeType: "Eip1559FeesEstimate" -) { - maxFeePerGas: BigInt! - maxPriorityFeePerGas: BigInt! -} - -type Ethereum_TxRequest @imported( - uri: "ens/wraps.eth:ethereum@1.0.0", - namespace: "Ethereum", - nativeType: "TxRequest" -) { - to: String - from: String - data: String - type: UInt32 - chainId: BigInt - accessList: [Ethereum_AccessItem!] - """ - Gas supplied for the transaction - """ - gasLimit: BigInt - """ - The max total fee to pay per unit of gas. -The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is ā€œrefundedā€ to the user. -This property is ignored when gasPrice is not null. - """ - maxFeePerGas: BigInt - """ - The gas price paid is baseFeePerGas + maxPriorityFeePerGas. -The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is ā€œrefundedā€ to the user. -This property is ignored when gasPrice is not null. - """ - maxPriorityFeePerGas: BigInt - """ - The gas price for legacy transactions. -If this property is not null, a legacy transaction will be sent and maxFeePerGas and maxPriorityFeePerGas will be ignored. - """ - gasPrice: BigInt - """ - Ether value sent with transaction - """ - value: BigInt - """ - Override default nonce - """ - nonce: UInt32 -} - -type Ethereum_AccessItem @imported( - uri: "ens/wraps.eth:ethereum@1.0.0", - namespace: "Ethereum", - nativeType: "AccessItem" -) { - address: String! - storageKeys: [String!]! -} - -type Ethereum_TxReceipt @imported( - uri: "ens/wraps.eth:ethereum@1.0.0", - namespace: "Ethereum", - nativeType: "TxReceipt" -) { - to: String! - from: String! - contractAddress: String! - transactionIndex: UInt32! - root: String - gasUsed: BigInt! - logsBloom: String! - transactionHash: String! - logs: [Ethereum_Log!]! - blockNumber: BigInt! - blockHash: String! - confirmations: UInt32! - cumulativeGasUsed: BigInt! - effectiveGasPrice: BigInt! - type: UInt32! - status: UInt32 -} - -type Ethereum_Log @imported( - uri: "ens/wraps.eth:ethereum@1.0.0", - namespace: "Ethereum", - nativeType: "Log" -) { - blockNumber: BigInt! - blockHash: String! - transactionIndex: UInt32! - removed: Boolean! - address: String! - data: String! - topics: [String!]! - transactionHash: String! - logIndex: UInt32! -} - -type Ethereum_TxResponse @imported( - uri: "ens/wraps.eth:ethereum@1.0.0", - namespace: "Ethereum", - nativeType: "TxResponse" -) { - hash: String! - to: String - from: String! - nonce: UInt32! - gasLimit: BigInt! - maxFeePerGas: BigInt - maxPriorityFeePerGas: BigInt - gasPrice: BigInt - value: BigInt! - chainId: BigInt! - blockNumber: BigInt - blockHash: String - timestamp: UInt32 - r: String - s: String - v: UInt32 - type: UInt32 - accessList: [Ethereum_AccessItem!] -} - -### Imported Objects END ### - -### Imported Envs START ### - -### Imported Envs END ### - diff --git a/packages/test-cases/cases/cli/docgen/009-schema/expected/stdout.json b/packages/test-cases/cases/cli/docgen/009-schema/expected/stdout.json deleted file mode 100644 index a7621f6c30..0000000000 --- a/packages/test-cases/cases/cli/docgen/009-schema/expected/stdout.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "stdout": "Docs were generated successfully", - "exitCode": 0 -} diff --git a/packages/test-cases/cases/cli/docgen/009-schema/polywrap.build.yaml b/packages/test-cases/cases/cli/docgen/009-schema/polywrap.build.yaml deleted file mode 100644 index 479e3042fe..0000000000 --- a/packages/test-cases/cases/cli/docgen/009-schema/polywrap.build.yaml +++ /dev/null @@ -1,9 +0,0 @@ -format: 0.2.0 -strategies: - image: - node_version: "16.13.0" - include: - - ./package.json -linked_packages: - - name: "@polywrap/wasm-as" - path: ../../../../../../wasm/as diff --git a/packages/test-cases/cases/cli/docgen/009-schema/polywrap.yaml b/packages/test-cases/cases/cli/docgen/009-schema/polywrap.yaml deleted file mode 100644 index ee9034f333..0000000000 --- a/packages/test-cases/cases/cli/docgen/009-schema/polywrap.yaml +++ /dev/null @@ -1,9 +0,0 @@ -format: 0.4.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/docgen/009-schema/schema.graphql b/packages/test-cases/cases/cli/docgen/009-schema/schema.graphql deleted file mode 100644 index 5d3415dd5b..0000000000 --- a/packages/test-cases/cases/cli/docgen/009-schema/schema.graphql +++ /dev/null @@ -1,35 +0,0 @@ -#import { Module } into Ethereum from "ens/wraps.eth:ethereum@1.0.0" - -type Module { - method( - str: String! - optStr: String - ): Object! -} - -type Object { - u: UInt! - array: [Boolean!]! - bytes: Bytes -} - -"""Test Comment""" -type Object2 { - """Test Comment""" - u: UInt! - """Test Comment""" - array: [Boolean!]! - """Test Comment""" - bytes: Bytes -} - -type Object3 { - u: UInt! - array: [Boolean!]! - bytes: Bytes -} - -enum test { - ARG1, - ARG2 -} diff --git a/packages/test-cases/cases/cli/docgen/009-schema/src/index.ts b/packages/test-cases/cases/cli/docgen/009-schema/src/index.ts deleted file mode 100644 index 5bb85ff3e4..0000000000 --- a/packages/test-cases/cases/cli/docgen/009-schema/src/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./wrap"; From 451e88eaa464bc68bcf1344bb52e3f0b8f24db8e Mon Sep 17 00:00:00 2001 From: krisbitney Date: Mon, 10 Jul 2023 14:41:22 -0500 Subject: [PATCH 065/181] removed ipfs-http-client dependency from CLI --- packages/cli/package.json | 1 - yarn.lock | 670 +------------------------------------- 2 files changed, 14 insertions(+), 657 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index d20311d753..9914741c2c 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -72,7 +72,6 @@ "extract-zip": "2.0.1", "form-data": "4.0.0", "fs-extra": "9.0.1", - "ipfs-http-client": "48.1.3", "json-schema": "0.4.0", "jsonschema": "1.4.0", "mustache": "4.0.1", diff --git a/yarn.lock b/yarn.lock index 8c54b48b48..5b08c59716 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1858,11 +1858,6 @@ resolved "https://registry.yarnpkg.com/@msgpack/msgpack/-/msgpack-2.7.2.tgz#f34b8aa0c49f0dd55eb7eba577081299cbf3f90b" integrity sha512-rYEi46+gIzufyYUAoHDnRzkWGxajpD9vVXFQ3g1vbjrBm6P7MBmm+s/fqPa46sxa+8FOUdEuRQKaugo5a4JWpw== -"@multiformats/base-x@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@multiformats/base-x/-/base-x-4.0.1.tgz#95ff0fa58711789d53aefb2590a8b7a4e715d121" - integrity sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw== - "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -2960,11 +2955,6 @@ resolved "https://registry.yarnpkg.com/@web3api/assemblyscript-json/-/assemblyscript-json-1.2.0.tgz#f01f11f12a66cd1a319d43f12e476307d1ad3da8" integrity sha512-x+wchJpH1giJzXj3dYs8vh2SKMXepeqVXiaFV/YCtXg4X/KaUnxi0kp5JugbEAyEJurEScH1YuV6IvGhGui/fw== -"@zxing/text-encoding@0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@zxing/text-encoding/-/text-encoding-0.9.0.tgz#fb50ffabc6c7c66a0c96b4c03e3d9be74864b70b" - integrity sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA== - JSONStream@^1.0.4: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" @@ -2983,13 +2973,6 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" - acorn-globals@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" @@ -3128,14 +3111,6 @@ any-promise@^1.0.0: resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== -any-signal@^2.0.0, any-signal@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/any-signal/-/any-signal-2.1.2.tgz#8d48270de0605f8b218cf9abe8e9c6a0e7418102" - integrity sha512-B+rDnWasMi/eWcajPcCWSlYc7muXOrcYrqgyzcdKisl2H/WTlQ0gip1KyQfr0ZlxJdsuWCj/LWwQm7fhyhRfIQ== - dependencies: - abort-controller "^3.0.0" - native-abort-controller "^1.0.3" - anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -3491,11 +3466,6 @@ before-after-hook@^2.2.0: resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== -bignumber.js@^9.0.0: - version "9.1.1" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" - integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== - binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -3506,27 +3476,6 @@ binaryen@102.0.0-nightly.20211028: resolved "https://registry.yarnpkg.com/binaryen/-/binaryen-102.0.0-nightly.20211028.tgz#8f1efb0920afd34509e342e37f84313ec936afb2" integrity sha512-GCJBVB5exbxzzvyt8MGDv/MeUjs6gkXDvf4xOIItRBptYl0Tz5sm1o/uG95YK0L0VeG5ajDu3hRtkBP2kzqC5w== -bl@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -blakejs@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" - integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== - -blob-to-it@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/blob-to-it/-/blob-to-it-1.0.4.tgz#f6caf7a4e90b7bb9215fa6a318ed6bd8ad9898cb" - integrity sha512-iCmk0W4NdbrWgRRuxOriU8aM5ijeVLI61Zulsmg/lUHNr7pYjoj+U77opLefNagevtrrbMt3JQ5Qip7ar178kA== - dependencies: - browser-readablestream-to-it "^1.0.3" - bn.js@^4.11.9: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" @@ -3537,19 +3486,6 @@ bn.js@^5.2.1: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== -borc@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/borc/-/borc-2.1.2.tgz#6ce75e7da5ce711b963755117dd1b187f6f8cf19" - integrity sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w== - dependencies: - bignumber.js "^9.0.0" - buffer "^5.5.0" - commander "^2.15.0" - ieee754 "^1.1.13" - iso-url "~0.4.7" - json-text-sequence "~0.1.0" - readable-stream "^3.6.0" - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -3558,13 +3494,6 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - braces@^2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" @@ -3598,11 +3527,6 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browser-readablestream-to-it@^1.0.1, browser-readablestream-to-it@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/browser-readablestream-to-it/-/browser-readablestream-to-it-1.0.3.tgz#ac3e406c7ee6cdf0a502dd55db33bab97f7fba76" - integrity sha512-+12sHB+Br8HIh6VAMVEG5r3UXCyESIgDW7kzk3BjIXa43DVqVwL7GC5TW3jeh+72dtcH99pPVpw0X8i0jt+/kw== - browserslist@^4.21.3: version "4.21.9" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" @@ -3642,7 +3566,7 @@ buffer-from@1.x, buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@^5.4.3, buffer@^5.5.0, buffer@^5.6.0: +buffer@^5.5.0, buffer@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -3650,14 +3574,6 @@ buffer@^5.4.3, buffer@^5.5.0, buffer@^5.6.0: base64-js "^1.3.1" ieee754 "^1.1.13" -buffer@^6.0.1: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - builtins@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" @@ -3850,16 +3766,6 @@ cids@^0.7.1: multicodec "^1.0.0" multihashes "~0.4.15" -cids@^1.0.0: - version "1.1.9" - resolved "https://registry.yarnpkg.com/cids/-/cids-1.1.9.tgz#402c26db5c07059377bcd6fb82f2a24e7f2f4a4f" - integrity sha512-l11hWRfugIcbGuTZwAM5PwpjPPjyb6UZOGwlHSnOBV5o07XhQ4gNpBN67FbODvpjyHtd+0Xs6KNvUcGBiDRsdg== - dependencies: - multibase "^4.0.1" - multicodec "^3.0.1" - multihashes "^4.0.1" - uint8arrays "^3.0.0" - cjs-module-lexer@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz#4186fcca0eae175970aee870b9fe2d6cf8d5655f" @@ -4019,7 +3925,7 @@ commander@9.2.0: resolved "https://registry.yarnpkg.com/commander/-/commander-9.2.0.tgz#6e21014b2ed90d8b7c9647230d8b7a94a4a419a9" integrity sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w== -commander@^2.15.0, commander@^2.19.0: +commander@^2.19.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -4291,7 +4197,7 @@ dateformat@^3.0.0: resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.3: +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.3: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -4402,11 +4308,6 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== -delimit-stream@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/delimit-stream/-/delimit-stream-0.1.0.tgz#9b8319477c0e5f8aeb3ce357ae305fc25ea1cd2b" - integrity sha512-a02fiQ7poS5CnjiJBAsjGLPp5EwVoGHNeu9sziBd9huppRfsAFIpv5zNLv0V1gbop53ilngAf5Kf331AwcoRBQ== - depd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" @@ -4485,15 +4386,6 @@ discontinuous-range@1.0.0: resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a" integrity sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ== -dns-over-http-resolver@^1.0.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/dns-over-http-resolver/-/dns-over-http-resolver-1.2.3.tgz#194d5e140a42153f55bb79ac5a64dd2768c36af9" - integrity sha512-miDiVSI6KSNbi4SVifzO/reD8rMnxgrlnkrlkugOLQpWQTe2qMdHsZp5DmfKjxNE+/T3VAAYLQUZMv9SMr6+AA== - dependencies: - debug "^4.3.1" - native-fetch "^3.0.0" - receptacle "^1.3.2" - docker-compose@0.23.17: version "0.23.17" resolved "https://registry.yarnpkg.com/docker-compose/-/docker-compose-0.23.17.tgz#8816bef82562d9417dc8c790aa4871350f93a2ba" @@ -4550,13 +4442,6 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" -electron-fetch@^1.7.2: - version "1.9.1" - resolved "https://registry.yarnpkg.com/electron-fetch/-/electron-fetch-1.9.1.tgz#e28bfe78d467de3f2dec884b1d72b8b05322f30f" - integrity sha512-M9qw6oUILGVrcENMSRRefE1MbHPIz0h79EKIeJWK9v563aT9Qkh8aEHPO1H5vi970wPirNY+jO9OpFoLiMsMGA== - dependencies: - encoding "^0.1.13" - electron-to-chromium@^1.4.431: version "1.4.445" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.445.tgz#058d2c5f3a2981ab1a37440f5a5e42d15672aa6d" @@ -4590,7 +4475,7 @@ emoji-regex@^9.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== -encoding@^0.1.12, encoding@^0.1.13: +encoding@^0.1.12: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== @@ -4621,16 +4506,11 @@ envinfo@^7.7.4: resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.10.0.tgz#55146e3909cc5fe63c22da63fb15b05aeac35b13" integrity sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw== -err-code@^2.0.0, err-code@^2.0.2, err-code@^2.0.3: +err-code@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== -err-code@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-3.0.1.tgz#a444c7b992705f2b120ee320b09972eef331c920" - integrity sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA== - error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -4994,11 +4874,6 @@ event-emitter@^0.3.5: d "1" es5-ext "~0.10.14" -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - eventemitter3@^4.0.4: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" @@ -5163,11 +5038,6 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== -fast-fifo@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.0.tgz#03e381bcbfb29932d7c3afde6e15e83e05ab4d8b" - integrity sha512-IgfweLvEpwyA4WgiQe9Nx6VV2QkML2NkvZnk1oKnIzXgXdWxuhF7zw4DvLTPZJn6PIUneiAXPF24QmoEqHTjyw== - fast-glob@^3.2.5, fast-glob@^3.2.9: version "3.2.12" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" @@ -5345,7 +5215,7 @@ fs-extra@9.0.1: jsonfile "^6.0.1" universalify "^1.0.0" -fs-extra@^9.0.1, fs-extra@^9.1.0: +fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -5438,11 +5308,6 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@ has-proto "^1.0.1" has-symbols "^1.0.3" -get-iterator@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-iterator/-/get-iterator-1.0.2.tgz#cd747c02b4c084461fac14f48f6b45a80ed25c82" - integrity sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg== - get-package-type@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" @@ -5594,7 +5459,7 @@ globals@^12.1.0: dependencies: type-fest "^0.8.1" -globalthis@^1.0.1, globalthis@^1.0.3: +globalthis@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== @@ -5855,7 +5720,7 @@ iconv-lite@^0.6.2: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -ieee754@^1.1.13, ieee754@^1.2.1: +ieee754@^1.1.13: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -5994,132 +5859,11 @@ invert-kv@^3.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-3.0.1.tgz#a93c7a3d4386a1dc8325b97da9bb1620c0282523" integrity sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw== -ip-regex@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" - integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== - ip@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== -ipfs-core-utils@^0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/ipfs-core-utils/-/ipfs-core-utils-0.5.4.tgz#c7fa508562086be65cebb51feb13c58abbbd3d8d" - integrity sha512-V+OHCkqf/263jHU0Fc9Rx/uDuwlz3PHxl3qu6a5ka/mNi6gucbFuI53jWsevCrOOY9giWMLB29RINGmCV5dFeQ== - dependencies: - any-signal "^2.0.0" - blob-to-it "^1.0.1" - browser-readablestream-to-it "^1.0.1" - cids "^1.0.0" - err-code "^2.0.3" - ipfs-utils "^5.0.0" - it-all "^1.0.4" - it-map "^1.0.4" - it-peekable "^1.0.1" - multiaddr "^8.0.0" - multiaddr-to-uri "^6.0.0" - parse-duration "^0.4.4" - timeout-abort-controller "^1.1.1" - uint8arrays "^1.1.0" - -ipfs-http-client@48.1.3: - version "48.1.3" - resolved "https://registry.yarnpkg.com/ipfs-http-client/-/ipfs-http-client-48.1.3.tgz#d9b91b1f65d54730de92290d3be5a11ef124b400" - integrity sha512-+JV4cdMaTvYN3vd4r6+mcVxV3LkJXzc4kn2ToVbObpVpdqmG34ePf1KlvFF8A9gjcel84WpiP5xCEV/IrisPBA== - dependencies: - any-signal "^2.0.0" - bignumber.js "^9.0.0" - cids "^1.0.0" - debug "^4.1.1" - form-data "^3.0.0" - ipfs-core-utils "^0.5.4" - ipfs-utils "^5.0.0" - ipld-block "^0.11.0" - ipld-dag-cbor "^0.17.0" - ipld-dag-pb "^0.20.0" - ipld-raw "^6.0.0" - it-last "^1.0.4" - it-map "^1.0.4" - it-tar "^1.2.2" - it-to-stream "^0.1.2" - merge-options "^2.0.0" - multiaddr "^8.0.0" - multibase "^3.0.0" - multicodec "^2.0.1" - multihashes "^3.0.1" - nanoid "^3.1.12" - native-abort-controller "~0.0.3" - parse-duration "^0.4.4" - stream-to-it "^0.2.2" - uint8arrays "^1.1.0" - -ipfs-utils@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ipfs-utils/-/ipfs-utils-5.0.1.tgz#7c0053d5e77686f45577257a73905d4523e6b4f7" - integrity sha512-28KZPgO4Uf5duT2ORLAYfboUp98iUshDD7yRAfbNxNAR8Dtidfn6o20rZfoXnkri2zKBVIPlJkuCPmPJB+6erg== - dependencies: - abort-controller "^3.0.0" - any-signal "^2.1.0" - buffer "^6.0.1" - electron-fetch "^1.7.2" - err-code "^2.0.0" - fs-extra "^9.0.1" - is-electron "^2.2.0" - iso-url "^1.0.0" - it-glob "0.0.10" - it-to-stream "^0.1.2" - merge-options "^2.0.0" - nanoid "^3.1.3" - native-abort-controller "0.0.3" - native-fetch "^2.0.0" - node-fetch "^2.6.0" - stream-to-it "^0.2.0" - -ipld-block@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/ipld-block/-/ipld-block-0.11.1.tgz#c3a7b41aee3244187bd87a73f980e3565d299b6e" - integrity sha512-sDqqLqD5qh4QzGq6ssxLHUCnH4emCf/8F8IwjQM2cjEEIEHMUj57XhNYgmGbemdYPznUhffxFGEHsruh5+HQRw== - dependencies: - cids "^1.0.0" - -ipld-dag-cbor@^0.17.0: - version "0.17.1" - resolved "https://registry.yarnpkg.com/ipld-dag-cbor/-/ipld-dag-cbor-0.17.1.tgz#842e6c250603e5791049168831a425ec03471fb1" - integrity sha512-Bakj/cnxQBdscORyf4LRHxQJQfoaY8KWc7PWROQgX+aw5FCzBt8ga0VM/59K+ABOznsqNvyLR/wz/oYImOpXJw== - dependencies: - borc "^2.1.2" - cids "^1.0.0" - is-circular "^1.0.2" - multicodec "^3.0.1" - multihashing-async "^2.0.0" - uint8arrays "^2.1.3" - -ipld-dag-pb@^0.20.0: - version "0.20.0" - resolved "https://registry.yarnpkg.com/ipld-dag-pb/-/ipld-dag-pb-0.20.0.tgz#025c0343aafe6cb9db395dd1dc93c8c60a669360" - integrity sha512-zfM0EdaolqNjAxIrtpuGKvXxWk5YtH9jKinBuQGTcngOsWFQhyybGCTJHGNGGtRjHNJi2hz5Udy/8pzv4kcKyg== - dependencies: - cids "^1.0.0" - class-is "^1.1.0" - multicodec "^2.0.0" - multihashing-async "^2.0.0" - protons "^2.0.0" - reset "^0.1.0" - run "^1.4.0" - stable "^0.1.8" - uint8arrays "^1.0.0" - -ipld-raw@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/ipld-raw/-/ipld-raw-6.0.0.tgz#74d947fcd2ce4e0e1d5bb650c1b5754ed8ea6da0" - integrity sha512-UK7fjncAzs59iu/o2kwYtb8jgTtW6B+cNWIiNpAJkfRwqoMk1xD/6i25ktzwe4qO8gQgoR9RxA5ibC23nq8BLg== - dependencies: - cids "^1.0.0" - multicodec "^2.0.0" - multihashing-async "^2.0.0" - is-absolute@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" @@ -6142,14 +5886,6 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-arguments@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" @@ -6203,11 +5939,6 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-circular@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-circular/-/is-circular-1.0.2.tgz#2e0ab4e9835f4c6b0ea2b9855a84acd501b8366c" - integrity sha512-YttjnrswnUYRVJvxCvu8z+PGMUSzC2JttP0OEXezlAEdp3EXzhf7IZ3j0gRAybJBQupedIZFhY61Tga6E0qASA== - is-core-module@^2.11.0, is-core-module@^2.5.0: version "2.12.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" @@ -6259,11 +5990,6 @@ is-docker@^2.0.0: resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== -is-electron@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/is-electron/-/is-electron-2.2.2.tgz#3778902a2044d76de98036f5dc58089ac4d80bb9" - integrity sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg== - is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -6298,13 +6024,6 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-generator-function@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -6312,13 +6031,6 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" -is-ip@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-3.1.0.tgz#2ae5ddfafaf05cb8008a62093cf29734f657c5d8" - integrity sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q== - dependencies: - ip-regex "^4.0.0" - is-lambda@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" @@ -6450,7 +6162,7 @@ is-text-path@^1.0.1: dependencies: text-extensions "^1.0.0" -is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9: +is-typed-array@^1.1.10, is-typed-array@^1.1.9: version "1.1.10" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== @@ -6512,21 +6224,6 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -iso-constants@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/iso-constants/-/iso-constants-0.1.2.tgz#3d2456ed5aeaa55d18564f285ba02a47a0d885b4" - integrity sha512-OTCM5ZCQsHBCI4Wdu4tSxvDIkmDHd5EwJDps5mKqnQnWJSKlnwMs3EDZ4n3Fh1tmkWkDlyd2vCDbEYuPbyrUNQ== - -iso-url@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/iso-url/-/iso-url-1.2.1.tgz#db96a49d8d9a64a1c889fc07cc525d093afb1811" - integrity sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng== - -iso-url@~0.4.7: - version "0.4.7" - resolved "https://registry.yarnpkg.com/iso-url/-/iso-url-0.4.7.tgz#de7e48120dae46921079fe78f325ac9e9217a385" - integrity sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog== - isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" @@ -6596,72 +6293,6 @@ istanbul-reports@^3.0.2: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -it-all@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/it-all/-/it-all-1.0.6.tgz#852557355367606295c4c3b7eff0136f07749335" - integrity sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A== - -it-concat@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/it-concat/-/it-concat-1.0.3.tgz#84db9376e4c77bf7bc1fd933bb90f184e7cef32b" - integrity sha512-sjeZQ1BWQ9U/W2oI09kZgUyvSWzQahTkOkLIsnEPgyqZFaF9ME5gV6An4nMjlyhXKWQMKEakQU8oRHs2SdmeyA== - dependencies: - bl "^4.0.0" - -it-glob@0.0.10: - version "0.0.10" - resolved "https://registry.yarnpkg.com/it-glob/-/it-glob-0.0.10.tgz#4defd9286f693847c3ff483d2ff65f22e1359ad8" - integrity sha512-p1PR15djgPV7pxdLOW9j4WcJdla8+91rJdUU2hU2Jm68vkxpIEXK55VHBeH8Lvqh2vqLtM83t8q4BuJxue6niA== - dependencies: - fs-extra "^9.0.1" - minimatch "^3.0.4" - -it-last@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/it-last/-/it-last-1.0.6.tgz#4106232e5905ec11e16de15a0e9f7037eaecfc45" - integrity sha512-aFGeibeiX/lM4bX3JY0OkVCFkAw8+n9lkukkLNivbJRvNz8lI3YXv5xcqhFUV2lDJiraEK3OXRDbGuevnnR67Q== - -it-map@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/it-map/-/it-map-1.0.6.tgz#6aa547e363eedcf8d4f69d8484b450bc13c9882c" - integrity sha512-XT4/RM6UHIFG9IobGlQPFQUrlEKkU4eBUFG3qhWhfAdh1JfF2x11ShCrKCdmZ0OiZppPfoLuzcfA4cey6q3UAQ== - -it-peekable@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/it-peekable/-/it-peekable-1.0.3.tgz#8ebe933767d9c5aa0ae4ef8e9cb3a47389bced8c" - integrity sha512-5+8zemFS+wSfIkSZyf0Zh5kNN+iGyccN02914BY4w/Dj+uoFEoPSvj5vaWn8pNZJNSxzjW0zHRxC3LUb2KWJTQ== - -it-reader@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/it-reader/-/it-reader-2.1.0.tgz#b1164be343f8538d8775e10fb0339f61ccf71b0f" - integrity sha512-hSysqWTO9Tlwc5EGjVf8JYZzw0D2FsxD/g+eNNWrez9zODxWt6QlN6JAMmycK72Mv4jHEKEXoyzUN4FYGmJaZw== - dependencies: - bl "^4.0.0" - -it-tar@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/it-tar/-/it-tar-1.2.2.tgz#8d79863dad27726c781a4bcc491f53c20f2866cf" - integrity sha512-M8V4a9I+x/vwXTjqvixcEZbQZHjwDIb8iUQ+D4M2QbhAdNs3WKVSl+45u5/F2XFx6jYMFOGzMVlKNK/uONgNIA== - dependencies: - bl "^4.0.0" - buffer "^5.4.3" - iso-constants "^0.1.2" - it-concat "^1.0.0" - it-reader "^2.0.0" - p-defer "^3.0.0" - -it-to-stream@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/it-to-stream/-/it-to-stream-0.1.2.tgz#7163151f75b60445e86b8ab1a968666acaacfe7b" - integrity sha512-DTB5TJRZG3untmZehcaFN0kGWl2bNv7tnJRgQHAO9QEt8jfvVRrebZtnD5NZd4SCj4WVPjl0LSrugNWE/UaZRQ== - dependencies: - buffer "^5.6.0" - fast-fifo "^1.0.0" - get-iterator "^1.0.2" - p-defer "^3.0.0" - p-fifo "^1.0.0" - readable-stream "^3.6.0" - jest-changed-files@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.6.2.tgz#f6198479e1cc66f22f9ae1e22acaa0b429c042d0" @@ -7065,7 +6696,7 @@ jest@26.6.3: import-local "^3.0.2" jest-cli "^26.6.3" -js-sha3@0.8.0, js-sha3@^0.8.0: +js-sha3@0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== @@ -7188,13 +6819,6 @@ json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== -json-text-sequence@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/json-text-sequence/-/json-text-sequence-0.1.1.tgz#a72f217dc4afc4629fff5feb304dc1bd51a2f3d2" - integrity sha512-L3mEegEWHRekSHjc7+sc8eJhba9Clq1PZ8kMkzf8OxElhXc8O4TS5MwcVlj9aEbm5dr81N90WHC5nAz3UO971w== - dependencies: - delimit-stream "0.1.0" - json5@2.x, json5@^2.2.2: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" @@ -7616,13 +7240,6 @@ meow@^8.0.0: type-fest "^0.18.0" yargs-parser "^20.2.3" -merge-options@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-options/-/merge-options-2.0.0.tgz#36ca5038badfc3974dbde5e58ba89d3df80882c3" - integrity sha512-S7xYIeWHl2ZUKF7SDeBhGg6rfv5bKxVBdk95s/I7wVF8d+hjLSztJ/B271cnUiF6CAFduEQ5Zn3HYwAjT16DlQ== - dependencies: - is-plain-obj "^2.0.0" - merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -7692,13 +7309,6 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== -minimatch@*: - version "9.0.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.2.tgz#397e387fff22f6795844d00badc903a3d5de7057" - integrity sha512-PZOT9g5v2ojiTL7r1xF6plNHLtOeTpSlDI007As2NlA2aYBMfVom17yqa6QzhmDP8QOhn7LjHTg7DFCVSSa6yg== - dependencies: - brace-expansion "^2.0.1" - minimatch@^3.0.3, minimatch@^3.0.4, minimatch@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -7856,27 +7466,6 @@ ms@^2.0.0, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multiaddr-to-uri@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/multiaddr-to-uri/-/multiaddr-to-uri-6.0.0.tgz#8f08a75c6eeb2370d5d24b77b8413e3f0fa9bcc0" - integrity sha512-OjpkVHOXEmIKMO8WChzzQ7aZQcSQX8squxmvtDbRpy7/QNmJ3Z7jv6qyD74C28QtaeNie8O8ngW2AkeiMmKP7A== - dependencies: - multiaddr "^8.0.0" - -multiaddr@^8.0.0: - version "8.1.2" - resolved "https://registry.yarnpkg.com/multiaddr/-/multiaddr-8.1.2.tgz#74060ff8636ba1c01b2cf0ffd53950b852fa9b1f" - integrity sha512-r13IzW8+Sv9zab9Gt8RPMIN2WkptIPq99EpAzg4IbJ/zTELhiEwXWr9bAmEatSCI4j/LSA6ESJzvz95JZ+ZYXQ== - dependencies: - cids "^1.0.0" - class-is "^1.1.0" - dns-over-http-resolver "^1.0.0" - err-code "^2.0.3" - is-ip "^3.1.0" - multibase "^3.0.0" - uint8arrays "^1.1.0" - varint "^5.0.0" - multibase@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b" @@ -7885,21 +7474,6 @@ multibase@^0.7.0: base-x "^3.0.8" buffer "^5.5.0" -multibase@^3.0.0, multibase@^3.1.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-3.1.2.tgz#59314e1e2c35d018db38e4c20bb79026827f0f2f" - integrity sha512-bpklWHs70LO3smJUHOjcnzGceJJvn9ui0Vau6Za0B/GBepaXswmW8Ufea0uD9pROf/qCQ4N4lZ3sf3U+SNf0tw== - dependencies: - "@multiformats/base-x" "^4.0.1" - web-encoding "^1.0.6" - -multibase@^4.0.1: - version "4.0.6" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-4.0.6.tgz#6e624341483d6123ca1ede956208cb821b440559" - integrity sha512-x23pDe5+svdLz/k5JPGCVdfn7Q5mZVMBETiC+ORfO+sor9Sgs0smJzAjfTbM5tckeCqnaUuMYoz+k3RXMmJClQ== - dependencies: - "@multiformats/base-x" "^4.0.1" - multibase@~0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b" @@ -7923,27 +7497,6 @@ multicodec@^1.0.0: buffer "^5.6.0" varint "^5.0.0" -multicodec@^2.0.0, multicodec@^2.0.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-2.1.3.tgz#b9850635ad4e2a285a933151b55b4a2294152a5d" - integrity sha512-0tOH2Gtio39uO41o+2xl9UhRkCWxU5ZmZSbFCh/OjGzkWJI8e6lkN/s4Mj1YfyWoBod+2+S3W+6wO6nhkwN8pA== - dependencies: - uint8arrays "1.1.0" - varint "^6.0.0" - -multicodec@^3.0.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-3.2.1.tgz#82de3254a0fb163a107c1aab324f2a91ef51efb2" - integrity sha512-+expTPftro8VAW8kfvcuNNNBgb9gPeNYV9dn+z1kJRWF2vih+/S79f2RVeIwmrJBUJ6NT9IUPWnZDQvegEh5pw== - dependencies: - uint8arrays "^3.0.0" - varint "^6.0.0" - -multiformats@^9.4.2: - version "9.9.0" - resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.9.0.tgz#c68354e7d21037a8f1f8833c8ccd68618e8f1d37" - integrity sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== - multihashes@^0.4.15, multihashes@~0.4.15: version "0.4.21" resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5" @@ -7953,36 +7506,6 @@ multihashes@^0.4.15, multihashes@~0.4.15: multibase "^0.7.0" varint "^5.0.0" -multihashes@^3.0.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-3.1.2.tgz#ffa5e50497aceb7911f7b4a3b6cada9b9730edfc" - integrity sha512-AP4IoV/YzkNrfbQKZE3OMPibrmy350OmCd6cJkwyM8oExaXIlOY4UnOOVSQtAEuq/LR01XfXKCESidzZvSwHCQ== - dependencies: - multibase "^3.1.0" - uint8arrays "^2.0.5" - varint "^6.0.0" - -multihashes@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-4.0.3.tgz#426610539cd2551edbf533adeac4c06b3b90fb05" - integrity sha512-0AhMH7Iu95XjDLxIeuCOOE4t9+vQZsACyKZ9Fxw2pcsRmlX4iCn1mby0hS0bb+nQOVpdQYWPpnyusw4da5RPhA== - dependencies: - multibase "^4.0.1" - uint8arrays "^3.0.0" - varint "^5.0.2" - -multihashing-async@^2.0.0: - version "2.1.4" - resolved "https://registry.yarnpkg.com/multihashing-async/-/multihashing-async-2.1.4.tgz#26dce2ec7a40f0e7f9e732fc23ca5f564d693843" - integrity sha512-sB1MiQXPSBTNRVSJc2zM157PXgDtud2nMFUEIvBrsq5Wv96sUclMRK/ecjoP1T/W61UJBqt4tCTwMkUpt2Gbzg== - dependencies: - blakejs "^1.1.0" - err-code "^3.0.0" - js-sha3 "^0.8.0" - multihashes "^4.0.1" - murmurhash3js-revisited "^3.0.0" - uint8arrays "^3.0.0" - multimatch@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-5.0.0.tgz#932b800963cea7a31a033328fa1e0c3a1874dbe6" @@ -7994,11 +7517,6 @@ multimatch@^5.0.0: arrify "^2.0.1" minimatch "^3.0.4" -murmurhash3js-revisited@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz#6bd36e25de8f73394222adc6e41fa3fac08a5869" - integrity sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g== - mustache@4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.0.1.tgz#d99beb031701ad433338e7ea65e0489416c854a2" @@ -8018,11 +7536,6 @@ mz@^2.7.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nanoid@^3.1.12, nanoid@^3.1.3: - version "3.3.6" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" - integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== - nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -8040,30 +7553,6 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" -native-abort-controller@0.0.3, native-abort-controller@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/native-abort-controller/-/native-abort-controller-0.0.3.tgz#4c528a6c9c7d3eafefdc2c196ac9deb1a5edf2f8" - integrity sha512-YIxU5nWqSHG1Xbu3eOu3pdFRD882ivQpIcu6AiPVe2oSVoRbfYW63DVkZm3g1gHiMtZSvZzF6THSzTGEBYl8YA== - dependencies: - globalthis "^1.0.1" - -native-abort-controller@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/native-abort-controller/-/native-abort-controller-1.0.4.tgz#39920155cc0c18209ff93af5bc90be856143f251" - integrity sha512-zp8yev7nxczDJMoP6pDxyD20IU0T22eX8VwN2ztDccKvSZhRaV33yP1BGwKSZfXuqWUzsXopVFjBdau9OOAwMQ== - -native-fetch@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/native-fetch/-/native-fetch-2.0.1.tgz#319d53741a7040def92d5dc8ea5fe9416b1fad89" - integrity sha512-gv4Bea+ga9QdXINurpkEqun3ap3vnB+WYoe4c8ddqUYEH7B2h6iD39RF8uVN7OwmSfMY3RDxkvBnoI4e2/vLXQ== - dependencies: - globalthis "^1.0.1" - -native-fetch@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/native-fetch/-/native-fetch-3.0.0.tgz#06ccdd70e79e171c365c75117959cf4fe14a09bb" - integrity sha512-G3Z7vx0IFb/FQ4JxvtqGABsOTIqRWvgQz6e+erkB+JJD6LrszQtMozEHI4EkmgZQvnGHrpLVzUWk7t4sJCIkVw== - natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -8099,7 +7588,7 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.7: +node-fetch@^2.6.1, node-fetch@^2.6.7: version "2.6.11" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.11.tgz#cde7fc71deef3131ef80a738919f999e6edfff25" integrity sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w== @@ -8486,24 +7975,11 @@ p-defer@^1.0.0: resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" integrity sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw== -p-defer@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-3.0.0.tgz#d1dceb4ee9b2b604b1d94ffec83760175d4e6f83" - integrity sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw== - p-each-series@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.2.0.tgz#105ab0357ce72b202a8a8b94933672657b5e2a9a" integrity sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA== -p-fifo@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-fifo/-/p-fifo-1.0.0.tgz#e29d5cf17c239ba87f51dde98c1d26a9cfe20a63" - integrity sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A== - dependencies: - fast-fifo "^1.0.0" - p-defer "^3.0.0" - p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -8628,11 +8104,6 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-duration@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/parse-duration/-/parse-duration-0.4.4.tgz#11c0f51a689e97d06c57bd772f7fda7dc013243c" - integrity sha512-KbAJuYGUhZkB9gotDiKLnZ7Z3VTacK3fgwmDdB6ZVDtJbMBT6MfLga0WJaYpPDu0mzqT0NgHtHDt5PY4l0nidg== - parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" @@ -8894,11 +8365,6 @@ proto-list@~1.2.1: resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== -protocol-buffers-schema@^3.3.1: - version "3.6.0" - resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz#77bc75a48b2ff142c1ad5b5b90c94cd0fa2efd03" - integrity sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw== - protocols@^1.4.0: version "1.4.8" resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.8.tgz#48eea2d8f58d9644a4a32caae5d5db290a075ce8" @@ -8909,16 +8375,6 @@ protocols@^2.0.1: resolved "https://registry.yarnpkg.com/protocols/-/protocols-2.0.1.tgz#8f155da3fc0f32644e83c5782c8e8212ccf70a86" integrity sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q== -protons@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/protons/-/protons-2.0.3.tgz#94f45484d04b66dfedc43ad3abff1e8907994bb2" - integrity sha512-j6JikP/H7gNybNinZhAHMN07Vjr1i4lVupg598l4I9gSTjJqOvKnwjzYX2PzvBTSVf2eZ2nWv4vG+mtW8L6tpA== - dependencies: - protocol-buffers-schema "^3.3.1" - signed-varint "^2.0.1" - uint8arrays "^3.0.0" - varint "^5.0.0" - proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" @@ -9124,7 +8580,7 @@ read@1, read@~1.0.1: dependencies: mute-stream "~0.0.4" -readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.4.0, readable-stream@^3.6.0: +readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -9173,13 +8629,6 @@ readdirp@~3.5.0: dependencies: picomatch "^2.2.1" -receptacle@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/receptacle/-/receptacle-1.3.2.tgz#a7994c7efafc7a01d0e2041839dab6c4951360d2" - integrity sha512-HrsFvqZZheusncQRiEE7GatOAETrARKV/lnfYicIm8lbvp/JQOdADOfhjBd2DajvoszEyxSM6RlAAIZgEoeu/A== - dependencies: - ms "^2.1.1" - rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" @@ -9283,11 +8732,6 @@ requires-port@^1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== -reset@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/reset/-/reset-0.1.0.tgz#9fc7314171995ae6cb0b7e58b06ce7522af4bafb" - integrity sha512-RF7bp2P2ODreUPA71FZ4DSK52gNLJJ8dSwA1nhOCoC0mI4KZ4D/W6zhd2nfBqX/JlR+QZ/iUqAYPjq1UQU8l0Q== - resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -9332,11 +8776,6 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -retimer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/retimer/-/retimer-2.0.0.tgz#e8bd68c5e5a8ec2f49ccb5c636db84c04063bbca" - integrity sha512-KLXY85WkEq2V2bKex/LOO1ViXVn2KGYe4PYysAdYdjmraYIUsVkXu8O4am+8+5UbaaGl1qho4aqAAPHNQ4GSbg== - retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" @@ -9378,13 +8817,6 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -run@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/run/-/run-1.4.0.tgz#e17d9e9043ab2fe17776cb299e1237f38f0b4ffa" - integrity sha512-962oBW07IjQ9SizyMHdoteVbDKt/e2nEsnTRZ0WjK/zs+jfQQICqH0qj0D5lqZNuy0JkbzfA6IOqw0Sk7C3DlQ== - dependencies: - minimatch "*" - rxjs@^6.6.0: version "6.6.7" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" @@ -9572,13 +9004,6 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -signed-varint@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/signed-varint/-/signed-varint-2.0.1.tgz#50a9989da7c98c2c61dad119bc97470ef8528129" - integrity sha512-abgDPg1106vuZZOvw7cFwdCABddfJRz5akcCcchzTbhyhYnsG31y4AlZEgp315T7W3nQq5P4xeOm186ZiPVFzw== - dependencies: - varint "~5.0.0" - sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -9801,11 +9226,6 @@ ssri@^8.0.0, ssri@^8.0.1: dependencies: minipass "^3.1.1" -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== - stack-utils@^2.0.2: version "2.0.6" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" @@ -9821,13 +9241,6 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -stream-to-it@^0.2.0, stream-to-it@^0.2.2: - version "0.2.4" - resolved "https://registry.yarnpkg.com/stream-to-it/-/stream-to-it-0.2.4.tgz#d2fd7bfbd4a899b4c0d6a7e6a533723af5749bd0" - integrity sha512-4vEbkSs83OahpmBybNJXlJd7d6/RxzkkSdT3I0mnGt79Xd2Kk+e1JqbvAvsQfCeKj3aKb0QIWkyK3/n0j506vQ== - dependencies: - get-iterator "^1.0.2" - strict-uri-encode@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" @@ -10110,14 +9523,6 @@ through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== -timeout-abort-controller@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/timeout-abort-controller/-/timeout-abort-controller-1.1.1.tgz#2c3c3c66f13c783237987673c276cbd7a9762f29" - integrity sha512-BsF9i3NAJag6T0ZEjki9j654zoafI2X6ayuNd6Tp8+Ul6Tr5s4jo973qFeiWrRSweqvskC+AHDKUmIW4b7pdhQ== - dependencies: - abort-controller "^3.0.0" - retimer "^2.0.0" - timers-ext@^0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6" @@ -10393,28 +9798,6 @@ uid-number@0.0.6: resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" integrity sha512-c461FXIljswCuscZn67xq9PpszkPT6RjheWFQTgCyabJrTUozElanb0YEqv2UGgk247YpcJkFBuSGNvBlpXM9w== -uint8arrays@1.1.0, uint8arrays@^1.0.0, uint8arrays@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-1.1.0.tgz#d034aa65399a9fd213a1579e323f0b29f67d0ed2" - integrity sha512-cLdlZ6jnFczsKf5IH1gPHTtcHtPGho5r4CvctohmQjw8K7Q3gFdfIGHxSTdTaCKrL4w09SsPRJTqRS0drYeszA== - dependencies: - multibase "^3.0.0" - web-encoding "^1.0.2" - -uint8arrays@^2.0.5, uint8arrays@^2.1.3: - version "2.1.10" - resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-2.1.10.tgz#34d023c843a327c676e48576295ca373c56e286a" - integrity sha512-Q9/hhJa2836nQfEJSZTmr+pg9+cDJS9XEAp7N2Vg5MzL3bK/mkMVfjscRGYruP9jNda6MAdf4QD/y78gSzkp6A== - dependencies: - multiformats "^9.4.2" - -uint8arrays@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-3.1.1.tgz#2d8762acce159ccd9936057572dade9459f65ae0" - integrity sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg== - dependencies: - multiformats "^9.4.2" - umask@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" @@ -10542,17 +9925,6 @@ util-promisify@^2.1.0: dependencies: object.getownpropertydescriptors "^2.0.3" -util@^0.12.3: - version "0.12.5" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" - integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== - dependencies: - inherits "^2.0.3" - is-arguments "^1.0.4" - is-generator-function "^1.0.7" - is-typed-array "^1.1.3" - which-typed-array "^1.1.2" - uuid@^3.3.2: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" @@ -10597,16 +9969,11 @@ validate-npm-package-name@^3.0.0: dependencies: builtins "^1.0.3" -varint@^5.0.0, varint@^5.0.2, varint@~5.0.0: +varint@^5.0.0: version "5.0.2" resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== -varint@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/varint/-/varint-6.0.0.tgz#9881eb0ce8feaea6512439d19ddf84bf551661d0" - integrity sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg== - verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" @@ -10683,15 +10050,6 @@ wcwidth@^1.0.0: dependencies: defaults "^1.0.3" -web-encoding@^1.0.2, web-encoding@^1.0.6: - version "1.1.5" - resolved "https://registry.yarnpkg.com/web-encoding/-/web-encoding-1.1.5.tgz#fc810cf7667364a6335c939913f5051d3e0c4864" - integrity sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA== - dependencies: - util "^0.12.3" - optionalDependencies: - "@zxing/text-encoding" "0.9.0" - webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -10752,7 +10110,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.2, which-typed-array@^1.1.9: +which-typed-array@^1.1.9: version "1.1.9" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== From 207f802b25ad7664e9458aaf1b0b1a42db6ab5e6 Mon Sep 17 00:00:00 2001 From: krisbitney Date: Mon, 10 Jul 2023 15:06:04 -0500 Subject: [PATCH 066/181] removed typescript bindings and updated ipfs deployer module to use newest polywrap client --- .../lib/defaults/deploy-modules/ipfs/index.ts | 4 +- packages/schema/bind/src/bindings/index.ts | 3 +- .../bind/src/bindings/typescript/functions.ts | 141 ------------------ .../bind/src/bindings/typescript/index.ts | 2 - .../bind/src/bindings/typescript/types.ts | 74 --------- 5 files changed, 3 insertions(+), 221 deletions(-) delete mode 100644 packages/schema/bind/src/bindings/typescript/functions.ts delete mode 100644 packages/schema/bind/src/bindings/typescript/index.ts delete mode 100644 packages/schema/bind/src/bindings/typescript/types.ts diff --git a/packages/cli/src/lib/defaults/deploy-modules/ipfs/index.ts b/packages/cli/src/lib/defaults/deploy-modules/ipfs/index.ts index 85c697e8f6..41cfb7bd58 100644 --- a/packages/cli/src/lib/defaults/deploy-modules/ipfs/index.ts +++ b/packages/cli/src/lib/defaults/deploy-modules/ipfs/index.ts @@ -2,7 +2,7 @@ import { DeployModule } from "../../../deploy"; import { Uri } from "@polywrap/core-js"; import { PolywrapClient } from "@polywrap/client-js"; -import { DefaultBundle } from "@polywrap/client-config-builder-js"; +import { Web3 } from "@polywrap/client-config-builder-js"; import fs from "fs"; const isValidUri = (uri: Uri) => @@ -94,7 +94,7 @@ class IPFSDeployer implements DeployModule { const client = new PolywrapClient(); const result = await client.invoke({ - uri: DefaultBundle.embeds.ipfsHttpClient.uri.uri, + uri: Web3.bundle.ipfsHttpClient.uri, method: "addDir", args: (args as unknown) as Record, }); diff --git a/packages/schema/bind/src/bindings/index.ts b/packages/schema/bind/src/bindings/index.ts index 34b27eee75..1e86a697e9 100644 --- a/packages/schema/bind/src/bindings/index.ts +++ b/packages/schema/bind/src/bindings/index.ts @@ -1,10 +1,9 @@ import { GenerateBindingFn } from "./types"; import { BindLanguage } from "../"; import * as Rust from "./rust"; -import * as TypeScript from "./typescript"; import * as WrapBindgen from "./wrap-bindgen"; -export { Rust, TypeScript }; +export { Rust }; export * from "./types"; export * from "./utils"; diff --git a/packages/schema/bind/src/bindings/typescript/functions.ts b/packages/schema/bind/src/bindings/typescript/functions.ts deleted file mode 100644 index 1c47e7f24a..0000000000 --- a/packages/schema/bind/src/bindings/typescript/functions.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { MustacheFn } from "../types"; -import { isKeyword } from "./types"; - -// check if any of the keywords match the property name; -// if there's a match, insert `_` at the beginning of the property name. -export const detectKeyword: MustacheFn = () => { - return (value: string, render: (template: string) => string): string => { - const type = render(value); - if (isKeyword(type)) { - return "_" + type; - } - return type; - }; -}; - -const firstUpper = (str: string) => - str ? str[0].toUpperCase() + str.slice(1) : ""; - -const firstLower = (str: string) => - str ? str[0].toLowerCase() + str.slice(1) : ""; - -export const toLowerCase: MustacheFn = () => { - return (value: string, render: (template: string) => string) => { - const rendered = render(value); - return rendered.toLowerCase(); - }; -}; - -export const toClassName: MustacheFn = () => { - return (value: string, render: (template: string) => string) => { - const rendered = render(value); - rendered.replace(/([^A-Za-z0-9])+/g, ","); - return rendered - .split(",") - .map((x) => (x ? firstUpper(x.replace(",", "")) : "")) - .join(); - }; -}; - -export const toFuncName: MustacheFn = () => { - return (value: string, render: (template: string) => string) => { - let rendered = render(value); - rendered = rendered.replace(/([^A-Za-z0-9])+/g, ","); - return rendered - .split(",") - .map((x, index) => { - x = x.replace(",", ""); - return index === 0 ? firstLower(x) : firstUpper(x); - }) - .join(); - }; -}; - -export const toTypescript: MustacheFn = () => { - return _toTypescript; -}; - -const _toTypescript = ( - value: string, - render: (template: string) => string, - undefinable = false -) => { - let type = render(value); - - let optional = false; - if (type[type.length - 1] === "!") { - type = type.substring(0, type.length - 1); - } else { - optional = true; - } - - if (type[0] === "[") { - return toTypescriptArray(type, optional); - } - - if (type.startsWith("Map<")) { - return toTypescriptMap(type, optional); - } - - switch (type) { - case "JSON": - type = "Types.Json"; - break; - default: - if (type.includes("Enum_")) { - type = type.replace("Enum_", ""); - } - type = detectKeyword()(type, (str) => str); - type = `Types.${type}`; - } - - return undefinable - ? applyUndefinable(type, optional) - : applyOptional(type, optional); -}; - -const toTypescriptArray = (type: string, optional: boolean): string => { - const result = type.match(/(\[)([[\]A-Za-z0-9_.!]+)(\])/); - - if (!result || result.length !== 4) { - throw Error(`Invalid Array: ${type}`); - } - - const tsType = _toTypescript(result[2], (str) => str); - return applyOptional("Array<" + tsType + ">", optional); -}; - -const toTypescriptMap = (type: string, optional: boolean): string => { - const openAngleBracketIdx = type.indexOf("<"); - const closeAngleBracketIdx = type.lastIndexOf(">"); - - const keyValTypes = type.substring( - openAngleBracketIdx + 1, - closeAngleBracketIdx - ); - - const firstCommaIdx = keyValTypes.indexOf(","); - const keyType = keyValTypes.substring(0, firstCommaIdx).trim(); - const valType = keyValTypes.substring(firstCommaIdx + 1).trim(); - - const tsKeyType = _toTypescript(keyType, (str) => str); - const tsValType = _toTypescript(valType, (str) => str, true); - - return applyOptional(`Map<${tsKeyType}, ${tsValType}>`, optional); -}; - -const applyOptional = (type: string, optional: boolean): string => { - if (optional) { - return `${type} | null`; - } else { - return type; - } -}; - -const applyUndefinable = (type: string, undefinable: boolean): string => { - if (undefinable) { - return `${type} | undefined`; - } else { - return type; - } -}; diff --git a/packages/schema/bind/src/bindings/typescript/index.ts b/packages/schema/bind/src/bindings/typescript/index.ts deleted file mode 100644 index af50109879..0000000000 --- a/packages/schema/bind/src/bindings/typescript/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * as Functions from "./functions"; -export * as Types from "./types"; diff --git a/packages/schema/bind/src/bindings/typescript/types.ts b/packages/schema/bind/src/bindings/typescript/types.ts deleted file mode 100644 index 20f6bfbcee..0000000000 --- a/packages/schema/bind/src/bindings/typescript/types.ts +++ /dev/null @@ -1,74 +0,0 @@ -const baseTypes = { - boolean: "boolean", - number: "number", - string: "string", -}; - -export type BaseTypes = typeof baseTypes; - -export type BaseType = keyof BaseTypes; - -export function isBaseType(type: string): type is BaseType { - return type in baseTypes; -} - -// based on: -// - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#keywords -const keywords = { - break: "break", - case: "case", - catch: "catch", - class: "class", - const: "const", - continue: "continue", - debugger: "debugger", - default: "default", - delete: "delete", - do: "do", - else: "else", - export: "export", - extends: "extends", - false: "false", - finally: "finally", - for: "for", - function: "function", - if: "if", - import: "import", - in: "in", - instanceof: "instanceof", - new: "new", - null: "null", - return: "return", - super: "super", - switch: "switch", - this: "this", - throw: "throw", - true: "true", - try: "try", - typeof: "typeof", - var: "var", - void: "void", - while: "while", - with: "with", - yield: "yield", - let: "let", - await: "await", - enum: "enum", - implements: "implements", - interface: "interface", - package: "package", - private: "private", - protected: "protected", - public: "public", - static: "static", - arguments: "arguments", - eval: "eval", -}; - -export type Keywords = typeof keywords; - -export type Keyword = keyof Keywords; - -export function isKeyword(keyword: string): keyword is Keyword { - return keyword in keywords; -} From c26f50dd8af82d143f60493970fb905138fe5677 Mon Sep 17 00:00:00 2001 From: krisbitney Date: Mon, 10 Jul 2023 15:40:30 -0500 Subject: [PATCH 067/181] removed todo file and adjusted logged error in CLI --- packages/cli/src/__tests__/e2e/helpers/testCliOutput.ts | 4 +--- todo | 3 --- 2 files changed, 1 insertion(+), 6 deletions(-) delete mode 100644 todo diff --git a/packages/cli/src/__tests__/e2e/helpers/testCliOutput.ts b/packages/cli/src/__tests__/e2e/helpers/testCliOutput.ts index c6af8a2a94..2d11958f18 100644 --- a/packages/cli/src/__tests__/e2e/helpers/testCliOutput.ts +++ b/packages/cli/src/__tests__/e2e/helpers/testCliOutput.ts @@ -19,9 +19,7 @@ export const testCliOutput = ( ) ); - if (expected.exitCode && exitCode !== expected.exitCode) { - console.error(error) - } else if (exitCode !== 0) { + if (expected.exitCode !== expected.exitCode) { console.error(error) } diff --git a/todo b/todo deleted file mode 100644 index 30a5410588..0000000000 --- a/todo +++ /dev/null @@ -1,3 +0,0 @@ -- when codegen for wrap/assemblyscript, use wrap URI - - can add in schema-bind package -- add configuration option to override bindings with your own URI From 99a05edb26015959cf41a3747842fea7c70c90e8 Mon Sep 17 00:00:00 2001 From: krisbitney Date: Mon, 10 Jul 2023 15:45:10 -0500 Subject: [PATCH 068/181] updated wrap-abi-bindgen repo branch in github URIS for wrap bindings --- packages/schema/bind/src/bindings/index.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/schema/bind/src/bindings/index.ts b/packages/schema/bind/src/bindings/index.ts index 1e86a697e9..556b64079e 100644 --- a/packages/schema/bind/src/bindings/index.ts +++ b/packages/schema/bind/src/bindings/index.ts @@ -13,29 +13,29 @@ export function getGenerateBindingFn( switch (bindLanguage) { case "wrap-as": return WrapBindgen.getGenerateBindingFn( - "https://github.com/polywrap/wrap-abi-bindgen/tree/dev/implementations/wrap-assemblyscript" + "https://github.com/polywrap/wrap-abi-bindgen/tree/wrap-0.1/implementations/wrap-assemblyscript" ); case "wrap-rs": return Rust.Wasm.generateBinding; case "plugin-ts": return WrapBindgen.getGenerateBindingFn( - "https://github.com/polywrap/wrap-abi-bindgen/tree/dev/implementations/plugin-typescript" + "https://github.com/polywrap/wrap-abi-bindgen/tree/wrap-0.1/implementations/plugin-typescript" ); case "plugin-rs": return WrapBindgen.getGenerateBindingFn( - "https://github.com/polywrap/wrap-abi-bindgen/tree/dev/implementations/plugin-rust" + "https://github.com/polywrap/wrap-abi-bindgen/tree/wrap-0.1/implementations/plugin-rust" ); case "plugin-py": return WrapBindgen.getGenerateBindingFn( - "https://github.com/polywrap/wrap-abi-bindgen/tree/dev/implementations/plugin-python" + "https://github.com/polywrap/wrap-abi-bindgen/tree/wrap-0.1/implementations/plugin-python" ); case "plugin-kt": return WrapBindgen.getGenerateBindingFn( - "https://github.com/polywrap/wrap-abi-bindgen/tree/dev/implementations/plugin-kotlin" + "https://github.com/polywrap/wrap-abi-bindgen/tree/wrap-0.1/implementations/plugin-kotlin" ); case "app-ts": return WrapBindgen.getGenerateBindingFn( - "https://github.com/polywrap/wrap-abi-bindgen/tree/dev/implementations/app-typescript" + "https://github.com/polywrap/wrap-abi-bindgen/tree/wrap-0.1/implementations/app-typescript" ); default: throw Error(`Error: Language binding unsupported - ${bindLanguage}`); From 643aecc96e2f9fb6ce43949b13816fa02370211c Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Mon, 10 Jul 2023 21:06:03 -0400 Subject: [PATCH 069/181] chore: update vm-base-go image --- .../wasm/golang/vm/Dockerfile | 4 +-- .../build-strategies/wasm/golang/vm/VERSION | 2 +- .../wasm/golang/vm/wasm-memory.json | 25 ----------------- .../wasm/golang/vm/wasm-target.json | 27 +++++++++++++++++++ 4 files changed, 30 insertions(+), 28 deletions(-) delete mode 100644 packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-memory.json create mode 100644 packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-target.json diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile index 015f6ff9ce..1748c20951 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile @@ -2,9 +2,9 @@ FROM rust:1.60.0 as rust RUN cargo install -f wasm-snip -FROM tinygo/tinygo:0.24.0 +FROM tinygo/tinygo:0.27.0 # Copy wasm-snip COPY --from=rust /usr/local/cargo/bin/wasm-snip /usr/local/bin/ -COPY wasm-memory.json /usr/local/tinygo/targets/ +COPY wasm-target.json /usr/local/tinygo/targets/ WORKDIR /project diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION index 6da28dde76..8294c18436 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION @@ -1 +1 @@ -0.1.1 \ No newline at end of file +0.1.2 \ No newline at end of file diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-memory.json b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-memory.json deleted file mode 100644 index 0d97f75678..0000000000 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-memory.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "llvm-target": "wasm32-unknown-wasi", - "cpu": "generic", - "features": "+bulk-memory,+nontrapping-fptoint,+sign-ext", - "build-tags": ["tinygo.wasm"], - "goos": "js", - "goarch": "wasm", - "linker": "wasm-ld", - "libc": "wasi-libc", - "scheduler": "asyncify", - "default-stack-size": 16384, - "cflags": [ - "-mbulk-memory", - "-mnontrapping-fptoint", - "-msign-ext" - ], - "ldflags": [ - "--allow-undefined", - "--stack-first", - "--no-demangle", - "--import-memory" - ], - "emulator": "node {root}/targets/wasm_exec.js {}", - "wasm-abi": "js" -} diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-target.json b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-target.json new file mode 100644 index 0000000000..2e45a55999 --- /dev/null +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-target.json @@ -0,0 +1,27 @@ +{ + "llvm-target": "wasm32-unknown-wasi", + "cpu": "generic", + "features": "+bulk-memory,+nontrapping-fptoint,+sign-ext", + "build-tags": ["tinygo.wasm", "wasi"], + "goos": "linux", + "goarch": "arm", + "linker": "wasm-ld", + "libc": "wasi-libc", + "scheduler": "asyncify", + "default-stack-size": 24576, + "cflags": [ + "-mbulk-memory", + "-mnontrapping-fptoint", + "-msign-ext" + ], + "ldflags": [ + "--stack-first", + "--no-demangle", + "--import-memory" + ], + "extra-files": [ + "src/runtime/asm_tinygowasm.S" + ], + "emulator": "wasmtime --mapdir=/tmp::{tmpDir} {}", + "wasm-abi": "generic" +} From a00dea3c22101854df21b099db8ab4f980a1e657 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Mon, 10 Jul 2023 21:59:38 -0400 Subject: [PATCH 070/181] chore: fix bindings --- .../Env%type%Serialization-go.mustache | 2 +- .../Env%type%Serialization-go.mustache | 2 +- .../Object%type%Serialization-go.mustache | 2 +- .../%type%Serialization-go.mustache | 2 +- .../Object%type%Serialization-go.mustache | 2 +- .../env_test_import__env_serialization.go | 16 ++-- ...st_import__another_object_serialization.go | 2 +- ...bject_test_import__object_serialization.go | 16 ++-- .../module_wrapped/module_serialization.go | 4 +- .../object_another_type_serialization.go | 6 +- .../object_custom_map_value_serialization.go | 2 +- .../types/object_custom_type_serialization.go | 82 +++++++++---------- .../wasm-go/types/object_env_serialization.go | 6 +- .../wasm-go/types/objectelse_serialization.go | 2 +- 14 files changed, 73 insertions(+), 73 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache index a959eaf7f2..bb107d2031 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache @@ -60,7 +60,7 @@ func read{{#toUpper}}{{type}}{{/toUpper}}(reader msgpack.Read) *{{#toUpper}}{{ty reader.Context().Push(field, "unknown", "searching for property type") switch field { {{#properties}} - case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": + case "{{name}}": reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") {{#scalar}} {{> deserialize_scalar}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache index a715b7bd59..1157ba4df3 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache @@ -63,7 +63,7 @@ func read{{#toUpper}}{{type}}{{/toUpper}}(reader msgpack.Read) *{{#toUpper}}{{ty reader.Context().Push(field, "unknown", "searching for property type") switch field { {{#properties}} - case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": + case "{{name}}": reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") {{#scalar}} {{> deserialize_scalar}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache index 11f4aa2f0a..a3c8df5fbb 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache @@ -63,7 +63,7 @@ func read{{#toUpper}}{{type}}{{/toUpper}}(reader msgpack.Read) *{{#toUpper}}{{ty reader.Context().Push(field, "unknown", "searching for property type") switch field { {{#properties}} - case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": + case "{{name}}": reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") {{#scalar}} {{> deserialize_scalar}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache index d77db20f3f..552612599a 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache @@ -31,7 +31,7 @@ func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *MethodArgs reader.Context().Push(field, "unknown", "searching for property type") switch field { {{#arguments}} - case "{{#handleKeywords}}{{name}}{{/handleKeywords}}": + case "{{name}}": reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") {{#scalar}} {{> deserialize_scalar}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache index 249c10f617..0531e1f9a2 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache @@ -63,7 +63,7 @@ func read{{#toUpper}}{{type}}{{/toUpper}}(reader msgpack.Read) *{{#toUpper}}{{ty reader.Context().Push(field, "unknown", "searching for property type") switch field { {{#properties}} - case "{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}": + case "{{name}}": reader.Context().Push(field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property") {{#scalar}} {{> deserialize_scalar}} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go index 592d639a05..d4cbc7936e 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go @@ -137,20 +137,20 @@ func readTestImport_Env(reader msgpack.Read) *TestImport_Env { field := reader.ReadString() reader.Context().Push(field, "unknown", "searching for property type") switch field { - case "Object": + case "object": reader.Context().Push(field, "TestImport_AnotherObject", "type found, reading property") if v := TestImport_AnotherObjectRead(reader); v != nil { _object = *v } _objectSet = true reader.Context().Pop() - case "OptObject": + case "optObject": reader.Context().Push(field, "*TestImport_AnotherObject", "type found, reading property") if v := TestImport_AnotherObjectRead(reader); v != nil { _optObject = v } reader.Context().Pop() - case "ObjectArray": + case "objectArray": reader.Context().Push(field, "[]TestImport_AnotherObject", "type found, reading property") if reader.IsNil() { _objectArray = nil @@ -165,7 +165,7 @@ func readTestImport_Env(reader msgpack.Read) *TestImport_Env { } _objectArraySet = true reader.Context().Pop() - case "OptObjectArray": + case "optObjectArray": reader.Context().Push(field, "[]*TestImport_AnotherObject", "type found, reading property") if reader.IsNil() { _optObjectArray = nil @@ -179,13 +179,13 @@ func readTestImport_Env(reader msgpack.Read) *TestImport_Env { } } reader.Context().Pop() - case "En": + case "en": reader.Context().Push(field, "TestImport_Enum", "type found, reading property") _en = TestImport_Enum(reader.ReadI32()) SanitizeTestImport_EnumValue(int32(_en)) _enSet = true reader.Context().Pop() - case "OptEnum": + case "optEnum": reader.Context().Push(field, "*TestImport_Enum", "type found, reading property") if !reader.IsNil() { v := TestImport_Enum(reader.ReadI32()) @@ -193,7 +193,7 @@ func readTestImport_Env(reader msgpack.Read) *TestImport_Env { _optEnum = &v } reader.Context().Pop() - case "EnumArray": + case "enumArray": reader.Context().Push(field, "[]TestImport_Enum", "type found, reading property") if reader.IsNil() { _enumArray = nil @@ -207,7 +207,7 @@ func readTestImport_Env(reader msgpack.Read) *TestImport_Env { } _enumArraySet = true reader.Context().Pop() - case "OptEnumArray": + case "optEnumArray": reader.Context().Push(field, "[]*TestImport_Enum", "type found, reading property") if reader.IsNil() { _optEnumArray = nil diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object_serialization.go index 36168acfb1..3cfa4e63db 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object_serialization.go @@ -38,7 +38,7 @@ func readTestImport_AnotherObject(reader msgpack.Read) *TestImport_AnotherObject field := reader.ReadString() reader.Context().Push(field, "unknown", "searching for property type") switch field { - case "Prop": + case "prop": reader.Context().Push(field, "string", "type found, reading property") _prop = reader.ReadString() _propSet = true diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go index d3c17cc26d..f2c7c52ae6 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go @@ -137,20 +137,20 @@ func readTestImport_Object(reader msgpack.Read) *TestImport_Object { field := reader.ReadString() reader.Context().Push(field, "unknown", "searching for property type") switch field { - case "Object": + case "object": reader.Context().Push(field, "TestImport_AnotherObject", "type found, reading property") if v := TestImport_AnotherObjectRead(reader); v != nil { _object = *v } _objectSet = true reader.Context().Pop() - case "OptObject": + case "optObject": reader.Context().Push(field, "*TestImport_AnotherObject", "type found, reading property") if v := TestImport_AnotherObjectRead(reader); v != nil { _optObject = v } reader.Context().Pop() - case "ObjectArray": + case "objectArray": reader.Context().Push(field, "[]TestImport_AnotherObject", "type found, reading property") if reader.IsNil() { _objectArray = nil @@ -165,7 +165,7 @@ func readTestImport_Object(reader msgpack.Read) *TestImport_Object { } _objectArraySet = true reader.Context().Pop() - case "OptObjectArray": + case "optObjectArray": reader.Context().Push(field, "[]*TestImport_AnotherObject", "type found, reading property") if reader.IsNil() { _optObjectArray = nil @@ -179,13 +179,13 @@ func readTestImport_Object(reader msgpack.Read) *TestImport_Object { } } reader.Context().Pop() - case "En": + case "en": reader.Context().Push(field, "TestImport_Enum", "type found, reading property") _en = TestImport_Enum(reader.ReadI32()) SanitizeTestImport_EnumValue(int32(_en)) _enSet = true reader.Context().Pop() - case "OptEnum": + case "optEnum": reader.Context().Push(field, "*TestImport_Enum", "type found, reading property") if !reader.IsNil() { v := TestImport_Enum(reader.ReadI32()) @@ -193,7 +193,7 @@ func readTestImport_Object(reader msgpack.Read) *TestImport_Object { _optEnum = &v } reader.Context().Pop() - case "EnumArray": + case "enumArray": reader.Context().Push(field, "[]TestImport_Enum", "type found, reading property") if reader.IsNil() { _enumArray = nil @@ -207,7 +207,7 @@ func readTestImport_Object(reader msgpack.Read) *TestImport_Object { } _enumArraySet = true reader.Context().Pop() - case "OptEnumArray": + case "optEnumArray": reader.Context().Push(field, "[]*TestImport_Enum", "type found, reading property") if reader.IsNil() { _optEnumArray = nil diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_serialization.go index e3e502b889..19b7b664c0 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_serialization.go @@ -91,7 +91,7 @@ func DeserializeModuleMethodArgs(argsBuf []byte) *MethodArgsModuleMethod { } } reader.Context().Pop() - case "m_map": + case "map": reader.Context().Push(field, "map[string]int32", "type found, reading property") if reader.IsNil() { _map = nil @@ -451,7 +451,7 @@ func DeserializeIfArgs(argsBuf []byte) *MethodArgsIf { field := reader.ReadString() reader.Context().Push(field, "unknown", "searching for property type") switch field { - case "m_if": + case "if": reader.Context().Push(field, "Else", "type found, reading property") if v := ElseRead(reader); v != nil { _if = *v diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type_serialization.go index dc10397874..eb860e0ff7 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type_serialization.go @@ -61,20 +61,20 @@ func readAnotherType(reader msgpack.Read) *AnotherType { field := reader.ReadString() reader.Context().Push(field, "unknown", "searching for property type") switch field { - case "Prop": + case "prop": reader.Context().Push(field, "*string", "type found, reading property") if !reader.IsNil() { v := reader.ReadString() _prop = &v } reader.Context().Pop() - case "Circular": + case "circular": reader.Context().Push(field, "*CustomType", "type found, reading property") if v := CustomTypeRead(reader); v != nil { _circular = v } reader.Context().Pop() - case "M_const": + case "const": reader.Context().Push(field, "*string", "type found, reading property") if !reader.IsNil() { v := reader.ReadString() diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value_serialization.go index 11ca1da95e..babbd72f89 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value_serialization.go @@ -38,7 +38,7 @@ func readCustomMapValue(reader msgpack.Read) *CustomMapValue { field := reader.ReadString() reader.Context().Push(field, "unknown", "searching for property type") switch field { - case "Foo": + case "foo": reader.Context().Push(field, "string", "type found, reading property") _foo = reader.ReadString() _fooSet = true diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go index 2275a4e94c..7485b1d615 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go @@ -655,126 +655,126 @@ func readCustomType(reader msgpack.Read) *CustomType { field := reader.ReadString() reader.Context().Push(field, "unknown", "searching for property type") switch field { - case "Str": + case "str": reader.Context().Push(field, "string", "type found, reading property") _str = reader.ReadString() _strSet = true reader.Context().Pop() - case "OptStr": + case "optStr": reader.Context().Push(field, "*string", "type found, reading property") if !reader.IsNil() { v := reader.ReadString() _optStr = &v } reader.Context().Pop() - case "U": + case "u": reader.Context().Push(field, "uint32", "type found, reading property") _u = reader.ReadU32() _uSet = true reader.Context().Pop() - case "OptU": + case "optU": reader.Context().Push(field, "*uint32", "type found, reading property") if !reader.IsNil() { v := reader.ReadU32() _optU = &v } reader.Context().Pop() - case "M_u8": + case "u8": reader.Context().Push(field, "uint8", "type found, reading property") _u8 = reader.ReadU8() _u8Set = true reader.Context().Pop() - case "M_u16": + case "u16": reader.Context().Push(field, "uint16", "type found, reading property") _u16 = reader.ReadU16() _u16Set = true reader.Context().Pop() - case "M_u32": + case "u32": reader.Context().Push(field, "uint32", "type found, reading property") _u32 = reader.ReadU32() _u32Set = true reader.Context().Pop() - case "I": + case "i": reader.Context().Push(field, "int32", "type found, reading property") _i = reader.ReadI32() _iSet = true reader.Context().Pop() - case "M_i8": + case "i8": reader.Context().Push(field, "int8", "type found, reading property") _i8 = reader.ReadI8() _i8Set = true reader.Context().Pop() - case "M_i16": + case "i16": reader.Context().Push(field, "int16", "type found, reading property") _i16 = reader.ReadI16() _i16Set = true reader.Context().Pop() - case "M_i32": + case "i32": reader.Context().Push(field, "int32", "type found, reading property") _i32 = reader.ReadI32() _i32Set = true reader.Context().Pop() - case "Bigint": + case "bigint": reader.Context().Push(field, "*big.Int", "type found, reading property") _bigint = reader.ReadBigInt() _bigintSet = true reader.Context().Pop() - case "OptBigint": + case "optBigint": reader.Context().Push(field, "*big.Int", "type found, reading property") if !reader.IsNil() { v := reader.ReadBigInt() _optBigint = v } reader.Context().Pop() - case "Bignumber": + case "bignumber": reader.Context().Push(field, "*big.Int", "type found, reading property") _bignumber = reader.ReadBigInt() _bignumberSet = true reader.Context().Pop() - case "OptBignumber": + case "optBignumber": reader.Context().Push(field, "*big.Int", "type found, reading property") if !reader.IsNil() { v := reader.ReadBigInt() _optBignumber = v } reader.Context().Pop() - case "Json": + case "json": reader.Context().Push(field, "*fastjson.Value", "type found, reading property") _json = reader.ReadJson() _jsonSet = true reader.Context().Pop() - case "OptJson": + case "optJson": reader.Context().Push(field, "*fastjson.Value", "type found, reading property") if !reader.IsNil() { v := reader.ReadJson() _optJson = v } reader.Context().Pop() - case "Bytes": + case "bytes": reader.Context().Push(field, "[]byte", "type found, reading property") _bytes = reader.ReadBytes() _bytesSet = true reader.Context().Pop() - case "OptBytes": + case "optBytes": reader.Context().Push(field, "[]byte", "type found, reading property") if !reader.IsNil() { v := reader.ReadBytes() _optBytes = v } reader.Context().Pop() - case "M_boolean": + case "boolean": reader.Context().Push(field, "bool", "type found, reading property") _boolean = reader.ReadBool() _booleanSet = true reader.Context().Pop() - case "OptBoolean": + case "optBoolean": reader.Context().Push(field, "*bool", "type found, reading property") if !reader.IsNil() { v := reader.ReadBool() _optBoolean = &v } reader.Context().Pop() - case "U_array": + case "u_array": reader.Context().Push(field, "[]uint32", "type found, reading property") if reader.IsNil() { _u_array = nil @@ -787,7 +787,7 @@ func readCustomType(reader msgpack.Read) *CustomType { } _u_arraySet = true reader.Context().Pop() - case "UOpt_array": + case "uOpt_array": reader.Context().Push(field, "[]uint32", "type found, reading property") if reader.IsNil() { _uOpt_array = nil @@ -814,7 +814,7 @@ func readCustomType(reader msgpack.Read) *CustomType { } } reader.Context().Pop() - case "OptStrOptArray": + case "optStrOptArray": reader.Context().Push(field, "[]*string", "type found, reading property") if reader.IsNil() { _optStrOptArray = nil @@ -829,7 +829,7 @@ func readCustomType(reader msgpack.Read) *CustomType { } } reader.Context().Pop() - case "UArrayArray": + case "uArrayArray": reader.Context().Push(field, "[][]uint32", "type found, reading property") if reader.IsNil() { _uArrayArray = nil @@ -850,7 +850,7 @@ func readCustomType(reader msgpack.Read) *CustomType { } _uArrayArraySet = true reader.Context().Pop() - case "UOptArrayOptArray": + case "uOptArrayOptArray": reader.Context().Push(field, "[][]*uint32", "type found, reading property") if reader.IsNil() { _uOptArrayOptArray = nil @@ -874,7 +874,7 @@ func readCustomType(reader msgpack.Read) *CustomType { } _uOptArrayOptArraySet = true reader.Context().Pop() - case "UArrayOptArrayArray": + case "uArrayOptArrayArray": reader.Context().Push(field, "[][][]uint32", "type found, reading property") if reader.IsNil() { _uArrayOptArrayArray = nil @@ -903,7 +903,7 @@ func readCustomType(reader msgpack.Read) *CustomType { } _uArrayOptArrayArraySet = true reader.Context().Pop() - case "CrazyArray": + case "crazyArray": reader.Context().Push(field, "[][][][]uint32", "type found, reading property") if reader.IsNil() { _crazyArray = nil @@ -939,20 +939,20 @@ func readCustomType(reader msgpack.Read) *CustomType { } } reader.Context().Pop() - case "Object": + case "object": reader.Context().Push(field, "AnotherType", "type found, reading property") if v := AnotherTypeRead(reader); v != nil { _object = *v } _objectSet = true reader.Context().Pop() - case "OptObject": + case "optObject": reader.Context().Push(field, "*AnotherType", "type found, reading property") if v := AnotherTypeRead(reader); v != nil { _optObject = v } reader.Context().Pop() - case "ObjectArray": + case "objectArray": reader.Context().Push(field, "[]AnotherType", "type found, reading property") if reader.IsNil() { _objectArray = nil @@ -967,7 +967,7 @@ func readCustomType(reader msgpack.Read) *CustomType { } _objectArraySet = true reader.Context().Pop() - case "OptObjectArray": + case "optObjectArray": reader.Context().Push(field, "[]*AnotherType", "type found, reading property") if reader.IsNil() { _optObjectArray = nil @@ -981,13 +981,13 @@ func readCustomType(reader msgpack.Read) *CustomType { } } reader.Context().Pop() - case "En": + case "en": reader.Context().Push(field, "CustomEnum", "type found, reading property") _en = CustomEnum(reader.ReadI32()) SanitizeCustomEnumValue(int32(_en)) _enSet = true reader.Context().Pop() - case "OptEnum": + case "optEnum": reader.Context().Push(field, "*CustomEnum", "type found, reading property") if !reader.IsNil() { v := CustomEnum(reader.ReadI32()) @@ -995,7 +995,7 @@ func readCustomType(reader msgpack.Read) *CustomType { _optEnum = &v } reader.Context().Pop() - case "EnumArray": + case "enumArray": reader.Context().Push(field, "[]CustomEnum", "type found, reading property") if reader.IsNil() { _enumArray = nil @@ -1009,7 +1009,7 @@ func readCustomType(reader msgpack.Read) *CustomType { } _enumArraySet = true reader.Context().Pop() - case "OptEnumArray": + case "optEnumArray": reader.Context().Push(field, "[]*CustomEnum", "type found, reading property") if reader.IsNil() { _optEnumArray = nil @@ -1025,7 +1025,7 @@ func readCustomType(reader msgpack.Read) *CustomType { } } reader.Context().Pop() - case "M_map": + case "map": reader.Context().Push(field, "map[string]int32", "type found, reading property") if reader.IsNil() { _map = nil @@ -1039,7 +1039,7 @@ func readCustomType(reader msgpack.Read) *CustomType { } _mapSet = true reader.Context().Pop() - case "MapOfArr": + case "mapOfArr": reader.Context().Push(field, "map[string][]int32", "type found, reading property") if reader.IsNil() { _mapOfArr = nil @@ -1061,7 +1061,7 @@ func readCustomType(reader msgpack.Read) *CustomType { } _mapOfArrSet = true reader.Context().Pop() - case "MapOfObj": + case "mapOfObj": reader.Context().Push(field, "map[string]AnotherType", "type found, reading property") if reader.IsNil() { _mapOfObj = nil @@ -1077,7 +1077,7 @@ func readCustomType(reader msgpack.Read) *CustomType { } _mapOfObjSet = true reader.Context().Pop() - case "MapOfArrOfObj": + case "mapOfArrOfObj": reader.Context().Push(field, "map[string][]AnotherType", "type found, reading property") if reader.IsNil() { _mapOfArrOfObj = nil @@ -1101,7 +1101,7 @@ func readCustomType(reader msgpack.Read) *CustomType { } _mapOfArrOfObjSet = true reader.Context().Pop() - case "MapCustomValue": + case "mapCustomValue": reader.Context().Push(field, "map[string]*CustomMapValue", "type found, reading property") if reader.IsNil() { _mapCustomValue = nil diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env_serialization.go index bac49ecae9..abbdb35b71 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env_serialization.go @@ -71,19 +71,19 @@ func readEnv(reader msgpack.Read) *Env { field := reader.ReadString() reader.Context().Push(field, "unknown", "searching for property type") switch field { - case "Prop": + case "prop": reader.Context().Push(field, "string", "type found, reading property") _prop = reader.ReadString() _propSet = true reader.Context().Pop() - case "OptProp": + case "optProp": reader.Context().Push(field, "*string", "type found, reading property") if !reader.IsNil() { v := reader.ReadString() _optProp = &v } reader.Context().Pop() - case "OptMap": + case "optMap": reader.Context().Push(field, "map[string]*int32", "type found, reading property") if reader.IsNil() { _optMap = nil diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse_serialization.go index 925f93a1ea..0d5add817f 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse_serialization.go @@ -38,7 +38,7 @@ func readElse(reader msgpack.Read) *Else { field := reader.ReadString() reader.Context().Push(field, "unknown", "searching for property type") switch field { - case "M_else": + case "else": reader.Context().Push(field, "string", "type found, reading property") _else = reader.ReadString() _elseSet = true From 592e6f6439b4f9a541c3d3e9efdd208a2d9b4ac6 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Mon, 10 Jul 2023 22:11:39 -0400 Subject: [PATCH 071/181] chore: update golang build --- .../wasm/golang/image/Dockerfile.mustache | 4 +-- .../wasm/golang/local/local.sh | 4 +-- .../wasm/golang/local/wasm-memory.json | 25 ----------------- .../wasm/golang/local/wasm-target.json | 27 +++++++++++++++++++ .../wasm/golang/vm/Dockerfile | 4 +-- .../wasm/golang/vm/vm-script.mustache | 4 +-- .../wasm/golang/vm/wasm-memory.json | 25 ----------------- .../wasm/golang/vm/wasm-target.json | 27 +++++++++++++++++++ 8 files changed, 62 insertions(+), 58 deletions(-) delete mode 100644 packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/wasm-memory.json create mode 100644 packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/wasm-target.json delete mode 100644 packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-memory.json create mode 100644 packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-target.json diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache index 84b096a922..4385711874 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache @@ -6,10 +6,10 @@ COPY . . RUN go mod tidy -RUN tinygo build -o main.wasm -target wasm-memory ./module/wrap/main/main.go +RUN tinygo build -o main.wasm -target wasm-target ./module/wrap/main/main.go # Make the build directory RUN rm -rf ./build RUN mkdir ./build -RUN wasm-snip -o ./build/wrap.wasm main.wasm -p syscall runtime.ticks fd_write tinygo +RUN wasm-snip ./main.wasm -o ./build/wrap.wasm -p fd_write clock_time_get args_sizes_get args_get diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh index 9d6cf95724..00b41f6bad 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh @@ -1,7 +1,7 @@ go mod tidy -tinygo build -o ./build/main.wasm -target ./.polywrap/wasm/build/strategy-used/wasm-memory.json ./module/wrap/main/main.go +tinygo build -o ./build/main.wasm -target ./.polywrap/wasm/build/strategy-used/wasm-target.json ./module/wrap/main/main.go -wasm-snip -o ./build/wrap.wasm ./build/main.wasm -p syscall runtime.ticks fd_write tinygo +wasm-snip -o ./build/wrap.wasm ./build/main.wasm -p fd_write clock_time_get args_sizes_get args_get rm ./build/main.wasm diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/wasm-memory.json b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/wasm-memory.json deleted file mode 100644 index 3ba36c6805..0000000000 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/wasm-memory.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "llvm-target": "wasm32-unknown-wasi", - "cpu": "generic", - "features": "+bulk-memory,+nontrapping-fptoint,+sign-ext", - "build-tags": ["tinygo.wasm"], - "goos": "js", - "goarch": "wasm", - "linker": "wasm-ld", - "libc": "wasi-libc", - "scheduler": "asyncify", - "default-stack-size": 16384, - "cflags": [ - "-mbulk-memory", - "-mnontrapping-fptoint", - "-msign-ext" - ], - "ldflags": [ - "--allow-undefined", - "--stack-first", - "--no-demangle", - "--import-memory" - ], - "emulator": "node {root}/targets/wasm_exec.js {}", - "wasm-abi": "js" -} diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/wasm-target.json b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/wasm-target.json new file mode 100644 index 0000000000..2e45a55999 --- /dev/null +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/wasm-target.json @@ -0,0 +1,27 @@ +{ + "llvm-target": "wasm32-unknown-wasi", + "cpu": "generic", + "features": "+bulk-memory,+nontrapping-fptoint,+sign-ext", + "build-tags": ["tinygo.wasm", "wasi"], + "goos": "linux", + "goarch": "arm", + "linker": "wasm-ld", + "libc": "wasi-libc", + "scheduler": "asyncify", + "default-stack-size": 24576, + "cflags": [ + "-mbulk-memory", + "-mnontrapping-fptoint", + "-msign-ext" + ], + "ldflags": [ + "--stack-first", + "--no-demangle", + "--import-memory" + ], + "extra-files": [ + "src/runtime/asm_tinygowasm.S" + ], + "emulator": "wasmtime --mapdir=/tmp::{tmpDir} {}", + "wasm-abi": "generic" +} diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile index 015f6ff9ce..1748c20951 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile @@ -2,9 +2,9 @@ FROM rust:1.60.0 as rust RUN cargo install -f wasm-snip -FROM tinygo/tinygo:0.24.0 +FROM tinygo/tinygo:0.27.0 # Copy wasm-snip COPY --from=rust /usr/local/cargo/bin/wasm-snip /usr/local/bin/ -COPY wasm-memory.json /usr/local/tinygo/targets/ +COPY wasm-target.json /usr/local/tinygo/targets/ WORKDIR /project diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache index cbda5ef9eb..390359e144 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache @@ -2,10 +2,10 @@ set -e go mod tidy -tinygo build -o main.wasm -target wasm-memory ./module/wrap/main/main.go +tinygo build -o main.wasm -target wasm-target ./module/wrap/main/main.go # Make the build directory rm -rf ./build mkdir ./build -wasm-snip -o ./build/wrap.wasm main.wasm -p syscall runtime.ticks fd_write tinygo +wasm-snip ./main.wasm -o ./build/wrap.wasm -p fd_write clock_time_get args_sizes_get args_get \ No newline at end of file diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-memory.json b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-memory.json deleted file mode 100644 index 3ba36c6805..0000000000 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-memory.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "llvm-target": "wasm32-unknown-wasi", - "cpu": "generic", - "features": "+bulk-memory,+nontrapping-fptoint,+sign-ext", - "build-tags": ["tinygo.wasm"], - "goos": "js", - "goarch": "wasm", - "linker": "wasm-ld", - "libc": "wasi-libc", - "scheduler": "asyncify", - "default-stack-size": 16384, - "cflags": [ - "-mbulk-memory", - "-mnontrapping-fptoint", - "-msign-ext" - ], - "ldflags": [ - "--allow-undefined", - "--stack-first", - "--no-demangle", - "--import-memory" - ], - "emulator": "node {root}/targets/wasm_exec.js {}", - "wasm-abi": "js" -} diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-target.json b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-target.json new file mode 100644 index 0000000000..2e45a55999 --- /dev/null +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/wasm-target.json @@ -0,0 +1,27 @@ +{ + "llvm-target": "wasm32-unknown-wasi", + "cpu": "generic", + "features": "+bulk-memory,+nontrapping-fptoint,+sign-ext", + "build-tags": ["tinygo.wasm", "wasi"], + "goos": "linux", + "goarch": "arm", + "linker": "wasm-ld", + "libc": "wasi-libc", + "scheduler": "asyncify", + "default-stack-size": 24576, + "cflags": [ + "-mbulk-memory", + "-mnontrapping-fptoint", + "-msign-ext" + ], + "ldflags": [ + "--stack-first", + "--no-demangle", + "--import-memory" + ], + "extra-files": [ + "src/runtime/asm_tinygowasm.S" + ], + "emulator": "wasmtime --mapdir=/tmp::{tmpDir} {}", + "wasm-abi": "generic" +} From a13853bf57b613aa4214bad0ceffd3fc12776bdc Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Tue, 11 Jul 2023 15:18:36 +0800 Subject: [PATCH 072/181] feat: add missing docgen --- .../cli/docgen/001-sanity/docs/module.md | 14 + .../docgen/002-custom-config/docs/module.md | 21 + .../003-custom-manifest-file/docs/module.md | 14 + .../docgen/004-app/docs/Ethereum_module.md | 256 ++++++++++ .../docgen/004-app/docs/Ethereum_objects.md | 149 ++++++ .../cli/docgen/004-app/docs/Logger_enums.md | 18 + .../cli/docgen/004-app/docs/Logger_module.md | 15 + .../cases/cli/docgen/005-wasm/docs/module.md | 14 + .../cases/cli/docgen/005-wasm/docs/objects.md | 17 + .../cases/cli/docgen/006-plugin/docs/env.md | 15 + .../cli/docgen/006-plugin/docs/module.md | 23 + .../cli/docgen/006-plugin/docs/objects.md | 17 + .../cli/docgen/007-docusaurus/docs/enums.md | 16 + .../cli/docgen/007-docusaurus/docs/module.md | 15 + .../cli/docgen/007-docusaurus/docs/objects.md | 39 ++ .../cases/cli/docgen/008-jsdoc/docs/enums.js | 10 + .../cases/cli/docgen/008-jsdoc/docs/module.js | 14 + .../cli/docgen/008-jsdoc/docs/objects.js | 32 ++ .../009-schema/docs/generated-schema.graphql | 436 ++++++++++++++++++ 19 files changed, 1135 insertions(+) create mode 100644 packages/test-cases/cases/cli/docgen/001-sanity/docs/module.md create mode 100644 packages/test-cases/cases/cli/docgen/002-custom-config/docs/module.md create mode 100644 packages/test-cases/cases/cli/docgen/003-custom-manifest-file/docs/module.md create mode 100644 packages/test-cases/cases/cli/docgen/004-app/docs/Ethereum_module.md create mode 100644 packages/test-cases/cases/cli/docgen/004-app/docs/Ethereum_objects.md create mode 100644 packages/test-cases/cases/cli/docgen/004-app/docs/Logger_enums.md create mode 100644 packages/test-cases/cases/cli/docgen/004-app/docs/Logger_module.md create mode 100644 packages/test-cases/cases/cli/docgen/005-wasm/docs/module.md create mode 100644 packages/test-cases/cases/cli/docgen/005-wasm/docs/objects.md create mode 100644 packages/test-cases/cases/cli/docgen/006-plugin/docs/env.md create mode 100644 packages/test-cases/cases/cli/docgen/006-plugin/docs/module.md create mode 100644 packages/test-cases/cases/cli/docgen/006-plugin/docs/objects.md create mode 100644 packages/test-cases/cases/cli/docgen/007-docusaurus/docs/enums.md create mode 100644 packages/test-cases/cases/cli/docgen/007-docusaurus/docs/module.md create mode 100644 packages/test-cases/cases/cli/docgen/007-docusaurus/docs/objects.md create mode 100644 packages/test-cases/cases/cli/docgen/008-jsdoc/docs/enums.js create mode 100644 packages/test-cases/cases/cli/docgen/008-jsdoc/docs/module.js create mode 100644 packages/test-cases/cases/cli/docgen/008-jsdoc/docs/objects.js create mode 100644 packages/test-cases/cases/cli/docgen/009-schema/docs/generated-schema.graphql diff --git a/packages/test-cases/cases/cli/docgen/001-sanity/docs/module.md b/packages/test-cases/cases/cli/docgen/001-sanity/docs/module.md new file mode 100644 index 0000000000..a2abb12a0a --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/001-sanity/docs/module.md @@ -0,0 +1,14 @@ +--- +id: module +title: Module +sidebar_position: 1 +--- + +### method + +```graphql +method( + arg: String! +): String! +``` + diff --git a/packages/test-cases/cases/cli/docgen/002-custom-config/docs/module.md b/packages/test-cases/cases/cli/docgen/002-custom-config/docs/module.md new file mode 100644 index 0000000000..46bf7e0d15 --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/002-custom-config/docs/module.md @@ -0,0 +1,21 @@ +--- +id: module +title: Module +sidebar_position: 1 +--- + +### deployContract + +```graphql +deployContract( +): String! +``` + +### method + +```graphql +method( + arg: String! +): String! +``` + diff --git a/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/docs/module.md b/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/docs/module.md new file mode 100644 index 0000000000..a2abb12a0a --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/docs/module.md @@ -0,0 +1,14 @@ +--- +id: module +title: Module +sidebar_position: 1 +--- + +### method + +```graphql +method( + arg: String! +): String! +``` + diff --git a/packages/test-cases/cases/cli/docgen/004-app/docs/Ethereum_module.md b/packages/test-cases/cases/cli/docgen/004-app/docs/Ethereum_module.md new file mode 100644 index 0000000000..30ec3c9c04 --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/004-app/docs/Ethereum_module.md @@ -0,0 +1,256 @@ +--- +id: Ethereum_module +title: Ethereum Module +sidebar_position: 1 +--- + +### awaitTransaction + +```graphql +awaitTransaction( + txHash: String! + connection: Ethereum_Connection +): Ethereum_TxReceipt! +``` + +### callContractMethod + +```graphql +callContractMethod( + address: String! + method: String! + args: String[] + options: Ethereum_TxOptions + connection: Ethereum_Connection +): Ethereum_TxResponse! +``` + +### callContractMethodAndWait + +```graphql +callContractMethodAndWait( + address: String! + method: String! + args: String[] + options: Ethereum_TxOptions + connection: Ethereum_Connection +): Ethereum_TxReceipt! +``` + +### callContractStatic + +```graphql +callContractStatic( + address: String! + method: String! + args: String[] + options: Ethereum_TxOptions + connection: Ethereum_Connection +): Ethereum_StaticTxResult! +``` + +### callContractView + +```graphql +callContractView( + address: String! + method: String! + args: String[] + connection: Ethereum_Connection +): String! +``` + +### checkAddress + +```graphql +checkAddress( + address: String! + connection: Ethereum_Connection +): Boolean! +``` + +### decodeFunction + +```graphql +decodeFunction( + method: String! + data: String! + connection: Ethereum_Connection +): String[]! +``` + +### deployContract + +```graphql +deployContract( + abi: String! + bytecode: String! + args: String[] + options: Ethereum_TxOptions + connection: Ethereum_Connection +): String! +``` + +### encodeFunction + +```graphql +encodeFunction( + method: String! + args: String[] + connection: Ethereum_Connection +): String! +``` + +### encodeParams + +```graphql +encodeParams( + types: String[]! + values: String[]! + connection: Ethereum_Connection +): String! +``` + +### estimateContractCallGas + +```graphql +estimateContractCallGas( + address: String! + method: String! + args: String[] + options: Ethereum_TxOptions + connection: Ethereum_Connection +): BigInt! +``` + +### estimateEip1559Fees + +```graphql +estimateEip1559Fees( + connection: Ethereum_Connection +): Ethereum_Eip1559FeesEstimate! +``` + +### estimateTransactionGas + +```graphql +estimateTransactionGas( + tx: Ethereum_TxRequest! + connection: Ethereum_Connection +): BigInt! +``` + +### getBalance + +```graphql +getBalance( + address: String! + blockTag: BigInt + connection: Ethereum_Connection +): BigInt! +``` + +### getChainId + +```graphql +getChainId( + connection: Ethereum_Connection +): String! +``` + +### getGasPrice + +```graphql +getGasPrice( + connection: Ethereum_Connection +): BigInt! +``` + +### getSignerAddress + +```graphql +getSignerAddress( + connection: Ethereum_Connection +): String! +``` + +### getSignerBalance + +```graphql +getSignerBalance( + blockTag: BigInt + connection: Ethereum_Connection +): BigInt! +``` + +### getSignerTransactionCount + +```graphql +getSignerTransactionCount( + blockTag: BigInt + connection: Ethereum_Connection +): BigInt! +``` + +### sendRpc + +```graphql +sendRpc( + method: String! + params: String[]! + connection: Ethereum_Connection +): String! +``` + +### sendTransaction + +```graphql +sendTransaction( + tx: Ethereum_TxRequest! + connection: Ethereum_Connection +): Ethereum_TxResponse! +``` + +### sendTransactionAndWait + +```graphql +sendTransactionAndWait( + tx: Ethereum_TxRequest! + connection: Ethereum_Connection +): Ethereum_TxReceipt! +``` + +### signMessage + +```graphql +signMessage( + message: String! + connection: Ethereum_Connection +): String! +``` + +### signMessageBytes + +```graphql +signMessageBytes( + bytes: Bytes! + connection: Ethereum_Connection +): String! +``` + +### toEth + +```graphql +toEth( + wei: String! +): String! +``` + +### toWei + +```graphql +toWei( + eth: String! +): String! +``` + diff --git a/packages/test-cases/cases/cli/docgen/004-app/docs/Ethereum_objects.md b/packages/test-cases/cases/cli/docgen/004-app/docs/Ethereum_objects.md new file mode 100644 index 0000000000..0bee987edc --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/004-app/docs/Ethereum_objects.md @@ -0,0 +1,149 @@ +--- +id: Ethereum_objects +title: Ethereum Object Types +sidebar_position: 2 +--- + + +### Ethereum_AccessItem + +```graphql +type Ethereum_AccessItem { + address: String! + storageKeys: String[]! +} +``` + +### Ethereum_Connection + +```graphql +type Ethereum_Connection { + node: String + networkNameOrChainId: String +} +``` + +### Ethereum_Eip1559FeesEstimate + +```graphql +type Ethereum_Eip1559FeesEstimate { + maxFeePerGas: BigInt! + maxPriorityFeePerGas: BigInt! +} +``` + +### Ethereum_Log + +```graphql +type Ethereum_Log { + blockNumber: BigInt! + blockHash: String! + transactionIndex: UInt32! + removed: Boolean! + address: String! + data: String! + topics: String[]! + transactionHash: String! + logIndex: UInt32! +} +``` + +### Ethereum_StaticTxResult + +```graphql +type Ethereum_StaticTxResult { + result: String! + error: Boolean! +} +``` + +### Ethereum_TxOptions + +```graphql +type Ethereum_TxOptions { + gasLimit: BigInt # Gas supplied for the transaction + maxFeePerGas: BigInt # The max total fee to pay per unit of gas. +The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is ā€œrefundedā€ to the user. +This property is ignored when gasPrice is not null. + maxPriorityFeePerGas: BigInt # The gas price paid is baseFeePerGas + maxPriorityFeePerGas. +The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is ā€œrefundedā€ to the user. +This property is ignored when gasPrice is not null. + gasPrice: BigInt # The gas price for legacy transactions. +If this property is not null, a legacy transaction will be sent and maxFeePerGas and maxPriorityFeePerGas will be ignored. + value: BigInt # Ether value sent with transaction + nonce: UInt32 # Override default nonce +} +``` + +### Ethereum_TxReceipt + +```graphql +type Ethereum_TxReceipt { + to: String! + from: String! + contractAddress: String! + transactionIndex: UInt32! + root: String + gasUsed: BigInt! + logsBloom: String! + transactionHash: String! + logs: Ethereum_Log[]! + blockNumber: BigInt! + blockHash: String! + confirmations: UInt32! + cumulativeGasUsed: BigInt! + effectiveGasPrice: BigInt! + type: UInt32! + status: UInt32 +} +``` + +### Ethereum_TxRequest + +```graphql +type Ethereum_TxRequest { + to: String + from: String + data: String + type: UInt32 + chainId: BigInt + accessList: Ethereum_AccessItem[] + gasLimit: BigInt # Gas supplied for the transaction + maxFeePerGas: BigInt # The max total fee to pay per unit of gas. +The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is ā€œrefundedā€ to the user. +This property is ignored when gasPrice is not null. + maxPriorityFeePerGas: BigInt # The gas price paid is baseFeePerGas + maxPriorityFeePerGas. +The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is ā€œrefundedā€ to the user. +This property is ignored when gasPrice is not null. + gasPrice: BigInt # The gas price for legacy transactions. +If this property is not null, a legacy transaction will be sent and maxFeePerGas and maxPriorityFeePerGas will be ignored. + value: BigInt # Ether value sent with transaction + nonce: UInt32 # Override default nonce +} +``` + +### Ethereum_TxResponse + +```graphql +type Ethereum_TxResponse { + hash: String! + to: String + from: String! + nonce: UInt32! + gasLimit: BigInt! + maxFeePerGas: BigInt + maxPriorityFeePerGas: BigInt + gasPrice: BigInt + value: BigInt! + chainId: BigInt! + blockNumber: BigInt + blockHash: String + timestamp: UInt32 + r: String + s: String + v: UInt32 + type: UInt32 + accessList: Ethereum_AccessItem[] +} +``` + diff --git a/packages/test-cases/cases/cli/docgen/004-app/docs/Logger_enums.md b/packages/test-cases/cases/cli/docgen/004-app/docs/Logger_enums.md new file mode 100644 index 0000000000..c4cac40698 --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/004-app/docs/Logger_enums.md @@ -0,0 +1,18 @@ +--- +id: Logger_enums +title: Logger Enum Types +sidebar_position: 3 +--- + + +### Logger_Logger_LogLevel + +```graphql +enum Logger_Logger_LogLevel { + DEBUG + INFO + WARN + ERROR +} +``` + diff --git a/packages/test-cases/cases/cli/docgen/004-app/docs/Logger_module.md b/packages/test-cases/cases/cli/docgen/004-app/docs/Logger_module.md new file mode 100644 index 0000000000..c483edc248 --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/004-app/docs/Logger_module.md @@ -0,0 +1,15 @@ +--- +id: Logger_module +title: Logger Module +sidebar_position: 1 +--- + +### log + +```graphql +log( + level: Logger_Logger_LogLevel! + message: String! +): Boolean! +``` + diff --git a/packages/test-cases/cases/cli/docgen/005-wasm/docs/module.md b/packages/test-cases/cases/cli/docgen/005-wasm/docs/module.md new file mode 100644 index 0000000000..a2abb12a0a --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/005-wasm/docs/module.md @@ -0,0 +1,14 @@ +--- +id: module +title: Module +sidebar_position: 1 +--- + +### method + +```graphql +method( + arg: String! +): String! +``` + diff --git a/packages/test-cases/cases/cli/docgen/005-wasm/docs/objects.md b/packages/test-cases/cases/cli/docgen/005-wasm/docs/objects.md new file mode 100644 index 0000000000..656ab28e09 --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/005-wasm/docs/objects.md @@ -0,0 +1,17 @@ +--- +id: objects +title: Object Types +sidebar_position: 2 +--- + + +### Object + +```graphql +type Object { + uint: UInt! + bools: Boolean[]! + bites: Bytes +} +``` + diff --git a/packages/test-cases/cases/cli/docgen/006-plugin/docs/env.md b/packages/test-cases/cases/cli/docgen/006-plugin/docs/env.md new file mode 100644 index 0000000000..277239ca0a --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/006-plugin/docs/env.md @@ -0,0 +1,15 @@ +--- +id: env +title: Env Type +sidebar_position: 4 +--- + + +### Env + +```graphql +type Env { + arg1: String! +} +``` + diff --git a/packages/test-cases/cases/cli/docgen/006-plugin/docs/module.md b/packages/test-cases/cases/cli/docgen/006-plugin/docs/module.md new file mode 100644 index 0000000000..678ec7c901 --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/006-plugin/docs/module.md @@ -0,0 +1,23 @@ +--- +id: module +title: Module +sidebar_position: 1 +--- + +### methodOne + +```graphql +methodOne( + str: String! + optStr: String +): Object! +``` + +### methodTwo + +```graphql +methodTwo( + arg: UInt32! +): String! +``` + diff --git a/packages/test-cases/cases/cli/docgen/006-plugin/docs/objects.md b/packages/test-cases/cases/cli/docgen/006-plugin/docs/objects.md new file mode 100644 index 0000000000..794ce00c0a --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/006-plugin/docs/objects.md @@ -0,0 +1,17 @@ +--- +id: objects +title: Object Types +sidebar_position: 2 +--- + + +### Object + +```graphql +type Object { + u: UInt! + array: Boolean[]! + bytes: Bytes +} +``` + diff --git a/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/enums.md b/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/enums.md new file mode 100644 index 0000000000..f5467760a0 --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/enums.md @@ -0,0 +1,16 @@ +--- +id: enums +title: Enum Types +sidebar_position: 3 +--- + + +### test + +```graphql +enum test { + ARG1 + ARG2 +} +``` + diff --git a/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/module.md b/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/module.md new file mode 100644 index 0000000000..d194ca9215 --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/module.md @@ -0,0 +1,15 @@ +--- +id: module +title: Module +sidebar_position: 1 +--- + +### method + +```graphql +method( + str: String! + optStr: String +): Object! +``` + diff --git a/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/objects.md b/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/objects.md new file mode 100644 index 0000000000..96a0bbdbc9 --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/objects.md @@ -0,0 +1,39 @@ +--- +id: objects +title: Object Types +sidebar_position: 2 +--- + + +### Object + +```graphql +type Object { + u: UInt! + array: Boolean[]! + bytes: Bytes +} +``` + +### Object2 + +_Test Comment_ + +```graphql +type Object2 { + u: UInt! # Test Comment + array: Boolean[]! # Test Comment + bytes: Bytes # Test Comment +} +``` + +### Object3 + +```graphql +type Object3 { + u: UInt! + array: Boolean[]! + bytes: Bytes +} +``` + diff --git a/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/enums.js b/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/enums.js new file mode 100644 index 0000000000..81d229be22 --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/enums.js @@ -0,0 +1,10 @@ +/** +* Enum Types +* @module enums +*/ + +/** +* +* @typedef { } module:enums.test +*/ + diff --git a/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/module.js b/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/module.js new file mode 100644 index 0000000000..1cea6bda95 --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/module.js @@ -0,0 +1,14 @@ +/** +* Module +* @module module +* +*/ + +/** +* +* @function module:method.method +* @param { String } str +* @param { String | null } optStr +* @returns { Object } +*/ + diff --git a/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/objects.js b/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/objects.js new file mode 100644 index 0000000000..5ebf119cd0 --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/objects.js @@ -0,0 +1,32 @@ +/** +* Object Types +* @module objects +*/ + +/** +* +* @typedef {Object} module:objects.Object +* +* @property { UInt } u +* @property { Boolean[] } array +* @property { Bytes } bytes +*/ + +/** +* Test Comment +* @typedef {Object} module:objects.Object2 +* +* @property { UInt } u Test Comment +* @property { Boolean[] } array Test Comment +* @property { Bytes } bytes Test Comment +*/ + +/** +* +* @typedef {Object} module:objects.Object3 +* +* @property { UInt } u +* @property { Boolean[] } array +* @property { Bytes } bytes +*/ + diff --git a/packages/test-cases/cases/cli/docgen/009-schema/docs/generated-schema.graphql b/packages/test-cases/cases/cli/docgen/009-schema/docs/generated-schema.graphql new file mode 100644 index 0000000000..398f33cac6 --- /dev/null +++ b/packages/test-cases/cases/cli/docgen/009-schema/docs/generated-schema.graphql @@ -0,0 +1,436 @@ +### Polywrap Header START ### +scalar UInt +scalar UInt8 +scalar UInt16 +scalar UInt32 +scalar Int +scalar Int8 +scalar Int16 +scalar Int32 +scalar Bytes +scalar BigInt +scalar BigNumber +scalar JSON +scalar Map + +directive @imported( + uri: String! + namespace: String! + nativeType: String! +) on OBJECT | ENUM + +directive @imports( + types: [String!]! +) on OBJECT + +directive @capability( + type: String! + uri: String! + namespace: String! +) repeatable on OBJECT + +directive @enabled_interface on OBJECT + +directive @annotate(type: String!) on FIELD + +directive @env(required: Boolean!) on FIELD_DEFINITION + +### Polywrap Header END ### + +type Module @imports( + types: [ + "Ethereum_Module", + "Ethereum_Connection", + "Ethereum_TxOptions", + "Ethereum_StaticTxResult", + "Ethereum_Eip1559FeesEstimate", + "Ethereum_TxRequest", + "Ethereum_AccessItem", + "Ethereum_TxReceipt", + "Ethereum_Log", + "Ethereum_TxResponse" + ] +) { + method( + str: String! + optStr: String + ): Object! +} + +type Object { + u: UInt! + array: [Boolean!]! + bytes: Bytes +} + +""" +Test Comment +""" +type Object2 { + """ + Test Comment + """ + u: UInt! + """ + Test Comment + """ + array: [Boolean!]! + """ + Test Comment + """ + bytes: Bytes +} + +type Object3 { + u: UInt! + array: [Boolean!]! + bytes: Bytes +} + +enum test { + ARG1 + ARG2 +} + +### Imported Modules START ### + +type Ethereum_Module @imported( + uri: "ens/wraps.eth:ethereum@1.0.0", + namespace: "Ethereum", + nativeType: "Module" +) { + getChainId( + connection: Ethereum_Connection + ): String! + + callContractView( + address: String! + method: String! + args: [String!] + connection: Ethereum_Connection + ): String! + + callContractStatic( + address: String! + method: String! + args: [String!] + options: Ethereum_TxOptions + connection: Ethereum_Connection + ): Ethereum_StaticTxResult! + + encodeParams( + types: [String!]! + values: [String!]! + connection: Ethereum_Connection + ): String! + + encodeFunction( + method: String! + args: [String!] + connection: Ethereum_Connection + ): String! + + decodeFunction( + method: String! + data: String! + connection: Ethereum_Connection + ): [String!]! + + getSignerAddress( + connection: Ethereum_Connection + ): String! + + getSignerBalance( + blockTag: BigInt + connection: Ethereum_Connection + ): BigInt! + + getBalance( + address: String! + blockTag: BigInt + connection: Ethereum_Connection + ): BigInt! + + getGasPrice( + connection: Ethereum_Connection + ): BigInt! + + estimateEip1559Fees( + connection: Ethereum_Connection + ): Ethereum_Eip1559FeesEstimate! + + sendRpc( + method: String! + params: [String!]! + connection: Ethereum_Connection + ): String! + + getSignerTransactionCount( + blockTag: BigInt + connection: Ethereum_Connection + ): BigInt! + + checkAddress( + address: String! + connection: Ethereum_Connection + ): Boolean! + + toWei( + eth: String! + ): String! + + toEth( + wei: String! + ): String! + + estimateTransactionGas( + tx: Ethereum_TxRequest! + connection: Ethereum_Connection + ): BigInt! + + awaitTransaction( + txHash: String! + connection: Ethereum_Connection + ): Ethereum_TxReceipt! + + sendTransaction( + tx: Ethereum_TxRequest! + connection: Ethereum_Connection + ): Ethereum_TxResponse! + + sendTransactionAndWait( + tx: Ethereum_TxRequest! + connection: Ethereum_Connection + ): Ethereum_TxReceipt! + + deployContract( + abi: String! + bytecode: String! + args: [String!] + options: Ethereum_TxOptions + connection: Ethereum_Connection + ): String! + + estimateContractCallGas( + address: String! + method: String! + args: [String!] + options: Ethereum_TxOptions + connection: Ethereum_Connection + ): BigInt! + + callContractMethod( + address: String! + method: String! + args: [String!] + options: Ethereum_TxOptions + connection: Ethereum_Connection + ): Ethereum_TxResponse! + + callContractMethodAndWait( + address: String! + method: String! + args: [String!] + options: Ethereum_TxOptions + connection: Ethereum_Connection + ): Ethereum_TxReceipt! + + signMessage( + message: String! + connection: Ethereum_Connection + ): String! + + signMessageBytes( + bytes: Bytes! + connection: Ethereum_Connection + ): String! +} + +### Imported Modules END ### + +### Imported Objects START ### + +type Ethereum_Connection @imported( + uri: "ens/wraps.eth:ethereum@1.0.0", + namespace: "Ethereum", + nativeType: "Connection" +) { + node: String + networkNameOrChainId: String +} + +type Ethereum_TxOptions @imported( + uri: "ens/wraps.eth:ethereum@1.0.0", + namespace: "Ethereum", + nativeType: "TxOptions" +) { + """ + Gas supplied for the transaction + """ + gasLimit: BigInt + """ + The max total fee to pay per unit of gas. +The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is ā€œrefundedā€ to the user. +This property is ignored when gasPrice is not null. + """ + maxFeePerGas: BigInt + """ + The gas price paid is baseFeePerGas + maxPriorityFeePerGas. +The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is ā€œrefundedā€ to the user. +This property is ignored when gasPrice is not null. + """ + maxPriorityFeePerGas: BigInt + """ + The gas price for legacy transactions. +If this property is not null, a legacy transaction will be sent and maxFeePerGas and maxPriorityFeePerGas will be ignored. + """ + gasPrice: BigInt + """ + Ether value sent with transaction + """ + value: BigInt + """ + Override default nonce + """ + nonce: UInt32 +} + +type Ethereum_StaticTxResult @imported( + uri: "ens/wraps.eth:ethereum@1.0.0", + namespace: "Ethereum", + nativeType: "StaticTxResult" +) { + result: String! + error: Boolean! +} + +type Ethereum_Eip1559FeesEstimate @imported( + uri: "ens/wraps.eth:ethereum@1.0.0", + namespace: "Ethereum", + nativeType: "Eip1559FeesEstimate" +) { + maxFeePerGas: BigInt! + maxPriorityFeePerGas: BigInt! +} + +type Ethereum_TxRequest @imported( + uri: "ens/wraps.eth:ethereum@1.0.0", + namespace: "Ethereum", + nativeType: "TxRequest" +) { + to: String + from: String + data: String + type: UInt32 + chainId: BigInt + accessList: [Ethereum_AccessItem!] + """ + Gas supplied for the transaction + """ + gasLimit: BigInt + """ + The max total fee to pay per unit of gas. +The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is ā€œrefundedā€ to the user. +This property is ignored when gasPrice is not null. + """ + maxFeePerGas: BigInt + """ + The gas price paid is baseFeePerGas + maxPriorityFeePerGas. +The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is ā€œrefundedā€ to the user. +This property is ignored when gasPrice is not null. + """ + maxPriorityFeePerGas: BigInt + """ + The gas price for legacy transactions. +If this property is not null, a legacy transaction will be sent and maxFeePerGas and maxPriorityFeePerGas will be ignored. + """ + gasPrice: BigInt + """ + Ether value sent with transaction + """ + value: BigInt + """ + Override default nonce + """ + nonce: UInt32 +} + +type Ethereum_AccessItem @imported( + uri: "ens/wraps.eth:ethereum@1.0.0", + namespace: "Ethereum", + nativeType: "AccessItem" +) { + address: String! + storageKeys: [String!]! +} + +type Ethereum_TxReceipt @imported( + uri: "ens/wraps.eth:ethereum@1.0.0", + namespace: "Ethereum", + nativeType: "TxReceipt" +) { + to: String! + from: String! + contractAddress: String! + transactionIndex: UInt32! + root: String + gasUsed: BigInt! + logsBloom: String! + transactionHash: String! + logs: [Ethereum_Log!]! + blockNumber: BigInt! + blockHash: String! + confirmations: UInt32! + cumulativeGasUsed: BigInt! + effectiveGasPrice: BigInt! + type: UInt32! + status: UInt32 +} + +type Ethereum_Log @imported( + uri: "ens/wraps.eth:ethereum@1.0.0", + namespace: "Ethereum", + nativeType: "Log" +) { + blockNumber: BigInt! + blockHash: String! + transactionIndex: UInt32! + removed: Boolean! + address: String! + data: String! + topics: [String!]! + transactionHash: String! + logIndex: UInt32! +} + +type Ethereum_TxResponse @imported( + uri: "ens/wraps.eth:ethereum@1.0.0", + namespace: "Ethereum", + nativeType: "TxResponse" +) { + hash: String! + to: String + from: String! + nonce: UInt32! + gasLimit: BigInt! + maxFeePerGas: BigInt + maxPriorityFeePerGas: BigInt + gasPrice: BigInt + value: BigInt! + chainId: BigInt! + blockNumber: BigInt + blockHash: String + timestamp: UInt32 + r: String + s: String + v: UInt32 + type: UInt32 + accessList: [Ethereum_AccessItem!] +} + +### Imported Objects END ### + +### Imported Envs START ### + +### Imported Envs END ### + From 319771370685d8caa74b074ba160fae3c6e7ddff Mon Sep 17 00:00:00 2001 From: krisbitney Date: Wed, 12 Jul 2023 08:06:53 -0500 Subject: [PATCH 073/181] added extra return in wrap-assemblyscript bind test case --- .../cases/bind/sanity/output/wrap-as/Module/module.ts | 2 +- .../cases/bind/sanity/output/wrap-as/TestImport/index.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-as/Module/module.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/Module/module.ts index 6f307a2e1a..71295ecdb2 100644 --- a/packages/test-cases/cases/bind/sanity/output/wrap-as/Module/module.ts +++ b/packages/test-cases/cases/bind/sanity/output/wrap-as/Module/module.ts @@ -25,4 +25,4 @@ export abstract class ModuleBase { abstract _if( args: Types.Args__if ): Types._else; -} \ No newline at end of file +} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-as/TestImport/index.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/TestImport/index.ts index 8ab00e6d1c..64521e8cd6 100644 --- a/packages/test-cases/cases/bind/sanity/output/wrap-as/TestImport/index.ts +++ b/packages/test-cases/cases/bind/sanity/output/wrap-as/TestImport/index.ts @@ -8,4 +8,4 @@ export class TestImport { public static getImplementations(): string[] { return wrap_getImplementations(this.uri); } -} \ No newline at end of file +} From 10d5eb2444eebe77023336434e9d5f993904c29d Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Wed, 12 Jul 2023 17:31:05 +0200 Subject: [PATCH 074/181] chore: use tinygo fork --- .../lib/defaults/build-strategies/wasm/golang/vm/Dockerfile | 5 ++++- .../src/lib/defaults/build-strategies/wasm/golang/vm/VERSION | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile index 1748c20951..cda08a9bba 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile @@ -2,9 +2,12 @@ FROM rust:1.60.0 as rust RUN cargo install -f wasm-snip -FROM tinygo/tinygo:0.27.0 +FROM polywrap/tinygo:latest # Copy wasm-snip COPY --from=rust /usr/local/cargo/bin/wasm-snip /usr/local/bin/ + +# Copy wasm-target.json COPY wasm-target.json /usr/local/tinygo/targets/ + WORKDIR /project diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION index 8294c18436..7693c96bff 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION @@ -1 +1 @@ -0.1.2 \ No newline at end of file +0.1.3 \ No newline at end of file From cf12a98a09709ffdedfbceb31027af3ded9384aa Mon Sep 17 00:00:00 2001 From: krisbitney Date: Wed, 12 Jul 2023 11:07:35 -0500 Subject: [PATCH 075/181] updated ethereum wrap and ens wrap URIs --- .../ens-recursive-name-register/index.ts | 12 +++++++++--- .../cli/src/lib/defaults/deploy-modules/ens/index.ts | 12 +++++++++--- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/index.ts b/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/index.ts index 55107399fe..f1dc176bf2 100644 --- a/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/index.ts +++ b/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/index.ts @@ -63,6 +63,8 @@ class ENSRecursiveNameRegisterPublisher implements DeployModule { defaultNetwork: network, }); + const ensUri = "wrap://redirect/ens"; + const clientConfig = new PolywrapClientConfigBuilder() .addDefaults() .setPackage( @@ -71,13 +73,17 @@ class ENSRecursiveNameRegisterPublisher implements DeployModule { connections: connections, }) as IWrapPackage ) + .setRedirect( + ensUri, + "wrap://ipfs/QmQS8cr21euKYW7hWAhiSYXgvdcAtbPbynKqRW2CzAJPYe" + ) .build(); const client = new PolywrapClient(clientConfig); const signerAddress = await client.invoke({ method: "getSignerAddress", - uri: "ens/wraps.eth:ethereum@2.0.0", + uri: "ens/ethers.wraps.eth:0.1.0", args: { connection: { networkNameOrChainId: network, @@ -93,7 +99,7 @@ class ENSRecursiveNameRegisterPublisher implements DeployModule { { tx: { hash: string }; didRegister: boolean }[] >({ method: "registerDomainAndSubdomainsRecursively", - uri: "ens/wraps.eth:ens@1.1.0", + uri: ensUri, args: { domain: ensDomain, owner: signerAddress.value, @@ -120,7 +126,7 @@ class ENSRecursiveNameRegisterPublisher implements DeployModule { client, { method: "awaitTransaction", - uri: Uri.from("ens/wraps.eth:ethereum@2.0.0"), + uri: Uri.from("ens/ethers.wraps.eth:0.1.0"), args: { txHash: registerData.value[0].tx.hash, connection: { diff --git a/packages/cli/src/lib/defaults/deploy-modules/ens/index.ts b/packages/cli/src/lib/defaults/deploy-modules/ens/index.ts index d7831aef04..506a858fd5 100644 --- a/packages/cli/src/lib/defaults/deploy-modules/ens/index.ts +++ b/packages/cli/src/lib/defaults/deploy-modules/ens/index.ts @@ -60,6 +60,8 @@ class ENSPublisher implements DeployModule { defaultNetwork: network, }); + const ensUri = "wrap://redirect/ens"; + const clientConfig = new PolywrapClientConfigBuilder() .addDefaults() .setPackage( @@ -68,13 +70,17 @@ class ENSPublisher implements DeployModule { connections: connections, }) as IWrapPackage ) + .setRedirect( + ensUri, + "wrap://ipfs/QmQS8cr21euKYW7hWAhiSYXgvdcAtbPbynKqRW2CzAJPYe" + ) .build(); const client = new PolywrapClient(clientConfig); const resolver = await client.invoke({ method: "getResolver", - uri: "ens/wraps.eth:ens@1.1.0", + uri: ensUri, args: { registryAddress: config.ensRegistryAddress, domain: config.domainName, @@ -98,7 +104,7 @@ class ENSPublisher implements DeployModule { const setContenthashData = await client.invoke<{ hash: string }>({ method: "setContentHash", - uri: "ens/wraps.eth:ens@1.1.0", + uri: ensUri, args: { domain: config.domainName, cid: hash, @@ -119,7 +125,7 @@ class ENSPublisher implements DeployModule { client, { method: "awaitTransaction", - uri: Uri.from("ens/wraps.eth:ethereum@2.0.0"), + uri: Uri.from("ens/ethers.wraps.eth:0.1.0"), args: { txHash: setContenthashData.value.hash, connection: { From 1258378dd7f4321a1260235b70aea77d4143217a Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Thu, 13 Jul 2023 00:09:49 +0800 Subject: [PATCH 076/181] feat: add property deps transformer TODO: use this in bindings --- .../src/bindings/golang/transforms/index.ts | 1 + .../golang/transforms/propertyDeps.ts | 207 ++++++++++++++++++ .../bind/src/bindings/golang/wasm/index.ts | 2 + 3 files changed, 210 insertions(+) create mode 100644 packages/schema/bind/src/bindings/golang/transforms/index.ts create mode 100644 packages/schema/bind/src/bindings/golang/transforms/propertyDeps.ts diff --git a/packages/schema/bind/src/bindings/golang/transforms/index.ts b/packages/schema/bind/src/bindings/golang/transforms/index.ts new file mode 100644 index 0000000000..45b46dccaa --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/transforms/index.ts @@ -0,0 +1 @@ +export * from "./propertyDeps"; diff --git a/packages/schema/bind/src/bindings/golang/transforms/propertyDeps.ts b/packages/schema/bind/src/bindings/golang/transforms/propertyDeps.ts new file mode 100644 index 0000000000..5a6a5d20ba --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/transforms/propertyDeps.ts @@ -0,0 +1,207 @@ +/* eslint-disable @typescript-eslint/naming-convention */ +/* eslint-disable no-useless-escape */ +import { isBaseType, isBuiltInType } from "../types"; + +import { + ImportedModuleDefinition, + ObjectDefinition, + AnyDefinition, + ModuleDefinition, + EnvDefinition, + Abi, + ImportedEnvDefinition, +} from "@polywrap/wrap-manifest-types-js"; +import { AbiTransforms } from "@polywrap/schema-parse"; + +interface PropertyDep { + crate: string; + type: string; + isEnum: boolean; +} + +interface PropertyDepsState { + abiEnvDefinition?: EnvDefinition; + envDefinition?: EnvDefinition; + importedEnvDefinition?: ImportedEnvDefinition; + objectDefinition?: ObjectDefinition; + moduleDefinition?: ModuleDefinition; + importedModuleDefinition?: ImportedModuleDefinition; + propertyDeps?: PropertyDep[]; +} + +export function propertyDeps(): AbiTransforms { + const state: PropertyDepsState = {}; + + return { + enter: { + Abi: (abi: Abi) => { + if (abi.envType) { + state.abiEnvDefinition = abi.envType; + } + return abi; + }, + EnvDefinition: (def: EnvDefinition) => { + state.envDefinition = def; + state.propertyDeps = []; + return def; + }, + ImportedEnvDefinition: (def: ImportedEnvDefinition) => { + state.envDefinition = def; + state.propertyDeps = []; + return def; + }, + ObjectDefinition: (def: ObjectDefinition) => { + state.objectDefinition = def; + state.propertyDeps = []; + return def; + }, + ModuleDefinition: (def: ModuleDefinition) => { + state.moduleDefinition = def; + state.propertyDeps = []; + if (state.abiEnvDefinition) { + state.propertyDeps.push({ + crate: "crate", + type: "Env", + isEnum: false, + }); + } + return def; + }, + ImportedModuleDefinition: (def: ImportedModuleDefinition) => { + state.importedModuleDefinition = def; + state.propertyDeps = []; + return def; + }, + AnyDefinition: (def: AnyDefinition) => { + const appendPropertyDep = ( + rootType: string, + array: PropertyDep[] + ): PropertyDep[] => { + let typeName = def.type; + + if (typeName.indexOf("[") === 0) { + typeName = typeName.replace(/\[|\]|\!|\?/g, ""); + } + + const appendUnique = (item: PropertyDep) => { + if ( + array.findIndex( + (i) => i.crate === item.crate && i.type === item.type + ) === -1 + ) { + array.push(item); + } + }; + + const isKnownType = (name: string) => + isBaseType(name) || isBuiltInType(name) || name === rootType; + + // if type is map and the value is custom, + // we need to add it into property dependency + if (typeName.startsWith("Map<")) { + const valueName = def.map?.object?.type ?? def.map?.enum?.type; + if (valueName && !isKnownType(valueName)) { + appendUnique({ + crate: "crate", + type: valueName, + isEnum: valueName === def.map?.enum?.type, + }); + + return array; + } + + return array; + } + + if (isKnownType(typeName)) { + return array; + } + + appendUnique({ + crate: "crate", + type: typeName, + isEnum: !!def.enum || !!def.array?.enum, + }); + + return array; + }; + + if (state.envDefinition && state.propertyDeps) { + state.propertyDeps = appendPropertyDep( + state.envDefinition.type, + state.propertyDeps + ); + } else if (state.importedEnvDefinition && state.propertyDeps) { + state.propertyDeps = appendPropertyDep( + state.importedEnvDefinition.type, + state.propertyDeps + ); + } else if (state.objectDefinition && state.propertyDeps) { + state.propertyDeps = appendPropertyDep( + state.objectDefinition.type, + state.propertyDeps + ); + } else if (state.moduleDefinition && state.propertyDeps) { + state.propertyDeps = appendPropertyDep( + state.moduleDefinition.type, + state.propertyDeps + ); + } else if (state.importedModuleDefinition && state.propertyDeps) { + state.propertyDeps = appendPropertyDep( + state.importedModuleDefinition.type, + state.propertyDeps + ); + } + + return def; + }, + }, + leave: { + EnvDefinition: (def: EnvDefinition) => { + const propertyDeps = state.propertyDeps; + state.propertyDeps = undefined; + state.envDefinition = undefined; + return { + ...def, + propertyDeps, + }; + }, + ImportedEnvDefinition: (def: ImportedEnvDefinition) => { + const propertyDeps = state.propertyDeps; + state.propertyDeps = undefined; + state.importedEnvDefinition = undefined; + return { + ...def, + propertyDeps, + }; + }, + ObjectDefinition: (def: ObjectDefinition) => { + const propertyDeps = state.propertyDeps; + state.propertyDeps = undefined; + state.objectDefinition = undefined; + return { + ...def, + propertyDeps, + }; + }, + ModuleDefinition: (def: ModuleDefinition) => { + const propertyDeps = state.propertyDeps; + state.propertyDeps = undefined; + state.moduleDefinition = undefined; + return { + ...def, + propertyDeps, + }; + }, + ImportedModuleDefinition: (def: ImportedModuleDefinition) => { + const propertyDeps = state.propertyDeps; + state.propertyDeps = undefined; + state.importedModuleDefinition = undefined; + return { + ...def, + propertyDeps, + }; + }, + }, + }; +} diff --git a/packages/schema/bind/src/bindings/golang/wasm/index.ts b/packages/schema/bind/src/bindings/golang/wasm/index.ts index 4533a4f3c7..bbc85a03e3 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm/index.ts @@ -4,6 +4,7 @@ import { renderTemplates } from "../.."; import { loadSubTemplates } from "../../utils"; import { BindOptions, BindOutput } from "../../.."; import { reservedWordsAS } from "../reservedWords"; +import * as Transforms from "../transforms"; import { Abi, @@ -268,6 +269,7 @@ function applyTransforms(abi: Abi): Abi { extendType(Functions), addFirstLast, toPrefixedGraphQLType, + Transforms.propertyDeps(), ]; for (const transform of transforms) { From 4506ed48e0f0b566935342a2935381e2a9ce5378 Mon Sep 17 00:00:00 2001 From: krisbitney Date: Wed, 12 Jul 2023 11:50:02 -0500 Subject: [PATCH 077/181] added default client config to ipfs deploy module --- .../lib/defaults/deploy-modules/ipfs/index.ts | 7 +- packages/test-cases/yarn.lock | 338 ------------------ yarn.lock | 230 ++++++------ 3 files changed, 107 insertions(+), 468 deletions(-) delete mode 100644 packages/test-cases/yarn.lock diff --git a/packages/cli/src/lib/defaults/deploy-modules/ipfs/index.ts b/packages/cli/src/lib/defaults/deploy-modules/ipfs/index.ts index 41cfb7bd58..eac1915e39 100644 --- a/packages/cli/src/lib/defaults/deploy-modules/ipfs/index.ts +++ b/packages/cli/src/lib/defaults/deploy-modules/ipfs/index.ts @@ -2,7 +2,7 @@ import { DeployModule } from "../../../deploy"; import { Uri } from "@polywrap/core-js"; import { PolywrapClient } from "@polywrap/client-js"; -import { Web3 } from "@polywrap/client-config-builder-js"; +import { PolywrapClientConfigBuilder, Web3 } from "@polywrap/client-config-builder-js"; import fs from "fs"; const isValidUri = (uri: Uri) => @@ -91,7 +91,10 @@ class IPFSDeployer implements DeployModule { timeout: 10000, }; - const client = new PolywrapClient(); + const clientConfig = new PolywrapClientConfigBuilder() + .addDefaults() + .build(); + const client: PolywrapClient = new PolywrapClient(clientConfig); const result = await client.invoke({ uri: Web3.bundle.ipfsHttpClient.uri, diff --git a/packages/test-cases/yarn.lock b/packages/test-cases/yarn.lock deleted file mode 100644 index 3a95d739de..0000000000 --- a/packages/test-cases/yarn.lock +++ /dev/null @@ -1,338 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@jridgewell/resolve-uri@^3.0.3": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@polywrap/os-js@0.10.5": - version "0.10.5" - resolved "https://registry.yarnpkg.com/@polywrap/os-js/-/os-js-0.10.5.tgz#b9ecae978f69edc341aedec1867161d1e609eb3a" - integrity sha512-Xh7KqCQy2aEoHDGQE5eV2ykCDjhCRzUVryiF+P/HbfxG//bW6Wte4e97H4tcuD8RkApYVaGjmUTAlvX+g+26AQ== - -"@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" - integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== - -"@types/adm-zip@0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@types/adm-zip/-/adm-zip-0.5.0.tgz#94c90a837ce02e256c7c665a6a1eb295906333c1" - integrity sha512-FCJBJq9ODsQZUNURo5ILAQueuA8WJhRvuihS3ke2iI25mJlfV2LK8jG2Qj2z2AWg8U0FtWWqBHVRetceLskSaw== - dependencies: - "@types/node" "*" - -"@types/glob@*": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-8.1.0.tgz#b63e70155391b0584dce44e7ea25190bbc38f2fc" - integrity sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w== - dependencies: - "@types/minimatch" "^5.1.2" - "@types/node" "*" - -"@types/minimatch@^5.1.2": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" - integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== - -"@types/node@*": - version "20.3.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.2.tgz#fa6a90f2600e052a03c18b8cb3fd83dd4e599898" - integrity sha512-vOBLVQeCQfIcF/2Y7eKFTqrMnizK5lRNQ7ykML/5RuwVXVWxYkgwS7xbt4B6fKCUPgbSL5FSsjHQpaGQP/dQmw== - -"@types/shelljs@0.8.9": - version "0.8.9" - resolved "https://registry.yarnpkg.com/@types/shelljs/-/shelljs-0.8.9.tgz#45dd8501aa9882976ca3610517dac3831c2fbbf4" - integrity sha512-flVe1dvlrCyQJN/SGrnBxqHG+RzXrVKsmjD8WS/qYHpq5UPjfq7UWFBENP0ZuOl0g6OpAlL6iBoLSvKYUUmyQw== - dependencies: - "@types/glob" "*" - "@types/node" "*" - -acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^8.4.1: - version "8.9.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.9.0.tgz#78a16e3b2bcc198c10822786fa6679e245db5b59" - integrity sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ== - -adm-zip@0.5.10: - version "0.5.10" - resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.5.10.tgz#4a51d5ab544b1f5ce51e1b9043139b639afff45b" - integrity sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ== - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -axios@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.2.2.tgz#72681724c6e6a43a9fea860fc558127dbe32f9f1" - integrity sha512-bz/J4gS2S3I7mpN/YZfGFTqhXTYzRho8Ay38w2otuuDR322KzFIWm/4W2K6gIwvWaws5n+mnb7D1lN9uD+QH6Q== - dependencies: - follow-redirects "^1.15.0" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -follow-redirects@^1.15.0: - version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== - -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -glob@^7.0.0: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - -is-core-module@^2.11.0: - version "2.12.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" - integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== - dependencies: - has "^1.0.3" - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== - dependencies: - resolve "^1.1.6" - -resolve@^1.1.6: - version "1.22.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== - dependencies: - is-core-module "^2.11.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -shelljs@0.8.5: - version "0.8.5" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" - integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -ts-node@10.9.1: - version "10.9.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== diff --git a/yarn.lock b/yarn.lock index e59c70b133..c164264001 100644 --- a/yarn.lock +++ b/yarn.lock @@ -113,52 +113,52 @@ dependencies: "@babel/highlight" "^7.22.5" -"@babel/compat-data@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.5.tgz#b1f6c86a02d85d2dd3368a2b67c09add8cd0c255" - integrity sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA== +"@babel/compat-data@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.6.tgz#15606a20341de59ba02cd2fcc5086fcbe73bf544" + integrity sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg== "@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.5.tgz#d67d9747ecf26ee7ecd3ebae1ee22225fe902a89" - integrity sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg== + version "7.22.8" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.8.tgz#386470abe884302db9c82e8e5e87be9e46c86785" + integrity sha512-75+KxFB4CZqYRXjx4NlR4J7yGvKumBuZTmV4NV6v09dVXXkuYVYLT68N6HCzLvfJ+fWCxQsntNzKwwIXL4bHnw== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.22.5" - "@babel/generator" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.5" + "@babel/generator" "^7.22.7" + "@babel/helper-compilation-targets" "^7.22.6" "@babel/helper-module-transforms" "^7.22.5" - "@babel/helpers" "^7.22.5" - "@babel/parser" "^7.22.5" + "@babel/helpers" "^7.22.6" + "@babel/parser" "^7.22.7" "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.5" + "@babel/traverse" "^7.22.8" "@babel/types" "^7.22.5" + "@nicolo-ribaudo/semver-v6" "^6.3.3" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.2" - semver "^6.3.0" -"@babel/generator@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.5.tgz#1e7bf768688acfb05cf30b2369ef855e82d984f7" - integrity sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA== +"@babel/generator@^7.22.7": + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.7.tgz#a6b8152d5a621893f2c9dacf9a4e286d520633d5" + integrity sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ== dependencies: "@babel/types" "^7.22.5" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/helper-compilation-targets@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz#fc7319fc54c5e2fa14b2909cf3c5fd3046813e02" - integrity sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw== +"@babel/helper-compilation-targets@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz#e30d61abe9480aa5a83232eb31c111be922d2e52" + integrity sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA== dependencies: - "@babel/compat-data" "^7.22.5" + "@babel/compat-data" "^7.22.6" "@babel/helper-validator-option" "^7.22.5" - browserslist "^4.21.3" + "@nicolo-ribaudo/semver-v6" "^6.3.3" + browserslist "^4.21.9" lru-cache "^5.1.1" - semver "^6.3.0" "@babel/helper-environment-visitor@^7.22.5": version "7.22.5" @@ -213,10 +213,10 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-split-export-declaration@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz#88cf11050edb95ed08d596f7a044462189127a08" - integrity sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ== +"@babel/helper-split-export-declaration@^7.22.5", "@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== dependencies: "@babel/types" "^7.22.5" @@ -235,13 +235,13 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== -"@babel/helpers@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.5.tgz#74bb4373eb390d1ceed74a15ef97767e63120820" - integrity sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q== +"@babel/helpers@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.6.tgz#8e61d3395a4f0c5a8060f309fb008200969b5ecd" + integrity sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA== dependencies: "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.5" + "@babel/traverse" "^7.22.6" "@babel/types" "^7.22.5" "@babel/highlight@^7.22.5": @@ -253,10 +253,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.5.tgz#721fd042f3ce1896238cf1b341c77eb7dee7dbea" - integrity sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.5", "@babel/parser@^7.22.7": + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.7.tgz#df8cf085ce92ddbdbf668a7f186ce848c9036cae" + integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -351,18 +351,18 @@ "@babel/parser" "^7.22.5" "@babel/types" "^7.22.5" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.5.tgz#44bd276690db6f4940fdb84e1cb4abd2f729ccd1" - integrity sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.22.5", "@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8": + version "7.22.8" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.8.tgz#4d4451d31bc34efeae01eac222b514a77aa4000e" + integrity sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw== dependencies: "@babel/code-frame" "^7.22.5" - "@babel/generator" "^7.22.5" + "@babel/generator" "^7.22.7" "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-function-name" "^7.22.5" "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.5" - "@babel/parser" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.22.7" "@babel/types" "^7.22.5" debug "^4.1.0" globals "^11.1.0" @@ -1858,6 +1858,11 @@ resolved "https://registry.yarnpkg.com/@msgpack/msgpack/-/msgpack-2.7.2.tgz#f34b8aa0c49f0dd55eb7eba577081299cbf3f90b" integrity sha512-rYEi46+gIzufyYUAoHDnRzkWGxajpD9vVXFQ3g1vbjrBm6P7MBmm+s/fqPa46sxa+8FOUdEuRQKaugo5a4JWpw== +"@nicolo-ribaudo/semver-v6@^6.3.3": + version "6.3.3" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz#ea6d23ade78a325f7a52750aab1526b02b628c29" + integrity sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -2844,14 +2849,14 @@ integrity sha512-wH6Tu9mbiOt0n5EvdoWy0VGQaJMHfLIxY/6wS0xLC7CV1taM6gESEzcYy0ZlWvxxiiljYvfDIvz4hHbUUDRlhw== "@types/node@*": - version "20.3.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.2.tgz#fa6a90f2600e052a03c18b8cb3fd83dd4e599898" - integrity sha512-vOBLVQeCQfIcF/2Y7eKFTqrMnizK5lRNQ7ykML/5RuwVXVWxYkgwS7xbt4B6fKCUPgbSL5FSsjHQpaGQP/dQmw== + version "20.4.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.1.tgz#a6033a8718653c50ac4962977e14d0f984d9527d" + integrity sha512-JIzsAvJeA/5iY6Y/OxZbv1lUcc8dNSE77lb2gnBH+/PJ3lFR1Ccvgwl5JWnHAkNHcRsT0TbpVOsiMKZ1F/yyJg== "@types/node@^18.14.6": - version "18.16.18" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.18.tgz#85da09bafb66d4bc14f7c899185336d0c1736390" - integrity sha512-/aNaQZD0+iSBAGnvvN2Cx92HqE5sZCPZtx2TsK+4nvV23fFe09jVDvpArXr2j9DnYlzuU9WuoykDDc6wqvpNcw== + version "18.16.19" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.19.tgz#cb03fca8910fdeb7595b755126a8a78144714eea" + integrity sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -3086,9 +3091,9 @@ acorn@^7.1.1, acorn@^7.4.0: integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.2.4, acorn@^8.4.1: - version "8.9.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.9.0.tgz#78a16e3b2bcc198c10822786fa6679e245db5b59" - integrity sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ== + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== add-stream@^1.0.0: version "1.0.0" @@ -3611,7 +3616,7 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browserslist@^4.21.3: +browserslist@^4.21.9: version "4.21.9" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== @@ -3750,9 +3755,9 @@ camelcase@^6.0.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001503: - version "1.0.30001509" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001509.tgz#2b7ad5265392d6d2de25cd8776d1ab3899570d14" - integrity sha512-2uDDk+TRiTX5hMcUYT/7CSyzMZxjfGu0vAUjS2g0LSD8UoXOv0LtpH4LxGMemsiPq6LCVIUjNwVM0erkOkGCDA== + version "1.0.30001515" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001515.tgz#418aefeed9d024cd3129bfae0ccc782d4cb8f12b" + integrity sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA== capture-exit@^2.0.0: version "2.0.0" @@ -3953,9 +3958,9 @@ code-point-at@^1.0.0: integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + version "1.0.2" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== collection-visit@^1.0.0: version "1.0.0" @@ -4335,7 +4340,7 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== -deep-is@^0.1.3, deep-is@~0.1.3: +deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== @@ -4527,9 +4532,9 @@ ecc-jsbn@~0.1.1: safer-buffer "^2.1.0" electron-to-chromium@^1.4.431: - version "1.4.445" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.445.tgz#058d2c5f3a2981ab1a37440f5a5e42d15672aa6d" - integrity sha512-++DB+9VK8SBJwC+X1zlMfJ1tMA3F0ipi39GdEp+x3cV2TyBihqAgad8cNMWtLDEkbH39nlDQP7PfGrDr3Dr7HA== + version "1.4.457" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.457.tgz#3fdc7b4f97d628ac6b51e8b4b385befb362fe343" + integrity sha512-/g3UyNDmDd6ebeWapmAoiyy+Sy2HyJ+/X8KyvNeHfKRFfHaA2W8oF5fxD5F3tjBDcjpwo0iek6YNgxNXDBoEtA== elliptic@6.5.4: version "6.5.4" @@ -4724,14 +4729,13 @@ escape-string-regexp@^2.0.0: integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== dependencies: esprima "^4.0.1" estraverse "^5.2.0" esutils "^2.0.2" - optionator "^0.8.1" optionalDependencies: source-map "~0.6.1" @@ -5123,9 +5127,9 @@ fast-diff@^1.1.2: integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== fast-glob@^3.2.5, fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + version "3.3.0" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.0.tgz#7c40cb491e1e2ed5664749e87bfb516dbe8727c0" + integrity sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -5138,7 +5142,7 @@ fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== @@ -7022,14 +7026,6 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - libnpmaccess@^4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-4.0.3.tgz#dfb0e5b0a53c315a2610d300e46b4ddeb66e7eec" @@ -7673,9 +7669,9 @@ nice-try@^1.0.4: integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== node-fetch@^2.6.1, node-fetch@^2.6.7: - version "2.6.11" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.11.tgz#cde7fc71deef3131ef80a738919f999e6edfff25" - integrity sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w== + version "2.6.12" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.12.tgz#02eb8e22074018e3d5a83016649d04df0e348fba" + integrity sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g== dependencies: whatwg-url "^5.0.0" @@ -7730,9 +7726,9 @@ node-notifier@^8.0.0: which "^2.0.2" node-releases@^2.0.12: - version "2.0.12" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039" - integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ== + version "2.0.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== noms@0.0.0: version "0.0.0" @@ -7912,9 +7908,9 @@ number-is-nan@^1.0.0: integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== nwsapi@^2.2.0: - version "2.2.5" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.5.tgz#a52744c61b3889dd44b0a158687add39b8d935e2" - integrity sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ== + version "2.2.7" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" + integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== oauth-sign@~0.9.0: version "0.9.0" @@ -8003,18 +7999,6 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - optionator@^0.9.1: version "0.9.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" @@ -8354,11 +8338,6 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - prettier-linter-helpers@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" @@ -8977,9 +8956,9 @@ scrypt-js@3.0.1: integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== "semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0, semver@^5.7.1: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== semver@7.3.8: version "7.3.8" @@ -9002,17 +8981,24 @@ semver@7.5.0: dependencies: lru-cache "^6.0.0" -semver@7.5.3, semver@7.x, semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: +semver@7.5.3: version "7.5.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.3.tgz#161ce8c2c6b4b3bdca6caadc9fa3317a4c4fe88e" integrity sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ== dependencies: lru-cache "^6.0.0" +semver@7.x, semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" @@ -9799,13 +9785,6 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" - type-detect@4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" @@ -10195,9 +10174,9 @@ which-module@^2.0.0: integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== which-typed-array@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" - integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + version "1.1.10" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.10.tgz#74baa2789991905c2076abb317103b866c64e69e" + integrity sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA== dependencies: available-typed-arrays "^1.0.5" call-bind "^1.0.2" @@ -10227,11 +10206,6 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2 || 3 || 4" -word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" From b8fbd6e05bd62cf65104690bf0050ea9c020e9bd Mon Sep 17 00:00:00 2001 From: krisbitney Date: Wed, 12 Jul 2023 11:53:36 -0500 Subject: [PATCH 078/181] lint --- packages/cli/src/lib/defaults/deploy-modules/ipfs/index.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/cli/src/lib/defaults/deploy-modules/ipfs/index.ts b/packages/cli/src/lib/defaults/deploy-modules/ipfs/index.ts index eac1915e39..30e90561ad 100644 --- a/packages/cli/src/lib/defaults/deploy-modules/ipfs/index.ts +++ b/packages/cli/src/lib/defaults/deploy-modules/ipfs/index.ts @@ -2,7 +2,10 @@ import { DeployModule } from "../../../deploy"; import { Uri } from "@polywrap/core-js"; import { PolywrapClient } from "@polywrap/client-js"; -import { PolywrapClientConfigBuilder, Web3 } from "@polywrap/client-config-builder-js"; +import { + PolywrapClientConfigBuilder, + Web3, +} from "@polywrap/client-config-builder-js"; import fs from "fs"; const isValidUri = (uri: Uri) => From 1b9adc4ce98395cd636643d927bf461d89ca357a Mon Sep 17 00:00:00 2001 From: Pileks Date: Wed, 12 Jul 2023 20:18:24 +0200 Subject: [PATCH 079/181] update Polywrap Client used by CLI to 0.12-pre.1 --- packages/cli/package.json | 18 +- .../cli/src/__tests__/unit/jobrunner.spec.ts | 17 +- .../ens-recursive-name-register/index.ts | 14 +- .../lib/defaults/deploy-modules/ens/index.ts | 17 +- .../lib/defaults/deploy-modules/ipfs/index.ts | 4 +- .../src/lib/option-parsers/client-config.ts | 8 +- .../src/lib/option-parsers/wrapper-envs.ts | 4 +- .../cli/src/lib/test-env/client-config.ts | 17 +- packages/cli/src/lib/workflow/JobRunner.ts | 4 +- packages/test-cases/yarn.lock | 338 ------------ yarn.lock | 518 ++++++++++-------- 11 files changed, 340 insertions(+), 619 deletions(-) delete mode 100644 packages/test-cases/yarn.lock diff --git a/packages/cli/package.json b/packages/cli/package.json index a3b0853acb..98e29df7f8 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -42,22 +42,22 @@ "@ethersproject/providers": "5.6.8", "@ethersproject/wallet": "5.6.2", "@formatjs/intl": "1.8.2", - "@polywrap/asyncify-js": "0.10.0", - "@polywrap/client-config-builder-js": "0.10.0", - "@polywrap/client-js": "0.10.0", - "@polywrap/core-js": "0.10.0", + "@polywrap/asyncify-js": "0.12.0-pre.1", + "@polywrap/client-config-builder-js": "0.12.0-pre.1", + "@polywrap/client-js": "0.12.0-pre.1", + "@polywrap/core-js": "0.12.0-pre.1", "@polywrap/ethereum-provider-js-v1": "npm:@polywrap/ethereum-provider-js@~0.2.4", "@polywrap/logging-js": "0.10.6", "@polywrap/os-js": "0.10.6", "@polywrap/polywrap-manifest-types-js": "0.10.6", - "@polywrap/result": "0.10.0", + "@polywrap/result": "0.12.0-pre.1", "@polywrap/schema-bind": "0.10.6", "@polywrap/schema-compose": "0.10.6", "@polywrap/schema-parse": "0.10.6", - "@polywrap/uri-resolver-extensions-js": "0.10.0", - "@polywrap/uri-resolvers-js": "0.10.0", - "@polywrap/wasm-js": "0.10.0", - "@polywrap/wrap-manifest-types-js": "0.10.0", + "@polywrap/uri-resolver-extensions-js": "0.12.0-pre.1", + "@polywrap/uri-resolvers-js": "0.12.0-pre.1", + "@polywrap/wasm-js": "0.12.0-pre.1", + "@polywrap/wrap-manifest-types-js": "0.12.0-pre.1", "axios": "0.21.2", "chalk": "4.1.0", "chokidar": "3.5.1", diff --git a/packages/cli/src/__tests__/unit/jobrunner.spec.ts b/packages/cli/src/__tests__/unit/jobrunner.spec.ts index fb141f3ab1..3df5273abb 100644 --- a/packages/cli/src/__tests__/unit/jobrunner.spec.ts +++ b/packages/cli/src/__tests__/unit/jobrunner.spec.ts @@ -1,23 +1,26 @@ import path from "path"; import { GetPathToTestWrappers } from "@polywrap/test-cases"; -import { ClientConfigBuilder, IClientConfigBuilder } from "@polywrap/client-config-builder-js"; +import { + PolywrapClientConfigBuilder, + ClientConfigBuilder, +} from "@polywrap/client-config-builder-js"; import { testCases } from "./jobrunner-test-cases"; import { JobRunner } from "../../lib"; jest.setTimeout(200000); describe("workflow JobRunner", () => { - let configBuilder: IClientConfigBuilder; + let configBuilder: ClientConfigBuilder; beforeAll(async () => { - configBuilder = new ClientConfigBuilder(); + configBuilder = new PolywrapClientConfigBuilder(); const subinvokeUri = `fs/${path.join( GetPathToTestWrappers(), "subinvoke", "00-subinvoke", "implementations", "rs" - )}` + )}`; const invokeUri = `fs/${path.join( GetPathToTestWrappers(), @@ -25,9 +28,11 @@ describe("workflow JobRunner", () => { "01-invoke", "implementations", "rs" - )}` + )}`; - configBuilder.addRedirect("ens/imported-invoke.eth", invokeUri).addRedirect("ens/imported-subinvoke.eth", subinvokeUri); + configBuilder + .setRedirect("ens/imported-invoke.eth", invokeUri) + .setRedirect("ens/imported-subinvoke.eth", subinvokeUri); configBuilder.addDefaults(); }); diff --git a/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/index.ts b/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/index.ts index 05384bedbc..f4bd29d86f 100644 --- a/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/index.ts +++ b/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/index.ts @@ -5,9 +5,9 @@ import { invokeWithTimeout } from "./invokeWithTimeout"; import { Wallet } from "@ethersproject/wallet"; import { JsonRpcProvider } from "@ethersproject/providers"; -import { Uri } from "@polywrap/core-js"; -import { ClientConfigBuilder, PolywrapClient } from "@polywrap/client-js"; -import { DefaultBundle } from "@polywrap/client-config-builder-js"; +import { IWrapPackage, Uri } from "@polywrap/core-js"; +import { PolywrapClientConfigBuilder, PolywrapClient } from "@polywrap/client-js"; +import * as Web3 from "@polywrap/web3-config-bundle-js"; import { Connection, Connections, @@ -60,13 +60,13 @@ class ENSRecursiveNameRegisterPublisher implements DeployModule { defaultNetwork: network, }); - const clientConfig = new ClientConfigBuilder() + const clientConfig = new PolywrapClientConfigBuilder() .addDefaults() - .addPackage( - DefaultBundle.plugins.ethereumProviderV1.uri.uri, + .setPackage( + Web3.bundle.ethereumProviderV1.uri, ethereumProviderPlugin({ connections: connections, - }) + }) as IWrapPackage ) .build(); diff --git a/packages/cli/src/lib/defaults/deploy-modules/ens/index.ts b/packages/cli/src/lib/defaults/deploy-modules/ens/index.ts index 44cd35bdc6..3ab4a0f4c4 100644 --- a/packages/cli/src/lib/defaults/deploy-modules/ens/index.ts +++ b/packages/cli/src/lib/defaults/deploy-modules/ens/index.ts @@ -5,9 +5,12 @@ import { invokeWithTimeout } from "./invokeWithTimeout"; import { Wallet } from "@ethersproject/wallet"; import { JsonRpcProvider } from "@ethersproject/providers"; -import { Uri } from "@polywrap/core-js"; -import { ClientConfigBuilder, PolywrapClient } from "@polywrap/client-js"; -import { DefaultBundle } from "@polywrap/client-config-builder-js"; +import { IWrapPackage, Uri } from "@polywrap/core-js"; +import { + PolywrapClientConfigBuilder, + PolywrapClient, +} from "@polywrap/client-js"; +import * as Web3 from "@polywrap/web3-config-bundle-js"; import { Connection, Connections, @@ -57,13 +60,13 @@ class ENSPublisher implements DeployModule { defaultNetwork: network, }); - const clientConfig = new ClientConfigBuilder() + const clientConfig = new PolywrapClientConfigBuilder() .addDefaults() - .addPackage( - DefaultBundle.plugins.ethereumProviderV1.uri.uri, + .setPackage( + Web3.bundle.ethereumProviderV1.uri, ethereumProviderPlugin({ connections: connections, - }) + }) as IWrapPackage ) .build(); diff --git a/packages/cli/src/lib/defaults/deploy-modules/ipfs/index.ts b/packages/cli/src/lib/defaults/deploy-modules/ipfs/index.ts index 85c697e8f6..45ce89b8e8 100644 --- a/packages/cli/src/lib/defaults/deploy-modules/ipfs/index.ts +++ b/packages/cli/src/lib/defaults/deploy-modules/ipfs/index.ts @@ -2,7 +2,7 @@ import { DeployModule } from "../../../deploy"; import { Uri } from "@polywrap/core-js"; import { PolywrapClient } from "@polywrap/client-js"; -import { DefaultBundle } from "@polywrap/client-config-builder-js"; +import * as Sys from "@polywrap/sys-config-bundle-js"; import fs from "fs"; const isValidUri = (uri: Uri) => @@ -94,7 +94,7 @@ class IPFSDeployer implements DeployModule { const client = new PolywrapClient(); const result = await client.invoke({ - uri: DefaultBundle.embeds.ipfsHttpClient.uri.uri, + uri: Sys.bundle.ipfsHttpClient.uri, method: "addDir", args: (args as unknown) as Record, }); diff --git a/packages/cli/src/lib/option-parsers/client-config.ts b/packages/cli/src/lib/option-parsers/client-config.ts index 6d57d580e8..4a7b0f9064 100644 --- a/packages/cli/src/lib/option-parsers/client-config.ts +++ b/packages/cli/src/lib/option-parsers/client-config.ts @@ -2,14 +2,14 @@ import { intlMsg } from "../intl"; import { importTypescriptModule } from "../system"; import { getTestEnvClientConfig } from "../test-env"; -import { ClientConfigBuilder } from "@polywrap/client-config-builder-js"; +import { PolywrapClientConfigBuilder } from "@polywrap/client-config-builder-js"; import path from "path"; -import { IClientConfigBuilder } from "@polywrap/client-config-builder-js"; +import { ClientConfigBuilder } from "@polywrap/client-config-builder-js"; export async function parseClientConfigOption( clientConfig: string | undefined | false -): Promise { - const builder = new ClientConfigBuilder().addDefaults(); +): Promise { + const builder = new PolywrapClientConfigBuilder().addDefaults(); try { builder.add(getTestEnvClientConfig()); diff --git a/packages/cli/src/lib/option-parsers/wrapper-envs.ts b/packages/cli/src/lib/option-parsers/wrapper-envs.ts index a386087c63..d34f1416b3 100644 --- a/packages/cli/src/lib/option-parsers/wrapper-envs.ts +++ b/packages/cli/src/lib/option-parsers/wrapper-envs.ts @@ -1,6 +1,6 @@ import { loadEnvironmentVariables } from "../system"; -import { ClientConfigBuilder } from "@polywrap/client-config-builder-js"; +import { PolywrapClientConfigBuilder } from "@polywrap/client-config-builder-js"; import fs from "fs"; import YAML from "yaml"; @@ -34,7 +34,7 @@ export async function parseWrapperEnvsOption( Record >; - const builder = new ClientConfigBuilder(); + const builder = new PolywrapClientConfigBuilder(); for (const env in wrapperEnvs) { builder.addEnv(env, wrapperEnvs[env]); diff --git a/packages/cli/src/lib/test-env/client-config.ts b/packages/cli/src/lib/test-env/client-config.ts index a9f719f6ef..cc2029240e 100644 --- a/packages/cli/src/lib/test-env/client-config.ts +++ b/packages/cli/src/lib/test-env/client-config.ts @@ -3,14 +3,17 @@ import { ETH_ENS_IPFS_MODULE_CONSTANTS } from "../../lib"; import { BuilderConfig, - DefaultBundle, + PolywrapClientConfigBuilder, } from "@polywrap/client-config-builder-js"; +import * as Web3 from "@polywrap/web3-config-bundle-js"; +import * as Sys from "@polywrap/sys-config-bundle-js"; import { ExtendableUriResolver } from "@polywrap/uri-resolver-extensions-js"; import { ethereumProviderPlugin, Connections, Connection, } from "@polywrap/ethereum-provider-js-v1"; +import { IWrapPackage } from "@polywrap/core-js"; export function getTestEnvClientConfig(): Partial { // TODO: move this into its own package, since it's being used everywhere? @@ -24,12 +27,11 @@ export function getTestEnvClientConfig(): Partial { } const ensAddress = ETH_ENS_IPFS_MODULE_CONSTANTS.ensAddresses.ensAddress; - + const defaultConfig = new PolywrapClientConfigBuilder().addDefaults().config; return { envs: { - [DefaultBundle.embeds.ipfsResolver.uri.uri]: { + [Sys.bundle.ipfsResolver.uri]: { provider: ipfsProvider, - fallbackProviders: DefaultBundle.ipfsProviders, retries: { tryResolveUri: 1, getFile: 1 }, }, "proxy/testnet-ens-uri-resolver-ext": { @@ -41,8 +43,7 @@ export function getTestEnvClientConfig(): Partial { "ens/wraps.eth:ens-uri-resolver-ext@1.0.1", }, packages: { - [DefaultBundle.plugins.ethereumProviderV1.uri - .uri]: ethereumProviderPlugin({ + [Web3.bundle.ethereumProviderV1.uri]: ethereumProviderPlugin({ connections: new Connections({ networks: { testnet: new Connection({ @@ -58,12 +59,12 @@ export function getTestEnvClientConfig(): Partial { }), }, }), - }), + }) as IWrapPackage, }, interfaces: { [ExtendableUriResolver.defaultExtInterfaceUris[0].uri]: new Set([ "proxy/testnet-ens-uri-resolver-ext", - ...DefaultBundle.getConfig().interfaces[ + ...defaultConfig.interfaces[ ExtendableUriResolver.defaultExtInterfaceUris[0].uri ], ]), diff --git a/packages/cli/src/lib/workflow/JobRunner.ts b/packages/cli/src/lib/workflow/JobRunner.ts index e16a8d1c05..67e73275ee 100644 --- a/packages/cli/src/lib/workflow/JobRunner.ts +++ b/packages/cli/src/lib/workflow/JobRunner.ts @@ -1,6 +1,6 @@ import { JobResult, Status, Step } from "./types"; -import { IClientConfigBuilder, PolywrapClient } from "@polywrap/client-js"; +import { ClientConfigBuilder, PolywrapClient } from "@polywrap/client-js"; import { CoreClient, MaybeAsync, Uri } from "@polywrap/core-js"; import { WorkflowJobs } from "@polywrap/polywrap-manifest-types-js"; @@ -9,7 +9,7 @@ export class JobRunner { private _client: CoreClient; constructor( - private _configBuilder: IClientConfigBuilder, + private _configBuilder: ClientConfigBuilder, private _onExecution?: ( id: string, JobResult: JobResult diff --git a/packages/test-cases/yarn.lock b/packages/test-cases/yarn.lock deleted file mode 100644 index 3a95d739de..0000000000 --- a/packages/test-cases/yarn.lock +++ /dev/null @@ -1,338 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@jridgewell/resolve-uri@^3.0.3": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@polywrap/os-js@0.10.5": - version "0.10.5" - resolved "https://registry.yarnpkg.com/@polywrap/os-js/-/os-js-0.10.5.tgz#b9ecae978f69edc341aedec1867161d1e609eb3a" - integrity sha512-Xh7KqCQy2aEoHDGQE5eV2ykCDjhCRzUVryiF+P/HbfxG//bW6Wte4e97H4tcuD8RkApYVaGjmUTAlvX+g+26AQ== - -"@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" - integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== - -"@types/adm-zip@0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@types/adm-zip/-/adm-zip-0.5.0.tgz#94c90a837ce02e256c7c665a6a1eb295906333c1" - integrity sha512-FCJBJq9ODsQZUNURo5ILAQueuA8WJhRvuihS3ke2iI25mJlfV2LK8jG2Qj2z2AWg8U0FtWWqBHVRetceLskSaw== - dependencies: - "@types/node" "*" - -"@types/glob@*": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-8.1.0.tgz#b63e70155391b0584dce44e7ea25190bbc38f2fc" - integrity sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w== - dependencies: - "@types/minimatch" "^5.1.2" - "@types/node" "*" - -"@types/minimatch@^5.1.2": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" - integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== - -"@types/node@*": - version "20.3.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.2.tgz#fa6a90f2600e052a03c18b8cb3fd83dd4e599898" - integrity sha512-vOBLVQeCQfIcF/2Y7eKFTqrMnizK5lRNQ7ykML/5RuwVXVWxYkgwS7xbt4B6fKCUPgbSL5FSsjHQpaGQP/dQmw== - -"@types/shelljs@0.8.9": - version "0.8.9" - resolved "https://registry.yarnpkg.com/@types/shelljs/-/shelljs-0.8.9.tgz#45dd8501aa9882976ca3610517dac3831c2fbbf4" - integrity sha512-flVe1dvlrCyQJN/SGrnBxqHG+RzXrVKsmjD8WS/qYHpq5UPjfq7UWFBENP0ZuOl0g6OpAlL6iBoLSvKYUUmyQw== - dependencies: - "@types/glob" "*" - "@types/node" "*" - -acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^8.4.1: - version "8.9.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.9.0.tgz#78a16e3b2bcc198c10822786fa6679e245db5b59" - integrity sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ== - -adm-zip@0.5.10: - version "0.5.10" - resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.5.10.tgz#4a51d5ab544b1f5ce51e1b9043139b639afff45b" - integrity sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ== - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -axios@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.2.2.tgz#72681724c6e6a43a9fea860fc558127dbe32f9f1" - integrity sha512-bz/J4gS2S3I7mpN/YZfGFTqhXTYzRho8Ay38w2otuuDR322KzFIWm/4W2K6gIwvWaws5n+mnb7D1lN9uD+QH6Q== - dependencies: - follow-redirects "^1.15.0" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -follow-redirects@^1.15.0: - version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== - -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -glob@^7.0.0: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - -is-core-module@^2.11.0: - version "2.12.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" - integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== - dependencies: - has "^1.0.3" - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== - dependencies: - resolve "^1.1.6" - -resolve@^1.1.6: - version "1.22.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== - dependencies: - is-core-module "^2.11.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -shelljs@0.8.5: - version "0.8.5" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" - integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -ts-node@10.9.1: - version "10.9.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== diff --git a/yarn.lock b/yarn.lock index 5b08c59716..eb710bc4bd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -113,52 +113,52 @@ dependencies: "@babel/highlight" "^7.22.5" -"@babel/compat-data@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.5.tgz#b1f6c86a02d85d2dd3368a2b67c09add8cd0c255" - integrity sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA== +"@babel/compat-data@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" + integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== "@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.5.tgz#d67d9747ecf26ee7ecd3ebae1ee22225fe902a89" - integrity sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg== + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.9.tgz#bd96492c68822198f33e8a256061da3cf391f58f" + integrity sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.22.5" - "@babel/generator" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.5" - "@babel/helper-module-transforms" "^7.22.5" - "@babel/helpers" "^7.22.5" - "@babel/parser" "^7.22.5" + "@babel/generator" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.9" + "@babel/helper-module-transforms" "^7.22.9" + "@babel/helpers" "^7.22.6" + "@babel/parser" "^7.22.7" "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.5" + "@babel/traverse" "^7.22.8" "@babel/types" "^7.22.5" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.2" - semver "^6.3.0" + semver "^6.3.1" -"@babel/generator@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.5.tgz#1e7bf768688acfb05cf30b2369ef855e82d984f7" - integrity sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA== +"@babel/generator@^7.22.7", "@babel/generator@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.9.tgz#572ecfa7a31002fa1de2a9d91621fd895da8493d" + integrity sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw== dependencies: "@babel/types" "^7.22.5" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/helper-compilation-targets@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz#fc7319fc54c5e2fa14b2909cf3c5fd3046813e02" - integrity sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw== +"@babel/helper-compilation-targets@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz#f9d0a7aaaa7cd32a3f31c9316a69f5a9bcacb892" + integrity sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw== dependencies: - "@babel/compat-data" "^7.22.5" + "@babel/compat-data" "^7.22.9" "@babel/helper-validator-option" "^7.22.5" - browserslist "^4.21.3" + browserslist "^4.21.9" lru-cache "^5.1.1" - semver "^6.3.0" + semver "^6.3.1" "@babel/helper-environment-visitor@^7.22.5": version "7.22.5" @@ -187,19 +187,16 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-module-transforms@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz#0f65daa0716961b6e96b164034e737f60a80d2ef" - integrity sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw== +"@babel/helper-module-transforms@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz#92dfcb1fbbb2bc62529024f72d942a8c97142129" + integrity sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ== dependencies: "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-module-imports" "^7.22.5" "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" "@babel/helper-validator-identifier" "^7.22.5" - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.5" - "@babel/types" "^7.22.5" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0": version "7.22.5" @@ -213,10 +210,10 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-split-export-declaration@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz#88cf11050edb95ed08d596f7a044462189127a08" - integrity sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ== +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== dependencies: "@babel/types" "^7.22.5" @@ -235,13 +232,13 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== -"@babel/helpers@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.5.tgz#74bb4373eb390d1ceed74a15ef97767e63120820" - integrity sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q== +"@babel/helpers@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.6.tgz#8e61d3395a4f0c5a8060f309fb008200969b5ecd" + integrity sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA== dependencies: "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.5" + "@babel/traverse" "^7.22.6" "@babel/types" "^7.22.5" "@babel/highlight@^7.22.5": @@ -253,10 +250,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.5.tgz#721fd042f3ce1896238cf1b341c77eb7dee7dbea" - integrity sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.5", "@babel/parser@^7.22.7": + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.7.tgz#df8cf085ce92ddbdbf668a7f186ce848c9036cae" + integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -351,18 +348,18 @@ "@babel/parser" "^7.22.5" "@babel/types" "^7.22.5" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.5.tgz#44bd276690db6f4940fdb84e1cb4abd2f729ccd1" - integrity sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8": + version "7.22.8" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.8.tgz#4d4451d31bc34efeae01eac222b514a77aa4000e" + integrity sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw== dependencies: "@babel/code-frame" "^7.22.5" - "@babel/generator" "^7.22.5" + "@babel/generator" "^7.22.7" "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-function-name" "^7.22.5" "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.5" - "@babel/parser" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.22.7" "@babel/types" "^7.22.5" debug "^4.1.0" globals "^11.1.0" @@ -2144,32 +2141,15 @@ resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.6.0.tgz#ed410c9eb0070491cff9fe914246ce41f88d6f74" integrity sha512-aPfcBeLErM/PPiAuAbNFLN5sNbZLc3KZlar27uohllN8Zs6jJbHyJU1y7cMA6W/zuq+thkaG8mujiS+3iD/FWQ== -"@polywrap/asyncify-js@0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@polywrap/asyncify-js/-/asyncify-js-0.10.0.tgz#0570ce34501e91710274285b6b4740f1094f08a3" - integrity sha512-/ZhREKykF1hg5H/mm8vQHqv7MSedfCnwzbsNwYuLmH/IUtQi2t7NyD2XXavSLq5PFOHA/apPueatbSFTeIgBdA== - "@polywrap/asyncify-js@0.10.1": version "0.10.1" resolved "https://registry.yarnpkg.com/@polywrap/asyncify-js/-/asyncify-js-0.10.1.tgz#00d656a39bfd54c1b8af82adf648264b0415259b" integrity sha512-qXD2GNAoG18sDLPOtN3bbdEJUM+5hhII2EJkcAREJSBpi4g7yFxlySz/qQGzDnlIRNl9MGNgaf+TYbpQnNBeLw== -"@polywrap/client-config-builder-js@0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@polywrap/client-config-builder-js/-/client-config-builder-js-0.10.0.tgz#e583f32dca97dfe0b9575db244fdad74a4f42d6f" - integrity sha512-9hZd5r/5rkLoHdeB76NDUNOYcUCzS+b8WjCI9kv5vNQiOR83dZnW3rTnQmcXOWWErRY70h6xvAQWWQ1WrW/SpQ== - dependencies: - "@polywrap/concurrent-plugin-js" "~0.10.0-pre" - "@polywrap/core-js" "0.10.0" - "@polywrap/ethereum-provider-js" "npm:@polywrap/ethereum-provider-js@~0.3.0" - "@polywrap/ethereum-provider-js-v1" "npm:@polywrap/ethereum-provider-js@~0.2.4" - "@polywrap/file-system-plugin-js" "~0.10.0-pre" - "@polywrap/http-plugin-js" "~0.10.0-pre" - "@polywrap/logger-plugin-js" "0.10.0-pre.10" - "@polywrap/uri-resolver-extensions-js" "0.10.0" - "@polywrap/uri-resolvers-js" "0.10.0" - "@polywrap/wasm-js" "0.10.0" - base64-to-uint8array "1.0.0" +"@polywrap/asyncify-js@0.12.0-pre.1": + version "0.12.0-pre.1" + resolved "https://registry.yarnpkg.com/@polywrap/asyncify-js/-/asyncify-js-0.12.0-pre.1.tgz#a09d3a1346315737790c36d8aa00e2d31fd849c5" + integrity sha512-E6OfxaOUrtHgp+3pbr5uJPLeoE9UJU7VXeL37n8ETel7LLjPfSfV7xn2x7iqdhvpJd5S+1daczC/g7espLzfLw== "@polywrap/client-config-builder-js@0.10.1": version "0.10.1" @@ -2188,21 +2168,35 @@ "@polywrap/wasm-js" "0.10.1" base64-to-uint8array "1.0.0" -"@polywrap/client-js@0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@polywrap/client-js/-/client-js-0.10.0.tgz#607c24cd65c03f57ca8325f4a8ecc02a5485c993" - integrity sha512-wRr4HZ7a4oLrKuw8CchM5JYcE8er43GGKQnhtf/ylld5Q7FpNpfzhsi8eWknORugQYuvR3CSG7qZey4Ijgj6qQ== - dependencies: - "@polywrap/client-config-builder-js" "0.10.0" - "@polywrap/core-client-js" "0.10.0" - "@polywrap/core-js" "0.10.0" - "@polywrap/msgpack-js" "0.10.0" - "@polywrap/plugin-js" "0.10.0" - "@polywrap/result" "0.10.0" - "@polywrap/tracing-js" "0.10.0" - "@polywrap/uri-resolver-extensions-js" "0.10.0" - "@polywrap/uri-resolvers-js" "0.10.0" - "@polywrap/wrap-manifest-types-js" "0.10.0" +"@polywrap/client-config-builder-js@0.12.0-pre.1": + version "0.12.0-pre.1" + resolved "https://registry.yarnpkg.com/@polywrap/client-config-builder-js/-/client-config-builder-js-0.12.0-pre.1.tgz#5fca0bfc216de2978b95bea1fd09b54cf6e40afa" + integrity sha512-fQ+i3VTyGWBM8eKamD2uLBK1l0/nV5C06GiaMpIGhU6yWL3ZcQBffl8OOU/uM0tdgpaNxdNMR/XcNzHjkVySjQ== + dependencies: + "@polywrap/config-bundle-types-js" "0.12.0-pre.1" + "@polywrap/core-js" "0.12.0-pre.1" + "@polywrap/plugin-js" "0.12.0-pre.1" + "@polywrap/sys-config-bundle-js" "0.12.0-pre.1" + "@polywrap/uri-resolver-extensions-js" "0.12.0-pre.1" + "@polywrap/uri-resolvers-js" "0.12.0-pre.1" + "@polywrap/wasm-js" "0.12.0-pre.1" + "@polywrap/web3-config-bundle-js" "0.12.0-pre.1" + +"@polywrap/client-js@0.12.0-pre.1": + version "0.12.0-pre.1" + resolved "https://registry.yarnpkg.com/@polywrap/client-js/-/client-js-0.12.0-pre.1.tgz#1df47c4eef946dc74ed4025e4726377c89b3b70c" + integrity sha512-BlmDn+wJqDsvpr26959vbO0XobPQ8XTb+qaK9bt2Zgqfb6st10KS9H099WFhGXOAGXsUQFi9SqQPjvUjeMoU1A== + dependencies: + "@polywrap/client-config-builder-js" "0.12.0-pre.1" + "@polywrap/core-client-js" "0.12.0-pre.1" + "@polywrap/core-js" "0.12.0-pre.1" + "@polywrap/msgpack-js" "0.12.0-pre.1" + "@polywrap/plugin-js" "0.12.0-pre.1" + "@polywrap/result" "0.12.0-pre.1" + "@polywrap/tracing-js" "0.12.0-pre.1" + "@polywrap/uri-resolver-extensions-js" "0.12.0-pre.1" + "@polywrap/uri-resolvers-js" "0.12.0-pre.1" + "@polywrap/wrap-manifest-types-js" "0.12.0-pre.1" "@polywrap/client-js@~0.10.0": version "0.10.1" @@ -2220,7 +2214,7 @@ "@polywrap/uri-resolvers-js" "0.10.1" "@polywrap/wrap-manifest-types-js" "0.10.1" -"@polywrap/concurrent-plugin-js@~0.10.0", "@polywrap/concurrent-plugin-js@~0.10.0-pre": +"@polywrap/concurrent-plugin-js@~0.10.0": version "0.10.0" resolved "https://registry.yarnpkg.com/@polywrap/concurrent-plugin-js/-/concurrent-plugin-js-0.10.0.tgz#662e49976f75f30632b302d515bd22c7643afc44" integrity sha512-sc11ffs34ScBHPB9uHFZuTmF8yPtZT81sBpBj7f4MlmrRDxtJS56Y7k/qL6L1xuwsnmeFipi5JGau1CcBaYmJQ== @@ -2229,16 +2223,12 @@ "@polywrap/msgpack-js" "0.10.0" "@polywrap/plugin-js" "0.10.0" -"@polywrap/core-client-js@0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@polywrap/core-client-js/-/core-client-js-0.10.0.tgz#bec91479d1294ca86b7fa77f5ed407dab4d2a0b4" - integrity sha512-Sv1fVHM/5ynobtT2N25jbXOKNju1y0Wk4TwFnTJXrAUcARrRMoAfmwLVfTwrqRZ2OjWMQ/AWTc7ziNBtH5dNAg== +"@polywrap/config-bundle-types-js@0.12.0-pre.1": + version "0.12.0-pre.1" + resolved "https://registry.yarnpkg.com/@polywrap/config-bundle-types-js/-/config-bundle-types-js-0.12.0-pre.1.tgz#72a389da3f309d9cfef555a1cbd828ecec0dac8d" + integrity sha512-zef/QxM2AmgEWPc3LuKCJwfn2QK0S9uQ83K+MgTiNHp9hoMmdG9ij4MUZDXpnJTyMn0dgREBpDqCHPfTsCbDLw== dependencies: - "@polywrap/core-js" "0.10.0" - "@polywrap/msgpack-js" "0.10.0" - "@polywrap/result" "0.10.0" - "@polywrap/tracing-js" "0.10.0" - "@polywrap/wrap-manifest-types-js" "0.10.0" + "@polywrap/core-js" "0.12.0-pre.1" "@polywrap/core-client-js@0.10.1": version "0.10.1" @@ -2251,6 +2241,17 @@ "@polywrap/tracing-js" "0.10.1" "@polywrap/wrap-manifest-types-js" "0.10.1" +"@polywrap/core-client-js@0.12.0-pre.1": + version "0.12.0-pre.1" + resolved "https://registry.yarnpkg.com/@polywrap/core-client-js/-/core-client-js-0.12.0-pre.1.tgz#9d4962e660ea467a98f4ff000ca1e00245dc305f" + integrity sha512-KQd/NLtdyksBGbnM8tLn+C+lugWaJT9q41nd+XNzbvH+CoDC4mdvZxAzzTusYRzNiHXvxz4/5hb/RfJRT5R2wA== + dependencies: + "@polywrap/core-js" "0.12.0-pre.1" + "@polywrap/msgpack-js" "0.12.0-pre.1" + "@polywrap/result" "0.12.0-pre.1" + "@polywrap/tracing-js" "0.12.0-pre.1" + "@polywrap/wrap-manifest-types-js" "0.12.0-pre.1" + "@polywrap/core-js@0.10.0": version "0.10.0" resolved "https://registry.yarnpkg.com/@polywrap/core-js/-/core-js-0.10.0.tgz#5ddc31ff47019342659a2208eec05299b072b216" @@ -2269,7 +2270,7 @@ "@polywrap/tracing-js" "0.10.0-pre.10" "@polywrap/wrap-manifest-types-js" "0.10.0-pre.10" -"@polywrap/core-js@0.10.1", "@polywrap/core-js@~0.10.0": +"@polywrap/core-js@0.10.1", "@polywrap/core-js@~0.10.0", "@polywrap/core-js@~0.10.1": version "0.10.1" resolved "https://registry.yarnpkg.com/@polywrap/core-js/-/core-js-0.10.1.tgz#09405c745f591d5f7ec243db95a61540a05296cb" integrity sha512-BJpWDikfd/6h64Lf7FKy0g5O3a5OKaL915boni1pHP54wF4xBWdHkKixLGD8w4BZWRiW9v42PpYBhWqYZwSNGg== @@ -2278,6 +2279,23 @@ "@polywrap/tracing-js" "0.10.1" "@polywrap/wrap-manifest-types-js" "0.10.1" +"@polywrap/core-js@0.12.0-pre.1": + version "0.12.0-pre.1" + resolved "https://registry.yarnpkg.com/@polywrap/core-js/-/core-js-0.12.0-pre.1.tgz#b376db87e0e60bd5940941b80c8cd064c44dc142" + integrity sha512-BMxp5nEJGGIerFsRR7x+CMSthIF0BjFFTTmWmpy3s5aTizKUfTtw5XIMnSeUAswA7+4beo8GSkS2u6L+T+u7YA== + dependencies: + "@polywrap/result" "0.12.0-pre.1" + "@polywrap/tracing-js" "0.12.0-pre.1" + "@polywrap/wrap-manifest-types-js" "0.12.0-pre.1" + +"@polywrap/datetime-plugin-js@~0.10.0": + version "0.10.1" + resolved "https://registry.yarnpkg.com/@polywrap/datetime-plugin-js/-/datetime-plugin-js-0.10.1.tgz#8042673034c09155f3d0972eef87d87cb53b1914" + integrity sha512-eB6osYgISVQjnz6SDJ+02Z5HIC3Qg82hU6m1b02fTCsAsJqIDTSoe5AUugd0KqQ3C+MHv03TlGuFn6ekjyutGg== + dependencies: + "@polywrap/core-js" "~0.10.1" + "@polywrap/plugin-js" "~0.10.1" + "@polywrap/ethereum-provider-js-v1@npm:@polywrap/ethereum-provider-js@~0.2.4": version "0.2.4" resolved "https://registry.yarnpkg.com/@polywrap/ethereum-provider-js/-/ethereum-provider-js-0.2.4.tgz#3df1a6548da191618bb5cae7928c7427e69e0030" @@ -2289,7 +2307,7 @@ "@polywrap/plugin-js" "0.10.0-pre.10" ethers "5.7.0" -"@polywrap/ethereum-provider-js@npm:@polywrap/ethereum-provider-js@~0.3.0", "@polywrap/ethereum-provider-js@npm:@polywrap/ethereum-provider-js@~0.3.1": +"@polywrap/ethereum-provider-js@npm:@polywrap/ethereum-provider-js@~0.3.1": version "0.3.1" resolved "https://registry.yarnpkg.com/@polywrap/ethereum-provider-js/-/ethereum-provider-js-0.3.1.tgz#ffdb9425c819ee76d3e3d5ade7d1b044077037e0" integrity sha512-El2d3gE2CFdGNzKQhO+IPP79lhyQmkAGlpQadaW/EDyFDjERLckYDLPrwUCXG0agUcQZcNY1nHn2hknumw/yWg== @@ -2300,7 +2318,7 @@ "@polywrap/plugin-js" "0.10.0" ethers "5.7.0" -"@polywrap/file-system-plugin-js@~0.10.0", "@polywrap/file-system-plugin-js@~0.10.0-pre": +"@polywrap/file-system-plugin-js@~0.10.0": version "0.10.0" resolved "https://registry.yarnpkg.com/@polywrap/file-system-plugin-js/-/file-system-plugin-js-0.10.0.tgz#7814e0b1c0bb170ab85500f67aca6af4c17ec19f" integrity sha512-QWDpeVBACeK8PqZUwby/zlozG/07fpvJN5kQtw5e7ha4K5blX1j1i6ixgLKlYyQsaaTBxS6aAF3C0ryt4BsJcQ== @@ -2308,7 +2326,7 @@ "@polywrap/core-js" "0.10.0" "@polywrap/plugin-js" "0.10.0" -"@polywrap/http-plugin-js@~0.10.0", "@polywrap/http-plugin-js@~0.10.0-pre": +"@polywrap/http-plugin-js@~0.10.0": version "0.10.0" resolved "https://registry.yarnpkg.com/@polywrap/http-plugin-js/-/http-plugin-js-0.10.0.tgz#930ec9dbaa762b71d8905ad02a77d5d574707642" integrity sha512-t/yvoOAGUwsuS37ZQkkBZOogNbeJadtHwitMMA6XGs1jDANP1Xim/xWXWBYC3W1YJ8pbUeO8bHZHTBaJ7SC0cA== @@ -2318,15 +2336,7 @@ axios "0.21.4" form-data "4.0.0" -"@polywrap/logger-plugin-js@0.10.0-pre.10": - version "0.10.0-pre.10" - resolved "https://registry.yarnpkg.com/@polywrap/logger-plugin-js/-/logger-plugin-js-0.10.0-pre.10.tgz#de4a995c083edc26d72abb7420628b40d81efed2" - integrity sha512-6wBgBvphQRI+LP22+xi1KPcCq4B9dUMB/ZAXOpVTb/X/fOqdNBOS1LTXV+BtCe2KfdqGS6DKIXwGITcMOxIDCg== - dependencies: - "@polywrap/core-js" "0.10.0-pre.10" - "@polywrap/plugin-js" "0.10.0-pre.10" - -"@polywrap/logger-plugin-js@~0.10.1": +"@polywrap/logger-plugin-js@~0.10.0", "@polywrap/logger-plugin-js@~0.10.1": version "0.10.1" resolved "https://registry.yarnpkg.com/@polywrap/logger-plugin-js/-/logger-plugin-js-0.10.1.tgz#220cc248cb1381aa46c1f773ed8ce77da420280c" integrity sha512-ipqS7A6Mc0Fp0e/qg8RyGIulfk6mGS9acKii3kQoJ59/Zf/Yy4Eg3HWDtnlgBIdIgwyZKD8amiF42VKRO6R3Ig== @@ -2355,6 +2365,13 @@ dependencies: "@msgpack/msgpack" "2.7.2" +"@polywrap/msgpack-js@0.12.0-pre.1": + version "0.12.0-pre.1" + resolved "https://registry.yarnpkg.com/@polywrap/msgpack-js/-/msgpack-js-0.12.0-pre.1.tgz#e87f6951a5a1ba98c07dc534bec695f46880a38e" + integrity sha512-/ea7M1hUC3+SJIdcvrfmrM/w8DVnRScok1Xdkkv20CTUDP/sDElSssB+DTtzAv/UCjhpiHzi4MRlA/AcjR1ODw== + dependencies: + "@msgpack/msgpack" "2.7.2" + "@polywrap/plugin-js@0.10.0": version "0.10.0" resolved "https://registry.yarnpkg.com/@polywrap/plugin-js/-/plugin-js-0.10.0.tgz#e3bc81bf7832df9c84a4a319515228b159a05ba5" @@ -2377,7 +2394,7 @@ "@polywrap/tracing-js" "0.10.0-pre.10" "@polywrap/wrap-manifest-types-js" "0.10.0-pre.10" -"@polywrap/plugin-js@0.10.1", "@polywrap/plugin-js@~0.10.0": +"@polywrap/plugin-js@0.10.1", "@polywrap/plugin-js@~0.10.0", "@polywrap/plugin-js@~0.10.1": version "0.10.1" resolved "https://registry.yarnpkg.com/@polywrap/plugin-js/-/plugin-js-0.10.1.tgz#e11ce19dde01245750c297a62f2f75fd58ef9ced" integrity sha512-WBk4ZUrI5m6FG4bIocLHo7XS+QMeNa23odli6Ss6onUyo7mPIo1wlceEgw7Cu4gd/3bmuc6VGoCKRA1/glBT3g== @@ -2388,6 +2405,17 @@ "@polywrap/tracing-js" "0.10.1" "@polywrap/wrap-manifest-types-js" "0.10.1" +"@polywrap/plugin-js@0.12.0-pre.1": + version "0.12.0-pre.1" + resolved "https://registry.yarnpkg.com/@polywrap/plugin-js/-/plugin-js-0.12.0-pre.1.tgz#86865f63545086b47ebfbd546ed18ab0ce146752" + integrity sha512-juHMEUsuoY/ZpbsVWZ9puMkX83PcCeT/hKKWxVl+CfmoWpmFiatorgdS3kMgr/O19+o/b6eyd/sqKyWSxmVdQw== + dependencies: + "@polywrap/core-js" "0.12.0-pre.1" + "@polywrap/msgpack-js" "0.12.0-pre.1" + "@polywrap/result" "0.12.0-pre.1" + "@polywrap/tracing-js" "0.12.0-pre.1" + "@polywrap/wrap-manifest-types-js" "0.12.0-pre.1" + "@polywrap/result@0.10.0": version "0.10.0" resolved "https://registry.yarnpkg.com/@polywrap/result/-/result-0.10.0.tgz#712339223fba524dfabfb0bf868411f357d52e34" @@ -2403,6 +2431,25 @@ resolved "https://registry.yarnpkg.com/@polywrap/result/-/result-0.10.1.tgz#e60122396521fc07edda6951915ada4aaa5f6694" integrity sha512-9EoS/JUgKFwRk396lQ+3tDAGbZExsOf26SUG4l41HJv4FZLLLOL5ksppJK8StvjtbpQOIgFls23c83CXzS1hBQ== +"@polywrap/result@0.12.0-pre.1": + version "0.12.0-pre.1" + resolved "https://registry.yarnpkg.com/@polywrap/result/-/result-0.12.0-pre.1.tgz#5b5ea8b4e3b0be65ee27e66050acd3f0fb6096c0" + integrity sha512-OgBmuuwCcQ8zCX+FbG01RQ402xfnwarHR7zoc9+7EXhd+jd0BdbUCg026bK43VjRZT5cQPbh0XWh5YzK1ozkGA== + +"@polywrap/sys-config-bundle-js@0.12.0-pre.1": + version "0.12.0-pre.1" + resolved "https://registry.yarnpkg.com/@polywrap/sys-config-bundle-js/-/sys-config-bundle-js-0.12.0-pre.1.tgz#7487c5e5d181aa4140ab8d7015fcb0779a4af9f8" + integrity sha512-upyi2kwIr4/sL6bPL/ECqJpisaSFtIm5wwwl8PoUE5Ib+T/O2WUZxc4A3JNczV0Y1UnqPh6cTbfDH8qXqviAdQ== + dependencies: + "@polywrap/concurrent-plugin-js" "~0.10.0" + "@polywrap/config-bundle-types-js" "0.12.0-pre.1" + "@polywrap/datetime-plugin-js" "~0.10.0" + "@polywrap/file-system-plugin-js" "~0.10.0" + "@polywrap/http-plugin-js" "~0.10.0" + "@polywrap/logger-plugin-js" "~0.10.0" + "@polywrap/uri-resolver-extensions-js" "0.12.0-pre.1" + base64-to-uint8array "1.0.0" + "@polywrap/tracing-js@0.10.0": version "0.10.0" resolved "https://registry.yarnpkg.com/@polywrap/tracing-js/-/tracing-js-0.10.0.tgz#31d7ca9cc73a1dbd877fc684000652aa2c22acdc" @@ -2439,16 +2486,17 @@ "@opentelemetry/sdk-trace-base" "1.6.0" "@opentelemetry/sdk-trace-web" "1.6.0" -"@polywrap/uri-resolver-extensions-js@0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@polywrap/uri-resolver-extensions-js/-/uri-resolver-extensions-js-0.10.0.tgz#ef0012e9b2231be44b0739f57b023a1c009c1b2b" - integrity sha512-mP8nLESuQFImhxeEV646m4qzJ1rc3d2LLgly9vPFUffXM7YMfJriL0nYNTzbyvZbhvH7PHfeEQ/m5DZFADMc7w== +"@polywrap/tracing-js@0.12.0-pre.1": + version "0.12.0-pre.1" + resolved "https://registry.yarnpkg.com/@polywrap/tracing-js/-/tracing-js-0.12.0-pre.1.tgz#53794c111a42fca5921e3ac1bade7acbe025140d" + integrity sha512-TbLJisZujA9XbSPAvBrC0iTsJiqC1DDF3BKIP1m9d6Bs4KX4zS2UhZzQAJZFKaAo/acoUW9NgXd6O8PtixZmGw== dependencies: - "@polywrap/core-js" "0.10.0" - "@polywrap/result" "0.10.0" - "@polywrap/uri-resolvers-js" "0.10.0" - "@polywrap/wasm-js" "0.10.0" - "@polywrap/wrap-manifest-types-js" "0.10.0" + "@fetsorn/opentelemetry-console-exporter" "0.0.3" + "@opentelemetry/api" "1.2.0" + "@opentelemetry/exporter-trace-otlp-http" "0.32.0" + "@opentelemetry/resources" "1.6.0" + "@opentelemetry/sdk-trace-base" "1.6.0" + "@opentelemetry/sdk-trace-web" "1.6.0" "@polywrap/uri-resolver-extensions-js@0.10.1": version "0.10.1" @@ -2461,14 +2509,16 @@ "@polywrap/wasm-js" "0.10.1" "@polywrap/wrap-manifest-types-js" "0.10.1" -"@polywrap/uri-resolvers-js@0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@polywrap/uri-resolvers-js/-/uri-resolvers-js-0.10.0.tgz#d80163666a5110a4a7bd36be7e0961364af761ce" - integrity sha512-lZP+sN4lnp8xRklYWkrAJFECFNXDsBawGqVk7jUrbcw1CX8YODHyDEB0dSV8vN30DMP4h70W7V4QeNwPiE1EzQ== +"@polywrap/uri-resolver-extensions-js@0.12.0-pre.1": + version "0.12.0-pre.1" + resolved "https://registry.yarnpkg.com/@polywrap/uri-resolver-extensions-js/-/uri-resolver-extensions-js-0.12.0-pre.1.tgz#d62ab34b859a74924a139e94a22b30a6b09759af" + integrity sha512-sRT7I7RYkijQpuD+0+gDsUTJsVSL9M9caowfFOPkDhHuTcoIct/Fte/hAD5ncDChSUc84MZgHZPWcQxOz12zzg== dependencies: - "@polywrap/core-js" "0.10.0" - "@polywrap/result" "0.10.0" - "@polywrap/wrap-manifest-types-js" "0.10.0" + "@polywrap/core-js" "0.12.0-pre.1" + "@polywrap/result" "0.12.0-pre.1" + "@polywrap/uri-resolvers-js" "0.12.0-pre.1" + "@polywrap/wasm-js" "0.12.0-pre.1" + "@polywrap/wrap-manifest-types-js" "0.12.0-pre.1" "@polywrap/uri-resolvers-js@0.10.1": version "0.10.1" @@ -2479,17 +2529,14 @@ "@polywrap/result" "0.10.1" "@polywrap/wrap-manifest-types-js" "0.10.1" -"@polywrap/wasm-js@0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@polywrap/wasm-js/-/wasm-js-0.10.0.tgz#6947b44669514cc0cb0653db8278f40631c45c7d" - integrity sha512-kI0Q9DQ/PlA0BTEj+Mye4fdt/aLh07l8YHjhbXQheuu46mcZuG9vfgnn78eug9c7wjGEECxlsK+B4hy/FPgYxQ== +"@polywrap/uri-resolvers-js@0.12.0-pre.1": + version "0.12.0-pre.1" + resolved "https://registry.yarnpkg.com/@polywrap/uri-resolvers-js/-/uri-resolvers-js-0.12.0-pre.1.tgz#58b6238cde9380dbb302e3a0c00f7a493a679765" + integrity sha512-tVqTWRS4rtlq3JKQHyOPqE2lql/qCWT+cy7IYT/VN/jaD6nHLMI+tWwp9spDlibotOn/6Bwtk+v6HOPS6SkiOg== dependencies: - "@polywrap/asyncify-js" "0.10.0" - "@polywrap/core-js" "0.10.0" - "@polywrap/msgpack-js" "0.10.0" - "@polywrap/result" "0.10.0" - "@polywrap/tracing-js" "0.10.0" - "@polywrap/wrap-manifest-types-js" "0.10.0" + "@polywrap/core-js" "0.12.0-pre.1" + "@polywrap/result" "0.12.0-pre.1" + "@polywrap/wrap-manifest-types-js" "0.12.0-pre.1" "@polywrap/wasm-js@0.10.1": version "0.10.1" @@ -2503,6 +2550,31 @@ "@polywrap/tracing-js" "0.10.1" "@polywrap/wrap-manifest-types-js" "0.10.1" +"@polywrap/wasm-js@0.12.0-pre.1": + version "0.12.0-pre.1" + resolved "https://registry.yarnpkg.com/@polywrap/wasm-js/-/wasm-js-0.12.0-pre.1.tgz#d1641b12692f7d90dc16c8687b6a8e2f70153124" + integrity sha512-ItIJnvz9DuCifaiYy+ZQiTXU5gotUUcSA/BmO+joe1b96c5b1n7gbiU3eqaYWPDpzNxo417/Utwr8RHtZ4248Q== + dependencies: + "@polywrap/asyncify-js" "0.12.0-pre.1" + "@polywrap/core-js" "0.12.0-pre.1" + "@polywrap/msgpack-js" "0.12.0-pre.1" + "@polywrap/result" "0.12.0-pre.1" + "@polywrap/tracing-js" "0.12.0-pre.1" + "@polywrap/wrap-manifest-types-js" "0.12.0-pre.1" + +"@polywrap/web3-config-bundle-js@0.12.0-pre.1": + version "0.12.0-pre.1" + resolved "https://registry.yarnpkg.com/@polywrap/web3-config-bundle-js/-/web3-config-bundle-js-0.12.0-pre.1.tgz#477a64fa4912f5ac5edb94037315e0f6cdaa92d7" + integrity sha512-L+yZBfooyGgOLdoNcMiEHexpNf+3OnxzVpFlHtR9JdHJmOv4VxqI0LFuVoBDCBwv6m/zxzSYw9C/v8LzIPQLgA== + dependencies: + "@polywrap/config-bundle-types-js" "0.12.0-pre.1" + "@polywrap/ethereum-provider-js" "npm:@polywrap/ethereum-provider-js@~0.3.1" + "@polywrap/ethereum-provider-js-v1" "npm:@polywrap/ethereum-provider-js@~0.2.4" + "@polywrap/sys-config-bundle-js" "0.12.0-pre.1" + "@polywrap/uri-resolver-extensions-js" "0.12.0-pre.1" + "@polywrap/wasm-js" "0.12.0-pre.1" + base64-to-uint8array "1.0.0" + "@polywrap/wrap-manifest-types-js@0.10.0": version "0.10.0" resolved "https://registry.yarnpkg.com/@polywrap/wrap-manifest-types-js/-/wrap-manifest-types-js-0.10.0.tgz#f009a69d1591ee770dd13d67989d88f51e345d36" @@ -2531,6 +2603,15 @@ jsonschema "1.4.0" semver "7.5.0" +"@polywrap/wrap-manifest-types-js@0.12.0-pre.1": + version "0.12.0-pre.1" + resolved "https://registry.yarnpkg.com/@polywrap/wrap-manifest-types-js/-/wrap-manifest-types-js-0.12.0-pre.1.tgz#81ea326c2ccebf3761425a44fda26b171fad4409" + integrity sha512-BdM1QrSb2gEbFqeMyh1UPa1zUdilwkNyMr5A8Pfw1nYv93W9/UK8O2IYXeh1WUWAnsPSgjNbtM0bbdXMqqDyHQ== + dependencies: + "@polywrap/msgpack-js" "0.12.0-pre.1" + ajv "8.12.0" + semver "7.5.0" + "@sinclair/typebox@^0.24.1": version "0.24.51" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" @@ -2760,14 +2841,14 @@ integrity sha512-wH6Tu9mbiOt0n5EvdoWy0VGQaJMHfLIxY/6wS0xLC7CV1taM6gESEzcYy0ZlWvxxiiljYvfDIvz4hHbUUDRlhw== "@types/node@*": - version "20.3.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.2.tgz#fa6a90f2600e052a03c18b8cb3fd83dd4e599898" - integrity sha512-vOBLVQeCQfIcF/2Y7eKFTqrMnizK5lRNQ7ykML/5RuwVXVWxYkgwS7xbt4B6fKCUPgbSL5FSsjHQpaGQP/dQmw== + version "20.4.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.1.tgz#a6033a8718653c50ac4962977e14d0f984d9527d" + integrity sha512-JIzsAvJeA/5iY6Y/OxZbv1lUcc8dNSE77lb2gnBH+/PJ3lFR1Ccvgwl5JWnHAkNHcRsT0TbpVOsiMKZ1F/yyJg== "@types/node@^18.14.6": - version "18.16.18" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.18.tgz#85da09bafb66d4bc14f7c899185336d0c1736390" - integrity sha512-/aNaQZD0+iSBAGnvvN2Cx92HqE5sZCPZtx2TsK+4nvV23fFe09jVDvpArXr2j9DnYlzuU9WuoykDDc6wqvpNcw== + version "18.16.19" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.19.tgz#cb03fca8910fdeb7595b755126a8a78144714eea" + integrity sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -3002,9 +3083,9 @@ acorn@^7.1.1, acorn@^7.4.0: integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.2.4, acorn@^8.4.1: - version "8.9.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.9.0.tgz#78a16e3b2bcc198c10822786fa6679e245db5b59" - integrity sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ== + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== add-stream@^1.0.0: version "1.0.0" @@ -3045,6 +3126,16 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" +ajv@8.12.0, ajv@^8.0.1: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -3055,16 +3146,6 @@ ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.1: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - ansi-colors@^4.1.1: version "4.1.3" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" @@ -3527,7 +3608,7 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browserslist@^4.21.3: +browserslist@^4.21.9: version "4.21.9" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== @@ -3666,9 +3747,9 @@ camelcase@^6.0.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001503: - version "1.0.30001509" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001509.tgz#2b7ad5265392d6d2de25cd8776d1ab3899570d14" - integrity sha512-2uDDk+TRiTX5hMcUYT/7CSyzMZxjfGu0vAUjS2g0LSD8UoXOv0LtpH4LxGMemsiPq6LCVIUjNwVM0erkOkGCDA== + version "1.0.30001515" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001515.tgz#418aefeed9d024cd3129bfae0ccc782d4cb8f12b" + integrity sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA== capture-exit@^2.0.0: version "2.0.0" @@ -3869,9 +3950,9 @@ code-point-at@^1.0.0: integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + version "1.0.2" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== collection-visit@^1.0.0: version "1.0.0" @@ -4251,7 +4332,7 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== -deep-is@^0.1.3, deep-is@~0.1.3: +deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== @@ -4443,9 +4524,9 @@ ecc-jsbn@~0.1.1: safer-buffer "^2.1.0" electron-to-chromium@^1.4.431: - version "1.4.445" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.445.tgz#058d2c5f3a2981ab1a37440f5a5e42d15672aa6d" - integrity sha512-++DB+9VK8SBJwC+X1zlMfJ1tMA3F0ipi39GdEp+x3cV2TyBihqAgad8cNMWtLDEkbH39nlDQP7PfGrDr3Dr7HA== + version "1.4.457" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.457.tgz#3fdc7b4f97d628ac6b51e8b4b385befb362fe343" + integrity sha512-/g3UyNDmDd6ebeWapmAoiyy+Sy2HyJ+/X8KyvNeHfKRFfHaA2W8oF5fxD5F3tjBDcjpwo0iek6YNgxNXDBoEtA== elliptic@6.5.4: version "6.5.4" @@ -4640,14 +4721,13 @@ escape-string-regexp@^2.0.0: integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== dependencies: esprima "^4.0.1" estraverse "^5.2.0" esutils "^2.0.2" - optionator "^0.8.1" optionalDependencies: source-map "~0.6.1" @@ -5039,9 +5119,9 @@ fast-diff@^1.1.2: integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== fast-glob@^3.2.5, fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + version "3.3.0" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.0.tgz#7c40cb491e1e2ed5664749e87bfb516dbe8727c0" + integrity sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -5054,7 +5134,7 @@ fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== @@ -6938,14 +7018,6 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - libnpmaccess@^4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-4.0.3.tgz#dfb0e5b0a53c315a2610d300e46b4ddeb66e7eec" @@ -7589,9 +7661,9 @@ nice-try@^1.0.4: integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== node-fetch@^2.6.1, node-fetch@^2.6.7: - version "2.6.11" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.11.tgz#cde7fc71deef3131ef80a738919f999e6edfff25" - integrity sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w== + version "2.6.12" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.12.tgz#02eb8e22074018e3d5a83016649d04df0e348fba" + integrity sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g== dependencies: whatwg-url "^5.0.0" @@ -7646,9 +7718,9 @@ node-notifier@^8.0.0: which "^2.0.2" node-releases@^2.0.12: - version "2.0.12" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039" - integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ== + version "2.0.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== noms@0.0.0: version "0.0.0" @@ -7828,9 +7900,9 @@ number-is-nan@^1.0.0: integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== nwsapi@^2.2.0: - version "2.2.5" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.5.tgz#a52744c61b3889dd44b0a158687add39b8d935e2" - integrity sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ== + version "2.2.7" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" + integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== oauth-sign@~0.9.0: version "0.9.0" @@ -7919,18 +7991,6 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - optionator@^0.9.1: version "0.9.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" @@ -8270,11 +8330,6 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - prettier-linter-helpers@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" @@ -8893,9 +8948,9 @@ scrypt-js@3.0.1: integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== "semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0, semver@^5.7.1: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== semver@7.3.8: version "7.3.8" @@ -8918,17 +8973,24 @@ semver@7.5.0: dependencies: lru-cache "^6.0.0" -semver@7.5.3, semver@7.x, semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: +semver@7.5.3: version "7.5.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.3.tgz#161ce8c2c6b4b3bdca6caadc9fa3317a4c4fe88e" integrity sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ== dependencies: lru-cache "^6.0.0" -semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@7.x, semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" @@ -9715,13 +9777,6 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" - type-detect@4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" @@ -10111,9 +10166,9 @@ which-module@^2.0.0: integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== which-typed-array@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" - integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + version "1.1.10" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.10.tgz#74baa2789991905c2076abb317103b866c64e69e" + integrity sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA== dependencies: available-typed-arrays "^1.0.5" call-bind "^1.0.2" @@ -10143,11 +10198,6 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2 || 3 || 4" -word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" From 2dcce170aa240bc9e8319a65868b87ea3afa84cf Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Wed, 12 Jul 2023 20:29:39 +0200 Subject: [PATCH 080/181] chore: update vm image --- .../src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile | 2 +- .../src/lib/defaults/build-strategies/wasm/golang/vm/VERSION | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile index cda08a9bba..b3743bd19f 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile @@ -2,7 +2,7 @@ FROM rust:1.60.0 as rust RUN cargo install -f wasm-snip -FROM polywrap/tinygo:latest +FROM polywrap/tinygo:0.28.1-polywrap.2 # Copy wasm-snip COPY --from=rust /usr/local/cargo/bin/wasm-snip /usr/local/bin/ diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION index 7693c96bff..446ba66e7e 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION @@ -1 +1 @@ -0.1.3 \ No newline at end of file +0.1.4 \ No newline at end of file From 5dea0c37591a7d929723494c35f373fdcd79d5d4 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Wed, 12 Jul 2023 14:46:25 -0400 Subject: [PATCH 081/181] fix: golang binding transform --- packages/schema/bind/src/bindings/golang/types.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/packages/schema/bind/src/bindings/golang/types.ts b/packages/schema/bind/src/bindings/golang/types.ts index e57c1b9b88..a46ca959d0 100644 --- a/packages/schema/bind/src/bindings/golang/types.ts +++ b/packages/schema/bind/src/bindings/golang/types.ts @@ -16,3 +16,17 @@ export type BaseType = keyof BaseTypes; export function isBaseType(type: string): type is BaseType { return type in types; } + +const builtInTypes = { + BigInt: "BigInt", + BigNumber: "BigNumber", + JSON: "JSON", +}; + +export type BuiltInTypes = typeof builtInTypes; + +export type BuiltInType = keyof BuiltInTypes; + +export function isBuiltInType(type: string): type is BuiltInType { + return type in builtInTypes; +} From 42dafc77f8af6c9babbbed9e2220b8dc40cb1f36 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Wed, 12 Jul 2023 14:46:39 -0400 Subject: [PATCH 082/181] chore: docgen has been removed --- .../cli/src/__tests__/e2e/p1/help.spec.ts | 1 - .../src/__tests__/e2e/p1/no-command.spec.ts | 1 - .../cli/docgen/001-sanity/docs/module.md | 14 - .../docgen/002-custom-config/docs/module.md | 21 - .../003-custom-manifest-file/docs/module.md | 14 - .../docgen/004-app/docs/Ethereum_module.md | 256 ---------- .../docgen/004-app/docs/Ethereum_objects.md | 149 ------ .../cli/docgen/004-app/docs/Logger_enums.md | 18 - .../cli/docgen/004-app/docs/Logger_module.md | 15 - .../cases/cli/docgen/005-wasm/docs/module.md | 14 - .../cases/cli/docgen/005-wasm/docs/objects.md | 17 - .../cases/cli/docgen/006-plugin/docs/env.md | 15 - .../cli/docgen/006-plugin/docs/module.md | 23 - .../cli/docgen/006-plugin/docs/objects.md | 17 - .../cli/docgen/007-docusaurus/docs/enums.md | 16 - .../cli/docgen/007-docusaurus/docs/module.md | 15 - .../cli/docgen/007-docusaurus/docs/objects.md | 39 -- .../cases/cli/docgen/008-jsdoc/docs/enums.js | 10 - .../cases/cli/docgen/008-jsdoc/docs/module.js | 14 - .../cli/docgen/008-jsdoc/docs/objects.js | 32 -- .../009-schema/docs/generated-schema.graphql | 436 ------------------ yarn.lock | 78 ++-- 22 files changed, 35 insertions(+), 1180 deletions(-) delete mode 100644 packages/test-cases/cases/cli/docgen/001-sanity/docs/module.md delete mode 100644 packages/test-cases/cases/cli/docgen/002-custom-config/docs/module.md delete mode 100644 packages/test-cases/cases/cli/docgen/003-custom-manifest-file/docs/module.md delete mode 100644 packages/test-cases/cases/cli/docgen/004-app/docs/Ethereum_module.md delete mode 100644 packages/test-cases/cases/cli/docgen/004-app/docs/Ethereum_objects.md delete mode 100644 packages/test-cases/cases/cli/docgen/004-app/docs/Logger_enums.md delete mode 100644 packages/test-cases/cases/cli/docgen/004-app/docs/Logger_module.md delete mode 100644 packages/test-cases/cases/cli/docgen/005-wasm/docs/module.md delete mode 100644 packages/test-cases/cases/cli/docgen/005-wasm/docs/objects.md delete mode 100644 packages/test-cases/cases/cli/docgen/006-plugin/docs/env.md delete mode 100644 packages/test-cases/cases/cli/docgen/006-plugin/docs/module.md delete mode 100644 packages/test-cases/cases/cli/docgen/006-plugin/docs/objects.md delete mode 100644 packages/test-cases/cases/cli/docgen/007-docusaurus/docs/enums.md delete mode 100644 packages/test-cases/cases/cli/docgen/007-docusaurus/docs/module.md delete mode 100644 packages/test-cases/cases/cli/docgen/007-docusaurus/docs/objects.md delete mode 100644 packages/test-cases/cases/cli/docgen/008-jsdoc/docs/enums.js delete mode 100644 packages/test-cases/cases/cli/docgen/008-jsdoc/docs/module.js delete mode 100644 packages/test-cases/cases/cli/docgen/008-jsdoc/docs/objects.js delete mode 100644 packages/test-cases/cases/cli/docgen/009-schema/docs/generated-schema.graphql diff --git a/packages/cli/src/__tests__/e2e/p1/help.spec.ts b/packages/cli/src/__tests__/e2e/p1/help.spec.ts index 34e883a3a6..f8d71a857d 100644 --- a/packages/cli/src/__tests__/e2e/p1/help.spec.ts +++ b/packages/cli/src/__tests__/e2e/p1/help.spec.ts @@ -13,7 +13,6 @@ Commands: codegen|g [options] Generate Code For Polywrap Projects create|c Create New Projects deploy|d [options] Deploys Polywrap Projects - docgen|o [options] Generate wrapper documentation infra|i [options] Modular Infrastructure-As-Code Orchestrator manifest|m Inspect & Migrade Polywrap Manifests test|t [options] Execute Tests diff --git a/packages/cli/src/__tests__/e2e/p1/no-command.spec.ts b/packages/cli/src/__tests__/e2e/p1/no-command.spec.ts index 785821b0b4..3db13b855d 100644 --- a/packages/cli/src/__tests__/e2e/p1/no-command.spec.ts +++ b/packages/cli/src/__tests__/e2e/p1/no-command.spec.ts @@ -13,7 +13,6 @@ Commands: codegen|g [options] Generate Code For Polywrap Projects create|c Create New Projects deploy|d [options] Deploys Polywrap Projects - docgen|o [options] Generate wrapper documentation infra|i [options] Modular Infrastructure-As-Code Orchestrator manifest|m Inspect & Migrade Polywrap Manifests test|t [options] Execute Tests diff --git a/packages/test-cases/cases/cli/docgen/001-sanity/docs/module.md b/packages/test-cases/cases/cli/docgen/001-sanity/docs/module.md deleted file mode 100644 index a2abb12a0a..0000000000 --- a/packages/test-cases/cases/cli/docgen/001-sanity/docs/module.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -id: module -title: Module -sidebar_position: 1 ---- - -### method - -```graphql -method( - arg: String! -): String! -``` - diff --git a/packages/test-cases/cases/cli/docgen/002-custom-config/docs/module.md b/packages/test-cases/cases/cli/docgen/002-custom-config/docs/module.md deleted file mode 100644 index 46bf7e0d15..0000000000 --- a/packages/test-cases/cases/cli/docgen/002-custom-config/docs/module.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: module -title: Module -sidebar_position: 1 ---- - -### deployContract - -```graphql -deployContract( -): String! -``` - -### method - -```graphql -method( - arg: String! -): String! -``` - diff --git a/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/docs/module.md b/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/docs/module.md deleted file mode 100644 index a2abb12a0a..0000000000 --- a/packages/test-cases/cases/cli/docgen/003-custom-manifest-file/docs/module.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -id: module -title: Module -sidebar_position: 1 ---- - -### method - -```graphql -method( - arg: String! -): String! -``` - diff --git a/packages/test-cases/cases/cli/docgen/004-app/docs/Ethereum_module.md b/packages/test-cases/cases/cli/docgen/004-app/docs/Ethereum_module.md deleted file mode 100644 index 30ec3c9c04..0000000000 --- a/packages/test-cases/cases/cli/docgen/004-app/docs/Ethereum_module.md +++ /dev/null @@ -1,256 +0,0 @@ ---- -id: Ethereum_module -title: Ethereum Module -sidebar_position: 1 ---- - -### awaitTransaction - -```graphql -awaitTransaction( - txHash: String! - connection: Ethereum_Connection -): Ethereum_TxReceipt! -``` - -### callContractMethod - -```graphql -callContractMethod( - address: String! - method: String! - args: String[] - options: Ethereum_TxOptions - connection: Ethereum_Connection -): Ethereum_TxResponse! -``` - -### callContractMethodAndWait - -```graphql -callContractMethodAndWait( - address: String! - method: String! - args: String[] - options: Ethereum_TxOptions - connection: Ethereum_Connection -): Ethereum_TxReceipt! -``` - -### callContractStatic - -```graphql -callContractStatic( - address: String! - method: String! - args: String[] - options: Ethereum_TxOptions - connection: Ethereum_Connection -): Ethereum_StaticTxResult! -``` - -### callContractView - -```graphql -callContractView( - address: String! - method: String! - args: String[] - connection: Ethereum_Connection -): String! -``` - -### checkAddress - -```graphql -checkAddress( - address: String! - connection: Ethereum_Connection -): Boolean! -``` - -### decodeFunction - -```graphql -decodeFunction( - method: String! - data: String! - connection: Ethereum_Connection -): String[]! -``` - -### deployContract - -```graphql -deployContract( - abi: String! - bytecode: String! - args: String[] - options: Ethereum_TxOptions - connection: Ethereum_Connection -): String! -``` - -### encodeFunction - -```graphql -encodeFunction( - method: String! - args: String[] - connection: Ethereum_Connection -): String! -``` - -### encodeParams - -```graphql -encodeParams( - types: String[]! - values: String[]! - connection: Ethereum_Connection -): String! -``` - -### estimateContractCallGas - -```graphql -estimateContractCallGas( - address: String! - method: String! - args: String[] - options: Ethereum_TxOptions - connection: Ethereum_Connection -): BigInt! -``` - -### estimateEip1559Fees - -```graphql -estimateEip1559Fees( - connection: Ethereum_Connection -): Ethereum_Eip1559FeesEstimate! -``` - -### estimateTransactionGas - -```graphql -estimateTransactionGas( - tx: Ethereum_TxRequest! - connection: Ethereum_Connection -): BigInt! -``` - -### getBalance - -```graphql -getBalance( - address: String! - blockTag: BigInt - connection: Ethereum_Connection -): BigInt! -``` - -### getChainId - -```graphql -getChainId( - connection: Ethereum_Connection -): String! -``` - -### getGasPrice - -```graphql -getGasPrice( - connection: Ethereum_Connection -): BigInt! -``` - -### getSignerAddress - -```graphql -getSignerAddress( - connection: Ethereum_Connection -): String! -``` - -### getSignerBalance - -```graphql -getSignerBalance( - blockTag: BigInt - connection: Ethereum_Connection -): BigInt! -``` - -### getSignerTransactionCount - -```graphql -getSignerTransactionCount( - blockTag: BigInt - connection: Ethereum_Connection -): BigInt! -``` - -### sendRpc - -```graphql -sendRpc( - method: String! - params: String[]! - connection: Ethereum_Connection -): String! -``` - -### sendTransaction - -```graphql -sendTransaction( - tx: Ethereum_TxRequest! - connection: Ethereum_Connection -): Ethereum_TxResponse! -``` - -### sendTransactionAndWait - -```graphql -sendTransactionAndWait( - tx: Ethereum_TxRequest! - connection: Ethereum_Connection -): Ethereum_TxReceipt! -``` - -### signMessage - -```graphql -signMessage( - message: String! - connection: Ethereum_Connection -): String! -``` - -### signMessageBytes - -```graphql -signMessageBytes( - bytes: Bytes! - connection: Ethereum_Connection -): String! -``` - -### toEth - -```graphql -toEth( - wei: String! -): String! -``` - -### toWei - -```graphql -toWei( - eth: String! -): String! -``` - diff --git a/packages/test-cases/cases/cli/docgen/004-app/docs/Ethereum_objects.md b/packages/test-cases/cases/cli/docgen/004-app/docs/Ethereum_objects.md deleted file mode 100644 index 0bee987edc..0000000000 --- a/packages/test-cases/cases/cli/docgen/004-app/docs/Ethereum_objects.md +++ /dev/null @@ -1,149 +0,0 @@ ---- -id: Ethereum_objects -title: Ethereum Object Types -sidebar_position: 2 ---- - - -### Ethereum_AccessItem - -```graphql -type Ethereum_AccessItem { - address: String! - storageKeys: String[]! -} -``` - -### Ethereum_Connection - -```graphql -type Ethereum_Connection { - node: String - networkNameOrChainId: String -} -``` - -### Ethereum_Eip1559FeesEstimate - -```graphql -type Ethereum_Eip1559FeesEstimate { - maxFeePerGas: BigInt! - maxPriorityFeePerGas: BigInt! -} -``` - -### Ethereum_Log - -```graphql -type Ethereum_Log { - blockNumber: BigInt! - blockHash: String! - transactionIndex: UInt32! - removed: Boolean! - address: String! - data: String! - topics: String[]! - transactionHash: String! - logIndex: UInt32! -} -``` - -### Ethereum_StaticTxResult - -```graphql -type Ethereum_StaticTxResult { - result: String! - error: Boolean! -} -``` - -### Ethereum_TxOptions - -```graphql -type Ethereum_TxOptions { - gasLimit: BigInt # Gas supplied for the transaction - maxFeePerGas: BigInt # The max total fee to pay per unit of gas. -The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is ā€œrefundedā€ to the user. -This property is ignored when gasPrice is not null. - maxPriorityFeePerGas: BigInt # The gas price paid is baseFeePerGas + maxPriorityFeePerGas. -The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is ā€œrefundedā€ to the user. -This property is ignored when gasPrice is not null. - gasPrice: BigInt # The gas price for legacy transactions. -If this property is not null, a legacy transaction will be sent and maxFeePerGas and maxPriorityFeePerGas will be ignored. - value: BigInt # Ether value sent with transaction - nonce: UInt32 # Override default nonce -} -``` - -### Ethereum_TxReceipt - -```graphql -type Ethereum_TxReceipt { - to: String! - from: String! - contractAddress: String! - transactionIndex: UInt32! - root: String - gasUsed: BigInt! - logsBloom: String! - transactionHash: String! - logs: Ethereum_Log[]! - blockNumber: BigInt! - blockHash: String! - confirmations: UInt32! - cumulativeGasUsed: BigInt! - effectiveGasPrice: BigInt! - type: UInt32! - status: UInt32 -} -``` - -### Ethereum_TxRequest - -```graphql -type Ethereum_TxRequest { - to: String - from: String - data: String - type: UInt32 - chainId: BigInt - accessList: Ethereum_AccessItem[] - gasLimit: BigInt # Gas supplied for the transaction - maxFeePerGas: BigInt # The max total fee to pay per unit of gas. -The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is ā€œrefundedā€ to the user. -This property is ignored when gasPrice is not null. - maxPriorityFeePerGas: BigInt # The gas price paid is baseFeePerGas + maxPriorityFeePerGas. -The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is ā€œrefundedā€ to the user. -This property is ignored when gasPrice is not null. - gasPrice: BigInt # The gas price for legacy transactions. -If this property is not null, a legacy transaction will be sent and maxFeePerGas and maxPriorityFeePerGas will be ignored. - value: BigInt # Ether value sent with transaction - nonce: UInt32 # Override default nonce -} -``` - -### Ethereum_TxResponse - -```graphql -type Ethereum_TxResponse { - hash: String! - to: String - from: String! - nonce: UInt32! - gasLimit: BigInt! - maxFeePerGas: BigInt - maxPriorityFeePerGas: BigInt - gasPrice: BigInt - value: BigInt! - chainId: BigInt! - blockNumber: BigInt - blockHash: String - timestamp: UInt32 - r: String - s: String - v: UInt32 - type: UInt32 - accessList: Ethereum_AccessItem[] -} -``` - diff --git a/packages/test-cases/cases/cli/docgen/004-app/docs/Logger_enums.md b/packages/test-cases/cases/cli/docgen/004-app/docs/Logger_enums.md deleted file mode 100644 index c4cac40698..0000000000 --- a/packages/test-cases/cases/cli/docgen/004-app/docs/Logger_enums.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -id: Logger_enums -title: Logger Enum Types -sidebar_position: 3 ---- - - -### Logger_Logger_LogLevel - -```graphql -enum Logger_Logger_LogLevel { - DEBUG - INFO - WARN - ERROR -} -``` - diff --git a/packages/test-cases/cases/cli/docgen/004-app/docs/Logger_module.md b/packages/test-cases/cases/cli/docgen/004-app/docs/Logger_module.md deleted file mode 100644 index c483edc248..0000000000 --- a/packages/test-cases/cases/cli/docgen/004-app/docs/Logger_module.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: Logger_module -title: Logger Module -sidebar_position: 1 ---- - -### log - -```graphql -log( - level: Logger_Logger_LogLevel! - message: String! -): Boolean! -``` - diff --git a/packages/test-cases/cases/cli/docgen/005-wasm/docs/module.md b/packages/test-cases/cases/cli/docgen/005-wasm/docs/module.md deleted file mode 100644 index a2abb12a0a..0000000000 --- a/packages/test-cases/cases/cli/docgen/005-wasm/docs/module.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -id: module -title: Module -sidebar_position: 1 ---- - -### method - -```graphql -method( - arg: String! -): String! -``` - diff --git a/packages/test-cases/cases/cli/docgen/005-wasm/docs/objects.md b/packages/test-cases/cases/cli/docgen/005-wasm/docs/objects.md deleted file mode 100644 index 656ab28e09..0000000000 --- a/packages/test-cases/cases/cli/docgen/005-wasm/docs/objects.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -id: objects -title: Object Types -sidebar_position: 2 ---- - - -### Object - -```graphql -type Object { - uint: UInt! - bools: Boolean[]! - bites: Bytes -} -``` - diff --git a/packages/test-cases/cases/cli/docgen/006-plugin/docs/env.md b/packages/test-cases/cases/cli/docgen/006-plugin/docs/env.md deleted file mode 100644 index 277239ca0a..0000000000 --- a/packages/test-cases/cases/cli/docgen/006-plugin/docs/env.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: env -title: Env Type -sidebar_position: 4 ---- - - -### Env - -```graphql -type Env { - arg1: String! -} -``` - diff --git a/packages/test-cases/cases/cli/docgen/006-plugin/docs/module.md b/packages/test-cases/cases/cli/docgen/006-plugin/docs/module.md deleted file mode 100644 index 678ec7c901..0000000000 --- a/packages/test-cases/cases/cli/docgen/006-plugin/docs/module.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: module -title: Module -sidebar_position: 1 ---- - -### methodOne - -```graphql -methodOne( - str: String! - optStr: String -): Object! -``` - -### methodTwo - -```graphql -methodTwo( - arg: UInt32! -): String! -``` - diff --git a/packages/test-cases/cases/cli/docgen/006-plugin/docs/objects.md b/packages/test-cases/cases/cli/docgen/006-plugin/docs/objects.md deleted file mode 100644 index 794ce00c0a..0000000000 --- a/packages/test-cases/cases/cli/docgen/006-plugin/docs/objects.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -id: objects -title: Object Types -sidebar_position: 2 ---- - - -### Object - -```graphql -type Object { - u: UInt! - array: Boolean[]! - bytes: Bytes -} -``` - diff --git a/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/enums.md b/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/enums.md deleted file mode 100644 index f5467760a0..0000000000 --- a/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/enums.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -id: enums -title: Enum Types -sidebar_position: 3 ---- - - -### test - -```graphql -enum test { - ARG1 - ARG2 -} -``` - diff --git a/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/module.md b/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/module.md deleted file mode 100644 index d194ca9215..0000000000 --- a/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/module.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: module -title: Module -sidebar_position: 1 ---- - -### method - -```graphql -method( - str: String! - optStr: String -): Object! -``` - diff --git a/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/objects.md b/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/objects.md deleted file mode 100644 index 96a0bbdbc9..0000000000 --- a/packages/test-cases/cases/cli/docgen/007-docusaurus/docs/objects.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -id: objects -title: Object Types -sidebar_position: 2 ---- - - -### Object - -```graphql -type Object { - u: UInt! - array: Boolean[]! - bytes: Bytes -} -``` - -### Object2 - -_Test Comment_ - -```graphql -type Object2 { - u: UInt! # Test Comment - array: Boolean[]! # Test Comment - bytes: Bytes # Test Comment -} -``` - -### Object3 - -```graphql -type Object3 { - u: UInt! - array: Boolean[]! - bytes: Bytes -} -``` - diff --git a/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/enums.js b/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/enums.js deleted file mode 100644 index 81d229be22..0000000000 --- a/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/enums.js +++ /dev/null @@ -1,10 +0,0 @@ -/** -* Enum Types -* @module enums -*/ - -/** -* -* @typedef { } module:enums.test -*/ - diff --git a/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/module.js b/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/module.js deleted file mode 100644 index 1cea6bda95..0000000000 --- a/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/module.js +++ /dev/null @@ -1,14 +0,0 @@ -/** -* Module -* @module module -* -*/ - -/** -* -* @function module:method.method -* @param { String } str -* @param { String | null } optStr -* @returns { Object } -*/ - diff --git a/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/objects.js b/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/objects.js deleted file mode 100644 index 5ebf119cd0..0000000000 --- a/packages/test-cases/cases/cli/docgen/008-jsdoc/docs/objects.js +++ /dev/null @@ -1,32 +0,0 @@ -/** -* Object Types -* @module objects -*/ - -/** -* -* @typedef {Object} module:objects.Object -* -* @property { UInt } u -* @property { Boolean[] } array -* @property { Bytes } bytes -*/ - -/** -* Test Comment -* @typedef {Object} module:objects.Object2 -* -* @property { UInt } u Test Comment -* @property { Boolean[] } array Test Comment -* @property { Bytes } bytes Test Comment -*/ - -/** -* -* @typedef {Object} module:objects.Object3 -* -* @property { UInt } u -* @property { Boolean[] } array -* @property { Bytes } bytes -*/ - diff --git a/packages/test-cases/cases/cli/docgen/009-schema/docs/generated-schema.graphql b/packages/test-cases/cases/cli/docgen/009-schema/docs/generated-schema.graphql deleted file mode 100644 index 398f33cac6..0000000000 --- a/packages/test-cases/cases/cli/docgen/009-schema/docs/generated-schema.graphql +++ /dev/null @@ -1,436 +0,0 @@ -### Polywrap Header START ### -scalar UInt -scalar UInt8 -scalar UInt16 -scalar UInt32 -scalar Int -scalar Int8 -scalar Int16 -scalar Int32 -scalar Bytes -scalar BigInt -scalar BigNumber -scalar JSON -scalar Map - -directive @imported( - uri: String! - namespace: String! - nativeType: String! -) on OBJECT | ENUM - -directive @imports( - types: [String!]! -) on OBJECT - -directive @capability( - type: String! - uri: String! - namespace: String! -) repeatable on OBJECT - -directive @enabled_interface on OBJECT - -directive @annotate(type: String!) on FIELD - -directive @env(required: Boolean!) on FIELD_DEFINITION - -### Polywrap Header END ### - -type Module @imports( - types: [ - "Ethereum_Module", - "Ethereum_Connection", - "Ethereum_TxOptions", - "Ethereum_StaticTxResult", - "Ethereum_Eip1559FeesEstimate", - "Ethereum_TxRequest", - "Ethereum_AccessItem", - "Ethereum_TxReceipt", - "Ethereum_Log", - "Ethereum_TxResponse" - ] -) { - method( - str: String! - optStr: String - ): Object! -} - -type Object { - u: UInt! - array: [Boolean!]! - bytes: Bytes -} - -""" -Test Comment -""" -type Object2 { - """ - Test Comment - """ - u: UInt! - """ - Test Comment - """ - array: [Boolean!]! - """ - Test Comment - """ - bytes: Bytes -} - -type Object3 { - u: UInt! - array: [Boolean!]! - bytes: Bytes -} - -enum test { - ARG1 - ARG2 -} - -### Imported Modules START ### - -type Ethereum_Module @imported( - uri: "ens/wraps.eth:ethereum@1.0.0", - namespace: "Ethereum", - nativeType: "Module" -) { - getChainId( - connection: Ethereum_Connection - ): String! - - callContractView( - address: String! - method: String! - args: [String!] - connection: Ethereum_Connection - ): String! - - callContractStatic( - address: String! - method: String! - args: [String!] - options: Ethereum_TxOptions - connection: Ethereum_Connection - ): Ethereum_StaticTxResult! - - encodeParams( - types: [String!]! - values: [String!]! - connection: Ethereum_Connection - ): String! - - encodeFunction( - method: String! - args: [String!] - connection: Ethereum_Connection - ): String! - - decodeFunction( - method: String! - data: String! - connection: Ethereum_Connection - ): [String!]! - - getSignerAddress( - connection: Ethereum_Connection - ): String! - - getSignerBalance( - blockTag: BigInt - connection: Ethereum_Connection - ): BigInt! - - getBalance( - address: String! - blockTag: BigInt - connection: Ethereum_Connection - ): BigInt! - - getGasPrice( - connection: Ethereum_Connection - ): BigInt! - - estimateEip1559Fees( - connection: Ethereum_Connection - ): Ethereum_Eip1559FeesEstimate! - - sendRpc( - method: String! - params: [String!]! - connection: Ethereum_Connection - ): String! - - getSignerTransactionCount( - blockTag: BigInt - connection: Ethereum_Connection - ): BigInt! - - checkAddress( - address: String! - connection: Ethereum_Connection - ): Boolean! - - toWei( - eth: String! - ): String! - - toEth( - wei: String! - ): String! - - estimateTransactionGas( - tx: Ethereum_TxRequest! - connection: Ethereum_Connection - ): BigInt! - - awaitTransaction( - txHash: String! - connection: Ethereum_Connection - ): Ethereum_TxReceipt! - - sendTransaction( - tx: Ethereum_TxRequest! - connection: Ethereum_Connection - ): Ethereum_TxResponse! - - sendTransactionAndWait( - tx: Ethereum_TxRequest! - connection: Ethereum_Connection - ): Ethereum_TxReceipt! - - deployContract( - abi: String! - bytecode: String! - args: [String!] - options: Ethereum_TxOptions - connection: Ethereum_Connection - ): String! - - estimateContractCallGas( - address: String! - method: String! - args: [String!] - options: Ethereum_TxOptions - connection: Ethereum_Connection - ): BigInt! - - callContractMethod( - address: String! - method: String! - args: [String!] - options: Ethereum_TxOptions - connection: Ethereum_Connection - ): Ethereum_TxResponse! - - callContractMethodAndWait( - address: String! - method: String! - args: [String!] - options: Ethereum_TxOptions - connection: Ethereum_Connection - ): Ethereum_TxReceipt! - - signMessage( - message: String! - connection: Ethereum_Connection - ): String! - - signMessageBytes( - bytes: Bytes! - connection: Ethereum_Connection - ): String! -} - -### Imported Modules END ### - -### Imported Objects START ### - -type Ethereum_Connection @imported( - uri: "ens/wraps.eth:ethereum@1.0.0", - namespace: "Ethereum", - nativeType: "Connection" -) { - node: String - networkNameOrChainId: String -} - -type Ethereum_TxOptions @imported( - uri: "ens/wraps.eth:ethereum@1.0.0", - namespace: "Ethereum", - nativeType: "TxOptions" -) { - """ - Gas supplied for the transaction - """ - gasLimit: BigInt - """ - The max total fee to pay per unit of gas. -The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is ā€œrefundedā€ to the user. -This property is ignored when gasPrice is not null. - """ - maxFeePerGas: BigInt - """ - The gas price paid is baseFeePerGas + maxPriorityFeePerGas. -The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is ā€œrefundedā€ to the user. -This property is ignored when gasPrice is not null. - """ - maxPriorityFeePerGas: BigInt - """ - The gas price for legacy transactions. -If this property is not null, a legacy transaction will be sent and maxFeePerGas and maxPriorityFeePerGas will be ignored. - """ - gasPrice: BigInt - """ - Ether value sent with transaction - """ - value: BigInt - """ - Override default nonce - """ - nonce: UInt32 -} - -type Ethereum_StaticTxResult @imported( - uri: "ens/wraps.eth:ethereum@1.0.0", - namespace: "Ethereum", - nativeType: "StaticTxResult" -) { - result: String! - error: Boolean! -} - -type Ethereum_Eip1559FeesEstimate @imported( - uri: "ens/wraps.eth:ethereum@1.0.0", - namespace: "Ethereum", - nativeType: "Eip1559FeesEstimate" -) { - maxFeePerGas: BigInt! - maxPriorityFeePerGas: BigInt! -} - -type Ethereum_TxRequest @imported( - uri: "ens/wraps.eth:ethereum@1.0.0", - namespace: "Ethereum", - nativeType: "TxRequest" -) { - to: String - from: String - data: String - type: UInt32 - chainId: BigInt - accessList: [Ethereum_AccessItem!] - """ - Gas supplied for the transaction - """ - gasLimit: BigInt - """ - The max total fee to pay per unit of gas. -The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is ā€œrefundedā€ to the user. -This property is ignored when gasPrice is not null. - """ - maxFeePerGas: BigInt - """ - The gas price paid is baseFeePerGas + maxPriorityFeePerGas. -The difference between maxFeePerGas and baseFeePerGas + maxPriorityFeePerGas is ā€œrefundedā€ to the user. -This property is ignored when gasPrice is not null. - """ - maxPriorityFeePerGas: BigInt - """ - The gas price for legacy transactions. -If this property is not null, a legacy transaction will be sent and maxFeePerGas and maxPriorityFeePerGas will be ignored. - """ - gasPrice: BigInt - """ - Ether value sent with transaction - """ - value: BigInt - """ - Override default nonce - """ - nonce: UInt32 -} - -type Ethereum_AccessItem @imported( - uri: "ens/wraps.eth:ethereum@1.0.0", - namespace: "Ethereum", - nativeType: "AccessItem" -) { - address: String! - storageKeys: [String!]! -} - -type Ethereum_TxReceipt @imported( - uri: "ens/wraps.eth:ethereum@1.0.0", - namespace: "Ethereum", - nativeType: "TxReceipt" -) { - to: String! - from: String! - contractAddress: String! - transactionIndex: UInt32! - root: String - gasUsed: BigInt! - logsBloom: String! - transactionHash: String! - logs: [Ethereum_Log!]! - blockNumber: BigInt! - blockHash: String! - confirmations: UInt32! - cumulativeGasUsed: BigInt! - effectiveGasPrice: BigInt! - type: UInt32! - status: UInt32 -} - -type Ethereum_Log @imported( - uri: "ens/wraps.eth:ethereum@1.0.0", - namespace: "Ethereum", - nativeType: "Log" -) { - blockNumber: BigInt! - blockHash: String! - transactionIndex: UInt32! - removed: Boolean! - address: String! - data: String! - topics: [String!]! - transactionHash: String! - logIndex: UInt32! -} - -type Ethereum_TxResponse @imported( - uri: "ens/wraps.eth:ethereum@1.0.0", - namespace: "Ethereum", - nativeType: "TxResponse" -) { - hash: String! - to: String - from: String! - nonce: UInt32! - gasLimit: BigInt! - maxFeePerGas: BigInt - maxPriorityFeePerGas: BigInt - gasPrice: BigInt - value: BigInt! - chainId: BigInt! - blockNumber: BigInt - blockHash: String - timestamp: UInt32 - r: String - s: String - v: UInt32 - type: UInt32 - accessList: [Ethereum_AccessItem!] -} - -### Imported Objects END ### - -### Imported Envs START ### - -### Imported Envs END ### - diff --git a/yarn.lock b/yarn.lock index 077a866301..2185460b6b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -113,52 +113,52 @@ dependencies: "@babel/highlight" "^7.22.5" -"@babel/compat-data@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.6.tgz#15606a20341de59ba02cd2fcc5086fcbe73bf544" - integrity sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg== +"@babel/compat-data@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" + integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== "@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.5": - version "7.22.8" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.8.tgz#386470abe884302db9c82e8e5e87be9e46c86785" - integrity sha512-75+KxFB4CZqYRXjx4NlR4J7yGvKumBuZTmV4NV6v09dVXXkuYVYLT68N6HCzLvfJ+fWCxQsntNzKwwIXL4bHnw== + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.9.tgz#bd96492c68822198f33e8a256061da3cf391f58f" + integrity sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.22.5" - "@babel/generator" "^7.22.7" - "@babel/helper-compilation-targets" "^7.22.6" - "@babel/helper-module-transforms" "^7.22.5" + "@babel/generator" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.9" + "@babel/helper-module-transforms" "^7.22.9" "@babel/helpers" "^7.22.6" "@babel/parser" "^7.22.7" "@babel/template" "^7.22.5" "@babel/traverse" "^7.22.8" "@babel/types" "^7.22.5" - "@nicolo-ribaudo/semver-v6" "^6.3.3" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.2" + semver "^6.3.1" -"@babel/generator@^7.22.7": - version "7.22.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.7.tgz#a6b8152d5a621893f2c9dacf9a4e286d520633d5" - integrity sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ== +"@babel/generator@^7.22.7", "@babel/generator@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.9.tgz#572ecfa7a31002fa1de2a9d91621fd895da8493d" + integrity sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw== dependencies: "@babel/types" "^7.22.5" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/helper-compilation-targets@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz#e30d61abe9480aa5a83232eb31c111be922d2e52" - integrity sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA== +"@babel/helper-compilation-targets@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz#f9d0a7aaaa7cd32a3f31c9316a69f5a9bcacb892" + integrity sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw== dependencies: - "@babel/compat-data" "^7.22.6" + "@babel/compat-data" "^7.22.9" "@babel/helper-validator-option" "^7.22.5" - "@nicolo-ribaudo/semver-v6" "^6.3.3" browserslist "^4.21.9" lru-cache "^5.1.1" + semver "^6.3.1" "@babel/helper-environment-visitor@^7.22.5": version "7.22.5" @@ -187,19 +187,16 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-module-transforms@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz#0f65daa0716961b6e96b164034e737f60a80d2ef" - integrity sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw== +"@babel/helper-module-transforms@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz#92dfcb1fbbb2bc62529024f72d942a8c97142129" + integrity sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ== dependencies: "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-module-imports" "^7.22.5" "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" "@babel/helper-validator-identifier" "^7.22.5" - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.5" - "@babel/types" "^7.22.5" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0": version "7.22.5" @@ -213,7 +210,7 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-split-export-declaration@^7.22.5", "@babel/helper-split-export-declaration@^7.22.6": +"@babel/helper-split-export-declaration@^7.22.6": version "7.22.6" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== @@ -351,7 +348,7 @@ "@babel/parser" "^7.22.5" "@babel/types" "^7.22.5" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.22.5", "@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8": +"@babel/traverse@^7.1.0", "@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8": version "7.22.8" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.8.tgz#4d4451d31bc34efeae01eac222b514a77aa4000e" integrity sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw== @@ -1858,11 +1855,6 @@ resolved "https://registry.yarnpkg.com/@msgpack/msgpack/-/msgpack-2.7.2.tgz#f34b8aa0c49f0dd55eb7eba577081299cbf3f90b" integrity sha512-rYEi46+gIzufyYUAoHDnRzkWGxajpD9vVXFQ3g1vbjrBm6P7MBmm+s/fqPa46sxa+8FOUdEuRQKaugo5a4JWpw== -"@nicolo-ribaudo/semver-v6@^6.3.3": - version "6.3.3" - resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz#ea6d23ade78a325f7a52750aab1526b02b628c29" - integrity sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg== - "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -3671,9 +3663,9 @@ camelcase@^6.0.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001503: - version "1.0.30001514" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001514.tgz#e2a7e184a23affc9367b7c8d734e7ec4628c1309" - integrity sha512-ENcIpYBmwAAOm/V2cXgM7rZUrKKaqisZl4ZAI520FIkqGXUxJjmaIssbRW5HVVR5tyV6ygTLIm15aU8LUmQSaQ== + version "1.0.30001515" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001515.tgz#418aefeed9d024cd3129bfae0ccc782d4cb8f12b" + integrity sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA== capture-exit@^2.0.0: version "2.0.0" @@ -4448,9 +4440,9 @@ ecc-jsbn@~0.1.1: safer-buffer "^2.1.0" electron-to-chromium@^1.4.431: - version "1.4.455" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.455.tgz#81fe4353ac970eb971c07088c8da8b7f6280ddc9" - integrity sha512-8tgdX0Odl24LtmLwxotpJCVjIndN559AvaOtd67u+2mo+IDsgsTF580NB+uuDCqsHw8yFg53l5+imFV9Fw3cbA== + version "1.4.457" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.457.tgz#3fdc7b4f97d628ac6b51e8b4b385befb362fe343" + integrity sha512-/g3UyNDmDd6ebeWapmAoiyy+Sy2HyJ+/X8KyvNeHfKRFfHaA2W8oF5fxD5F3tjBDcjpwo0iek6YNgxNXDBoEtA== elliptic@6.5.4: version "6.5.4" @@ -8911,7 +8903,7 @@ semver@7.x, semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^ dependencies: lru-cache "^6.0.0" -semver@^6.0.0, semver@^6.3.0: +semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== From f735dfba5ce9bb6f80166a92c833ce4666fb732f Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Wed, 12 Jul 2023 21:11:26 +0200 Subject: [PATCH 083/181] chore: update to latest docker image --- .../cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts | 2 +- .../build-strategies/wasm/golang/image/Dockerfile.mustache | 2 +- .../defaults/build-strategies/wasm/golang/vm/vm-script.mustache | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts index 72a532f73b..5ed76e6903 100644 --- a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts +++ b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts @@ -46,7 +46,7 @@ const CONFIGS: Record = { "wasm/golang": { defaultIncludes: ["go.mod", "go.sum"], baseImage: "polywrap/vm-base-go", - version: "0.1.2", + version: "0.1.4", }, }; diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache index 4385711874..7f4870de73 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache @@ -1,4 +1,4 @@ -FROM polywrap/vm-base-go:0.1.0 +FROM polywrap/vm-base-go:0.1.4 WORKDIR /project diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache index 390359e144..715d7b3eb7 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache @@ -8,4 +8,4 @@ tinygo build -o main.wasm -target wasm-target ./module/wrap/main/main.go rm -rf ./build mkdir ./build -wasm-snip ./main.wasm -o ./build/wrap.wasm -p fd_write clock_time_get args_sizes_get args_get \ No newline at end of file +wasm-snip ./main.wasm -o ./build/wrap.wasm -p fd_write clock_time_get args_sizes_get args_get From d8cae0e5a7b4110232c99420c2ca46bdc4d164d4 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Wed, 12 Jul 2023 21:12:03 +0200 Subject: [PATCH 084/181] chore: update bindings to latest go-wrap repo --- .../schema/bind/src/bindings/golang/functions.ts | 2 +- .../wasm/templates/env-type/Env%type%-go.mustache | 2 +- .../env-type/Env%type%Serialization-go.mustache | 2 +- .../imported/env-type/Env%type%-go.mustache | 2 +- .../env-type/Env%type%Serialization-go.mustache | 2 +- .../imported/interface-type/%type%-go.mustache | 4 ++-- .../module-type/%type%Serialization-go.mustache | 2 +- .../imported/module-type/%type%Wrapped-go.mustache | 6 +++--- .../imported/object-type/Object%type%-go.mustache | 2 +- .../Object%type%Serialization-go.mustache | 2 +- .../templates/interface-type/%type%-go.mustache | 4 ++-- .../golang/wasm/templates/main/main-go.mustache | 8 ++++---- .../module_wrapped/%type%Serialization-go.mustache | 2 +- .../module_wrapped/%type%Wrapped-go.mustache | 4 ++-- .../templates/object-type/Object%type%-go.mustache | 2 +- .../Object%type%Serialization-go.mustache | 2 +- .../imported/test_import/env_test_import__env.go | 2 +- .../env_test_import__env_serialization.go | 2 +- .../object_test_import__another_object.go | 2 +- ...ct_test_import__another_object_serialization.go | 2 +- .../test_import/object_test_import__object.go | 2 +- .../object_test_import__object_serialization.go | 2 +- .../test_import__module_serialization.go | 2 +- .../test_import/test_import__module_wrapped.go | 8 ++++---- .../output/wasm-go/interfaces/test_import.go | 4 ++-- .../cases/bind/sanity/output/wasm-go/main/main.go | 14 +++++++------- .../wasm-go/module_wrapped/module_serialization.go | 2 +- .../wasm-go/module_wrapped/module_wrapped.go | 6 +++--- .../output/wasm-go/types/object_another_type.go | 2 +- .../types/object_another_type_serialization.go | 2 +- .../wasm-go/types/object_custom_map_value.go | 2 +- .../types/object_custom_map_value_serialization.go | 2 +- .../output/wasm-go/types/object_custom_type.go | 4 ++-- .../types/object_custom_type_serialization.go | 4 ++-- .../bind/sanity/output/wasm-go/types/object_env.go | 2 +- .../wasm-go/types/object_env_serialization.go | 2 +- .../bind/sanity/output/wasm-go/types/objectelse.go | 2 +- .../wasm-go/types/objectelse_serialization.go | 2 +- 38 files changed, 60 insertions(+), 60 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/functions.ts b/packages/schema/bind/src/bindings/golang/functions.ts index 25fab09a04..9aacbeaf7b 100644 --- a/packages/schema/bind/src/bindings/golang/functions.ts +++ b/packages/schema/bind/src/bindings/golang/functions.ts @@ -103,7 +103,7 @@ export const makeImports: MustacheFn = () => { t = t.trim(); if (t.endsWith("big.Int")) { exist[ - "github.com/polywrap/go-wrap/polywrap/msgpack/big" + "github.com/polywrap/go-wrap/msgpack/big" ] = true; } else if (t.endsWith("fastjson.Value")) { exist["github.com/valyala/fastjson"] = true; diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache index 2fbba933cb..0810ab36de 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache @@ -1,6 +1,6 @@ package types -{{#makeImports}}github.com/polywrap/go-wrap/polywrap/msgpack,{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} +{{#makeImports}}github.com/polywrap/go-wrap/msgpack,{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} type {{#toUpper}}{{type}}{{/toUpper}} struct { {{#stuctProps}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache index bb107d2031..03f0b548fa 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache @@ -1,6 +1,6 @@ package types -{{#makeImports}}github.com/polywrap/go-wrap/polywrap/msgpack,{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} +{{#makeImports}}github.com/polywrap/go-wrap/msgpack,{{#properties}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}}{{/properties}}{{/makeImports}} func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toUpper}}) []byte { ctx := msgpack.NewContext("Serializing (encoding) env-type: {{#toUpper}}{{type}}{{/toUpper}}") diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache index 9901f3f3a7..3c230b9f9a 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache @@ -1,6 +1,6 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} {{#makeImports}} - github.com/polywrap/go-wrap/polywrap/msgpack, + github.com/polywrap/go-wrap/msgpack, {{#properties}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} {{/properties}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache index 1157ba4df3..0b03fc04e1 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache @@ -1,6 +1,6 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} {{#makeImports}} - github.com/polywrap/go-wrap/polywrap/msgpack, + github.com/polywrap/go-wrap/msgpack, {{#properties}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} {{/properties}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/interface-type/%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/interface-type/%type%-go.mustache index 48534a0418..bc55d77962 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/interface-type/%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/interface-type/%type%-go.mustache @@ -3,7 +3,7 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} {{#capabilities}} {{#getImplementations}} {{#enabled}} -import "github.com/polywrap/go-wrap/polywrap" +import "github.com/polywrap/go-wrap/wrap" {{/enabled}} {{/getImplementations}} {{/capabilities}} @@ -12,7 +12,7 @@ import "github.com/polywrap/go-wrap/polywrap" {{#getImplementations}} {{#enabled}} func {{#toUpper}}{{namespace}}{{/toUpper}}Implementations() []string { - return polywrap.WrapGetImplementations("{{uri}}") + return wrap.WrapGetImplementations("{{uri}}") } {{/enabled}} {{/getImplementations}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache index 039023a802..fefba92470 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache @@ -1,6 +1,6 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} {{#makeImports}} - github.com/polywrap/go-wrap/polywrap/msgpack, + github.com/polywrap/go-wrap/msgpack, {{#arguments}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} {{/arguments}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache index 6354293f91..b098e0a36f 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache @@ -2,7 +2,7 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} {{#methods.length}} import ( - "github.com/polywrap/go-wrap/polywrap" + "github.com/polywrap/go-wrap/wrap" ) {{/methods.length}} @@ -15,7 +15,7 @@ func {{#toUpper}}{{type}}{{/toUpper}}{{#toUpper}}{{name}}{{/toUpper}}(args *Args raw []byte data {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}} ) - raw, err = polywrap.WrapSubinvoke("{{uri}}", "{{name}}", argsBuf) + raw, err = wrap.WrapSubinvoke("{{uri}}", "{{name}}", argsBuf) if err == nil { data = Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(raw) } @@ -35,7 +35,7 @@ func {{#toUpper}}{{type}}{{/toUpper}}{{#toUpper}}{{name}}{{/toUpper}}(uri string raw []byte data {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}} ) - raw, err = polywrap.WrapSubinvokeImplementation("{{uri}}", uri, "{{name}}", argsBuf) + raw, err = wrap.WrapSubinvokeImplementation("{{uri}}", uri, "{{name}}", argsBuf) if err == nil { data = Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(raw) } diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache index 9901f3f3a7..3c230b9f9a 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache @@ -1,6 +1,6 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} {{#makeImports}} - github.com/polywrap/go-wrap/polywrap/msgpack, + github.com/polywrap/go-wrap/msgpack, {{#properties}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} {{/properties}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache index a3c8df5fbb..4620a8e956 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache @@ -1,6 +1,6 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} {{#makeImports}} - github.com/polywrap/go-wrap/polywrap/msgpack, + github.com/polywrap/go-wrap/msgpack, {{#properties}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} {{/properties}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/interface-type/%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/interface-type/%type%-go.mustache index 4e32c4aeea..a3fa1c1a68 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/interface-type/%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/interface-type/%type%-go.mustache @@ -3,7 +3,7 @@ package interfaces {{#capabilities}} {{#getImplementations}} {{#enabled}} -import "github.com/polywrap/go-wrap/polywrap" +import "github.com/polywrap/go-wrap/wrap" {{/enabled}} {{/getImplementations}} {{/capabilities}} @@ -12,7 +12,7 @@ import "github.com/polywrap/go-wrap/polywrap" {{#getImplementations}} {{#enabled}} func {{#toUpper}}{{namespace}}{{/toUpper}}Implementations() []string { - return polywrap.WrapGetImplementations("{{uri}}") + return wrap.WrapGetImplementations("{{uri}}") } {{/enabled}} {{/getImplementations}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/main/main-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/main/main-go.mustache index dfd495835a..583f70dacd 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/main/main-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/main/main-go.mustache @@ -2,21 +2,21 @@ package main import ( "{{goImport}}/module/wrap/module_wrapped" - "github.com/polywrap/go-wrap/polywrap" + "github.com/polywrap/go-wrap/wrap" ) //export _wrap_invoke func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { - args := polywrap.WrapInvokeArgs(methodSize, argsSize) + args := wrap.WrapInvokeArgs(methodSize, argsSize) switch args.Method { {{#moduleType}} {{#methods}} case "{{name}}": - return polywrap.WrapInvoke(args, envSize, module_wrapped.{{#toUpper}}{{name}}{{/toUpper}}Wrapped) + return wrap.WrapInvoke(args, envSize, module_wrapped.{{#toUpper}}{{name}}{{/toUpper}}Wrapped) {{/methods}} {{/moduleType}} default: - return polywrap.WrapInvoke(args, envSize, nil) + return wrap.WrapInvoke(args, envSize, nil) } } diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache index 552612599a..9bb91ba9a8 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache @@ -1,6 +1,6 @@ package module_wrapped {{#makeImports}} - github.com/polywrap/go-wrap/polywrap/msgpack, + github.com/polywrap/go-wrap/msgpack, . {{goImport}}/module/wrap/types, {{#importedTypes}} . {{goImport}}/module/wrap/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache index 24ac51d231..9e19e28d88 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache @@ -1,6 +1,6 @@ package module_wrapped {{#makeImports}} - {{#methods}}{{#env}}github.com/polywrap/go-wrap/polywrap,. {{goImport}}/module/wrap/types,{{/env}}{{/methods}} + {{#methods}}{{#env}}github.com/polywrap/go-wrap/wrap,. {{goImport}}/module/wrap/types,{{/env}}{{/methods}} {{goImport}}/module as methods, {{/makeImports}} {{#methods}} @@ -13,7 +13,7 @@ func {{#toUpper}}{{name}}{{/toUpper}}Wrapped(argsBuf []byte, envSize uint32) []b } {{/required}} if envSize > 0 { - envBuf := polywrap.WrapLoadEnv(envSize) + envBuf := wrap.WrapLoadEnv(envSize) env = EnvFromBuffer(envBuf) } {{/env}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache index 6485d72865..e9576bcbc9 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache @@ -1,6 +1,6 @@ package types {{#makeImports}} - github.com/polywrap/go-wrap/polywrap/msgpack, + github.com/polywrap/go-wrap/msgpack, {{#properties}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} {{/properties}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache index 0531e1f9a2..b858842c79 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache @@ -1,6 +1,6 @@ package types {{#makeImports}} - github.com/polywrap/go-wrap/polywrap/msgpack, + github.com/polywrap/go-wrap/msgpack, {{#properties}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{^last}},{{/last}} {{/properties}} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go index fea45b5c0f..81cdbc86bc 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go @@ -1,7 +1,7 @@ package test_import import ( - "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/msgpack" ) type TestImport_Env struct { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go index d4cbc7936e..03532e9d99 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go @@ -1,7 +1,7 @@ package test_import import ( - "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/msgpack" ) func serializeTestImport_Env(value *TestImport_Env) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object.go index 027a991bc5..1f524b3ac0 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object.go @@ -1,7 +1,7 @@ package test_import import ( - "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/msgpack" ) type TestImport_AnotherObject struct { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object_serialization.go index 3cfa4e63db..a92be912ea 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object_serialization.go @@ -1,7 +1,7 @@ package test_import import ( - "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/msgpack" ) func serializeTestImport_AnotherObject(value *TestImport_AnotherObject) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object.go index c4c6cafbc6..1df2cf8297 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object.go @@ -1,7 +1,7 @@ package test_import import ( - "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/msgpack" ) type TestImport_Object struct { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go index f2c7c52ae6..e35e49689b 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go @@ -1,7 +1,7 @@ package test_import import ( - "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/msgpack" ) func serializeTestImport_Object(value *TestImport_Object) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go index 032f87aa14..d1456a2036 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go @@ -1,7 +1,7 @@ package test_import import ( - "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/msgpack" ) type ArgsImportedMethod struct { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go index bb1cefafe8..b35afbfa71 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go @@ -1,7 +1,7 @@ package test_import import ( - "github.com/polywrap/go-wrap/polywrap" + "github.com/polywrap/go-wrap/wrap" ) func MethodImportedMethod(uri string, args *ArgsImportedMethod) (*TestImport_Object, error) { @@ -11,7 +11,7 @@ func MethodImportedMethod(uri string, args *ArgsImportedMethod) (*TestImport_Obj raw []byte data *TestImport_Object ) - raw, err = polywrap.WrapSubinvokeImplementation("testimport.uri.eth", uri, "importedMethod", argsBuf) + raw, err = wrap.WrapSubinvokeImplementation("testimport.uri.eth", uri, "importedMethod", argsBuf) if err == nil { data = DeserializeImportedMethodResult(raw) } @@ -25,7 +25,7 @@ func MethodAnotherMethod(uri string, args *ArgsAnotherMethod) (int32, error) { raw []byte data int32 ) - raw, err = polywrap.WrapSubinvokeImplementation("testimport.uri.eth", uri, "anotherMethod", argsBuf) + raw, err = wrap.WrapSubinvokeImplementation("testimport.uri.eth", uri, "anotherMethod", argsBuf) if err == nil { data = DeserializeAnotherMethodResult(raw) } @@ -39,7 +39,7 @@ func MethodReturnsArrayOfEnums(uri string, args *ArgsReturnsArrayOfEnums) ([]*Te raw []byte data []*TestImport_Enum_Return ) - raw, err = polywrap.WrapSubinvokeImplementation("testimport.uri.eth", uri, "returnsArrayOfEnums", argsBuf) + raw, err = wrap.WrapSubinvokeImplementation("testimport.uri.eth", uri, "returnsArrayOfEnums", argsBuf) if err == nil { data = DeserializeReturnsArrayOfEnumsResult(raw) } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/interfaces/test_import.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/interfaces/test_import.go index 405f79c9a7..7ae06bfb28 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/interfaces/test_import.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/interfaces/test_import.go @@ -1,7 +1,7 @@ package interfaces -import "github.com/polywrap/go-wrap/polywrap" +import "github.com/polywrap/go-wrap/wrap" func TestImportImplementations() []string { - return polywrap.WrapGetImplementations("testimport.uri.eth") + return wrap.WrapGetImplementations("testimport.uri.eth") } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/main/main.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/main/main.go index 4c9f9939cf..46bbee1c6d 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/main/main.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/main/main.go @@ -2,23 +2,23 @@ package main import ( "github.com/testorg/testrepo/module/wrap/module_wrapped" - "github.com/polywrap/go-wrap/polywrap" + "github.com/polywrap/go-wrap/wrap" ) //export _wrap_invoke func _wrap_invoke(methodSize, argsSize, envSize uint32) bool { - args := polywrap.WrapInvokeArgs(methodSize, argsSize) + args := wrap.WrapInvokeArgs(methodSize, argsSize) switch args.Method { case "moduleMethod": - return polywrap.WrapInvoke(args, envSize, module_wrapped.ModuleMethodWrapped) + return wrap.WrapInvoke(args, envSize, module_wrapped.ModuleMethodWrapped) case "objectMethod": - return polywrap.WrapInvoke(args, envSize, module_wrapped.ObjectMethodWrapped) + return wrap.WrapInvoke(args, envSize, module_wrapped.ObjectMethodWrapped) case "optionalEnvMethod": - return polywrap.WrapInvoke(args, envSize, module_wrapped.OptionalEnvMethodWrapped) + return wrap.WrapInvoke(args, envSize, module_wrapped.OptionalEnvMethodWrapped) case "if": - return polywrap.WrapInvoke(args, envSize, module_wrapped.IfWrapped) + return wrap.WrapInvoke(args, envSize, module_wrapped.IfWrapped) default: - return polywrap.WrapInvoke(args, envSize, nil) + return wrap.WrapInvoke(args, envSize, nil) } } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_serialization.go index 19b7b664c0..920d1f45b0 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_serialization.go @@ -2,7 +2,7 @@ package module_wrapped import ( . "github.com/testorg/testrepo/module/wrap/types" - "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/msgpack" ) func DeserializeModuleMethodArgs(argsBuf []byte) *MethodArgsModuleMethod { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_wrapped.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_wrapped.go index 69e5da455d..037cab3ab6 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_wrapped.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_wrapped.go @@ -2,7 +2,7 @@ package module_wrapped import ( . "github.com/testorg/testrepo/module/wrap/types" - "github.com/polywrap/go-wrap/polywrap" + "github.com/polywrap/go-wrap/wrap" methods "github.com/testorg/testrepo/module" ) @@ -20,7 +20,7 @@ func ObjectMethodWrapped(argsBuf []byte, envSize uint32) []byte { panic("Environment is not set, and it is required by method 'objectMethod'") } if envSize > 0 { - envBuf := polywrap.WrapLoadEnv(envSize) + envBuf := wrap.WrapLoadEnv(envSize) env = EnvFromBuffer(envBuf) } @@ -33,7 +33,7 @@ func ObjectMethodWrapped(argsBuf []byte, envSize uint32) []byte { func OptionalEnvMethodWrapped(argsBuf []byte, envSize uint32) []byte { var env *Env if envSize > 0 { - envBuf := polywrap.WrapLoadEnv(envSize) + envBuf := wrap.WrapLoadEnv(envSize) env = EnvFromBuffer(envBuf) } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type.go index 7b41639530..d09cb425a6 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type.go @@ -1,7 +1,7 @@ package types import ( - "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/msgpack" ) type AnotherType struct { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type_serialization.go index eb860e0ff7..9379d11e42 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type_serialization.go @@ -1,7 +1,7 @@ package types import ( - "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/msgpack" ) func serializeAnotherType(value *AnotherType) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value.go index 881760040a..d27437e07f 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value.go @@ -1,7 +1,7 @@ package types import ( - "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/msgpack" ) type CustomMapValue struct { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value_serialization.go index babbd72f89..056eb66e5d 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value_serialization.go @@ -1,7 +1,7 @@ package types import ( - "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/msgpack" ) func serializeCustomMapValue(value *CustomMapValue) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go index 280ee1c01d..2b3a0b7050 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go @@ -1,8 +1,8 @@ package types import ( - "github.com/polywrap/go-wrap/polywrap/msgpack" - "github.com/polywrap/go-wrap/polywrap/msgpack/big" + "github.com/polywrap/go-wrap/msgpack" + "github.com/polywrap/go-wrap/msgpack/big" "github.com/valyala/fastjson" ) diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go index 7485b1d615..b8b8b230a7 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go @@ -1,8 +1,8 @@ package types import ( - "github.com/polywrap/go-wrap/polywrap/msgpack" - "github.com/polywrap/go-wrap/polywrap/msgpack/big" + "github.com/polywrap/go-wrap/msgpack" + "github.com/polywrap/go-wrap/msgpack/big" "github.com/valyala/fastjson" ) diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env.go index 469e63df31..627de4f432 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env.go @@ -1,7 +1,7 @@ package types import ( - "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/msgpack" ) type Env struct { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env_serialization.go index abbdb35b71..9d12746234 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env_serialization.go @@ -1,7 +1,7 @@ package types import ( - "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/msgpack" ) func serializeEnv(value *Env) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse.go index 1bfac78946..23e470aad4 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse.go @@ -1,7 +1,7 @@ package types import ( - "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/msgpack" ) type Else struct { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse_serialization.go index 0d5add817f..a89c8e047d 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse_serialization.go @@ -1,7 +1,7 @@ package types import ( - "github.com/polywrap/go-wrap/polywrap/msgpack" + "github.com/polywrap/go-wrap/msgpack" ) func serializeElse(value *Else) []byte { From f7184e88dde224c92a95d423b13541ff9b73625d Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Wed, 12 Jul 2023 21:16:21 +0200 Subject: [PATCH 085/181] chore: remove todo --- todo | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 todo diff --git a/todo b/todo deleted file mode 100644 index a82ed17f37..0000000000 --- a/todo +++ /dev/null @@ -1,7 +0,0 @@ -jordan notes: -- file names w/ '%'? -- objectelse -> object_else.go? Same with enumwhile.go -- create a template project -- missing test-cases? (bignumber, large-types, reserved-words, env-types) -- finish the go-ci workflow -- - setup submodule for wasm/go runtime \ No newline at end of file From b95b205cb40c0c1050ad5d109193bb50e9876879 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Wed, 12 Jul 2023 21:46:44 +0200 Subject: [PATCH 086/181] fix: set user to root --- .../src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile | 2 ++ .../src/lib/defaults/build-strategies/wasm/golang/vm/VERSION | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile index b3743bd19f..f9a442017a 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile @@ -10,4 +10,6 @@ COPY --from=rust /usr/local/cargo/bin/wasm-snip /usr/local/bin/ # Copy wasm-target.json COPY wasm-target.json /usr/local/tinygo/targets/ +USER root + WORKDIR /project diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION index 446ba66e7e..def9a01548 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION @@ -1 +1 @@ -0.1.4 \ No newline at end of file +0.1.5 \ No newline at end of file From fb7bdf7521eda76d6e6ddc8de21e8c9656dff98f Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Wed, 12 Jul 2023 22:45:35 +0200 Subject: [PATCH 087/181] chore: lint fix --- .../cli/src/lib/build-strategies/BuildOverrides.ts | 4 +--- .../cli/src/lib/build-strategies/BuildStrategy.ts | 4 +--- .../build-strategies/strategies/DockerVMStrategy.ts | 5 +---- packages/cli/src/lib/codegen/CodeGenerator.ts | 13 ++++++++----- .../language-overrides/wasm/golang/index.ts | 2 +- .../defaults/language-overrides/wasm/rust/index.ts | 4 ++-- .../schema/bind/src/bindings/golang/functions.ts | 4 +--- packages/schema/bind/src/bindings/golang/types.ts | 1 + .../schema/bind/src/bindings/golang/wasm/index.ts | 4 +++- 9 files changed, 19 insertions(+), 22 deletions(-) diff --git a/packages/cli/src/lib/build-strategies/BuildOverrides.ts b/packages/cli/src/lib/build-strategies/BuildOverrides.ts index 38f0609917..8ba5de7c82 100644 --- a/packages/cli/src/lib/build-strategies/BuildOverrides.ts +++ b/packages/cli/src/lib/build-strategies/BuildOverrides.ts @@ -5,9 +5,7 @@ import path from "path"; import fs from "fs"; export interface BuildOverrides { - validateManifest?: ( - manifest: PolywrapManifest - ) => Promise; + validateManifest?: (manifest: PolywrapManifest) => Promise; sourcesSubDirectory?: string; } diff --git a/packages/cli/src/lib/build-strategies/BuildStrategy.ts b/packages/cli/src/lib/build-strategies/BuildStrategy.ts index 8d521238ab..3792cddc5c 100644 --- a/packages/cli/src/lib/build-strategies/BuildStrategy.ts +++ b/packages/cli/src/lib/build-strategies/BuildStrategy.ts @@ -49,9 +49,7 @@ export abstract class BuildStrategy { // If they do, ensure the manifest if valid before build starts if (this.overrides && this.overrides.validateManifest) { - await this.overrides.validateManifest( - await this.project.getManifest() - ); + await this.overrides.validateManifest(await this.project.getManifest()); } return this.buildSources(); diff --git a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts index 5ed76e6903..7ec5c4e895 100644 --- a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts +++ b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts @@ -144,10 +144,7 @@ export class DockerVMBuildStrategy extends BuildStrategy { fse.copySync( path.join(manifestDir, sourcesSubDirectory), - path.join( - this._volumePaths.project, - sourcesSubDirectory - ) + path.join(this._volumePaths.project, sourcesSubDirectory) ); const scriptTemplate = fse.readFileSync( diff --git a/packages/cli/src/lib/codegen/CodeGenerator.ts b/packages/cli/src/lib/codegen/CodeGenerator.ts index 1fd3a14da2..46a16e8bf8 100644 --- a/packages/cli/src/lib/codegen/CodeGenerator.ts +++ b/packages/cli/src/lib/codegen/CodeGenerator.ts @@ -16,11 +16,11 @@ import { } from "../project"; import { resetDir } from "../system"; import { SchemaComposer } from "../SchemaComposer"; +import { CodegenOverrides, tryGetCodegenOverrides } from "./CodegenOverrides"; import path from "path"; import { BindLanguage } from "@polywrap/schema-bind"; import { writeDirectorySync } from "@polywrap/os-js"; -import { CodegenOverrides, tryGetCodegenOverrides } from "./CodegenOverrides"; export interface CodeGeneratorConfig { project: Project; @@ -69,7 +69,10 @@ export class CodeGenerator { } } - protected async runCodegen(_: BindLanguage, overrides?: CodegenOverrides): Promise { + protected async runCodegen( + _: BindLanguage, + overrides?: CodegenOverrides + ): Promise { // TODO: move codegen dir overrides into the new "language-overrides" const codegenDir = this._config.codegenDirAbs ? path.relative( @@ -78,9 +81,9 @@ export class CodeGenerator { ) : undefined; - const bindConfig = overrides ? await overrides.getSchemaBindConfig( - this._config.project - ) : {}; + const bindConfig = overrides + ? await overrides.getSchemaBindConfig(this._config.project) + : {}; const abi = await this._config.schemaComposer.getComposedAbis(); const binding = await this._config.project.generateSchemaBindings( diff --git a/packages/cli/src/lib/defaults/language-overrides/wasm/golang/index.ts b/packages/cli/src/lib/defaults/language-overrides/wasm/golang/index.ts index 3c745d1f8a..16f31636c1 100644 --- a/packages/cli/src/lib/defaults/language-overrides/wasm/golang/index.ts +++ b/packages/cli/src/lib/defaults/language-overrides/wasm/golang/index.ts @@ -13,7 +13,7 @@ export function getBuildOverrides(): BuildOverrides { getGoModulePath(manifest); return Promise.resolve(); }, - sourcesSubDirectory: "module" + sourcesSubDirectory: "module", }; } diff --git a/packages/cli/src/lib/defaults/language-overrides/wasm/rust/index.ts b/packages/cli/src/lib/defaults/language-overrides/wasm/rust/index.ts index 656c1c0807..948da95d1a 100644 --- a/packages/cli/src/lib/defaults/language-overrides/wasm/rust/index.ts +++ b/packages/cli/src/lib/defaults/language-overrides/wasm/rust/index.ts @@ -14,6 +14,6 @@ export function getBuildOverrides(): BuildOverrides { return Promise.resolve(); }, - sourcesSubDirectory: "src" - } + sourcesSubDirectory: "src", + }; } diff --git a/packages/schema/bind/src/bindings/golang/functions.ts b/packages/schema/bind/src/bindings/golang/functions.ts index 9aacbeaf7b..11d2d8e32b 100644 --- a/packages/schema/bind/src/bindings/golang/functions.ts +++ b/packages/schema/bind/src/bindings/golang/functions.ts @@ -102,9 +102,7 @@ export const makeImports: MustacheFn = () => { for (let t of types) { t = t.trim(); if (t.endsWith("big.Int")) { - exist[ - "github.com/polywrap/go-wrap/msgpack/big" - ] = true; + exist["github.com/polywrap/go-wrap/msgpack/big"] = true; } else if (t.endsWith("fastjson.Value")) { exist["github.com/valyala/fastjson"] = true; } else if (/([^/\s]+\/)(.*)/.test(t)) { diff --git a/packages/schema/bind/src/bindings/golang/types.ts b/packages/schema/bind/src/bindings/golang/types.ts index a46ca959d0..a205fa65ab 100644 --- a/packages/schema/bind/src/bindings/golang/types.ts +++ b/packages/schema/bind/src/bindings/golang/types.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/naming-convention */ const types = { u8: "u8", u16: "u16", diff --git a/packages/schema/bind/src/bindings/golang/wasm/index.ts b/packages/schema/bind/src/bindings/golang/wasm/index.ts index bbc85a03e3..46e053f322 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm/index.ts @@ -45,7 +45,9 @@ export const generateBinding: GenerateBindingFn = ( const goImport = options.config?.goModuleName; if (!goImport) { - throw Error("wasm/golang bindings requires the config property 'goModuleName' to be set"); + throw Error( + "wasm/golang bindings requires the config property 'goModuleName' to be set" + ); } // Generate object type folders From 4941dc82485cddc5772d5fb21fe6670839d7afd8 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Wed, 12 Jul 2023 23:26:23 +0200 Subject: [PATCH 088/181] chore: update base-vm-go image version & go-wrap branch --- .../src/lib/build-strategies/strategies/DockerVMStrategy.ts | 2 +- .../build-strategies/wasm/golang/image/Dockerfile.mustache | 2 +- .../cases/cli/build-cmd/wasm/golang/001-sanity/go.mod | 2 +- .../cases/cli/build-cmd/wasm/golang/001-sanity/go.sum | 4 ++-- .../cases/cli/codegen/wasm/008-sanity-golang/go.mod | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts index 7ec5c4e895..8f7df32b85 100644 --- a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts +++ b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts @@ -46,7 +46,7 @@ const CONFIGS: Record = { "wasm/golang": { defaultIncludes: ["go.mod", "go.sum"], baseImage: "polywrap/vm-base-go", - version: "0.1.4", + version: "0.1.5", }, }; diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache index 7f4870de73..08c0ade400 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache @@ -1,4 +1,4 @@ -FROM polywrap/vm-base-go:0.1.4 +FROM polywrap/vm-base-go:0.1.5 WORKDIR /project diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/go.mod b/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/go.mod index 06586f28bb..ef679eeb1b 100644 --- a/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/go.mod +++ b/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/go.mod @@ -2,6 +2,6 @@ module example.com/go-wrap-test go 1.18 -require github.com/polywrap/go-wrap v0.0.0-20230706013513-29691688fe81 +require github.com/polywrap/go-wrap wrap-0.1 require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/go.sum b/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/go.sum index 4c9c458017..35d9e89726 100644 --- a/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/go.sum +++ b/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/go.sum @@ -1,4 +1,4 @@ -github.com/polywrap/go-wrap v0.0.0-20230706013513-29691688fe81 h1:6aeLyP7nvw2xD7rteUCFE+iB/3kvtRoqUuVcLaMLaW0= -github.com/polywrap/go-wrap v0.0.0-20230706013513-29691688fe81/go.mod h1:rxqhIFKUzn/M46+zjnA1RHlCzLGQn2BiLWalezhLj/k= +github.com/polywrap/go-wrap v0.0.0-20230712183729-e3684b1430f1 h1:fhJVAD+8CcssXc7g/F39AQdDHiV3li35mUyHeHp5/Dk= +github.com/polywrap/go-wrap v0.0.0-20230712183729-e3684b1430f1/go.mod h1:rxqhIFKUzn/M46+zjnA1RHlCzLGQn2BiLWalezhLj/k= github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/go.mod b/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/go.mod index 06586f28bb..ef679eeb1b 100644 --- a/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/go.mod +++ b/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/go.mod @@ -2,6 +2,6 @@ module example.com/go-wrap-test go 1.18 -require github.com/polywrap/go-wrap v0.0.0-20230706013513-29691688fe81 +require github.com/polywrap/go-wrap wrap-0.1 require github.com/valyala/fastjson v1.6.3 // indirect From 7b773464f45c363d1e2f4158d91d235f5709ba44 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Thu, 13 Jul 2023 01:33:54 +0200 Subject: [PATCH 089/181] chore: fix empty argument serialization --- .../imported/module-type/%type%Serialization-go.mustache | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache index fefba92470..86491f7932 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache @@ -24,6 +24,10 @@ func Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(value *Args{{#toUpper}}{{name func Write{{#toUpper}}{{name}}{{/toUpper}}Args(writer msgpack.Write, value *Args{{#toUpper}}{{name}}{{/toUpper}}) { {{#arguments.length}} writer.WriteMapLength({{arguments.length}}) + {{/arguments.length}} + {{^arguments}} + writer.WriteMapLength(0) + {{/arguments}} {{#arguments}} writer.Context().Push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") writer.WriteString("{{name}}") @@ -48,7 +52,6 @@ func Write{{#toUpper}}{{name}}{{/toUpper}}Args(writer msgpack.Write, value *Args {{/enum}} writer.Context().Pop() {{/arguments}} - {{/arguments.length}} } func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(argsBuf []byte) {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}} { From f9e1c4de23be0074e2d8178fb8c3ea08a9190563 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Thu, 13 Jul 2023 01:49:15 +0200 Subject: [PATCH 090/181] chore: fix array serialization --- .../src/bindings/golang/wasm/templates/$serialize_array.mustache | 1 + .../golang/wasm/templates/$value_serialize_array.mustache | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/$serialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$serialize_array.mustache index cc83c569de..0607326928 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/$serialize_array.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/$serialize_array.mustache @@ -3,6 +3,7 @@ if value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{ } else if len(value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#lastFullIter}}i{{/lastFullIter}}) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#lastFullIter}}i{{/lastFullIter}}))) for {{#nextIter}}i{{/nextIter}} := range value.{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}{{#prevFullIter}}i{{/prevFullIter}} { {{#scalar}} {{> serialize_scalar}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/$value_serialize_array.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/$value_serialize_array.mustache index 8dd12bb4f4..e70e40e7cf 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/$value_serialize_array.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/$value_serialize_array.mustache @@ -3,6 +3,7 @@ if value{{#lastFullIter}}i{{/lastFullIter}} == nil { } else if len(value{{#lastFullIter}}i{{/lastFullIter}}) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value{{#lastFullIter}}i{{/lastFullIter}}))) for {{#nextIter}}i{{/nextIter}} := range value{{#prevFullIter}}i{{/prevFullIter}} { {{#scalar}} {{> value_serialize_scalar}} From 0af14c94d34a48079c53ab35c94bc8c2023a687f Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Thu, 13 Jul 2023 03:00:47 +0200 Subject: [PATCH 091/181] chore: fix bindings --- .../golang/transforms/propertyDeps.ts | 6 +--- .../schema/bind/src/bindings/golang/types.ts | 29 +++++++++++-------- .../%type%Serialization-go.mustache | 2 ++ .../module_wrapped/%type%Wrapped-go.mustache | 2 +- .../env_test_import__env_serialization.go | 4 +++ ...bject_test_import__object_serialization.go | 4 +++ .../test_import__module_serialization.go | 7 +++++ .../types/object_custom_type_serialization.go | 21 ++++++++++++++ 8 files changed, 57 insertions(+), 18 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/transforms/propertyDeps.ts b/packages/schema/bind/src/bindings/golang/transforms/propertyDeps.ts index 5a6a5d20ba..1a499d6707 100644 --- a/packages/schema/bind/src/bindings/golang/transforms/propertyDeps.ts +++ b/packages/schema/bind/src/bindings/golang/transforms/propertyDeps.ts @@ -14,7 +14,6 @@ import { import { AbiTransforms } from "@polywrap/schema-parse"; interface PropertyDep { - crate: string; type: string; isEnum: boolean; } @@ -60,7 +59,6 @@ export function propertyDeps(): AbiTransforms { state.propertyDeps = []; if (state.abiEnvDefinition) { state.propertyDeps.push({ - crate: "crate", type: "Env", isEnum: false, }); @@ -86,7 +84,7 @@ export function propertyDeps(): AbiTransforms { const appendUnique = (item: PropertyDep) => { if ( array.findIndex( - (i) => i.crate === item.crate && i.type === item.type + (i) => i.type === item.type ) === -1 ) { array.push(item); @@ -102,7 +100,6 @@ export function propertyDeps(): AbiTransforms { const valueName = def.map?.object?.type ?? def.map?.enum?.type; if (valueName && !isKnownType(valueName)) { appendUnique({ - crate: "crate", type: valueName, isEnum: valueName === def.map?.enum?.type, }); @@ -118,7 +115,6 @@ export function propertyDeps(): AbiTransforms { } appendUnique({ - crate: "crate", type: typeName, isEnum: !!def.enum || !!def.array?.enum, }); diff --git a/packages/schema/bind/src/bindings/golang/types.ts b/packages/schema/bind/src/bindings/golang/types.ts index a205fa65ab..bb55137c47 100644 --- a/packages/schema/bind/src/bindings/golang/types.ts +++ b/packages/schema/bind/src/bindings/golang/types.ts @@ -1,21 +1,26 @@ /* eslint-disable @typescript-eslint/naming-convention */ -const types = { - u8: "u8", - u16: "u16", - u32: "u32", - i8: "i8", - i16: "i16", - i32: "i32", - string: "string", - bool: "bool", +const baseTypes = { + UInt: "UInt", + UInt8: "UInt8", + UInt16: "UInt16", + UInt32: "UInt32", + UInt64: "UInt64", + Int: "Int", + Int8: "Int8", + Int16: "Int16", + Int32: "Int32", + Int64: "Int64", + String: "String", + Boolean: "Boolean", + Bytes: "Bytes", }; -export type BaseTypes = typeof types; +export type BaseTypes = typeof baseTypes; export type BaseType = keyof BaseTypes; export function isBaseType(type: string): type is BaseType { - return type in types; + return type in baseTypes; } const builtInTypes = { @@ -30,4 +35,4 @@ export type BuiltInType = keyof BuiltInTypes; export function isBuiltInType(type: string): type is BuiltInType { return type in builtInTypes; -} +} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache index 9bb91ba9a8..75a562868b 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache @@ -1,7 +1,9 @@ package module_wrapped {{#makeImports}} github.com/polywrap/go-wrap/msgpack, + {{#propertyDeps.length}} . {{goImport}}/module/wrap/types, + {{/propertyDeps.length}} {{#importedTypes}} . {{goImport}}/module/wrap/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, {{/importedTypes}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache index 9e19e28d88..2f30a2d94c 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache @@ -1,6 +1,6 @@ package module_wrapped {{#makeImports}} - {{#methods}}{{#env}}github.com/polywrap/go-wrap/wrap,. {{goImport}}/module/wrap/types,{{/env}}{{/methods}} + {{#methods}}{{#env}}github.com/polywrap/go-wrap/wrap,{{#propertyDeps.length}}. {{goImport}}/module/wrap/types,{{/propertyDeps.length}}{{/env}}{{/methods}} {{goImport}}/module as methods, {{/makeImports}} {{#methods}} diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go index 03532e9d99..4d9e11029c 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go @@ -34,6 +34,7 @@ func writeTestImport_Env(writer msgpack.Write, value *TestImport_Env) { } else if len(value.ObjectArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.ObjectArray))) for i0 := range value.ObjectArray { { v := value.ObjectArray[i0] @@ -49,6 +50,7 @@ func writeTestImport_Env(writer msgpack.Write, value *TestImport_Env) { } else if len(value.OptObjectArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.OptObjectArray))) for i0 := range value.OptObjectArray { { v := value.OptObjectArray[i0] @@ -82,6 +84,7 @@ func writeTestImport_Env(writer msgpack.Write, value *TestImport_Env) { } else if len(value.EnumArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.EnumArray))) for i0 := range value.EnumArray { { v := value.EnumArray[i0] @@ -97,6 +100,7 @@ func writeTestImport_Env(writer msgpack.Write, value *TestImport_Env) { } else if len(value.OptEnumArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.OptEnumArray))) for i0 := range value.OptEnumArray { { v := value.OptEnumArray[i0] diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go index e35e49689b..14a99ed24e 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go @@ -34,6 +34,7 @@ func writeTestImport_Object(writer msgpack.Write, value *TestImport_Object) { } else if len(value.ObjectArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.ObjectArray))) for i0 := range value.ObjectArray { { v := value.ObjectArray[i0] @@ -49,6 +50,7 @@ func writeTestImport_Object(writer msgpack.Write, value *TestImport_Object) { } else if len(value.OptObjectArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.OptObjectArray))) for i0 := range value.OptObjectArray { { v := value.OptObjectArray[i0] @@ -82,6 +84,7 @@ func writeTestImport_Object(writer msgpack.Write, value *TestImport_Object) { } else if len(value.EnumArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.EnumArray))) for i0 := range value.EnumArray { { v := value.EnumArray[i0] @@ -97,6 +100,7 @@ func writeTestImport_Object(writer msgpack.Write, value *TestImport_Object) { } else if len(value.OptEnumArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.OptEnumArray))) for i0 := range value.OptEnumArray { { v := value.OptEnumArray[i0] diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go index d1456a2036..0a26bbdac3 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go @@ -72,12 +72,14 @@ func WriteImportedMethodArgs(writer msgpack.Write, value *ArgsImportedMethod) { } else if len(value.UArrayArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.UArrayArray))) for i0 := range value.UArrayArray { if value.UArrayArray[i0] == nil { writer.WriteNil() } else if len(value.UArrayArray[i0]) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.UArrayArray[i0]))) for i1 := range value.UArrayArray[i0] { { v := value.UArrayArray[i0][i1] @@ -113,6 +115,7 @@ func WriteImportedMethodArgs(writer msgpack.Write, value *ArgsImportedMethod) { } else if len(value.ObjectArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.ObjectArray))) for i0 := range value.ObjectArray { { v := value.ObjectArray[i0] @@ -128,6 +131,7 @@ func WriteImportedMethodArgs(writer msgpack.Write, value *ArgsImportedMethod) { } else if len(value.OptObjectArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.OptObjectArray))) for i0 := range value.OptObjectArray { { v := value.OptObjectArray[i0] @@ -161,6 +165,7 @@ func WriteImportedMethodArgs(writer msgpack.Write, value *ArgsImportedMethod) { } else if len(value.EnumArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.EnumArray))) for i0 := range value.EnumArray { { v := value.EnumArray[i0] @@ -176,6 +181,7 @@ func WriteImportedMethodArgs(writer msgpack.Write, value *ArgsImportedMethod) { } else if len(value.OptEnumArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.OptEnumArray))) for i0 := range value.OptEnumArray { { v := value.OptEnumArray[i0] @@ -223,6 +229,7 @@ func WriteAnotherMethodArgs(writer msgpack.Write, value *ArgsAnotherMethod) { } else if len(value.Arg) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.Arg))) for i0 := range value.Arg { { v := value.Arg[i0] diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go index b8b8b230a7..78d4df2834 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go @@ -197,6 +197,7 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } else if len(value.U_array) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.U_array))) for i0 := range value.U_array { { v := value.U_array[i0] @@ -212,6 +213,7 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } else if len(value.UOpt_array) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.UOpt_array))) for i0 := range value.UOpt_array { { v := value.UOpt_array[i0] @@ -227,6 +229,7 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } else if len(value._opt_uOptArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value._opt_uOptArray))) for i0 := range value._opt_uOptArray { { v := value._opt_uOptArray[i0] @@ -246,6 +249,7 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } else if len(value.OptStrOptArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.OptStrOptArray))) for i0 := range value.OptStrOptArray { { v := value.OptStrOptArray[i0] @@ -265,12 +269,14 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } else if len(value.UArrayArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.UArrayArray))) for i0 := range value.UArrayArray { if value.UArrayArray[i0] == nil { writer.WriteNil() } else if len(value.UArrayArray[i0]) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.UArrayArray[i0]))) for i1 := range value.UArrayArray[i0] { { v := value.UArrayArray[i0][i1] @@ -288,12 +294,14 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } else if len(value.UOptArrayOptArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.UOptArrayOptArray))) for i0 := range value.UOptArrayOptArray { if value.UOptArrayOptArray[i0] == nil { writer.WriteNil() } else if len(value.UOptArrayOptArray[i0]) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.UOptArrayOptArray[i0]))) for i1 := range value.UOptArrayOptArray[i0] { { v := value.UOptArrayOptArray[i0][i1] @@ -315,18 +323,21 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } else if len(value.UArrayOptArrayArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.UArrayOptArrayArray))) for i0 := range value.UArrayOptArrayArray { if value.UArrayOptArrayArray[i0] == nil { writer.WriteNil() } else if len(value.UArrayOptArrayArray[i0]) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.UArrayOptArrayArray[i0]))) for i1 := range value.UArrayOptArrayArray[i0] { if value.UArrayOptArrayArray[i0][i1] == nil { writer.WriteNil() } else if len(value.UArrayOptArrayArray[i0][i1]) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.UArrayOptArrayArray[i0][i1]))) for i2 := range value.UArrayOptArrayArray[i0][i1] { { v := value.UArrayOptArrayArray[i0][i1][i2] @@ -346,24 +357,28 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } else if len(value.CrazyArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.CrazyArray))) for i0 := range value.CrazyArray { if value.CrazyArray[i0] == nil { writer.WriteNil() } else if len(value.CrazyArray[i0]) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.CrazyArray[i0]))) for i1 := range value.CrazyArray[i0] { if value.CrazyArray[i0][i1] == nil { writer.WriteNil() } else if len(value.CrazyArray[i0][i1]) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.CrazyArray[i0][i1]))) for i2 := range value.CrazyArray[i0][i1] { if value.CrazyArray[i0][i1][i2] == nil { writer.WriteNil() } else if len(value.CrazyArray[i0][i1][i2]) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.CrazyArray[i0][i1][i2]))) for i3 := range value.CrazyArray[i0][i1][i2] { { v := value.CrazyArray[i0][i1][i2][i3] @@ -399,6 +414,7 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } else if len(value.ObjectArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.ObjectArray))) for i0 := range value.ObjectArray { { v := value.ObjectArray[i0] @@ -414,6 +430,7 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } else if len(value.OptObjectArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.OptObjectArray))) for i0 := range value.OptObjectArray { { v := value.OptObjectArray[i0] @@ -447,6 +464,7 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } else if len(value.EnumArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.EnumArray))) for i0 := range value.EnumArray { { v := value.EnumArray[i0] @@ -462,6 +480,7 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } else if len(value.OptEnumArray) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.OptEnumArray))) for i0 := range value.OptEnumArray { { v := value.OptEnumArray[i0] @@ -504,6 +523,7 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } else if len(value.MapOfArr[i0]) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.MapOfArr[i0]))) for i1 := range value.MapOfArr[i0] { { v := value.MapOfArr[i0][i1] @@ -544,6 +564,7 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } else if len(value.MapOfArrOfObj[i0]) == 0 { writer.WriteNil() } else { + writer.WriteArrayLength(uint32(len(value.MapOfArrOfObj[i0]))) for i1 := range value.MapOfArrOfObj[i0] { { v := value.MapOfArrOfObj[i0][i1] From 362b9c89165e0b569121472d18bf5dc04b11ba5e Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Thu, 13 Jul 2023 03:27:54 +0200 Subject: [PATCH 092/181] chore: fix json binding --- .../templates/env-type/Env%type%-go.mustache | 2 +- .../imported/env-type/Env%type%-go.mustache | 2 +- .../%type%Serialization-go.mustache | 2 +- .../object-type/Object%type%-go.mustache | 2 +- .../module-type/types/%type%Args-go.mustache | 2 +- .../object-type/Object%type%-go.mustache | 2 +- .../test_import/env_test_import__env.go | 16 ++-- .../object_test_import__another_object.go | 2 +- .../test_import/object_test_import__object.go | 16 ++-- .../test_import__module_serialization.go | 30 +++---- .../output/wasm-go/types/module_args.go | 40 ++++----- .../wasm-go/types/object_another_type.go | 6 +- .../wasm-go/types/object_custom_map_value.go | 2 +- .../wasm-go/types/object_custom_type.go | 84 +++++++++---------- .../sanity/output/wasm-go/types/object_env.go | 6 +- .../sanity/output/wasm-go/types/objectelse.go | 2 +- 16 files changed, 108 insertions(+), 108 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache index 0810ab36de..a64e346848 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%-go.mustache @@ -5,7 +5,7 @@ package types type {{#toUpper}}{{type}}{{/toUpper}} struct { {{#stuctProps}} {{#properties}} - {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} + {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} `json:"{{name}}"` {{/properties}} {{/stuctProps}} } diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache index 3c230b9f9a..70cc14ba31 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%-go.mustache @@ -8,7 +8,7 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} type {{#toUpper}}{{type}}{{/toUpper}} struct { {{#stuctProps}} {{#properties}} -{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} +{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} `json:"{{name}}"` {{/properties}} {{/stuctProps}} } diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache index 86491f7932..24e8033ed4 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache @@ -9,7 +9,7 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} type Args{{#toUpper}}{{name}}{{/toUpper}} struct { {{#stuctProps}} {{#arguments}} -{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} +{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} `json:"{{name}}"` {{/arguments}} {{/stuctProps}} } diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache index 3c230b9f9a..70cc14ba31 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%-go.mustache @@ -8,7 +8,7 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} type {{#toUpper}}{{type}}{{/toUpper}} struct { {{#stuctProps}} {{#properties}} -{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} +{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} `json:"{{name}}"` {{/properties}} {{/stuctProps}} } diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache index d20db1c755..cf5cc65316 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache @@ -14,7 +14,7 @@ package types type MethodArgs{{#toUpper}}{{name}}{{/toUpper}} struct { {{#stuctProps}} {{#arguments}} -{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} +{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} `json:"{{name}}"` {{/arguments}} {{/stuctProps}} } diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache index e9576bcbc9..fbd7e01f18 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%-go.mustache @@ -8,7 +8,7 @@ package types type {{#toUpper}}{{type}}{{/toUpper}} struct { {{#stuctProps}} {{#properties}} -{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} +{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} `json:"{{name}}"` {{/properties}} {{/stuctProps}} } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go index 81cdbc86bc..5478dd8ab9 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go @@ -5,14 +5,14 @@ import ( ) type TestImport_Env struct { - Object TestImport_AnotherObject - OptObject *TestImport_AnotherObject - ObjectArray []TestImport_AnotherObject - OptObjectArray []*TestImport_AnotherObject - En TestImport_Enum - OptEnum *TestImport_Enum - EnumArray []TestImport_Enum - OptEnumArray []*TestImport_Enum + Object TestImport_AnotherObject `json:"object"` + OptObject *TestImport_AnotherObject `json:"optObject"` + ObjectArray []TestImport_AnotherObject `json:"objectArray"` + OptObjectArray []*TestImport_AnotherObject `json:"optObjectArray"` + En TestImport_Enum `json:"en"` + OptEnum *TestImport_Enum `json:"optEnum"` + EnumArray []TestImport_Enum `json:"enumArray"` + OptEnumArray []*TestImport_Enum `json:"optEnumArray"` } func TestImport_EnvToBuffer(value *TestImport_Env) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object.go index 1f524b3ac0..f01380602e 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object.go @@ -5,7 +5,7 @@ import ( ) type TestImport_AnotherObject struct { - Prop string + Prop string `json:"prop"` } func TestImport_AnotherObjectToBuffer(value *TestImport_AnotherObject) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object.go index 1df2cf8297..1fc1c743a3 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object.go @@ -5,14 +5,14 @@ import ( ) type TestImport_Object struct { - Object TestImport_AnotherObject - OptObject *TestImport_AnotherObject - ObjectArray []TestImport_AnotherObject - OptObjectArray []*TestImport_AnotherObject - En TestImport_Enum - OptEnum *TestImport_Enum - EnumArray []TestImport_Enum - OptEnumArray []*TestImport_Enum + Object TestImport_AnotherObject `json:"object"` + OptObject *TestImport_AnotherObject `json:"optObject"` + ObjectArray []TestImport_AnotherObject `json:"objectArray"` + OptObjectArray []*TestImport_AnotherObject `json:"optObjectArray"` + En TestImport_Enum `json:"en"` + OptEnum *TestImport_Enum `json:"optEnum"` + EnumArray []TestImport_Enum `json:"enumArray"` + OptEnumArray []*TestImport_Enum `json:"optEnumArray"` } func TestImport_ObjectToBuffer(value *TestImport_Object) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go index 0a26bbdac3..461da72dff 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go @@ -5,19 +5,19 @@ import ( ) type ArgsImportedMethod struct { - Str string - OptStr *string - U uint32 - OptU *uint32 - UArrayArray [][]*uint32 - Object TestImport_Object - OptObject *TestImport_Object - ObjectArray []TestImport_Object - OptObjectArray []*TestImport_Object - En TestImport_Enum - OptEnum *TestImport_Enum - EnumArray []TestImport_Enum - OptEnumArray []*TestImport_Enum + Str string `json:"str"` + OptStr *string `json:"optStr"` + U uint32 `json:"u"` + OptU *uint32 `json:"optU"` + UArrayArray [][]*uint32 `json:"uArrayArray"` + Object TestImport_Object `json:"object"` + OptObject *TestImport_Object `json:"optObject"` + ObjectArray []TestImport_Object `json:"objectArray"` + OptObjectArray []*TestImport_Object `json:"optObjectArray"` + En TestImport_Enum `json:"en"` + OptEnum *TestImport_Enum `json:"optEnum"` + EnumArray []TestImport_Enum `json:"enumArray"` + OptEnumArray []*TestImport_Enum `json:"optEnumArray"` } func SerializeImportedMethodArgs(value *ArgsImportedMethod) []byte { @@ -210,7 +210,7 @@ func DeserializeImportedMethodResult(argsBuf []byte) *TestImport_Object { } type ArgsAnotherMethod struct { - Arg []string + Arg []string `json:"arg"` } func SerializeAnotherMethodArgs(value *ArgsAnotherMethod) []byte { @@ -252,7 +252,7 @@ func DeserializeAnotherMethodResult(argsBuf []byte) int32 { } type ArgsReturnsArrayOfEnums struct { - Arg string + Arg string `json:"arg"` } func SerializeReturnsArrayOfEnumsArgs(value *ArgsReturnsArrayOfEnums) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go index 118f13d50e..31f8ea4d83 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go @@ -1,33 +1,33 @@ package types type MethodArgsModuleMethod struct { - Str string - OptStr *string - En CustomEnum - OptEnum *CustomEnum - EnumArray []CustomEnum - OptEnumArray []*CustomEnum - M_map map[string]int32 - MapOfArr map[string][]int32 - MapOfMap map[string]map[string]int32 - MapOfObj map[string]AnotherType - MapOfArrOfObj map[string][]AnotherType + Str string `json:"str"` + OptStr *string `json:"optStr"` + En CustomEnum `json:"en"` + OptEnum *CustomEnum `json:"optEnum"` + EnumArray []CustomEnum `json:"enumArray"` + OptEnumArray []*CustomEnum `json:"optEnumArray"` + M_map map[string]int32 `json:"map"` + MapOfArr map[string][]int32 `json:"mapOfArr"` + MapOfMap map[string]map[string]int32 `json:"mapOfMap"` + MapOfObj map[string]AnotherType `json:"mapOfObj"` + MapOfArrOfObj map[string][]AnotherType `json:"mapOfArrOfObj"` } type MethodArgsObjectMethod struct { - Object AnotherType - OptObject *AnotherType - ObjectArray []AnotherType - OptObjectArray []*AnotherType + Object AnotherType `json:"object"` + OptObject *AnotherType `json:"optObject"` + ObjectArray []AnotherType `json:"objectArray"` + OptObjectArray []*AnotherType `json:"optObjectArray"` } type MethodArgsOptionalEnvMethod struct { - Object AnotherType - OptObject *AnotherType - ObjectArray []AnotherType - OptObjectArray []*AnotherType + Object AnotherType `json:"object"` + OptObject *AnotherType `json:"optObject"` + ObjectArray []AnotherType `json:"objectArray"` + OptObjectArray []*AnotherType `json:"optObjectArray"` } type MethodArgsIf struct { - M_if Else + M_if Else `json:"if"` } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type.go index d09cb425a6..92d48c4722 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type.go @@ -5,9 +5,9 @@ import ( ) type AnotherType struct { - Prop *string - Circular *CustomType - M_const *string + Prop *string `json:"prop"` + Circular *CustomType `json:"circular"` + M_const *string `json:"const"` } func AnotherTypeToBuffer(value *AnotherType) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value.go index d27437e07f..49729b0e00 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value.go @@ -5,7 +5,7 @@ import ( ) type CustomMapValue struct { - Foo string + Foo string `json:"foo"` } func CustomMapValueToBuffer(value *CustomMapValue) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go index 2b3a0b7050..6c97ef1ba9 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go @@ -7,48 +7,48 @@ import ( ) type CustomType struct { - Str string - OptStr *string - U uint32 - OptU *uint32 - M_u8 uint8 - M_u16 uint16 - M_u32 uint32 - I int32 - M_i8 int8 - M_i16 int16 - M_i32 int32 - Bigint *big.Int - OptBigint *big.Int - Bignumber *big.Int - OptBignumber *big.Int - Json *fastjson.Value - OptJson *fastjson.Value - Bytes []byte - OptBytes []byte - M_boolean bool - OptBoolean *bool - U_array []uint32 - UOpt_array []uint32 - _opt_uOptArray []*uint32 - OptStrOptArray []*string - UArrayArray [][]uint32 - UOptArrayOptArray [][]*uint32 - UArrayOptArrayArray [][][]uint32 - CrazyArray [][][][]uint32 - Object AnotherType - OptObject *AnotherType - ObjectArray []AnotherType - OptObjectArray []*AnotherType - En CustomEnum - OptEnum *CustomEnum - EnumArray []CustomEnum - OptEnumArray []*CustomEnum - M_map map[string]int32 - MapOfArr map[string][]int32 - MapOfObj map[string]AnotherType - MapOfArrOfObj map[string][]AnotherType - MapCustomValue map[string]*CustomMapValue + Str string `json:"str"` + OptStr *string `json:"optStr"` + U uint32 `json:"u"` + OptU *uint32 `json:"optU"` + M_u8 uint8 `json:"u8"` + M_u16 uint16 `json:"u16"` + M_u32 uint32 `json:"u32"` + I int32 `json:"i"` + M_i8 int8 `json:"i8"` + M_i16 int16 `json:"i16"` + M_i32 int32 `json:"i32"` + Bigint *big.Int `json:"bigint"` + OptBigint *big.Int `json:"optBigint"` + Bignumber *big.Int `json:"bignumber"` + OptBignumber *big.Int `json:"optBignumber"` + Json *fastjson.Value `json:"json"` + OptJson *fastjson.Value `json:"optJson"` + Bytes []byte `json:"bytes"` + OptBytes []byte `json:"optBytes"` + M_boolean bool `json:"boolean"` + OptBoolean *bool `json:"optBoolean"` + U_array []uint32 `json:"u_array"` + UOpt_array []uint32 `json:"uOpt_array"` + _opt_uOptArray []*uint32 `json:"_opt_uOptArray"` + OptStrOptArray []*string `json:"optStrOptArray"` + UArrayArray [][]uint32 `json:"uArrayArray"` + UOptArrayOptArray [][]*uint32 `json:"uOptArrayOptArray"` + UArrayOptArrayArray [][][]uint32 `json:"uArrayOptArrayArray"` + CrazyArray [][][][]uint32 `json:"crazyArray"` + Object AnotherType `json:"object"` + OptObject *AnotherType `json:"optObject"` + ObjectArray []AnotherType `json:"objectArray"` + OptObjectArray []*AnotherType `json:"optObjectArray"` + En CustomEnum `json:"en"` + OptEnum *CustomEnum `json:"optEnum"` + EnumArray []CustomEnum `json:"enumArray"` + OptEnumArray []*CustomEnum `json:"optEnumArray"` + M_map map[string]int32 `json:"map"` + MapOfArr map[string][]int32 `json:"mapOfArr"` + MapOfObj map[string]AnotherType `json:"mapOfObj"` + MapOfArrOfObj map[string][]AnotherType `json:"mapOfArrOfObj"` + MapCustomValue map[string]*CustomMapValue `json:"mapCustomValue"` } func CustomTypeToBuffer(value *CustomType) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env.go index 627de4f432..14f90adbc6 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env.go @@ -5,9 +5,9 @@ import ( ) type Env struct { - Prop string - OptProp *string - OptMap map[string]*int32 + Prop string `json:"prop"` + OptProp *string `json:"optProp"` + OptMap map[string]*int32 `json:"optMap"` } func EnvToBuffer(value *Env) []byte { diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse.go index 23e470aad4..930eb8f8e3 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse.go @@ -5,7 +5,7 @@ import ( ) type Else struct { - M_else string + M_else string `json:"else"` } func ElseToBuffer(value *Else) []byte { From 2f1b66a6c21754d1479a1fc3fc30ddd23917317b Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Thu, 13 Jul 2023 04:58:32 +0200 Subject: [PATCH 093/181] chore: fix bindings --- .../src/bindings/golang/transforms/index.ts | 2 +- .../golang/transforms/moduleNeedsTypes.ts | 55 +++++ .../golang/transforms/propertyDeps.ts | 203 ------------------ .../bind/src/bindings/golang/wasm/index.ts | 2 +- .../module-type/%type%Wrapped-go.mustache | 4 +- .../%type%Serialization-go.mustache | 8 +- .../module_wrapped/%type%Wrapped-go.mustache | 2 +- .../module-type/types/%type%Args-go.mustache | 2 +- .../test_import__module_wrapped.go | 6 +- .../module_wrapped/module_serialization.go | 16 +- .../output/wasm-go/types/module_args.go | 8 +- .../wasm/golang/001-sanity/module/module.go | 2 +- .../wasm/008-sanity-golang/module/module.go | 2 +- 13 files changed, 82 insertions(+), 230 deletions(-) create mode 100644 packages/schema/bind/src/bindings/golang/transforms/moduleNeedsTypes.ts delete mode 100644 packages/schema/bind/src/bindings/golang/transforms/propertyDeps.ts diff --git a/packages/schema/bind/src/bindings/golang/transforms/index.ts b/packages/schema/bind/src/bindings/golang/transforms/index.ts index 45b46dccaa..7533ca0186 100644 --- a/packages/schema/bind/src/bindings/golang/transforms/index.ts +++ b/packages/schema/bind/src/bindings/golang/transforms/index.ts @@ -1 +1 @@ -export * from "./propertyDeps"; +export * from "./moduleNeedsTypes"; diff --git a/packages/schema/bind/src/bindings/golang/transforms/moduleNeedsTypes.ts b/packages/schema/bind/src/bindings/golang/transforms/moduleNeedsTypes.ts new file mode 100644 index 0000000000..6e429f58ca --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/transforms/moduleNeedsTypes.ts @@ -0,0 +1,55 @@ +import { + MethodDefinition, + ModuleDefinition, +} from "@polywrap/wrap-manifest-types-js"; +import { AbiTransforms } from "@polywrap/schema-parse"; + +import { isBaseType, isBuiltInType } from "../types"; + +interface ModuleNeedsTypesState { + moduleDefinition?: ModuleDefinition; + needsTypes?: boolean; +} + +export function moduleNeedsTypes(): AbiTransforms { + const state: ModuleNeedsTypesState = {}; + + return { + enter: { + ModuleDefinition: (def: ModuleDefinition) => { + console.log("ENTER", def.type) + state.moduleDefinition = def; + state.needsTypes = false; + return def; + }, + MethodDefinition: (def: MethodDefinition) => { + console.log("METHOD", def.name); + if (def.arguments && def.arguments.length > 0) { + console.log("NEEDS cause args") + state.needsTypes = true; + } + + if (def.return) { + const returnType = def.return.type; + if (!isBaseType(returnType) && !isBuiltInType(returnType)) { + console.log("NEEDS cause ret") + state.needsTypes = true; + } + } + return def; + } + }, + leave: { + ModuleDefinition: (def: ModuleDefinition) => { + console.log("LEAVE", def.name) + const needsTypes = state.needsTypes + state.moduleDefinition = undefined; + state.needsTypes = undefined; + return { + ...def, + needsTypes, + }; + } + }, + }; +} diff --git a/packages/schema/bind/src/bindings/golang/transforms/propertyDeps.ts b/packages/schema/bind/src/bindings/golang/transforms/propertyDeps.ts deleted file mode 100644 index 1a499d6707..0000000000 --- a/packages/schema/bind/src/bindings/golang/transforms/propertyDeps.ts +++ /dev/null @@ -1,203 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -/* eslint-disable no-useless-escape */ -import { isBaseType, isBuiltInType } from "../types"; - -import { - ImportedModuleDefinition, - ObjectDefinition, - AnyDefinition, - ModuleDefinition, - EnvDefinition, - Abi, - ImportedEnvDefinition, -} from "@polywrap/wrap-manifest-types-js"; -import { AbiTransforms } from "@polywrap/schema-parse"; - -interface PropertyDep { - type: string; - isEnum: boolean; -} - -interface PropertyDepsState { - abiEnvDefinition?: EnvDefinition; - envDefinition?: EnvDefinition; - importedEnvDefinition?: ImportedEnvDefinition; - objectDefinition?: ObjectDefinition; - moduleDefinition?: ModuleDefinition; - importedModuleDefinition?: ImportedModuleDefinition; - propertyDeps?: PropertyDep[]; -} - -export function propertyDeps(): AbiTransforms { - const state: PropertyDepsState = {}; - - return { - enter: { - Abi: (abi: Abi) => { - if (abi.envType) { - state.abiEnvDefinition = abi.envType; - } - return abi; - }, - EnvDefinition: (def: EnvDefinition) => { - state.envDefinition = def; - state.propertyDeps = []; - return def; - }, - ImportedEnvDefinition: (def: ImportedEnvDefinition) => { - state.envDefinition = def; - state.propertyDeps = []; - return def; - }, - ObjectDefinition: (def: ObjectDefinition) => { - state.objectDefinition = def; - state.propertyDeps = []; - return def; - }, - ModuleDefinition: (def: ModuleDefinition) => { - state.moduleDefinition = def; - state.propertyDeps = []; - if (state.abiEnvDefinition) { - state.propertyDeps.push({ - type: "Env", - isEnum: false, - }); - } - return def; - }, - ImportedModuleDefinition: (def: ImportedModuleDefinition) => { - state.importedModuleDefinition = def; - state.propertyDeps = []; - return def; - }, - AnyDefinition: (def: AnyDefinition) => { - const appendPropertyDep = ( - rootType: string, - array: PropertyDep[] - ): PropertyDep[] => { - let typeName = def.type; - - if (typeName.indexOf("[") === 0) { - typeName = typeName.replace(/\[|\]|\!|\?/g, ""); - } - - const appendUnique = (item: PropertyDep) => { - if ( - array.findIndex( - (i) => i.type === item.type - ) === -1 - ) { - array.push(item); - } - }; - - const isKnownType = (name: string) => - isBaseType(name) || isBuiltInType(name) || name === rootType; - - // if type is map and the value is custom, - // we need to add it into property dependency - if (typeName.startsWith("Map<")) { - const valueName = def.map?.object?.type ?? def.map?.enum?.type; - if (valueName && !isKnownType(valueName)) { - appendUnique({ - type: valueName, - isEnum: valueName === def.map?.enum?.type, - }); - - return array; - } - - return array; - } - - if (isKnownType(typeName)) { - return array; - } - - appendUnique({ - type: typeName, - isEnum: !!def.enum || !!def.array?.enum, - }); - - return array; - }; - - if (state.envDefinition && state.propertyDeps) { - state.propertyDeps = appendPropertyDep( - state.envDefinition.type, - state.propertyDeps - ); - } else if (state.importedEnvDefinition && state.propertyDeps) { - state.propertyDeps = appendPropertyDep( - state.importedEnvDefinition.type, - state.propertyDeps - ); - } else if (state.objectDefinition && state.propertyDeps) { - state.propertyDeps = appendPropertyDep( - state.objectDefinition.type, - state.propertyDeps - ); - } else if (state.moduleDefinition && state.propertyDeps) { - state.propertyDeps = appendPropertyDep( - state.moduleDefinition.type, - state.propertyDeps - ); - } else if (state.importedModuleDefinition && state.propertyDeps) { - state.propertyDeps = appendPropertyDep( - state.importedModuleDefinition.type, - state.propertyDeps - ); - } - - return def; - }, - }, - leave: { - EnvDefinition: (def: EnvDefinition) => { - const propertyDeps = state.propertyDeps; - state.propertyDeps = undefined; - state.envDefinition = undefined; - return { - ...def, - propertyDeps, - }; - }, - ImportedEnvDefinition: (def: ImportedEnvDefinition) => { - const propertyDeps = state.propertyDeps; - state.propertyDeps = undefined; - state.importedEnvDefinition = undefined; - return { - ...def, - propertyDeps, - }; - }, - ObjectDefinition: (def: ObjectDefinition) => { - const propertyDeps = state.propertyDeps; - state.propertyDeps = undefined; - state.objectDefinition = undefined; - return { - ...def, - propertyDeps, - }; - }, - ModuleDefinition: (def: ModuleDefinition) => { - const propertyDeps = state.propertyDeps; - state.propertyDeps = undefined; - state.moduleDefinition = undefined; - return { - ...def, - propertyDeps, - }; - }, - ImportedModuleDefinition: (def: ImportedModuleDefinition) => { - const propertyDeps = state.propertyDeps; - state.propertyDeps = undefined; - state.importedModuleDefinition = undefined; - return { - ...def, - propertyDeps, - }; - }, - }, - }; -} diff --git a/packages/schema/bind/src/bindings/golang/wasm/index.ts b/packages/schema/bind/src/bindings/golang/wasm/index.ts index 46e053f322..5aee1e7ebf 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm/index.ts @@ -271,7 +271,7 @@ function applyTransforms(abi: Abi): Abi { extendType(Functions), addFirstLast, toPrefixedGraphQLType, - Transforms.propertyDeps(), + Transforms.moduleNeedsTypes(), ]; for (const transform of transforms) { diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache index b098e0a36f..72c3adf3c3 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache @@ -8,7 +8,7 @@ import ( {{^isInterface}} {{#methods}} -func {{#toUpper}}{{type}}{{/toUpper}}{{#toUpper}}{{name}}{{/toUpper}}(args *Args{{#toUpper}}{{name}}{{/toUpper}}) ({{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, error) { +func {{#toUpper}}{{name}}{{/toUpper}}(args *Args{{#toUpper}}{{name}}{{/toUpper}}) ({{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, error) { argsBuf := Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(args) var ( err error @@ -28,7 +28,7 @@ func {{#toUpper}}{{type}}{{/toUpper}}{{#toUpper}}{{name}}{{/toUpper}}(args *Args {{/isInterface}} {{#isInterface}} {{#methods}} -func {{#toUpper}}{{type}}{{/toUpper}}{{#toUpper}}{{name}}{{/toUpper}}(uri string, args *Args{{#toUpper}}{{name}}{{/toUpper}}) ({{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, error) { +func {{#toUpper}}{{name}}{{/toUpper}}(uri string, args *Args{{#toUpper}}{{name}}{{/toUpper}}) ({{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, error) { argsBuf := Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(args) var ( err error diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache index 75a562868b..9f6defac57 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache @@ -1,9 +1,9 @@ package module_wrapped {{#makeImports}} github.com/polywrap/go-wrap/msgpack, - {{#propertyDeps.length}} + {{#needsTypes}} . {{goImport}}/module/wrap/types, - {{/propertyDeps.length}} + {{/needsTypes}} {{#importedTypes}} . {{goImport}}/module/wrap/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, {{/importedTypes}} @@ -13,7 +13,7 @@ package module_wrapped {{/makeImports}} {{#methods}} {{#arguments.length}} -func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *MethodArgs{{#toUpper}}{{name}}{{/toUpper}} { +func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *Args{{#toUpper}}{{name}}{{/toUpper}} { ctx := msgpack.NewContext("Deserializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") reader := msgpack.NewReadDecoder(ctx, argsBuf) @@ -71,7 +71,7 @@ func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Args(argsBuf []byte) *MethodArgs {{/required}} {{/arguments}} - return &MethodArgs{{#toUpper}}{{name}}{{/toUpper}}{ + return &Args{{#toUpper}}{{name}}{{/toUpper}}{ {{#stuctProps}} {{#arguments}} {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}: _{{name}}, diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache index 2f30a2d94c..cd6794431f 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache @@ -1,6 +1,6 @@ package module_wrapped {{#makeImports}} - {{#methods}}{{#env}}github.com/polywrap/go-wrap/wrap,{{#propertyDeps.length}}. {{goImport}}/module/wrap/types,{{/propertyDeps.length}}{{/env}}{{/methods}} + {{#methods}}{{#env}}github.com/polywrap/go-wrap/wrap,{{#needsTypes}}. {{goImport}}/module/wrap/types,{{/needsTypes}}{{/env}}{{/methods}} {{goImport}}/module as methods, {{/makeImports}} {{#methods}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache index cf5cc65316..4d7a27be0f 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/types/%type%Args-go.mustache @@ -11,7 +11,7 @@ package types {{/makeImports}} {{#methods}} {{#arguments.length}} -type MethodArgs{{#toUpper}}{{name}}{{/toUpper}} struct { +type Args{{#toUpper}}{{name}}{{/toUpper}} struct { {{#stuctProps}} {{#arguments}} {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} `json:"{{name}}"` diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go index b35afbfa71..54e30e516a 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go @@ -4,7 +4,7 @@ import ( "github.com/polywrap/go-wrap/wrap" ) -func MethodImportedMethod(uri string, args *ArgsImportedMethod) (*TestImport_Object, error) { +func ImportedMethod(uri string, args *ArgsImportedMethod) (*TestImport_Object, error) { argsBuf := SerializeImportedMethodArgs(args) var ( err error @@ -18,7 +18,7 @@ func MethodImportedMethod(uri string, args *ArgsImportedMethod) (*TestImport_Obj return data, err } -func MethodAnotherMethod(uri string, args *ArgsAnotherMethod) (int32, error) { +func AnotherMethod(uri string, args *ArgsAnotherMethod) (int32, error) { argsBuf := SerializeAnotherMethodArgs(args) var ( err error @@ -32,7 +32,7 @@ func MethodAnotherMethod(uri string, args *ArgsAnotherMethod) (int32, error) { return data, err } -func MethodReturnsArrayOfEnums(uri string, args *ArgsReturnsArrayOfEnums) ([]*TestImport_Enum_Return, error) { +func ReturnsArrayOfEnums(uri string, args *ArgsReturnsArrayOfEnums) ([]*TestImport_Enum_Return, error) { argsBuf := SerializeReturnsArrayOfEnumsArgs(args) var ( err error diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_serialization.go index 920d1f45b0..346056af85 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_serialization.go @@ -5,7 +5,7 @@ import ( "github.com/polywrap/go-wrap/msgpack" ) -func DeserializeModuleMethodArgs(argsBuf []byte) *MethodArgsModuleMethod { +func DeserializeModuleMethodArgs(argsBuf []byte) *ArgsModuleMethod { ctx := msgpack.NewContext("Deserializing module-type: ModuleMethod") reader := msgpack.NewReadDecoder(ctx, argsBuf) @@ -219,7 +219,7 @@ func DeserializeModuleMethodArgs(argsBuf []byte) *MethodArgsModuleMethod { panic(reader.Context().PrintWithContext("Missing required property: 'mapOfArrOfObj: Map'")) } - return &MethodArgsModuleMethod{ + return &ArgsModuleMethod{ Str: _str, OptStr: _optStr, En: _en, @@ -250,7 +250,7 @@ func WriteModuleMethodResult(writer msgpack.Write, value int32) { writer.Context().Pop() } -func DeserializeObjectMethodArgs(argsBuf []byte) *MethodArgsObjectMethod { +func DeserializeObjectMethodArgs(argsBuf []byte) *ArgsObjectMethod { ctx := msgpack.NewContext("Deserializing module-type: ObjectMethod") reader := msgpack.NewReadDecoder(ctx, argsBuf) @@ -320,7 +320,7 @@ func DeserializeObjectMethodArgs(argsBuf []byte) *MethodArgsObjectMethod { panic(reader.Context().PrintWithContext("Missing required property: 'objectArray: [AnotherType]'")) } - return &MethodArgsObjectMethod{ + return &ArgsObjectMethod{ Object: _object, OptObject: _optObject, ObjectArray: _objectArray, @@ -344,7 +344,7 @@ func WriteObjectMethodResult(writer msgpack.Write, value *AnotherType) { writer.Context().Pop() } -func DeserializeOptionalEnvMethodArgs(argsBuf []byte) *MethodArgsOptionalEnvMethod { +func DeserializeOptionalEnvMethodArgs(argsBuf []byte) *ArgsOptionalEnvMethod { ctx := msgpack.NewContext("Deserializing module-type: OptionalEnvMethod") reader := msgpack.NewReadDecoder(ctx, argsBuf) @@ -414,7 +414,7 @@ func DeserializeOptionalEnvMethodArgs(argsBuf []byte) *MethodArgsOptionalEnvMeth panic(reader.Context().PrintWithContext("Missing required property: 'objectArray: [AnotherType]'")) } - return &MethodArgsOptionalEnvMethod{ + return &ArgsOptionalEnvMethod{ Object: _object, OptObject: _optObject, ObjectArray: _objectArray, @@ -438,7 +438,7 @@ func WriteOptionalEnvMethodResult(writer msgpack.Write, value *AnotherType) { writer.Context().Pop() } -func DeserializeIfArgs(argsBuf []byte) *MethodArgsIf { +func DeserializeIfArgs(argsBuf []byte) *ArgsIf { ctx := msgpack.NewContext("Deserializing module-type: If") reader := msgpack.NewReadDecoder(ctx, argsBuf) @@ -466,7 +466,7 @@ func DeserializeIfArgs(argsBuf []byte) *MethodArgsIf { panic(reader.Context().PrintWithContext("Missing required property: 'if: else'")) } - return &MethodArgsIf{ + return &ArgsIf{ M_if: _if, } } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go index 31f8ea4d83..eb228b6267 100644 --- a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go +++ b/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go @@ -1,6 +1,6 @@ package types -type MethodArgsModuleMethod struct { +type ArgsModuleMethod struct { Str string `json:"str"` OptStr *string `json:"optStr"` En CustomEnum `json:"en"` @@ -14,20 +14,20 @@ type MethodArgsModuleMethod struct { MapOfArrOfObj map[string][]AnotherType `json:"mapOfArrOfObj"` } -type MethodArgsObjectMethod struct { +type ArgsObjectMethod struct { Object AnotherType `json:"object"` OptObject *AnotherType `json:"optObject"` ObjectArray []AnotherType `json:"objectArray"` OptObjectArray []*AnotherType `json:"optObjectArray"` } -type MethodArgsOptionalEnvMethod struct { +type ArgsOptionalEnvMethod struct { Object AnotherType `json:"object"` OptObject *AnotherType `json:"optObject"` ObjectArray []AnotherType `json:"objectArray"` OptObjectArray []*AnotherType `json:"optObjectArray"` } -type MethodArgsIf struct { +type ArgsIf struct { M_if Else `json:"if"` } diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/module/module.go b/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/module/module.go index 5517c49168..67c8df4810 100644 --- a/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/module/module.go +++ b/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/module/module.go @@ -2,6 +2,6 @@ package module import "example.com/go-wrap-test/module/wrap/types" -func Method(args *types.MethodArgsMethod) string { +func Method(args *types.ArgsMethod) string { return args.Arg } diff --git a/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/module/module.go b/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/module/module.go index 5517c49168..67c8df4810 100644 --- a/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/module/module.go +++ b/packages/test-cases/cases/cli/codegen/wasm/008-sanity-golang/module/module.go @@ -2,6 +2,6 @@ package module import "example.com/go-wrap-test/module/wrap/types" -func Method(args *types.MethodArgsMethod) string { +func Method(args *types.ArgsMethod) string { return args.Arg } From 420114d999bbb1600413a099c522480341a200d2 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Thu, 13 Jul 2023 05:28:14 +0200 Subject: [PATCH 094/181] chore: fix lint --- .../golang/transforms/moduleNeedsTypes.ts | 19 ++++++++++--------- .../schema/bind/src/bindings/golang/types.ts | 2 +- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/transforms/moduleNeedsTypes.ts b/packages/schema/bind/src/bindings/golang/transforms/moduleNeedsTypes.ts index 6e429f58ca..bf8b9db80e 100644 --- a/packages/schema/bind/src/bindings/golang/transforms/moduleNeedsTypes.ts +++ b/packages/schema/bind/src/bindings/golang/transforms/moduleNeedsTypes.ts @@ -1,11 +1,12 @@ +/* eslint-disable @typescript-eslint/naming-convention */ +import { isBaseType, isBuiltInType } from "../types"; + import { MethodDefinition, ModuleDefinition, } from "@polywrap/wrap-manifest-types-js"; import { AbiTransforms } from "@polywrap/schema-parse"; -import { isBaseType, isBuiltInType } from "../types"; - interface ModuleNeedsTypesState { moduleDefinition?: ModuleDefinition; needsTypes?: boolean; @@ -17,7 +18,7 @@ export function moduleNeedsTypes(): AbiTransforms { return { enter: { ModuleDefinition: (def: ModuleDefinition) => { - console.log("ENTER", def.type) + console.log("ENTER", def.type); state.moduleDefinition = def; state.needsTypes = false; return def; @@ -25,31 +26,31 @@ export function moduleNeedsTypes(): AbiTransforms { MethodDefinition: (def: MethodDefinition) => { console.log("METHOD", def.name); if (def.arguments && def.arguments.length > 0) { - console.log("NEEDS cause args") + console.log("NEEDS cause args"); state.needsTypes = true; } if (def.return) { const returnType = def.return.type; if (!isBaseType(returnType) && !isBuiltInType(returnType)) { - console.log("NEEDS cause ret") + console.log("NEEDS cause ret"); state.needsTypes = true; } } return def; - } + }, }, leave: { ModuleDefinition: (def: ModuleDefinition) => { - console.log("LEAVE", def.name) - const needsTypes = state.needsTypes + console.log("LEAVE", def.name); + const needsTypes = state.needsTypes; state.moduleDefinition = undefined; state.needsTypes = undefined; return { ...def, needsTypes, }; - } + }, }, }; } diff --git a/packages/schema/bind/src/bindings/golang/types.ts b/packages/schema/bind/src/bindings/golang/types.ts index bb55137c47..8c2087252d 100644 --- a/packages/schema/bind/src/bindings/golang/types.ts +++ b/packages/schema/bind/src/bindings/golang/types.ts @@ -35,4 +35,4 @@ export type BuiltInType = keyof BuiltInTypes; export function isBuiltInType(type: string): type is BuiltInType { return type in builtInTypes; -} \ No newline at end of file +} From 76847b78f162ad7bfbe89fbd6345890cbeb9b488 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Thu, 13 Jul 2023 05:39:49 +0200 Subject: [PATCH 095/181] chore: remove old test-cases --- .../asyncify/abis/memory-storage.graphql | 5 - .../cases/wrappers/wasm-go/asyncify/go.mod | 7 -- .../cases/wrappers/wasm-go/asyncify/go.sum | 4 - .../wasm-go/asyncify/module/method.go | 107 ------------------ .../wasm-go/asyncify/polywrap.build.yaml | 5 - .../wrappers/wasm-go/asyncify/polywrap.yaml | 12 -- .../wrappers/wasm-go/asyncify/schema.graphql | 62 ---------- .../cases/wrappers/wasm-go/bigint-type/go.mod | 7 -- .../cases/wrappers/wasm-go/bigint-type/go.sum | 4 - .../wasm-go/bigint-type/module/method.go | 21 ---- .../wasm-go/bigint-type/polywrap.build.yaml | 5 - .../wasm-go/bigint-type/polywrap.yaml | 9 -- .../wasm-go/bigint-type/schema.graphql | 12 -- .../cases/wrappers/wasm-go/bytes-type/go.mod | 7 -- .../cases/wrappers/wasm-go/bytes-type/go.sum | 4 - .../wasm-go/bytes-type/module/bytesMethod.go | 18 --- .../wasm-go/bytes-type/polywrap.build.yaml | 6 - .../wrappers/wasm-go/bytes-type/polywrap.yaml | 9 -- .../wasm-go/bytes-type/schema.graphql | 9 -- .../cases/wrappers/wasm-go/enum-types/go.mod | 7 -- .../cases/wrappers/wasm-go/enum-types/go.sum | 4 - .../wasm-go/enum-types/module/module.go | 13 --- .../wasm-go/enum-types/polywrap.build.yaml | 4 - .../wrappers/wasm-go/enum-types/polywrap.yaml | 9 -- .../wasm-go/enum-types/schema.graphql | 17 --- .../wasm-go/env-types/external/go.mod | 7 -- .../wasm-go/env-types/external/go.sum | 4 - .../env-types/external/module/module.go | 8 -- .../env-types/external/polywrap.build.yaml | 4 - .../wasm-go/env-types/external/polywrap.yaml | 9 -- .../wasm-go/env-types/external/schema.graphql | 8 -- .../test-interface/polywrap.yaml | 6 - .../test-interface/schema.graphql | 13 --- .../implementations/test-use-getImpl/go.mod | 7 -- .../implementations/test-use-getImpl/go.sum | 4 - .../test-use-getImpl/module/module.go | 20 ---- .../test-use-getImpl/polywrap.build.yaml | 5 - .../test-use-getImpl/polywrap.yaml | 12 -- .../test-use-getImpl/schema.graphql | 13 --- .../implementations/test-wrapper/go.mod | 7 -- .../implementations/test-wrapper/go.sum | 4 - .../test-wrapper/module/module.go | 15 --- .../test-wrapper/polywrap.build.yaml | 3 - .../test-wrapper/polywrap.yaml | 12 -- .../test-wrapper/schema.graphql | 11 -- .../wrappers/wasm-go/invalid-types/go.mod | 7 -- .../wrappers/wasm-go/invalid-types/go.sum | 4 - .../wasm-go/invalid-types/module/module.go | 26 ----- .../wasm-go/invalid-types/polywrap.build.yaml | 3 - .../wasm-go/invalid-types/polywrap.yaml | 9 -- .../wasm-go/invalid-types/schema.graphql | 21 ---- .../cases/wrappers/wasm-go/json-type/go.mod | 8 -- .../cases/wrappers/wasm-go/json-type/go.sum | 4 - .../wasm-go/json-type/module/module.go | 40 ------- .../wasm-go/json-type/polywrap.build.yaml | 3 - .../wrappers/wasm-go/json-type/polywrap.yaml | 9 -- .../wrappers/wasm-go/json-type/schema.graphql | 24 ---- .../cases/wrappers/wasm-go/map-type/go.mod | 7 -- .../cases/wrappers/wasm-go/map-type/go.sum | 4 - .../wasm-go/map-type/module/module.go | 17 --- .../wasm-go/map-type/polywrap.build.yaml | 3 - .../wrappers/wasm-go/map-type/polywrap.yaml | 9 -- .../wrappers/wasm-go/map-type/schema.graphql | 18 --- .../wrappers/wasm-go/number-types/go.mod | 7 -- .../wrappers/wasm-go/number-types/go.sum | 4 - .../wasm-go/number-types/module/module.go | 29 ----- .../wasm-go/number-types/polywrap.build.yaml | 3 - .../wasm-go/number-types/polywrap.yaml | 9 -- .../wasm-go/number-types/schema.graphql | 32 ------ .../wrappers/wasm-go/object-types/go.mod | 7 -- .../wrappers/wasm-go/object-types/go.sum | 4 - .../wasm-go/object-types/module/module.go | 55 --------- .../wasm-go/object-types/polywrap.build.yaml | 3 - .../wasm-go/object-types/polywrap.yaml | 9 -- .../wasm-go/object-types/schema.graphql | 45 -------- 75 files changed, 962 deletions(-) delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/asyncify/abis/memory-storage.graphql delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/asyncify/go.mod delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/asyncify/go.sum delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/asyncify/module/method.go delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/asyncify/polywrap.build.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/asyncify/polywrap.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/asyncify/schema.graphql delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/bigint-type/go.mod delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/bigint-type/go.sum delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/bigint-type/module/method.go delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/bigint-type/polywrap.build.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/bigint-type/polywrap.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/bigint-type/schema.graphql delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/bytes-type/go.mod delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/bytes-type/go.sum delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/bytes-type/module/bytesMethod.go delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/bytes-type/polywrap.build.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/bytes-type/polywrap.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/bytes-type/schema.graphql delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/enum-types/go.mod delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/enum-types/go.sum delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/enum-types/module/module.go delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/enum-types/polywrap.build.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/enum-types/polywrap.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/enum-types/schema.graphql delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/env-types/external/go.mod delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/env-types/external/go.sum delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/env-types/external/module/module.go delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/env-types/external/polywrap.build.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/env-types/external/polywrap.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/env-types/external/schema.graphql delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-interface/polywrap.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-interface/schema.graphql delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/go.mod delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/go.sum delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/module/module.go delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/polywrap.build.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/polywrap.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/schema.graphql delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/go.mod delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/go.sum delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/module/module.go delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/polywrap.build.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/polywrap.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/schema.graphql delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/invalid-types/go.mod delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/invalid-types/go.sum delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/invalid-types/module/module.go delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/invalid-types/polywrap.build.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/invalid-types/polywrap.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/invalid-types/schema.graphql delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/json-type/go.mod delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/json-type/go.sum delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/json-type/module/module.go delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/json-type/polywrap.build.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/json-type/polywrap.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/json-type/schema.graphql delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/map-type/go.mod delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/map-type/go.sum delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/map-type/module/module.go delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/map-type/polywrap.build.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/map-type/polywrap.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/map-type/schema.graphql delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/number-types/go.mod delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/number-types/go.sum delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/number-types/module/module.go delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/number-types/polywrap.build.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/number-types/polywrap.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/number-types/schema.graphql delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/object-types/go.mod delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/object-types/go.sum delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/object-types/module/module.go delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/object-types/polywrap.build.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/object-types/polywrap.yaml delete mode 100644 packages/test-cases/cases/wrappers/wasm-go/object-types/schema.graphql diff --git a/packages/test-cases/cases/wrappers/wasm-go/asyncify/abis/memory-storage.graphql b/packages/test-cases/cases/wrappers/wasm-go/asyncify/abis/memory-storage.graphql deleted file mode 100644 index c10ae67370..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/asyncify/abis/memory-storage.graphql +++ /dev/null @@ -1,5 +0,0 @@ -type Module { - getData: Int32! - - setData(value: Int32!): Boolean! -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/asyncify/go.mod b/packages/test-cases/cases/wrappers/wasm-go/asyncify/go.mod deleted file mode 100644 index dbfd3f2ddf..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/asyncify/go.mod +++ /dev/null @@ -1,7 +0,0 @@ -module github.com/testorg/testrepo - -go 1.17 - -require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba - -require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/asyncify/go.sum b/packages/test-cases/cases/wrappers/wasm-go/asyncify/go.sum deleted file mode 100644 index 89ffed76d2..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/asyncify/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= -github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= -github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/asyncify/module/method.go b/packages/test-cases/cases/wrappers/wasm-go/asyncify/module/method.go deleted file mode 100644 index 636b37e9be..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/asyncify/module/method.go +++ /dev/null @@ -1,107 +0,0 @@ -package module - -import ( - "strconv" - - "github.com/testorg/testrepo/wrap/imported/storage" - "github.com/testorg/testrepo/wrap/types" -) - -//go:generate polywrap build -v -m ../polywrap.yaml -o ../build - -func GetData() uint32 { - res, err := storage.MethodGetData(nil) - if err != nil { - panic(err) - } - return uint32(res) -} - -func ReturnTrue() bool { - return true -} - -func SetDataWithLargeArgs(args *types.MethodArgsSetDataWithLargeArgs) string { - largeString := args.Value - num, err := strconv.ParseInt(largeString, 10, 32) - if err != nil { - panic(err) - } - _, err = storage.MethodSetData(&storage.ArgsSetData{Value: int32(num)}) - if err != nil { - panic(err) - } - return largeString -} - -func SetDataWithManyArgs(args *types.MethodArgsSetDataWithManyArgs) string { - argsA := args.ValueA - argsB := args.ValueB - argsC := args.ValueC - argsD := args.ValueD - argsE := args.ValueE - argsF := args.ValueF - argsG := args.ValueG - argsH := args.ValueH - argsI := args.ValueI - argsJ := args.ValueJ - argsK := args.ValueK - argsL := args.ValueL - - _, err := storage.MethodSetData(&storage.ArgsSetData{Value: 55}) - if err != nil { - panic(err) - } - - return argsA + argsB + argsC + argsD + argsE + argsF + argsG + argsH + argsI + argsJ + argsK + argsL -} - -func SetDataWithManyStructuredArgs(args *types.MethodArgsSetDataWithManyStructuredArgs) bool { - _, err := storage.MethodSetData(&storage.ArgsSetData{Value: 44}) - if err != nil { - panic(err) - } - return true -} - -func LocalVarMethod() bool { - functionArg := false - functionArg = ReturnTrue() - - _, err := storage.MethodSetData(&storage.ArgsSetData{Value: 88}) - if err != nil { - panic(err) - } - - return functionArg -} - -var globalValue bool = false - -func GlobalVarMethod() bool { - globalValue = true - - _, err := storage.MethodSetData(&storage.ArgsSetData{Value: 77}) - if err != nil { - panic(err) - } - - return globalValue -} - -func SubsequentInvokes(args *types.MethodArgsSubsequentInvokes) []string { - result := make([]string, args.NumberOfTimes) - for i := int32(0); i < args.NumberOfTimes; i++ { - _, err := storage.MethodSetData(&storage.ArgsSetData{Value: i}) - if err != nil { - panic(err) - } - res, err := storage.MethodGetData(nil) - if err != nil { - panic(err) - } - result[i] = strconv.FormatInt(int64(res), 10) - } - - return result -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/asyncify/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/asyncify/polywrap.build.yaml deleted file mode 100644 index e768939364..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/asyncify/polywrap.build.yaml +++ /dev/null @@ -1,5 +0,0 @@ -format: 0.1.0 -docker: - name: asyncify-wasm-go -config: - node_version: "16.13.0" diff --git a/packages/test-cases/cases/wrappers/wasm-go/asyncify/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/asyncify/polywrap.yaml deleted file mode 100644 index 374d0c2aae..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/asyncify/polywrap.yaml +++ /dev/null @@ -1,12 +0,0 @@ -format: 0.2.0 -project: - name: Asyncify - type: wasm/golang -source: - schema: ./schema.graphql - module: ./go.mod - import_abis: - - uri: "ens/memory-storage.polywrap.eth" - abi: ./abis/memory-storage.graphql -extensions: - build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/asyncify/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/asyncify/schema.graphql deleted file mode 100644 index 2660ba2f06..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/asyncify/schema.graphql +++ /dev/null @@ -1,62 +0,0 @@ -#import { Module } into Storage from "wrap://ens/memory-storage.polywrap.eth" - -type Module { - getData: UInt32! - - setDataWithLargeArgs( - value: String! - ): String! - - setDataWithManyArgs( - valueA: String! - valueB: String! - valueC: String! - valueD: String! - valueE: String! - valueF: String! - valueG: String! - valueH: String! - valueI: String! - valueJ: String! - valueK: String! - valueL: String! - ): String! - - setDataWithManyStructuredArgs( - valueA: BigObj! - valueB: BigObj! - valueC: BigObj! - valueD: BigObj! - valueE: BigObj! - valueF: BigObj! - valueG: BigObj! - valueH: BigObj! - valueI: BigObj! - valueJ: BigObj! - valueK: BigObj! - valueL: BigObj! - ): Boolean! - - localVarMethod: Boolean! - - globalVarMethod: Boolean! - - subsequentInvokes( - numberOfTimes: Int! - ): [String!]! -} - -type BigObj { - propA: String! - propB: String! - propC: String! - propD: String! - propE: String! - propF: String! - propG: String! - propH: String! - propI: String! - propJ: String! - propK: String! - propL: String! -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/go.mod b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/go.mod deleted file mode 100644 index dbfd3f2ddf..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/go.mod +++ /dev/null @@ -1,7 +0,0 @@ -module github.com/testorg/testrepo - -go 1.17 - -require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba - -require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/go.sum b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/go.sum deleted file mode 100644 index 89ffed76d2..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= -github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= -github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/module/method.go b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/module/method.go deleted file mode 100644 index 0b0b81b7d4..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/module/method.go +++ /dev/null @@ -1,21 +0,0 @@ -package module - -import ( - "github.com/consideritdone/polywrap-go/polywrap/msgpack/big" - "github.com/testorg/testrepo/wrap/types" -) - -//go:generate polywrap build -v -m ../polywrap.yaml -o ../build -func Method(args *types.MethodArgsMethod) *big.Int { - result := new(big.Int).Mul(args.Arg1, args.Obj.Prop1) - - if args.Arg2 != nil { - result = result.Mul(result, args.Arg2) - } - - if args.Obj.Prop2 != nil { - result = result.Mul(result, args.Obj.Prop2) - } - - return result -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/polywrap.build.yaml deleted file mode 100644 index 46c036809b..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/polywrap.build.yaml +++ /dev/null @@ -1,5 +0,0 @@ -format: 0.1.0 -docker: - name: bigint-type-wasm-go -config: - node_version: "16.13.0" diff --git a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/polywrap.yaml deleted file mode 100644 index bea7b6b71b..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/polywrap.yaml +++ /dev/null @@ -1,9 +0,0 @@ -format: 0.2.0 -project: - name: BigInt - type: wasm/golang -source: - schema: ./schema.graphql - module: ./go.mod -extensions: - build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/bigint-type/schema.graphql deleted file mode 100644 index 7696ac2202..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/bigint-type/schema.graphql +++ /dev/null @@ -1,12 +0,0 @@ -type Module { - method( - arg1: BigInt! - arg2: BigInt - obj: BigIntArg! - ): BigInt! -} - -type BigIntArg { - prop1: BigInt! - prop2: BigInt -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/go.mod b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/go.mod deleted file mode 100644 index dbfd3f2ddf..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/go.mod +++ /dev/null @@ -1,7 +0,0 @@ -module github.com/testorg/testrepo - -go 1.17 - -require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba - -require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/go.sum b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/go.sum deleted file mode 100644 index 89ffed76d2..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= -github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= -github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/module/bytesMethod.go b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/module/bytesMethod.go deleted file mode 100644 index c57eba5f50..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/module/bytesMethod.go +++ /dev/null @@ -1,18 +0,0 @@ -package module - -import ( - "bytes" - - "github.com/testorg/testrepo/wrap/types" -) - -//go:generate polywrap build -v -m ../polywrap.yaml -o ../build -func BytesMethod(args *types.MethodArgsBytesMethod) []byte { - return bytes.Join( - [][]byte{ - args.Arg.Prop, - []byte("Sanity!"), - }, - []byte(" "), - ) -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/polywrap.build.yaml deleted file mode 100644 index 2657f101fd..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/polywrap.build.yaml +++ /dev/null @@ -1,6 +0,0 @@ -format: 0.1.0 -docker: - name: bytes-type-wasm-go -config: - node_version: "16.13.0" - diff --git a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/polywrap.yaml deleted file mode 100644 index 292392bba4..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/polywrap.yaml +++ /dev/null @@ -1,9 +0,0 @@ -format: 0.2.0 -project: - name: BytesType - type: wasm/golang -source: - schema: ./schema.graphql - module: ./go.mod -extensions: - build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/bytes-type/schema.graphql deleted file mode 100644 index 44dc183585..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/bytes-type/schema.graphql +++ /dev/null @@ -1,9 +0,0 @@ -type Module { - bytesMethod( - arg: Args! - ): Bytes! -} - -type Args { - prop: Bytes! -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/enum-types/go.mod b/packages/test-cases/cases/wrappers/wasm-go/enum-types/go.mod deleted file mode 100644 index dbfd3f2ddf..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/enum-types/go.mod +++ /dev/null @@ -1,7 +0,0 @@ -module github.com/testorg/testrepo - -go 1.17 - -require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba - -require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/enum-types/go.sum b/packages/test-cases/cases/wrappers/wasm-go/enum-types/go.sum deleted file mode 100644 index 89ffed76d2..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/enum-types/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= -github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= -github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/enum-types/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/enum-types/module/module.go deleted file mode 100644 index 9e91033414..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/enum-types/module/module.go +++ /dev/null @@ -1,13 +0,0 @@ -package module - -import "github.com/testorg/testrepo/wrap/types" - -//go:generate polywrap build -v -m ../polywrap.yaml -o ../build - -func Method1(args *types.MethodArgsMethod1) types.SanityEnum { - return args.En -} - -func Method2(args *types.MethodArgsMethod2) []types.SanityEnum { - return args.EnumArray -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/enum-types/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/enum-types/polywrap.build.yaml deleted file mode 100644 index f41ac3765e..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/enum-types/polywrap.build.yaml +++ /dev/null @@ -1,4 +0,0 @@ -format: 0.1.0 -config: - node_version: "16.13.0" - diff --git a/packages/test-cases/cases/wrappers/wasm-go/enum-types/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/enum-types/polywrap.yaml deleted file mode 100644 index 49939f942e..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/enum-types/polywrap.yaml +++ /dev/null @@ -1,9 +0,0 @@ -format: 0.2.0 -project: - name: EnumTypes - type: wasm/golang -source: - schema: ./schema.graphql - module: ./go.mod -extensions: - build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/enum-types/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/enum-types/schema.graphql deleted file mode 100644 index 3bfbc465be..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/enum-types/schema.graphql +++ /dev/null @@ -1,17 +0,0 @@ -type Module { - method1( - en: SanityEnum! - optEnum: SanityEnum - ): SanityEnum! - - method2( - enumArray: [SanityEnum!]! - optEnumArray: [SanityEnum] - ): [SanityEnum!]! -} - -enum SanityEnum { - OPTION1 - OPTION2 - OPTION3 -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/go.mod b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/go.mod deleted file mode 100644 index dbfd3f2ddf..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/go.mod +++ /dev/null @@ -1,7 +0,0 @@ -module github.com/testorg/testrepo - -go 1.17 - -require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba - -require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/go.sum b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/go.sum deleted file mode 100644 index 89ffed76d2..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= -github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= -github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/module/module.go deleted file mode 100644 index 63caecec92..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/module/module.go +++ /dev/null @@ -1,8 +0,0 @@ -package module - -import "github.com/testorg/testrepo/wrap/types" - -//go:generate polywrap build -v -m ../polywrap.yaml -o ../build -func ExternalEnvMethod(env *types.Env) types.Env { - return *env -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/polywrap.build.yaml deleted file mode 100644 index f41ac3765e..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/polywrap.build.yaml +++ /dev/null @@ -1,4 +0,0 @@ -format: 0.1.0 -config: - node_version: "16.13.0" - diff --git a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/polywrap.yaml deleted file mode 100644 index 065819aec2..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/polywrap.yaml +++ /dev/null @@ -1,9 +0,0 @@ -format: 0.2.0 -project: - name: EnvTypeExternal - type: wasm/golang -source: - schema: ./schema.graphql - module: ./go.mod -extensions: - build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/env-types/external/schema.graphql deleted file mode 100644 index d2325113e2..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/env-types/external/schema.graphql +++ /dev/null @@ -1,8 +0,0 @@ -type Env { - externalArray: [UInt32!]! - externalString: String! -} - -type Module { - externalEnvMethod: Env! @env(required: true) -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-interface/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-interface/polywrap.yaml deleted file mode 100644 index b2e18e3c2f..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-interface/polywrap.yaml +++ /dev/null @@ -1,6 +0,0 @@ -format: 0.2.0 -project: - name: TestInterface - type: interface -source: - schema: ./schema.graphql diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-interface/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-interface/schema.graphql deleted file mode 100644 index b80a6e620b..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-interface/schema.graphql +++ /dev/null @@ -1,13 +0,0 @@ -type Module { - abstractModuleMethod( - arg: Argument! - ): String! -} - -type Argument { - str: String! -} - -type InterfaceType { - uint8: UInt8! -} \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/go.mod b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/go.mod deleted file mode 100644 index dbfd3f2ddf..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/go.mod +++ /dev/null @@ -1,7 +0,0 @@ -module github.com/testorg/testrepo - -go 1.17 - -require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba - -require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/go.sum b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/go.sum deleted file mode 100644 index 89ffed76d2..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= -github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= -github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/module/module.go deleted file mode 100644 index 9e4d85a0b2..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/module/module.go +++ /dev/null @@ -1,20 +0,0 @@ -package module - -import ( - "github.com/testorg/testrepo/wrap/interfaces" - "github.com/testorg/testrepo/wrap/types" -) - -//go:generate polywrap build -v -m ../polywrap.yaml -o ../build - -func ModuleImplementations() []string { - return interfaces.InterfaceImplementations() -} - -func ModuleMethod(args *types.MethodArgsModuleMethod) types.ImplementationType { - return args.Arg -} - -func AbstractModuleMethod(args *types.MethodArgsAbstractModuleMethod) string { - return args.Arg.Str -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/polywrap.build.yaml deleted file mode 100644 index a7ca19eefa..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/polywrap.build.yaml +++ /dev/null @@ -1,5 +0,0 @@ -format: 0.1.0 -docker: - name: test-use-get-impl-wasm-as -config: - node_version: "16.13.0" diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/polywrap.yaml deleted file mode 100644 index 7d275c3de4..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/polywrap.yaml +++ /dev/null @@ -1,12 +0,0 @@ -format: 0.2.0 -project: - name: TestUseGetImpl - type: wasm/golang -source: - schema: ./schema.graphql - module: ./go.mod - import_abis: - - uri: wrap://ens/interface.eth - abi: ../test-interface/build/wrap.info -extensions: - build: ./polywrap.build.yaml diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/schema.graphql deleted file mode 100644 index bd51ae7828..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-use-getImpl/schema.graphql +++ /dev/null @@ -1,13 +0,0 @@ -#import { Module, InterfaceType } into Interface from "wrap://ens/interface.eth" -#use { getImplementations } for Interface - -type Module implements Interface_Module { - moduleImplementations: [String!]! - moduleMethod( - arg: ImplementationType! - ): ImplementationType! -} - -type ImplementationType implements Interface_InterfaceType { - str: String! -} \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/go.mod b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/go.mod deleted file mode 100644 index dbfd3f2ddf..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/go.mod +++ /dev/null @@ -1,7 +0,0 @@ -module github.com/testorg/testrepo - -go 1.17 - -require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba - -require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/go.sum b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/go.sum deleted file mode 100644 index 89ffed76d2..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= -github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= -github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/module/module.go deleted file mode 100644 index 53dcaeb681..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/module/module.go +++ /dev/null @@ -1,15 +0,0 @@ -package module - -import ( - "github.com/testorg/testrepo/wrap/types" -) - -//go:generate polywrap build -v -m ../polywrap.yaml -o ../build - -func ModuleMethod(args *types.MethodArgsModuleMethod) types.ImplementationType { - return args.Arg -} - -func AbstractModuleMethod(args *types.MethodArgsAbstractModuleMethod) string { - return args.Arg.Str -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/polywrap.build.yaml deleted file mode 100644 index aa5f7201ed..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/polywrap.build.yaml +++ /dev/null @@ -1,3 +0,0 @@ -format: 0.1.0 -config: - node_version: "16.13.0" diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/polywrap.yaml deleted file mode 100644 index c9fafb06d2..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/polywrap.yaml +++ /dev/null @@ -1,12 +0,0 @@ -format: 0.2.0 -project: - name: TestWrapper - type: wasm/golang -source: - schema: ./schema.graphql - module: ./go.mod - import_abis: - - uri: wrap://ens/interface.eth - abi: ../test-interface/build/wrap.info -extensions: - build: ./polywrap.build.yaml diff --git a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/schema.graphql deleted file mode 100644 index 0b28cfb495..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/implementations/test-wrapper/schema.graphql +++ /dev/null @@ -1,11 +0,0 @@ -#import { Module, InterfaceType } into Interface from "wrap://ens/interface.eth" - -type Module implements Interface_Module { - moduleMethod( - arg: ImplementationType! - ): ImplementationType! -} - -type ImplementationType implements Interface_InterfaceType { - str: String! -} \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/go.mod b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/go.mod deleted file mode 100644 index dbfd3f2ddf..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/go.mod +++ /dev/null @@ -1,7 +0,0 @@ -module github.com/testorg/testrepo - -go 1.17 - -require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba - -require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/go.sum b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/go.sum deleted file mode 100644 index 89ffed76d2..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= -github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= -github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/module/module.go deleted file mode 100644 index 5981ee38b3..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/module/module.go +++ /dev/null @@ -1,26 +0,0 @@ -package module - -import ( - "github.com/testorg/testrepo/wrap/types" -) - -//go:generate polywrap build -v -m ../polywrap.yaml -o ../build -func BoolMethod(args *types.MethodArgsBoolMethod) bool { - return args.Arg -} - -func IntMethod(args *types.MethodArgsIntMethod) int32 { - return args.Arg -} - -func UIntMethod(args *types.MethodArgsUIntMethod) uint32 { - return args.Arg -} - -func BytesMethod(args *types.MethodArgsBytesMethod) []byte { - return args.Arg -} - -func ArrayMethod(args *types.MethodArgsArrayMethod) []string { - return args.Arg -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/polywrap.build.yaml deleted file mode 100644 index aa5f7201ed..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/polywrap.build.yaml +++ /dev/null @@ -1,3 +0,0 @@ -format: 0.1.0 -config: - node_version: "16.13.0" diff --git a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/polywrap.yaml deleted file mode 100644 index 5b2b05d01b..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/polywrap.yaml +++ /dev/null @@ -1,9 +0,0 @@ -format: 0.2.0 -project: - name: InvalidTypes - type: wasm/golang -source: - schema: ./schema.graphql - module: ./go.mod -extensions: - build: ./polywrap.build.yaml diff --git a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/invalid-types/schema.graphql deleted file mode 100644 index 5df1ac9c73..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/invalid-types/schema.graphql +++ /dev/null @@ -1,21 +0,0 @@ -type Module { - boolMethod( - arg: Boolean! - ): Boolean! - - intMethod( - arg: Int32! - ): Int32! - - uIntMethod( - arg: UInt32! - ): UInt32! - - bytesMethod( - arg: Bytes! - ): Bytes! - - arrayMethod( - arg: [String!]! - ): [String!] -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/json-type/go.mod b/packages/test-cases/cases/wrappers/wasm-go/json-type/go.mod deleted file mode 100644 index 6018d3c1c5..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/json-type/go.mod +++ /dev/null @@ -1,8 +0,0 @@ -module github.com/testorg/testrepo - -go 1.17 - -require ( - github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba - github.com/valyala/fastjson v1.6.3 -) diff --git a/packages/test-cases/cases/wrappers/wasm-go/json-type/go.sum b/packages/test-cases/cases/wrappers/wasm-go/json-type/go.sum deleted file mode 100644 index 89ffed76d2..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/json-type/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= -github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= -github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/json-type/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/json-type/module/module.go deleted file mode 100644 index 62ab2b2d04..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/json-type/module/module.go +++ /dev/null @@ -1,40 +0,0 @@ -package module - -import ( - "github.com/testorg/testrepo/wrap/types" - "github.com/valyala/fastjson" -) - -//go:generate polywrap build -v -m ../polywrap.yaml -o ../build - -func Parse(args *types.MethodArgsParse) *fastjson.Value { - return fastjson.MustParse(args.Value) -} - -func Stringify(args *types.MethodArgsStringify) string { - str := "" - for i := range args.Values { - str += args.Values[i].String() - } - return str -} - -func StringifyObject(args *types.MethodArgsStringifyObject) string { - str := "" - str += args.Object.JsonA.String() - str += args.Object.JsonB.String() - return str -} - -func MethodJSON(args *types.MethodArgsMethodJSON) *fastjson.Value { - arena := new(fastjson.Arena) - result := arena.NewObject() - result.Set("valueA", arena.NewNumberInt(int(args.ValueA))) - result.Set("valueB", arena.NewString(args.ValueB)) - if args.ValueC { - result.Set("valueC", arena.NewTrue()) - } else { - result.Set("valueC", arena.NewFalse()) - } - return result -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/json-type/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/json-type/polywrap.build.yaml deleted file mode 100644 index aa5f7201ed..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/json-type/polywrap.build.yaml +++ /dev/null @@ -1,3 +0,0 @@ -format: 0.1.0 -config: - node_version: "16.13.0" diff --git a/packages/test-cases/cases/wrappers/wasm-go/json-type/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/json-type/polywrap.yaml deleted file mode 100644 index 91efb8d20a..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/json-type/polywrap.yaml +++ /dev/null @@ -1,9 +0,0 @@ -format: 0.2.0 -project: - name: JsonType - type: wasm/golang -source: - schema: ./schema.graphql - module: ./go.mod -extensions: - build: ./polywrap.build.yaml diff --git a/packages/test-cases/cases/wrappers/wasm-go/json-type/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/json-type/schema.graphql deleted file mode 100644 index cb60b87271..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/json-type/schema.graphql +++ /dev/null @@ -1,24 +0,0 @@ -type Module { - parse( - value: String! - ): JSON! - - stringify( - values: [JSON!]! - ): String! - - stringifyObject( - object: Object! - ): String! - - methodJSON( - valueA: Int! - valueB: String! - valueC: Boolean! - ): JSON! -} - -type Object { - jsonA: JSON! - jsonB: JSON! -} \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/map-type/go.mod b/packages/test-cases/cases/wrappers/wasm-go/map-type/go.mod deleted file mode 100644 index dbfd3f2ddf..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/map-type/go.mod +++ /dev/null @@ -1,7 +0,0 @@ -module github.com/testorg/testrepo - -go 1.17 - -require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba - -require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/map-type/go.sum b/packages/test-cases/cases/wrappers/wasm-go/map-type/go.sum deleted file mode 100644 index 89ffed76d2..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/map-type/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= -github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= -github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/map-type/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/map-type/module/module.go deleted file mode 100644 index 511395f40e..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/map-type/module/module.go +++ /dev/null @@ -1,17 +0,0 @@ -package module - -import "github.com/testorg/testrepo/wrap/types" - -//go:generate polywrap build -v -m ../polywrap.yaml -o ../build - -func GetKey(args *types.MethodArgsGetKey) int32 { - return args.Foo.M_map[args.Key] -} - -func ReturnMap(args *types.MethodArgsReturnMap) map[string]int32 { - return args.M_map -} - -func ReturnCustomMap(args *types.MethodArgsReturnCustomMap) types.CustomMap { - return args.Foo -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/map-type/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/map-type/polywrap.build.yaml deleted file mode 100644 index aa5f7201ed..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/map-type/polywrap.build.yaml +++ /dev/null @@ -1,3 +0,0 @@ -format: 0.1.0 -config: - node_version: "16.13.0" diff --git a/packages/test-cases/cases/wrappers/wasm-go/map-type/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/map-type/polywrap.yaml deleted file mode 100644 index 292392bba4..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/map-type/polywrap.yaml +++ /dev/null @@ -1,9 +0,0 @@ -format: 0.2.0 -project: - name: BytesType - type: wasm/golang -source: - schema: ./schema.graphql - module: ./go.mod -extensions: - build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/map-type/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/map-type/schema.graphql deleted file mode 100644 index b79ca553c5..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/map-type/schema.graphql +++ /dev/null @@ -1,18 +0,0 @@ -type Module { - getKey( - key: String! - foo: CustomMap! - ): Int! - - returnMap( - map: Map! @annotate(type: "Map!") - ): Map! @annotate(type: "Map!") - - returnCustomMap( - foo: CustomMap! - ): CustomMap! -} - -type CustomMap { - map: Map! @annotate(type: "Map!") -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/number-types/go.mod b/packages/test-cases/cases/wrappers/wasm-go/number-types/go.mod deleted file mode 100644 index dbfd3f2ddf..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/number-types/go.mod +++ /dev/null @@ -1,7 +0,0 @@ -module github.com/testorg/testrepo - -go 1.17 - -require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba - -require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/number-types/go.sum b/packages/test-cases/cases/wrappers/wasm-go/number-types/go.sum deleted file mode 100644 index 89ffed76d2..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/number-types/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= -github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= -github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/number-types/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/number-types/module/module.go deleted file mode 100644 index 35be7fc298..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/number-types/module/module.go +++ /dev/null @@ -1,29 +0,0 @@ -package module - -import "github.com/testorg/testrepo/wrap/types" - -//go:generate polywrap build -v -m ../polywrap.yaml -o ../build - -func I8Method(args *types.MethodArgsI8Method) int8 { - return args.First + args.Second -} - -func U8Method(args *types.MethodArgsU8Method) uint8 { - return args.First + args.Second -} - -func I16Method(args *types.MethodArgsI16Method) int16 { - return args.First + args.Second -} - -func U16Method(args *types.MethodArgsU16Method) uint16 { - return args.First + args.Second -} - -func I32Method(args *types.MethodArgsI32Method) int32 { - return args.First + args.Second -} - -func U32Method(args *types.MethodArgsU32Method) uint32 { - return args.First + args.Second -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/number-types/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/number-types/polywrap.build.yaml deleted file mode 100644 index d16e9c9f18..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/number-types/polywrap.build.yaml +++ /dev/null @@ -1,3 +0,0 @@ -format: 0.1.0 -config: - node_version: "16.13.0" \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/number-types/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/number-types/polywrap.yaml deleted file mode 100644 index cbef1cd38d..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/number-types/polywrap.yaml +++ /dev/null @@ -1,9 +0,0 @@ -format: 0.2.0 -project: - name: NumberTypes - type: wasm/golang -source: - schema: ./schema.graphql - module: ./go.mod -extensions: - build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/number-types/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/number-types/schema.graphql deleted file mode 100644 index 81d5005b5a..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/number-types/schema.graphql +++ /dev/null @@ -1,32 +0,0 @@ -type Module { - - i8Method( - first: Int8! - second: Int8! - ): Int8! - - u8Method( - first: UInt8! - second: UInt8! - ): UInt8! - - i16Method( - first: Int16! - second: Int16! - ): Int16! - - u16Method( - first: UInt16! - second: UInt16! - ): UInt16! - - i32Method( - first: Int! - second: Int! - ): Int! - - u32Method( - first: UInt32! - second: UInt32! - ): UInt32! -} \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/object-types/go.mod b/packages/test-cases/cases/wrappers/wasm-go/object-types/go.mod deleted file mode 100644 index dbfd3f2ddf..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/object-types/go.mod +++ /dev/null @@ -1,7 +0,0 @@ -module github.com/testorg/testrepo - -go 1.17 - -require github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba - -require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/wrappers/wasm-go/object-types/go.sum b/packages/test-cases/cases/wrappers/wasm-go/object-types/go.sum deleted file mode 100644 index 89ffed76d2..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/object-types/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba h1:zalC+tj7u2wwOA53sJPvPwrIr6bgQF/5KiULuAi0tcE= -github.com/consideritdone/polywrap-go v0.0.0-20220828165033-42498c4ffdba/go.mod h1:IHk2chh2cl2rACqPLh5sE1LKTooxw19biP+zzYOiULg= -github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= -github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/test-cases/cases/wrappers/wasm-go/object-types/module/module.go b/packages/test-cases/cases/wrappers/wasm-go/object-types/module/module.go deleted file mode 100644 index 9ecf0355cc..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/object-types/module/module.go +++ /dev/null @@ -1,55 +0,0 @@ -package module - -import "github.com/testorg/testrepo/wrap/types" - -//go:generate polywrap build -v -m ../polywrap.yaml -o ../build - -func Method1(args *types.MethodArgsMethod1) []types.Output { - out1 := types.Output{ - Prop: args.Arg1.Prop, - Nested: types.Nested{ - Prop: args.Arg1.Nested.Prop, - }, - } - out2 := types.Output{} - if args.Arg2 != nil { - out2 = types.Output{ - Prop: args.Arg2.Prop, - Nested: types.Nested{ - Prop: args.Arg2.Circular.Prop, - }, - } - } - return []types.Output{out1, out2} -} - -func Method2(args *types.MethodArgsMethod2) *types.Output { - if args == nil { - return nil - } - return &types.Output{ - Prop: args.Arg.Prop, - Nested: types.Nested{ - Prop: args.Arg.Nested.Prop, - }, - } -} - -func Method3(args *types.MethodArgsMethod3) []*types.Output { - out2 := &types.Output{ - Prop: args.Arg.Prop, - Nested: types.Nested{ - Prop: args.Arg.Nested.Prop, - }, - } - return []*types.Output{nil, out2} -} - -func Method5(args *types.MethodArgsMethod5) types.Output { - return types.Output{ - Prop: string(args.Arg.Prop), - Nested: types.Nested{ - Prop: "nested prop", - }, - } -} diff --git a/packages/test-cases/cases/wrappers/wasm-go/object-types/polywrap.build.yaml b/packages/test-cases/cases/wrappers/wasm-go/object-types/polywrap.build.yaml deleted file mode 100644 index d16e9c9f18..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/object-types/polywrap.build.yaml +++ /dev/null @@ -1,3 +0,0 @@ -format: 0.1.0 -config: - node_version: "16.13.0" \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/object-types/polywrap.yaml b/packages/test-cases/cases/wrappers/wasm-go/object-types/polywrap.yaml deleted file mode 100644 index 1bf4bdb549..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/object-types/polywrap.yaml +++ /dev/null @@ -1,9 +0,0 @@ -format: 0.2.0 -project: - name: ObjectTypes - type: wasm/golang -source: - schema: ./schema.graphql - module: ./go.mod -extensions: - build: ./polywrap.build.yaml \ No newline at end of file diff --git a/packages/test-cases/cases/wrappers/wasm-go/object-types/schema.graphql b/packages/test-cases/cases/wrappers/wasm-go/object-types/schema.graphql deleted file mode 100644 index 03f068148a..0000000000 --- a/packages/test-cases/cases/wrappers/wasm-go/object-types/schema.graphql +++ /dev/null @@ -1,45 +0,0 @@ -type Module { - method1( - arg1: Arg1! - arg2: Arg2 - ): [Output!]! - - method2( - arg: Arg1! - ): Output - - method3( - arg: Arg1! - ): [Output]! - - method5( - arg: Arg3! - ): Output! -} - -type Arg1 { - prop: String! - nested: Nested! -} - -type Arg2 { - prop: String! - circular: Circular! -} - -type Arg3 { - prop: Bytes! -} - -type Output { - prop: String! - nested: Nested! -} - -type Nested { - prop: String! -} - -type Circular { - prop: String! -} From ce4a9c17e8a0ec6c33b42602f4558de05162d893 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Thu, 13 Jul 2023 05:45:49 +0200 Subject: [PATCH 096/181] chore: remove debug logging --- .../bind/src/bindings/golang/transforms/moduleNeedsTypes.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/transforms/moduleNeedsTypes.ts b/packages/schema/bind/src/bindings/golang/transforms/moduleNeedsTypes.ts index bf8b9db80e..060a8f9936 100644 --- a/packages/schema/bind/src/bindings/golang/transforms/moduleNeedsTypes.ts +++ b/packages/schema/bind/src/bindings/golang/transforms/moduleNeedsTypes.ts @@ -18,22 +18,18 @@ export function moduleNeedsTypes(): AbiTransforms { return { enter: { ModuleDefinition: (def: ModuleDefinition) => { - console.log("ENTER", def.type); state.moduleDefinition = def; state.needsTypes = false; return def; }, MethodDefinition: (def: MethodDefinition) => { - console.log("METHOD", def.name); if (def.arguments && def.arguments.length > 0) { - console.log("NEEDS cause args"); state.needsTypes = true; } if (def.return) { const returnType = def.return.type; if (!isBaseType(returnType) && !isBuiltInType(returnType)) { - console.log("NEEDS cause ret"); state.needsTypes = true; } } @@ -42,7 +38,6 @@ export function moduleNeedsTypes(): AbiTransforms { }, leave: { ModuleDefinition: (def: ModuleDefinition) => { - console.log("LEAVE", def.name); const needsTypes = state.needsTypes; state.moduleDefinition = undefined; state.needsTypes = undefined; From a1dd485229081c643a29ce50a336e19eac97c7c5 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Thu, 13 Jul 2023 05:55:51 +0200 Subject: [PATCH 097/181] chore: prep 0.11.0-pre.0 --- CHANGELOG.md | 3 +++ VERSION | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fcedd09037..e99fe7995b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +# Polywrap Origin (0.11.0-pre.0) +... + # Polywrap Origin (0.10.6) ## Bugs **`polywrap` CLI:** diff --git a/VERSION b/VERSION index 69da6ebcd0..d8c39eebe7 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.10.6 +0.11.0-pre.0 From d7610541ab9086381a3bc7b12358ff3911af66ba Mon Sep 17 00:00:00 2001 From: polywrap-build-bot Date: Thu, 13 Jul 2023 04:04:44 +0000 Subject: [PATCH 098/181] build(release): migrate to 0.11.0-pre.0 --- packages/cli/package.json | 16 ++++++++-------- packages/js/cli/package.json | 4 ++-- packages/js/logging/package.json | 2 +- packages/js/manifests/polywrap/package.json | 8 ++++---- packages/js/os/package.json | 2 +- packages/js/validation/package.json | 6 +++--- packages/manifests/polywrap/package.json | 2 +- packages/schema/bind/package.json | 8 ++++---- packages/schema/compose/package.json | 8 ++++---- packages/schema/parse/package.json | 4 ++-- packages/templates/app/typescript/package.json | 4 ++-- packages/templates/package.json | 2 +- .../templates/plugin/typescript/package.json | 4 ++-- .../templates/wasm/assemblyscript/package.json | 6 +++--- packages/templates/wasm/rust/package.json | 4 ++-- packages/test-cases/package.json | 4 ++-- packages/wasm/as/package.json | 2 +- packages/wasm/rs/Cargo.toml | 2 +- 18 files changed, 44 insertions(+), 44 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 7802dbe68b..cd593096c6 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,7 +1,7 @@ { "name": "polywrap", "description": "Polywrap CLI", - "version": "0.10.6", + "version": "0.11.0-pre.0", "license": "MIT", "repository": { "type": "git", @@ -48,13 +48,13 @@ "@polywrap/client-js": "0.10.0", "@polywrap/core-js": "0.10.0", "@polywrap/ethereum-provider-js-v1": "npm:@polywrap/ethereum-provider-js@~0.2.4", - "@polywrap/logging-js": "0.10.6", - "@polywrap/os-js": "0.10.6", - "@polywrap/polywrap-manifest-types-js": "0.10.6", + "@polywrap/logging-js": "0.11.0-pre.0", + "@polywrap/os-js": "0.11.0-pre.0", + "@polywrap/polywrap-manifest-types-js": "0.11.0-pre.0", "@polywrap/result": "0.10.0", - "@polywrap/schema-bind": "0.10.6", - "@polywrap/schema-compose": "0.10.6", - "@polywrap/schema-parse": "0.10.6", + "@polywrap/schema-bind": "0.11.0-pre.0", + "@polywrap/schema-compose": "0.11.0-pre.0", + "@polywrap/schema-parse": "0.11.0-pre.0", "@polywrap/uri-resolver-extensions-js": "0.10.0", "@polywrap/uri-resolvers-js": "0.10.0", "@polywrap/wasm-js": "0.10.0", @@ -81,7 +81,7 @@ "yesno": "0.4.0" }, "devDependencies": { - "@polywrap/cli-js": "0.10.6", + "@polywrap/cli-js": "0.11.0-pre.0", "@types/copyfiles": "2.4.0", "@types/fs-extra": "9.0.12", "@types/jest": "26.0.8", diff --git a/packages/js/cli/package.json b/packages/js/cli/package.json index e3ac07a0fd..41b10f0b7e 100644 --- a/packages/js/cli/package.json +++ b/packages/js/cli/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/cli-js", "description": "Programmatically execute the Polywrap CLI", - "version": "0.10.6", + "version": "0.11.0-pre.0", "license": "MIT", "repository": { "type": "git", @@ -17,7 +17,7 @@ "test": "jest --passWithNoTests --runInBand --detectOpenHandles --verbose" }, "dependencies": { - "polywrap": "0.10.6", + "polywrap": "0.11.0-pre.0", "spawn-command": "0.0.2-1" }, "devDependencies": { diff --git a/packages/js/logging/package.json b/packages/js/logging/package.json index 33394d78e0..c892f05007 100644 --- a/packages/js/logging/package.json +++ b/packages/js/logging/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/logging-js", "description": "Polywrap Core Logging Interface", - "version": "0.10.6", + "version": "0.11.0-pre.0", "license": "MIT", "repository": { "type": "git", diff --git a/packages/js/manifests/polywrap/package.json b/packages/js/manifests/polywrap/package.json index f286c7f7be..a1bfd6c391 100644 --- a/packages/js/manifests/polywrap/package.json +++ b/packages/js/manifests/polywrap/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/polywrap-manifest-types-js", "description": "Polywrap Manifest TypeScript Typings", - "version": "0.10.6", + "version": "0.11.0-pre.0", "license": "MIT", "repository": { "type": "git", @@ -15,14 +15,14 @@ "test:watch": "yarn test -- --watch" }, "dependencies": { - "@polywrap/logging-js": "0.10.6", - "@polywrap/polywrap-manifest-schemas": "0.10.6", + "@polywrap/logging-js": "0.11.0-pre.0", + "@polywrap/polywrap-manifest-schemas": "0.11.0-pre.0", "jsonschema": "1.4.0", "semver": "7.5.3", "yaml": "2.2.2" }, "devDependencies": { - "@polywrap/os-js": "0.10.6", + "@polywrap/os-js": "0.11.0-pre.0", "@types/jest": "26.0.8", "@types/mustache": "4.0.1", "@types/prettier": "2.6.0", diff --git a/packages/js/os/package.json b/packages/js/os/package.json index 1fc8ff7ea7..7615304b79 100644 --- a/packages/js/os/package.json +++ b/packages/js/os/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/os-js", "description": "Polywrap Javascript OS Utilities", - "version": "0.10.6", + "version": "0.11.0-pre.0", "license": "MIT", "repository": { "type": "git", diff --git a/packages/js/validation/package.json b/packages/js/validation/package.json index 55e3f0f145..26aa9061a8 100644 --- a/packages/js/validation/package.json +++ b/packages/js/validation/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/package-validation", "description": "Polywrap Package Validator", - "version": "0.10.6", + "version": "0.11.0-pre.0", "license": "MIT", "repository": { "type": "git", @@ -18,12 +18,12 @@ "test:watch": "yarn test -- --watch" }, "dependencies": { - "@polywrap/schema-compose": "0.10.6", + "@polywrap/schema-compose": "0.11.0-pre.0", "@polywrap/wrap-manifest-types-js": "0.10.0" }, "devDependencies": { "@polywrap/msgpack-js": "0.10.0", - "@polywrap/os-js": "0.10.6", + "@polywrap/os-js": "0.11.0-pre.0", "@types/jest": "26.0.8", "jest": "26.6.3", "rimraf": "3.0.2", diff --git a/packages/manifests/polywrap/package.json b/packages/manifests/polywrap/package.json index 418b315c74..22a1b199d6 100644 --- a/packages/manifests/polywrap/package.json +++ b/packages/manifests/polywrap/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/polywrap-manifest-schemas", "description": "Polywrap Manifest Schemas", - "version": "0.10.6", + "version": "0.11.0-pre.0", "license": "MIT", "repository": { "type": "git", diff --git a/packages/schema/bind/package.json b/packages/schema/bind/package.json index d0ad3b01bf..cd4dcf5a6d 100644 --- a/packages/schema/bind/package.json +++ b/packages/schema/bind/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/schema-bind", "description": "Polywrap Schema Binding", - "version": "0.10.6", + "version": "0.11.0-pre.0", "license": "MIT", "repository": { "type": "git", @@ -19,13 +19,13 @@ "copy:templates": "copyfiles -u 1 src/**/*.mustache build/" }, "dependencies": { - "@polywrap/os-js": "0.10.6", - "@polywrap/schema-parse": "0.10.6", + "@polywrap/os-js": "0.11.0-pre.0", + "@polywrap/schema-parse": "0.11.0-pre.0", "@polywrap/wrap-manifest-types-js": "0.10.0", "mustache": "4.0.1" }, "devDependencies": { - "@polywrap/test-cases": "0.10.6", + "@polywrap/test-cases": "0.11.0-pre.0", "@types/jest": "26.0.8", "@types/lodash": "4.14.178", "@types/mustache": "4.0.1", diff --git a/packages/schema/compose/package.json b/packages/schema/compose/package.json index a38c79d99c..152747b47c 100644 --- a/packages/schema/compose/package.json +++ b/packages/schema/compose/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/schema-compose", "description": "Polywrap Schema Composition", - "version": "0.10.6", + "version": "0.11.0-pre.0", "license": "MIT", "repository": { "type": "git", @@ -18,14 +18,14 @@ "test:watch": "yarn test -- --watch" }, "dependencies": { - "@polywrap/schema-parse": "0.10.6", + "@polywrap/schema-parse": "0.11.0-pre.0", "@polywrap/wrap-manifest-types-js": "0.10.0", "graphql": "15.5.0", "mustache": "4.0.1" }, "devDependencies": { - "@polywrap/os-js": "0.10.6", - "@polywrap/test-cases": "0.10.6", + "@polywrap/os-js": "0.11.0-pre.0", + "@polywrap/test-cases": "0.11.0-pre.0", "@types/jest": "26.0.8", "@types/mustache": "4.0.1", "@types/prettier": "2.6.0", diff --git a/packages/schema/parse/package.json b/packages/schema/parse/package.json index 8903f21a5d..47ccd5c5d1 100644 --- a/packages/schema/parse/package.json +++ b/packages/schema/parse/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/schema-parse", "description": "Polywrap Schema Parsing", - "version": "0.10.6", + "version": "0.11.0-pre.0", "license": "MIT", "repository": { "type": "git", @@ -23,7 +23,7 @@ "graphql": "15.5.0" }, "devDependencies": { - "@polywrap/test-cases": "0.10.6", + "@polywrap/test-cases": "0.11.0-pre.0", "@types/deep-equal": "1.0.1", "@types/jest": "26.0.8", "@types/prettier": "2.6.0", diff --git a/packages/templates/app/typescript/package.json b/packages/templates/app/typescript/package.json index e746fb599f..6a4cd2ca15 100644 --- a/packages/templates/app/typescript/package.json +++ b/packages/templates/app/typescript/package.json @@ -2,7 +2,7 @@ "name": "templates-app-typescript", "description": "Polywrap App TypeScript Template", "private": true, - "version": "0.10.6", + "version": "0.11.0-pre.0", "scripts": { "build": "npx polywrap codegen", "test": "ts-node ./src/index.ts" @@ -12,7 +12,7 @@ }, "devDependencies": { "@types/node": "^18.14.6", - "polywrap": "0.10.6", + "polywrap": "0.11.0-pre.0", "ts-node": "10.9.1", "typescript": "4.9.5" } diff --git a/packages/templates/package.json b/packages/templates/package.json index 1495a4a6b9..7990ab6e7d 100644 --- a/packages/templates/package.json +++ b/packages/templates/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/templates", "description": "Polywrap Templates", - "version": "0.10.6", + "version": "0.11.0-pre.0", "license": "MIT", "repository": { "type": "git", diff --git a/packages/templates/plugin/typescript/package.json b/packages/templates/plugin/typescript/package.json index ee69d77fcf..8e75f4e7dc 100644 --- a/packages/templates/plugin/typescript/package.json +++ b/packages/templates/plugin/typescript/package.json @@ -2,7 +2,7 @@ "name": "templates-plugin-typescript", "description": "Polywrap Plugin Typescript Template", "private": true, - "version": "0.10.6", + "version": "0.11.0-pre.0", "main": "build/index.js", "scripts": { "build": "rimraf ./build && yarn codegen && tsc --project tsconfig.json", @@ -23,7 +23,7 @@ "@types/jest": "26.0.8", "@types/prettier": "2.6.0", "jest": "26.6.3", - "polywrap": "0.10.6", + "polywrap": "0.11.0-pre.0", "rimraf": "3.0.2", "ts-jest": "26.5.4", "ts-node": "10.9.1", diff --git a/packages/templates/wasm/assemblyscript/package.json b/packages/templates/wasm/assemblyscript/package.json index 3adf03ad91..cfbaf82db4 100644 --- a/packages/templates/wasm/assemblyscript/package.json +++ b/packages/templates/wasm/assemblyscript/package.json @@ -2,7 +2,7 @@ "name": "template-wasm-as", "description": "Polywrap AssemblyScript Wrapper Template", "private": true, - "version": "0.10.6", + "version": "0.11.0-pre.0", "scripts": { "codegen": "npx polywrap codegen", "build": "npx polywrap build", @@ -17,12 +17,12 @@ "devDependencies": { "@types/jest": "26.0.8", "jest": "26.6.3", - "polywrap": "0.10.6", + "polywrap": "0.11.0-pre.0", "ts-jest": "26.5.4", "typescript": "4.9.5" }, "dependencies": { - "@polywrap/wasm-as": "0.10.6", + "@polywrap/wasm-as": "0.11.0-pre.0", "assemblyscript": "0.19.23" } } diff --git a/packages/templates/wasm/rust/package.json b/packages/templates/wasm/rust/package.json index 0541b4d249..b2d9233277 100644 --- a/packages/templates/wasm/rust/package.json +++ b/packages/templates/wasm/rust/package.json @@ -2,7 +2,7 @@ "name": "template-wasm-rs", "description": "Polywrap Rust Wrapper Template", "private": true, - "version": "0.10.6", + "version": "0.11.0-pre.0", "scripts": { "codegen": "npx polywrap codegen", "build": "npx polywrap build", @@ -15,7 +15,7 @@ "devDependencies": { "@types/jest": "26.0.8", "jest": "26.6.3", - "polywrap": "0.10.6", + "polywrap": "0.11.0-pre.0", "ts-jest": "26.5.4", "typescript": "4.9.5" } diff --git a/packages/test-cases/package.json b/packages/test-cases/package.json index 30127a11d2..993ecc1c6b 100644 --- a/packages/test-cases/package.json +++ b/packages/test-cases/package.json @@ -2,14 +2,14 @@ "name": "@polywrap/test-cases", "description": "Reusable Polywrap Test Cases", "private": true, - "version": "0.10.6", + "version": "0.11.0-pre.0", "license": "MIT", "main": "index.ts", "scripts": { "generate:wrappers": "ts-node -e \"import { fetchWrappers } from './'; (async () => await fetchWrappers())()\"" }, "dependencies": { - "@polywrap/os-js": "0.10.6" + "@polywrap/os-js": "0.11.0-pre.0" }, "devDependencies": { "@types/adm-zip": "0.5.0", diff --git a/packages/wasm/as/package.json b/packages/wasm/as/package.json index 3048d214de..f1c9298a4a 100644 --- a/packages/wasm/as/package.json +++ b/packages/wasm/as/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/wasm-as", "description": "Polywrap Assemblyscript Runtime", - "version": "0.10.6", + "version": "0.11.0-pre.0", "license": "MIT", "repository": { "type": "git", diff --git a/packages/wasm/rs/Cargo.toml b/packages/wasm/rs/Cargo.toml index 0ed1e58807..c2c1cd8c9b 100644 --- a/packages/wasm/rs/Cargo.toml +++ b/packages/wasm/rs/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polywrap-wasm-rs" -version = "0.10.6" +version = "0.11.0-pre.0" license = "MIT" description = "Polywrap's Rust-Wasm Runtime" homepage = "https://polywrap.io" From 696dfe7368e5cae440232abc0e6f5d3c465cbda9 Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Thu, 13 Jul 2023 12:53:14 +0800 Subject: [PATCH 099/181] feat: add go templates --- packages/templates/wasm/golang/.gitignore | 6 ++++ packages/templates/wasm/golang/.nvmrc | 1 + packages/templates/wasm/golang/README.md | 15 ++++++++++ packages/templates/wasm/golang/go.mod | 7 +++++ packages/templates/wasm/golang/jest.config.js | 15 ++++++++++ .../templates/wasm/golang/module/module.go | 11 ++++++++ packages/templates/wasm/golang/package.json | 22 +++++++++++++++ .../templates/wasm/golang/polywrap.graphql | 7 +++++ .../templates/wasm/golang/polywrap.test.cue | 11 ++++++++ .../templates/wasm/golang/polywrap.test.yaml | 10 +++++++ packages/templates/wasm/golang/polywrap.yaml | 7 +++++ packages/templates/wasm/golang/tsconfig.json | 28 +++++++++++++++++++ 12 files changed, 140 insertions(+) create mode 100644 packages/templates/wasm/golang/.gitignore create mode 100644 packages/templates/wasm/golang/.nvmrc create mode 100644 packages/templates/wasm/golang/README.md create mode 100644 packages/templates/wasm/golang/go.mod create mode 100644 packages/templates/wasm/golang/jest.config.js create mode 100644 packages/templates/wasm/golang/module/module.go create mode 100644 packages/templates/wasm/golang/package.json create mode 100644 packages/templates/wasm/golang/polywrap.graphql create mode 100644 packages/templates/wasm/golang/polywrap.test.cue create mode 100644 packages/templates/wasm/golang/polywrap.test.yaml create mode 100644 packages/templates/wasm/golang/polywrap.yaml create mode 100644 packages/templates/wasm/golang/tsconfig.json diff --git a/packages/templates/wasm/golang/.gitignore b/packages/templates/wasm/golang/.gitignore new file mode 100644 index 0000000000..ec0cd1fa68 --- /dev/null +++ b/packages/templates/wasm/golang/.gitignore @@ -0,0 +1,6 @@ +build +node_modules +wrap +.polywrap +target +workflows/output.json diff --git a/packages/templates/wasm/golang/.nvmrc b/packages/templates/wasm/golang/.nvmrc new file mode 100644 index 0000000000..501570628a --- /dev/null +++ b/packages/templates/wasm/golang/.nvmrc @@ -0,0 +1 @@ +v17.9.1 \ No newline at end of file diff --git a/packages/templates/wasm/golang/README.md b/packages/templates/wasm/golang/README.md new file mode 100644 index 0000000000..502931c4e1 --- /dev/null +++ b/packages/templates/wasm/golang/README.md @@ -0,0 +1,15 @@ +# Polywrap Wasm Wrapper Template +A simple starter template for a Golang Wasm wrapper. For more information on how this project works, and a step by step on how to extend its behavior, see the documentation [here](https://docs.polywrap.io/). + +# How To Run + +## Install Dependencies +`nvm install && nvm use` +`yarn` + +## Codegen & Build +`yarn codegen` +`yarn build` + +## Test +`yarn test` diff --git a/packages/templates/wasm/golang/go.mod b/packages/templates/wasm/golang/go.mod new file mode 100644 index 0000000000..87625c8648 --- /dev/null +++ b/packages/templates/wasm/golang/go.mod @@ -0,0 +1,7 @@ +module example.com/template-wasm-go + +go 1.18 + +require github.com/polywrap/go-wrap wrap-0.1 + +require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/templates/wasm/golang/jest.config.js b/packages/templates/wasm/golang/jest.config.js new file mode 100644 index 0000000000..4a4c022f7b --- /dev/null +++ b/packages/templates/wasm/golang/jest.config.js @@ -0,0 +1,15 @@ +module.exports = { + collectCoverage: false, + preset: "ts-jest", + testEnvironment: "node", + testMatch: ["**/__tests__/**/?(*.)+(spec|test).[jt]s?(x)"], + globals: { + "ts-jest": { + tsconfig: "tsconfig.json", + diagnostics: false, + }, + }, + testPathIgnorePatterns: [ + "/.polywrap/" + ], +}; diff --git a/packages/templates/wasm/golang/module/module.go b/packages/templates/wasm/golang/module/module.go new file mode 100644 index 0000000000..a3d140b943 --- /dev/null +++ b/packages/templates/wasm/golang/module/module.go @@ -0,0 +1,11 @@ +package module + +import ( + "example.com/template-wasm-go/module/wrap/types" +) + +func SampleMethod(args *types.ArgsSampleMethod) types.SampleResult { + return types.SampleResult{ + Result: args.Arg, + } +} diff --git a/packages/templates/wasm/golang/package.json b/packages/templates/wasm/golang/package.json new file mode 100644 index 0000000000..b2d9233277 --- /dev/null +++ b/packages/templates/wasm/golang/package.json @@ -0,0 +1,22 @@ +{ + "name": "template-wasm-rs", + "description": "Polywrap Rust Wrapper Template", + "private": true, + "version": "0.11.0-pre.0", + "scripts": { + "codegen": "npx polywrap codegen", + "build": "npx polywrap build", + "deploy": "npx polywrap deploy", + "test": "yarn test:e2e && yarn test:workflow", + "test:e2e": "yarn test:e2e:codegen && jest --passWithNoTests --runInBand --verbose", + "test:e2e:codegen": "npx polywrap codegen -m ./src/__tests__/types/polywrap.app.yaml -g ./src/__tests__/types/wrap", + "test:workflow": "npx polywrap test" + }, + "devDependencies": { + "@types/jest": "26.0.8", + "jest": "26.6.3", + "polywrap": "0.11.0-pre.0", + "ts-jest": "26.5.4", + "typescript": "4.9.5" + } +} diff --git a/packages/templates/wasm/golang/polywrap.graphql b/packages/templates/wasm/golang/polywrap.graphql new file mode 100644 index 0000000000..5b34469c7e --- /dev/null +++ b/packages/templates/wasm/golang/polywrap.graphql @@ -0,0 +1,7 @@ +type Module { + sampleMethod(arg: String!): SampleResult! +} + +type SampleResult { + result: String! +} diff --git a/packages/templates/wasm/golang/polywrap.test.cue b/packages/templates/wasm/golang/polywrap.test.cue new file mode 100644 index 0000000000..a71f50ace0 --- /dev/null +++ b/packages/templates/wasm/golang/polywrap.test.cue @@ -0,0 +1,11 @@ +package e2e + +sampleMethod: { + $0: { + data: { + value: "polywrap" + }, + error?: _|_, + } +} + diff --git a/packages/templates/wasm/golang/polywrap.test.yaml b/packages/templates/wasm/golang/polywrap.test.yaml new file mode 100644 index 0000000000..2603e2d03f --- /dev/null +++ b/packages/templates/wasm/golang/polywrap.test.yaml @@ -0,0 +1,10 @@ +name: template-wasm-go +format: 0.1.0 +validation: "./polywrap.test.cue" +jobs: + sampleMethod: + steps: + - uri: fs/build + method: sampleMethod + args: + arg: "polywrap" diff --git a/packages/templates/wasm/golang/polywrap.yaml b/packages/templates/wasm/golang/polywrap.yaml new file mode 100644 index 0000000000..0b1f3f35d6 --- /dev/null +++ b/packages/templates/wasm/golang/polywrap.yaml @@ -0,0 +1,7 @@ +format: 0.3.0 +project: + name: template-wasm-go + type: wasm/golang +source: + schema: ./polywrap.graphql + module: ./go.mod diff --git a/packages/templates/wasm/golang/tsconfig.json b/packages/templates/wasm/golang/tsconfig.json new file mode 100644 index 0000000000..75bfa86f2e --- /dev/null +++ b/packages/templates/wasm/golang/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 From 8707f1c575dbfb9f1ffc13ce48170d2bab12b2c4 Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Thu, 13 Jul 2023 13:00:47 +0800 Subject: [PATCH 100/181] feat: add golang for create command --- packages/cli/src/commands/create.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/src/commands/create.ts b/packages/cli/src/commands/create.ts index 516652e439..f840396b4e 100644 --- a/packages/cli/src/commands/create.ts +++ b/packages/cli/src/commands/create.ts @@ -27,7 +27,7 @@ const pathStr = intlMsg.commands_create_options_o_path(); const urlStr = intlMsg.commands_create_options_t_url(); export const supportedLangs = { - wasm: ["assemblyscript", "rust", "interface"] as const, + wasm: ["assemblyscript", "rust", "golang", "interface"] as const, app: ["typescript"] as const, plugin: ["typescript", "rust", "python"] as const, }; From 1e7c0576636c51c72ff71bff79dc82963c8c075e Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Thu, 13 Jul 2023 13:04:04 +0800 Subject: [PATCH 101/181] feat: add jest integration tests --- .../module/__tests__/e2e/integration.spec.ts | 31 +++++++++++++++++++ .../module/__tests__/types/polywrap.app.yaml | 9 ++++++ .../module/__tests__/types/schema.graphql | 1 + packages/templates/wasm/golang/package.json | 2 +- 4 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 packages/templates/wasm/golang/module/__tests__/e2e/integration.spec.ts create mode 100644 packages/templates/wasm/golang/module/__tests__/types/polywrap.app.yaml create mode 100644 packages/templates/wasm/golang/module/__tests__/types/schema.graphql diff --git a/packages/templates/wasm/golang/module/__tests__/e2e/integration.spec.ts b/packages/templates/wasm/golang/module/__tests__/e2e/integration.spec.ts new file mode 100644 index 0000000000..55913c174a --- /dev/null +++ b/packages/templates/wasm/golang/module/__tests__/e2e/integration.spec.ts @@ -0,0 +1,31 @@ +import { PolywrapClient } from "@polywrap/client-js"; +import * as App from "../types/wrap"; +import path from "path"; + +jest.setTimeout(60000); + +describe("Template Wrapper End to End Tests", () => { + + const client: PolywrapClient = new PolywrapClient(); + let wrapperUri: string; + + beforeAll(() => { + const dirname: string = path.resolve(__dirname); + const wrapperPath: string = path.join(dirname, "..", "..", ".."); + wrapperUri = `fs/${wrapperPath}/build`; + }) + + it("calls sampleMethod", async () => { + const expected: string = "polywrap"; + + const result = await client.invoke({ + uri: wrapperUri, + method: "sampleMethod", + args: { arg: expected } + }); + + expect(result.ok).toBeTruthy(); + if (!result.ok) return; + expect(result.value.result).toEqual(expected); + }); +}); diff --git a/packages/templates/wasm/golang/module/__tests__/types/polywrap.app.yaml b/packages/templates/wasm/golang/module/__tests__/types/polywrap.app.yaml new file mode 100644 index 0000000000..c084aed0f0 --- /dev/null +++ b/packages/templates/wasm/golang/module/__tests__/types/polywrap.app.yaml @@ -0,0 +1,9 @@ +format: 0.3.0 +project: + name: sample-typescript-type-generation + type: app/typescript +source: + schema: ./schema.graphql + import_abis: + - uri: "wrap://ens/sample.eth" + abi: "../../../build/wrap.info" diff --git a/packages/templates/wasm/golang/module/__tests__/types/schema.graphql b/packages/templates/wasm/golang/module/__tests__/types/schema.graphql new file mode 100644 index 0000000000..6d75bfc9bc --- /dev/null +++ b/packages/templates/wasm/golang/module/__tests__/types/schema.graphql @@ -0,0 +1 @@ +#import * into Template from "wrap://ens/sample.eth" diff --git a/packages/templates/wasm/golang/package.json b/packages/templates/wasm/golang/package.json index b2d9233277..0acbf4e6bc 100644 --- a/packages/templates/wasm/golang/package.json +++ b/packages/templates/wasm/golang/package.json @@ -9,7 +9,7 @@ "deploy": "npx polywrap deploy", "test": "yarn test:e2e && yarn test:workflow", "test:e2e": "yarn test:e2e:codegen && jest --passWithNoTests --runInBand --verbose", - "test:e2e:codegen": "npx polywrap codegen -m ./src/__tests__/types/polywrap.app.yaml -g ./src/__tests__/types/wrap", + "test:e2e:codegen": "npx polywrap codegen -m ./module/__tests__/types/polywrap.app.yaml -g ./module/__tests__/types/wrap", "test:workflow": "npx polywrap test" }, "devDependencies": { From 8536f755af05e8586bfc091b90c381c6b12b536a Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Thu, 13 Jul 2023 13:23:01 +0800 Subject: [PATCH 102/181] fix: issues --- packages/cli/package.json | 2 +- .../infra-modules/http/server/package.json | 2 +- packages/js/os/package.json | 2 +- .../templates/app/typescript/package.json | 2 +- packages/templates/plugin/python/package.json | 1 + packages/templates/plugin/rust/package.json | 1 + packages/templates/tests.spec.ts | 5 + packages/templates/wasm/golang/package.json | 4 +- yarn.lock | 820 +++++++++++++++++- 9 files changed, 801 insertions(+), 38 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index cd593096c6..4d11fd75ad 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -86,7 +86,7 @@ "@types/fs-extra": "9.0.12", "@types/jest": "26.0.8", "@types/mustache": "4.0.1", - "@types/node": "^18.14.6", + "@types/node": "18.14.6", "@types/prettier": "2.6.0", "@types/rimraf": "3.0.0", "dir-compare": "3.3.0", diff --git a/packages/cli/src/lib/defaults/infra-modules/http/server/package.json b/packages/cli/src/lib/defaults/infra-modules/http/server/package.json index 03d1dda74a..f8a3a1be00 100644 --- a/packages/cli/src/lib/defaults/infra-modules/http/server/package.json +++ b/packages/cli/src/lib/defaults/infra-modules/http/server/package.json @@ -27,7 +27,7 @@ "@types/file-saver": "2.0.5", "@types/fs-extra": "7.0.0", "@types/jest": "26.0.8", - "@types/node": "^18.14.6", + "@types/node": "18.14.6", "jest": "26.6.3", "nodemon": "2.0.19", "rimraf": "3.0.2", diff --git a/packages/js/os/package.json b/packages/js/os/package.json index 7615304b79..ecb3e02844 100644 --- a/packages/js/os/package.json +++ b/packages/js/os/package.json @@ -16,7 +16,7 @@ "lint": "eslint --color -c ../../../.eslintrc.js src/" }, "devDependencies": { - "@types/node": "^18.14.6", + "@types/node": "18.14.6", "rimraf": "3.0.2", "typescript": "4.9.5" }, diff --git a/packages/templates/app/typescript/package.json b/packages/templates/app/typescript/package.json index 6a4cd2ca15..283f11cf11 100644 --- a/packages/templates/app/typescript/package.json +++ b/packages/templates/app/typescript/package.json @@ -11,7 +11,7 @@ "@polywrap/client-js": "~0.10.0" }, "devDependencies": { - "@types/node": "^18.14.6", + "@types/node": "18.14.6", "polywrap": "0.11.0-pre.0", "ts-node": "10.9.1", "typescript": "4.9.5" diff --git a/packages/templates/plugin/python/package.json b/packages/templates/plugin/python/package.json index 932148136c..e1bff0b810 100644 --- a/packages/templates/plugin/python/package.json +++ b/packages/templates/plugin/python/package.json @@ -1,6 +1,7 @@ { "name": "templates-plugin-python", "private": true, + "version": "0.11.0-pre.0", "dependencies": { "polywrap": "~0.10.2" } diff --git a/packages/templates/plugin/rust/package.json b/packages/templates/plugin/rust/package.json index 9e7a123fb6..9b083910ad 100644 --- a/packages/templates/plugin/rust/package.json +++ b/packages/templates/plugin/rust/package.json @@ -1,6 +1,7 @@ { "name": "templates-plugin-rust", "private": true, + "version": "0.11.0-pre.0", "dependencies": { "polywrap": "~0.10.2" } diff --git a/packages/templates/tests.spec.ts b/packages/templates/tests.spec.ts index 75a9df4e86..665d2b20fa 100644 --- a/packages/templates/tests.spec.ts +++ b/packages/templates/tests.spec.ts @@ -29,6 +29,11 @@ describe("Templates", () => { build: "yarn build -m ./polywrap.wasm-rust-linked.yaml", test: "yarn test", }, + "wasm/golang": { + codegen: "yarn codegen", + build: "yarn build", + test: "yarn test", + }, "plugin/rust": { codegen: "npx polywrap codegen", // Uncomment after release of 0.10.3 diff --git a/packages/templates/wasm/golang/package.json b/packages/templates/wasm/golang/package.json index 0acbf4e6bc..c14d294211 100644 --- a/packages/templates/wasm/golang/package.json +++ b/packages/templates/wasm/golang/package.json @@ -1,6 +1,6 @@ { - "name": "template-wasm-rs", - "description": "Polywrap Rust Wrapper Template", + "name": "template-wasm-go", + "description": "Polywrap Golang Wrapper Template", "private": true, "version": "0.11.0-pre.0", "scripts": { diff --git a/yarn.lock b/yarn.lock index 2185460b6b..4102813d53 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1855,6 +1855,11 @@ resolved "https://registry.yarnpkg.com/@msgpack/msgpack/-/msgpack-2.7.2.tgz#f34b8aa0c49f0dd55eb7eba577081299cbf3f90b" integrity sha512-rYEi46+gIzufyYUAoHDnRzkWGxajpD9vVXFQ3g1vbjrBm6P7MBmm+s/fqPa46sxa+8FOUdEuRQKaugo5a4JWpw== +"@multiformats/base-x@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@multiformats/base-x/-/base-x-4.0.1.tgz#95ff0fa58711789d53aefb2590a8b7a4e715d121" + integrity sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -2331,6 +2336,11 @@ "@polywrap/core-js" "0.10.0" "@polywrap/plugin-js" "0.10.0" +"@polywrap/logging-js@0.10.6": + version "0.10.6" + resolved "https://registry.yarnpkg.com/@polywrap/logging-js/-/logging-js-0.10.6.tgz#62881f45e641c050081576a8d48ba868b44d2f17" + integrity sha512-6d5XCpiMJbGX0JjdFJeSTmHp0HlAPBLZLfVoE3XtWCWAcSlJW5IwTLDKUTZob/u/wews0UBZPHe25TgFugsPZQ== + "@polywrap/msgpack-js@0.10.0": version "0.10.0" resolved "https://registry.yarnpkg.com/@polywrap/msgpack-js/-/msgpack-js-0.10.0.tgz#7303da87ed7bc21858f0ef392aec575c5da6df63" @@ -2352,6 +2362,11 @@ dependencies: "@msgpack/msgpack" "2.7.2" +"@polywrap/os-js@0.10.6": + version "0.10.6" + resolved "https://registry.yarnpkg.com/@polywrap/os-js/-/os-js-0.10.6.tgz#3de289428138260cf83781357aee0b89ebefa0cd" + integrity sha512-c5OtKMIXsxcP/V3+zRNhoRhZwhdH5xs6S1PTg9wMJEllrImzqzDacUp9jdkAYU1AOrJoxQqttPPqzSD0FCwuXA== + "@polywrap/plugin-js@0.10.0": version "0.10.0" resolved "https://registry.yarnpkg.com/@polywrap/plugin-js/-/plugin-js-0.10.0.tgz#e3bc81bf7832df9c84a4a319515228b159a05ba5" @@ -2385,6 +2400,22 @@ "@polywrap/tracing-js" "0.10.1" "@polywrap/wrap-manifest-types-js" "0.10.1" +"@polywrap/polywrap-manifest-schemas@0.10.6": + version "0.10.6" + resolved "https://registry.yarnpkg.com/@polywrap/polywrap-manifest-schemas/-/polywrap-manifest-schemas-0.10.6.tgz#aae01cd7c22c3290aff7b0279f81dd00b5ac98bd" + integrity sha512-bDbuVpU+i2ghO+6+vOi/6iivelWt7zgjceynq7VbQaEvYtteiWLxHAaPRgxQsQVbljTOwMpuctvjotdtYlFD0Q== + +"@polywrap/polywrap-manifest-types-js@0.10.6": + version "0.10.6" + resolved "https://registry.yarnpkg.com/@polywrap/polywrap-manifest-types-js/-/polywrap-manifest-types-js-0.10.6.tgz#5d4108d59db9ac2cd796b6bbbbb238929b99775e" + integrity sha512-Uh3Mg7cFNEqzxEJGU7gz18/lUVyRGRt6kC2rEUhLvlKQjo/be1DMxh3UO5TcqknC2CGt1lzSg56hmd/exnTZ2w== + dependencies: + "@polywrap/logging-js" "0.10.6" + "@polywrap/polywrap-manifest-schemas" "0.10.6" + jsonschema "1.4.0" + semver "7.5.3" + yaml "2.2.2" + "@polywrap/result@0.10.0": version "0.10.0" resolved "https://registry.yarnpkg.com/@polywrap/result/-/result-0.10.0.tgz#712339223fba524dfabfb0bf868411f357d52e34" @@ -2400,6 +2431,35 @@ resolved "https://registry.yarnpkg.com/@polywrap/result/-/result-0.10.1.tgz#e60122396521fc07edda6951915ada4aaa5f6694" integrity sha512-9EoS/JUgKFwRk396lQ+3tDAGbZExsOf26SUG4l41HJv4FZLLLOL5ksppJK8StvjtbpQOIgFls23c83CXzS1hBQ== +"@polywrap/schema-bind@0.10.6": + version "0.10.6" + resolved "https://registry.yarnpkg.com/@polywrap/schema-bind/-/schema-bind-0.10.6.tgz#dd84369d0b1d71b10bb744ab7a16337ed2256e34" + integrity sha512-A09RqKUzAA7iqdL8Hh3Z5DEcHqxF0K1TVw4Wfk/jYkbDHPVxqUPxhztcCD1mtvROTuzRs/mGdUJAeGTG5wJ87g== + dependencies: + "@polywrap/os-js" "0.10.6" + "@polywrap/schema-parse" "0.10.6" + "@polywrap/wrap-manifest-types-js" "0.10.0" + mustache "4.0.1" + +"@polywrap/schema-compose@0.10.6": + version "0.10.6" + resolved "https://registry.yarnpkg.com/@polywrap/schema-compose/-/schema-compose-0.10.6.tgz#09d6195aed8241c202eecebe9d28ed9332535838" + integrity sha512-eiBCwkScL2Y9KwFKAbEHozfqKtqExwAGgaSxtpSkB+rEonu1KUj8QIQb6HLcW+P+m4loX+Rggno3jHAt7RL5Xw== + dependencies: + "@polywrap/schema-parse" "0.10.6" + "@polywrap/wrap-manifest-types-js" "0.10.0" + graphql "15.5.0" + mustache "4.0.1" + +"@polywrap/schema-parse@0.10.6": + version "0.10.6" + resolved "https://registry.yarnpkg.com/@polywrap/schema-parse/-/schema-parse-0.10.6.tgz#6cd338da1a70b26d08b7c12aa3de05af878f426c" + integrity sha512-avzkVjzO2fczfxFI+hoXkgX42ELTvp5pWzxokagw4K9pOhVHadGf3ErxstZZ1GRY/afv5cDaOJZFipMdcNygVA== + dependencies: + "@dorgjelli/graphql-schema-cycles" "1.1.4" + "@polywrap/wrap-manifest-types-js" "0.10.0" + graphql "15.5.0" + "@polywrap/tracing-js@0.10.0": version "0.10.0" resolved "https://registry.yarnpkg.com/@polywrap/tracing-js/-/tracing-js-0.10.0.tgz#31d7ca9cc73a1dbd877fc684000652aa2c22acdc" @@ -2757,14 +2817,14 @@ integrity sha512-wH6Tu9mbiOt0n5EvdoWy0VGQaJMHfLIxY/6wS0xLC7CV1taM6gESEzcYy0ZlWvxxiiljYvfDIvz4hHbUUDRlhw== "@types/node@*": - version "20.4.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.1.tgz#a6033a8718653c50ac4962977e14d0f984d9527d" - integrity sha512-JIzsAvJeA/5iY6Y/OxZbv1lUcc8dNSE77lb2gnBH+/PJ3lFR1Ccvgwl5JWnHAkNHcRsT0TbpVOsiMKZ1F/yyJg== + version "20.4.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.2.tgz#129cc9ae69f93824f92fac653eebfb4812ab4af9" + integrity sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw== -"@types/node@^18.14.6": - version "18.16.19" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.19.tgz#cb03fca8910fdeb7595b755126a8a78144714eea" - integrity sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA== +"@types/node@18.14.6": + version "18.14.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.14.6.tgz#ae1973dd2b1eeb1825695bb11ebfb746d27e3e93" + integrity sha512-93+VvleD3mXwlLI/xASjw0FzKcwzl3OdTCzm1LaRfqgS21gfFtK3zDXM5Op9TeeMsJVOaJ2VRDpT9q4Y3d0AvA== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -2952,6 +3012,11 @@ resolved "https://registry.yarnpkg.com/@web3api/assemblyscript-json/-/assemblyscript-json-1.2.0.tgz#f01f11f12a66cd1a319d43f12e476307d1ad3da8" integrity sha512-x+wchJpH1giJzXj3dYs8vh2SKMXepeqVXiaFV/YCtXg4X/KaUnxi0kp5JugbEAyEJurEScH1YuV6IvGhGui/fw== +"@zxing/text-encoding@0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@zxing/text-encoding/-/text-encoding-0.9.0.tgz#fb50ffabc6c7c66a0c96b4c03e3d9be74864b70b" + integrity sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA== + JSONStream@^1.0.4: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" @@ -2970,6 +3035,13 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + acorn-globals@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" @@ -3108,6 +3180,14 @@ any-promise@^1.0.0: resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== +any-signal@^2.0.0, any-signal@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/any-signal/-/any-signal-2.1.2.tgz#8d48270de0605f8b218cf9abe8e9c6a0e7418102" + integrity sha512-B+rDnWasMi/eWcajPcCWSlYc7muXOrcYrqgyzcdKisl2H/WTlQ0gip1KyQfr0ZlxJdsuWCj/LWwQm7fhyhRfIQ== + dependencies: + abort-controller "^3.0.0" + native-abort-controller "^1.0.3" + anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -3463,6 +3543,11 @@ before-after-hook@^2.2.0: resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== +bignumber.js@^9.0.0: + version "9.1.1" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" + integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== + binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -3473,6 +3558,27 @@ binaryen@102.0.0-nightly.20211028: resolved "https://registry.yarnpkg.com/binaryen/-/binaryen-102.0.0-nightly.20211028.tgz#8f1efb0920afd34509e342e37f84313ec936afb2" integrity sha512-GCJBVB5exbxzzvyt8MGDv/MeUjs6gkXDvf4xOIItRBptYl0Tz5sm1o/uG95YK0L0VeG5ajDu3hRtkBP2kzqC5w== +bl@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +blakejs@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" + integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== + +blob-to-it@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/blob-to-it/-/blob-to-it-1.0.4.tgz#f6caf7a4e90b7bb9215fa6a318ed6bd8ad9898cb" + integrity sha512-iCmk0W4NdbrWgRRuxOriU8aM5ijeVLI61Zulsmg/lUHNr7pYjoj+U77opLefNagevtrrbMt3JQ5Qip7ar178kA== + dependencies: + browser-readablestream-to-it "^1.0.3" + bn.js@^4.11.9: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" @@ -3483,6 +3589,19 @@ bn.js@^5.2.1: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== +borc@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/borc/-/borc-2.1.2.tgz#6ce75e7da5ce711b963755117dd1b187f6f8cf19" + integrity sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w== + dependencies: + bignumber.js "^9.0.0" + buffer "^5.5.0" + commander "^2.15.0" + ieee754 "^1.1.13" + iso-url "~0.4.7" + json-text-sequence "~0.1.0" + readable-stream "^3.6.0" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -3491,6 +3610,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@^2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" @@ -3524,6 +3650,11 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== +browser-readablestream-to-it@^1.0.1, browser-readablestream-to-it@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/browser-readablestream-to-it/-/browser-readablestream-to-it-1.0.3.tgz#ac3e406c7ee6cdf0a502dd55db33bab97f7fba76" + integrity sha512-+12sHB+Br8HIh6VAMVEG5r3UXCyESIgDW7kzk3BjIXa43DVqVwL7GC5TW3jeh+72dtcH99pPVpw0X8i0jt+/kw== + browserslist@^4.21.9: version "4.21.9" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" @@ -3563,7 +3694,7 @@ buffer-from@1.x, buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@^5.5.0, buffer@^5.6.0: +buffer@^5.4.3, buffer@^5.5.0, buffer@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -3571,6 +3702,14 @@ buffer@^5.5.0, buffer@^5.6.0: base64-js "^1.3.1" ieee754 "^1.1.13" +buffer@^6.0.1: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + builtins@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" @@ -3763,6 +3902,16 @@ cids@^0.7.1: multicodec "^1.0.0" multihashes "~0.4.15" +cids@^1.0.0: + version "1.1.9" + resolved "https://registry.yarnpkg.com/cids/-/cids-1.1.9.tgz#402c26db5c07059377bcd6fb82f2a24e7f2f4a4f" + integrity sha512-l11hWRfugIcbGuTZwAM5PwpjPPjyb6UZOGwlHSnOBV5o07XhQ4gNpBN67FbODvpjyHtd+0Xs6KNvUcGBiDRsdg== + dependencies: + multibase "^4.0.1" + multicodec "^3.0.1" + multihashes "^4.0.1" + uint8arrays "^3.0.0" + cjs-module-lexer@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz#4186fcca0eae175970aee870b9fe2d6cf8d5655f" @@ -3922,7 +4071,7 @@ commander@9.2.0: resolved "https://registry.yarnpkg.com/commander/-/commander-9.2.0.tgz#6e21014b2ed90d8b7c9647230d8b7a94a4a419a9" integrity sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w== -commander@^2.19.0: +commander@^2.15.0, commander@^2.19.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -4194,7 +4343,7 @@ dateformat@^3.0.0: resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.3: +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.3: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -4305,6 +4454,11 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== +delimit-stream@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/delimit-stream/-/delimit-stream-0.1.0.tgz#9b8319477c0e5f8aeb3ce357ae305fc25ea1cd2b" + integrity sha512-a02fiQ7poS5CnjiJBAsjGLPp5EwVoGHNeu9sziBd9huppRfsAFIpv5zNLv0V1gbop53ilngAf5Kf331AwcoRBQ== + depd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" @@ -4383,6 +4537,15 @@ discontinuous-range@1.0.0: resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a" integrity sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ== +dns-over-http-resolver@^1.0.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/dns-over-http-resolver/-/dns-over-http-resolver-1.2.3.tgz#194d5e140a42153f55bb79ac5a64dd2768c36af9" + integrity sha512-miDiVSI6KSNbi4SVifzO/reD8rMnxgrlnkrlkugOLQpWQTe2qMdHsZp5DmfKjxNE+/T3VAAYLQUZMv9SMr6+AA== + dependencies: + debug "^4.3.1" + native-fetch "^3.0.0" + receptacle "^1.3.2" + docker-compose@0.23.17: version "0.23.17" resolved "https://registry.yarnpkg.com/docker-compose/-/docker-compose-0.23.17.tgz#8816bef82562d9417dc8c790aa4871350f93a2ba" @@ -4439,10 +4602,17 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" +electron-fetch@^1.7.2: + version "1.9.1" + resolved "https://registry.yarnpkg.com/electron-fetch/-/electron-fetch-1.9.1.tgz#e28bfe78d467de3f2dec884b1d72b8b05322f30f" + integrity sha512-M9qw6oUILGVrcENMSRRefE1MbHPIz0h79EKIeJWK9v563aT9Qkh8aEHPO1H5vi970wPirNY+jO9OpFoLiMsMGA== + dependencies: + encoding "^0.1.13" + electron-to-chromium@^1.4.431: - version "1.4.457" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.457.tgz#3fdc7b4f97d628ac6b51e8b4b385befb362fe343" - integrity sha512-/g3UyNDmDd6ebeWapmAoiyy+Sy2HyJ+/X8KyvNeHfKRFfHaA2W8oF5fxD5F3tjBDcjpwo0iek6YNgxNXDBoEtA== + version "1.4.459" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.459.tgz#25a23370f4ae8aaa8f77aaf00133aa4994f4148e" + integrity sha512-XXRS5NFv8nCrBL74Rm3qhJjA2VCsRFx0OjHKBMPI0otij56aun8UWiKTDABmd5/7GTR021pA4wivs+Ri6XCElg== elliptic@6.5.4: version "6.5.4" @@ -4472,7 +4642,7 @@ emoji-regex@^9.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== -encoding@^0.1.12: +encoding@^0.1.12, encoding@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== @@ -4503,11 +4673,16 @@ envinfo@^7.7.4: resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.10.0.tgz#55146e3909cc5fe63c22da63fb15b05aeac35b13" integrity sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw== -err-code@^2.0.2: +err-code@^2.0.0, err-code@^2.0.2, err-code@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== +err-code@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-3.0.1.tgz#a444c7b992705f2b120ee320b09972eef331c920" + integrity sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA== + error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -4516,9 +4691,9 @@ error-ex@^1.2.0, error-ex@^1.3.1: is-arrayish "^0.2.1" 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== + version "1.21.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.3.tgz#8aaa0ffc080e8a6fef6ace72631dc1ec5d47bf94" + integrity sha512-ZU4miiY1j3sGPFLJ34VJXEqhpmL+HGByCinGHv4HC+Fxl2fI2Z4yR6tl0mORnDr6PA8eihWo4LmSWDbvhALckg== dependencies: array-buffer-byte-length "^1.0.0" available-typed-arrays "^1.0.5" @@ -4526,7 +4701,7 @@ es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" function.prototype.name "^1.1.5" - get-intrinsic "^1.2.0" + get-intrinsic "^1.2.1" get-symbol-description "^1.0.0" globalthis "^1.0.3" gopd "^1.0.1" @@ -4546,14 +4721,15 @@ es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: object-inspect "^1.12.3" object-keys "^1.1.1" object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" + regexp.prototype.flags "^1.5.0" safe-regex-test "^1.0.0" string.prototype.trim "^1.2.7" string.prototype.trimend "^1.0.6" string.prototype.trimstart "^1.0.6" + typed-array-byte-offset "^1.0.0" typed-array-length "^1.0.4" unbox-primitive "^1.0.2" - which-typed-array "^1.1.9" + which-typed-array "^1.1.10" es-array-method-boxes-properly@^1.0.0: version "1.0.0" @@ -4870,6 +5046,11 @@ event-emitter@^0.3.5: d "1" es5-ext "~0.10.14" +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + eventemitter3@^4.0.4: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" @@ -5034,6 +5215,11 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== +fast-fifo@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.0.tgz#03e381bcbfb29932d7c3afde6e15e83e05ab4d8b" + integrity sha512-IgfweLvEpwyA4WgiQe9Nx6VV2QkML2NkvZnk1oKnIzXgXdWxuhF7zw4DvLTPZJn6PIUneiAXPF24QmoEqHTjyw== + fast-glob@^3.2.5, fast-glob@^3.2.9: version "3.3.0" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.0.tgz#7c40cb491e1e2ed5664749e87bfb516dbe8727c0" @@ -5211,7 +5397,7 @@ fs-extra@9.0.1: jsonfile "^6.0.1" universalify "^1.0.0" -fs-extra@^9.1.0: +fs-extra@^9.0.1, fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -5294,7 +5480,7 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== @@ -5304,6 +5490,11 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@ has-proto "^1.0.1" has-symbols "^1.0.3" +get-iterator@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-iterator/-/get-iterator-1.0.2.tgz#cd747c02b4c084461fac14f48f6b45a80ed25c82" + integrity sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg== + get-package-type@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" @@ -5455,7 +5646,7 @@ globals@^12.1.0: dependencies: type-fest "^0.8.1" -globalthis@^1.0.3: +globalthis@^1.0.1, globalthis@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== @@ -5716,7 +5907,7 @@ iconv-lite@^0.6.2: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -ieee754@^1.1.13: +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -5855,11 +6046,132 @@ invert-kv@^3.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-3.0.1.tgz#a93c7a3d4386a1dc8325b97da9bb1620c0282523" integrity sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw== +ip-regex@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" + integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== + ip@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== +ipfs-core-utils@^0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/ipfs-core-utils/-/ipfs-core-utils-0.5.4.tgz#c7fa508562086be65cebb51feb13c58abbbd3d8d" + integrity sha512-V+OHCkqf/263jHU0Fc9Rx/uDuwlz3PHxl3qu6a5ka/mNi6gucbFuI53jWsevCrOOY9giWMLB29RINGmCV5dFeQ== + dependencies: + any-signal "^2.0.0" + blob-to-it "^1.0.1" + browser-readablestream-to-it "^1.0.1" + cids "^1.0.0" + err-code "^2.0.3" + ipfs-utils "^5.0.0" + it-all "^1.0.4" + it-map "^1.0.4" + it-peekable "^1.0.1" + multiaddr "^8.0.0" + multiaddr-to-uri "^6.0.0" + parse-duration "^0.4.4" + timeout-abort-controller "^1.1.1" + uint8arrays "^1.1.0" + +ipfs-http-client@48.1.3: + version "48.1.3" + resolved "https://registry.yarnpkg.com/ipfs-http-client/-/ipfs-http-client-48.1.3.tgz#d9b91b1f65d54730de92290d3be5a11ef124b400" + integrity sha512-+JV4cdMaTvYN3vd4r6+mcVxV3LkJXzc4kn2ToVbObpVpdqmG34ePf1KlvFF8A9gjcel84WpiP5xCEV/IrisPBA== + dependencies: + any-signal "^2.0.0" + bignumber.js "^9.0.0" + cids "^1.0.0" + debug "^4.1.1" + form-data "^3.0.0" + ipfs-core-utils "^0.5.4" + ipfs-utils "^5.0.0" + ipld-block "^0.11.0" + ipld-dag-cbor "^0.17.0" + ipld-dag-pb "^0.20.0" + ipld-raw "^6.0.0" + it-last "^1.0.4" + it-map "^1.0.4" + it-tar "^1.2.2" + it-to-stream "^0.1.2" + merge-options "^2.0.0" + multiaddr "^8.0.0" + multibase "^3.0.0" + multicodec "^2.0.1" + multihashes "^3.0.1" + nanoid "^3.1.12" + native-abort-controller "~0.0.3" + parse-duration "^0.4.4" + stream-to-it "^0.2.2" + uint8arrays "^1.1.0" + +ipfs-utils@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ipfs-utils/-/ipfs-utils-5.0.1.tgz#7c0053d5e77686f45577257a73905d4523e6b4f7" + integrity sha512-28KZPgO4Uf5duT2ORLAYfboUp98iUshDD7yRAfbNxNAR8Dtidfn6o20rZfoXnkri2zKBVIPlJkuCPmPJB+6erg== + dependencies: + abort-controller "^3.0.0" + any-signal "^2.1.0" + buffer "^6.0.1" + electron-fetch "^1.7.2" + err-code "^2.0.0" + fs-extra "^9.0.1" + is-electron "^2.2.0" + iso-url "^1.0.0" + it-glob "0.0.10" + it-to-stream "^0.1.2" + merge-options "^2.0.0" + nanoid "^3.1.3" + native-abort-controller "0.0.3" + native-fetch "^2.0.0" + node-fetch "^2.6.0" + stream-to-it "^0.2.0" + +ipld-block@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/ipld-block/-/ipld-block-0.11.1.tgz#c3a7b41aee3244187bd87a73f980e3565d299b6e" + integrity sha512-sDqqLqD5qh4QzGq6ssxLHUCnH4emCf/8F8IwjQM2cjEEIEHMUj57XhNYgmGbemdYPznUhffxFGEHsruh5+HQRw== + dependencies: + cids "^1.0.0" + +ipld-dag-cbor@^0.17.0: + version "0.17.1" + resolved "https://registry.yarnpkg.com/ipld-dag-cbor/-/ipld-dag-cbor-0.17.1.tgz#842e6c250603e5791049168831a425ec03471fb1" + integrity sha512-Bakj/cnxQBdscORyf4LRHxQJQfoaY8KWc7PWROQgX+aw5FCzBt8ga0VM/59K+ABOznsqNvyLR/wz/oYImOpXJw== + dependencies: + borc "^2.1.2" + cids "^1.0.0" + is-circular "^1.0.2" + multicodec "^3.0.1" + multihashing-async "^2.0.0" + uint8arrays "^2.1.3" + +ipld-dag-pb@^0.20.0: + version "0.20.0" + resolved "https://registry.yarnpkg.com/ipld-dag-pb/-/ipld-dag-pb-0.20.0.tgz#025c0343aafe6cb9db395dd1dc93c8c60a669360" + integrity sha512-zfM0EdaolqNjAxIrtpuGKvXxWk5YtH9jKinBuQGTcngOsWFQhyybGCTJHGNGGtRjHNJi2hz5Udy/8pzv4kcKyg== + dependencies: + cids "^1.0.0" + class-is "^1.1.0" + multicodec "^2.0.0" + multihashing-async "^2.0.0" + protons "^2.0.0" + reset "^0.1.0" + run "^1.4.0" + stable "^0.1.8" + uint8arrays "^1.0.0" + +ipld-raw@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/ipld-raw/-/ipld-raw-6.0.0.tgz#74d947fcd2ce4e0e1d5bb650c1b5754ed8ea6da0" + integrity sha512-UK7fjncAzs59iu/o2kwYtb8jgTtW6B+cNWIiNpAJkfRwqoMk1xD/6i25ktzwe4qO8gQgoR9RxA5ibC23nq8BLg== + dependencies: + cids "^1.0.0" + multicodec "^2.0.0" + multihashing-async "^2.0.0" + is-absolute@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" @@ -5882,6 +6194,14 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" @@ -5935,6 +6255,11 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" +is-circular@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-circular/-/is-circular-1.0.2.tgz#2e0ab4e9835f4c6b0ea2b9855a84acd501b8366c" + integrity sha512-YttjnrswnUYRVJvxCvu8z+PGMUSzC2JttP0OEXezlAEdp3EXzhf7IZ3j0gRAybJBQupedIZFhY61Tga6E0qASA== + is-core-module@^2.11.0, is-core-module@^2.5.0: version "2.12.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" @@ -5986,6 +6311,11 @@ is-docker@^2.0.0: resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== +is-electron@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-electron/-/is-electron-2.2.2.tgz#3778902a2044d76de98036f5dc58089ac4d80bb9" + integrity sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg== + is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -6020,6 +6350,13 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -6027,6 +6364,13 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-ip@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-3.1.0.tgz#2ae5ddfafaf05cb8008a62093cf29734f657c5d8" + integrity sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q== + dependencies: + ip-regex "^4.0.0" + is-lambda@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" @@ -6158,7 +6502,7 @@ is-text-path@^1.0.1: dependencies: text-extensions "^1.0.0" -is-typed-array@^1.1.10, is-typed-array@^1.1.9: +is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9: version "1.1.10" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== @@ -6220,6 +6564,21 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +iso-constants@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/iso-constants/-/iso-constants-0.1.2.tgz#3d2456ed5aeaa55d18564f285ba02a47a0d885b4" + integrity sha512-OTCM5ZCQsHBCI4Wdu4tSxvDIkmDHd5EwJDps5mKqnQnWJSKlnwMs3EDZ4n3Fh1tmkWkDlyd2vCDbEYuPbyrUNQ== + +iso-url@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/iso-url/-/iso-url-1.2.1.tgz#db96a49d8d9a64a1c889fc07cc525d093afb1811" + integrity sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng== + +iso-url@~0.4.7: + version "0.4.7" + resolved "https://registry.yarnpkg.com/iso-url/-/iso-url-0.4.7.tgz#de7e48120dae46921079fe78f325ac9e9217a385" + integrity sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog== + isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" @@ -6289,6 +6648,72 @@ istanbul-reports@^3.0.2: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" +it-all@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/it-all/-/it-all-1.0.6.tgz#852557355367606295c4c3b7eff0136f07749335" + integrity sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A== + +it-concat@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/it-concat/-/it-concat-1.0.3.tgz#84db9376e4c77bf7bc1fd933bb90f184e7cef32b" + integrity sha512-sjeZQ1BWQ9U/W2oI09kZgUyvSWzQahTkOkLIsnEPgyqZFaF9ME5gV6An4nMjlyhXKWQMKEakQU8oRHs2SdmeyA== + dependencies: + bl "^4.0.0" + +it-glob@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/it-glob/-/it-glob-0.0.10.tgz#4defd9286f693847c3ff483d2ff65f22e1359ad8" + integrity sha512-p1PR15djgPV7pxdLOW9j4WcJdla8+91rJdUU2hU2Jm68vkxpIEXK55VHBeH8Lvqh2vqLtM83t8q4BuJxue6niA== + dependencies: + fs-extra "^9.0.1" + minimatch "^3.0.4" + +it-last@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/it-last/-/it-last-1.0.6.tgz#4106232e5905ec11e16de15a0e9f7037eaecfc45" + integrity sha512-aFGeibeiX/lM4bX3JY0OkVCFkAw8+n9lkukkLNivbJRvNz8lI3YXv5xcqhFUV2lDJiraEK3OXRDbGuevnnR67Q== + +it-map@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/it-map/-/it-map-1.0.6.tgz#6aa547e363eedcf8d4f69d8484b450bc13c9882c" + integrity sha512-XT4/RM6UHIFG9IobGlQPFQUrlEKkU4eBUFG3qhWhfAdh1JfF2x11ShCrKCdmZ0OiZppPfoLuzcfA4cey6q3UAQ== + +it-peekable@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/it-peekable/-/it-peekable-1.0.3.tgz#8ebe933767d9c5aa0ae4ef8e9cb3a47389bced8c" + integrity sha512-5+8zemFS+wSfIkSZyf0Zh5kNN+iGyccN02914BY4w/Dj+uoFEoPSvj5vaWn8pNZJNSxzjW0zHRxC3LUb2KWJTQ== + +it-reader@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/it-reader/-/it-reader-2.1.0.tgz#b1164be343f8538d8775e10fb0339f61ccf71b0f" + integrity sha512-hSysqWTO9Tlwc5EGjVf8JYZzw0D2FsxD/g+eNNWrez9zODxWt6QlN6JAMmycK72Mv4jHEKEXoyzUN4FYGmJaZw== + dependencies: + bl "^4.0.0" + +it-tar@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/it-tar/-/it-tar-1.2.2.tgz#8d79863dad27726c781a4bcc491f53c20f2866cf" + integrity sha512-M8V4a9I+x/vwXTjqvixcEZbQZHjwDIb8iUQ+D4M2QbhAdNs3WKVSl+45u5/F2XFx6jYMFOGzMVlKNK/uONgNIA== + dependencies: + bl "^4.0.0" + buffer "^5.4.3" + iso-constants "^0.1.2" + it-concat "^1.0.0" + it-reader "^2.0.0" + p-defer "^3.0.0" + +it-to-stream@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/it-to-stream/-/it-to-stream-0.1.2.tgz#7163151f75b60445e86b8ab1a968666acaacfe7b" + integrity sha512-DTB5TJRZG3untmZehcaFN0kGWl2bNv7tnJRgQHAO9QEt8jfvVRrebZtnD5NZd4SCj4WVPjl0LSrugNWE/UaZRQ== + dependencies: + buffer "^5.6.0" + fast-fifo "^1.0.0" + get-iterator "^1.0.2" + p-defer "^3.0.0" + p-fifo "^1.0.0" + readable-stream "^3.6.0" + jest-changed-files@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.6.2.tgz#f6198479e1cc66f22f9ae1e22acaa0b429c042d0" @@ -6692,7 +7117,7 @@ jest@26.6.3: import-local "^3.0.2" jest-cli "^26.6.3" -js-sha3@0.8.0: +js-sha3@0.8.0, js-sha3@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== @@ -6815,6 +7240,13 @@ json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== +json-text-sequence@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/json-text-sequence/-/json-text-sequence-0.1.1.tgz#a72f217dc4afc4629fff5feb304dc1bd51a2f3d2" + integrity sha512-L3mEegEWHRekSHjc7+sc8eJhba9Clq1PZ8kMkzf8OxElhXc8O4TS5MwcVlj9aEbm5dr81N90WHC5nAz3UO971w== + dependencies: + delimit-stream "0.1.0" + json5@2.x, json5@^2.2.2: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" @@ -7228,6 +7660,13 @@ meow@^8.0.0: type-fest "^0.18.0" yargs-parser "^20.2.3" +merge-options@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-options/-/merge-options-2.0.0.tgz#36ca5038badfc3974dbde5e58ba89d3df80882c3" + integrity sha512-S7xYIeWHl2ZUKF7SDeBhGg6rfv5bKxVBdk95s/I7wVF8d+hjLSztJ/B271cnUiF6CAFduEQ5Zn3HYwAjT16DlQ== + dependencies: + is-plain-obj "^2.0.0" + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -7297,6 +7736,13 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== +minimatch@*: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + minimatch@^3.0.3, minimatch@^3.0.4, minimatch@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -7454,6 +7900,27 @@ ms@^2.0.0, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +multiaddr-to-uri@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/multiaddr-to-uri/-/multiaddr-to-uri-6.0.0.tgz#8f08a75c6eeb2370d5d24b77b8413e3f0fa9bcc0" + integrity sha512-OjpkVHOXEmIKMO8WChzzQ7aZQcSQX8squxmvtDbRpy7/QNmJ3Z7jv6qyD74C28QtaeNie8O8ngW2AkeiMmKP7A== + dependencies: + multiaddr "^8.0.0" + +multiaddr@^8.0.0: + version "8.1.2" + resolved "https://registry.yarnpkg.com/multiaddr/-/multiaddr-8.1.2.tgz#74060ff8636ba1c01b2cf0ffd53950b852fa9b1f" + integrity sha512-r13IzW8+Sv9zab9Gt8RPMIN2WkptIPq99EpAzg4IbJ/zTELhiEwXWr9bAmEatSCI4j/LSA6ESJzvz95JZ+ZYXQ== + dependencies: + cids "^1.0.0" + class-is "^1.1.0" + dns-over-http-resolver "^1.0.0" + err-code "^2.0.3" + is-ip "^3.1.0" + multibase "^3.0.0" + uint8arrays "^1.1.0" + varint "^5.0.0" + multibase@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b" @@ -7462,6 +7929,21 @@ multibase@^0.7.0: base-x "^3.0.8" buffer "^5.5.0" +multibase@^3.0.0, multibase@^3.1.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/multibase/-/multibase-3.1.2.tgz#59314e1e2c35d018db38e4c20bb79026827f0f2f" + integrity sha512-bpklWHs70LO3smJUHOjcnzGceJJvn9ui0Vau6Za0B/GBepaXswmW8Ufea0uD9pROf/qCQ4N4lZ3sf3U+SNf0tw== + dependencies: + "@multiformats/base-x" "^4.0.1" + web-encoding "^1.0.6" + +multibase@^4.0.1: + version "4.0.6" + resolved "https://registry.yarnpkg.com/multibase/-/multibase-4.0.6.tgz#6e624341483d6123ca1ede956208cb821b440559" + integrity sha512-x23pDe5+svdLz/k5JPGCVdfn7Q5mZVMBETiC+ORfO+sor9Sgs0smJzAjfTbM5tckeCqnaUuMYoz+k3RXMmJClQ== + dependencies: + "@multiformats/base-x" "^4.0.1" + multibase@~0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b" @@ -7485,6 +7967,27 @@ multicodec@^1.0.0: buffer "^5.6.0" varint "^5.0.0" +multicodec@^2.0.0, multicodec@^2.0.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-2.1.3.tgz#b9850635ad4e2a285a933151b55b4a2294152a5d" + integrity sha512-0tOH2Gtio39uO41o+2xl9UhRkCWxU5ZmZSbFCh/OjGzkWJI8e6lkN/s4Mj1YfyWoBod+2+S3W+6wO6nhkwN8pA== + dependencies: + uint8arrays "1.1.0" + varint "^6.0.0" + +multicodec@^3.0.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-3.2.1.tgz#82de3254a0fb163a107c1aab324f2a91ef51efb2" + integrity sha512-+expTPftro8VAW8kfvcuNNNBgb9gPeNYV9dn+z1kJRWF2vih+/S79f2RVeIwmrJBUJ6NT9IUPWnZDQvegEh5pw== + dependencies: + uint8arrays "^3.0.0" + varint "^6.0.0" + +multiformats@^9.4.2: + version "9.9.0" + resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.9.0.tgz#c68354e7d21037a8f1f8833c8ccd68618e8f1d37" + integrity sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== + multihashes@^0.4.15, multihashes@~0.4.15: version "0.4.21" resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5" @@ -7494,6 +7997,36 @@ multihashes@^0.4.15, multihashes@~0.4.15: multibase "^0.7.0" varint "^5.0.0" +multihashes@^3.0.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-3.1.2.tgz#ffa5e50497aceb7911f7b4a3b6cada9b9730edfc" + integrity sha512-AP4IoV/YzkNrfbQKZE3OMPibrmy350OmCd6cJkwyM8oExaXIlOY4UnOOVSQtAEuq/LR01XfXKCESidzZvSwHCQ== + dependencies: + multibase "^3.1.0" + uint8arrays "^2.0.5" + varint "^6.0.0" + +multihashes@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-4.0.3.tgz#426610539cd2551edbf533adeac4c06b3b90fb05" + integrity sha512-0AhMH7Iu95XjDLxIeuCOOE4t9+vQZsACyKZ9Fxw2pcsRmlX4iCn1mby0hS0bb+nQOVpdQYWPpnyusw4da5RPhA== + dependencies: + multibase "^4.0.1" + uint8arrays "^3.0.0" + varint "^5.0.2" + +multihashing-async@^2.0.0: + version "2.1.4" + resolved "https://registry.yarnpkg.com/multihashing-async/-/multihashing-async-2.1.4.tgz#26dce2ec7a40f0e7f9e732fc23ca5f564d693843" + integrity sha512-sB1MiQXPSBTNRVSJc2zM157PXgDtud2nMFUEIvBrsq5Wv96sUclMRK/ecjoP1T/W61UJBqt4tCTwMkUpt2Gbzg== + dependencies: + blakejs "^1.1.0" + err-code "^3.0.0" + js-sha3 "^0.8.0" + multihashes "^4.0.1" + murmurhash3js-revisited "^3.0.0" + uint8arrays "^3.0.0" + multimatch@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-5.0.0.tgz#932b800963cea7a31a033328fa1e0c3a1874dbe6" @@ -7505,6 +8038,11 @@ multimatch@^5.0.0: arrify "^2.0.1" minimatch "^3.0.4" +murmurhash3js-revisited@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz#6bd36e25de8f73394222adc6e41fa3fac08a5869" + integrity sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g== + mustache@4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.0.1.tgz#d99beb031701ad433338e7ea65e0489416c854a2" @@ -7524,6 +8062,11 @@ mz@^2.7.0: object-assign "^4.0.1" thenify-all "^1.0.0" +nanoid@^3.1.12, nanoid@^3.1.3: + version "3.3.6" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== + nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -7541,6 +8084,30 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" +native-abort-controller@0.0.3, native-abort-controller@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/native-abort-controller/-/native-abort-controller-0.0.3.tgz#4c528a6c9c7d3eafefdc2c196ac9deb1a5edf2f8" + integrity sha512-YIxU5nWqSHG1Xbu3eOu3pdFRD882ivQpIcu6AiPVe2oSVoRbfYW63DVkZm3g1gHiMtZSvZzF6THSzTGEBYl8YA== + dependencies: + globalthis "^1.0.1" + +native-abort-controller@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/native-abort-controller/-/native-abort-controller-1.0.4.tgz#39920155cc0c18209ff93af5bc90be856143f251" + integrity sha512-zp8yev7nxczDJMoP6pDxyD20IU0T22eX8VwN2ztDccKvSZhRaV33yP1BGwKSZfXuqWUzsXopVFjBdau9OOAwMQ== + +native-fetch@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/native-fetch/-/native-fetch-2.0.1.tgz#319d53741a7040def92d5dc8ea5fe9416b1fad89" + integrity sha512-gv4Bea+ga9QdXINurpkEqun3ap3vnB+WYoe4c8ddqUYEH7B2h6iD39RF8uVN7OwmSfMY3RDxkvBnoI4e2/vLXQ== + dependencies: + globalthis "^1.0.1" + +native-fetch@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/native-fetch/-/native-fetch-3.0.0.tgz#06ccdd70e79e171c365c75117959cf4fe14a09bb" + integrity sha512-G3Z7vx0IFb/FQ4JxvtqGABsOTIqRWvgQz6e+erkB+JJD6LrszQtMozEHI4EkmgZQvnGHrpLVzUWk7t4sJCIkVw== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -7576,7 +8143,7 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -node-fetch@^2.6.1, node-fetch@^2.6.7: +node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.7: version "2.6.12" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.12.tgz#02eb8e22074018e3d5a83016649d04df0e348fba" integrity sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g== @@ -7951,11 +8518,24 @@ p-defer@^1.0.0: resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" integrity sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw== +p-defer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-3.0.0.tgz#d1dceb4ee9b2b604b1d94ffec83760175d4e6f83" + integrity sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw== + p-each-series@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.2.0.tgz#105ab0357ce72b202a8a8b94933672657b5e2a9a" integrity sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA== +p-fifo@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-fifo/-/p-fifo-1.0.0.tgz#e29d5cf17c239ba87f51dde98c1d26a9cfe20a63" + integrity sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A== + dependencies: + fast-fifo "^1.0.0" + p-defer "^3.0.0" + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -8080,6 +8660,11 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parse-duration@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/parse-duration/-/parse-duration-0.4.4.tgz#11c0f51a689e97d06c57bd772f7fda7dc013243c" + integrity sha512-KbAJuYGUhZkB9gotDiKLnZ7Z3VTacK3fgwmDdB6ZVDtJbMBT6MfLga0WJaYpPDu0mzqT0NgHtHDt5PY4l0nidg== + parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" @@ -8236,6 +8821,53 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +polywrap@~0.10.2: + version "0.10.6" + resolved "https://registry.yarnpkg.com/polywrap/-/polywrap-0.10.6.tgz#013151429f4b5014316b95a08130abfe0344f43f" + integrity sha512-p1zFJofXCkksmXJoAymlA+2l7VDEyT4YFtJeTda87s+f0CJqIHlgm9CZQnj4zoqkXDzfT3ol0yTnvhJCWS0RTg== + dependencies: + "@apidevtools/json-schema-ref-parser" "9.0.9" + "@ethersproject/providers" "5.6.8" + "@ethersproject/wallet" "5.6.2" + "@formatjs/intl" "1.8.2" + "@polywrap/asyncify-js" "0.10.0" + "@polywrap/client-config-builder-js" "0.10.0" + "@polywrap/client-js" "0.10.0" + "@polywrap/core-js" "0.10.0" + "@polywrap/ethereum-provider-js-v1" "npm:@polywrap/ethereum-provider-js@~0.2.4" + "@polywrap/logging-js" "0.10.6" + "@polywrap/os-js" "0.10.6" + "@polywrap/polywrap-manifest-types-js" "0.10.6" + "@polywrap/result" "0.10.0" + "@polywrap/schema-bind" "0.10.6" + "@polywrap/schema-compose" "0.10.6" + "@polywrap/schema-parse" "0.10.6" + "@polywrap/uri-resolver-extensions-js" "0.10.0" + "@polywrap/uri-resolvers-js" "0.10.0" + "@polywrap/wasm-js" "0.10.0" + "@polywrap/wrap-manifest-types-js" "0.10.0" + axios "0.21.2" + chalk "4.1.0" + chokidar "3.5.1" + commander "9.2.0" + content-hash "2.5.2" + copyfiles "2.4.1" + docker-compose "0.23.17" + extract-zip "2.0.1" + form-data "4.0.0" + fs-extra "9.0.1" + ipfs-http-client "48.1.3" + json-schema "0.4.0" + jsonschema "1.4.0" + mustache "4.0.1" + os-locale "5.0.0" + regex-parser "2.2.11" + rimraf "3.0.2" + toml "3.0.0" + typescript "4.9.5" + yaml "2.2.2" + yesno "0.4.0" + posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -8336,6 +8968,11 @@ proto-list@~1.2.1: resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== +protocol-buffers-schema@^3.3.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz#77bc75a48b2ff142c1ad5b5b90c94cd0fa2efd03" + integrity sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw== + protocols@^1.4.0: version "1.4.8" resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.8.tgz#48eea2d8f58d9644a4a32caae5d5db290a075ce8" @@ -8346,6 +8983,16 @@ protocols@^2.0.1: resolved "https://registry.yarnpkg.com/protocols/-/protocols-2.0.1.tgz#8f155da3fc0f32644e83c5782c8e8212ccf70a86" integrity sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q== +protons@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/protons/-/protons-2.0.3.tgz#94f45484d04b66dfedc43ad3abff1e8907994bb2" + integrity sha512-j6JikP/H7gNybNinZhAHMN07Vjr1i4lVupg598l4I9gSTjJqOvKnwjzYX2PzvBTSVf2eZ2nWv4vG+mtW8L6tpA== + dependencies: + protocol-buffers-schema "^3.3.1" + signed-varint "^2.0.1" + uint8arrays "^3.0.0" + varint "^5.0.0" + proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" @@ -8551,7 +9198,7 @@ read@1, read@~1.0.1: dependencies: mute-stream "~0.0.4" -readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2: +readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -8600,6 +9247,13 @@ readdirp@~3.5.0: dependencies: picomatch "^2.2.1" +receptacle@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/receptacle/-/receptacle-1.3.2.tgz#a7994c7efafc7a01d0e2041839dab6c4951360d2" + integrity sha512-HrsFvqZZheusncQRiEE7GatOAETrARKV/lnfYicIm8lbvp/JQOdADOfhjBd2DajvoszEyxSM6RlAAIZgEoeu/A== + dependencies: + ms "^2.1.1" + rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" @@ -8628,7 +9282,7 @@ regex-parser@2.2.11: resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== -regexp.prototype.flags@^1.4.3: +regexp.prototype.flags@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== @@ -8703,6 +9357,11 @@ requires-port@^1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== +reset@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/reset/-/reset-0.1.0.tgz#9fc7314171995ae6cb0b7e58b06ce7522af4bafb" + integrity sha512-RF7bp2P2ODreUPA71FZ4DSK52gNLJJ8dSwA1nhOCoC0mI4KZ4D/W6zhd2nfBqX/JlR+QZ/iUqAYPjq1UQU8l0Q== + resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -8747,6 +9406,11 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== +retimer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/retimer/-/retimer-2.0.0.tgz#e8bd68c5e5a8ec2f49ccb5c636db84c04063bbca" + integrity sha512-KLXY85WkEq2V2bKex/LOO1ViXVn2KGYe4PYysAdYdjmraYIUsVkXu8O4am+8+5UbaaGl1qho4aqAAPHNQ4GSbg== + retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" @@ -8788,6 +9452,13 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +run@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/run/-/run-1.4.0.tgz#e17d9e9043ab2fe17776cb299e1237f38f0b4ffa" + integrity sha512-962oBW07IjQ9SizyMHdoteVbDKt/e2nEsnTRZ0WjK/zs+jfQQICqH0qj0D5lqZNuy0JkbzfA6IOqw0Sk7C3DlQ== + dependencies: + minimatch "*" + rxjs@^6.6.0: version "6.6.7" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" @@ -8982,6 +9653,13 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signed-varint@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/signed-varint/-/signed-varint-2.0.1.tgz#50a9989da7c98c2c61dad119bc97470ef8528129" + integrity sha512-abgDPg1106vuZZOvw7cFwdCABddfJRz5akcCcchzTbhyhYnsG31y4AlZEgp315T7W3nQq5P4xeOm186ZiPVFzw== + dependencies: + varint "~5.0.0" + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -9204,6 +9882,11 @@ ssri@^8.0.0, ssri@^8.0.1: dependencies: minipass "^3.1.1" +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + stack-utils@^2.0.2: version "2.0.6" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" @@ -9219,6 +9902,13 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" +stream-to-it@^0.2.0, stream-to-it@^0.2.2: + version "0.2.4" + resolved "https://registry.yarnpkg.com/stream-to-it/-/stream-to-it-0.2.4.tgz#d2fd7bfbd4a899b4c0d6a7e6a533723af5749bd0" + integrity sha512-4vEbkSs83OahpmBybNJXlJd7d6/RxzkkSdT3I0mnGt79Xd2Kk+e1JqbvAvsQfCeKj3aKb0QIWkyK3/n0j506vQ== + dependencies: + get-iterator "^1.0.2" + strict-uri-encode@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" @@ -9501,6 +10191,14 @@ through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== +timeout-abort-controller@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/timeout-abort-controller/-/timeout-abort-controller-1.1.1.tgz#2c3c3c66f13c783237987673c276cbd7a9762f29" + integrity sha512-BsF9i3NAJag6T0ZEjki9j654zoafI2X6ayuNd6Tp8+Ul6Tr5s4jo973qFeiWrRSweqvskC+AHDKUmIW4b7pdhQ== + dependencies: + abort-controller "^3.0.0" + retimer "^2.0.0" + timers-ext@^0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6" @@ -9733,6 +10431,17 @@ type@^2.7.2: resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + typed-array-length@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" @@ -9769,6 +10478,28 @@ uid-number@0.0.6: resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" integrity sha512-c461FXIljswCuscZn67xq9PpszkPT6RjheWFQTgCyabJrTUozElanb0YEqv2UGgk247YpcJkFBuSGNvBlpXM9w== +uint8arrays@1.1.0, uint8arrays@^1.0.0, uint8arrays@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-1.1.0.tgz#d034aa65399a9fd213a1579e323f0b29f67d0ed2" + integrity sha512-cLdlZ6jnFczsKf5IH1gPHTtcHtPGho5r4CvctohmQjw8K7Q3gFdfIGHxSTdTaCKrL4w09SsPRJTqRS0drYeszA== + dependencies: + multibase "^3.0.0" + web-encoding "^1.0.2" + +uint8arrays@^2.0.5, uint8arrays@^2.1.3: + version "2.1.10" + resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-2.1.10.tgz#34d023c843a327c676e48576295ca373c56e286a" + integrity sha512-Q9/hhJa2836nQfEJSZTmr+pg9+cDJS9XEAp7N2Vg5MzL3bK/mkMVfjscRGYruP9jNda6MAdf4QD/y78gSzkp6A== + dependencies: + multiformats "^9.4.2" + +uint8arrays@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-3.1.1.tgz#2d8762acce159ccd9936057572dade9459f65ae0" + integrity sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg== + dependencies: + multiformats "^9.4.2" + umask@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" @@ -9896,6 +10627,17 @@ util-promisify@^2.1.0: dependencies: object.getownpropertydescriptors "^2.0.3" +util@^0.12.3: + version "0.12.5" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + which-typed-array "^1.1.2" + uuid@^3.3.2: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" @@ -9940,11 +10682,16 @@ validate-npm-package-name@^3.0.0: dependencies: builtins "^1.0.3" -varint@^5.0.0: +varint@^5.0.0, varint@^5.0.2, varint@~5.0.0: version "5.0.2" resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== +varint@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/varint/-/varint-6.0.0.tgz#9881eb0ce8feaea6512439d19ddf84bf551661d0" + integrity sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg== + verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" @@ -10021,6 +10768,15 @@ wcwidth@^1.0.0: dependencies: defaults "^1.0.3" +web-encoding@^1.0.2, web-encoding@^1.0.6: + version "1.1.5" + resolved "https://registry.yarnpkg.com/web-encoding/-/web-encoding-1.1.5.tgz#fc810cf7667364a6335c939913f5051d3e0c4864" + integrity sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA== + dependencies: + util "^0.12.3" + optionalDependencies: + "@zxing/text-encoding" "0.9.0" + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -10081,7 +10837,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.9: +which-typed-array@^1.1.10, which-typed-array@^1.1.2: version "1.1.10" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.10.tgz#74baa2789991905c2076abb317103b866c64e69e" integrity sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA== From 090d06d77d444b8b163e372c24a7b1eab7606cf7 Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Thu, 13 Jul 2023 13:54:37 +0800 Subject: [PATCH 103/181] fix: issues --- .../cli/src/__tests__/e2e/p1/create.spec.ts | 2 +- .../cli/src/__tests__/e2e/p1/help.spec.ts | 20 +++++++++---------- .../src/__tests__/e2e/p1/no-command.spec.ts | 20 +++++++++---------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/packages/cli/src/__tests__/e2e/p1/create.spec.ts b/packages/cli/src/__tests__/e2e/p1/create.spec.ts index 5287d3442f..7749b8e6c1 100644 --- a/packages/cli/src/__tests__/e2e/p1/create.spec.ts +++ b/packages/cli/src/__tests__/e2e/p1/create.spec.ts @@ -16,7 +16,7 @@ Options: Commands: wasm [options] Create a Polywrap wasm wrapper. langs: - assemblyscript, rust, interface + assemblyscript, rust, golang, interface app [options] Create a Polywrap application. langs: typescript plugin [options] Create a Polywrap plugin. langs: diff --git a/packages/cli/src/__tests__/e2e/p1/help.spec.ts b/packages/cli/src/__tests__/e2e/p1/help.spec.ts index f8d71a857d..1dcfc61585 100644 --- a/packages/cli/src/__tests__/e2e/p1/help.spec.ts +++ b/packages/cli/src/__tests__/e2e/p1/help.spec.ts @@ -6,18 +6,18 @@ import { runCli } from "@polywrap/cli-js"; const HELP = `Usage: polywrap [options] [command] Options: - -h, --help display help for command + -h, --help display help for command Commands: - build|b [options] Build Polywrap Projects (type: interface, wasm) - codegen|g [options] Generate Code For Polywrap Projects - create|c Create New Projects - deploy|d [options] Deploys Polywrap Projects - infra|i [options] Modular Infrastructure-As-Code Orchestrator - manifest|m Inspect & Migrade Polywrap Manifests - test|t [options] Execute Tests - docs Documentation commands - help [command] display help for command + build|b [options] Build Polywrap Projects (type: interface, wasm) + codegen|g [options] Generate Code For Polywrap Projects + create|c Create New Projects + deploy|d [options] Deploys Polywrap Projects + infra|i [options] Modular Infrastructure-As-Code Orchestrator + manifest|m Inspect & Migrade Polywrap Manifests + test|t [options] Execute Tests + docs Documentation commands + help [command] display help for command `; describe("e2e tests for no help", () => { diff --git a/packages/cli/src/__tests__/e2e/p1/no-command.spec.ts b/packages/cli/src/__tests__/e2e/p1/no-command.spec.ts index 3db13b855d..9a1c7919d3 100644 --- a/packages/cli/src/__tests__/e2e/p1/no-command.spec.ts +++ b/packages/cli/src/__tests__/e2e/p1/no-command.spec.ts @@ -6,18 +6,18 @@ import { runCli } from "@polywrap/cli-js"; const HELP = `Usage: polywrap [options] [command] Options: - -h, --help display help for command + -h, --help display help for command Commands: - build|b [options] Build Polywrap Projects (type: interface, wasm) - codegen|g [options] Generate Code For Polywrap Projects - create|c Create New Projects - deploy|d [options] Deploys Polywrap Projects - infra|i [options] Modular Infrastructure-As-Code Orchestrator - manifest|m Inspect & Migrade Polywrap Manifests - test|t [options] Execute Tests - docs Documentation commands - help [command] display help for command + build|b [options] Build Polywrap Projects (type: interface, wasm) + codegen|g [options] Generate Code For Polywrap Projects + create|c Create New Projects + deploy|d [options] Deploys Polywrap Projects + infra|i [options] Modular Infrastructure-As-Code Orchestrator + manifest|m Inspect & Migrade Polywrap Manifests + test|t [options] Execute Tests + docs Documentation commands + help [command] display help for command `; describe("e2e tests for no command", () => { From ae21788f416afbb4b1c8769562d1007bebf65477 Mon Sep 17 00:00:00 2001 From: krisbitney Date: Thu, 13 Jul 2023 09:31:48 -0500 Subject: [PATCH 104/181] post-merge fixes --- packages/schema/bind/src/bindings/golang/wasm/index.ts | 2 +- packages/schema/bind/src/bindings/index.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/wasm/index.ts b/packages/schema/bind/src/bindings/golang/wasm/index.ts index 5aee1e7ebf..c6a5e89945 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm/index.ts @@ -41,7 +41,7 @@ export const generateBinding: GenerateBindingFn = ( outputDirAbs: options.outputDirAbs, }; const output = result.output; - const abi = applyTransforms(options.abi); + const abi = applyTransforms(options.wrapInfo.abi); const goImport = options.config?.goModuleName; if (!goImport) { diff --git a/packages/schema/bind/src/bindings/index.ts b/packages/schema/bind/src/bindings/index.ts index 90785d451d..0f21b912ca 100644 --- a/packages/schema/bind/src/bindings/index.ts +++ b/packages/schema/bind/src/bindings/index.ts @@ -18,7 +18,7 @@ export function getGenerateBindingFn( ); case "wrap-rs": return Rust.Wasm.generateBinding; - case "wasm-go": + case "wrap-go": return Golang.Wasm.generateBinding; case "plugin-ts": return WrapBindgen.getGenerateBindingFn( From 08fea60b838e1c32c27db1003cbdf1e9e3a2c8c6 Mon Sep 17 00:00:00 2001 From: krisbitney Date: Thu, 13 Jul 2023 09:41:11 -0500 Subject: [PATCH 105/181] post-merge fixes --- packages/schema/bind/src/__tests__/test-cases.spec.ts | 2 +- .../imported/test_import/enum_test_import__enum.go | 0 .../imported/test_import/enum_test_import__enum__return.go | 0 .../imported/test_import/env_test_import__env.go | 0 .../imported/test_import/env_test_import__env_serialization.go | 0 .../imported/test_import/object_test_import__another_object.go | 0 .../object_test_import__another_object_serialization.go | 0 .../imported/test_import/object_test_import__object.go | 0 .../test_import/object_test_import__object_serialization.go | 0 .../imported/test_import/test_import__module_serialization.go | 0 .../imported/test_import/test_import__module_wrapped.go | 0 .../output/{wasm-go => wrap-go}/interfaces/test_import.go | 0 .../cases/bind/sanity/output/{wasm-go => wrap-go}/main/main.go | 0 .../{wasm-go => wrap-go}/module_wrapped/module_serialization.go | 0 .../{wasm-go => wrap-go}/module_wrapped/module_wrapped.go | 0 .../output/{wasm-go => wrap-go}/types/enum_custom_enum.go | 0 .../bind/sanity/output/{wasm-go => wrap-go}/types/enumwhile.go | 0 .../sanity/output/{wasm-go => wrap-go}/types/module_args.go | 0 .../output/{wasm-go => wrap-go}/types/object_another_type.go | 0 .../types/object_another_type_serialization.go | 0 .../{wasm-go => wrap-go}/types/object_custom_map_value.go | 0 .../types/object_custom_map_value_serialization.go | 0 .../output/{wasm-go => wrap-go}/types/object_custom_type.go | 0 .../types/object_custom_type_serialization.go | 0 .../bind/sanity/output/{wasm-go => wrap-go}/types/object_env.go | 0 .../{wasm-go => wrap-go}/types/object_env_serialization.go | 0 .../bind/sanity/output/{wasm-go => wrap-go}/types/objectelse.go | 0 .../{wasm-go => wrap-go}/types/objectelse_serialization.go | 0 .../cases/bind/sanity/output/{wasm-go => wrap-go}/wrap.go | 0 29 files changed, 1 insertion(+), 1 deletion(-) rename packages/test-cases/cases/bind/sanity/output/{wasm-go => wrap-go}/imported/test_import/enum_test_import__enum.go (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-go => wrap-go}/imported/test_import/enum_test_import__enum__return.go (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-go => wrap-go}/imported/test_import/env_test_import__env.go (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-go => wrap-go}/imported/test_import/env_test_import__env_serialization.go (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-go => wrap-go}/imported/test_import/object_test_import__another_object.go (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-go => wrap-go}/imported/test_import/object_test_import__another_object_serialization.go (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-go => wrap-go}/imported/test_import/object_test_import__object.go (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-go => wrap-go}/imported/test_import/object_test_import__object_serialization.go (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-go => wrap-go}/imported/test_import/test_import__module_serialization.go (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-go => wrap-go}/imported/test_import/test_import__module_wrapped.go (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-go => wrap-go}/interfaces/test_import.go (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-go => wrap-go}/main/main.go (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-go => wrap-go}/module_wrapped/module_serialization.go (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-go => wrap-go}/module_wrapped/module_wrapped.go (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-go => wrap-go}/types/enum_custom_enum.go (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-go => wrap-go}/types/enumwhile.go (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-go => wrap-go}/types/module_args.go (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-go => wrap-go}/types/object_another_type.go (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-go => wrap-go}/types/object_another_type_serialization.go (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-go => wrap-go}/types/object_custom_map_value.go (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-go => wrap-go}/types/object_custom_map_value_serialization.go (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-go => wrap-go}/types/object_custom_type.go (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-go => wrap-go}/types/object_custom_type_serialization.go (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-go => wrap-go}/types/object_env.go (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-go => wrap-go}/types/object_env_serialization.go (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-go => wrap-go}/types/objectelse.go (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-go => wrap-go}/types/objectelse_serialization.go (100%) rename packages/test-cases/cases/bind/sanity/output/{wasm-go => wrap-go}/wrap.go (100%) diff --git a/packages/schema/bind/src/__tests__/test-cases.spec.ts b/packages/schema/bind/src/__tests__/test-cases.spec.ts index ae43b48575..c5f73e0f5b 100644 --- a/packages/schema/bind/src/__tests__/test-cases.spec.ts +++ b/packages/schema/bind/src/__tests__/test-cases.spec.ts @@ -52,7 +52,7 @@ describe("Polywrap Binding Test Suite", () => { bindLanguage: language as BindLanguage, }; - if (language == "wasm-go") { + if (language == "wrap-go") { if (!bindOptions.config) { bindOptions.config = {}; } diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/enum_test_import__enum.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/enum_test_import__enum.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/enum_test_import__enum.go rename to packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/enum_test_import__enum.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/enum_test_import__enum__return.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/enum_test_import__enum__return.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/enum_test_import__enum__return.go rename to packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/enum_test_import__enum__return.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/env_test_import__env.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env.go rename to packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/env_test_import__env.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/env_test_import__env_serialization.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/env_test_import__env_serialization.go rename to packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/env_test_import__env_serialization.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/object_test_import__another_object.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object.go rename to packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/object_test_import__another_object.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object_serialization.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/object_test_import__another_object_serialization.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__another_object_serialization.go rename to packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/object_test_import__another_object_serialization.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/object_test_import__object.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object.go rename to packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/object_test_import__object.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/object_test_import__object_serialization.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/object_test_import__object_serialization.go rename to packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/object_test_import__object_serialization.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/test_import__module_serialization.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_serialization.go rename to packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/test_import__module_serialization.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/test_import__module_wrapped.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/imported/test_import/test_import__module_wrapped.go rename to packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/test_import__module_wrapped.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/interfaces/test_import.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/interfaces/test_import.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/interfaces/test_import.go rename to packages/test-cases/cases/bind/sanity/output/wrap-go/interfaces/test_import.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/main/main.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/main/main.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/main/main.go rename to packages/test-cases/cases/bind/sanity/output/wrap-go/main/main.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/module_wrapped/module_serialization.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_serialization.go rename to packages/test-cases/cases/bind/sanity/output/wrap-go/module_wrapped/module_serialization.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_wrapped.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/module_wrapped/module_wrapped.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/module_wrapped/module_wrapped.go rename to packages/test-cases/cases/bind/sanity/output/wrap-go/module_wrapped/module_wrapped.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/enum_custom_enum.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/types/enum_custom_enum.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/types/enum_custom_enum.go rename to packages/test-cases/cases/bind/sanity/output/wrap-go/types/enum_custom_enum.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/enumwhile.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/types/enumwhile.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/types/enumwhile.go rename to packages/test-cases/cases/bind/sanity/output/wrap-go/types/enumwhile.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/types/module_args.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/types/module_args.go rename to packages/test-cases/cases/bind/sanity/output/wrap-go/types/module_args.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/types/object_another_type.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type.go rename to packages/test-cases/cases/bind/sanity/output/wrap-go/types/object_another_type.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type_serialization.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/types/object_another_type_serialization.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_another_type_serialization.go rename to packages/test-cases/cases/bind/sanity/output/wrap-go/types/object_another_type_serialization.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/types/object_custom_map_value.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value.go rename to packages/test-cases/cases/bind/sanity/output/wrap-go/types/object_custom_map_value.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value_serialization.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/types/object_custom_map_value_serialization.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_map_value_serialization.go rename to packages/test-cases/cases/bind/sanity/output/wrap-go/types/object_custom_map_value_serialization.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/types/object_custom_type.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type.go rename to packages/test-cases/cases/bind/sanity/output/wrap-go/types/object_custom_type.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/types/object_custom_type_serialization.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_custom_type_serialization.go rename to packages/test-cases/cases/bind/sanity/output/wrap-go/types/object_custom_type_serialization.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/types/object_env.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env.go rename to packages/test-cases/cases/bind/sanity/output/wrap-go/types/object_env.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env_serialization.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/types/object_env_serialization.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/types/object_env_serialization.go rename to packages/test-cases/cases/bind/sanity/output/wrap-go/types/object_env_serialization.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/types/objectelse.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse.go rename to packages/test-cases/cases/bind/sanity/output/wrap-go/types/objectelse.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse_serialization.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/types/objectelse_serialization.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/types/objectelse_serialization.go rename to packages/test-cases/cases/bind/sanity/output/wrap-go/types/objectelse_serialization.go diff --git a/packages/test-cases/cases/bind/sanity/output/wasm-go/wrap.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/wrap.go similarity index 100% rename from packages/test-cases/cases/bind/sanity/output/wasm-go/wrap.go rename to packages/test-cases/cases/bind/sanity/output/wrap-go/wrap.go From 907fc2dfd4342e751dca2b0f3f29a2440910f493 Mon Sep 17 00:00:00 2001 From: Pileks Date: Thu, 13 Jul 2023 17:05:26 +0200 Subject: [PATCH 106/181] fix up package inconsistencies --- package.json | 3 +- packages/cli/package.json | 2 +- .../infra-modules/http/server/package.json | 2 +- packages/js/os/package.json | 2 +- packages/js/validation/package.json | 2 +- packages/schema/bind/package.json | 2 +- packages/schema/compose/package.json | 2 +- packages/schema/parse/package.json | 2 +- .../templates/app/typescript/package.json | 4 +- .../templates/plugin/typescript/package.json | 10 +- yarn.lock | 162 +++++------------- 11 files changed, 60 insertions(+), 133 deletions(-) diff --git a/package.json b/package.json index 41edc88e78..e2bca69c73 100644 --- a/package.json +++ b/package.json @@ -58,6 +58,7 @@ }, "resolutions": { "@types/react": "16.9.0", - "@types/react-dom": "16.9.0" + "@types/react-dom": "16.9.0", + "@types/node": "18.15.0" } } diff --git a/packages/cli/package.json b/packages/cli/package.json index 98e29df7f8..0b0af42115 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -85,7 +85,7 @@ "@types/fs-extra": "9.0.12", "@types/jest": "26.0.8", "@types/mustache": "4.0.1", - "@types/node": "^18.14.6", + "@types/node": "18.15.0", "@types/prettier": "2.6.0", "@types/rimraf": "3.0.0", "dir-compare": "3.3.0", diff --git a/packages/cli/src/lib/defaults/infra-modules/http/server/package.json b/packages/cli/src/lib/defaults/infra-modules/http/server/package.json index 03d1dda74a..95dd20d2ac 100644 --- a/packages/cli/src/lib/defaults/infra-modules/http/server/package.json +++ b/packages/cli/src/lib/defaults/infra-modules/http/server/package.json @@ -27,7 +27,7 @@ "@types/file-saver": "2.0.5", "@types/fs-extra": "7.0.0", "@types/jest": "26.0.8", - "@types/node": "^18.14.6", + "@types/node": "18.15.0", "jest": "26.6.3", "nodemon": "2.0.19", "rimraf": "3.0.2", diff --git a/packages/js/os/package.json b/packages/js/os/package.json index 1fc8ff7ea7..949f8800a3 100644 --- a/packages/js/os/package.json +++ b/packages/js/os/package.json @@ -16,7 +16,7 @@ "lint": "eslint --color -c ../../../.eslintrc.js src/" }, "devDependencies": { - "@types/node": "^18.14.6", + "@types/node": "18.15.0", "rimraf": "3.0.2", "typescript": "4.9.5" }, diff --git a/packages/js/validation/package.json b/packages/js/validation/package.json index 55e3f0f145..d4911c2696 100644 --- a/packages/js/validation/package.json +++ b/packages/js/validation/package.json @@ -19,7 +19,7 @@ }, "dependencies": { "@polywrap/schema-compose": "0.10.6", - "@polywrap/wrap-manifest-types-js": "0.10.0" + "@polywrap/wrap-manifest-types-js": "0.12.0-pre.1" }, "devDependencies": { "@polywrap/msgpack-js": "0.10.0", diff --git a/packages/schema/bind/package.json b/packages/schema/bind/package.json index d0ad3b01bf..63cc3467d1 100644 --- a/packages/schema/bind/package.json +++ b/packages/schema/bind/package.json @@ -21,7 +21,7 @@ "dependencies": { "@polywrap/os-js": "0.10.6", "@polywrap/schema-parse": "0.10.6", - "@polywrap/wrap-manifest-types-js": "0.10.0", + "@polywrap/wrap-manifest-types-js": "0.12.0-pre.1", "mustache": "4.0.1" }, "devDependencies": { diff --git a/packages/schema/compose/package.json b/packages/schema/compose/package.json index a38c79d99c..50cdbefb32 100644 --- a/packages/schema/compose/package.json +++ b/packages/schema/compose/package.json @@ -19,7 +19,7 @@ }, "dependencies": { "@polywrap/schema-parse": "0.10.6", - "@polywrap/wrap-manifest-types-js": "0.10.0", + "@polywrap/wrap-manifest-types-js": "0.12.0-pre.1", "graphql": "15.5.0", "mustache": "4.0.1" }, diff --git a/packages/schema/parse/package.json b/packages/schema/parse/package.json index 8903f21a5d..0ab2b5e4bf 100644 --- a/packages/schema/parse/package.json +++ b/packages/schema/parse/package.json @@ -19,7 +19,7 @@ }, "dependencies": { "@dorgjelli/graphql-schema-cycles": "1.1.4", - "@polywrap/wrap-manifest-types-js": "0.10.0", + "@polywrap/wrap-manifest-types-js": "0.12.0-pre.1", "graphql": "15.5.0" }, "devDependencies": { diff --git a/packages/templates/app/typescript/package.json b/packages/templates/app/typescript/package.json index e746fb599f..4dd0a43db0 100644 --- a/packages/templates/app/typescript/package.json +++ b/packages/templates/app/typescript/package.json @@ -8,10 +8,10 @@ "test": "ts-node ./src/index.ts" }, "dependencies": { - "@polywrap/client-js": "~0.10.0" + "@polywrap/client-js": "~0.12.0-pre.1" }, "devDependencies": { - "@types/node": "^18.14.6", + "@types/node": "18.15.0", "polywrap": "0.10.6", "ts-node": "10.9.1", "typescript": "4.9.5" diff --git a/packages/templates/plugin/typescript/package.json b/packages/templates/plugin/typescript/package.json index ee69d77fcf..ea117e0f74 100644 --- a/packages/templates/plugin/typescript/package.json +++ b/packages/templates/plugin/typescript/package.json @@ -11,15 +11,15 @@ "test:watch": "yarn test -- --watch" }, "dependencies": { - "@polywrap/core-js": "~0.10.0", - "@polywrap/plugin-js": "~0.10.0" + "@polywrap/core-js": "~0.12.0-pre.1", + "@polywrap/plugin-js": "~0.12.0-pre.1" }, "peerDependencies": { - "@polywrap/core-js": "0.10.x", - "@polywrap/plugin-js": "0.10.x" + "@polywrap/core-js": "0.12.x", + "@polywrap/plugin-js": "0.12.x" }, "devDependencies": { - "@polywrap/client-js": "~0.10.0", + "@polywrap/client-js": "~0.12.0-pre.1", "@types/jest": "26.0.8", "@types/prettier": "2.6.0", "jest": "26.6.3", diff --git a/yarn.lock b/yarn.lock index eb710bc4bd..386057e84f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2141,33 +2141,11 @@ resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.6.0.tgz#ed410c9eb0070491cff9fe914246ce41f88d6f74" integrity sha512-aPfcBeLErM/PPiAuAbNFLN5sNbZLc3KZlar27uohllN8Zs6jJbHyJU1y7cMA6W/zuq+thkaG8mujiS+3iD/FWQ== -"@polywrap/asyncify-js@0.10.1": - version "0.10.1" - resolved "https://registry.yarnpkg.com/@polywrap/asyncify-js/-/asyncify-js-0.10.1.tgz#00d656a39bfd54c1b8af82adf648264b0415259b" - integrity sha512-qXD2GNAoG18sDLPOtN3bbdEJUM+5hhII2EJkcAREJSBpi4g7yFxlySz/qQGzDnlIRNl9MGNgaf+TYbpQnNBeLw== - "@polywrap/asyncify-js@0.12.0-pre.1": version "0.12.0-pre.1" resolved "https://registry.yarnpkg.com/@polywrap/asyncify-js/-/asyncify-js-0.12.0-pre.1.tgz#a09d3a1346315737790c36d8aa00e2d31fd849c5" integrity sha512-E6OfxaOUrtHgp+3pbr5uJPLeoE9UJU7VXeL37n8ETel7LLjPfSfV7xn2x7iqdhvpJd5S+1daczC/g7espLzfLw== -"@polywrap/client-config-builder-js@0.10.1": - version "0.10.1" - resolved "https://registry.yarnpkg.com/@polywrap/client-config-builder-js/-/client-config-builder-js-0.10.1.tgz#d52430645b4530b235f97318ccdeef256eb4c425" - integrity sha512-cXQXe+u+r9WVCovp507FmERWWFa6OJSl8ZQd3QpKnIaNeBmXbAa4WoM5889VTPe2oe5iDgo4jR4U/fHBg8qoyQ== - dependencies: - "@polywrap/concurrent-plugin-js" "~0.10.0" - "@polywrap/core-js" "0.10.1" - "@polywrap/ethereum-provider-js" "npm:@polywrap/ethereum-provider-js@~0.3.1" - "@polywrap/ethereum-provider-js-v1" "npm:@polywrap/ethereum-provider-js@~0.2.4" - "@polywrap/file-system-plugin-js" "~0.10.0" - "@polywrap/http-plugin-js" "~0.10.0" - "@polywrap/logger-plugin-js" "~0.10.1" - "@polywrap/uri-resolver-extensions-js" "0.10.1" - "@polywrap/uri-resolvers-js" "0.10.1" - "@polywrap/wasm-js" "0.10.1" - base64-to-uint8array "1.0.0" - "@polywrap/client-config-builder-js@0.12.0-pre.1": version "0.12.0-pre.1" resolved "https://registry.yarnpkg.com/@polywrap/client-config-builder-js/-/client-config-builder-js-0.12.0-pre.1.tgz#5fca0bfc216de2978b95bea1fd09b54cf6e40afa" @@ -2182,7 +2160,7 @@ "@polywrap/wasm-js" "0.12.0-pre.1" "@polywrap/web3-config-bundle-js" "0.12.0-pre.1" -"@polywrap/client-js@0.12.0-pre.1": +"@polywrap/client-js@0.12.0-pre.1", "@polywrap/client-js@~0.12.0-pre.1": version "0.12.0-pre.1" resolved "https://registry.yarnpkg.com/@polywrap/client-js/-/client-js-0.12.0-pre.1.tgz#1df47c4eef946dc74ed4025e4726377c89b3b70c" integrity sha512-BlmDn+wJqDsvpr26959vbO0XobPQ8XTb+qaK9bt2Zgqfb6st10KS9H099WFhGXOAGXsUQFi9SqQPjvUjeMoU1A== @@ -2198,22 +2176,6 @@ "@polywrap/uri-resolvers-js" "0.12.0-pre.1" "@polywrap/wrap-manifest-types-js" "0.12.0-pre.1" -"@polywrap/client-js@~0.10.0": - version "0.10.1" - resolved "https://registry.yarnpkg.com/@polywrap/client-js/-/client-js-0.10.1.tgz#d324420b1558d7fb47c6928042c083eef7b3b6f6" - integrity sha512-xIZoGOPPS+J2RjiyEF8A8huMIr0IyN+VEwHWcCUdp7NxTQ1xmve1lxQfbbdE0BC37o5Ni7lJwiIXmAUfhuMyGg== - dependencies: - "@polywrap/client-config-builder-js" "0.10.1" - "@polywrap/core-client-js" "0.10.1" - "@polywrap/core-js" "0.10.1" - "@polywrap/msgpack-js" "0.10.1" - "@polywrap/plugin-js" "0.10.1" - "@polywrap/result" "0.10.1" - "@polywrap/tracing-js" "0.10.1" - "@polywrap/uri-resolver-extensions-js" "0.10.1" - "@polywrap/uri-resolvers-js" "0.10.1" - "@polywrap/wrap-manifest-types-js" "0.10.1" - "@polywrap/concurrent-plugin-js@~0.10.0": version "0.10.0" resolved "https://registry.yarnpkg.com/@polywrap/concurrent-plugin-js/-/concurrent-plugin-js-0.10.0.tgz#662e49976f75f30632b302d515bd22c7643afc44" @@ -2230,17 +2192,6 @@ dependencies: "@polywrap/core-js" "0.12.0-pre.1" -"@polywrap/core-client-js@0.10.1": - version "0.10.1" - resolved "https://registry.yarnpkg.com/@polywrap/core-client-js/-/core-client-js-0.10.1.tgz#7342adfcffe2ce97ce7066c4c8ae1fc54250cb4f" - integrity sha512-ew5B4nNTgzgzqt8KZE06bclhqUrfZbA0D9n2BlyQ4+RfiSTQFoqoN8jN53TuHRFJRmt0v/a/RPRvKujF5mMf9g== - dependencies: - "@polywrap/core-js" "0.10.1" - "@polywrap/msgpack-js" "0.10.1" - "@polywrap/result" "0.10.1" - "@polywrap/tracing-js" "0.10.1" - "@polywrap/wrap-manifest-types-js" "0.10.1" - "@polywrap/core-client-js@0.12.0-pre.1": version "0.12.0-pre.1" resolved "https://registry.yarnpkg.com/@polywrap/core-client-js/-/core-client-js-0.12.0-pre.1.tgz#9d4962e660ea467a98f4ff000ca1e00245dc305f" @@ -2270,7 +2221,7 @@ "@polywrap/tracing-js" "0.10.0-pre.10" "@polywrap/wrap-manifest-types-js" "0.10.0-pre.10" -"@polywrap/core-js@0.10.1", "@polywrap/core-js@~0.10.0", "@polywrap/core-js@~0.10.1": +"@polywrap/core-js@0.10.1", "@polywrap/core-js@~0.10.1": version "0.10.1" resolved "https://registry.yarnpkg.com/@polywrap/core-js/-/core-js-0.10.1.tgz#09405c745f591d5f7ec243db95a61540a05296cb" integrity sha512-BJpWDikfd/6h64Lf7FKy0g5O3a5OKaL915boni1pHP54wF4xBWdHkKixLGD8w4BZWRiW9v42PpYBhWqYZwSNGg== @@ -2279,7 +2230,7 @@ "@polywrap/tracing-js" "0.10.1" "@polywrap/wrap-manifest-types-js" "0.10.1" -"@polywrap/core-js@0.12.0-pre.1": +"@polywrap/core-js@0.12.0-pre.1", "@polywrap/core-js@~0.12.0-pre.1": version "0.12.0-pre.1" resolved "https://registry.yarnpkg.com/@polywrap/core-js/-/core-js-0.12.0-pre.1.tgz#b376db87e0e60bd5940941b80c8cd064c44dc142" integrity sha512-BMxp5nEJGGIerFsRR7x+CMSthIF0BjFFTTmWmpy3s5aTizKUfTtw5XIMnSeUAswA7+4beo8GSkS2u6L+T+u7YA== @@ -2336,7 +2287,7 @@ axios "0.21.4" form-data "4.0.0" -"@polywrap/logger-plugin-js@~0.10.0", "@polywrap/logger-plugin-js@~0.10.1": +"@polywrap/logger-plugin-js@~0.10.0": version "0.10.1" resolved "https://registry.yarnpkg.com/@polywrap/logger-plugin-js/-/logger-plugin-js-0.10.1.tgz#220cc248cb1381aa46c1f773ed8ce77da420280c" integrity sha512-ipqS7A6Mc0Fp0e/qg8RyGIulfk6mGS9acKii3kQoJ59/Zf/Yy4Eg3HWDtnlgBIdIgwyZKD8amiF42VKRO6R3Ig== @@ -2394,18 +2345,7 @@ "@polywrap/tracing-js" "0.10.0-pre.10" "@polywrap/wrap-manifest-types-js" "0.10.0-pre.10" -"@polywrap/plugin-js@0.10.1", "@polywrap/plugin-js@~0.10.0", "@polywrap/plugin-js@~0.10.1": - version "0.10.1" - resolved "https://registry.yarnpkg.com/@polywrap/plugin-js/-/plugin-js-0.10.1.tgz#e11ce19dde01245750c297a62f2f75fd58ef9ced" - integrity sha512-WBk4ZUrI5m6FG4bIocLHo7XS+QMeNa23odli6Ss6onUyo7mPIo1wlceEgw7Cu4gd/3bmuc6VGoCKRA1/glBT3g== - dependencies: - "@polywrap/core-js" "0.10.1" - "@polywrap/msgpack-js" "0.10.1" - "@polywrap/result" "0.10.1" - "@polywrap/tracing-js" "0.10.1" - "@polywrap/wrap-manifest-types-js" "0.10.1" - -"@polywrap/plugin-js@0.12.0-pre.1": +"@polywrap/plugin-js@0.12.0-pre.1", "@polywrap/plugin-js@~0.12.0-pre.1": version "0.12.0-pre.1" resolved "https://registry.yarnpkg.com/@polywrap/plugin-js/-/plugin-js-0.12.0-pre.1.tgz#86865f63545086b47ebfbd546ed18ab0ce146752" integrity sha512-juHMEUsuoY/ZpbsVWZ9puMkX83PcCeT/hKKWxVl+CfmoWpmFiatorgdS3kMgr/O19+o/b6eyd/sqKyWSxmVdQw== @@ -2416,6 +2356,17 @@ "@polywrap/tracing-js" "0.12.0-pre.1" "@polywrap/wrap-manifest-types-js" "0.12.0-pre.1" +"@polywrap/plugin-js@~0.10.1": + version "0.10.1" + resolved "https://registry.yarnpkg.com/@polywrap/plugin-js/-/plugin-js-0.10.1.tgz#e11ce19dde01245750c297a62f2f75fd58ef9ced" + integrity sha512-WBk4ZUrI5m6FG4bIocLHo7XS+QMeNa23odli6Ss6onUyo7mPIo1wlceEgw7Cu4gd/3bmuc6VGoCKRA1/glBT3g== + dependencies: + "@polywrap/core-js" "0.10.1" + "@polywrap/msgpack-js" "0.10.1" + "@polywrap/result" "0.10.1" + "@polywrap/tracing-js" "0.10.1" + "@polywrap/wrap-manifest-types-js" "0.10.1" + "@polywrap/result@0.10.0": version "0.10.0" resolved "https://registry.yarnpkg.com/@polywrap/result/-/result-0.10.0.tgz#712339223fba524dfabfb0bf868411f357d52e34" @@ -2498,17 +2449,6 @@ "@opentelemetry/sdk-trace-base" "1.6.0" "@opentelemetry/sdk-trace-web" "1.6.0" -"@polywrap/uri-resolver-extensions-js@0.10.1": - version "0.10.1" - resolved "https://registry.yarnpkg.com/@polywrap/uri-resolver-extensions-js/-/uri-resolver-extensions-js-0.10.1.tgz#6385ec63de3d53a8eddedeba10c59f0c8b2de36e" - integrity sha512-dsihLqgC3o76xnhWMH+o0Nol58BBy2KljxSoRGdi1XbEEkdHHKx2qwxfWAjOA83ljGJXToh0IsaxbCUuPEMIZQ== - dependencies: - "@polywrap/core-js" "0.10.1" - "@polywrap/result" "0.10.1" - "@polywrap/uri-resolvers-js" "0.10.1" - "@polywrap/wasm-js" "0.10.1" - "@polywrap/wrap-manifest-types-js" "0.10.1" - "@polywrap/uri-resolver-extensions-js@0.12.0-pre.1": version "0.12.0-pre.1" resolved "https://registry.yarnpkg.com/@polywrap/uri-resolver-extensions-js/-/uri-resolver-extensions-js-0.12.0-pre.1.tgz#d62ab34b859a74924a139e94a22b30a6b09759af" @@ -2520,15 +2460,6 @@ "@polywrap/wasm-js" "0.12.0-pre.1" "@polywrap/wrap-manifest-types-js" "0.12.0-pre.1" -"@polywrap/uri-resolvers-js@0.10.1": - version "0.10.1" - resolved "https://registry.yarnpkg.com/@polywrap/uri-resolvers-js/-/uri-resolvers-js-0.10.1.tgz#8ea24ba9348f31da0ccc691f92024c864db27d00" - integrity sha512-/PtGzoR/PwQPIr630iV15/ah7yu/zKYMzm0TfUIFpF+pRWfIR/6VD086d20PLE6h6UE4Jd5VHzEIXeb6FqdbgA== - dependencies: - "@polywrap/core-js" "0.10.1" - "@polywrap/result" "0.10.1" - "@polywrap/wrap-manifest-types-js" "0.10.1" - "@polywrap/uri-resolvers-js@0.12.0-pre.1": version "0.12.0-pre.1" resolved "https://registry.yarnpkg.com/@polywrap/uri-resolvers-js/-/uri-resolvers-js-0.12.0-pre.1.tgz#58b6238cde9380dbb302e3a0c00f7a493a679765" @@ -2538,18 +2469,6 @@ "@polywrap/result" "0.12.0-pre.1" "@polywrap/wrap-manifest-types-js" "0.12.0-pre.1" -"@polywrap/wasm-js@0.10.1": - version "0.10.1" - resolved "https://registry.yarnpkg.com/@polywrap/wasm-js/-/wasm-js-0.10.1.tgz#21e208e1e65417a41478a8828131d6e0cefcfdcb" - integrity sha512-ZWd/bqbpjyxp7NFx34SNlRvK4S3MF4s/6AWdauIHHZORUyRJvemXtmZSh8etTkltZzXTl+PTJ9xYPM5oEIs4nw== - dependencies: - "@polywrap/asyncify-js" "0.10.1" - "@polywrap/core-js" "0.10.1" - "@polywrap/msgpack-js" "0.10.1" - "@polywrap/result" "0.10.1" - "@polywrap/tracing-js" "0.10.1" - "@polywrap/wrap-manifest-types-js" "0.10.1" - "@polywrap/wasm-js@0.12.0-pre.1": version "0.12.0-pre.1" resolved "https://registry.yarnpkg.com/@polywrap/wasm-js/-/wasm-js-0.12.0-pre.1.tgz#d1641b12692f7d90dc16c8687b6a8e2f70153124" @@ -2840,15 +2759,10 @@ resolved "https://registry.yarnpkg.com/@types/mustache/-/mustache-4.0.1.tgz#e4d421ed2d06d463b120621774185a5cd1b92d77" integrity sha512-wH6Tu9mbiOt0n5EvdoWy0VGQaJMHfLIxY/6wS0xLC7CV1taM6gESEzcYy0ZlWvxxiiljYvfDIvz4hHbUUDRlhw== -"@types/node@*": - version "20.4.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.1.tgz#a6033a8718653c50ac4962977e14d0f984d9527d" - integrity sha512-JIzsAvJeA/5iY6Y/OxZbv1lUcc8dNSE77lb2gnBH+/PJ3lFR1Ccvgwl5JWnHAkNHcRsT0TbpVOsiMKZ1F/yyJg== - -"@types/node@^18.14.6": - version "18.16.19" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.19.tgz#cb03fca8910fdeb7595b755126a8a78144714eea" - integrity sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA== +"@types/node@*", "@types/node@18.15.0": + version "18.15.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.0.tgz#286a65e3fdffd691e170541e6ecb0410b16a38be" + integrity sha512-z6nr0TTEOBGkzLGmbypWOGnpSpSIBorEhC4L+4HeQ2iezKCi4f77kyslRwvHeNitymGQ+oFyIWGP96l/DPSV9w== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -4524,9 +4438,9 @@ ecc-jsbn@~0.1.1: safer-buffer "^2.1.0" electron-to-chromium@^1.4.431: - version "1.4.457" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.457.tgz#3fdc7b4f97d628ac6b51e8b4b385befb362fe343" - integrity sha512-/g3UyNDmDd6ebeWapmAoiyy+Sy2HyJ+/X8KyvNeHfKRFfHaA2W8oF5fxD5F3tjBDcjpwo0iek6YNgxNXDBoEtA== + version "1.4.459" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.459.tgz#25a23370f4ae8aaa8f77aaf00133aa4994f4148e" + integrity sha512-XXRS5NFv8nCrBL74Rm3qhJjA2VCsRFx0OjHKBMPI0otij56aun8UWiKTDABmd5/7GTR021pA4wivs+Ri6XCElg== elliptic@6.5.4: version "6.5.4" @@ -4600,9 +4514,9 @@ error-ex@^1.2.0, error-ex@^1.3.1: is-arrayish "^0.2.1" 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== + version "1.21.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.3.tgz#8aaa0ffc080e8a6fef6ace72631dc1ec5d47bf94" + integrity sha512-ZU4miiY1j3sGPFLJ34VJXEqhpmL+HGByCinGHv4HC+Fxl2fI2Z4yR6tl0mORnDr6PA8eihWo4LmSWDbvhALckg== dependencies: array-buffer-byte-length "^1.0.0" available-typed-arrays "^1.0.5" @@ -4610,7 +4524,7 @@ es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" function.prototype.name "^1.1.5" - get-intrinsic "^1.2.0" + get-intrinsic "^1.2.1" get-symbol-description "^1.0.0" globalthis "^1.0.3" gopd "^1.0.1" @@ -4630,14 +4544,15 @@ es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: object-inspect "^1.12.3" object-keys "^1.1.1" object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" + regexp.prototype.flags "^1.5.0" safe-regex-test "^1.0.0" string.prototype.trim "^1.2.7" string.prototype.trimend "^1.0.6" string.prototype.trimstart "^1.0.6" + typed-array-byte-offset "^1.0.0" typed-array-length "^1.0.4" unbox-primitive "^1.0.2" - which-typed-array "^1.1.9" + which-typed-array "^1.1.10" es-array-method-boxes-properly@^1.0.0: version "1.0.0" @@ -5378,7 +5293,7 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== @@ -8712,7 +8627,7 @@ regex-parser@2.2.11: resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== -regexp.prototype.flags@^1.4.3: +regexp.prototype.flags@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== @@ -9817,6 +9732,17 @@ type@^2.7.2: resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + typed-array-length@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" @@ -10165,7 +10091,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.9: +which-typed-array@^1.1.10: version "1.1.10" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.10.tgz#74baa2789991905c2076abb317103b866c64e69e" integrity sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA== From ea022fdf93fe3214f922c6e30c370fc93fbd3414 Mon Sep 17 00:00:00 2001 From: Pileks Date: Thu, 13 Jul 2023 17:05:35 +0200 Subject: [PATCH 107/181] fix up minor issues in tests --- .../src/__tests__/e2e/p1/no-command.spec.ts | 21 +++++++++---------- .../cli/test/008-custom-config/config.ts | 6 +++--- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/packages/cli/src/__tests__/e2e/p1/no-command.spec.ts b/packages/cli/src/__tests__/e2e/p1/no-command.spec.ts index 785821b0b4..9a1c7919d3 100644 --- a/packages/cli/src/__tests__/e2e/p1/no-command.spec.ts +++ b/packages/cli/src/__tests__/e2e/p1/no-command.spec.ts @@ -6,19 +6,18 @@ import { runCli } from "@polywrap/cli-js"; const HELP = `Usage: polywrap [options] [command] Options: - -h, --help display help for command + -h, --help display help for command Commands: - build|b [options] Build Polywrap Projects (type: interface, wasm) - codegen|g [options] Generate Code For Polywrap Projects - create|c Create New Projects - deploy|d [options] Deploys Polywrap Projects - docgen|o [options] Generate wrapper documentation - infra|i [options] Modular Infrastructure-As-Code Orchestrator - manifest|m Inspect & Migrade Polywrap Manifests - test|t [options] Execute Tests - docs Documentation commands - help [command] display help for command + build|b [options] Build Polywrap Projects (type: interface, wasm) + codegen|g [options] Generate Code For Polywrap Projects + create|c Create New Projects + deploy|d [options] Deploys Polywrap Projects + infra|i [options] Modular Infrastructure-As-Code Orchestrator + manifest|m Inspect & Migrade Polywrap Manifests + test|t [options] Execute Tests + docs Documentation commands + help [command] display help for command `; describe("e2e tests for no command", () => { 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 1d12fce783..f938e60c8d 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,11 +1,11 @@ -import { IClientConfigBuilder } from "@polywrap/client-config-builder-js"; +import { ClientConfigBuilder } from "@polywrap/client-config-builder-js"; import path from "path"; -export function configure(builder: IClientConfigBuilder): IClientConfigBuilder { +export function configure(builder: ClientConfigBuilder): ClientConfigBuilder { const wrapperPath = path.join(__dirname, "..", "run-test-wrapper"); const wrapperUri = `fs/${path.resolve(wrapperPath)}/build`; return builder - .addRedirect("wrap://ens/test.eth", wrapperUri) + .setRedirect("wrap://ens/test.eth", wrapperUri) .addEnv( wrapperUri, { From c15109ee84682db88d0a7bdc0ab98236c0216dbd Mon Sep 17 00:00:00 2001 From: Pileks Date: Thu, 13 Jul 2023 17:29:55 +0200 Subject: [PATCH 108/181] fix up custom configs in test cases --- .../cli/src/__tests__/e2e/p1/help.spec.ts | 21 +++++++++---------- .../plugin/005-custom-config/config.ts | 6 +++--- .../010-custom-config/config.ts | 6 +++--- .../014-override-config/config.ts | 8 +++---- .../codegen/app/004-custom-config/config.ts | 6 +++--- .../plugin/005-custom-config/config.ts | 6 +++--- .../codegen/wasm/005-custom-config/config.ts | 6 +++--- .../wasm/007-override-config/config.ts | 8 +++---- 8 files changed, 33 insertions(+), 34 deletions(-) diff --git a/packages/cli/src/__tests__/e2e/p1/help.spec.ts b/packages/cli/src/__tests__/e2e/p1/help.spec.ts index 34e883a3a6..1dcfc61585 100644 --- a/packages/cli/src/__tests__/e2e/p1/help.spec.ts +++ b/packages/cli/src/__tests__/e2e/p1/help.spec.ts @@ -6,19 +6,18 @@ import { runCli } from "@polywrap/cli-js"; const HELP = `Usage: polywrap [options] [command] Options: - -h, --help display help for command + -h, --help display help for command Commands: - build|b [options] Build Polywrap Projects (type: interface, wasm) - codegen|g [options] Generate Code For Polywrap Projects - create|c Create New Projects - deploy|d [options] Deploys Polywrap Projects - docgen|o [options] Generate wrapper documentation - infra|i [options] Modular Infrastructure-As-Code Orchestrator - manifest|m Inspect & Migrade Polywrap Manifests - test|t [options] Execute Tests - docs Documentation commands - help [command] display help for command + build|b [options] Build Polywrap Projects (type: interface, wasm) + codegen|g [options] Generate Code For Polywrap Projects + create|c Create New Projects + deploy|d [options] Deploys Polywrap Projects + infra|i [options] Modular Infrastructure-As-Code Orchestrator + manifest|m Inspect & Migrade Polywrap Manifests + test|t [options] Execute Tests + docs Documentation commands + help [command] display help for command `; describe("e2e tests for no help", () => { diff --git a/packages/test-cases/cases/cli/build-cmd/plugin/005-custom-config/config.ts b/packages/test-cases/cases/cli/build-cmd/plugin/005-custom-config/config.ts index 97850e3b0d..215a5f860b 100644 --- a/packages/test-cases/cases/cli/build-cmd/plugin/005-custom-config/config.ts +++ b/packages/test-cases/cases/cli/build-cmd/plugin/005-custom-config/config.ts @@ -1,4 +1,4 @@ -import { IClientConfigBuilder } from "@polywrap/client-config-builder-js"; +import { ClientConfigBuilder } 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,6 +37,6 @@ const mockPlugin = () => { }); }; -export function configure(builder: IClientConfigBuilder): IClientConfigBuilder { - return builder.addPackage("wrap://ens/mock.eth", mockPlugin()); +export function configure(builder: ClientConfigBuilder): ClientConfigBuilder { + return builder.setPackage("wrap://ens/mock.eth", mockPlugin()); } diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/assemblyscript/010-custom-config/config.ts b/packages/test-cases/cases/cli/build-cmd/wasm/assemblyscript/010-custom-config/config.ts index 78d89bef30..8c503db0c6 100644 --- a/packages/test-cases/cases/cli/build-cmd/wasm/assemblyscript/010-custom-config/config.ts +++ b/packages/test-cases/cases/cli/build-cmd/wasm/assemblyscript/010-custom-config/config.ts @@ -1,4 +1,4 @@ -import { IClientConfigBuilder } from "@polywrap/client-config-builder-js"; +import { ClientConfigBuilder } from "@polywrap/client-config-builder-js"; import { PluginModule, PluginPackage } from "@polywrap/plugin-js"; import { latestWrapManifestVersion } from "@polywrap/wrap-manifest-types-js"; @@ -119,6 +119,6 @@ const mockPlugin = () => { ); }; -export function configure(builder: IClientConfigBuilder): IClientConfigBuilder { - return builder.addPackage("wrap://ens/mock.eth", mockPlugin()); +export function configure(builder: ClientConfigBuilder): ClientConfigBuilder { + return builder.setPackage("wrap://ens/mock.eth", mockPlugin()); } diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/assemblyscript/014-override-config/config.ts b/packages/test-cases/cases/cli/build-cmd/wasm/assemblyscript/014-override-config/config.ts index c6cac57534..b3bb8df976 100644 --- a/packages/test-cases/cases/cli/build-cmd/wasm/assemblyscript/014-override-config/config.ts +++ b/packages/test-cases/cases/cli/build-cmd/wasm/assemblyscript/014-override-config/config.ts @@ -1,6 +1,6 @@ import { - IClientConfigBuilder, ClientConfigBuilder, + PolywrapClientConfigBuilder, } from "@polywrap/client-js"; import { PluginModule, PluginPackage } from "@polywrap/plugin-js"; import { latestWrapManifestVersion } from "@polywrap/wrap-manifest-types-js"; @@ -122,8 +122,8 @@ const mockPlugin = () => { ); }; -export function configure(_: IClientConfigBuilder): IClientConfigBuilder { - return new ClientConfigBuilder() +export function configure(_: ClientConfigBuilder): ClientConfigBuilder { + return new PolywrapClientConfigBuilder() .addDefaults() - .addPackage("wrap://ens/mock.eth", mockPlugin()); + .setPackage("wrap://ens/mock.eth", mockPlugin()); } diff --git a/packages/test-cases/cases/cli/codegen/app/004-custom-config/config.ts b/packages/test-cases/cases/cli/codegen/app/004-custom-config/config.ts index e1a1c1fb38..4fb529f0fe 100644 --- a/packages/test-cases/cases/cli/codegen/app/004-custom-config/config.ts +++ b/packages/test-cases/cases/cli/codegen/app/004-custom-config/config.ts @@ -1,4 +1,4 @@ -import { IClientConfigBuilder } from "@polywrap/client-config-builder-js"; +import { ClientConfigBuilder } from "@polywrap/client-config-builder-js"; import { PluginModule, PluginPackage } from "@polywrap/plugin-js"; import { latestWrapManifestVersion, @@ -28,8 +28,8 @@ const mockPlugin = () => { return PluginPackage.from(new MockPlugin({ val: 0 }), mockPluginManifest); }; -export function configure(builder: IClientConfigBuilder): IClientConfigBuilder { - return builder.addPackage("wrap://ens/mock.eth", mockPlugin()); +export function configure(builder: ClientConfigBuilder): ClientConfigBuilder { + return builder.setPackage("wrap://ens/mock.eth", mockPlugin()); } export const mockPluginManifest: WrapManifest = { diff --git a/packages/test-cases/cases/cli/codegen/plugin/005-custom-config/config.ts b/packages/test-cases/cases/cli/codegen/plugin/005-custom-config/config.ts index 97850e3b0d..215a5f860b 100644 --- a/packages/test-cases/cases/cli/codegen/plugin/005-custom-config/config.ts +++ b/packages/test-cases/cases/cli/codegen/plugin/005-custom-config/config.ts @@ -1,4 +1,4 @@ -import { IClientConfigBuilder } from "@polywrap/client-config-builder-js"; +import { ClientConfigBuilder } 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,6 +37,6 @@ const mockPlugin = () => { }); }; -export function configure(builder: IClientConfigBuilder): IClientConfigBuilder { - return builder.addPackage("wrap://ens/mock.eth", mockPlugin()); +export function configure(builder: ClientConfigBuilder): ClientConfigBuilder { + return builder.setPackage("wrap://ens/mock.eth", mockPlugin()); } diff --git a/packages/test-cases/cases/cli/codegen/wasm/005-custom-config/config.ts b/packages/test-cases/cases/cli/codegen/wasm/005-custom-config/config.ts index 3dd8b8bacc..bb9f2ee52e 100644 --- a/packages/test-cases/cases/cli/codegen/wasm/005-custom-config/config.ts +++ b/packages/test-cases/cases/cli/codegen/wasm/005-custom-config/config.ts @@ -1,4 +1,4 @@ -import { IClientConfigBuilder } from "@polywrap/client-config-builder-js"; +import { ClientConfigBuilder } from "@polywrap/client-config-builder-js"; import { IWrapPackage } from "@polywrap/core-js"; import { PluginModule, PluginPackage } from "@polywrap/plugin-js"; import { @@ -34,8 +34,8 @@ const mockPlugin = (): IWrapPackage => { }); }; -export function configure(builder: IClientConfigBuilder): IClientConfigBuilder { - return builder.addPackage("wrap://ens/mock.eth", mockPlugin()); +export function configure(builder: ClientConfigBuilder): ClientConfigBuilder { + return builder.setPackage("wrap://ens/mock.eth", mockPlugin()); } const abi: WrapAbi = { diff --git a/packages/test-cases/cases/cli/codegen/wasm/007-override-config/config.ts b/packages/test-cases/cases/cli/codegen/wasm/007-override-config/config.ts index 8aabb19cdd..9e67a9fd70 100644 --- a/packages/test-cases/cases/cli/codegen/wasm/007-override-config/config.ts +++ b/packages/test-cases/cases/cli/codegen/wasm/007-override-config/config.ts @@ -1,6 +1,6 @@ import { - IClientConfigBuilder, ClientConfigBuilder, + PolywrapClientConfigBuilder, } from "@polywrap/client-js"; import { PluginModule, PluginPackage } from "@polywrap/plugin-js"; import { latestWrapManifestVersion } from "@polywrap/schema-parse"; @@ -122,8 +122,8 @@ const mockPlugin = () => { ); }; -export function configure(_: IClientConfigBuilder): IClientConfigBuilder { - return new ClientConfigBuilder() +export function configure(_: ClientConfigBuilder): ClientConfigBuilder { + return new PolywrapClientConfigBuilder() .addDefaults() - .addPackage("wrap://ens/mock.eth", mockPlugin()); + .setPackage("wrap://ens/mock.eth", mockPlugin()); } From f87da9ec5e84471579b03b3733b3cbacefdb6b83 Mon Sep 17 00:00:00 2001 From: Pileks Date: Thu, 13 Jul 2023 17:48:10 +0200 Subject: [PATCH 109/181] chore - lint --- packages/cli/package.json | 2 ++ .../deploy-modules/ens-recursive-name-register/index.ts | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index d2a3b532ec..12ac9909e0 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -59,6 +59,8 @@ "@polywrap/uri-resolvers-js": "0.12.0-pre.1", "@polywrap/wasm-js": "0.12.0-pre.1", "@polywrap/wrap-manifest-types-js": "0.12.0-pre.1", + "@polywrap/web3-config-bundle-js": "0.12.0-pre.1", + "@polywrap/sys-config-bundle-js": "0.12.0-pre.1", "axios": "0.21.2", "chalk": "4.1.0", "chokidar": "3.5.1", diff --git a/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/index.ts b/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/index.ts index f4bd29d86f..2cc6b8e32d 100644 --- a/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/index.ts +++ b/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/index.ts @@ -6,7 +6,10 @@ import { invokeWithTimeout } from "./invokeWithTimeout"; import { Wallet } from "@ethersproject/wallet"; import { JsonRpcProvider } from "@ethersproject/providers"; import { IWrapPackage, Uri } from "@polywrap/core-js"; -import { PolywrapClientConfigBuilder, PolywrapClient } from "@polywrap/client-js"; +import { + PolywrapClientConfigBuilder, + PolywrapClient, +} from "@polywrap/client-js"; import * as Web3 from "@polywrap/web3-config-bundle-js"; import { Connection, From 3355b289f7c9baab4408bcfd0c2dd3781a2485ce Mon Sep 17 00:00:00 2001 From: krisbitney Date: Thu, 13 Jul 2023 11:09:55 -0500 Subject: [PATCH 110/181] fixed spacing in cli help --- .../src/__tests__/e2e/p1/no-command.spec.ts | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/cli/src/__tests__/e2e/p1/no-command.spec.ts b/packages/cli/src/__tests__/e2e/p1/no-command.spec.ts index 3db13b855d..9a1c7919d3 100644 --- a/packages/cli/src/__tests__/e2e/p1/no-command.spec.ts +++ b/packages/cli/src/__tests__/e2e/p1/no-command.spec.ts @@ -6,18 +6,18 @@ import { runCli } from "@polywrap/cli-js"; const HELP = `Usage: polywrap [options] [command] Options: - -h, --help display help for command + -h, --help display help for command Commands: - build|b [options] Build Polywrap Projects (type: interface, wasm) - codegen|g [options] Generate Code For Polywrap Projects - create|c Create New Projects - deploy|d [options] Deploys Polywrap Projects - infra|i [options] Modular Infrastructure-As-Code Orchestrator - manifest|m Inspect & Migrade Polywrap Manifests - test|t [options] Execute Tests - docs Documentation commands - help [command] display help for command + build|b [options] Build Polywrap Projects (type: interface, wasm) + codegen|g [options] Generate Code For Polywrap Projects + create|c Create New Projects + deploy|d [options] Deploys Polywrap Projects + infra|i [options] Modular Infrastructure-As-Code Orchestrator + manifest|m Inspect & Migrade Polywrap Manifests + test|t [options] Execute Tests + docs Documentation commands + help [command] display help for command `; describe("e2e tests for no command", () => { From 167cbe447edaa678e86a23ef305b2d5cd9623bfb Mon Sep 17 00:00:00 2001 From: Pileks Date: Thu, 13 Jul 2023 19:47:53 +0200 Subject: [PATCH 111/181] fix plugin test --- .../templates/plugin/typescript/src/__tests__/e2e.spec.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/templates/plugin/typescript/src/__tests__/e2e.spec.ts b/packages/templates/plugin/typescript/src/__tests__/e2e.spec.ts index cd3647bec9..7d143801d2 100644 --- a/packages/templates/plugin/typescript/src/__tests__/e2e.spec.ts +++ b/packages/templates/plugin/typescript/src/__tests__/e2e.spec.ts @@ -1,4 +1,4 @@ -import { ClientConfigBuilder, IWrapPackage, PolywrapClient } from "@polywrap/client-js"; +import { PolywrapClientConfigBuilder, IWrapPackage, PolywrapClient } from "@polywrap/client-js"; import { samplePlugin } from "../"; describe("e2e", () => { @@ -7,9 +7,9 @@ describe("e2e", () => { beforeAll(() => { // Add the samplePlugin to the PolywrapClient - const config = new ClientConfigBuilder() + const config = new PolywrapClientConfigBuilder() .addDefaults() - .addPackage( + .setPackage( uri, samplePlugin({ defaultValue: "foo bar", From bda9834d815485ab78dbeeda2c9fe1622d03d233 Mon Sep 17 00:00:00 2001 From: Pileks Date: Thu, 13 Jul 2023 22:05:25 +0200 Subject: [PATCH 112/181] fix wasm-rs template dependencies --- packages/templates/wasm/rust/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/templates/wasm/rust/Cargo.toml b/packages/templates/wasm/rust/Cargo.toml index 0e49e40b70..a9c46a250c 100644 --- a/packages/templates/wasm/rust/Cargo.toml +++ b/packages/templates/wasm/rust/Cargo.toml @@ -8,7 +8,7 @@ license = "MIT" edition = "2021" [dependencies] -polywrap-wasm-rs = { version = "~0.10.2" } +polywrap-wasm-rs = { version = "0.11.0-pre.0" } serde = { version = "1.0", features = ["derive"] } [lib] From a4fb88543e109d77770a84b34984741ddc223565 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Fri, 14 Jul 2023 01:27:49 +0200 Subject: [PATCH 113/181] chore: add wasm binary toolkit to go vm base image --- .../defaults/build-strategies/wasm/golang/vm/Dockerfile | 8 ++++++++ .../lib/defaults/build-strategies/wasm/golang/vm/VERSION | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile index f9a442017a..278e652669 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile @@ -1,7 +1,15 @@ FROM rust:1.60.0 as rust +# Install wasm-snip RUN cargo install -f wasm-snip +# Install Wasm Binary Toolkit +RUN wget https://github.com/WebAssembly/wabt/releases/download/1.0.33/wabt-1.0.33-ubuntu.tar.gz && \ + tar xfv wabt-1.0.33-ubuntu.tar.gz -C /usr/local + +# Add it to the path +ENV PATH=${PATH}:/usr/local/wabt-1.0.33/bin + FROM polywrap/tinygo:0.28.1-polywrap.2 # Copy wasm-snip diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION index def9a01548..a192233208 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/VERSION @@ -1 +1 @@ -0.1.5 \ No newline at end of file +0.1.6 \ No newline at end of file From cb3b0f3513c63c5cd7233e7c307bd4d52af11381 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Fri, 14 Jul 2023 01:52:24 +0200 Subject: [PATCH 114/181] chore: update wabt installation --- .../build-strategies/wasm/golang/vm/Dockerfile | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile index 278e652669..c82a25ee53 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/Dockerfile @@ -1,7 +1,10 @@ -FROM rust:1.60.0 as rust +FROM ubuntu:22.10 as ubuntu -# Install wasm-snip -RUN cargo install -f wasm-snip +# Install build essentials (needed by wasm binary toolkit) +RUN apt-get update && apt-get install -y \ + build-essential \ + libstdc++6 \ + wget # Install Wasm Binary Toolkit RUN wget https://github.com/WebAssembly/wabt/releases/download/1.0.33/wabt-1.0.33-ubuntu.tar.gz && \ @@ -10,11 +13,19 @@ RUN wget https://github.com/WebAssembly/wabt/releases/download/1.0.33/wabt-1.0.3 # Add it to the path ENV PATH=${PATH}:/usr/local/wabt-1.0.33/bin +FROM rust:1.60.0 as rust + +# Install wasm-snip +RUN cargo install -f wasm-snip + FROM polywrap/tinygo:0.28.1-polywrap.2 # Copy wasm-snip COPY --from=rust /usr/local/cargo/bin/wasm-snip /usr/local/bin/ +# Copy wasm binary toolkit +COPY --from=ubuntu /usr/local/wabt-1.0.33/bin /usr/local/bin/ + # Copy wasm-target.json COPY wasm-target.json /usr/local/tinygo/targets/ From b3d7f7055c1ae990911ab6e03ec3cf4375e71acb Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Fri, 14 Jul 2023 02:26:49 +0200 Subject: [PATCH 115/181] fix: update wasm snipping logic for go --- .../wasm/golang/image/Dockerfile.mustache | 43 +++++++++++++++++- .../wasm/golang/local/local.sh | 43 ++++++++++++++++-- .../wasm/golang/vm/vm-script.mustache | 45 ++++++++++++++++--- 3 files changed, 121 insertions(+), 10 deletions(-) diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache index 08c0ade400..f13e397954 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache @@ -4,12 +4,51 @@ WORKDIR /project COPY . . +# Ensure all go mod deps are correct RUN go mod tidy -RUN tinygo build -o main.wasm -target wasm-target ./module/wrap/main/main.go +# Reset our build-staging directory +RUN rm -rf ./build-staging +RUN mkdir ./build-staging + +# Build the module with tinygo +RUN tinygo build -o ./build-staging/module.wasm -target wasm-target ./module/wrap/main/main.go + +# Extract the names of all "extra" exports from the wasm module +RUN EXTRA_EXPORTS=$( + # 1. convert to wasm text + wasm2wat ./build-staging/module.wasm | + # 2. extract all exports + grep -oP '(?<=export ")[^"]+' | + # 3. keep all necessary exports (wrap & asyncify) + grep -vE '_wrap_invoke|asyncify_start_unwind|asyncify_stop_unwind|asyncify_start_rewind|asyncify_stop_rewind|asyncify_get_state' | + # 4. convert remaining string into single-line seperated by spaces + tr '\n' ' ' +) + +# Remove these extra exports from the wasm module via wasm-snip +RUN wasm-snip ./build-staging/module.wasm -o ./build-staging/module_exports.wasm $EXTRA_EXPORTS + +# Extract the unsupported wasi imports, and forcefully remove them. +# This ideally would not be necessary, but it is for go-based wraps. +RUN EXTRA_IMPORTS=$( + # 1. convert to wasm text + wasm2wat ./build-staging/module_exports.wasm | + # 2. extract all wasi imports + grep -oP '(?<=wasi_snapshot_preview1" ")[^"]+' | + # 3. convert string into single-line seperated by spaces + tr '\n' ' ' +) + +# Remove these extra imports from the wasm module via wasm-snip +RUN wasm-snip ./build-staging/module_exports.wasm -o ./build-staging/module_exports_imports.wasm -p $EXTRA_IMPORTS + +# Optimize the module now that exports & imports are removed +RUN wasm-opt ./build-staging/module_exports_imports.wasm -Oz --converge -o ./build-staging/module_exports_imports_opt.wasm # Make the build directory RUN rm -rf ./build RUN mkdir ./build -RUN wasm-snip ./main.wasm -o ./build/wrap.wasm -p fd_write clock_time_get args_sizes_get args_get +# Copy the result to the build folder +RUN cp ./build-staging/module_exports_imports_opt.wasm ./build/wrap.wasm diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh index 00b41f6bad..44fa16869e 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh @@ -1,7 +1,44 @@ +# Ensure all go mod deps are correct go mod tidy -tinygo build -o ./build/main.wasm -target ./.polywrap/wasm/build/strategy-used/wasm-target.json ./module/wrap/main/main.go +# Reset our build-staging directory +rm -rf ./build-staging +mkdir ./build-staging -wasm-snip -o ./build/wrap.wasm ./build/main.wasm -p fd_write clock_time_get args_sizes_get args_get +# Build the module with tinygo +tinygo build -o ./build-staging/module.wasm -target ./.polywrap/wasm/build/strategy-used/wasm-target.json ./module/wrap/main/main.go -rm ./build/main.wasm +# Extract the names of all "extra" exports from the wasm module +EXTRA_EXPORTS=$( + # 1. convert to wasm text + wasm2wat ./build-staging/module.wasm | + # 2. extract all exports + grep -oP '(?<=export ")[^"]+' | + # 3. keep all necessary exports (wrap & asyncify) + grep -vE '_wrap_invoke|asyncify_start_unwind|asyncify_stop_unwind|asyncify_start_rewind|asyncify_stop_rewind|asyncify_get_state' | + # 4. convert remaining string into single-line seperated by spaces + tr '\n' ' ' +) + +# Remove these extra exports from the wasm module via wasm-snip +wasm-snip ./build-staging/module.wasm -o ./build-staging/module_exports.wasm $EXTRA_EXPORTS + +# Extract the unsupported wasi imports, and forcefully remove them. +# This ideally would not be necessary, but it is for go-based wraps. +EXTRA_IMPORTS=$( + # 1. convert to wasm text + wasm2wat ./build-staging/module_exports.wasm | + # 2. extract all wasi imports + grep -oP '(?<=wasi_snapshot_preview1" ")[^"]+' | + # 3. convert string into single-line seperated by spaces + tr '\n' ' ' +) + +# Remove these extra imports from the wasm module via wasm-snip +wasm-snip ./build-staging/module_exports.wasm -o ./build-staging/module_exports_imports.wasm -p $EXTRA_IMPORTS + +# Optimize the module now that exports & imports are removed +wasm-opt ./build-staging/module_exports_imports.wasm -Oz --converge -o ./build-staging/module_exports_imports_opt.wasm + +# Copy the result to the build folder +cp ./build-staging/module_exports_imports_opt.wasm ./build/wrap.wasm diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache index 715d7b3eb7..8f0af9118b 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache @@ -1,11 +1,46 @@ set -e +# Ensure all go mod deps are correct go mod tidy -tinygo build -o main.wasm -target wasm-target ./module/wrap/main/main.go +# Reset our build-staging directory +rm -rf ./build-staging +mkdir ./build-staging -# Make the build directory -rm -rf ./build -mkdir ./build +# Build the module with tinygo +tinygo build -o ./build-staging/module.wasm -target wasm-target ./module/wrap/main/main.go -wasm-snip ./main.wasm -o ./build/wrap.wasm -p fd_write clock_time_get args_sizes_get args_get +# Extract the names of all "extra" exports from the wasm module +EXTRA_EXPORTS=$( + # 1. convert to wasm text + wasm2wat ./build-staging/module.wasm | + # 2. extract all exports + grep -oP '(?<=export ")[^"]+' | + # 3. keep all necessary exports (wrap & asyncify) + grep -vE '_wrap_invoke|asyncify_start_unwind|asyncify_stop_unwind|asyncify_start_rewind|asyncify_stop_rewind|asyncify_get_state' | + # 4. convert remaining string into single-line seperated by spaces + tr '\n' ' ' +) + +# Remove these extra exports from the wasm module via wasm-snip +wasm-snip ./build-staging/module.wasm -o ./build-staging/module_exports.wasm $EXTRA_EXPORTS + +# Extract the unsupported wasi imports, and forcefully remove them. +# This ideally would not be necessary, but it is for go-based wraps. +EXTRA_IMPORTS=$( + # 1. convert to wasm text + wasm2wat ./build-staging/module_exports.wasm | + # 2. extract all wasi imports + grep -oP '(?<=wasi_snapshot_preview1" ")[^"]+' | + # 3. convert string into single-line seperated by spaces + tr '\n' ' ' +) + +# Remove these extra imports from the wasm module via wasm-snip +wasm-snip ./build-staging/module_exports.wasm -o ./build-staging/module_exports_imports.wasm -p $EXTRA_IMPORTS + +# Optimize the module now that exports & imports are removed +wasm-opt ./build-staging/module_exports_imports.wasm -Oz --converge -o ./build-staging/module_exports_imports_opt.wasm + +# Copy the result to the build folder +cp ./build-staging/module_exports_imports_opt.wasm ./build/wrap.wasm From 43bdabf786b95f4845ddb48f4807f71915de6093 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Fri, 14 Jul 2023 02:36:32 +0200 Subject: [PATCH 116/181] chore: update vm-base-go version --- .../src/lib/build-strategies/strategies/DockerVMStrategy.ts | 2 +- .../build-strategies/wasm/golang/image/Dockerfile.mustache | 2 +- .../build-strategies/wasm/golang/vm/vm-script.mustache | 4 ++++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts index 8f7df32b85..178d50ec23 100644 --- a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts +++ b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts @@ -46,7 +46,7 @@ const CONFIGS: Record = { "wasm/golang": { defaultIncludes: ["go.mod", "go.sum"], baseImage: "polywrap/vm-base-go", - version: "0.1.5", + version: "0.1.6", }, }; diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache index f13e397954..100e9c2995 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache @@ -1,4 +1,4 @@ -FROM polywrap/vm-base-go:0.1.5 +FROM polywrap/vm-base-go:0.1.6 WORKDIR /project diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache index 8f0af9118b..e8acd36332 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache @@ -42,5 +42,9 @@ wasm-snip ./build-staging/module_exports.wasm -o ./build-staging/module_exports_ # Optimize the module now that exports & imports are removed wasm-opt ./build-staging/module_exports_imports.wasm -Oz --converge -o ./build-staging/module_exports_imports_opt.wasm +# Reset build directory +rm -rf ./build +mkdir ./build + # Copy the result to the build folder cp ./build-staging/module_exports_imports_opt.wasm ./build/wrap.wasm From d5008239df3e85ff959748c827ded3e7921f3e3e Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Fri, 14 Jul 2023 02:52:43 +0200 Subject: [PATCH 117/181] chore: fix build scripts --- .../wasm/golang/image/Dockerfile.mustache | 26 ++++++++----------- .../build-cmd/wasm/golang/001-sanity/go.mod | 2 +- .../build-cmd/wasm/golang/001-sanity/go.sum | 4 +-- 3 files changed, 14 insertions(+), 18 deletions(-) diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache index 100e9c2995..94f435f6fe 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache @@ -15,33 +15,29 @@ RUN mkdir ./build-staging RUN tinygo build -o ./build-staging/module.wasm -target wasm-target ./module/wrap/main/main.go # Extract the names of all "extra" exports from the wasm module -RUN EXTRA_EXPORTS=$( +RUN EXTRA_EXPORTS=$( \ # 1. convert to wasm text - wasm2wat ./build-staging/module.wasm | + wasm2wat ./build-staging/module.wasm | \ # 2. extract all exports - grep -oP '(?<=export ")[^"]+' | + grep -oP '(?<=export ")[^"]+' | \ # 3. keep all necessary exports (wrap & asyncify) - grep -vE '_wrap_invoke|asyncify_start_unwind|asyncify_stop_unwind|asyncify_start_rewind|asyncify_stop_rewind|asyncify_get_state' | + grep -vE '_wrap_invoke|asyncify_start_unwind|asyncify_stop_unwind|asyncify_start_rewind|asyncify_stop_rewind|asyncify_get_state' | \ # 4. convert remaining string into single-line seperated by spaces - tr '\n' ' ' -) - + tr '\n' ' ') && \ # Remove these extra exports from the wasm module via wasm-snip -RUN wasm-snip ./build-staging/module.wasm -o ./build-staging/module_exports.wasm $EXTRA_EXPORTS +wasm-snip ./build-staging/module.wasm -o ./build-staging/module_exports.wasm $EXTRA_EXPORTS # Extract the unsupported wasi imports, and forcefully remove them. # This ideally would not be necessary, but it is for go-based wraps. -RUN EXTRA_IMPORTS=$( +RUN EXTRA_IMPORTS=$( \ # 1. convert to wasm text - wasm2wat ./build-staging/module_exports.wasm | + wasm2wat ./build-staging/module_exports.wasm | \ # 2. extract all wasi imports - grep -oP '(?<=wasi_snapshot_preview1" ")[^"]+' | + grep -oP '(?<=wasi_snapshot_preview1" ")[^"]+' | \ # 3. convert string into single-line seperated by spaces - tr '\n' ' ' -) - + tr '\n' ' ') && \ # Remove these extra imports from the wasm module via wasm-snip -RUN wasm-snip ./build-staging/module_exports.wasm -o ./build-staging/module_exports_imports.wasm -p $EXTRA_IMPORTS +wasm-snip ./build-staging/module_exports.wasm -o ./build-staging/module_exports_imports.wasm -p $EXTRA_IMPORTS # Optimize the module now that exports & imports are removed RUN wasm-opt ./build-staging/module_exports_imports.wasm -Oz --converge -o ./build-staging/module_exports_imports_opt.wasm diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/go.mod b/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/go.mod index ef679eeb1b..5ce3eb4094 100644 --- a/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/go.mod +++ b/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/go.mod @@ -2,6 +2,6 @@ module example.com/go-wrap-test go 1.18 -require github.com/polywrap/go-wrap wrap-0.1 +require github.com/polywrap/go-wrap v0.0.0-20230712212127-6895977d63c2 require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/go.sum b/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/go.sum index 35d9e89726..8df2badd73 100644 --- a/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/go.sum +++ b/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/go.sum @@ -1,4 +1,4 @@ -github.com/polywrap/go-wrap v0.0.0-20230712183729-e3684b1430f1 h1:fhJVAD+8CcssXc7g/F39AQdDHiV3li35mUyHeHp5/Dk= -github.com/polywrap/go-wrap v0.0.0-20230712183729-e3684b1430f1/go.mod h1:rxqhIFKUzn/M46+zjnA1RHlCzLGQn2BiLWalezhLj/k= +github.com/polywrap/go-wrap v0.0.0-20230712212127-6895977d63c2 h1:+O3G/996rX4SMlJNFA9AIjPSyrInzOEVb7PFOT96G9A= +github.com/polywrap/go-wrap v0.0.0-20230712212127-6895977d63c2/go.mod h1:rxqhIFKUzn/M46+zjnA1RHlCzLGQn2BiLWalezhLj/k= github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= From 6e877ef098d70f35f760fafb48688a5345d81d9f Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Fri, 14 Jul 2023 03:01:59 +0200 Subject: [PATCH 118/181] chore: prep 0.11.0-pre.1 --- CHANGELOG.md | 2 +- VERSION | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e99fe7995b..79a3f017db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -# Polywrap Origin (0.11.0-pre.0) +# Polywrap Origin (0.11.0-pre.1) ... # Polywrap Origin (0.10.6) diff --git a/VERSION b/VERSION index d8c39eebe7..7d205383dc 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.11.0-pre.0 +0.11.0-pre.1 From b3ba98610c744880b36c04089d0581e02f0f75ec Mon Sep 17 00:00:00 2001 From: polywrap-build-bot Date: Fri, 14 Jul 2023 01:07:37 +0000 Subject: [PATCH 119/181] build(release): migrate to 0.11.0-pre.1 --- packages/cli/package.json | 16 +- packages/js/cli/package.json | 4 +- packages/js/logging/package.json | 2 +- packages/js/manifests/polywrap/package.json | 8 +- packages/js/os/package.json | 2 +- packages/js/validation/package.json | 6 +- packages/manifests/polywrap/package.json | 2 +- packages/schema/bind/package.json | 8 +- packages/schema/compose/package.json | 8 +- packages/schema/parse/package.json | 4 +- .../templates/app/typescript/package.json | 4 +- packages/templates/package.json | 2 +- packages/templates/plugin/python/package.json | 2 +- packages/templates/plugin/rust/package.json | 2 +- .../templates/plugin/typescript/package.json | 4 +- .../wasm/assemblyscript/package.json | 6 +- packages/templates/wasm/golang/package.json | 4 +- packages/templates/wasm/rust/package.json | 4 +- packages/test-cases/package.json | 4 +- packages/wasm/as/package.json | 2 +- packages/wasm/rs/Cargo.toml | 2 +- yarn.lock | 152 +++++++++++++++++- 22 files changed, 196 insertions(+), 52 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 77fb836bad..6800e9a045 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,7 +1,7 @@ { "name": "polywrap", "description": "Polywrap CLI", - "version": "0.11.0-pre.0", + "version": "0.11.0-pre.1", "license": "MIT", "repository": { "type": "git", @@ -48,13 +48,13 @@ "@polywrap/client-js": "0.11.0", "@polywrap/core-js": "0.11.0", "@polywrap/ethereum-provider-js": "0.3.1", - "@polywrap/logging-js": "0.11.0-pre.0", - "@polywrap/os-js": "0.11.0-pre.0", - "@polywrap/polywrap-manifest-types-js": "0.11.0-pre.0", + "@polywrap/logging-js": "0.11.0-pre.1", + "@polywrap/os-js": "0.11.0-pre.1", + "@polywrap/polywrap-manifest-types-js": "0.11.0-pre.1", "@polywrap/result": "0.11.0", - "@polywrap/schema-bind": "0.11.0-pre.0", - "@polywrap/schema-compose": "0.11.0-pre.0", - "@polywrap/schema-parse": "0.11.0-pre.0", + "@polywrap/schema-bind": "0.11.0-pre.1", + "@polywrap/schema-compose": "0.11.0-pre.1", + "@polywrap/schema-parse": "0.11.0-pre.1", "@polywrap/uri-resolver-extensions-js": "0.11.0", "@polywrap/uri-resolvers-js": "0.11.0", "@polywrap/wasm-js": "0.11.0", @@ -81,7 +81,7 @@ "yesno": "0.4.0" }, "devDependencies": { - "@polywrap/cli-js": "0.11.0-pre.0", + "@polywrap/cli-js": "0.11.0-pre.1", "@types/copyfiles": "2.4.0", "@types/fs-extra": "9.0.12", "@types/jest": "26.0.8", diff --git a/packages/js/cli/package.json b/packages/js/cli/package.json index 41b10f0b7e..bf509cd3de 100644 --- a/packages/js/cli/package.json +++ b/packages/js/cli/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/cli-js", "description": "Programmatically execute the Polywrap CLI", - "version": "0.11.0-pre.0", + "version": "0.11.0-pre.1", "license": "MIT", "repository": { "type": "git", @@ -17,7 +17,7 @@ "test": "jest --passWithNoTests --runInBand --detectOpenHandles --verbose" }, "dependencies": { - "polywrap": "0.11.0-pre.0", + "polywrap": "0.11.0-pre.1", "spawn-command": "0.0.2-1" }, "devDependencies": { diff --git a/packages/js/logging/package.json b/packages/js/logging/package.json index c892f05007..f23c5ef927 100644 --- a/packages/js/logging/package.json +++ b/packages/js/logging/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/logging-js", "description": "Polywrap Core Logging Interface", - "version": "0.11.0-pre.0", + "version": "0.11.0-pre.1", "license": "MIT", "repository": { "type": "git", diff --git a/packages/js/manifests/polywrap/package.json b/packages/js/manifests/polywrap/package.json index a1bfd6c391..8acbc22db6 100644 --- a/packages/js/manifests/polywrap/package.json +++ b/packages/js/manifests/polywrap/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/polywrap-manifest-types-js", "description": "Polywrap Manifest TypeScript Typings", - "version": "0.11.0-pre.0", + "version": "0.11.0-pre.1", "license": "MIT", "repository": { "type": "git", @@ -15,14 +15,14 @@ "test:watch": "yarn test -- --watch" }, "dependencies": { - "@polywrap/logging-js": "0.11.0-pre.0", - "@polywrap/polywrap-manifest-schemas": "0.11.0-pre.0", + "@polywrap/logging-js": "0.11.0-pre.1", + "@polywrap/polywrap-manifest-schemas": "0.11.0-pre.1", "jsonschema": "1.4.0", "semver": "7.5.3", "yaml": "2.2.2" }, "devDependencies": { - "@polywrap/os-js": "0.11.0-pre.0", + "@polywrap/os-js": "0.11.0-pre.1", "@types/jest": "26.0.8", "@types/mustache": "4.0.1", "@types/prettier": "2.6.0", diff --git a/packages/js/os/package.json b/packages/js/os/package.json index ecb3e02844..674386559c 100644 --- a/packages/js/os/package.json +++ b/packages/js/os/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/os-js", "description": "Polywrap Javascript OS Utilities", - "version": "0.11.0-pre.0", + "version": "0.11.0-pre.1", "license": "MIT", "repository": { "type": "git", diff --git a/packages/js/validation/package.json b/packages/js/validation/package.json index 26aa9061a8..490273158c 100644 --- a/packages/js/validation/package.json +++ b/packages/js/validation/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/package-validation", "description": "Polywrap Package Validator", - "version": "0.11.0-pre.0", + "version": "0.11.0-pre.1", "license": "MIT", "repository": { "type": "git", @@ -18,12 +18,12 @@ "test:watch": "yarn test -- --watch" }, "dependencies": { - "@polywrap/schema-compose": "0.11.0-pre.0", + "@polywrap/schema-compose": "0.11.0-pre.1", "@polywrap/wrap-manifest-types-js": "0.10.0" }, "devDependencies": { "@polywrap/msgpack-js": "0.10.0", - "@polywrap/os-js": "0.11.0-pre.0", + "@polywrap/os-js": "0.11.0-pre.1", "@types/jest": "26.0.8", "jest": "26.6.3", "rimraf": "3.0.2", diff --git a/packages/manifests/polywrap/package.json b/packages/manifests/polywrap/package.json index 22a1b199d6..bf3f80cb85 100644 --- a/packages/manifests/polywrap/package.json +++ b/packages/manifests/polywrap/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/polywrap-manifest-schemas", "description": "Polywrap Manifest Schemas", - "version": "0.11.0-pre.0", + "version": "0.11.0-pre.1", "license": "MIT", "repository": { "type": "git", diff --git a/packages/schema/bind/package.json b/packages/schema/bind/package.json index 74f80e51b2..3661b02001 100644 --- a/packages/schema/bind/package.json +++ b/packages/schema/bind/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/schema-bind", "description": "Polywrap Schema Binding", - "version": "0.11.0-pre.0", + "version": "0.11.0-pre.1", "license": "MIT", "repository": { "type": "git", @@ -20,13 +20,13 @@ }, "dependencies": { "@polywrap/client-js": "~0.11.0", - "@polywrap/os-js": "0.11.0-pre.0", - "@polywrap/schema-parse": "0.11.0-pre.0", + "@polywrap/os-js": "0.11.0-pre.1", + "@polywrap/schema-parse": "0.11.0-pre.1", "@polywrap/wrap-manifest-types-js": "0.11.0", "mustache": "4.0.1" }, "devDependencies": { - "@polywrap/test-cases": "0.11.0-pre.0", + "@polywrap/test-cases": "0.11.0-pre.1", "@types/jest": "26.0.8", "@types/lodash": "4.14.178", "@types/mustache": "4.0.1", diff --git a/packages/schema/compose/package.json b/packages/schema/compose/package.json index 152747b47c..8f0c50c461 100644 --- a/packages/schema/compose/package.json +++ b/packages/schema/compose/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/schema-compose", "description": "Polywrap Schema Composition", - "version": "0.11.0-pre.0", + "version": "0.11.0-pre.1", "license": "MIT", "repository": { "type": "git", @@ -18,14 +18,14 @@ "test:watch": "yarn test -- --watch" }, "dependencies": { - "@polywrap/schema-parse": "0.11.0-pre.0", + "@polywrap/schema-parse": "0.11.0-pre.1", "@polywrap/wrap-manifest-types-js": "0.10.0", "graphql": "15.5.0", "mustache": "4.0.1" }, "devDependencies": { - "@polywrap/os-js": "0.11.0-pre.0", - "@polywrap/test-cases": "0.11.0-pre.0", + "@polywrap/os-js": "0.11.0-pre.1", + "@polywrap/test-cases": "0.11.0-pre.1", "@types/jest": "26.0.8", "@types/mustache": "4.0.1", "@types/prettier": "2.6.0", diff --git a/packages/schema/parse/package.json b/packages/schema/parse/package.json index 47ccd5c5d1..81ddf5bf54 100644 --- a/packages/schema/parse/package.json +++ b/packages/schema/parse/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/schema-parse", "description": "Polywrap Schema Parsing", - "version": "0.11.0-pre.0", + "version": "0.11.0-pre.1", "license": "MIT", "repository": { "type": "git", @@ -23,7 +23,7 @@ "graphql": "15.5.0" }, "devDependencies": { - "@polywrap/test-cases": "0.11.0-pre.0", + "@polywrap/test-cases": "0.11.0-pre.1", "@types/deep-equal": "1.0.1", "@types/jest": "26.0.8", "@types/prettier": "2.6.0", diff --git a/packages/templates/app/typescript/package.json b/packages/templates/app/typescript/package.json index 283f11cf11..eac3556c7b 100644 --- a/packages/templates/app/typescript/package.json +++ b/packages/templates/app/typescript/package.json @@ -2,7 +2,7 @@ "name": "templates-app-typescript", "description": "Polywrap App TypeScript Template", "private": true, - "version": "0.11.0-pre.0", + "version": "0.11.0-pre.1", "scripts": { "build": "npx polywrap codegen", "test": "ts-node ./src/index.ts" @@ -12,7 +12,7 @@ }, "devDependencies": { "@types/node": "18.14.6", - "polywrap": "0.11.0-pre.0", + "polywrap": "0.11.0-pre.1", "ts-node": "10.9.1", "typescript": "4.9.5" } diff --git a/packages/templates/package.json b/packages/templates/package.json index 7990ab6e7d..40ed636c40 100644 --- a/packages/templates/package.json +++ b/packages/templates/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/templates", "description": "Polywrap Templates", - "version": "0.11.0-pre.0", + "version": "0.11.0-pre.1", "license": "MIT", "repository": { "type": "git", diff --git a/packages/templates/plugin/python/package.json b/packages/templates/plugin/python/package.json index e1bff0b810..be48da8dfb 100644 --- a/packages/templates/plugin/python/package.json +++ b/packages/templates/plugin/python/package.json @@ -1,7 +1,7 @@ { "name": "templates-plugin-python", "private": true, - "version": "0.11.0-pre.0", + "version": "0.11.0-pre.1", "dependencies": { "polywrap": "~0.10.2" } diff --git a/packages/templates/plugin/rust/package.json b/packages/templates/plugin/rust/package.json index 9b083910ad..a9a8442de9 100644 --- a/packages/templates/plugin/rust/package.json +++ b/packages/templates/plugin/rust/package.json @@ -1,7 +1,7 @@ { "name": "templates-plugin-rust", "private": true, - "version": "0.11.0-pre.0", + "version": "0.11.0-pre.1", "dependencies": { "polywrap": "~0.10.2" } diff --git a/packages/templates/plugin/typescript/package.json b/packages/templates/plugin/typescript/package.json index 8e75f4e7dc..b4f9b7ecec 100644 --- a/packages/templates/plugin/typescript/package.json +++ b/packages/templates/plugin/typescript/package.json @@ -2,7 +2,7 @@ "name": "templates-plugin-typescript", "description": "Polywrap Plugin Typescript Template", "private": true, - "version": "0.11.0-pre.0", + "version": "0.11.0-pre.1", "main": "build/index.js", "scripts": { "build": "rimraf ./build && yarn codegen && tsc --project tsconfig.json", @@ -23,7 +23,7 @@ "@types/jest": "26.0.8", "@types/prettier": "2.6.0", "jest": "26.6.3", - "polywrap": "0.11.0-pre.0", + "polywrap": "0.11.0-pre.1", "rimraf": "3.0.2", "ts-jest": "26.5.4", "ts-node": "10.9.1", diff --git a/packages/templates/wasm/assemblyscript/package.json b/packages/templates/wasm/assemblyscript/package.json index cfbaf82db4..627194bdc0 100644 --- a/packages/templates/wasm/assemblyscript/package.json +++ b/packages/templates/wasm/assemblyscript/package.json @@ -2,7 +2,7 @@ "name": "template-wasm-as", "description": "Polywrap AssemblyScript Wrapper Template", "private": true, - "version": "0.11.0-pre.0", + "version": "0.11.0-pre.1", "scripts": { "codegen": "npx polywrap codegen", "build": "npx polywrap build", @@ -17,12 +17,12 @@ "devDependencies": { "@types/jest": "26.0.8", "jest": "26.6.3", - "polywrap": "0.11.0-pre.0", + "polywrap": "0.11.0-pre.1", "ts-jest": "26.5.4", "typescript": "4.9.5" }, "dependencies": { - "@polywrap/wasm-as": "0.11.0-pre.0", + "@polywrap/wasm-as": "0.11.0-pre.1", "assemblyscript": "0.19.23" } } diff --git a/packages/templates/wasm/golang/package.json b/packages/templates/wasm/golang/package.json index c14d294211..b8661c49e7 100644 --- a/packages/templates/wasm/golang/package.json +++ b/packages/templates/wasm/golang/package.json @@ -2,7 +2,7 @@ "name": "template-wasm-go", "description": "Polywrap Golang Wrapper Template", "private": true, - "version": "0.11.0-pre.0", + "version": "0.11.0-pre.1", "scripts": { "codegen": "npx polywrap codegen", "build": "npx polywrap build", @@ -15,7 +15,7 @@ "devDependencies": { "@types/jest": "26.0.8", "jest": "26.6.3", - "polywrap": "0.11.0-pre.0", + "polywrap": "0.11.0-pre.1", "ts-jest": "26.5.4", "typescript": "4.9.5" } diff --git a/packages/templates/wasm/rust/package.json b/packages/templates/wasm/rust/package.json index b2d9233277..0faa099bdd 100644 --- a/packages/templates/wasm/rust/package.json +++ b/packages/templates/wasm/rust/package.json @@ -2,7 +2,7 @@ "name": "template-wasm-rs", "description": "Polywrap Rust Wrapper Template", "private": true, - "version": "0.11.0-pre.0", + "version": "0.11.0-pre.1", "scripts": { "codegen": "npx polywrap codegen", "build": "npx polywrap build", @@ -15,7 +15,7 @@ "devDependencies": { "@types/jest": "26.0.8", "jest": "26.6.3", - "polywrap": "0.11.0-pre.0", + "polywrap": "0.11.0-pre.1", "ts-jest": "26.5.4", "typescript": "4.9.5" } diff --git a/packages/test-cases/package.json b/packages/test-cases/package.json index 993ecc1c6b..f1a4d7aa54 100644 --- a/packages/test-cases/package.json +++ b/packages/test-cases/package.json @@ -2,14 +2,14 @@ "name": "@polywrap/test-cases", "description": "Reusable Polywrap Test Cases", "private": true, - "version": "0.11.0-pre.0", + "version": "0.11.0-pre.1", "license": "MIT", "main": "index.ts", "scripts": { "generate:wrappers": "ts-node -e \"import { fetchWrappers } from './'; (async () => await fetchWrappers())()\"" }, "dependencies": { - "@polywrap/os-js": "0.11.0-pre.0" + "@polywrap/os-js": "0.11.0-pre.1" }, "devDependencies": { "@types/adm-zip": "0.5.0", diff --git a/packages/wasm/as/package.json b/packages/wasm/as/package.json index f1c9298a4a..0ea371efc8 100644 --- a/packages/wasm/as/package.json +++ b/packages/wasm/as/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/wasm-as", "description": "Polywrap Assemblyscript Runtime", - "version": "0.11.0-pre.0", + "version": "0.11.0-pre.1", "license": "MIT", "repository": { "type": "git", diff --git a/packages/wasm/rs/Cargo.toml b/packages/wasm/rs/Cargo.toml index c2c1cd8c9b..0e363a98c9 100644 --- a/packages/wasm/rs/Cargo.toml +++ b/packages/wasm/rs/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polywrap-wasm-rs" -version = "0.11.0-pre.0" +version = "0.11.0-pre.1" license = "MIT" description = "Polywrap's Rust-Wasm Runtime" homepage = "https://polywrap.io" diff --git a/yarn.lock b/yarn.lock index e5873403a4..6527f644c7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1858,6 +1858,11 @@ resolved "https://registry.yarnpkg.com/@msgpack/msgpack/-/msgpack-2.7.2.tgz#f34b8aa0c49f0dd55eb7eba577081299cbf3f90b" integrity sha512-rYEi46+gIzufyYUAoHDnRzkWGxajpD9vVXFQ3g1vbjrBm6P7MBmm+s/fqPa46sxa+8FOUdEuRQKaugo5a4JWpw== +"@multiformats/base-x@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@multiformats/base-x/-/base-x-4.0.1.tgz#95ff0fa58711789d53aefb2590a8b7a4e715d121" + integrity sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw== + "@nicolo-ribaudo/semver-v6@^6.3.3": version "6.3.3" resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz#ea6d23ade78a325f7a52750aab1526b02b628c29" @@ -2149,6 +2154,11 @@ resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.6.0.tgz#ed410c9eb0070491cff9fe914246ce41f88d6f74" integrity sha512-aPfcBeLErM/PPiAuAbNFLN5sNbZLc3KZlar27uohllN8Zs6jJbHyJU1y7cMA6W/zuq+thkaG8mujiS+3iD/FWQ== +"@polywrap/asyncify-js@0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@polywrap/asyncify-js/-/asyncify-js-0.10.0.tgz#0570ce34501e91710274285b6b4740f1094f08a3" + integrity sha512-/ZhREKykF1hg5H/mm8vQHqv7MSedfCnwzbsNwYuLmH/IUtQi2t7NyD2XXavSLq5PFOHA/apPueatbSFTeIgBdA== + "@polywrap/asyncify-js@0.10.1": version "0.10.1" resolved "https://registry.yarnpkg.com/@polywrap/asyncify-js/-/asyncify-js-0.10.1.tgz#00d656a39bfd54c1b8af82adf648264b0415259b" @@ -2159,6 +2169,23 @@ resolved "https://registry.yarnpkg.com/@polywrap/asyncify-js/-/asyncify-js-0.11.0.tgz#a5ad2661184c49aa249ef6042579b2ca835a2781" integrity sha512-rZ5poZ4lFp1si8T6jbNXNd14QHf5RcNi4db/1ODp6r+x70KtbOiL9Ob+Pnlc7tVWvP4RkP82Xld+xWvudKOYlA== +"@polywrap/client-config-builder-js@0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@polywrap/client-config-builder-js/-/client-config-builder-js-0.10.0.tgz#e583f32dca97dfe0b9575db244fdad74a4f42d6f" + integrity sha512-9hZd5r/5rkLoHdeB76NDUNOYcUCzS+b8WjCI9kv5vNQiOR83dZnW3rTnQmcXOWWErRY70h6xvAQWWQ1WrW/SpQ== + dependencies: + "@polywrap/concurrent-plugin-js" "~0.10.0-pre" + "@polywrap/core-js" "0.10.0" + "@polywrap/ethereum-provider-js" "npm:@polywrap/ethereum-provider-js@~0.3.0" + "@polywrap/ethereum-provider-js-v1" "npm:@polywrap/ethereum-provider-js@~0.2.4" + "@polywrap/file-system-plugin-js" "~0.10.0-pre" + "@polywrap/http-plugin-js" "~0.10.0-pre" + "@polywrap/logger-plugin-js" "0.10.0-pre.10" + "@polywrap/uri-resolver-extensions-js" "0.10.0" + "@polywrap/uri-resolvers-js" "0.10.0" + "@polywrap/wasm-js" "0.10.0" + base64-to-uint8array "1.0.0" + "@polywrap/client-config-builder-js@0.10.1": version "0.10.1" resolved "https://registry.yarnpkg.com/@polywrap/client-config-builder-js/-/client-config-builder-js-0.10.1.tgz#d52430645b4530b235f97318ccdeef256eb4c425" @@ -2190,6 +2217,22 @@ "@polywrap/wasm-js" "0.11.0" "@polywrap/web3-config-bundle-js" "0.11.0" +"@polywrap/client-js@0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@polywrap/client-js/-/client-js-0.10.0.tgz#607c24cd65c03f57ca8325f4a8ecc02a5485c993" + integrity sha512-wRr4HZ7a4oLrKuw8CchM5JYcE8er43GGKQnhtf/ylld5Q7FpNpfzhsi8eWknORugQYuvR3CSG7qZey4Ijgj6qQ== + dependencies: + "@polywrap/client-config-builder-js" "0.10.0" + "@polywrap/core-client-js" "0.10.0" + "@polywrap/core-js" "0.10.0" + "@polywrap/msgpack-js" "0.10.0" + "@polywrap/plugin-js" "0.10.0" + "@polywrap/result" "0.10.0" + "@polywrap/tracing-js" "0.10.0" + "@polywrap/uri-resolver-extensions-js" "0.10.0" + "@polywrap/uri-resolvers-js" "0.10.0" + "@polywrap/wrap-manifest-types-js" "0.10.0" + "@polywrap/client-js@0.11.0", "@polywrap/client-js@~0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@polywrap/client-js/-/client-js-0.11.0.tgz#9359ce9ebf838ff26b834cd482f2e77357b8f482" @@ -2222,7 +2265,7 @@ "@polywrap/uri-resolvers-js" "0.10.1" "@polywrap/wrap-manifest-types-js" "0.10.1" -"@polywrap/concurrent-plugin-js@~0.10.0": +"@polywrap/concurrent-plugin-js@~0.10.0", "@polywrap/concurrent-plugin-js@~0.10.0-pre": version "0.10.0" resolved "https://registry.yarnpkg.com/@polywrap/concurrent-plugin-js/-/concurrent-plugin-js-0.10.0.tgz#662e49976f75f30632b302d515bd22c7643afc44" integrity sha512-sc11ffs34ScBHPB9uHFZuTmF8yPtZT81sBpBj7f4MlmrRDxtJS56Y7k/qL6L1xuwsnmeFipi5JGau1CcBaYmJQ== @@ -2238,6 +2281,17 @@ dependencies: "@polywrap/core-js" "0.11.0" +"@polywrap/core-client-js@0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@polywrap/core-client-js/-/core-client-js-0.10.0.tgz#bec91479d1294ca86b7fa77f5ed407dab4d2a0b4" + integrity sha512-Sv1fVHM/5ynobtT2N25jbXOKNju1y0Wk4TwFnTJXrAUcARrRMoAfmwLVfTwrqRZ2OjWMQ/AWTc7ziNBtH5dNAg== + dependencies: + "@polywrap/core-js" "0.10.0" + "@polywrap/msgpack-js" "0.10.0" + "@polywrap/result" "0.10.0" + "@polywrap/tracing-js" "0.10.0" + "@polywrap/wrap-manifest-types-js" "0.10.0" + "@polywrap/core-client-js@0.10.1": version "0.10.1" resolved "https://registry.yarnpkg.com/@polywrap/core-client-js/-/core-client-js-0.10.1.tgz#7342adfcffe2ce97ce7066c4c8ae1fc54250cb4f" @@ -2315,7 +2369,7 @@ "@polywrap/plugin-js" "0.10.0-pre.10" ethers "5.7.0" -"@polywrap/ethereum-provider-js@0.3.1", "@polywrap/ethereum-provider-js@npm:@polywrap/ethereum-provider-js@~0.3.1": +"@polywrap/ethereum-provider-js@0.3.1", "@polywrap/ethereum-provider-js@npm:@polywrap/ethereum-provider-js@~0.3.0", "@polywrap/ethereum-provider-js@npm:@polywrap/ethereum-provider-js@~0.3.1": version "0.3.1" resolved "https://registry.yarnpkg.com/@polywrap/ethereum-provider-js/-/ethereum-provider-js-0.3.1.tgz#ffdb9425c819ee76d3e3d5ade7d1b044077037e0" integrity sha512-El2d3gE2CFdGNzKQhO+IPP79lhyQmkAGlpQadaW/EDyFDjERLckYDLPrwUCXG0agUcQZcNY1nHn2hknumw/yWg== @@ -2326,7 +2380,7 @@ "@polywrap/plugin-js" "0.10.0" ethers "5.7.0" -"@polywrap/file-system-plugin-js@~0.10.0": +"@polywrap/file-system-plugin-js@~0.10.0", "@polywrap/file-system-plugin-js@~0.10.0-pre": version "0.10.0" resolved "https://registry.yarnpkg.com/@polywrap/file-system-plugin-js/-/file-system-plugin-js-0.10.0.tgz#7814e0b1c0bb170ab85500f67aca6af4c17ec19f" integrity sha512-QWDpeVBACeK8PqZUwby/zlozG/07fpvJN5kQtw5e7ha4K5blX1j1i6ixgLKlYyQsaaTBxS6aAF3C0ryt4BsJcQ== @@ -2334,7 +2388,7 @@ "@polywrap/core-js" "0.10.0" "@polywrap/plugin-js" "0.10.0" -"@polywrap/http-plugin-js@~0.10.0": +"@polywrap/http-plugin-js@~0.10.0", "@polywrap/http-plugin-js@~0.10.0-pre": version "0.10.0" resolved "https://registry.yarnpkg.com/@polywrap/http-plugin-js/-/http-plugin-js-0.10.0.tgz#930ec9dbaa762b71d8905ad02a77d5d574707642" integrity sha512-t/yvoOAGUwsuS37ZQkkBZOogNbeJadtHwitMMA6XGs1jDANP1Xim/xWXWBYC3W1YJ8pbUeO8bHZHTBaJ7SC0cA== @@ -2344,6 +2398,14 @@ axios "0.21.4" form-data "4.0.0" +"@polywrap/logger-plugin-js@0.10.0-pre.10": + version "0.10.0-pre.10" + resolved "https://registry.yarnpkg.com/@polywrap/logger-plugin-js/-/logger-plugin-js-0.10.0-pre.10.tgz#de4a995c083edc26d72abb7420628b40d81efed2" + integrity sha512-6wBgBvphQRI+LP22+xi1KPcCq4B9dUMB/ZAXOpVTb/X/fOqdNBOS1LTXV+BtCe2KfdqGS6DKIXwGITcMOxIDCg== + dependencies: + "@polywrap/core-js" "0.10.0-pre.10" + "@polywrap/plugin-js" "0.10.0-pre.10" + "@polywrap/logger-plugin-js@~0.10.0", "@polywrap/logger-plugin-js@~0.10.1": version "0.10.1" resolved "https://registry.yarnpkg.com/@polywrap/logger-plugin-js/-/logger-plugin-js-0.10.1.tgz#220cc248cb1381aa46c1f773ed8ce77da420280c" @@ -2385,6 +2447,11 @@ dependencies: "@msgpack/msgpack" "2.7.2" +"@polywrap/os-js@0.10.6": + version "0.10.6" + resolved "https://registry.yarnpkg.com/@polywrap/os-js/-/os-js-0.10.6.tgz#3de289428138260cf83781357aee0b89ebefa0cd" + integrity sha512-c5OtKMIXsxcP/V3+zRNhoRhZwhdH5xs6S1PTg9wMJEllrImzqzDacUp9jdkAYU1AOrJoxQqttPPqzSD0FCwuXA== + "@polywrap/plugin-js@0.10.0": version "0.10.0" resolved "https://registry.yarnpkg.com/@polywrap/plugin-js/-/plugin-js-0.10.0.tgz#e3bc81bf7832df9c84a4a319515228b159a05ba5" @@ -2429,6 +2496,22 @@ "@polywrap/tracing-js" "0.11.0" "@polywrap/wrap-manifest-types-js" "0.11.0" +"@polywrap/polywrap-manifest-schemas@0.10.6": + version "0.10.6" + resolved "https://registry.yarnpkg.com/@polywrap/polywrap-manifest-schemas/-/polywrap-manifest-schemas-0.10.6.tgz#aae01cd7c22c3290aff7b0279f81dd00b5ac98bd" + integrity sha512-bDbuVpU+i2ghO+6+vOi/6iivelWt7zgjceynq7VbQaEvYtteiWLxHAaPRgxQsQVbljTOwMpuctvjotdtYlFD0Q== + +"@polywrap/polywrap-manifest-types-js@0.10.6": + version "0.10.6" + resolved "https://registry.yarnpkg.com/@polywrap/polywrap-manifest-types-js/-/polywrap-manifest-types-js-0.10.6.tgz#5d4108d59db9ac2cd796b6bbbbb238929b99775e" + integrity sha512-Uh3Mg7cFNEqzxEJGU7gz18/lUVyRGRt6kC2rEUhLvlKQjo/be1DMxh3UO5TcqknC2CGt1lzSg56hmd/exnTZ2w== + dependencies: + "@polywrap/logging-js" "0.10.6" + "@polywrap/polywrap-manifest-schemas" "0.10.6" + jsonschema "1.4.0" + semver "7.5.3" + yaml "2.2.2" + "@polywrap/result@0.10.0": version "0.10.0" resolved "https://registry.yarnpkg.com/@polywrap/result/-/result-0.10.0.tgz#712339223fba524dfabfb0bf868411f357d52e34" @@ -2449,6 +2532,35 @@ resolved "https://registry.yarnpkg.com/@polywrap/result/-/result-0.11.0.tgz#a64af3f419318d2cd0ed797249e1f87af40f0798" integrity sha512-FIhVioaNYFWMYuEb8dSHCdtpoXkmJuPsLCI4+GqATBWoEy2v4shlu/ILjVzeo8dk5OPr/MeIrqbt+KlFPUYk1g== +"@polywrap/schema-bind@0.10.6": + version "0.10.6" + resolved "https://registry.yarnpkg.com/@polywrap/schema-bind/-/schema-bind-0.10.6.tgz#dd84369d0b1d71b10bb744ab7a16337ed2256e34" + integrity sha512-A09RqKUzAA7iqdL8Hh3Z5DEcHqxF0K1TVw4Wfk/jYkbDHPVxqUPxhztcCD1mtvROTuzRs/mGdUJAeGTG5wJ87g== + dependencies: + "@polywrap/os-js" "0.10.6" + "@polywrap/schema-parse" "0.10.6" + "@polywrap/wrap-manifest-types-js" "0.10.0" + mustache "4.0.1" + +"@polywrap/schema-compose@0.10.6": + version "0.10.6" + resolved "https://registry.yarnpkg.com/@polywrap/schema-compose/-/schema-compose-0.10.6.tgz#09d6195aed8241c202eecebe9d28ed9332535838" + integrity sha512-eiBCwkScL2Y9KwFKAbEHozfqKtqExwAGgaSxtpSkB+rEonu1KUj8QIQb6HLcW+P+m4loX+Rggno3jHAt7RL5Xw== + dependencies: + "@polywrap/schema-parse" "0.10.6" + "@polywrap/wrap-manifest-types-js" "0.10.0" + graphql "15.5.0" + mustache "4.0.1" + +"@polywrap/schema-parse@0.10.6": + version "0.10.6" + resolved "https://registry.yarnpkg.com/@polywrap/schema-parse/-/schema-parse-0.10.6.tgz#6cd338da1a70b26d08b7c12aa3de05af878f426c" + integrity sha512-avzkVjzO2fczfxFI+hoXkgX42ELTvp5pWzxokagw4K9pOhVHadGf3ErxstZZ1GRY/afv5cDaOJZFipMdcNygVA== + dependencies: + "@dorgjelli/graphql-schema-cycles" "1.1.4" + "@polywrap/wrap-manifest-types-js" "0.10.0" + graphql "15.5.0" + "@polywrap/sys-config-bundle-js@0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@polywrap/sys-config-bundle-js/-/sys-config-bundle-js-0.11.0.tgz#4a1c379c323e281703c5a5174739dc9c93a275c8" @@ -2511,6 +2623,17 @@ "@opentelemetry/sdk-trace-base" "1.6.0" "@opentelemetry/sdk-trace-web" "1.6.0" +"@polywrap/uri-resolver-extensions-js@0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@polywrap/uri-resolver-extensions-js/-/uri-resolver-extensions-js-0.10.0.tgz#ef0012e9b2231be44b0739f57b023a1c009c1b2b" + integrity sha512-mP8nLESuQFImhxeEV646m4qzJ1rc3d2LLgly9vPFUffXM7YMfJriL0nYNTzbyvZbhvH7PHfeEQ/m5DZFADMc7w== + dependencies: + "@polywrap/core-js" "0.10.0" + "@polywrap/result" "0.10.0" + "@polywrap/uri-resolvers-js" "0.10.0" + "@polywrap/wasm-js" "0.10.0" + "@polywrap/wrap-manifest-types-js" "0.10.0" + "@polywrap/uri-resolver-extensions-js@0.10.1": version "0.10.1" resolved "https://registry.yarnpkg.com/@polywrap/uri-resolver-extensions-js/-/uri-resolver-extensions-js-0.10.1.tgz#6385ec63de3d53a8eddedeba10c59f0c8b2de36e" @@ -2533,6 +2656,15 @@ "@polywrap/wasm-js" "0.11.0" "@polywrap/wrap-manifest-types-js" "0.11.0" +"@polywrap/uri-resolvers-js@0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@polywrap/uri-resolvers-js/-/uri-resolvers-js-0.10.0.tgz#d80163666a5110a4a7bd36be7e0961364af761ce" + integrity sha512-lZP+sN4lnp8xRklYWkrAJFECFNXDsBawGqVk7jUrbcw1CX8YODHyDEB0dSV8vN30DMP4h70W7V4QeNwPiE1EzQ== + dependencies: + "@polywrap/core-js" "0.10.0" + "@polywrap/result" "0.10.0" + "@polywrap/wrap-manifest-types-js" "0.10.0" + "@polywrap/uri-resolvers-js@0.10.1": version "0.10.1" resolved "https://registry.yarnpkg.com/@polywrap/uri-resolvers-js/-/uri-resolvers-js-0.10.1.tgz#8ea24ba9348f31da0ccc691f92024c864db27d00" @@ -2551,6 +2683,18 @@ "@polywrap/result" "0.11.0" "@polywrap/wrap-manifest-types-js" "0.11.0" +"@polywrap/wasm-js@0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@polywrap/wasm-js/-/wasm-js-0.10.0.tgz#6947b44669514cc0cb0653db8278f40631c45c7d" + integrity sha512-kI0Q9DQ/PlA0BTEj+Mye4fdt/aLh07l8YHjhbXQheuu46mcZuG9vfgnn78eug9c7wjGEECxlsK+B4hy/FPgYxQ== + dependencies: + "@polywrap/asyncify-js" "0.10.0" + "@polywrap/core-js" "0.10.0" + "@polywrap/msgpack-js" "0.10.0" + "@polywrap/result" "0.10.0" + "@polywrap/tracing-js" "0.10.0" + "@polywrap/wrap-manifest-types-js" "0.10.0" + "@polywrap/wasm-js@0.10.1": version "0.10.1" resolved "https://registry.yarnpkg.com/@polywrap/wasm-js/-/wasm-js-0.10.1.tgz#21e208e1e65417a41478a8828131d6e0cefcfdcb" From 31d874aab828b5d76178a00543c7f9534e99eb6b Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Fri, 14 Jul 2023 03:50:27 +0200 Subject: [PATCH 120/181] feat: support fuzzy uri strings in manifest files --- .../src/formats/polywrap.app/0.4.0.ts | 51 ++++++++++ .../src/formats/polywrap.app/index.ts | 11 ++- .../src/formats/polywrap.app/validate.ts | 2 + .../src/formats/polywrap.deploy/0.4.0.ts | 61 ++++++++++++ .../src/formats/polywrap.deploy/index.ts | 11 ++- .../src/formats/polywrap.deploy/validate.ts | 2 + .../src/formats/polywrap.plugin/0.4.0.ts | 55 +++++++++++ .../src/formats/polywrap.plugin/index.ts | 11 ++- .../src/formats/polywrap.plugin/validate.ts | 2 + .../polywrap/src/formats/polywrap/0.5.0.ts | 72 ++++++++++++++ .../polywrap/src/formats/polywrap/index.ts | 11 ++- .../polywrap/src/formats/polywrap/validate.ts | 2 + .../polywrap/formats/polywrap.app/0.4.0.json | 69 +++++++++++++ .../formats/polywrap.deploy/0.4.0.json | 79 +++++++++++++++ .../formats/polywrap.plugin/0.4.0.json | 74 ++++++++++++++ .../polywrap/formats/polywrap/0.5.0.json | 96 +++++++++++++++++++ yarn.lock | 72 +++++++------- 17 files changed, 633 insertions(+), 48 deletions(-) create mode 100644 packages/js/manifests/polywrap/src/formats/polywrap.app/0.4.0.ts create mode 100644 packages/js/manifests/polywrap/src/formats/polywrap.deploy/0.4.0.ts create mode 100644 packages/js/manifests/polywrap/src/formats/polywrap.plugin/0.4.0.ts create mode 100644 packages/js/manifests/polywrap/src/formats/polywrap/0.5.0.ts create mode 100644 packages/manifests/polywrap/formats/polywrap.app/0.4.0.json create mode 100644 packages/manifests/polywrap/formats/polywrap.deploy/0.4.0.json create mode 100644 packages/manifests/polywrap/formats/polywrap.plugin/0.4.0.json create mode 100644 packages/manifests/polywrap/formats/polywrap/0.5.0.json diff --git a/packages/js/manifests/polywrap/src/formats/polywrap.app/0.4.0.ts b/packages/js/manifests/polywrap/src/formats/polywrap.app/0.4.0.ts new file mode 100644 index 0000000000..630c988b5c --- /dev/null +++ b/packages/js/manifests/polywrap/src/formats/polywrap.app/0.4.0.ts @@ -0,0 +1,51 @@ +/* eslint-disable @typescript-eslint/naming-convention */ +/* tslint:disable */ +/** + * This file was automatically generated by json-schema-to-typescript. + * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, + * and run json-schema-to-typescript to regenerate this file. + */ + +export interface AppManifest { + /** + * Polywrap manifest format version. + */ + format: "0.4.0"; + /** + * Basic project properties. + */ + project: { + /** + * Name of this project. + */ + name: string; + /** + * Type of this project. + */ + type: string; + }; + /** + * Project source files. + */ + source: { + /** + * Path to the project's graphql schema. + */ + schema: string; + /** + * Specify ABIs to be used for the import URIs within your schema. + */ + import_abis?: ImportAbis[]; + }; + __type: "AppManifest"; +} +export interface ImportAbis { + /** + * One of the schema's import URI. + */ + uri: string; + /** + * Path to a local ABI (or schema). Supported file formats: [*.graphql, *.info, *.json, *.yaml] + */ + abi: string; +} diff --git a/packages/js/manifests/polywrap/src/formats/polywrap.app/index.ts b/packages/js/manifests/polywrap/src/formats/polywrap.app/index.ts index 913db8c0c1..fbcbcca317 100644 --- a/packages/js/manifests/polywrap/src/formats/polywrap.app/index.ts +++ b/packages/js/manifests/polywrap/src/formats/polywrap.app/index.ts @@ -14,11 +14,15 @@ import { import { AppManifest as AppManifest_0_3_0, } from "./0.3.0"; +import { + AppManifest as AppManifest_0_4_0, +} from "./0.4.0"; export { AppManifest_0_1_0, AppManifest_0_2_0, AppManifest_0_3_0, + AppManifest_0_4_0, }; export enum AppManifestFormats { @@ -27,6 +31,7 @@ export enum AppManifestFormats { "v0.1.0" = "0.1.0", "v0.2.0" = "0.2.0", "v0.3.0" = "0.3.0", + "v0.4.0" = "0.4.0", } export const AppManifestSchemaFiles: Record = { @@ -35,17 +40,19 @@ export const AppManifestSchemaFiles: Record = { "0.1.0": "formats/polywrap.app/0.1.0.json", "0.2.0": "formats/polywrap.app/0.2.0.json", "0.3.0": "formats/polywrap.app/0.3.0.json", + "0.4.0": "formats/polywrap.app/0.4.0.json", } export type AnyAppManifest = | AppManifest_0_1_0 | AppManifest_0_2_0 | AppManifest_0_3_0 + | AppManifest_0_4_0 -export type AppManifest = AppManifest_0_3_0; +export type AppManifest = AppManifest_0_4_0; -export const latestAppManifestFormat = AppManifestFormats["v0.3.0"] +export const latestAppManifestFormat = AppManifestFormats["v0.4.0"] export { migrateAppManifest } from "./migrate"; diff --git a/packages/js/manifests/polywrap/src/formats/polywrap.app/validate.ts b/packages/js/manifests/polywrap/src/formats/polywrap.app/validate.ts index b53e83e4fe..b787856ce3 100644 --- a/packages/js/manifests/polywrap/src/formats/polywrap.app/validate.ts +++ b/packages/js/manifests/polywrap/src/formats/polywrap.app/validate.ts @@ -12,6 +12,7 @@ import { import AppManifestSchema_0_1_0 from "@polywrap/polywrap-manifest-schemas/formats/polywrap.app/0.1.0.json"; import AppManifestSchema_0_2_0 from "@polywrap/polywrap-manifest-schemas/formats/polywrap.app/0.2.0.json"; import AppManifestSchema_0_3_0 from "@polywrap/polywrap-manifest-schemas/formats/polywrap.app/0.3.0.json"; +import AppManifestSchema_0_4_0 from "@polywrap/polywrap-manifest-schemas/formats/polywrap.app/0.4.0.json"; import { Schema, @@ -30,6 +31,7 @@ const schemas: AppManifestSchemas = { "0.1.0": AppManifestSchema_0_1_0, "0.2.0": AppManifestSchema_0_2_0, "0.3.0": AppManifestSchema_0_3_0, + "0.4.0": AppManifestSchema_0_4_0, }; const validator = new Validator(); diff --git a/packages/js/manifests/polywrap/src/formats/polywrap.deploy/0.4.0.ts b/packages/js/manifests/polywrap/src/formats/polywrap.deploy/0.4.0.ts new file mode 100644 index 0000000000..67d3b23944 --- /dev/null +++ b/packages/js/manifests/polywrap/src/formats/polywrap.deploy/0.4.0.ts @@ -0,0 +1,61 @@ +/* eslint-disable @typescript-eslint/naming-convention */ +/* tslint:disable */ +/** + * This file was automatically generated by json-schema-to-typescript. + * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, + * and run json-schema-to-typescript to regenerate this file. + */ + +export interface DeployManifest { + /** + * Polywrap deployment manifest format version. + */ + format: "0.4.0"; + /** + * Name of the job that runs the primary deployment sequence. + */ + primaryJobName?: string; + /** + * Sequences of deployment steps + */ + jobs: { + [k: string]: Job; + }; + __type: "DeployManifest"; +} +/** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^.*$". + */ +export interface Job { + /** + * Deployment steps + */ + steps: Step[]; + /** + * Sequence-level custom configuration. + */ + config?: { + [k: string]: unknown; + }; +} +export interface Step { + /** + * Name of the step + */ + name: string; + /** + * Name of the deployer package. + */ + package: string; + /** + * Step-level custom configuration. + */ + config?: { + [k: string]: unknown; + }; + /** + * URI to pass into the deploy step. + */ + uri: string | string; +} diff --git a/packages/js/manifests/polywrap/src/formats/polywrap.deploy/index.ts b/packages/js/manifests/polywrap/src/formats/polywrap.deploy/index.ts index d5035950b6..19d98dfd90 100644 --- a/packages/js/manifests/polywrap/src/formats/polywrap.deploy/index.ts +++ b/packages/js/manifests/polywrap/src/formats/polywrap.deploy/index.ts @@ -14,11 +14,15 @@ import { import { DeployManifest as DeployManifest_0_3_0, } from "./0.3.0"; +import { + DeployManifest as DeployManifest_0_4_0, +} from "./0.4.0"; export { DeployManifest_0_1_0, DeployManifest_0_2_0, DeployManifest_0_3_0, + DeployManifest_0_4_0, }; export enum DeployManifestFormats { @@ -27,6 +31,7 @@ export enum DeployManifestFormats { "v0.1.0" = "0.1.0", "v0.2.0" = "0.2.0", "v0.3.0" = "0.3.0", + "v0.4.0" = "0.4.0", } export const DeployManifestSchemaFiles: Record = { @@ -35,17 +40,19 @@ export const DeployManifestSchemaFiles: Record = { "0.1.0": "formats/polywrap.deploy/0.1.0.json", "0.2.0": "formats/polywrap.deploy/0.2.0.json", "0.3.0": "formats/polywrap.deploy/0.3.0.json", + "0.4.0": "formats/polywrap.deploy/0.4.0.json", } export type AnyDeployManifest = | DeployManifest_0_1_0 | DeployManifest_0_2_0 | DeployManifest_0_3_0 + | DeployManifest_0_4_0 -export type DeployManifest = DeployManifest_0_3_0; +export type DeployManifest = DeployManifest_0_4_0; -export const latestDeployManifestFormat = DeployManifestFormats["v0.3.0"] +export const latestDeployManifestFormat = DeployManifestFormats["v0.4.0"] export { migrateDeployManifest } from "./migrate"; diff --git a/packages/js/manifests/polywrap/src/formats/polywrap.deploy/validate.ts b/packages/js/manifests/polywrap/src/formats/polywrap.deploy/validate.ts index c11ee85e49..05ca7075a2 100644 --- a/packages/js/manifests/polywrap/src/formats/polywrap.deploy/validate.ts +++ b/packages/js/manifests/polywrap/src/formats/polywrap.deploy/validate.ts @@ -12,6 +12,7 @@ import { import DeployManifestSchema_0_1_0 from "@polywrap/polywrap-manifest-schemas/formats/polywrap.deploy/0.1.0.json"; import DeployManifestSchema_0_2_0 from "@polywrap/polywrap-manifest-schemas/formats/polywrap.deploy/0.2.0.json"; import DeployManifestSchema_0_3_0 from "@polywrap/polywrap-manifest-schemas/formats/polywrap.deploy/0.3.0.json"; +import DeployManifestSchema_0_4_0 from "@polywrap/polywrap-manifest-schemas/formats/polywrap.deploy/0.4.0.json"; import { Schema, @@ -30,6 +31,7 @@ const schemas: DeployManifestSchemas = { "0.1.0": DeployManifestSchema_0_1_0, "0.2.0": DeployManifestSchema_0_2_0, "0.3.0": DeployManifestSchema_0_3_0, + "0.4.0": DeployManifestSchema_0_4_0, }; const validator = new Validator(); diff --git a/packages/js/manifests/polywrap/src/formats/polywrap.plugin/0.4.0.ts b/packages/js/manifests/polywrap/src/formats/polywrap.plugin/0.4.0.ts new file mode 100644 index 0000000000..e2b42898d4 --- /dev/null +++ b/packages/js/manifests/polywrap/src/formats/polywrap.plugin/0.4.0.ts @@ -0,0 +1,55 @@ +/* eslint-disable @typescript-eslint/naming-convention */ +/* tslint:disable */ +/** + * This file was automatically generated by json-schema-to-typescript. + * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, + * and run json-schema-to-typescript to regenerate this file. + */ + +export interface PluginManifest { + /** + * Polywrap manifest format version. + */ + format: "0.4.0"; + /** + * Basic project properties. + */ + project: { + /** + * Name of this project. + */ + name: string; + /** + * Type of this project. + */ + type: string; + }; + /** + * Project source files. + */ + source: { + /** + * Path to the project's entry point. + */ + module: string; + /** + * Path to the project's graphql schema. + */ + schema: string; + /** + * Specify ABIs to be used for the import URIs within your schema. + */ + import_abis?: ImportAbis[]; + }; + __type: "PluginManifest"; +} +export interface ImportAbis { + /** + * One of the schema's import URI. + */ + uri: string; + /** + * Path to a local ABI (or schema). Supported file formats: [*.graphql, *.info, *.json, *.yaml] + */ + abi: string; +} diff --git a/packages/js/manifests/polywrap/src/formats/polywrap.plugin/index.ts b/packages/js/manifests/polywrap/src/formats/polywrap.plugin/index.ts index 2a66aa6fdb..1d473b447f 100644 --- a/packages/js/manifests/polywrap/src/formats/polywrap.plugin/index.ts +++ b/packages/js/manifests/polywrap/src/formats/polywrap.plugin/index.ts @@ -14,11 +14,15 @@ import { import { PluginManifest as PluginManifest_0_3_0, } from "./0.3.0"; +import { + PluginManifest as PluginManifest_0_4_0, +} from "./0.4.0"; export { PluginManifest_0_1_0, PluginManifest_0_2_0, PluginManifest_0_3_0, + PluginManifest_0_4_0, }; export enum PluginManifestFormats { @@ -27,6 +31,7 @@ export enum PluginManifestFormats { "v0.1.0" = "0.1.0", "v0.2.0" = "0.2.0", "v0.3.0" = "0.3.0", + "v0.4.0" = "0.4.0", } export const PluginManifestSchemaFiles: Record = { @@ -35,17 +40,19 @@ export const PluginManifestSchemaFiles: Record = { "0.1.0": "formats/polywrap.plugin/0.1.0.json", "0.2.0": "formats/polywrap.plugin/0.2.0.json", "0.3.0": "formats/polywrap.plugin/0.3.0.json", + "0.4.0": "formats/polywrap.plugin/0.4.0.json", } export type AnyPluginManifest = | PluginManifest_0_1_0 | PluginManifest_0_2_0 | PluginManifest_0_3_0 + | PluginManifest_0_4_0 -export type PluginManifest = PluginManifest_0_3_0; +export type PluginManifest = PluginManifest_0_4_0; -export const latestPluginManifestFormat = PluginManifestFormats["v0.3.0"] +export const latestPluginManifestFormat = PluginManifestFormats["v0.4.0"] export { migratePluginManifest } from "./migrate"; diff --git a/packages/js/manifests/polywrap/src/formats/polywrap.plugin/validate.ts b/packages/js/manifests/polywrap/src/formats/polywrap.plugin/validate.ts index 20d91e186e..2824b4afcc 100644 --- a/packages/js/manifests/polywrap/src/formats/polywrap.plugin/validate.ts +++ b/packages/js/manifests/polywrap/src/formats/polywrap.plugin/validate.ts @@ -12,6 +12,7 @@ import { import PluginManifestSchema_0_1_0 from "@polywrap/polywrap-manifest-schemas/formats/polywrap.plugin/0.1.0.json"; import PluginManifestSchema_0_2_0 from "@polywrap/polywrap-manifest-schemas/formats/polywrap.plugin/0.2.0.json"; import PluginManifestSchema_0_3_0 from "@polywrap/polywrap-manifest-schemas/formats/polywrap.plugin/0.3.0.json"; +import PluginManifestSchema_0_4_0 from "@polywrap/polywrap-manifest-schemas/formats/polywrap.plugin/0.4.0.json"; import { Schema, @@ -30,6 +31,7 @@ const schemas: PluginManifestSchemas = { "0.1.0": PluginManifestSchema_0_1_0, "0.2.0": PluginManifestSchema_0_2_0, "0.3.0": PluginManifestSchema_0_3_0, + "0.4.0": PluginManifestSchema_0_4_0, }; const validator = new Validator(); diff --git a/packages/js/manifests/polywrap/src/formats/polywrap/0.5.0.ts b/packages/js/manifests/polywrap/src/formats/polywrap/0.5.0.ts new file mode 100644 index 0000000000..d043dc9175 --- /dev/null +++ b/packages/js/manifests/polywrap/src/formats/polywrap/0.5.0.ts @@ -0,0 +1,72 @@ +/* eslint-disable @typescript-eslint/naming-convention */ +/* tslint:disable */ +/** + * This file was automatically generated by json-schema-to-typescript. + * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, + * and run json-schema-to-typescript to regenerate this file. + */ + +export interface PolywrapManifest { + /** + * Polywrap manifest format version. + */ + format: "0.5.0"; + /** + * Basic project properties. + */ + project: { + /** + * Name of this project. + */ + name: string; + /** + * Type of this project. + */ + type: string; + }; + /** + * Project source files. + */ + source: { + /** + * Path to the project's entry point. + */ + module?: string; + /** + * Path to the project's graphql schema. + */ + schema: string; + /** + * Specify ABIs to be used for the import URIs within your schema. + */ + import_abis?: ImportAbis[]; + }; + /** + * Project resources folder + */ + resources?: string; + /** + * Project extension manifest files. + */ + extensions?: { + /** + * Path to the project build manifest file. + */ + build?: string; + /** + * Path to the project docs manifest file. + */ + docs?: string; + }; + __type: "PolywrapManifest"; +} +export interface ImportAbis { + /** + * One of the schema's import URI. + */ + uri: string; + /** + * Path to a local ABI (or schema). Supported file formats: [*.graphql, *.info, *.json, *.yaml] + */ + abi: string; +} diff --git a/packages/js/manifests/polywrap/src/formats/polywrap/index.ts b/packages/js/manifests/polywrap/src/formats/polywrap/index.ts index 22e98e2908..921461bdde 100644 --- a/packages/js/manifests/polywrap/src/formats/polywrap/index.ts +++ b/packages/js/manifests/polywrap/src/formats/polywrap/index.ts @@ -17,12 +17,16 @@ import { import { PolywrapManifest as PolywrapManifest_0_4_0, } from "./0.4.0"; +import { + PolywrapManifest as PolywrapManifest_0_5_0, +} from "./0.5.0"; export { PolywrapManifest_0_1_0, PolywrapManifest_0_2_0, PolywrapManifest_0_3_0, PolywrapManifest_0_4_0, + PolywrapManifest_0_5_0, }; export enum PolywrapManifestFormats { @@ -32,6 +36,7 @@ export enum PolywrapManifestFormats { "v0.2.0" = "0.2.0", "v0.3.0" = "0.3.0", "v0.4.0" = "0.4.0", + "v0.5.0" = "0.5.0", } export const PolywrapManifestSchemaFiles: Record = { @@ -41,6 +46,7 @@ export const PolywrapManifestSchemaFiles: Record = { "0.2.0": "formats/polywrap/0.2.0.json", "0.3.0": "formats/polywrap/0.3.0.json", "0.4.0": "formats/polywrap/0.4.0.json", + "0.5.0": "formats/polywrap/0.5.0.json", } export type AnyPolywrapManifest = @@ -48,11 +54,12 @@ export type AnyPolywrapManifest = | PolywrapManifest_0_2_0 | PolywrapManifest_0_3_0 | PolywrapManifest_0_4_0 + | PolywrapManifest_0_5_0 -export type PolywrapManifest = PolywrapManifest_0_4_0; +export type PolywrapManifest = PolywrapManifest_0_5_0; -export const latestPolywrapManifestFormat = PolywrapManifestFormats["v0.4.0"] +export const latestPolywrapManifestFormat = PolywrapManifestFormats["v0.5.0"] export { migratePolywrapManifest } from "./migrate"; diff --git a/packages/js/manifests/polywrap/src/formats/polywrap/validate.ts b/packages/js/manifests/polywrap/src/formats/polywrap/validate.ts index 11ab97a548..cb58b80c19 100644 --- a/packages/js/manifests/polywrap/src/formats/polywrap/validate.ts +++ b/packages/js/manifests/polywrap/src/formats/polywrap/validate.ts @@ -13,6 +13,7 @@ import PolywrapManifestSchema_0_1_0 from "@polywrap/polywrap-manifest-schemas/fo import PolywrapManifestSchema_0_2_0 from "@polywrap/polywrap-manifest-schemas/formats/polywrap/0.2.0.json"; import PolywrapManifestSchema_0_3_0 from "@polywrap/polywrap-manifest-schemas/formats/polywrap/0.3.0.json"; import PolywrapManifestSchema_0_4_0 from "@polywrap/polywrap-manifest-schemas/formats/polywrap/0.4.0.json"; +import PolywrapManifestSchema_0_5_0 from "@polywrap/polywrap-manifest-schemas/formats/polywrap/0.5.0.json"; import { Schema, @@ -32,6 +33,7 @@ const schemas: PolywrapManifestSchemas = { "0.2.0": PolywrapManifestSchema_0_2_0, "0.3.0": PolywrapManifestSchema_0_3_0, "0.4.0": PolywrapManifestSchema_0_4_0, + "0.5.0": PolywrapManifestSchema_0_5_0, }; const validator = new Validator(); diff --git a/packages/manifests/polywrap/formats/polywrap.app/0.4.0.json b/packages/manifests/polywrap/formats/polywrap.app/0.4.0.json new file mode 100644 index 0000000000..10e31ae03f --- /dev/null +++ b/packages/manifests/polywrap/formats/polywrap.app/0.4.0.json @@ -0,0 +1,69 @@ +{ + "id": "AppManifest", + "type": "object", + "additionalProperties": false, + "required": ["format", "project", "source"], + "properties": { + "format": { + "description": "Polywrap manifest format version.", + "type": "string", + "enum": ["0.4.0"] + }, + "project": { + "description": "Basic project properties.", + "type": "object", + "additionalProperties": false, + "required": ["name", "type"], + "properties": { + "name": { + "description": "Name of this project.", + "type": "string", + "pattern": "^[a-zA-Z0-9\\-\\_]+$" + }, + "type": { + "description": "Type of this project.", + "type": "string", + "pattern": "^app\\/[a-z0-9]+$" + } + } + }, + "source": { + "description": "Project source files.", + "type": "object", + "additionalProperties": false, + "required": ["schema"], + "properties": { + "schema": { + "description": "Path to the project's graphql schema.", + "type": "string", + "pattern": "^\\.?\\.?\\/?((\\/[\\w\\-\\.@]+|\\/\\.\\.|\\/\\.)+\\/)?[\\w\\-\\.]+\\.graphql$" + }, + "import_abis": { + "description": "Specify ABIs to be used for the import URIs within your schema.", + "type": "array", + "items": { + "$ref": "#/definitions/import_abis" + } + } + } + } + }, + "definitions": { + "import_abis": { + "type": "object", + "additionalProperties": false, + "properties": { + "uri": { + "description": "One of the schema's import URI.", + "type": "string" + }, + "abi": { + "description": "Path to a local ABI (or schema). Supported file formats: [*.graphql, *.info, *.json, *.yaml]", + "type": "string", + "pattern": "^\\.?\\.?\\/?((\\/[\\w\\-\\.@]+|\\/\\.\\.|\\/\\.)+\\/)?[\\w\\-\\.]+\\.(info|graphql|json|yaml)$" + } + }, + "required": ["uri", "abi"] + } + } +} diff --git a/packages/manifests/polywrap/formats/polywrap.deploy/0.4.0.json b/packages/manifests/polywrap/formats/polywrap.deploy/0.4.0.json new file mode 100644 index 0000000000..8c78c3208e --- /dev/null +++ b/packages/manifests/polywrap/formats/polywrap.deploy/0.4.0.json @@ -0,0 +1,79 @@ +{ + "id": "DeployManifest", + "type": "object", + "additionalProperties": false, + "required": ["format", "jobs"], + "properties": { + "format": { + "description": "Polywrap deployment manifest format version.", + "type": "string", + "const": "0.4.0" + }, + "primaryJobName": { + "description": "Name of the job that runs the primary deployment sequence.", + "type": "string" + }, + "jobs": { + "description": "Sequences of deployment steps", + "type": "object", + "patternProperties": { + "^.*$": { + "$ref": "#/definitions/job" + } + } + } + }, + "definitions": { + "job": { + "type": "object", + "additionalProperties": false, + "required": ["steps"], + "properties": { + "steps": { + "description": "Deployment steps", + "type": "array", + "items": { + "$ref": "#/definitions/step" + } + }, + "config": { + "description": "Sequence-level custom configuration.", + "type": "object" + } + } + }, + "step": { + "type": "object", + "additionalProperties": false, + "required": ["name", "package", "uri"], + "properties": { + "name": { + "description": "Name of the step", + "type": "string" + }, + "package": { + "description": "Name of the deployer package.", + "type": "string" + }, + "config": { + "description": "Step-level custom configuration.", + "type": "object" + }, + "uri": { + "description": "URI to pass into the deploy step.", + "oneOf": [ + { + "type": "string", + "description": "Valid WRAP URI" + }, + { + "type": "string", + "description": "Name of another step, prefixed with '$'", + "pattern": "^\\$.*" + } + ] + } + } + } + } +} diff --git a/packages/manifests/polywrap/formats/polywrap.plugin/0.4.0.json b/packages/manifests/polywrap/formats/polywrap.plugin/0.4.0.json new file mode 100644 index 0000000000..ba62dc3c1e --- /dev/null +++ b/packages/manifests/polywrap/formats/polywrap.plugin/0.4.0.json @@ -0,0 +1,74 @@ +{ + "id": "PluginManifest", + "type": "object", + "additionalProperties": false, + "required": ["format", "project", "source"], + "properties": { + "format": { + "description": "Polywrap manifest format version.", + "type": "string", + "enum": ["0.4.0"] + }, + "project": { + "description": "Basic project properties.", + "type": "object", + "additionalProperties": false, + "required": ["name", "type"], + "properties": { + "name": { + "description": "Name of this project.", + "type": "string", + "pattern": "^[a-zA-Z0-9\\-\\_]+$" + }, + "type": { + "description": "Type of this project.", + "type": "string", + "pattern": "^plugin\\/[a-z0-9]+$" + } + } + }, + "source": { + "description": "Project source files.", + "type": "object", + "additionalProperties": false, + "required": ["schema", "module"], + "properties": { + "module": { + "description": "Path to the project's entry point.", + "type": "string", + "pattern": "^\\.?\\.?\\/?((\\/[\\w\\-\\.@]+|\\/\\.\\.|\\/\\.)+\\/)?[\\w\\-\\.]+\\.?[\\w\\-\\.]*$" + }, + "schema": { + "description": "Path to the project's graphql schema.", + "type": "string", + "pattern": "^\\.?\\.?\\/?((\\/[\\w\\-\\.@]+|\\/\\.\\.|\\/\\.)+\\/)?[\\w\\-\\.]+\\.graphql$" + }, + "import_abis": { + "description": "Specify ABIs to be used for the import URIs within your schema.", + "type": "array", + "items": { + "$ref": "#/definitions/import_abis" + } + } + } + } + }, + "definitions": { + "import_abis": { + "type": "object", + "additionalProperties": false, + "properties": { + "uri": { + "description": "One of the schema's import URI.", + "type": "string" + }, + "abi": { + "description": "Path to a local ABI (or schema). Supported file formats: [*.graphql, *.info, *.json, *.yaml]", + "type": "string", + "pattern": "^\\.?\\.?\\/?((\\/[\\w\\-\\.@]+|\\/\\.\\.|\\/\\.)+\\/)?[\\w\\-\\.]+\\.(info|graphql|json|yaml)$" + } + }, + "required": ["uri", "abi"] + } + } +} diff --git a/packages/manifests/polywrap/formats/polywrap/0.5.0.json b/packages/manifests/polywrap/formats/polywrap/0.5.0.json new file mode 100644 index 0000000000..657f5c260c --- /dev/null +++ b/packages/manifests/polywrap/formats/polywrap/0.5.0.json @@ -0,0 +1,96 @@ +{ + "id": "PolywrapManifest", + "type": "object", + "additionalProperties": false, + "required": ["format", "project", "source"], + "properties": { + "format": { + "description": "Polywrap manifest format version.", + "type": "string", + "enum": ["0.5.0"] + }, + "project": { + "description": "Basic project properties.", + "type": "object", + "additionalProperties": false, + "required": ["name", "type"], + "properties": { + "name": { + "description": "Name of this project.", + "type": "string", + "pattern": "^[a-zA-Z0-9\\-\\_]+$" + }, + "type": { + "description": "Type of this project.", + "type": "string", + "pattern": "^((interface)|(wasm\\/[a-z0-9]+))$" + } + } + }, + "source": { + "description": "Project source files.", + "type": "object", + "additionalProperties": false, + "required": ["schema"], + "properties": { + "module": { + "description": "Path to the project's entry point.", + "type": "string", + "pattern": "^\\.?\\.?\\/?((\\/[\\w\\-\\.@]+|\\/\\.\\.|\\/\\.)+\\/)?[\\w\\-\\.]+\\.?[\\w\\-\\.]*$" + }, + "schema": { + "description": "Path to the project's graphql schema.", + "type": "string", + "pattern": "^\\.?\\.?\\/?((\\/[\\w\\-\\.@]+|\\/\\.\\.|\\/\\.)+\\/)?[\\w\\-\\.]+\\.graphql$" + }, + "import_abis": { + "description": "Specify ABIs to be used for the import URIs within your schema.", + "type": "array", + "items": { + "$ref": "#/definitions/import_abis" + } + } + } + }, + "resources": { + "description": "Project resources folder", + "type": "string", + "pattern": "^\\.?\\.?\\/?((\\/[\\w\\-\\.@]+|\\/\\.\\.|\\/\\.)+\\/)?[\\w\\-\\.]+\\.?[\\w\\-\\.]*\\/?$" + }, + "extensions": { + "description": "Project extension manifest files.", + "type": "object", + "additionalProperties": false, + "properties": { + "build": { + "description": "Path to the project build manifest file.", + "type": "string", + "pattern": "^\\.?\\.?(\\/[\\w\\-\\.@]+|\\/\\.\\.|\\/\\.)*\\/[\\w\\-\\.]+\\.(yaml|json)$" + }, + "docs": { + "description": "Path to the project docs manifest file.", + "type": "string", + "pattern": "^\\.?\\.?(\\/[\\w\\-\\.@]+|\\/\\.\\.|\\/\\.)*\\/[\\w\\-\\.]+\\.(yaml|json)$" + } + } + } + }, + "definitions": { + "import_abis": { + "type": "object", + "additionalProperties": false, + "properties": { + "uri": { + "description": "One of the schema's import URI.", + "type": "string" + }, + "abi": { + "description": "Path to a local ABI (or schema). Supported file formats: [*.graphql, *.info, *.json, *.yaml]", + "type": "string", + "pattern": "^\\.?\\.?\\/?((\\/[\\w\\-\\.@]+|\\/\\.\\.|\\/\\.)+\\/)?[\\w\\-\\.]+\\.(info|graphql|json|yaml)$" + } + }, + "required": ["uri", "abi"] + } + } +} diff --git a/yarn.lock b/yarn.lock index 6527f644c7..9f7f05d1da 100644 --- a/yarn.lock +++ b/yarn.lock @@ -113,52 +113,52 @@ dependencies: "@babel/highlight" "^7.22.5" -"@babel/compat-data@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.6.tgz#15606a20341de59ba02cd2fcc5086fcbe73bf544" - integrity sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg== +"@babel/compat-data@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" + integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== "@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.5": - version "7.22.8" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.8.tgz#386470abe884302db9c82e8e5e87be9e46c86785" - integrity sha512-75+KxFB4CZqYRXjx4NlR4J7yGvKumBuZTmV4NV6v09dVXXkuYVYLT68N6HCzLvfJ+fWCxQsntNzKwwIXL4bHnw== + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.9.tgz#bd96492c68822198f33e8a256061da3cf391f58f" + integrity sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.22.5" - "@babel/generator" "^7.22.7" - "@babel/helper-compilation-targets" "^7.22.6" - "@babel/helper-module-transforms" "^7.22.5" + "@babel/generator" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.9" + "@babel/helper-module-transforms" "^7.22.9" "@babel/helpers" "^7.22.6" "@babel/parser" "^7.22.7" "@babel/template" "^7.22.5" "@babel/traverse" "^7.22.8" "@babel/types" "^7.22.5" - "@nicolo-ribaudo/semver-v6" "^6.3.3" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.2" + semver "^6.3.1" -"@babel/generator@^7.22.7": - version "7.22.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.7.tgz#a6b8152d5a621893f2c9dacf9a4e286d520633d5" - integrity sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ== +"@babel/generator@^7.22.7", "@babel/generator@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.9.tgz#572ecfa7a31002fa1de2a9d91621fd895da8493d" + integrity sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw== dependencies: "@babel/types" "^7.22.5" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/helper-compilation-targets@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz#e30d61abe9480aa5a83232eb31c111be922d2e52" - integrity sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA== +"@babel/helper-compilation-targets@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz#f9d0a7aaaa7cd32a3f31c9316a69f5a9bcacb892" + integrity sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw== dependencies: - "@babel/compat-data" "^7.22.6" + "@babel/compat-data" "^7.22.9" "@babel/helper-validator-option" "^7.22.5" - "@nicolo-ribaudo/semver-v6" "^6.3.3" browserslist "^4.21.9" lru-cache "^5.1.1" + semver "^6.3.1" "@babel/helper-environment-visitor@^7.22.5": version "7.22.5" @@ -187,19 +187,16 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-module-transforms@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz#0f65daa0716961b6e96b164034e737f60a80d2ef" - integrity sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw== +"@babel/helper-module-transforms@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz#92dfcb1fbbb2bc62529024f72d942a8c97142129" + integrity sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ== dependencies: "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-module-imports" "^7.22.5" "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" "@babel/helper-validator-identifier" "^7.22.5" - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.5" - "@babel/types" "^7.22.5" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0": version "7.22.5" @@ -213,7 +210,7 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-split-export-declaration@^7.22.5", "@babel/helper-split-export-declaration@^7.22.6": +"@babel/helper-split-export-declaration@^7.22.6": version "7.22.6" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== @@ -351,7 +348,7 @@ "@babel/parser" "^7.22.5" "@babel/types" "^7.22.5" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.22.5", "@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8": +"@babel/traverse@^7.1.0", "@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8": version "7.22.8" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.8.tgz#4d4451d31bc34efeae01eac222b514a77aa4000e" integrity sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw== @@ -1863,11 +1860,6 @@ resolved "https://registry.yarnpkg.com/@multiformats/base-x/-/base-x-4.0.1.tgz#95ff0fa58711789d53aefb2590a8b7a4e715d121" integrity sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw== -"@nicolo-ribaudo/semver-v6@^6.3.3": - version "6.3.3" - resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz#ea6d23ade78a325f7a52750aab1526b02b628c29" - integrity sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg== - "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -4791,9 +4783,9 @@ electron-fetch@^1.7.2: encoding "^0.1.13" electron-to-chromium@^1.4.431: - version "1.4.459" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.459.tgz#25a23370f4ae8aaa8f77aaf00133aa4994f4148e" - integrity sha512-XXRS5NFv8nCrBL74Rm3qhJjA2VCsRFx0OjHKBMPI0otij56aun8UWiKTDABmd5/7GTR021pA4wivs+Ri6XCElg== + version "1.4.460" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.460.tgz#f360a5059c039c4a5fb4dfa99680ad8129dd9f84" + integrity sha512-kKiHnbrHME7z8E6AYaw0ehyxY5+hdaRmeUbjBO22LZMdqTYCO29EvF0T1cQ3pJ1RN5fyMcHl1Lmcsdt9WWJpJQ== elliptic@6.5.4: version "6.5.4" @@ -9755,7 +9747,7 @@ semver@7.x, semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^ dependencies: lru-cache "^6.0.0" -semver@^6.0.0, semver@^6.3.0: +semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== From 2fbce6e18ebd1b16c2de91b93fe71939e0bba4b7 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Fri, 14 Jul 2023 03:58:54 +0200 Subject: [PATCH 121/181] chore: fix ci --- .../cases/cli/build-cmd/wasm/golang/001-sanity/polywrap.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/polywrap.yaml b/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/polywrap.yaml index 07650dd125..be21a65d27 100644 --- a/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/polywrap.yaml +++ b/packages/test-cases/cases/cli/build-cmd/wasm/golang/001-sanity/polywrap.yaml @@ -1,4 +1,4 @@ -format: 0.4.0 +format: 0.5.0 project: name: ObjectTypes type: wasm/golang From dc335baf18be71383ec306b680cd486a6a4f1870 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Fri, 14 Jul 2023 04:05:31 +0200 Subject: [PATCH 122/181] chore: add migrators --- .../src/formats/polywrap.app/migrators/0.3.0_to_0.4.0.ts | 9 +++++++++ .../polywrap/src/formats/polywrap.app/migrators/index.ts | 6 ++++++ .../formats/polywrap.deploy/migrators/0.3.0_to_0.4.0.ts | 9 +++++++++ .../src/formats/polywrap.deploy/migrators/index.ts | 6 ++++++ .../formats/polywrap.plugin/migrators/0.3.0_to_0.4.0.ts | 9 +++++++++ .../src/formats/polywrap.plugin/migrators/index.ts | 6 ++++++ .../src/formats/polywrap/migrators/0.4.0_to_0.5.0.ts | 9 +++++++++ .../polywrap/src/formats/polywrap/migrators/index.ts | 6 ++++++ 8 files changed, 60 insertions(+) create mode 100644 packages/js/manifests/polywrap/src/formats/polywrap.app/migrators/0.3.0_to_0.4.0.ts create mode 100644 packages/js/manifests/polywrap/src/formats/polywrap.deploy/migrators/0.3.0_to_0.4.0.ts create mode 100644 packages/js/manifests/polywrap/src/formats/polywrap.plugin/migrators/0.3.0_to_0.4.0.ts create mode 100644 packages/js/manifests/polywrap/src/formats/polywrap/migrators/0.4.0_to_0.5.0.ts diff --git a/packages/js/manifests/polywrap/src/formats/polywrap.app/migrators/0.3.0_to_0.4.0.ts b/packages/js/manifests/polywrap/src/formats/polywrap.app/migrators/0.3.0_to_0.4.0.ts new file mode 100644 index 0000000000..9441c764c6 --- /dev/null +++ b/packages/js/manifests/polywrap/src/formats/polywrap.app/migrators/0.3.0_to_0.4.0.ts @@ -0,0 +1,9 @@ +import { AppManifest as OldManifest } from "../0.3.0"; +import { AppManifest as NewManifest } from "../0.4.0"; + +export function migrate(migrate: OldManifest): NewManifest { + return { + ...migrate, + format: "0.4.0", + }; +} diff --git a/packages/js/manifests/polywrap/src/formats/polywrap.app/migrators/index.ts b/packages/js/manifests/polywrap/src/formats/polywrap.app/migrators/index.ts index 02204ed348..cc377561c0 100644 --- a/packages/js/manifests/polywrap/src/formats/polywrap.app/migrators/index.ts +++ b/packages/js/manifests/polywrap/src/formats/polywrap.app/migrators/index.ts @@ -1,6 +1,7 @@ import { Migrator } from "../../../migrations"; import { migrate as migrate_0_1_0_to_0_2_0 } from "./0.1.0_to_0.2.0"; import { migrate as migrate_0_2_0_to_0_3_0 } from "./0.2.0_to_0.3.0"; +import { migrate as migrate_0_3_0_to_0_4_0 } from "./0.3.0_to_0.4.0"; export const migrators: Migrator[] = [ { @@ -18,4 +19,9 @@ export const migrators: Migrator[] = [ to: "0.3.0", migrate: migrate_0_2_0_to_0_3_0, }, + { + from: "0.3.0", + to: "0.4.0", + migrate: migrate_0_3_0_to_0_4_0, + }, ]; diff --git a/packages/js/manifests/polywrap/src/formats/polywrap.deploy/migrators/0.3.0_to_0.4.0.ts b/packages/js/manifests/polywrap/src/formats/polywrap.deploy/migrators/0.3.0_to_0.4.0.ts new file mode 100644 index 0000000000..082cb17d67 --- /dev/null +++ b/packages/js/manifests/polywrap/src/formats/polywrap.deploy/migrators/0.3.0_to_0.4.0.ts @@ -0,0 +1,9 @@ +import { DeployManifest as OldManifest } from "../0.3.0"; +import { DeployManifest as NewManifest } from "../0.4.0"; + +export function migrate(old: OldManifest): NewManifest { + return { + ...old, + format: "0.4.0", + }; +} diff --git a/packages/js/manifests/polywrap/src/formats/polywrap.deploy/migrators/index.ts b/packages/js/manifests/polywrap/src/formats/polywrap.deploy/migrators/index.ts index 02204ed348..cc377561c0 100644 --- a/packages/js/manifests/polywrap/src/formats/polywrap.deploy/migrators/index.ts +++ b/packages/js/manifests/polywrap/src/formats/polywrap.deploy/migrators/index.ts @@ -1,6 +1,7 @@ import { Migrator } from "../../../migrations"; import { migrate as migrate_0_1_0_to_0_2_0 } from "./0.1.0_to_0.2.0"; import { migrate as migrate_0_2_0_to_0_3_0 } from "./0.2.0_to_0.3.0"; +import { migrate as migrate_0_3_0_to_0_4_0 } from "./0.3.0_to_0.4.0"; export const migrators: Migrator[] = [ { @@ -18,4 +19,9 @@ export const migrators: Migrator[] = [ to: "0.3.0", migrate: migrate_0_2_0_to_0_3_0, }, + { + from: "0.3.0", + to: "0.4.0", + migrate: migrate_0_3_0_to_0_4_0, + }, ]; diff --git a/packages/js/manifests/polywrap/src/formats/polywrap.plugin/migrators/0.3.0_to_0.4.0.ts b/packages/js/manifests/polywrap/src/formats/polywrap.plugin/migrators/0.3.0_to_0.4.0.ts new file mode 100644 index 0000000000..a3c3e74c64 --- /dev/null +++ b/packages/js/manifests/polywrap/src/formats/polywrap.plugin/migrators/0.3.0_to_0.4.0.ts @@ -0,0 +1,9 @@ +import { PluginManifest as OldManifest } from "../0.3.0"; +import { PluginManifest as NewManifest } from "../0.4.0"; + +export function migrate(migrate: OldManifest): NewManifest { + return { + ...migrate, + format: "0.4.0", + }; +} diff --git a/packages/js/manifests/polywrap/src/formats/polywrap.plugin/migrators/index.ts b/packages/js/manifests/polywrap/src/formats/polywrap.plugin/migrators/index.ts index 02204ed348..cc377561c0 100644 --- a/packages/js/manifests/polywrap/src/formats/polywrap.plugin/migrators/index.ts +++ b/packages/js/manifests/polywrap/src/formats/polywrap.plugin/migrators/index.ts @@ -1,6 +1,7 @@ import { Migrator } from "../../../migrations"; import { migrate as migrate_0_1_0_to_0_2_0 } from "./0.1.0_to_0.2.0"; import { migrate as migrate_0_2_0_to_0_3_0 } from "./0.2.0_to_0.3.0"; +import { migrate as migrate_0_3_0_to_0_4_0 } from "./0.3.0_to_0.4.0"; export const migrators: Migrator[] = [ { @@ -18,4 +19,9 @@ export const migrators: Migrator[] = [ to: "0.3.0", migrate: migrate_0_2_0_to_0_3_0, }, + { + from: "0.3.0", + to: "0.4.0", + migrate: migrate_0_3_0_to_0_4_0, + }, ]; diff --git a/packages/js/manifests/polywrap/src/formats/polywrap/migrators/0.4.0_to_0.5.0.ts b/packages/js/manifests/polywrap/src/formats/polywrap/migrators/0.4.0_to_0.5.0.ts new file mode 100644 index 0000000000..43f63b72f8 --- /dev/null +++ b/packages/js/manifests/polywrap/src/formats/polywrap/migrators/0.4.0_to_0.5.0.ts @@ -0,0 +1,9 @@ +import { PolywrapManifest as OldManifest } from "../0.4.0"; +import { PolywrapManifest as NewManifest } from "../0.5.0"; + +export function migrate(migrate: OldManifest): NewManifest { + return { + ...migrate, + format: "0.5.0", + }; +} diff --git a/packages/js/manifests/polywrap/src/formats/polywrap/migrators/index.ts b/packages/js/manifests/polywrap/src/formats/polywrap/migrators/index.ts index f7c2f28329..51bcb41727 100644 --- a/packages/js/manifests/polywrap/src/formats/polywrap/migrators/index.ts +++ b/packages/js/manifests/polywrap/src/formats/polywrap/migrators/index.ts @@ -2,6 +2,7 @@ import { Migrator } from "../../../migrations"; import { migrate as migrate_0_1_0_to_0_2_0 } from "./0.1.0_to_0.2.0"; import { migrate as migrate_0_2_0_to_0_3_0 } from "./0.2.0_to_0.3.0"; import { migrate as migrate_0_3_0_to_0_4_0 } from "./0.3.0_to_0.4.0"; +import { migrate as migrate_0_4_0_to_0_5_0 } from "./0.4.0_to_0.5.0"; export const migrators: Migrator[] = [ { @@ -23,5 +24,10 @@ export const migrators: Migrator[] = [ from: "0.3.0", to: "0.4.0", migrate: migrate_0_3_0_to_0_4_0, + }, + { + from: "0.4.0", + to: "0.5.0", + migrate: migrate_0_4_0_to_0_5_0, } ]; From 191172c9f5ccab0ba032beeb78369ac389cf4dd1 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Fri, 14 Jul 2023 04:12:43 +0200 Subject: [PATCH 123/181] chore: prep 0.11.0-pre.2 --- CHANGELOG.md | 4 ++-- VERSION | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 79a3f017db..b183252708 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -# Polywrap Origin (0.11.0-pre.1) +# Polywrap Origin (0.11.0-pre.2) ... # Polywrap Origin (0.10.6) @@ -1271,4 +1271,4 @@ generateBinding = ( * Fix typescript plugin template's package.json # Web3API 0.0.1-prealpha.1 -Pre-Alpha Initial Release \ No newline at end of file +Pre-Alpha Initial Release diff --git a/VERSION b/VERSION index 7d205383dc..faa4a407a9 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.11.0-pre.1 +0.11.0-pre.2 From 53a2e849764833fa68c1ddaf68d0d6b2855e0216 Mon Sep 17 00:00:00 2001 From: polywrap-build-bot Date: Fri, 14 Jul 2023 02:17:35 +0000 Subject: [PATCH 124/181] build(release): migrate to 0.11.0-pre.2 --- packages/cli/package.json | 16 ++++++++-------- packages/js/cli/package.json | 4 ++-- packages/js/logging/package.json | 2 +- packages/js/manifests/polywrap/package.json | 8 ++++---- packages/js/os/package.json | 2 +- packages/js/validation/package.json | 6 +++--- packages/manifests/polywrap/package.json | 2 +- packages/schema/bind/package.json | 8 ++++---- packages/schema/compose/package.json | 8 ++++---- packages/schema/parse/package.json | 4 ++-- packages/templates/app/typescript/package.json | 4 ++-- packages/templates/package.json | 2 +- packages/templates/plugin/python/package.json | 2 +- packages/templates/plugin/rust/package.json | 2 +- .../templates/plugin/typescript/package.json | 4 ++-- .../templates/wasm/assemblyscript/package.json | 6 +++--- packages/templates/wasm/golang/package.json | 4 ++-- packages/templates/wasm/rust/package.json | 4 ++-- packages/test-cases/package.json | 4 ++-- packages/wasm/as/package.json | 2 +- packages/wasm/rs/Cargo.toml | 2 +- 21 files changed, 48 insertions(+), 48 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 6800e9a045..bf9b9d3a29 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,7 +1,7 @@ { "name": "polywrap", "description": "Polywrap CLI", - "version": "0.11.0-pre.1", + "version": "0.11.0-pre.2", "license": "MIT", "repository": { "type": "git", @@ -48,13 +48,13 @@ "@polywrap/client-js": "0.11.0", "@polywrap/core-js": "0.11.0", "@polywrap/ethereum-provider-js": "0.3.1", - "@polywrap/logging-js": "0.11.0-pre.1", - "@polywrap/os-js": "0.11.0-pre.1", - "@polywrap/polywrap-manifest-types-js": "0.11.0-pre.1", + "@polywrap/logging-js": "0.11.0-pre.2", + "@polywrap/os-js": "0.11.0-pre.2", + "@polywrap/polywrap-manifest-types-js": "0.11.0-pre.2", "@polywrap/result": "0.11.0", - "@polywrap/schema-bind": "0.11.0-pre.1", - "@polywrap/schema-compose": "0.11.0-pre.1", - "@polywrap/schema-parse": "0.11.0-pre.1", + "@polywrap/schema-bind": "0.11.0-pre.2", + "@polywrap/schema-compose": "0.11.0-pre.2", + "@polywrap/schema-parse": "0.11.0-pre.2", "@polywrap/uri-resolver-extensions-js": "0.11.0", "@polywrap/uri-resolvers-js": "0.11.0", "@polywrap/wasm-js": "0.11.0", @@ -81,7 +81,7 @@ "yesno": "0.4.0" }, "devDependencies": { - "@polywrap/cli-js": "0.11.0-pre.1", + "@polywrap/cli-js": "0.11.0-pre.2", "@types/copyfiles": "2.4.0", "@types/fs-extra": "9.0.12", "@types/jest": "26.0.8", diff --git a/packages/js/cli/package.json b/packages/js/cli/package.json index bf509cd3de..343d8ec21a 100644 --- a/packages/js/cli/package.json +++ b/packages/js/cli/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/cli-js", "description": "Programmatically execute the Polywrap CLI", - "version": "0.11.0-pre.1", + "version": "0.11.0-pre.2", "license": "MIT", "repository": { "type": "git", @@ -17,7 +17,7 @@ "test": "jest --passWithNoTests --runInBand --detectOpenHandles --verbose" }, "dependencies": { - "polywrap": "0.11.0-pre.1", + "polywrap": "0.11.0-pre.2", "spawn-command": "0.0.2-1" }, "devDependencies": { diff --git a/packages/js/logging/package.json b/packages/js/logging/package.json index f23c5ef927..368f6ab917 100644 --- a/packages/js/logging/package.json +++ b/packages/js/logging/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/logging-js", "description": "Polywrap Core Logging Interface", - "version": "0.11.0-pre.1", + "version": "0.11.0-pre.2", "license": "MIT", "repository": { "type": "git", diff --git a/packages/js/manifests/polywrap/package.json b/packages/js/manifests/polywrap/package.json index 8acbc22db6..0ef9122cf6 100644 --- a/packages/js/manifests/polywrap/package.json +++ b/packages/js/manifests/polywrap/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/polywrap-manifest-types-js", "description": "Polywrap Manifest TypeScript Typings", - "version": "0.11.0-pre.1", + "version": "0.11.0-pre.2", "license": "MIT", "repository": { "type": "git", @@ -15,14 +15,14 @@ "test:watch": "yarn test -- --watch" }, "dependencies": { - "@polywrap/logging-js": "0.11.0-pre.1", - "@polywrap/polywrap-manifest-schemas": "0.11.0-pre.1", + "@polywrap/logging-js": "0.11.0-pre.2", + "@polywrap/polywrap-manifest-schemas": "0.11.0-pre.2", "jsonschema": "1.4.0", "semver": "7.5.3", "yaml": "2.2.2" }, "devDependencies": { - "@polywrap/os-js": "0.11.0-pre.1", + "@polywrap/os-js": "0.11.0-pre.2", "@types/jest": "26.0.8", "@types/mustache": "4.0.1", "@types/prettier": "2.6.0", diff --git a/packages/js/os/package.json b/packages/js/os/package.json index 674386559c..c83709a972 100644 --- a/packages/js/os/package.json +++ b/packages/js/os/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/os-js", "description": "Polywrap Javascript OS Utilities", - "version": "0.11.0-pre.1", + "version": "0.11.0-pre.2", "license": "MIT", "repository": { "type": "git", diff --git a/packages/js/validation/package.json b/packages/js/validation/package.json index 490273158c..23afb4e079 100644 --- a/packages/js/validation/package.json +++ b/packages/js/validation/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/package-validation", "description": "Polywrap Package Validator", - "version": "0.11.0-pre.1", + "version": "0.11.0-pre.2", "license": "MIT", "repository": { "type": "git", @@ -18,12 +18,12 @@ "test:watch": "yarn test -- --watch" }, "dependencies": { - "@polywrap/schema-compose": "0.11.0-pre.1", + "@polywrap/schema-compose": "0.11.0-pre.2", "@polywrap/wrap-manifest-types-js": "0.10.0" }, "devDependencies": { "@polywrap/msgpack-js": "0.10.0", - "@polywrap/os-js": "0.11.0-pre.1", + "@polywrap/os-js": "0.11.0-pre.2", "@types/jest": "26.0.8", "jest": "26.6.3", "rimraf": "3.0.2", diff --git a/packages/manifests/polywrap/package.json b/packages/manifests/polywrap/package.json index bf3f80cb85..1020e71ae8 100644 --- a/packages/manifests/polywrap/package.json +++ b/packages/manifests/polywrap/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/polywrap-manifest-schemas", "description": "Polywrap Manifest Schemas", - "version": "0.11.0-pre.1", + "version": "0.11.0-pre.2", "license": "MIT", "repository": { "type": "git", diff --git a/packages/schema/bind/package.json b/packages/schema/bind/package.json index 3661b02001..d9a6199fd2 100644 --- a/packages/schema/bind/package.json +++ b/packages/schema/bind/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/schema-bind", "description": "Polywrap Schema Binding", - "version": "0.11.0-pre.1", + "version": "0.11.0-pre.2", "license": "MIT", "repository": { "type": "git", @@ -20,13 +20,13 @@ }, "dependencies": { "@polywrap/client-js": "~0.11.0", - "@polywrap/os-js": "0.11.0-pre.1", - "@polywrap/schema-parse": "0.11.0-pre.1", + "@polywrap/os-js": "0.11.0-pre.2", + "@polywrap/schema-parse": "0.11.0-pre.2", "@polywrap/wrap-manifest-types-js": "0.11.0", "mustache": "4.0.1" }, "devDependencies": { - "@polywrap/test-cases": "0.11.0-pre.1", + "@polywrap/test-cases": "0.11.0-pre.2", "@types/jest": "26.0.8", "@types/lodash": "4.14.178", "@types/mustache": "4.0.1", diff --git a/packages/schema/compose/package.json b/packages/schema/compose/package.json index 8f0c50c461..6017634249 100644 --- a/packages/schema/compose/package.json +++ b/packages/schema/compose/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/schema-compose", "description": "Polywrap Schema Composition", - "version": "0.11.0-pre.1", + "version": "0.11.0-pre.2", "license": "MIT", "repository": { "type": "git", @@ -18,14 +18,14 @@ "test:watch": "yarn test -- --watch" }, "dependencies": { - "@polywrap/schema-parse": "0.11.0-pre.1", + "@polywrap/schema-parse": "0.11.0-pre.2", "@polywrap/wrap-manifest-types-js": "0.10.0", "graphql": "15.5.0", "mustache": "4.0.1" }, "devDependencies": { - "@polywrap/os-js": "0.11.0-pre.1", - "@polywrap/test-cases": "0.11.0-pre.1", + "@polywrap/os-js": "0.11.0-pre.2", + "@polywrap/test-cases": "0.11.0-pre.2", "@types/jest": "26.0.8", "@types/mustache": "4.0.1", "@types/prettier": "2.6.0", diff --git a/packages/schema/parse/package.json b/packages/schema/parse/package.json index 81ddf5bf54..716e52c9df 100644 --- a/packages/schema/parse/package.json +++ b/packages/schema/parse/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/schema-parse", "description": "Polywrap Schema Parsing", - "version": "0.11.0-pre.1", + "version": "0.11.0-pre.2", "license": "MIT", "repository": { "type": "git", @@ -23,7 +23,7 @@ "graphql": "15.5.0" }, "devDependencies": { - "@polywrap/test-cases": "0.11.0-pre.1", + "@polywrap/test-cases": "0.11.0-pre.2", "@types/deep-equal": "1.0.1", "@types/jest": "26.0.8", "@types/prettier": "2.6.0", diff --git a/packages/templates/app/typescript/package.json b/packages/templates/app/typescript/package.json index eac3556c7b..04611bb117 100644 --- a/packages/templates/app/typescript/package.json +++ b/packages/templates/app/typescript/package.json @@ -2,7 +2,7 @@ "name": "templates-app-typescript", "description": "Polywrap App TypeScript Template", "private": true, - "version": "0.11.0-pre.1", + "version": "0.11.0-pre.2", "scripts": { "build": "npx polywrap codegen", "test": "ts-node ./src/index.ts" @@ -12,7 +12,7 @@ }, "devDependencies": { "@types/node": "18.14.6", - "polywrap": "0.11.0-pre.1", + "polywrap": "0.11.0-pre.2", "ts-node": "10.9.1", "typescript": "4.9.5" } diff --git a/packages/templates/package.json b/packages/templates/package.json index 40ed636c40..9d8e85b6ea 100644 --- a/packages/templates/package.json +++ b/packages/templates/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/templates", "description": "Polywrap Templates", - "version": "0.11.0-pre.1", + "version": "0.11.0-pre.2", "license": "MIT", "repository": { "type": "git", diff --git a/packages/templates/plugin/python/package.json b/packages/templates/plugin/python/package.json index be48da8dfb..20a9c97a71 100644 --- a/packages/templates/plugin/python/package.json +++ b/packages/templates/plugin/python/package.json @@ -1,7 +1,7 @@ { "name": "templates-plugin-python", "private": true, - "version": "0.11.0-pre.1", + "version": "0.11.0-pre.2", "dependencies": { "polywrap": "~0.10.2" } diff --git a/packages/templates/plugin/rust/package.json b/packages/templates/plugin/rust/package.json index a9a8442de9..6d465d91f6 100644 --- a/packages/templates/plugin/rust/package.json +++ b/packages/templates/plugin/rust/package.json @@ -1,7 +1,7 @@ { "name": "templates-plugin-rust", "private": true, - "version": "0.11.0-pre.1", + "version": "0.11.0-pre.2", "dependencies": { "polywrap": "~0.10.2" } diff --git a/packages/templates/plugin/typescript/package.json b/packages/templates/plugin/typescript/package.json index b4f9b7ecec..78ca5ac7f0 100644 --- a/packages/templates/plugin/typescript/package.json +++ b/packages/templates/plugin/typescript/package.json @@ -2,7 +2,7 @@ "name": "templates-plugin-typescript", "description": "Polywrap Plugin Typescript Template", "private": true, - "version": "0.11.0-pre.1", + "version": "0.11.0-pre.2", "main": "build/index.js", "scripts": { "build": "rimraf ./build && yarn codegen && tsc --project tsconfig.json", @@ -23,7 +23,7 @@ "@types/jest": "26.0.8", "@types/prettier": "2.6.0", "jest": "26.6.3", - "polywrap": "0.11.0-pre.1", + "polywrap": "0.11.0-pre.2", "rimraf": "3.0.2", "ts-jest": "26.5.4", "ts-node": "10.9.1", diff --git a/packages/templates/wasm/assemblyscript/package.json b/packages/templates/wasm/assemblyscript/package.json index 627194bdc0..cbea4363a4 100644 --- a/packages/templates/wasm/assemblyscript/package.json +++ b/packages/templates/wasm/assemblyscript/package.json @@ -2,7 +2,7 @@ "name": "template-wasm-as", "description": "Polywrap AssemblyScript Wrapper Template", "private": true, - "version": "0.11.0-pre.1", + "version": "0.11.0-pre.2", "scripts": { "codegen": "npx polywrap codegen", "build": "npx polywrap build", @@ -17,12 +17,12 @@ "devDependencies": { "@types/jest": "26.0.8", "jest": "26.6.3", - "polywrap": "0.11.0-pre.1", + "polywrap": "0.11.0-pre.2", "ts-jest": "26.5.4", "typescript": "4.9.5" }, "dependencies": { - "@polywrap/wasm-as": "0.11.0-pre.1", + "@polywrap/wasm-as": "0.11.0-pre.2", "assemblyscript": "0.19.23" } } diff --git a/packages/templates/wasm/golang/package.json b/packages/templates/wasm/golang/package.json index b8661c49e7..9232700a83 100644 --- a/packages/templates/wasm/golang/package.json +++ b/packages/templates/wasm/golang/package.json @@ -2,7 +2,7 @@ "name": "template-wasm-go", "description": "Polywrap Golang Wrapper Template", "private": true, - "version": "0.11.0-pre.1", + "version": "0.11.0-pre.2", "scripts": { "codegen": "npx polywrap codegen", "build": "npx polywrap build", @@ -15,7 +15,7 @@ "devDependencies": { "@types/jest": "26.0.8", "jest": "26.6.3", - "polywrap": "0.11.0-pre.1", + "polywrap": "0.11.0-pre.2", "ts-jest": "26.5.4", "typescript": "4.9.5" } diff --git a/packages/templates/wasm/rust/package.json b/packages/templates/wasm/rust/package.json index 0faa099bdd..97a8b9f721 100644 --- a/packages/templates/wasm/rust/package.json +++ b/packages/templates/wasm/rust/package.json @@ -2,7 +2,7 @@ "name": "template-wasm-rs", "description": "Polywrap Rust Wrapper Template", "private": true, - "version": "0.11.0-pre.1", + "version": "0.11.0-pre.2", "scripts": { "codegen": "npx polywrap codegen", "build": "npx polywrap build", @@ -15,7 +15,7 @@ "devDependencies": { "@types/jest": "26.0.8", "jest": "26.6.3", - "polywrap": "0.11.0-pre.1", + "polywrap": "0.11.0-pre.2", "ts-jest": "26.5.4", "typescript": "4.9.5" } diff --git a/packages/test-cases/package.json b/packages/test-cases/package.json index f1a4d7aa54..d5026d2199 100644 --- a/packages/test-cases/package.json +++ b/packages/test-cases/package.json @@ -2,14 +2,14 @@ "name": "@polywrap/test-cases", "description": "Reusable Polywrap Test Cases", "private": true, - "version": "0.11.0-pre.1", + "version": "0.11.0-pre.2", "license": "MIT", "main": "index.ts", "scripts": { "generate:wrappers": "ts-node -e \"import { fetchWrappers } from './'; (async () => await fetchWrappers())()\"" }, "dependencies": { - "@polywrap/os-js": "0.11.0-pre.1" + "@polywrap/os-js": "0.11.0-pre.2" }, "devDependencies": { "@types/adm-zip": "0.5.0", diff --git a/packages/wasm/as/package.json b/packages/wasm/as/package.json index 0ea371efc8..cac2329e32 100644 --- a/packages/wasm/as/package.json +++ b/packages/wasm/as/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/wasm-as", "description": "Polywrap Assemblyscript Runtime", - "version": "0.11.0-pre.1", + "version": "0.11.0-pre.2", "license": "MIT", "repository": { "type": "git", diff --git a/packages/wasm/rs/Cargo.toml b/packages/wasm/rs/Cargo.toml index 0e363a98c9..918c06ba97 100644 --- a/packages/wasm/rs/Cargo.toml +++ b/packages/wasm/rs/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polywrap-wasm-rs" -version = "0.11.0-pre.1" +version = "0.11.0-pre.2" license = "MIT" description = "Polywrap's Rust-Wasm Runtime" homepage = "https://polywrap.io" From fe0e6f862201450685d4d10f9b634c20fbf5e2d0 Mon Sep 17 00:00:00 2001 From: Pileks Date: Fri, 14 Jul 2023 10:51:58 +0200 Subject: [PATCH 125/181] fix up merge conflicts --- .../schema/bind/src/bindings/wrap-bindgen.ts | 2 +- packages/templates/plugin/python/package.json | 2 +- packages/templates/plugin/rust/package.json | 2 +- .../templates/wasm/interface/package.json | 2 +- yarn.lock | 791 +----------------- 5 files changed, 21 insertions(+), 778 deletions(-) diff --git a/packages/schema/bind/src/bindings/wrap-bindgen.ts b/packages/schema/bind/src/bindings/wrap-bindgen.ts index 10f0bdae10..b11a136ee7 100644 --- a/packages/schema/bind/src/bindings/wrap-bindgen.ts +++ b/packages/schema/bind/src/bindings/wrap-bindgen.ts @@ -3,8 +3,8 @@ import { Args_generateBindings, GenerateBindingFn, Output } from "./types"; import { PolywrapClient, - PolywrapClientConfigBuilder, ExtendableUriResolver, + PolywrapClientConfigBuilder } from "@polywrap/client-js"; import { OutputEntry } from "@polywrap/os-js"; diff --git a/packages/templates/plugin/python/package.json b/packages/templates/plugin/python/package.json index 20a9c97a71..807cecad9c 100644 --- a/packages/templates/plugin/python/package.json +++ b/packages/templates/plugin/python/package.json @@ -3,6 +3,6 @@ "private": true, "version": "0.11.0-pre.2", "dependencies": { - "polywrap": "~0.10.2" + "polywrap": "0.11.0-pre.2" } } diff --git a/packages/templates/plugin/rust/package.json b/packages/templates/plugin/rust/package.json index 6d465d91f6..186420e598 100644 --- a/packages/templates/plugin/rust/package.json +++ b/packages/templates/plugin/rust/package.json @@ -3,6 +3,6 @@ "private": true, "version": "0.11.0-pre.2", "dependencies": { - "polywrap": "~0.10.2" + "polywrap": "0.11.0-pre.2" } } diff --git a/packages/templates/wasm/interface/package.json b/packages/templates/wasm/interface/package.json index 2889225063..5d3d5d5e6d 100644 --- a/packages/templates/wasm/interface/package.json +++ b/packages/templates/wasm/interface/package.json @@ -2,6 +2,6 @@ "name": "templates-interface", "private": true, "dependencies": { - "polywrap": "~0.10.2" + "polywrap": "0.11.0-pre.2" } } diff --git a/yarn.lock b/yarn.lock index 2ea6e6c679..2415cf732f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1855,11 +1855,6 @@ resolved "https://registry.yarnpkg.com/@msgpack/msgpack/-/msgpack-2.7.2.tgz#f34b8aa0c49f0dd55eb7eba577081299cbf3f90b" integrity sha512-rYEi46+gIzufyYUAoHDnRzkWGxajpD9vVXFQ3g1vbjrBm6P7MBmm+s/fqPa46sxa+8FOUdEuRQKaugo5a4JWpw== -"@multiformats/base-x@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@multiformats/base-x/-/base-x-4.0.1.tgz#95ff0fa58711789d53aefb2590a8b7a4e715d121" - integrity sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw== - "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -2208,17 +2203,6 @@ "@polywrap/tracing-js" "0.12.0-pre.1" "@polywrap/wrap-manifest-types-js" "0.12.0-pre.1" -"@polywrap/core-client-js@0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@polywrap/core-client-js/-/core-client-js-0.11.0.tgz#92a6ceb074dc32409641915d8672358377d1825d" - integrity sha512-nii7Z2QhTcuKjE3xp505VdMh/vzO5wKwFPw8ibhqOp1jKl9R3/LK0EIZUI67NSWkaklhM1lv/hJ0h4ubhSaHtw== - dependencies: - "@polywrap/core-js" "0.11.0" - "@polywrap/msgpack-js" "0.11.0" - "@polywrap/result" "0.11.0" - "@polywrap/tracing-js" "0.11.0" - "@polywrap/wrap-manifest-types-js" "0.11.0" - "@polywrap/core-js@0.10.0": version "0.10.0" resolved "https://registry.yarnpkg.com/@polywrap/core-js/-/core-js-0.10.0.tgz#5ddc31ff47019342659a2208eec05299b072b216" @@ -2274,7 +2258,7 @@ "@polywrap/plugin-js" "0.10.0-pre.10" ethers "5.7.0" -"@polywrap/ethereum-provider-js@npm:@polywrap/ethereum-provider-js@~0.3.1": +"@polywrap/ethereum-provider-js@0.3.1", "@polywrap/ethereum-provider-js@npm:@polywrap/ethereum-provider-js@~0.3.1": version "0.3.1" resolved "https://registry.yarnpkg.com/@polywrap/ethereum-provider-js/-/ethereum-provider-js-0.3.1.tgz#ffdb9425c819ee76d3e3d5ade7d1b044077037e0" integrity sha512-El2d3gE2CFdGNzKQhO+IPP79lhyQmkAGlpQadaW/EDyFDjERLckYDLPrwUCXG0agUcQZcNY1nHn2hknumw/yWg== @@ -2311,11 +2295,6 @@ "@polywrap/core-js" "0.10.0" "@polywrap/plugin-js" "0.10.0" -"@polywrap/logging-js@0.10.6": - version "0.10.6" - resolved "https://registry.yarnpkg.com/@polywrap/logging-js/-/logging-js-0.10.6.tgz#62881f45e641c050081576a8d48ba868b44d2f17" - integrity sha512-6d5XCpiMJbGX0JjdFJeSTmHp0HlAPBLZLfVoE3XtWCWAcSlJW5IwTLDKUTZob/u/wews0UBZPHe25TgFugsPZQ== - "@polywrap/msgpack-js@0.10.0": version "0.10.0" resolved "https://registry.yarnpkg.com/@polywrap/msgpack-js/-/msgpack-js-0.10.0.tgz#7303da87ed7bc21858f0ef392aec575c5da6df63" @@ -2388,33 +2367,6 @@ "@polywrap/tracing-js" "0.10.1" "@polywrap/wrap-manifest-types-js" "0.10.1" -"@polywrap/plugin-js@0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@polywrap/plugin-js/-/plugin-js-0.11.0.tgz#cee0e8d14e7b4d1b7dc78bef7d092de06ece280d" - integrity sha512-5DGUGorf43MTB2SehkVs8jL7gGdlOT/mRqRi0/R5bnK+A+q75F6/kj26wnytrh42393WoIWghZtwZFkGN4EbYw== - dependencies: - "@polywrap/core-js" "0.11.0" - "@polywrap/msgpack-js" "0.11.0" - "@polywrap/result" "0.11.0" - "@polywrap/tracing-js" "0.11.0" - "@polywrap/wrap-manifest-types-js" "0.11.0" - -"@polywrap/polywrap-manifest-schemas@0.10.6": - version "0.10.6" - resolved "https://registry.yarnpkg.com/@polywrap/polywrap-manifest-schemas/-/polywrap-manifest-schemas-0.10.6.tgz#aae01cd7c22c3290aff7b0279f81dd00b5ac98bd" - integrity sha512-bDbuVpU+i2ghO+6+vOi/6iivelWt7zgjceynq7VbQaEvYtteiWLxHAaPRgxQsQVbljTOwMpuctvjotdtYlFD0Q== - -"@polywrap/polywrap-manifest-types-js@0.10.6": - version "0.10.6" - resolved "https://registry.yarnpkg.com/@polywrap/polywrap-manifest-types-js/-/polywrap-manifest-types-js-0.10.6.tgz#5d4108d59db9ac2cd796b6bbbbb238929b99775e" - integrity sha512-Uh3Mg7cFNEqzxEJGU7gz18/lUVyRGRt6kC2rEUhLvlKQjo/be1DMxh3UO5TcqknC2CGt1lzSg56hmd/exnTZ2w== - dependencies: - "@polywrap/logging-js" "0.10.6" - "@polywrap/polywrap-manifest-schemas" "0.10.6" - jsonschema "1.4.0" - semver "7.5.3" - yaml "2.2.2" - "@polywrap/result@0.10.0": version "0.10.0" resolved "https://registry.yarnpkg.com/@polywrap/result/-/result-0.10.0.tgz#712339223fba524dfabfb0bf868411f357d52e34" @@ -2542,31 +2494,6 @@ "@polywrap/wasm-js" "0.12.0-pre.1" base64-to-uint8array "1.0.0" -"@polywrap/wasm-js@0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@polywrap/wasm-js/-/wasm-js-0.11.0.tgz#19846787b1135e85087a348d65c1814b838cfef2" - integrity sha512-mgr40pTQMd1fmeKa5DhrxXDxUoS5XlT0lPy74b/Ai/i2KEyLrNLKhvVtkw0U1C5jVbCFteWR43cxRhuvsb3xfQ== - dependencies: - "@polywrap/asyncify-js" "0.11.0" - "@polywrap/core-js" "0.11.0" - "@polywrap/msgpack-js" "0.11.0" - "@polywrap/result" "0.11.0" - "@polywrap/tracing-js" "0.11.0" - "@polywrap/wrap-manifest-types-js" "0.11.0" - -"@polywrap/web3-config-bundle-js@0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@polywrap/web3-config-bundle-js/-/web3-config-bundle-js-0.11.0.tgz#3c96fa76f6c2a00e3d3d8de7cf8e5975fb606593" - integrity sha512-A4Wo3ghkCv1jkXPvOaj8oYSHiJCS3EXA44aK0/8GvfX/SSF1tW2oZxxmzsK69G+Tm/9wYODhkAsgjD6Swe9vKw== - dependencies: - "@polywrap/config-bundle-types-js" "0.11.0" - "@polywrap/ethereum-provider-js" "npm:@polywrap/ethereum-provider-js@~0.3.1" - "@polywrap/ethereum-provider-js-v1" "npm:@polywrap/ethereum-provider-js@~0.2.4" - "@polywrap/sys-config-bundle-js" "0.11.0" - "@polywrap/uri-resolver-extensions-js" "0.11.0" - "@polywrap/wasm-js" "0.11.0" - base64-to-uint8array "1.0.0" - "@polywrap/wrap-manifest-types-js@0.10.0": version "0.10.0" resolved "https://registry.yarnpkg.com/@polywrap/wrap-manifest-types-js/-/wrap-manifest-types-js-0.10.0.tgz#f009a69d1591ee770dd13d67989d88f51e345d36" @@ -3023,11 +2950,6 @@ resolved "https://registry.yarnpkg.com/@web3api/assemblyscript-json/-/assemblyscript-json-1.2.0.tgz#f01f11f12a66cd1a319d43f12e476307d1ad3da8" integrity sha512-x+wchJpH1giJzXj3dYs8vh2SKMXepeqVXiaFV/YCtXg4X/KaUnxi0kp5JugbEAyEJurEScH1YuV6IvGhGui/fw== -"@zxing/text-encoding@0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@zxing/text-encoding/-/text-encoding-0.9.0.tgz#fb50ffabc6c7c66a0c96b4c03e3d9be74864b70b" - integrity sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA== - JSONStream@^1.0.4: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" @@ -3046,13 +2968,6 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" - acorn-globals@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" @@ -3191,14 +3106,6 @@ any-promise@^1.0.0: resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== -any-signal@^2.0.0, any-signal@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/any-signal/-/any-signal-2.1.2.tgz#8d48270de0605f8b218cf9abe8e9c6a0e7418102" - integrity sha512-B+rDnWasMi/eWcajPcCWSlYc7muXOrcYrqgyzcdKisl2H/WTlQ0gip1KyQfr0ZlxJdsuWCj/LWwQm7fhyhRfIQ== - dependencies: - abort-controller "^3.0.0" - native-abort-controller "^1.0.3" - anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -3554,11 +3461,6 @@ before-after-hook@^2.2.0: resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== -bignumber.js@^9.0.0: - version "9.1.1" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" - integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== - binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -3569,27 +3471,6 @@ binaryen@102.0.0-nightly.20211028: resolved "https://registry.yarnpkg.com/binaryen/-/binaryen-102.0.0-nightly.20211028.tgz#8f1efb0920afd34509e342e37f84313ec936afb2" integrity sha512-GCJBVB5exbxzzvyt8MGDv/MeUjs6gkXDvf4xOIItRBptYl0Tz5sm1o/uG95YK0L0VeG5ajDu3hRtkBP2kzqC5w== -bl@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -blakejs@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" - integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== - -blob-to-it@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/blob-to-it/-/blob-to-it-1.0.4.tgz#f6caf7a4e90b7bb9215fa6a318ed6bd8ad9898cb" - integrity sha512-iCmk0W4NdbrWgRRuxOriU8aM5ijeVLI61Zulsmg/lUHNr7pYjoj+U77opLefNagevtrrbMt3JQ5Qip7ar178kA== - dependencies: - browser-readablestream-to-it "^1.0.3" - bn.js@^4.11.9: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" @@ -3600,19 +3481,6 @@ bn.js@^5.2.1: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== -borc@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/borc/-/borc-2.1.2.tgz#6ce75e7da5ce711b963755117dd1b187f6f8cf19" - integrity sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w== - dependencies: - bignumber.js "^9.0.0" - buffer "^5.5.0" - commander "^2.15.0" - ieee754 "^1.1.13" - iso-url "~0.4.7" - json-text-sequence "~0.1.0" - readable-stream "^3.6.0" - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -3621,13 +3489,6 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - braces@^2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" @@ -3661,11 +3522,6 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browser-readablestream-to-it@^1.0.1, browser-readablestream-to-it@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/browser-readablestream-to-it/-/browser-readablestream-to-it-1.0.3.tgz#ac3e406c7ee6cdf0a502dd55db33bab97f7fba76" - integrity sha512-+12sHB+Br8HIh6VAMVEG5r3UXCyESIgDW7kzk3BjIXa43DVqVwL7GC5TW3jeh+72dtcH99pPVpw0X8i0jt+/kw== - browserslist@^4.21.9: version "4.21.9" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" @@ -3705,7 +3561,7 @@ buffer-from@1.x, buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@^5.4.3, buffer@^5.5.0, buffer@^5.6.0: +buffer@^5.5.0, buffer@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -3713,14 +3569,6 @@ buffer@^5.4.3, buffer@^5.5.0, buffer@^5.6.0: base64-js "^1.3.1" ieee754 "^1.1.13" -buffer@^6.0.1: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - builtins@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" @@ -3913,16 +3761,6 @@ cids@^0.7.1: multicodec "^1.0.0" multihashes "~0.4.15" -cids@^1.0.0: - version "1.1.9" - resolved "https://registry.yarnpkg.com/cids/-/cids-1.1.9.tgz#402c26db5c07059377bcd6fb82f2a24e7f2f4a4f" - integrity sha512-l11hWRfugIcbGuTZwAM5PwpjPPjyb6UZOGwlHSnOBV5o07XhQ4gNpBN67FbODvpjyHtd+0Xs6KNvUcGBiDRsdg== - dependencies: - multibase "^4.0.1" - multicodec "^3.0.1" - multihashes "^4.0.1" - uint8arrays "^3.0.0" - cjs-module-lexer@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz#4186fcca0eae175970aee870b9fe2d6cf8d5655f" @@ -4082,7 +3920,7 @@ commander@9.2.0: resolved "https://registry.yarnpkg.com/commander/-/commander-9.2.0.tgz#6e21014b2ed90d8b7c9647230d8b7a94a4a419a9" integrity sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w== -commander@^2.15.0, commander@^2.19.0: +commander@^2.19.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -4354,7 +4192,7 @@ dateformat@^3.0.0: resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.3: +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.3: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -4465,11 +4303,6 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== -delimit-stream@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/delimit-stream/-/delimit-stream-0.1.0.tgz#9b8319477c0e5f8aeb3ce357ae305fc25ea1cd2b" - integrity sha512-a02fiQ7poS5CnjiJBAsjGLPp5EwVoGHNeu9sziBd9huppRfsAFIpv5zNLv0V1gbop53ilngAf5Kf331AwcoRBQ== - depd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" @@ -4548,15 +4381,6 @@ discontinuous-range@1.0.0: resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a" integrity sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ== -dns-over-http-resolver@^1.0.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/dns-over-http-resolver/-/dns-over-http-resolver-1.2.3.tgz#194d5e140a42153f55bb79ac5a64dd2768c36af9" - integrity sha512-miDiVSI6KSNbi4SVifzO/reD8rMnxgrlnkrlkugOLQpWQTe2qMdHsZp5DmfKjxNE+/T3VAAYLQUZMv9SMr6+AA== - dependencies: - debug "^4.3.1" - native-fetch "^3.0.0" - receptacle "^1.3.2" - docker-compose@0.23.17: version "0.23.17" resolved "https://registry.yarnpkg.com/docker-compose/-/docker-compose-0.23.17.tgz#8816bef82562d9417dc8c790aa4871350f93a2ba" @@ -4613,17 +4437,10 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" -electron-fetch@^1.7.2: - version "1.9.1" - resolved "https://registry.yarnpkg.com/electron-fetch/-/electron-fetch-1.9.1.tgz#e28bfe78d467de3f2dec884b1d72b8b05322f30f" - integrity sha512-M9qw6oUILGVrcENMSRRefE1MbHPIz0h79EKIeJWK9v563aT9Qkh8aEHPO1H5vi970wPirNY+jO9OpFoLiMsMGA== - dependencies: - encoding "^0.1.13" - electron-to-chromium@^1.4.431: - version "1.4.459" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.459.tgz#25a23370f4ae8aaa8f77aaf00133aa4994f4148e" - integrity sha512-XXRS5NFv8nCrBL74Rm3qhJjA2VCsRFx0OjHKBMPI0otij56aun8UWiKTDABmd5/7GTR021pA4wivs+Ri6XCElg== + version "1.4.460" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.460.tgz#f360a5059c039c4a5fb4dfa99680ad8129dd9f84" + integrity sha512-kKiHnbrHME7z8E6AYaw0ehyxY5+hdaRmeUbjBO22LZMdqTYCO29EvF0T1cQ3pJ1RN5fyMcHl1Lmcsdt9WWJpJQ== elliptic@6.5.4: version "6.5.4" @@ -4653,7 +4470,7 @@ emoji-regex@^9.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== -encoding@^0.1.12, encoding@^0.1.13: +encoding@^0.1.12: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== @@ -4684,16 +4501,11 @@ envinfo@^7.7.4: resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.10.0.tgz#55146e3909cc5fe63c22da63fb15b05aeac35b13" integrity sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw== -err-code@^2.0.0, err-code@^2.0.2, err-code@^2.0.3: +err-code@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== -err-code@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-3.0.1.tgz#a444c7b992705f2b120ee320b09972eef331c920" - integrity sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA== - error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -5057,11 +4869,6 @@ event-emitter@^0.3.5: d "1" es5-ext "~0.10.14" -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - eventemitter3@^4.0.4: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" @@ -5226,11 +5033,6 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== -fast-fifo@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.0.tgz#03e381bcbfb29932d7c3afde6e15e83e05ab4d8b" - integrity sha512-IgfweLvEpwyA4WgiQe9Nx6VV2QkML2NkvZnk1oKnIzXgXdWxuhF7zw4DvLTPZJn6PIUneiAXPF24QmoEqHTjyw== - fast-glob@^3.2.5, fast-glob@^3.2.9: version "3.3.0" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.0.tgz#7c40cb491e1e2ed5664749e87bfb516dbe8727c0" @@ -5408,7 +5210,7 @@ fs-extra@9.0.1: jsonfile "^6.0.1" universalify "^1.0.0" -fs-extra@^9.0.1, fs-extra@^9.1.0: +fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -5501,11 +5303,6 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@ has-proto "^1.0.1" has-symbols "^1.0.3" -get-iterator@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-iterator/-/get-iterator-1.0.2.tgz#cd747c02b4c084461fac14f48f6b45a80ed25c82" - integrity sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg== - get-package-type@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" @@ -5657,7 +5454,7 @@ globals@^12.1.0: dependencies: type-fest "^0.8.1" -globalthis@^1.0.1, globalthis@^1.0.3: +globalthis@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== @@ -5918,7 +5715,7 @@ iconv-lite@^0.6.2: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -ieee754@^1.1.13, ieee754@^1.2.1: +ieee754@^1.1.13: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -6057,132 +5854,11 @@ invert-kv@^3.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-3.0.1.tgz#a93c7a3d4386a1dc8325b97da9bb1620c0282523" integrity sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw== -ip-regex@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" - integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== - ip@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== -ipfs-core-utils@^0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/ipfs-core-utils/-/ipfs-core-utils-0.5.4.tgz#c7fa508562086be65cebb51feb13c58abbbd3d8d" - integrity sha512-V+OHCkqf/263jHU0Fc9Rx/uDuwlz3PHxl3qu6a5ka/mNi6gucbFuI53jWsevCrOOY9giWMLB29RINGmCV5dFeQ== - dependencies: - any-signal "^2.0.0" - blob-to-it "^1.0.1" - browser-readablestream-to-it "^1.0.1" - cids "^1.0.0" - err-code "^2.0.3" - ipfs-utils "^5.0.0" - it-all "^1.0.4" - it-map "^1.0.4" - it-peekable "^1.0.1" - multiaddr "^8.0.0" - multiaddr-to-uri "^6.0.0" - parse-duration "^0.4.4" - timeout-abort-controller "^1.1.1" - uint8arrays "^1.1.0" - -ipfs-http-client@48.1.3: - version "48.1.3" - resolved "https://registry.yarnpkg.com/ipfs-http-client/-/ipfs-http-client-48.1.3.tgz#d9b91b1f65d54730de92290d3be5a11ef124b400" - integrity sha512-+JV4cdMaTvYN3vd4r6+mcVxV3LkJXzc4kn2ToVbObpVpdqmG34ePf1KlvFF8A9gjcel84WpiP5xCEV/IrisPBA== - dependencies: - any-signal "^2.0.0" - bignumber.js "^9.0.0" - cids "^1.0.0" - debug "^4.1.1" - form-data "^3.0.0" - ipfs-core-utils "^0.5.4" - ipfs-utils "^5.0.0" - ipld-block "^0.11.0" - ipld-dag-cbor "^0.17.0" - ipld-dag-pb "^0.20.0" - ipld-raw "^6.0.0" - it-last "^1.0.4" - it-map "^1.0.4" - it-tar "^1.2.2" - it-to-stream "^0.1.2" - merge-options "^2.0.0" - multiaddr "^8.0.0" - multibase "^3.0.0" - multicodec "^2.0.1" - multihashes "^3.0.1" - nanoid "^3.1.12" - native-abort-controller "~0.0.3" - parse-duration "^0.4.4" - stream-to-it "^0.2.2" - uint8arrays "^1.1.0" - -ipfs-utils@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ipfs-utils/-/ipfs-utils-5.0.1.tgz#7c0053d5e77686f45577257a73905d4523e6b4f7" - integrity sha512-28KZPgO4Uf5duT2ORLAYfboUp98iUshDD7yRAfbNxNAR8Dtidfn6o20rZfoXnkri2zKBVIPlJkuCPmPJB+6erg== - dependencies: - abort-controller "^3.0.0" - any-signal "^2.1.0" - buffer "^6.0.1" - electron-fetch "^1.7.2" - err-code "^2.0.0" - fs-extra "^9.0.1" - is-electron "^2.2.0" - iso-url "^1.0.0" - it-glob "0.0.10" - it-to-stream "^0.1.2" - merge-options "^2.0.0" - nanoid "^3.1.3" - native-abort-controller "0.0.3" - native-fetch "^2.0.0" - node-fetch "^2.6.0" - stream-to-it "^0.2.0" - -ipld-block@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/ipld-block/-/ipld-block-0.11.1.tgz#c3a7b41aee3244187bd87a73f980e3565d299b6e" - integrity sha512-sDqqLqD5qh4QzGq6ssxLHUCnH4emCf/8F8IwjQM2cjEEIEHMUj57XhNYgmGbemdYPznUhffxFGEHsruh5+HQRw== - dependencies: - cids "^1.0.0" - -ipld-dag-cbor@^0.17.0: - version "0.17.1" - resolved "https://registry.yarnpkg.com/ipld-dag-cbor/-/ipld-dag-cbor-0.17.1.tgz#842e6c250603e5791049168831a425ec03471fb1" - integrity sha512-Bakj/cnxQBdscORyf4LRHxQJQfoaY8KWc7PWROQgX+aw5FCzBt8ga0VM/59K+ABOznsqNvyLR/wz/oYImOpXJw== - dependencies: - borc "^2.1.2" - cids "^1.0.0" - is-circular "^1.0.2" - multicodec "^3.0.1" - multihashing-async "^2.0.0" - uint8arrays "^2.1.3" - -ipld-dag-pb@^0.20.0: - version "0.20.0" - resolved "https://registry.yarnpkg.com/ipld-dag-pb/-/ipld-dag-pb-0.20.0.tgz#025c0343aafe6cb9db395dd1dc93c8c60a669360" - integrity sha512-zfM0EdaolqNjAxIrtpuGKvXxWk5YtH9jKinBuQGTcngOsWFQhyybGCTJHGNGGtRjHNJi2hz5Udy/8pzv4kcKyg== - dependencies: - cids "^1.0.0" - class-is "^1.1.0" - multicodec "^2.0.0" - multihashing-async "^2.0.0" - protons "^2.0.0" - reset "^0.1.0" - run "^1.4.0" - stable "^0.1.8" - uint8arrays "^1.0.0" - -ipld-raw@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/ipld-raw/-/ipld-raw-6.0.0.tgz#74d947fcd2ce4e0e1d5bb650c1b5754ed8ea6da0" - integrity sha512-UK7fjncAzs59iu/o2kwYtb8jgTtW6B+cNWIiNpAJkfRwqoMk1xD/6i25ktzwe4qO8gQgoR9RxA5ibC23nq8BLg== - dependencies: - cids "^1.0.0" - multicodec "^2.0.0" - multihashing-async "^2.0.0" - is-absolute@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" @@ -6205,14 +5881,6 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-arguments@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" @@ -6266,11 +5934,6 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-circular@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-circular/-/is-circular-1.0.2.tgz#2e0ab4e9835f4c6b0ea2b9855a84acd501b8366c" - integrity sha512-YttjnrswnUYRVJvxCvu8z+PGMUSzC2JttP0OEXezlAEdp3EXzhf7IZ3j0gRAybJBQupedIZFhY61Tga6E0qASA== - is-core-module@^2.11.0, is-core-module@^2.5.0: version "2.12.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" @@ -6322,11 +5985,6 @@ is-docker@^2.0.0: resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== -is-electron@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/is-electron/-/is-electron-2.2.2.tgz#3778902a2044d76de98036f5dc58089ac4d80bb9" - integrity sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg== - is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -6361,13 +6019,6 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-generator-function@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -6375,13 +6026,6 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" -is-ip@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-3.1.0.tgz#2ae5ddfafaf05cb8008a62093cf29734f657c5d8" - integrity sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q== - dependencies: - ip-regex "^4.0.0" - is-lambda@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" @@ -6513,7 +6157,7 @@ is-text-path@^1.0.1: dependencies: text-extensions "^1.0.0" -is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9: +is-typed-array@^1.1.10, is-typed-array@^1.1.9: version "1.1.10" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== @@ -6575,21 +6219,6 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -iso-constants@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/iso-constants/-/iso-constants-0.1.2.tgz#3d2456ed5aeaa55d18564f285ba02a47a0d885b4" - integrity sha512-OTCM5ZCQsHBCI4Wdu4tSxvDIkmDHd5EwJDps5mKqnQnWJSKlnwMs3EDZ4n3Fh1tmkWkDlyd2vCDbEYuPbyrUNQ== - -iso-url@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/iso-url/-/iso-url-1.2.1.tgz#db96a49d8d9a64a1c889fc07cc525d093afb1811" - integrity sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng== - -iso-url@~0.4.7: - version "0.4.7" - resolved "https://registry.yarnpkg.com/iso-url/-/iso-url-0.4.7.tgz#de7e48120dae46921079fe78f325ac9e9217a385" - integrity sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog== - isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" @@ -6659,72 +6288,6 @@ istanbul-reports@^3.0.2: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -it-all@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/it-all/-/it-all-1.0.6.tgz#852557355367606295c4c3b7eff0136f07749335" - integrity sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A== - -it-concat@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/it-concat/-/it-concat-1.0.3.tgz#84db9376e4c77bf7bc1fd933bb90f184e7cef32b" - integrity sha512-sjeZQ1BWQ9U/W2oI09kZgUyvSWzQahTkOkLIsnEPgyqZFaF9ME5gV6An4nMjlyhXKWQMKEakQU8oRHs2SdmeyA== - dependencies: - bl "^4.0.0" - -it-glob@0.0.10: - version "0.0.10" - resolved "https://registry.yarnpkg.com/it-glob/-/it-glob-0.0.10.tgz#4defd9286f693847c3ff483d2ff65f22e1359ad8" - integrity sha512-p1PR15djgPV7pxdLOW9j4WcJdla8+91rJdUU2hU2Jm68vkxpIEXK55VHBeH8Lvqh2vqLtM83t8q4BuJxue6niA== - dependencies: - fs-extra "^9.0.1" - minimatch "^3.0.4" - -it-last@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/it-last/-/it-last-1.0.6.tgz#4106232e5905ec11e16de15a0e9f7037eaecfc45" - integrity sha512-aFGeibeiX/lM4bX3JY0OkVCFkAw8+n9lkukkLNivbJRvNz8lI3YXv5xcqhFUV2lDJiraEK3OXRDbGuevnnR67Q== - -it-map@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/it-map/-/it-map-1.0.6.tgz#6aa547e363eedcf8d4f69d8484b450bc13c9882c" - integrity sha512-XT4/RM6UHIFG9IobGlQPFQUrlEKkU4eBUFG3qhWhfAdh1JfF2x11ShCrKCdmZ0OiZppPfoLuzcfA4cey6q3UAQ== - -it-peekable@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/it-peekable/-/it-peekable-1.0.3.tgz#8ebe933767d9c5aa0ae4ef8e9cb3a47389bced8c" - integrity sha512-5+8zemFS+wSfIkSZyf0Zh5kNN+iGyccN02914BY4w/Dj+uoFEoPSvj5vaWn8pNZJNSxzjW0zHRxC3LUb2KWJTQ== - -it-reader@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/it-reader/-/it-reader-2.1.0.tgz#b1164be343f8538d8775e10fb0339f61ccf71b0f" - integrity sha512-hSysqWTO9Tlwc5EGjVf8JYZzw0D2FsxD/g+eNNWrez9zODxWt6QlN6JAMmycK72Mv4jHEKEXoyzUN4FYGmJaZw== - dependencies: - bl "^4.0.0" - -it-tar@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/it-tar/-/it-tar-1.2.2.tgz#8d79863dad27726c781a4bcc491f53c20f2866cf" - integrity sha512-M8V4a9I+x/vwXTjqvixcEZbQZHjwDIb8iUQ+D4M2QbhAdNs3WKVSl+45u5/F2XFx6jYMFOGzMVlKNK/uONgNIA== - dependencies: - bl "^4.0.0" - buffer "^5.4.3" - iso-constants "^0.1.2" - it-concat "^1.0.0" - it-reader "^2.0.0" - p-defer "^3.0.0" - -it-to-stream@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/it-to-stream/-/it-to-stream-0.1.2.tgz#7163151f75b60445e86b8ab1a968666acaacfe7b" - integrity sha512-DTB5TJRZG3untmZehcaFN0kGWl2bNv7tnJRgQHAO9QEt8jfvVRrebZtnD5NZd4SCj4WVPjl0LSrugNWE/UaZRQ== - dependencies: - buffer "^5.6.0" - fast-fifo "^1.0.0" - get-iterator "^1.0.2" - p-defer "^3.0.0" - p-fifo "^1.0.0" - readable-stream "^3.6.0" - jest-changed-files@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.6.2.tgz#f6198479e1cc66f22f9ae1e22acaa0b429c042d0" @@ -7128,7 +6691,7 @@ jest@26.6.3: import-local "^3.0.2" jest-cli "^26.6.3" -js-sha3@0.8.0, js-sha3@^0.8.0: +js-sha3@0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== @@ -7251,13 +6814,6 @@ json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== -json-text-sequence@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/json-text-sequence/-/json-text-sequence-0.1.1.tgz#a72f217dc4afc4629fff5feb304dc1bd51a2f3d2" - integrity sha512-L3mEegEWHRekSHjc7+sc8eJhba9Clq1PZ8kMkzf8OxElhXc8O4TS5MwcVlj9aEbm5dr81N90WHC5nAz3UO971w== - dependencies: - delimit-stream "0.1.0" - json5@2.x, json5@^2.2.2: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" @@ -7671,13 +7227,6 @@ meow@^8.0.0: type-fest "^0.18.0" yargs-parser "^20.2.3" -merge-options@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-options/-/merge-options-2.0.0.tgz#36ca5038badfc3974dbde5e58ba89d3df80882c3" - integrity sha512-S7xYIeWHl2ZUKF7SDeBhGg6rfv5bKxVBdk95s/I7wVF8d+hjLSztJ/B271cnUiF6CAFduEQ5Zn3HYwAjT16DlQ== - dependencies: - is-plain-obj "^2.0.0" - merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -7747,13 +7296,6 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== -minimatch@*: - version "9.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" - minimatch@^3.0.3, minimatch@^3.0.4, minimatch@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -7911,27 +7453,6 @@ ms@^2.0.0, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multiaddr-to-uri@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/multiaddr-to-uri/-/multiaddr-to-uri-6.0.0.tgz#8f08a75c6eeb2370d5d24b77b8413e3f0fa9bcc0" - integrity sha512-OjpkVHOXEmIKMO8WChzzQ7aZQcSQX8squxmvtDbRpy7/QNmJ3Z7jv6qyD74C28QtaeNie8O8ngW2AkeiMmKP7A== - dependencies: - multiaddr "^8.0.0" - -multiaddr@^8.0.0: - version "8.1.2" - resolved "https://registry.yarnpkg.com/multiaddr/-/multiaddr-8.1.2.tgz#74060ff8636ba1c01b2cf0ffd53950b852fa9b1f" - integrity sha512-r13IzW8+Sv9zab9Gt8RPMIN2WkptIPq99EpAzg4IbJ/zTELhiEwXWr9bAmEatSCI4j/LSA6ESJzvz95JZ+ZYXQ== - dependencies: - cids "^1.0.0" - class-is "^1.1.0" - dns-over-http-resolver "^1.0.0" - err-code "^2.0.3" - is-ip "^3.1.0" - multibase "^3.0.0" - uint8arrays "^1.1.0" - varint "^5.0.0" - multibase@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b" @@ -7940,21 +7461,6 @@ multibase@^0.7.0: base-x "^3.0.8" buffer "^5.5.0" -multibase@^3.0.0, multibase@^3.1.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-3.1.2.tgz#59314e1e2c35d018db38e4c20bb79026827f0f2f" - integrity sha512-bpklWHs70LO3smJUHOjcnzGceJJvn9ui0Vau6Za0B/GBepaXswmW8Ufea0uD9pROf/qCQ4N4lZ3sf3U+SNf0tw== - dependencies: - "@multiformats/base-x" "^4.0.1" - web-encoding "^1.0.6" - -multibase@^4.0.1: - version "4.0.6" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-4.0.6.tgz#6e624341483d6123ca1ede956208cb821b440559" - integrity sha512-x23pDe5+svdLz/k5JPGCVdfn7Q5mZVMBETiC+ORfO+sor9Sgs0smJzAjfTbM5tckeCqnaUuMYoz+k3RXMmJClQ== - dependencies: - "@multiformats/base-x" "^4.0.1" - multibase@~0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b" @@ -7978,27 +7484,6 @@ multicodec@^1.0.0: buffer "^5.6.0" varint "^5.0.0" -multicodec@^2.0.0, multicodec@^2.0.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-2.1.3.tgz#b9850635ad4e2a285a933151b55b4a2294152a5d" - integrity sha512-0tOH2Gtio39uO41o+2xl9UhRkCWxU5ZmZSbFCh/OjGzkWJI8e6lkN/s4Mj1YfyWoBod+2+S3W+6wO6nhkwN8pA== - dependencies: - uint8arrays "1.1.0" - varint "^6.0.0" - -multicodec@^3.0.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-3.2.1.tgz#82de3254a0fb163a107c1aab324f2a91ef51efb2" - integrity sha512-+expTPftro8VAW8kfvcuNNNBgb9gPeNYV9dn+z1kJRWF2vih+/S79f2RVeIwmrJBUJ6NT9IUPWnZDQvegEh5pw== - dependencies: - uint8arrays "^3.0.0" - varint "^6.0.0" - -multiformats@^9.4.2: - version "9.9.0" - resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.9.0.tgz#c68354e7d21037a8f1f8833c8ccd68618e8f1d37" - integrity sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== - multihashes@^0.4.15, multihashes@~0.4.15: version "0.4.21" resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5" @@ -8008,36 +7493,6 @@ multihashes@^0.4.15, multihashes@~0.4.15: multibase "^0.7.0" varint "^5.0.0" -multihashes@^3.0.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-3.1.2.tgz#ffa5e50497aceb7911f7b4a3b6cada9b9730edfc" - integrity sha512-AP4IoV/YzkNrfbQKZE3OMPibrmy350OmCd6cJkwyM8oExaXIlOY4UnOOVSQtAEuq/LR01XfXKCESidzZvSwHCQ== - dependencies: - multibase "^3.1.0" - uint8arrays "^2.0.5" - varint "^6.0.0" - -multihashes@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-4.0.3.tgz#426610539cd2551edbf533adeac4c06b3b90fb05" - integrity sha512-0AhMH7Iu95XjDLxIeuCOOE4t9+vQZsACyKZ9Fxw2pcsRmlX4iCn1mby0hS0bb+nQOVpdQYWPpnyusw4da5RPhA== - dependencies: - multibase "^4.0.1" - uint8arrays "^3.0.0" - varint "^5.0.2" - -multihashing-async@^2.0.0: - version "2.1.4" - resolved "https://registry.yarnpkg.com/multihashing-async/-/multihashing-async-2.1.4.tgz#26dce2ec7a40f0e7f9e732fc23ca5f564d693843" - integrity sha512-sB1MiQXPSBTNRVSJc2zM157PXgDtud2nMFUEIvBrsq5Wv96sUclMRK/ecjoP1T/W61UJBqt4tCTwMkUpt2Gbzg== - dependencies: - blakejs "^1.1.0" - err-code "^3.0.0" - js-sha3 "^0.8.0" - multihashes "^4.0.1" - murmurhash3js-revisited "^3.0.0" - uint8arrays "^3.0.0" - multimatch@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-5.0.0.tgz#932b800963cea7a31a033328fa1e0c3a1874dbe6" @@ -8049,11 +7504,6 @@ multimatch@^5.0.0: arrify "^2.0.1" minimatch "^3.0.4" -murmurhash3js-revisited@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz#6bd36e25de8f73394222adc6e41fa3fac08a5869" - integrity sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g== - mustache@4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.0.1.tgz#d99beb031701ad433338e7ea65e0489416c854a2" @@ -8073,11 +7523,6 @@ mz@^2.7.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nanoid@^3.1.12, nanoid@^3.1.3: - version "3.3.6" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" - integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== - nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -8095,30 +7540,6 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" -native-abort-controller@0.0.3, native-abort-controller@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/native-abort-controller/-/native-abort-controller-0.0.3.tgz#4c528a6c9c7d3eafefdc2c196ac9deb1a5edf2f8" - integrity sha512-YIxU5nWqSHG1Xbu3eOu3pdFRD882ivQpIcu6AiPVe2oSVoRbfYW63DVkZm3g1gHiMtZSvZzF6THSzTGEBYl8YA== - dependencies: - globalthis "^1.0.1" - -native-abort-controller@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/native-abort-controller/-/native-abort-controller-1.0.4.tgz#39920155cc0c18209ff93af5bc90be856143f251" - integrity sha512-zp8yev7nxczDJMoP6pDxyD20IU0T22eX8VwN2ztDccKvSZhRaV33yP1BGwKSZfXuqWUzsXopVFjBdau9OOAwMQ== - -native-fetch@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/native-fetch/-/native-fetch-2.0.1.tgz#319d53741a7040def92d5dc8ea5fe9416b1fad89" - integrity sha512-gv4Bea+ga9QdXINurpkEqun3ap3vnB+WYoe4c8ddqUYEH7B2h6iD39RF8uVN7OwmSfMY3RDxkvBnoI4e2/vLXQ== - dependencies: - globalthis "^1.0.1" - -native-fetch@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/native-fetch/-/native-fetch-3.0.0.tgz#06ccdd70e79e171c365c75117959cf4fe14a09bb" - integrity sha512-G3Z7vx0IFb/FQ4JxvtqGABsOTIqRWvgQz6e+erkB+JJD6LrszQtMozEHI4EkmgZQvnGHrpLVzUWk7t4sJCIkVw== - natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -8154,7 +7575,7 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.7: +node-fetch@^2.6.1, node-fetch@^2.6.7: version "2.6.12" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.12.tgz#02eb8e22074018e3d5a83016649d04df0e348fba" integrity sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g== @@ -8529,24 +7950,11 @@ p-defer@^1.0.0: resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" integrity sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw== -p-defer@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-3.0.0.tgz#d1dceb4ee9b2b604b1d94ffec83760175d4e6f83" - integrity sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw== - p-each-series@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.2.0.tgz#105ab0357ce72b202a8a8b94933672657b5e2a9a" integrity sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA== -p-fifo@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-fifo/-/p-fifo-1.0.0.tgz#e29d5cf17c239ba87f51dde98c1d26a9cfe20a63" - integrity sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A== - dependencies: - fast-fifo "^1.0.0" - p-defer "^3.0.0" - p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -8671,11 +8079,6 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-duration@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/parse-duration/-/parse-duration-0.4.4.tgz#11c0f51a689e97d06c57bd772f7fda7dc013243c" - integrity sha512-KbAJuYGUhZkB9gotDiKLnZ7Z3VTacK3fgwmDdB6ZVDtJbMBT6MfLga0WJaYpPDu0mzqT0NgHtHDt5PY4l0nidg== - parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" @@ -8832,53 +8235,6 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -polywrap@~0.10.2: - version "0.10.6" - resolved "https://registry.yarnpkg.com/polywrap/-/polywrap-0.10.6.tgz#013151429f4b5014316b95a08130abfe0344f43f" - integrity sha512-p1zFJofXCkksmXJoAymlA+2l7VDEyT4YFtJeTda87s+f0CJqIHlgm9CZQnj4zoqkXDzfT3ol0yTnvhJCWS0RTg== - dependencies: - "@apidevtools/json-schema-ref-parser" "9.0.9" - "@ethersproject/providers" "5.6.8" - "@ethersproject/wallet" "5.6.2" - "@formatjs/intl" "1.8.2" - "@polywrap/asyncify-js" "0.10.0" - "@polywrap/client-config-builder-js" "0.10.0" - "@polywrap/client-js" "0.10.0" - "@polywrap/core-js" "0.10.0" - "@polywrap/ethereum-provider-js-v1" "npm:@polywrap/ethereum-provider-js@~0.2.4" - "@polywrap/logging-js" "0.10.6" - "@polywrap/os-js" "0.10.6" - "@polywrap/polywrap-manifest-types-js" "0.10.6" - "@polywrap/result" "0.10.0" - "@polywrap/schema-bind" "0.10.6" - "@polywrap/schema-compose" "0.10.6" - "@polywrap/schema-parse" "0.10.6" - "@polywrap/uri-resolver-extensions-js" "0.10.0" - "@polywrap/uri-resolvers-js" "0.10.0" - "@polywrap/wasm-js" "0.10.0" - "@polywrap/wrap-manifest-types-js" "0.10.0" - axios "0.21.2" - chalk "4.1.0" - chokidar "3.5.1" - commander "9.2.0" - content-hash "2.5.2" - copyfiles "2.4.1" - docker-compose "0.23.17" - extract-zip "2.0.1" - form-data "4.0.0" - fs-extra "9.0.1" - ipfs-http-client "48.1.3" - json-schema "0.4.0" - jsonschema "1.4.0" - mustache "4.0.1" - os-locale "5.0.0" - regex-parser "2.2.11" - rimraf "3.0.2" - toml "3.0.0" - typescript "4.9.5" - yaml "2.2.2" - yesno "0.4.0" - posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -8979,11 +8335,6 @@ proto-list@~1.2.1: resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== -protocol-buffers-schema@^3.3.1: - version "3.6.0" - resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz#77bc75a48b2ff142c1ad5b5b90c94cd0fa2efd03" - integrity sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw== - protocols@^1.4.0: version "1.4.8" resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.8.tgz#48eea2d8f58d9644a4a32caae5d5db290a075ce8" @@ -8994,16 +8345,6 @@ protocols@^2.0.1: resolved "https://registry.yarnpkg.com/protocols/-/protocols-2.0.1.tgz#8f155da3fc0f32644e83c5782c8e8212ccf70a86" integrity sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q== -protons@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/protons/-/protons-2.0.3.tgz#94f45484d04b66dfedc43ad3abff1e8907994bb2" - integrity sha512-j6JikP/H7gNybNinZhAHMN07Vjr1i4lVupg598l4I9gSTjJqOvKnwjzYX2PzvBTSVf2eZ2nWv4vG+mtW8L6tpA== - dependencies: - protocol-buffers-schema "^3.3.1" - signed-varint "^2.0.1" - uint8arrays "^3.0.0" - varint "^5.0.0" - proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" @@ -9209,7 +8550,7 @@ read@1, read@~1.0.1: dependencies: mute-stream "~0.0.4" -readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.4.0, readable-stream@^3.6.0: +readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -9258,13 +8599,6 @@ readdirp@~3.5.0: dependencies: picomatch "^2.2.1" -receptacle@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/receptacle/-/receptacle-1.3.2.tgz#a7994c7efafc7a01d0e2041839dab6c4951360d2" - integrity sha512-HrsFvqZZheusncQRiEE7GatOAETrARKV/lnfYicIm8lbvp/JQOdADOfhjBd2DajvoszEyxSM6RlAAIZgEoeu/A== - dependencies: - ms "^2.1.1" - rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" @@ -9368,11 +8702,6 @@ requires-port@^1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== -reset@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/reset/-/reset-0.1.0.tgz#9fc7314171995ae6cb0b7e58b06ce7522af4bafb" - integrity sha512-RF7bp2P2ODreUPA71FZ4DSK52gNLJJ8dSwA1nhOCoC0mI4KZ4D/W6zhd2nfBqX/JlR+QZ/iUqAYPjq1UQU8l0Q== - resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -9417,11 +8746,6 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -retimer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/retimer/-/retimer-2.0.0.tgz#e8bd68c5e5a8ec2f49ccb5c636db84c04063bbca" - integrity sha512-KLXY85WkEq2V2bKex/LOO1ViXVn2KGYe4PYysAdYdjmraYIUsVkXu8O4am+8+5UbaaGl1qho4aqAAPHNQ4GSbg== - retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" @@ -9463,13 +8787,6 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -run@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/run/-/run-1.4.0.tgz#e17d9e9043ab2fe17776cb299e1237f38f0b4ffa" - integrity sha512-962oBW07IjQ9SizyMHdoteVbDKt/e2nEsnTRZ0WjK/zs+jfQQICqH0qj0D5lqZNuy0JkbzfA6IOqw0Sk7C3DlQ== - dependencies: - minimatch "*" - rxjs@^6.6.0: version "6.6.7" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" @@ -9664,13 +8981,6 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -signed-varint@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/signed-varint/-/signed-varint-2.0.1.tgz#50a9989da7c98c2c61dad119bc97470ef8528129" - integrity sha512-abgDPg1106vuZZOvw7cFwdCABddfJRz5akcCcchzTbhyhYnsG31y4AlZEgp315T7W3nQq5P4xeOm186ZiPVFzw== - dependencies: - varint "~5.0.0" - sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -9893,11 +9203,6 @@ ssri@^8.0.0, ssri@^8.0.1: dependencies: minipass "^3.1.1" -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== - stack-utils@^2.0.2: version "2.0.6" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" @@ -9913,13 +9218,6 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -stream-to-it@^0.2.0, stream-to-it@^0.2.2: - version "0.2.4" - resolved "https://registry.yarnpkg.com/stream-to-it/-/stream-to-it-0.2.4.tgz#d2fd7bfbd4a899b4c0d6a7e6a533723af5749bd0" - integrity sha512-4vEbkSs83OahpmBybNJXlJd7d6/RxzkkSdT3I0mnGt79Xd2Kk+e1JqbvAvsQfCeKj3aKb0QIWkyK3/n0j506vQ== - dependencies: - get-iterator "^1.0.2" - strict-uri-encode@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" @@ -10202,14 +9500,6 @@ through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== -timeout-abort-controller@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/timeout-abort-controller/-/timeout-abort-controller-1.1.1.tgz#2c3c3c66f13c783237987673c276cbd7a9762f29" - integrity sha512-BsF9i3NAJag6T0ZEjki9j654zoafI2X6ayuNd6Tp8+Ul6Tr5s4jo973qFeiWrRSweqvskC+AHDKUmIW4b7pdhQ== - dependencies: - abort-controller "^3.0.0" - retimer "^2.0.0" - timers-ext@^0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6" @@ -10489,28 +9779,6 @@ uid-number@0.0.6: resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" integrity sha512-c461FXIljswCuscZn67xq9PpszkPT6RjheWFQTgCyabJrTUozElanb0YEqv2UGgk247YpcJkFBuSGNvBlpXM9w== -uint8arrays@1.1.0, uint8arrays@^1.0.0, uint8arrays@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-1.1.0.tgz#d034aa65399a9fd213a1579e323f0b29f67d0ed2" - integrity sha512-cLdlZ6jnFczsKf5IH1gPHTtcHtPGho5r4CvctohmQjw8K7Q3gFdfIGHxSTdTaCKrL4w09SsPRJTqRS0drYeszA== - dependencies: - multibase "^3.0.0" - web-encoding "^1.0.2" - -uint8arrays@^2.0.5, uint8arrays@^2.1.3: - version "2.1.10" - resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-2.1.10.tgz#34d023c843a327c676e48576295ca373c56e286a" - integrity sha512-Q9/hhJa2836nQfEJSZTmr+pg9+cDJS9XEAp7N2Vg5MzL3bK/mkMVfjscRGYruP9jNda6MAdf4QD/y78gSzkp6A== - dependencies: - multiformats "^9.4.2" - -uint8arrays@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-3.1.1.tgz#2d8762acce159ccd9936057572dade9459f65ae0" - integrity sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg== - dependencies: - multiformats "^9.4.2" - umask@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" @@ -10638,17 +9906,6 @@ util-promisify@^2.1.0: dependencies: object.getownpropertydescriptors "^2.0.3" -util@^0.12.3: - version "0.12.5" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" - integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== - dependencies: - inherits "^2.0.3" - is-arguments "^1.0.4" - is-generator-function "^1.0.7" - is-typed-array "^1.1.3" - which-typed-array "^1.1.2" - uuid@^3.3.2: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" @@ -10693,16 +9950,11 @@ validate-npm-package-name@^3.0.0: dependencies: builtins "^1.0.3" -varint@^5.0.0, varint@^5.0.2, varint@~5.0.0: +varint@^5.0.0: version "5.0.2" resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== -varint@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/varint/-/varint-6.0.0.tgz#9881eb0ce8feaea6512439d19ddf84bf551661d0" - integrity sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg== - verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" @@ -10779,15 +10031,6 @@ wcwidth@^1.0.0: dependencies: defaults "^1.0.3" -web-encoding@^1.0.2, web-encoding@^1.0.6: - version "1.1.5" - resolved "https://registry.yarnpkg.com/web-encoding/-/web-encoding-1.1.5.tgz#fc810cf7667364a6335c939913f5051d3e0c4864" - integrity sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA== - dependencies: - util "^0.12.3" - optionalDependencies: - "@zxing/text-encoding" "0.9.0" - webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" From 23985891a940aa822a5f7250da4e33203bc41de9 Mon Sep 17 00:00:00 2001 From: Pileks Date: Fri, 14 Jul 2023 11:50:14 +0200 Subject: [PATCH 126/181] fix rules for new deploy manifest schema to simply allow all string, fix up test deploy manifest --- .../polywrap/src/formats/polywrap.deploy/0.4.0.ts | 4 ++-- .../polywrap/formats/polywrap.deploy/0.4.0.json | 14 ++------------ .../cli/deploy/001-sanity/polywrap.deploy.yaml | 8 ++++---- 3 files changed, 8 insertions(+), 18 deletions(-) diff --git a/packages/js/manifests/polywrap/src/formats/polywrap.deploy/0.4.0.ts b/packages/js/manifests/polywrap/src/formats/polywrap.deploy/0.4.0.ts index 67d3b23944..a60efb5cb6 100644 --- a/packages/js/manifests/polywrap/src/formats/polywrap.deploy/0.4.0.ts +++ b/packages/js/manifests/polywrap/src/formats/polywrap.deploy/0.4.0.ts @@ -55,7 +55,7 @@ export interface Step { [k: string]: unknown; }; /** - * URI to pass into the deploy step. + * URI or name of other step prefixed with '$$' to pass into the deploy step. */ - uri: string | string; + uri: string; } diff --git a/packages/manifests/polywrap/formats/polywrap.deploy/0.4.0.json b/packages/manifests/polywrap/formats/polywrap.deploy/0.4.0.json index 8c78c3208e..522b6e2445 100644 --- a/packages/manifests/polywrap/formats/polywrap.deploy/0.4.0.json +++ b/packages/manifests/polywrap/formats/polywrap.deploy/0.4.0.json @@ -60,18 +60,8 @@ "type": "object" }, "uri": { - "description": "URI to pass into the deploy step.", - "oneOf": [ - { - "type": "string", - "description": "Valid WRAP URI" - }, - { - "type": "string", - "description": "Name of another step, prefixed with '$'", - "pattern": "^\\$.*" - } - ] + "description": "URI or name of other step prefixed with '$$' to pass into the deploy step.", + "type": "string" } } } diff --git a/packages/test-cases/cases/cli/deploy/001-sanity/polywrap.deploy.yaml b/packages/test-cases/cases/cli/deploy/001-sanity/polywrap.deploy.yaml index 5f6e44217e..c065da6950 100644 --- a/packages/test-cases/cases/cli/deploy/001-sanity/polywrap.deploy.yaml +++ b/packages/test-cases/cases/cli/deploy/001-sanity/polywrap.deploy.yaml @@ -1,8 +1,8 @@ -format: "0.3.0" +format: 0.4.0 jobs: fs_to_ens: config: - provider: 'http://localhost:8545' + provider: http://localhost:8545 ensRegistryAddress: $ENS_REG_ADDR ensRegistrarAddress: $ENS_REGISTRAR_ADDR ensResolverAddress: $ENS_RESOLVER_ADDR @@ -29,7 +29,7 @@ jobs: domainName: test2.eth ipfs_to_ens: config: - provider: 'http://localhost:8545' + provider: http://localhost:8545 ensRegistryAddress: $ENS_REG_ADDR ensRegistrarAddress: $ENS_REGISTRAR_ADDR ensResolverAddress: $ENS_RESOLVER_ADDR @@ -41,4 +41,4 @@ jobs: package: ens uri: wrap://ipfs/QmVdDR6QtigTt38Xwpj2Ki73X1AyZn5WRCreBCJq1CEtpF config: - domainName: test3.eth \ No newline at end of file + domainName: test3.eth From 89be0058851b337bf1d11e61d0c0b57bc3166b05 Mon Sep 17 00:00:00 2001 From: Pileks Date: Fri, 14 Jul 2023 13:10:28 +0200 Subject: [PATCH 127/181] migrate test case manifests --- .../cli/codegen/wasm/001-sanity-assemblyscript/polywrap.yaml | 2 +- .../cases/cli/codegen/wasm/002-sanity-rust/polywrap.yaml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/test-cases/cases/cli/codegen/wasm/001-sanity-assemblyscript/polywrap.yaml b/packages/test-cases/cases/cli/codegen/wasm/001-sanity-assemblyscript/polywrap.yaml index ee9034f333..59f654c7b3 100644 --- a/packages/test-cases/cases/cli/codegen/wasm/001-sanity-assemblyscript/polywrap.yaml +++ b/packages/test-cases/cases/cli/codegen/wasm/001-sanity-assemblyscript/polywrap.yaml @@ -1,4 +1,4 @@ -format: 0.4.0 +format: 0.5.0 project: name: test-project type: wasm/assemblyscript diff --git a/packages/test-cases/cases/cli/codegen/wasm/002-sanity-rust/polywrap.yaml b/packages/test-cases/cases/cli/codegen/wasm/002-sanity-rust/polywrap.yaml index 55eecfe9bc..ae4b4ebd7a 100644 --- a/packages/test-cases/cases/cli/codegen/wasm/002-sanity-rust/polywrap.yaml +++ b/packages/test-cases/cases/cli/codegen/wasm/002-sanity-rust/polywrap.yaml @@ -1,4 +1,4 @@ -format: 0.4.0 +format: 0.5.0 project: name: ObjectTypes type: wasm/rust @@ -6,4 +6,4 @@ source: schema: ./schema.graphql module: ./Cargo.toml extensions: - build: ./polywrap.build.yaml \ No newline at end of file + build: ./polywrap.build.yaml From 529e58f720b67ed5906b9c034c865a5c9a2d21cd Mon Sep 17 00:00:00 2001 From: Pileks Date: Fri, 14 Jul 2023 13:13:29 +0200 Subject: [PATCH 128/181] lint and fix imports --- packages/cli/src/lib/test-env/client-config.ts | 2 +- packages/schema/bind/src/bindings/wrap-bindgen.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/cli/src/lib/test-env/client-config.ts b/packages/cli/src/lib/test-env/client-config.ts index 0d57280934..47ea1ad141 100644 --- a/packages/cli/src/lib/test-env/client-config.ts +++ b/packages/cli/src/lib/test-env/client-config.ts @@ -12,7 +12,7 @@ import { ethereumProviderPlugin, Connections, Connection, -} from "@polywrap/ethereum-provider-js-v1"; +} from "@polywrap/ethereum-provider-js"; import { IWrapPackage } from "@polywrap/core-js"; export function getTestEnvClientConfig(): Partial { diff --git a/packages/schema/bind/src/bindings/wrap-bindgen.ts b/packages/schema/bind/src/bindings/wrap-bindgen.ts index b11a136ee7..a1498cc8a1 100644 --- a/packages/schema/bind/src/bindings/wrap-bindgen.ts +++ b/packages/schema/bind/src/bindings/wrap-bindgen.ts @@ -4,7 +4,7 @@ import { Args_generateBindings, GenerateBindingFn, Output } from "./types"; import { PolywrapClient, ExtendableUriResolver, - PolywrapClientConfigBuilder + PolywrapClientConfigBuilder, } from "@polywrap/client-js"; import { OutputEntry } from "@polywrap/os-js"; From cae7946b44f1b9f8290e220cc4bb6e5fc2621a4d Mon Sep 17 00:00:00 2001 From: Pileks Date: Fri, 14 Jul 2023 13:15:16 +0200 Subject: [PATCH 129/181] ignore generated URI.txt in deploy test cases --- packages/test-cases/cases/cli/deploy/.gitignore | 1 + packages/test-cases/cases/cli/deploy/001-sanity/URI.txt | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 packages/test-cases/cases/cli/deploy/.gitignore delete mode 100644 packages/test-cases/cases/cli/deploy/001-sanity/URI.txt diff --git a/packages/test-cases/cases/cli/deploy/.gitignore b/packages/test-cases/cases/cli/deploy/.gitignore new file mode 100644 index 0000000000..8348879d7f --- /dev/null +++ b/packages/test-cases/cases/cli/deploy/.gitignore @@ -0,0 +1 @@ +URI.txt \ No newline at end of file diff --git a/packages/test-cases/cases/cli/deploy/001-sanity/URI.txt b/packages/test-cases/cases/cli/deploy/001-sanity/URI.txt deleted file mode 100644 index 8f865f00c3..0000000000 --- a/packages/test-cases/cases/cli/deploy/001-sanity/URI.txt +++ /dev/null @@ -1 +0,0 @@ -wrap://ens/testnet/test2.eth \ No newline at end of file From 518880928c6cf1f269ca09027486954a57be2a86 Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Fri, 14 Jul 2023 19:42:55 +0800 Subject: [PATCH 130/181] fix: golang build --- .../wasm/golang/image/Dockerfile.mustache | 20 +++++++++++++++---- .../wasm/golang/local/local.sh | 20 +++++++++++++++---- .../wasm/golang/vm/vm-script.mustache | 20 +++++++++++++++---- 3 files changed, 48 insertions(+), 12 deletions(-) diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache index 94f435f6fe..91f31b1e16 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache @@ -24,8 +24,14 @@ RUN EXTRA_EXPORTS=$( \ grep -vE '_wrap_invoke|asyncify_start_unwind|asyncify_stop_unwind|asyncify_start_rewind|asyncify_stop_rewind|asyncify_get_state' | \ # 4. convert remaining string into single-line seperated by spaces tr '\n' ' ') && \ -# Remove these extra exports from the wasm module via wasm-snip -wasm-snip ./build-staging/module.wasm -o ./build-staging/module_exports.wasm $EXTRA_EXPORTS + if [ -z "$EXTRA_EXPORTS" ]\ + then\ + echo "No extra exports to remove"\ + else\ + echo "Removing extra exports: $EXTRA_EXPORTS"\ + # Remove these extra exports from the wasm module via wasm-snip + wasm-snip ./build-staging/module.wasm -o ./build-staging/module_exports.wasm $EXTRA_EXPORTS\ + fi # Extract the unsupported wasi imports, and forcefully remove them. # This ideally would not be necessary, but it is for go-based wraps. @@ -36,8 +42,14 @@ RUN EXTRA_IMPORTS=$( \ grep -oP '(?<=wasi_snapshot_preview1" ")[^"]+' | \ # 3. convert string into single-line seperated by spaces tr '\n' ' ') && \ -# Remove these extra imports from the wasm module via wasm-snip -wasm-snip ./build-staging/module_exports.wasm -o ./build-staging/module_exports_imports.wasm -p $EXTRA_IMPORTS + if [ -z "$EXTRA_IMPORTS" ] \ + then\ + echo "No extra imports to remove"\ + else\ + echo "Removing extra imports: $EXTRA_IMPORTS"\ + # Remove these extra imports from the wasm module via wasm-snip + wasm-snip ./build-staging/module_exports.wasm -o ./build-staging/module_exports_imports.wasm -p $EXTRA_IMPORTS\ + fi # Optimize the module now that exports & imports are removed RUN wasm-opt ./build-staging/module_exports_imports.wasm -Oz --converge -o ./build-staging/module_exports_imports_opt.wasm diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh index 44fa16869e..c958a3389c 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh @@ -20,8 +20,14 @@ EXTRA_EXPORTS=$( tr '\n' ' ' ) -# Remove these extra exports from the wasm module via wasm-snip -wasm-snip ./build-staging/module.wasm -o ./build-staging/module_exports.wasm $EXTRA_EXPORTS +if [ -z "$EXTRA_EXPORTS" ] +then + echo "No extra exports to remove" +else + echo "Removing extra exports: $EXTRA_EXPORTS" + # Remove these extra exports from the wasm module via wasm-snip + wasm-snip ./build-staging/module.wasm -o ./build-staging/module_exports.wasm $EXTRA_EXPORTS +fi # Extract the unsupported wasi imports, and forcefully remove them. # This ideally would not be necessary, but it is for go-based wraps. @@ -34,8 +40,14 @@ EXTRA_IMPORTS=$( tr '\n' ' ' ) -# Remove these extra imports from the wasm module via wasm-snip -wasm-snip ./build-staging/module_exports.wasm -o ./build-staging/module_exports_imports.wasm -p $EXTRA_IMPORTS +if [ -z "$EXTRA_IMPORTS" ] +then + echo "No extra imports to remove" +else + echo "Removing extra imports: $EXTRA_IMPORTS" + # Remove these extra imports from the wasm module via wasm-snip + wasm-snip ./build-staging/module_exports.wasm -o ./build-staging/module_exports_imports.wasm -p $EXTRA_IMPORTS +fi # Optimize the module now that exports & imports are removed wasm-opt ./build-staging/module_exports_imports.wasm -Oz --converge -o ./build-staging/module_exports_imports_opt.wasm diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache index e8acd36332..647b0677ad 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache @@ -22,8 +22,14 @@ EXTRA_EXPORTS=$( tr '\n' ' ' ) -# Remove these extra exports from the wasm module via wasm-snip -wasm-snip ./build-staging/module.wasm -o ./build-staging/module_exports.wasm $EXTRA_EXPORTS +if [ -z "$EXTRA_EXPORTS" ] +then + echo "No extra exports to remove" +else + echo "Removing extra exports: $EXTRA_EXPORTS" + # Remove these extra exports from the wasm module via wasm-snip + wasm-snip ./build-staging/module.wasm -o ./build-staging/module_exports.wasm $EXTRA_EXPORTS +fi # Extract the unsupported wasi imports, and forcefully remove them. # This ideally would not be necessary, but it is for go-based wraps. @@ -36,8 +42,14 @@ EXTRA_IMPORTS=$( tr '\n' ' ' ) -# Remove these extra imports from the wasm module via wasm-snip -wasm-snip ./build-staging/module_exports.wasm -o ./build-staging/module_exports_imports.wasm -p $EXTRA_IMPORTS +if [ -z "$EXTRA_IMPORTS" ] +then + echo "No extra imports to remove" +else + echo "Removing extra imports: $EXTRA_IMPORTS" + # Remove these extra imports from the wasm module via wasm-snip + wasm-snip ./build-staging/module_exports.wasm -o ./build-staging/module_exports_imports.wasm -p $EXTRA_IMPORTS +fi # Optimize the module now that exports & imports are removed wasm-opt ./build-staging/module_exports_imports.wasm -Oz --converge -o ./build-staging/module_exports_imports_opt.wasm From 29087561831366a931f75b898490841385c475b5 Mon Sep 17 00:00:00 2001 From: Pileks Date: Fri, 14 Jul 2023 16:06:02 +0200 Subject: [PATCH 131/181] fix build issues --- packages/cli/src/commands/docs.ts | 6 +++--- .../cli/src/lib/option-defaults/defaultManifestFiles.ts | 4 ++-- packages/cli/src/lib/project/manifests/polywrap/load.ts | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/cli/src/commands/docs.ts b/packages/cli/src/commands/docs.ts index bafa87c9df..7c1d9e54f9 100644 --- a/packages/cli/src/commands/docs.ts +++ b/packages/cli/src/commands/docs.ts @@ -1,6 +1,6 @@ import { defaultDocsManifest, - defaultPolywrapManifest, + defaultPolywrapManifestFiles, intlMsg, parseLogFileOption, parseManifestFileOption, @@ -12,7 +12,7 @@ import { createLogger } from "./utils/createLogger"; import fse from "fs-extra"; const pathStr = intlMsg.commands_docs_init_m_path(); -const defaultManifestStr = defaultPolywrapManifest.join(" | "); +const defaultManifestStr = defaultPolywrapManifestFiles.join(" | "); export interface DocsInitCommandOptions extends BaseCommandOptions { manifestFile: string; @@ -44,7 +44,7 @@ export const docs: Command = { await runDocsInitCommand({ manifestFile: parseManifestFileOption( options.manifestFile, - defaultPolywrapManifest + defaultPolywrapManifestFiles ), dir: options.dir || false, force: options.force || false, diff --git a/packages/cli/src/lib/option-defaults/defaultManifestFiles.ts b/packages/cli/src/lib/option-defaults/defaultManifestFiles.ts index d27d42ed40..863bd333af 100644 --- a/packages/cli/src/lib/option-defaults/defaultManifestFiles.ts +++ b/packages/cli/src/lib/option-defaults/defaultManifestFiles.ts @@ -1,14 +1,14 @@ import { defaultAppManifest, defaultPluginManifest, - defaultPolywrapManifest, + defaultPolywrapManifestFiles, } from "../project"; const filterUniqueFn = (value: string, index: number, self: Array) => self.indexOf(value) === index; export const defaultProjectManifestFiles = [ - ...defaultPolywrapManifest, + ...defaultPolywrapManifestFiles, ...defaultAppManifest, ...defaultPluginManifest, ].filter(filterUniqueFn); diff --git a/packages/cli/src/lib/project/manifests/polywrap/load.ts b/packages/cli/src/lib/project/manifests/polywrap/load.ts index 30b1dd415d..916735ab00 100644 --- a/packages/cli/src/lib/project/manifests/polywrap/load.ts +++ b/packages/cli/src/lib/project/manifests/polywrap/load.ts @@ -124,7 +124,7 @@ export const defaultDeployManifestFiles = [ ]; export const defaultDeployManifest: DeployManifest = { - format: "0.3.0", + format: "0.4.0", jobs: { ipfs_deploy: { steps: [{ From 8b13ffc78be83d7f9da971b8bc8726646749753a Mon Sep 17 00:00:00 2001 From: Pileks Date: Fri, 14 Jul 2023 17:10:06 +0200 Subject: [PATCH 132/181] add test for loading of default deploy manifest --- .../__tests__/unit/deploy-manifest.spec.ts | 11 ++++++ .../lib/project/manifests/polywrap/load.ts | 35 +++++++++++-------- 2 files changed, 32 insertions(+), 14 deletions(-) create mode 100644 packages/cli/src/__tests__/unit/deploy-manifest.spec.ts diff --git a/packages/cli/src/__tests__/unit/deploy-manifest.spec.ts b/packages/cli/src/__tests__/unit/deploy-manifest.spec.ts new file mode 100644 index 0000000000..483c3b8d1b --- /dev/null +++ b/packages/cli/src/__tests__/unit/deploy-manifest.spec.ts @@ -0,0 +1,11 @@ +import { defaultDeployManifest, loadDeployManifest, Logger } from "../../lib"; + +describe("default deploy manifest", () => { + const logger = new Logger({}); + + it("should load a default deploy manifest when none exists", async () => { + const manifest = await loadDeployManifest("polywrap.deploy.yaml", logger); + + expect(manifest).toEqual(defaultDeployManifest); + }); +}); diff --git a/packages/cli/src/lib/project/manifests/polywrap/load.ts b/packages/cli/src/lib/project/manifests/polywrap/load.ts index 916735ab00..d1df3d4901 100644 --- a/packages/cli/src/lib/project/manifests/polywrap/load.ts +++ b/packages/cli/src/lib/project/manifests/polywrap/load.ts @@ -127,17 +127,19 @@ export const defaultDeployManifest: DeployManifest = { format: "0.4.0", jobs: { ipfs_deploy: { - steps: [{ - name: "deploy to ipfs.wrappers.io", - package: "ipfs", - uri: "file/./build", - config: { - gatewayUri: "https://ipfs.wrappers.io" - } - }] - } + steps: [ + { + name: "deploy to ipfs.wrappers.io", + package: "ipfs", + uri: "file/./build", + config: { + gatewayUri: "https://ipfs.wrappers.io", + }, + }, + ], + }, }, - __type: "DeployManifest" + __type: "DeployManifest", }; export async function loadDeployManifest( @@ -145,12 +147,17 @@ export async function loadDeployManifest( logger: Logger ): Promise { const run = (): Promise => { - const manifest = fs.readFileSync(manifestPath, "utf-8"); - - if (!manifest) { + let manifest: string; + try { + manifest = fs.readFileSync(manifestPath, "utf-8"); + } catch { // If the manifest wasn't found, and it was a default path, // assume we should fallback to a default manifest. - if (defaultDeployManifestFiles.includes(manifestPath)) { + if ( + defaultDeployManifestFiles + .map((x) => displayPath(x)) + .includes(manifestPath) + ) { return Promise.resolve(defaultDeployManifest); } From 485de45b0024f812ffc68fec04d1981331e4120e Mon Sep 17 00:00:00 2001 From: Pileks Date: Fri, 14 Jul 2023 17:18:18 +0200 Subject: [PATCH 133/181] chore:lint --- packages/cli/src/commands/manifest.ts | 20 +++++++++++++++---- .../lib/project/manifests/polywrap/load.ts | 2 ++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/packages/cli/src/commands/manifest.ts b/packages/cli/src/commands/manifest.ts index 7af365bf06..19a476bd89 100644 --- a/packages/cli/src/commands/manifest.ts +++ b/packages/cli/src/commands/manifest.ts @@ -474,7 +474,10 @@ const runMigrateCommand = async ( logger ); migrateManifestFile( - parseManifestFileOption(options.manifestFile, defaultBuildManifestFiles), + parseManifestFileOption( + options.manifestFile, + defaultBuildManifestFiles + ), migrateBuildExtensionManifest, options.format || latestBuildManifestFormat, logger @@ -488,7 +491,10 @@ const runMigrateCommand = async ( logger ); migrateManifestFile( - parseManifestFileOption(options.manifestFile, defaultDeployManifestFiles), + parseManifestFileOption( + options.manifestFile, + defaultDeployManifestFiles + ), migrateDeployExtensionManifest, options.format || latestDeployManifestFormat, logger @@ -502,7 +508,10 @@ const runMigrateCommand = async ( logger ); migrateManifestFile( - parseManifestFileOption(options.manifestFile, defaultInfraManifestFiles), + parseManifestFileOption( + options.manifestFile, + defaultInfraManifestFiles + ), migrateInfraExtensionManifest, options.format || latestInfraManifestFormat, logger @@ -516,7 +525,10 @@ const runMigrateCommand = async ( logger ); migrateManifestFile( - parseManifestFileOption(options.manifestFile, defaultWorkflowManifestFiles), + parseManifestFileOption( + options.manifestFile, + defaultWorkflowManifestFiles + ), migrateWorkflow, options.format || latestPolywrapWorkflowFormat, logger diff --git a/packages/cli/src/lib/project/manifests/polywrap/load.ts b/packages/cli/src/lib/project/manifests/polywrap/load.ts index d1df3d4901..eaf18b2db2 100644 --- a/packages/cli/src/lib/project/manifests/polywrap/load.ts +++ b/packages/cli/src/lib/project/manifests/polywrap/load.ts @@ -126,6 +126,7 @@ export const defaultDeployManifestFiles = [ export const defaultDeployManifest: DeployManifest = { format: "0.4.0", jobs: { + // eslint-disable-next-line @typescript-eslint/naming-convention ipfs_deploy: { steps: [ { @@ -139,6 +140,7 @@ export const defaultDeployManifest: DeployManifest = { ], }, }, + // eslint-disable-next-line @typescript-eslint/naming-convention __type: "DeployManifest", }; From c50c4d79a180ac5b20e552be0b546a59be6e6b57 Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Sat, 15 Jul 2023 13:44:39 +0800 Subject: [PATCH 134/181] wip: import fix --- .../src/bindings/golang/transforms/index.ts | 1 + .../transforms/moduleNeedsImportedTypes.ts | 74 +++++++++++++++++++ .../bind/src/bindings/golang/wasm/index.ts | 1 + .../%type%Serialization-go.mustache | 6 +- 4 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 packages/schema/bind/src/bindings/golang/transforms/moduleNeedsImportedTypes.ts diff --git a/packages/schema/bind/src/bindings/golang/transforms/index.ts b/packages/schema/bind/src/bindings/golang/transforms/index.ts index 7533ca0186..c1d98bed8c 100644 --- a/packages/schema/bind/src/bindings/golang/transforms/index.ts +++ b/packages/schema/bind/src/bindings/golang/transforms/index.ts @@ -1 +1,2 @@ export * from "./moduleNeedsTypes"; +export * from "./moduleNeedsImportedTypes"; diff --git a/packages/schema/bind/src/bindings/golang/transforms/moduleNeedsImportedTypes.ts b/packages/schema/bind/src/bindings/golang/transforms/moduleNeedsImportedTypes.ts new file mode 100644 index 0000000000..76972aabec --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/transforms/moduleNeedsImportedTypes.ts @@ -0,0 +1,74 @@ +/* eslint-disable @typescript-eslint/naming-convention */ +import { + ImportedEnumDefinition, + ImportedEnvDefinition, + ImportedModuleDefinition, + ImportedObjectDefinition, + MethodDefinition, + ModuleDefinition, +} from "@polywrap/wrap-manifest-types-js"; +import { AbiTransforms } from "@polywrap/schema-parse"; + +interface ModuleNeedsTypesState { + needsImportedNamespaces: Set; + importedTypes: Map; +} + +export function moduleNeedsImportedTypes(): AbiTransforms { + const state: ModuleNeedsTypesState = { + importedTypes: new Map(), + needsImportedNamespaces: new Set(), + }; + + return { + enter: { + ImportedEnumDefinition: (def: ImportedEnumDefinition) => { + state.importedTypes.set(def.type, def.namespace); + return def; + }, + ImportedEnvDefinition: (def: ImportedEnvDefinition) => { + state.importedTypes.set(def.type, def.namespace); + return def; + }, + ImportedModuleDefinition: (def: ImportedModuleDefinition) => { + state.importedTypes.set(def.type, def.namespace); + return def; + }, + ImportedObjectDefinition: (def: ImportedObjectDefinition) => { + state.importedTypes.set(def.type, def.namespace); + return def; + }, + MethodDefinition: (def: MethodDefinition) => { + if (def.arguments && def.arguments.length > 0) { + for (const arg of def.arguments) { + const argType = arg.type; + const importNamespace = state.importedTypes.get(argType); + if (importNamespace) { + state.needsImportedNamespaces.add(importNamespace); + } + } + } + + if (def.return) { + const returnType = def.return.type; + const importNamespace = state.importedTypes.get(returnType); + if (importNamespace) { + state.needsImportedNamespaces.add(importNamespace); + } + } + return def; + }, + }, + leave: { + ModuleDefinition: (def: ModuleDefinition) => { + const needsImportedNamespaces = state.needsImportedNamespaces; + state.needsImportedNamespaces = new Set(); + state.importedTypes = new Map(); + return { + ...def, + needsImportedNamespaces, + }; + }, + }, + }; +} diff --git a/packages/schema/bind/src/bindings/golang/wasm/index.ts b/packages/schema/bind/src/bindings/golang/wasm/index.ts index c6a5e89945..eda507632c 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm/index.ts @@ -272,6 +272,7 @@ function applyTransforms(abi: Abi): Abi { addFirstLast, toPrefixedGraphQLType, Transforms.moduleNeedsTypes(), + Transforms.moduleNeedsImportedTypes(), ]; for (const transform of transforms) { diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache index 9f6defac57..01f436ee0d 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache @@ -4,9 +4,9 @@ package module_wrapped {{#needsTypes}} . {{goImport}}/module/wrap/types, {{/needsTypes}} - {{#importedTypes}} - . {{goImport}}/module/wrap/imported/{{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}}, - {{/importedTypes}} + {{#needsImportedTypes}} + . {{goImport}}/module/wrap/imported/{{#pkgName}}{{#toSnakeCase}}{{.}}{{/toSnakeCase}}{{/pkgName}}, + {{/needsImportedTypes}} {{#methods}} {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, {{/methods}} From 50e1ecffdfa00578eab5078c5ebb7815a8454f2e Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Sun, 16 Jul 2023 11:52:54 +0200 Subject: [PATCH 135/181] chore: fix image docker file --- .../wasm/golang/image/Dockerfile.mustache | 48 ++++++++++--------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache index 91f31b1e16..10d7680716 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache @@ -15,40 +15,44 @@ RUN mkdir ./build-staging RUN tinygo build -o ./build-staging/module.wasm -target wasm-target ./module/wrap/main/main.go # Extract the names of all "extra" exports from the wasm module -RUN EXTRA_EXPORTS=$( \ - # 1. convert to wasm text - wasm2wat ./build-staging/module.wasm | \ +# 1. convert to wasm text +RUN wasm2wat ./build-staging/module.wasm | \ # 2. extract all exports grep -oP '(?<=export ")[^"]+' | \ # 3. keep all necessary exports (wrap & asyncify) grep -vE '_wrap_invoke|asyncify_start_unwind|asyncify_stop_unwind|asyncify_start_rewind|asyncify_stop_rewind|asyncify_get_state' | \ # 4. convert remaining string into single-line seperated by spaces - tr '\n' ' ') && \ - if [ -z "$EXTRA_EXPORTS" ]\ - then\ - echo "No extra exports to remove"\ - else\ - echo "Removing extra exports: $EXTRA_EXPORTS"\ - # Remove these extra exports from the wasm module via wasm-snip - wasm-snip ./build-staging/module.wasm -o ./build-staging/module_exports.wasm $EXTRA_EXPORTS\ + tr '\n' ' ' \ + # Finally, write the result to a file + >> ./build-staging/EXTRA_EXPORTS + +# Remove the extra exports from the wasm module via wasm-snip (if they exist) +RUN if [ ! -s ./build-staging/EXTRA_EXPORTS ]; then \ + echo "No extra exports to remove"; \ + else \ + EXTRA_EXPORTS=$(cat ./build-staging/EXTRA_EXPORTS); \ + echo "Removing extra exports: $EXTRA_EXPORTS"; \ + wasm-snip ./build-staging/module.wasm -o ./build-staging/module_exports.wasm $EXTRA_EXPORTS; \ fi # Extract the unsupported wasi imports, and forcefully remove them. # This ideally would not be necessary, but it is for go-based wraps. -RUN EXTRA_IMPORTS=$( \ - # 1. convert to wasm text - wasm2wat ./build-staging/module_exports.wasm | \ +# 1. convert to wasm text +RUN wasm2wat ./build-staging/module_exports.wasm | \ # 2. extract all wasi imports grep -oP '(?<=wasi_snapshot_preview1" ")[^"]+' | \ # 3. convert string into single-line seperated by spaces - tr '\n' ' ') && \ - if [ -z "$EXTRA_IMPORTS" ] \ - then\ - echo "No extra imports to remove"\ - else\ - echo "Removing extra imports: $EXTRA_IMPORTS"\ - # Remove these extra imports from the wasm module via wasm-snip - wasm-snip ./build-staging/module_exports.wasm -o ./build-staging/module_exports_imports.wasm -p $EXTRA_IMPORTS\ + tr '\n' ' ' \ + # Finally, write the result to a file + >> ./build-staging/EXTRA_IMPORTS + +# Remove the extra impors from the wasm module via wasm-snip (if they exist) +RUN if [ ! -s ./build-staging/EXTRA_IMPORTS ]; then \ + echo "No extra imports to remove"; \ + else \ + EXTRA_IMPORTS=$(cat ./build-staging/EXTRA_IMPORTS); \ + echo "Removing extra imports: $EXTRA_IMPORTS"; \ + wasm-snip ./build-staging/module_exports.wasm -o ./build-staging/module_exports_imports.wasm -p $EXTRA_IMPORTS; \ fi # Optimize the module now that exports & imports are removed From 0eeb1662678c83ddb6529142bd97e190e132cfce Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Sun, 16 Jul 2023 12:03:24 +0200 Subject: [PATCH 136/181] chore: minor fixes --- .../build-strategies/wasm/golang/image/Dockerfile.mustache | 2 ++ .../defaults/build-strategies/wasm/golang/vm/vm-script.mustache | 2 ++ 2 files changed, 4 insertions(+) diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache index 10d7680716..c6168ef9de 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/image/Dockerfile.mustache @@ -29,6 +29,7 @@ RUN wasm2wat ./build-staging/module.wasm | \ # Remove the extra exports from the wasm module via wasm-snip (if they exist) RUN if [ ! -s ./build-staging/EXTRA_EXPORTS ]; then \ echo "No extra exports to remove"; \ + cp ./build-staging/module.wasm ./build-staging/module_exports.wasm; \ else \ EXTRA_EXPORTS=$(cat ./build-staging/EXTRA_EXPORTS); \ echo "Removing extra exports: $EXTRA_EXPORTS"; \ @@ -49,6 +50,7 @@ RUN wasm2wat ./build-staging/module_exports.wasm | \ # Remove the extra impors from the wasm module via wasm-snip (if they exist) RUN if [ ! -s ./build-staging/EXTRA_IMPORTS ]; then \ echo "No extra imports to remove"; \ + cp ./build-staging/module_exports.wasm ./build-staging/module_exports_imports.wasm; \ else \ EXTRA_IMPORTS=$(cat ./build-staging/EXTRA_IMPORTS); \ echo "Removing extra imports: $EXTRA_IMPORTS"; \ diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache index 647b0677ad..959ef98fc4 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/vm/vm-script.mustache @@ -25,6 +25,7 @@ EXTRA_EXPORTS=$( if [ -z "$EXTRA_EXPORTS" ] then echo "No extra exports to remove" + cp ./build-staging/module.wasm ./build-staging/module_exports.wasm else echo "Removing extra exports: $EXTRA_EXPORTS" # Remove these extra exports from the wasm module via wasm-snip @@ -45,6 +46,7 @@ EXTRA_IMPORTS=$( if [ -z "$EXTRA_IMPORTS" ] then echo "No extra imports to remove" + cp ./build-staging/module_exports.wasm ./build-staging/module_exports_imports.wasm else echo "Removing extra imports: $EXTRA_IMPORTS" # Remove these extra imports from the wasm module via wasm-snip From 86b0b72841bdc9d5040cd7c54f76bfcfc5ee7fe9 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Sun, 16 Jul 2023 12:56:33 +0200 Subject: [PATCH 137/181] chore: fix templates test --- packages/templates/tests.spec.ts | 7 +++---- .../wasm/golang/module/__tests__/types/polywrap.app.yaml | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/templates/tests.spec.ts b/packages/templates/tests.spec.ts index 665d2b20fa..395fb12314 100644 --- a/packages/templates/tests.spec.ts +++ b/packages/templates/tests.spec.ts @@ -36,9 +36,8 @@ describe("Templates", () => { }, "plugin/rust": { codegen: "npx polywrap codegen", - // Uncomment after release of 0.10.3 - /*build: "cargo build", - test: "cargo test",*/ + build: "cargo build", + test: "cargo test", }, interface: { build: "npx polywrap build" }, }; @@ -92,7 +91,7 @@ describe("Templates", () => { beforeAll(() => { // Copy test configs - if (projectType === "wasm" && language !== "interface") { + if (projectType === "wasm" && language !== "interface" && language !== "golang") { execSync( `cp ${rootDir}/polywrap.${projectType}-${language}-linked* ${rootDir}/${projectType}/${language}/` ); diff --git a/packages/templates/wasm/golang/module/__tests__/types/polywrap.app.yaml b/packages/templates/wasm/golang/module/__tests__/types/polywrap.app.yaml index c084aed0f0..4259744c31 100644 --- a/packages/templates/wasm/golang/module/__tests__/types/polywrap.app.yaml +++ b/packages/templates/wasm/golang/module/__tests__/types/polywrap.app.yaml @@ -1,4 +1,4 @@ -format: 0.3.0 +format: 0.4.0 project: name: sample-typescript-type-generation type: app/typescript From f03f4b27a0f0347286d56d0b2c26cd332cd5c748 Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Sun, 16 Jul 2023 22:12:38 +0800 Subject: [PATCH 138/181] fix: needed imported bindings in golang --- .../transforms/moduleNeedsImportedTypes.ts | 87 +++++++++++++++---- .../bind/src/bindings/golang/wasm/index.ts | 4 +- .../%type%Serialization-go.mustache | 4 +- 3 files changed, 76 insertions(+), 19 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/transforms/moduleNeedsImportedTypes.ts b/packages/schema/bind/src/bindings/golang/transforms/moduleNeedsImportedTypes.ts index 76972aabec..05b6d37d6a 100644 --- a/packages/schema/bind/src/bindings/golang/transforms/moduleNeedsImportedTypes.ts +++ b/packages/schema/bind/src/bindings/golang/transforms/moduleNeedsImportedTypes.ts @@ -1,5 +1,6 @@ /* eslint-disable @typescript-eslint/naming-convention */ import { + Abi, ImportedEnumDefinition, ImportedEnvDefinition, ImportedModuleDefinition, @@ -9,61 +10,115 @@ import { } from "@polywrap/wrap-manifest-types-js"; import { AbiTransforms } from "@polywrap/schema-parse"; -interface ModuleNeedsTypesState { - needsImportedNamespaces: Set; +interface ImportedTypesState { importedTypes: Map; } -export function moduleNeedsImportedTypes(): AbiTransforms { - const state: ModuleNeedsTypesState = { +interface ModuleNeedsImportedTypesState extends ImportedTypesState { + needsImportedNamespaces: Set; +} + +export function extractImportedTypes(): AbiTransforms { + const state: ImportedTypesState = { importedTypes: new Map(), - needsImportedNamespaces: new Set(), }; return { enter: { ImportedEnumDefinition: (def: ImportedEnumDefinition) => { - state.importedTypes.set(def.type, def.namespace); + state.importedTypes = state.importedTypes.set(def.type, def.namespace); return def; }, ImportedEnvDefinition: (def: ImportedEnvDefinition) => { - state.importedTypes.set(def.type, def.namespace); + state.importedTypes = state.importedTypes.set(def.type, def.namespace); return def; }, ImportedModuleDefinition: (def: ImportedModuleDefinition) => { - state.importedTypes.set(def.type, def.namespace); + state.importedTypes = state.importedTypes.set(def.type, def.namespace); return def; }, ImportedObjectDefinition: (def: ImportedObjectDefinition) => { - state.importedTypes.set(def.type, def.namespace); + state.importedTypes = state.importedTypes.set(def.type, def.namespace); return def; }, + }, + leave: { + Abi(abi: Abi) { + return { + ...abi, + _importedTypes: state.importedTypes, + }; + }, + }, + }; +} + +export function extractNeededImportedNamespaces(): AbiTransforms { + const state: ModuleNeedsImportedTypesState = { + importedTypes: new Map(), + needsImportedNamespaces: new Set(), + }; + + return { + enter: { + Abi: (abi: Abi) => { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + state.importedTypes = abi._importedTypes; + return abi; + }, MethodDefinition: (def: MethodDefinition) => { if (def.arguments && def.arguments.length > 0) { for (const arg of def.arguments) { const argType = arg.type; - const importNamespace = state.importedTypes.get(argType); + const importNamespace = state.importedTypes?.get(argType); if (importNamespace) { - state.needsImportedNamespaces.add(importNamespace); + state.needsImportedNamespaces?.add(importNamespace); } } } if (def.return) { const returnType = def.return.type; - const importNamespace = state.importedTypes.get(returnType); + const importNamespace = state.importedTypes?.get(returnType); if (importNamespace) { - state.needsImportedNamespaces.add(importNamespace); + state.needsImportedNamespaces?.add(importNamespace); } } return def; }, }, + leave: { + Abi: (abi: Abi) => { + return { + ...abi, + _needsImportedNamespaces: state.needsImportedNamespaces, + }; + }, + }, + }; +} + +export function needsImportedNamespaces(): AbiTransforms { + const state: ModuleNeedsImportedTypesState = { + importedTypes: new Map(), + needsImportedNamespaces: new Set(), + }; + + return { + enter: { + Abi: (abi: Abi) => { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + state.needsImportedNamespaces = abi._needsImportedNamespaces; + return abi; + }, + }, leave: { ModuleDefinition: (def: ModuleDefinition) => { - const needsImportedNamespaces = state.needsImportedNamespaces; - state.needsImportedNamespaces = new Set(); - state.importedTypes = new Map(); + const needsImportedNamespaces = Array.from( + state.needsImportedNamespaces + ); return { ...def, needsImportedNamespaces, diff --git a/packages/schema/bind/src/bindings/golang/wasm/index.ts b/packages/schema/bind/src/bindings/golang/wasm/index.ts index eda507632c..27033fb91d 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm/index.ts @@ -272,7 +272,9 @@ function applyTransforms(abi: Abi): Abi { addFirstLast, toPrefixedGraphQLType, Transforms.moduleNeedsTypes(), - Transforms.moduleNeedsImportedTypes(), + Transforms.extractImportedTypes(), + Transforms.extractNeededImportedNamespaces(), + Transforms.needsImportedNamespaces(), ]; for (const transform of transforms) { diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache index 01f436ee0d..57d8c176e6 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Serialization-go.mustache @@ -4,9 +4,9 @@ package module_wrapped {{#needsTypes}} . {{goImport}}/module/wrap/types, {{/needsTypes}} - {{#needsImportedTypes}} + {{#needsImportedNamespaces}} . {{goImport}}/module/wrap/imported/{{#pkgName}}{{#toSnakeCase}}{{.}}{{/toSnakeCase}}{{/pkgName}}, - {{/needsImportedTypes}} + {{/needsImportedNamespaces}} {{#methods}} {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, {{/methods}} From c79121c48b0bd3abe667785787b1c23d765c7d69 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Sun, 16 Jul 2023 10:24:20 -0400 Subject: [PATCH 139/181] fix: go codegen properly formats serialized properties --- .../Env%type%Serialization-go.mustache | 4 +- .../Env%type%Serialization-go.mustache | 4 +- .../Object%type%Serialization-go.mustache | 4 +- .../Object%type%Serialization-go.mustache | 4 +- .../module/__tests__/e2e/integration.spec.ts | 2 + .../env_test_import__env_serialization.go | 32 ++-- ...st_import__another_object_serialization.go | 4 +- ...bject_test_import__object_serialization.go | 32 ++-- .../object_another_type_serialization.go | 12 +- .../object_custom_map_value_serialization.go | 4 +- .../types/object_custom_type_serialization.go | 164 +++++++++--------- .../wrap-go/types/object_env_serialization.go | 12 +- .../wrap-go/types/objectelse_serialization.go | 4 +- 13 files changed, 142 insertions(+), 140 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache index 03f0b548fa..903b26da04 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache @@ -12,8 +12,8 @@ func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toU func write{{#toUpper}}{{type}}{{/toUpper}}(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { writer.WriteMapLength({{properties.length}}) {{#properties}} - writer.Context().Push("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") - writer.WriteString("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}") + writer.Context().Push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + writer.WriteString("{{name}}") {{#scalar}} {{> serialize_scalar}} {{/scalar}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache index 0b03fc04e1..d84030967a 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache @@ -15,8 +15,8 @@ func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toU func write{{#toUpper}}{{type}}{{/toUpper}}(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { writer.WriteMapLength({{properties.length}}) {{#properties}} - writer.Context().Push("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") - writer.WriteString("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}") + writer.Context().Push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + writer.WriteString("{{name}}") {{#scalar}} {{> serialize_scalar}} {{/scalar}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache index 4620a8e956..d584c641cc 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache @@ -15,8 +15,8 @@ func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toU func write{{#toUpper}}{{type}}{{/toUpper}}(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { writer.WriteMapLength({{properties.length}}) {{#properties}} - writer.Context().Push("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") - writer.WriteString("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}") + writer.Context().Push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + writer.WriteString("{{name}}") {{#scalar}} {{> serialize_scalar}} {{/scalar}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache index b858842c79..de60363f36 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache @@ -15,8 +15,8 @@ func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toU func write{{#toUpper}}{{type}}{{/toUpper}}(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { writer.WriteMapLength({{properties.length}}) {{#properties}} - writer.Context().Push("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") - writer.WriteString("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}") + writer.Context().Push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + writer.WriteString("{{name}}") {{#scalar}} {{> serialize_scalar}} {{/scalar}} diff --git a/packages/templates/wasm/golang/module/__tests__/e2e/integration.spec.ts b/packages/templates/wasm/golang/module/__tests__/e2e/integration.spec.ts index 55913c174a..48be5b64d8 100644 --- a/packages/templates/wasm/golang/module/__tests__/e2e/integration.spec.ts +++ b/packages/templates/wasm/golang/module/__tests__/e2e/integration.spec.ts @@ -24,6 +24,8 @@ describe("Template Wrapper End to End Tests", () => { args: { arg: expected } }); + console.log(result); + expect(result.ok).toBeTruthy(); if (!result.ok) return; expect(result.value.result).toEqual(expected); diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/env_test_import__env_serialization.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/env_test_import__env_serialization.go index 4d9e11029c..1020a49736 100644 --- a/packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/env_test_import__env_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/env_test_import__env_serialization.go @@ -13,22 +13,22 @@ func serializeTestImport_Env(value *TestImport_Env) []byte { func writeTestImport_Env(writer msgpack.Write, value *TestImport_Env) { writer.WriteMapLength(8) - writer.Context().Push("Object", "TestImport_AnotherObject", "writing property") - writer.WriteString("Object") + writer.Context().Push("object", "TestImport_AnotherObject", "writing property") + writer.WriteString("object") { v := value.Object TestImport_AnotherObjectWrite(writer, &v) } writer.Context().Pop() - writer.Context().Push("OptObject", "*TestImport_AnotherObject", "writing property") - writer.WriteString("OptObject") + writer.Context().Push("optObject", "*TestImport_AnotherObject", "writing property") + writer.WriteString("optObject") { v := value.OptObject TestImport_AnotherObjectWrite(writer, v) } writer.Context().Pop() - writer.Context().Push("ObjectArray", "[]TestImport_AnotherObject", "writing property") - writer.WriteString("ObjectArray") + writer.Context().Push("objectArray", "[]TestImport_AnotherObject", "writing property") + writer.WriteString("objectArray") if value.ObjectArray == nil { writer.WriteNil() } else if len(value.ObjectArray) == 0 { @@ -43,8 +43,8 @@ func writeTestImport_Env(writer msgpack.Write, value *TestImport_Env) { } } writer.Context().Pop() - writer.Context().Push("OptObjectArray", "[]*TestImport_AnotherObject", "writing property") - writer.WriteString("OptObjectArray") + writer.Context().Push("optObjectArray", "[]*TestImport_AnotherObject", "writing property") + writer.WriteString("optObjectArray") if value.OptObjectArray == nil { writer.WriteNil() } else if len(value.OptObjectArray) == 0 { @@ -59,15 +59,15 @@ func writeTestImport_Env(writer msgpack.Write, value *TestImport_Env) { } } writer.Context().Pop() - writer.Context().Push("En", "TestImport_Enum", "writing property") - writer.WriteString("En") + writer.Context().Push("en", "TestImport_Enum", "writing property") + writer.WriteString("en") { v := value.En writer.WriteI32(int32(v)) } writer.Context().Pop() - writer.Context().Push("OptEnum", "*TestImport_Enum", "writing property") - writer.WriteString("OptEnum") + writer.Context().Push("optEnum", "*TestImport_Enum", "writing property") + writer.WriteString("optEnum") { v := value.OptEnum if v == nil { @@ -77,8 +77,8 @@ func writeTestImport_Env(writer msgpack.Write, value *TestImport_Env) { } } writer.Context().Pop() - writer.Context().Push("EnumArray", "[]TestImport_Enum", "writing property") - writer.WriteString("EnumArray") + writer.Context().Push("enumArray", "[]TestImport_Enum", "writing property") + writer.WriteString("enumArray") if value.EnumArray == nil { writer.WriteNil() } else if len(value.EnumArray) == 0 { @@ -93,8 +93,8 @@ func writeTestImport_Env(writer msgpack.Write, value *TestImport_Env) { } } writer.Context().Pop() - writer.Context().Push("OptEnumArray", "[]*TestImport_Enum", "writing property") - writer.WriteString("OptEnumArray") + writer.Context().Push("optEnumArray", "[]*TestImport_Enum", "writing property") + writer.WriteString("optEnumArray") if value.OptEnumArray == nil { writer.WriteNil() } else if len(value.OptEnumArray) == 0 { diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/object_test_import__another_object_serialization.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/object_test_import__another_object_serialization.go index a92be912ea..019cc8ad67 100644 --- a/packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/object_test_import__another_object_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/object_test_import__another_object_serialization.go @@ -13,8 +13,8 @@ func serializeTestImport_AnotherObject(value *TestImport_AnotherObject) []byte { func writeTestImport_AnotherObject(writer msgpack.Write, value *TestImport_AnotherObject) { writer.WriteMapLength(1) - writer.Context().Push("Prop", "string", "writing property") - writer.WriteString("Prop") + writer.Context().Push("prop", "string", "writing property") + writer.WriteString("prop") { v := value.Prop writer.WriteString(v) diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/object_test_import__object_serialization.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/object_test_import__object_serialization.go index 14a99ed24e..ef21ee4bfc 100644 --- a/packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/object_test_import__object_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/object_test_import__object_serialization.go @@ -13,22 +13,22 @@ func serializeTestImport_Object(value *TestImport_Object) []byte { func writeTestImport_Object(writer msgpack.Write, value *TestImport_Object) { writer.WriteMapLength(8) - writer.Context().Push("Object", "TestImport_AnotherObject", "writing property") - writer.WriteString("Object") + writer.Context().Push("object", "TestImport_AnotherObject", "writing property") + writer.WriteString("object") { v := value.Object TestImport_AnotherObjectWrite(writer, &v) } writer.Context().Pop() - writer.Context().Push("OptObject", "*TestImport_AnotherObject", "writing property") - writer.WriteString("OptObject") + writer.Context().Push("optObject", "*TestImport_AnotherObject", "writing property") + writer.WriteString("optObject") { v := value.OptObject TestImport_AnotherObjectWrite(writer, v) } writer.Context().Pop() - writer.Context().Push("ObjectArray", "[]TestImport_AnotherObject", "writing property") - writer.WriteString("ObjectArray") + writer.Context().Push("objectArray", "[]TestImport_AnotherObject", "writing property") + writer.WriteString("objectArray") if value.ObjectArray == nil { writer.WriteNil() } else if len(value.ObjectArray) == 0 { @@ -43,8 +43,8 @@ func writeTestImport_Object(writer msgpack.Write, value *TestImport_Object) { } } writer.Context().Pop() - writer.Context().Push("OptObjectArray", "[]*TestImport_AnotherObject", "writing property") - writer.WriteString("OptObjectArray") + writer.Context().Push("optObjectArray", "[]*TestImport_AnotherObject", "writing property") + writer.WriteString("optObjectArray") if value.OptObjectArray == nil { writer.WriteNil() } else if len(value.OptObjectArray) == 0 { @@ -59,15 +59,15 @@ func writeTestImport_Object(writer msgpack.Write, value *TestImport_Object) { } } writer.Context().Pop() - writer.Context().Push("En", "TestImport_Enum", "writing property") - writer.WriteString("En") + writer.Context().Push("en", "TestImport_Enum", "writing property") + writer.WriteString("en") { v := value.En writer.WriteI32(int32(v)) } writer.Context().Pop() - writer.Context().Push("OptEnum", "*TestImport_Enum", "writing property") - writer.WriteString("OptEnum") + writer.Context().Push("optEnum", "*TestImport_Enum", "writing property") + writer.WriteString("optEnum") { v := value.OptEnum if v == nil { @@ -77,8 +77,8 @@ func writeTestImport_Object(writer msgpack.Write, value *TestImport_Object) { } } writer.Context().Pop() - writer.Context().Push("EnumArray", "[]TestImport_Enum", "writing property") - writer.WriteString("EnumArray") + writer.Context().Push("enumArray", "[]TestImport_Enum", "writing property") + writer.WriteString("enumArray") if value.EnumArray == nil { writer.WriteNil() } else if len(value.EnumArray) == 0 { @@ -93,8 +93,8 @@ func writeTestImport_Object(writer msgpack.Write, value *TestImport_Object) { } } writer.Context().Pop() - writer.Context().Push("OptEnumArray", "[]*TestImport_Enum", "writing property") - writer.WriteString("OptEnumArray") + writer.Context().Push("optEnumArray", "[]*TestImport_Enum", "writing property") + writer.WriteString("optEnumArray") if value.OptEnumArray == nil { writer.WriteNil() } else if len(value.OptEnumArray) == 0 { diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-go/types/object_another_type_serialization.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/types/object_another_type_serialization.go index 9379d11e42..32c1a99aad 100644 --- a/packages/test-cases/cases/bind/sanity/output/wrap-go/types/object_another_type_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wrap-go/types/object_another_type_serialization.go @@ -13,8 +13,8 @@ func serializeAnotherType(value *AnotherType) []byte { func writeAnotherType(writer msgpack.Write, value *AnotherType) { writer.WriteMapLength(3) - writer.Context().Push("Prop", "*string", "writing property") - writer.WriteString("Prop") + writer.Context().Push("prop", "*string", "writing property") + writer.WriteString("prop") { v := value.Prop if v == nil { @@ -24,15 +24,15 @@ func writeAnotherType(writer msgpack.Write, value *AnotherType) { } } writer.Context().Pop() - writer.Context().Push("Circular", "*CustomType", "writing property") - writer.WriteString("Circular") + writer.Context().Push("circular", "*CustomType", "writing property") + writer.WriteString("circular") { v := value.Circular CustomTypeWrite(writer, v) } writer.Context().Pop() - writer.Context().Push("M_const", "*string", "writing property") - writer.WriteString("M_const") + writer.Context().Push("const", "*string", "writing property") + writer.WriteString("const") { v := value.M_const if v == nil { diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-go/types/object_custom_map_value_serialization.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/types/object_custom_map_value_serialization.go index 056eb66e5d..66e8cd2346 100644 --- a/packages/test-cases/cases/bind/sanity/output/wrap-go/types/object_custom_map_value_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wrap-go/types/object_custom_map_value_serialization.go @@ -13,8 +13,8 @@ func serializeCustomMapValue(value *CustomMapValue) []byte { func writeCustomMapValue(writer msgpack.Write, value *CustomMapValue) { writer.WriteMapLength(1) - writer.Context().Push("Foo", "string", "writing property") - writer.WriteString("Foo") + writer.Context().Push("foo", "string", "writing property") + writer.WriteString("foo") { v := value.Foo writer.WriteString(v) diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-go/types/object_custom_type_serialization.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/types/object_custom_type_serialization.go index 78d4df2834..87941c77a2 100644 --- a/packages/test-cases/cases/bind/sanity/output/wrap-go/types/object_custom_type_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wrap-go/types/object_custom_type_serialization.go @@ -15,15 +15,15 @@ func serializeCustomType(value *CustomType) []byte { func writeCustomType(writer msgpack.Write, value *CustomType) { writer.WriteMapLength(42) - writer.Context().Push("Str", "string", "writing property") - writer.WriteString("Str") + writer.Context().Push("str", "string", "writing property") + writer.WriteString("str") { v := value.Str writer.WriteString(v) } writer.Context().Pop() - writer.Context().Push("OptStr", "*string", "writing property") - writer.WriteString("OptStr") + writer.Context().Push("optStr", "*string", "writing property") + writer.WriteString("optStr") { v := value.OptStr if v == nil { @@ -33,15 +33,15 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } } writer.Context().Pop() - writer.Context().Push("U", "uint32", "writing property") - writer.WriteString("U") + writer.Context().Push("u", "uint32", "writing property") + writer.WriteString("u") { v := value.U writer.WriteU32(v) } writer.Context().Pop() - writer.Context().Push("OptU", "*uint32", "writing property") - writer.WriteString("OptU") + writer.Context().Push("optU", "*uint32", "writing property") + writer.WriteString("optU") { v := value.OptU if v == nil { @@ -51,64 +51,64 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } } writer.Context().Pop() - writer.Context().Push("M_u8", "uint8", "writing property") - writer.WriteString("M_u8") + writer.Context().Push("u8", "uint8", "writing property") + writer.WriteString("u8") { v := value.M_u8 writer.WriteU8(v) } writer.Context().Pop() - writer.Context().Push("M_u16", "uint16", "writing property") - writer.WriteString("M_u16") + writer.Context().Push("u16", "uint16", "writing property") + writer.WriteString("u16") { v := value.M_u16 writer.WriteU16(v) } writer.Context().Pop() - writer.Context().Push("M_u32", "uint32", "writing property") - writer.WriteString("M_u32") + writer.Context().Push("u32", "uint32", "writing property") + writer.WriteString("u32") { v := value.M_u32 writer.WriteU32(v) } writer.Context().Pop() - writer.Context().Push("I", "int32", "writing property") - writer.WriteString("I") + writer.Context().Push("i", "int32", "writing property") + writer.WriteString("i") { v := value.I writer.WriteI32(v) } writer.Context().Pop() - writer.Context().Push("M_i8", "int8", "writing property") - writer.WriteString("M_i8") + writer.Context().Push("i8", "int8", "writing property") + writer.WriteString("i8") { v := value.M_i8 writer.WriteI8(v) } writer.Context().Pop() - writer.Context().Push("M_i16", "int16", "writing property") - writer.WriteString("M_i16") + writer.Context().Push("i16", "int16", "writing property") + writer.WriteString("i16") { v := value.M_i16 writer.WriteI16(v) } writer.Context().Pop() - writer.Context().Push("M_i32", "int32", "writing property") - writer.WriteString("M_i32") + writer.Context().Push("i32", "int32", "writing property") + writer.WriteString("i32") { v := value.M_i32 writer.WriteI32(v) } writer.Context().Pop() - writer.Context().Push("Bigint", "*big.Int", "writing property") - writer.WriteString("Bigint") + writer.Context().Push("bigint", "*big.Int", "writing property") + writer.WriteString("bigint") { v := value.Bigint writer.WriteBigInt(v) } writer.Context().Pop() - writer.Context().Push("OptBigint", "*big.Int", "writing property") - writer.WriteString("OptBigint") + writer.Context().Push("optBigint", "*big.Int", "writing property") + writer.WriteString("optBigint") { v := value.OptBigint if v == nil { @@ -118,15 +118,15 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } } writer.Context().Pop() - writer.Context().Push("Bignumber", "*big.Int", "writing property") - writer.WriteString("Bignumber") + writer.Context().Push("bignumber", "*big.Int", "writing property") + writer.WriteString("bignumber") { v := value.Bignumber writer.WriteBigInt(v) } writer.Context().Pop() - writer.Context().Push("OptBignumber", "*big.Int", "writing property") - writer.WriteString("OptBignumber") + writer.Context().Push("optBignumber", "*big.Int", "writing property") + writer.WriteString("optBignumber") { v := value.OptBignumber if v == nil { @@ -136,15 +136,15 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } } writer.Context().Pop() - writer.Context().Push("Json", "*fastjson.Value", "writing property") - writer.WriteString("Json") + writer.Context().Push("json", "*fastjson.Value", "writing property") + writer.WriteString("json") { v := value.Json writer.WriteJson(v) } writer.Context().Pop() - writer.Context().Push("OptJson", "*fastjson.Value", "writing property") - writer.WriteString("OptJson") + writer.Context().Push("optJson", "*fastjson.Value", "writing property") + writer.WriteString("optJson") { v := value.OptJson if v == nil { @@ -154,15 +154,15 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } } writer.Context().Pop() - writer.Context().Push("Bytes", "[]byte", "writing property") - writer.WriteString("Bytes") + writer.Context().Push("bytes", "[]byte", "writing property") + writer.WriteString("bytes") { v := value.Bytes writer.WriteBytes(v) } writer.Context().Pop() - writer.Context().Push("OptBytes", "[]byte", "writing property") - writer.WriteString("OptBytes") + writer.Context().Push("optBytes", "[]byte", "writing property") + writer.WriteString("optBytes") { v := value.OptBytes if v == nil { @@ -172,15 +172,15 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } } writer.Context().Pop() - writer.Context().Push("M_boolean", "bool", "writing property") - writer.WriteString("M_boolean") + writer.Context().Push("boolean", "bool", "writing property") + writer.WriteString("boolean") { v := value.M_boolean writer.WriteBool(v) } writer.Context().Pop() - writer.Context().Push("OptBoolean", "*bool", "writing property") - writer.WriteString("OptBoolean") + writer.Context().Push("optBoolean", "*bool", "writing property") + writer.WriteString("optBoolean") { v := value.OptBoolean if v == nil { @@ -190,8 +190,8 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } } writer.Context().Pop() - writer.Context().Push("U_array", "[]uint32", "writing property") - writer.WriteString("U_array") + writer.Context().Push("u_array", "[]uint32", "writing property") + writer.WriteString("u_array") if value.U_array == nil { writer.WriteNil() } else if len(value.U_array) == 0 { @@ -206,8 +206,8 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } } writer.Context().Pop() - writer.Context().Push("UOpt_array", "[]uint32", "writing property") - writer.WriteString("UOpt_array") + writer.Context().Push("uOpt_array", "[]uint32", "writing property") + writer.WriteString("uOpt_array") if value.UOpt_array == nil { writer.WriteNil() } else if len(value.UOpt_array) == 0 { @@ -242,8 +242,8 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } } writer.Context().Pop() - writer.Context().Push("OptStrOptArray", "[]*string", "writing property") - writer.WriteString("OptStrOptArray") + writer.Context().Push("optStrOptArray", "[]*string", "writing property") + writer.WriteString("optStrOptArray") if value.OptStrOptArray == nil { writer.WriteNil() } else if len(value.OptStrOptArray) == 0 { @@ -262,8 +262,8 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } } writer.Context().Pop() - writer.Context().Push("UArrayArray", "[][]uint32", "writing property") - writer.WriteString("UArrayArray") + writer.Context().Push("uArrayArray", "[][]uint32", "writing property") + writer.WriteString("uArrayArray") if value.UArrayArray == nil { writer.WriteNil() } else if len(value.UArrayArray) == 0 { @@ -287,8 +287,8 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } } writer.Context().Pop() - writer.Context().Push("UOptArrayOptArray", "[][]*uint32", "writing property") - writer.WriteString("UOptArrayOptArray") + writer.Context().Push("uOptArrayOptArray", "[][]*uint32", "writing property") + writer.WriteString("uOptArrayOptArray") if value.UOptArrayOptArray == nil { writer.WriteNil() } else if len(value.UOptArrayOptArray) == 0 { @@ -316,8 +316,8 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } } writer.Context().Pop() - writer.Context().Push("UArrayOptArrayArray", "[][][]uint32", "writing property") - writer.WriteString("UArrayOptArrayArray") + writer.Context().Push("uArrayOptArrayArray", "[][][]uint32", "writing property") + writer.WriteString("uArrayOptArrayArray") if value.UArrayOptArrayArray == nil { writer.WriteNil() } else if len(value.UArrayOptArrayArray) == 0 { @@ -350,8 +350,8 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } } writer.Context().Pop() - writer.Context().Push("CrazyArray", "[][][][]uint32", "writing property") - writer.WriteString("CrazyArray") + writer.Context().Push("crazyArray", "[][][][]uint32", "writing property") + writer.WriteString("crazyArray") if value.CrazyArray == nil { writer.WriteNil() } else if len(value.CrazyArray) == 0 { @@ -393,22 +393,22 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } } writer.Context().Pop() - writer.Context().Push("Object", "AnotherType", "writing property") - writer.WriteString("Object") + writer.Context().Push("object", "AnotherType", "writing property") + writer.WriteString("object") { v := value.Object AnotherTypeWrite(writer, &v) } writer.Context().Pop() - writer.Context().Push("OptObject", "*AnotherType", "writing property") - writer.WriteString("OptObject") + writer.Context().Push("optObject", "*AnotherType", "writing property") + writer.WriteString("optObject") { v := value.OptObject AnotherTypeWrite(writer, v) } writer.Context().Pop() - writer.Context().Push("ObjectArray", "[]AnotherType", "writing property") - writer.WriteString("ObjectArray") + writer.Context().Push("objectArray", "[]AnotherType", "writing property") + writer.WriteString("objectArray") if value.ObjectArray == nil { writer.WriteNil() } else if len(value.ObjectArray) == 0 { @@ -423,8 +423,8 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } } writer.Context().Pop() - writer.Context().Push("OptObjectArray", "[]*AnotherType", "writing property") - writer.WriteString("OptObjectArray") + writer.Context().Push("optObjectArray", "[]*AnotherType", "writing property") + writer.WriteString("optObjectArray") if value.OptObjectArray == nil { writer.WriteNil() } else if len(value.OptObjectArray) == 0 { @@ -439,15 +439,15 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } } writer.Context().Pop() - writer.Context().Push("En", "CustomEnum", "writing property") - writer.WriteString("En") + writer.Context().Push("en", "CustomEnum", "writing property") + writer.WriteString("en") { v := value.En writer.WriteI32(int32(v)) } writer.Context().Pop() - writer.Context().Push("OptEnum", "*CustomEnum", "writing property") - writer.WriteString("OptEnum") + writer.Context().Push("optEnum", "*CustomEnum", "writing property") + writer.WriteString("optEnum") { v := value.OptEnum if v == nil { @@ -457,8 +457,8 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } } writer.Context().Pop() - writer.Context().Push("EnumArray", "[]CustomEnum", "writing property") - writer.WriteString("EnumArray") + writer.Context().Push("enumArray", "[]CustomEnum", "writing property") + writer.WriteString("enumArray") if value.EnumArray == nil { writer.WriteNil() } else if len(value.EnumArray) == 0 { @@ -473,8 +473,8 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } } writer.Context().Pop() - writer.Context().Push("OptEnumArray", "[]*CustomEnum", "writing property") - writer.WriteString("OptEnumArray") + writer.Context().Push("optEnumArray", "[]*CustomEnum", "writing property") + writer.WriteString("optEnumArray") if value.OptEnumArray == nil { writer.WriteNil() } else if len(value.OptEnumArray) == 0 { @@ -493,8 +493,8 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } } writer.Context().Pop() - writer.Context().Push("M_map", "map[string]int32", "writing property") - writer.WriteString("M_map") + writer.Context().Push("map", "map[string]int32", "writing property") + writer.WriteString("map") if value.M_map == nil { writer.WriteNil() } else if len(value.M_map) == 0 { @@ -509,8 +509,8 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } } writer.Context().Pop() - writer.Context().Push("MapOfArr", "map[string][]int32", "writing property") - writer.WriteString("MapOfArr") + writer.Context().Push("mapOfArr", "map[string][]int32", "writing property") + writer.WriteString("mapOfArr") if value.MapOfArr == nil { writer.WriteNil() } else if len(value.MapOfArr) == 0 { @@ -534,8 +534,8 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } } writer.Context().Pop() - writer.Context().Push("MapOfObj", "map[string]AnotherType", "writing property") - writer.WriteString("MapOfObj") + writer.Context().Push("mapOfObj", "map[string]AnotherType", "writing property") + writer.WriteString("mapOfObj") if value.MapOfObj == nil { writer.WriteNil() } else if len(value.MapOfObj) == 0 { @@ -550,8 +550,8 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } } writer.Context().Pop() - writer.Context().Push("MapOfArrOfObj", "map[string][]AnotherType", "writing property") - writer.WriteString("MapOfArrOfObj") + writer.Context().Push("mapOfArrOfObj", "map[string][]AnotherType", "writing property") + writer.WriteString("mapOfArrOfObj") if value.MapOfArrOfObj == nil { writer.WriteNil() } else if len(value.MapOfArrOfObj) == 0 { @@ -575,8 +575,8 @@ func writeCustomType(writer msgpack.Write, value *CustomType) { } } writer.Context().Pop() - writer.Context().Push("MapCustomValue", "map[string]*CustomMapValue", "writing property") - writer.WriteString("MapCustomValue") + writer.Context().Push("mapCustomValue", "map[string]*CustomMapValue", "writing property") + writer.WriteString("mapCustomValue") if value.MapCustomValue == nil { writer.WriteNil() } else if len(value.MapCustomValue) == 0 { diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-go/types/object_env_serialization.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/types/object_env_serialization.go index 9d12746234..393202c3f7 100644 --- a/packages/test-cases/cases/bind/sanity/output/wrap-go/types/object_env_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wrap-go/types/object_env_serialization.go @@ -13,15 +13,15 @@ func serializeEnv(value *Env) []byte { func writeEnv(writer msgpack.Write, value *Env) { writer.WriteMapLength(3) - writer.Context().Push("Prop", "string", "writing property") - writer.WriteString("Prop") + writer.Context().Push("prop", "string", "writing property") + writer.WriteString("prop") { v := value.Prop writer.WriteString(v) } writer.Context().Pop() - writer.Context().Push("OptProp", "*string", "writing property") - writer.WriteString("OptProp") + writer.Context().Push("optProp", "*string", "writing property") + writer.WriteString("optProp") { v := value.OptProp if v == nil { @@ -31,8 +31,8 @@ func writeEnv(writer msgpack.Write, value *Env) { } } writer.Context().Pop() - writer.Context().Push("OptMap", "map[string]*int32", "writing property") - writer.WriteString("OptMap") + writer.Context().Push("optMap", "map[string]*int32", "writing property") + writer.WriteString("optMap") if value.OptMap == nil { writer.WriteNil() } else if len(value.OptMap) == 0 { diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-go/types/objectelse_serialization.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/types/objectelse_serialization.go index a89c8e047d..b7bf1eeba4 100644 --- a/packages/test-cases/cases/bind/sanity/output/wrap-go/types/objectelse_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wrap-go/types/objectelse_serialization.go @@ -13,8 +13,8 @@ func serializeElse(value *Else) []byte { func writeElse(writer msgpack.Write, value *Else) { writer.WriteMapLength(1) - writer.Context().Push("M_else", "string", "writing property") - writer.WriteString("M_else") + writer.Context().Push("else", "string", "writing property") + writer.WriteString("else") { v := value.M_else writer.WriteString(v) From 0c48b7c29f307b3cd6205b21567945ed1d1a0c7c Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Sun, 16 Jul 2023 14:32:41 -0400 Subject: [PATCH 140/181] chore: add wrap-rust abi-bindgen wrap --- .../bind/src/__tests__/test-cases.spec.ts | 4 +- packages/schema/bind/src/bindings/index.ts | 7 +- .../bind/src/bindings/rust/functions.ts | 385 -------- .../schema/bind/src/bindings/rust/index.ts | 3 - .../src/bindings/rust/transforms/byRef.ts | 24 - .../src/bindings/rust/transforms/index.ts | 2 - .../bindings/rust/transforms/propertyDeps.ts | 207 ----- .../schema/bind/src/bindings/rust/types.ts | 103 --- .../bind/src/bindings/rust/wasm/index.ts | 209 ----- .../templates/$deserialize_array.mustache | 23 - .../$deserialize_array_nobox.mustache | 23 - .../wasm/templates/$deserialize_enum.mustache | 22 - .../templates/$deserialize_map_value.mustache | 23 - .../$deserialize_map_value_nobox.mustache | 23 - .../templates/$deserialize_object.mustache | 11 - .../$deserialize_object_nobox.mustache | 11 - .../$deserialize_object_refmut.mustache | 11 - .../wasm/templates/$serialize_array.mustache | 21 - .../wasm/templates/$serialize_enum.mustache | 6 - .../templates/$serialize_map_value.mustache | 35 - .../wasm/templates/$serialize_object.mustache | 10 - .../rust/wasm/templates/entry-rs.mustache | 40 - .../wasm/templates/enum-type/mod-rs.mustache | 55 -- .../wasm/templates/env-type/mod-rs.mustache | 54 -- .../env-type/serialization-rs.mustache | 169 ---- .../imported/enum-type/mod-rs.mustache | 55 -- .../imported/env-type/mod-rs.mustache | 59 -- .../env-type/serialization-rs.mustache | 169 ---- .../wasm/templates/imported/mod-rs.mustache | 16 - .../imported/module-type/mod-rs.mustache | 85 -- .../module-type/serialization-rs.mustache | 268 ------ .../imported/object-type/mod-rs.mustache | 59 -- .../object-type/serialization-rs.mustache | 169 ---- .../templates/interface-type/mod-rs.mustache | 23 - .../rust/wasm/templates/mod-rs.mustache | 61 -- .../templates/module-type/mod-rs.mustache | 21 - .../templates/module-type/module-rs.mustache | 37 - .../module-type/serialization-rs.mustache | 269 ------ .../templates/module-type/wrapped-rs.mustache | 71 -- .../templates/object-type/mod-rs.mustache | 55 -- .../object-type/serialization-rs.mustache | 169 ---- packages/templates/plugin/rust/Cargo.toml | 9 +- packages/templates/plugin/rust/src/lib.rs | 2 +- packages/templates/plugin/rust/tests/e2e.rs | 23 +- packages/templates/tests.spec.ts | 4 +- .../bind/sanity/output/wrap-rs/_else/mod.rs | 34 +- .../output/wrap-rs/_else/serialization.rs | 68 -- .../bind/sanity/output/wrap-rs/_while/mod.rs | 2 + .../sanity/output/wrap-rs/another_type/mod.rs | 34 +- .../wrap-rs/another_type/serialization.rs | 97 -- .../sanity/output/wrap-rs/custom_enum/mod.rs | 2 + .../output/wrap-rs/custom_map_value/mod.rs | 34 +- .../wrap-rs/custom_map_value/serialization.rs | 68 -- .../sanity/output/wrap-rs/custom_type/mod.rs | 76 +- .../wrap-rs/custom_type/serialization.rs | 851 ------------------ .../cases/bind/sanity/output/wrap-rs/entry.rs | 1 - .../bind/sanity/output/wrap-rs/env/mod.rs | 35 +- .../output/wrap-rs/env/serialization.rs | 98 -- .../test_import_another_object/mod.rs | 33 +- .../serialization.rs | 68 -- .../wrap-rs/imported/test_import_enum/mod.rs | 2 + .../imported/test_import_enum_return/mod.rs | 2 + .../wrap-rs/imported/test_import_env/mod.rs | 38 +- .../imported/test_import_env/serialization.rs | 241 ----- .../imported/test_import_module/mod.rs | 71 +- .../test_import_module/serialization.rs | 554 ------------ .../imported/test_import_object/mod.rs | 44 +- .../test_import_object/serialization.rs | 241 ----- .../cases/bind/sanity/output/wrap-rs/mod.rs | 9 +- .../bind/sanity/output/wrap-rs/module/mod.rs | 17 +- .../sanity/output/wrap-rs/module/module.rs | 19 +- .../output/wrap-rs/module/serialization.rs | 770 ---------------- .../sanity/output/wrap-rs/module/wrapped.rs | 99 +- .../sanity/output/wrap-rs/test_import/mod.rs | 2 +- 74 files changed, 254 insertions(+), 6461 deletions(-) delete mode 100644 packages/schema/bind/src/bindings/rust/functions.ts delete mode 100644 packages/schema/bind/src/bindings/rust/index.ts delete mode 100644 packages/schema/bind/src/bindings/rust/transforms/byRef.ts delete mode 100644 packages/schema/bind/src/bindings/rust/transforms/index.ts delete mode 100644 packages/schema/bind/src/bindings/rust/transforms/propertyDeps.ts delete mode 100644 packages/schema/bind/src/bindings/rust/types.ts delete mode 100644 packages/schema/bind/src/bindings/rust/wasm/index.ts delete mode 100644 packages/schema/bind/src/bindings/rust/wasm/templates/$deserialize_array.mustache delete mode 100644 packages/schema/bind/src/bindings/rust/wasm/templates/$deserialize_array_nobox.mustache delete mode 100644 packages/schema/bind/src/bindings/rust/wasm/templates/$deserialize_enum.mustache delete mode 100644 packages/schema/bind/src/bindings/rust/wasm/templates/$deserialize_map_value.mustache delete mode 100644 packages/schema/bind/src/bindings/rust/wasm/templates/$deserialize_map_value_nobox.mustache delete mode 100644 packages/schema/bind/src/bindings/rust/wasm/templates/$deserialize_object.mustache delete mode 100644 packages/schema/bind/src/bindings/rust/wasm/templates/$deserialize_object_nobox.mustache delete mode 100644 packages/schema/bind/src/bindings/rust/wasm/templates/$deserialize_object_refmut.mustache delete mode 100644 packages/schema/bind/src/bindings/rust/wasm/templates/$serialize_array.mustache delete mode 100644 packages/schema/bind/src/bindings/rust/wasm/templates/$serialize_enum.mustache delete mode 100644 packages/schema/bind/src/bindings/rust/wasm/templates/$serialize_map_value.mustache delete mode 100644 packages/schema/bind/src/bindings/rust/wasm/templates/$serialize_object.mustache delete mode 100644 packages/schema/bind/src/bindings/rust/wasm/templates/entry-rs.mustache delete mode 100644 packages/schema/bind/src/bindings/rust/wasm/templates/enum-type/mod-rs.mustache delete mode 100644 packages/schema/bind/src/bindings/rust/wasm/templates/env-type/mod-rs.mustache delete mode 100644 packages/schema/bind/src/bindings/rust/wasm/templates/env-type/serialization-rs.mustache delete mode 100644 packages/schema/bind/src/bindings/rust/wasm/templates/imported/enum-type/mod-rs.mustache delete mode 100644 packages/schema/bind/src/bindings/rust/wasm/templates/imported/env-type/mod-rs.mustache delete mode 100644 packages/schema/bind/src/bindings/rust/wasm/templates/imported/env-type/serialization-rs.mustache delete mode 100644 packages/schema/bind/src/bindings/rust/wasm/templates/imported/mod-rs.mustache delete mode 100644 packages/schema/bind/src/bindings/rust/wasm/templates/imported/module-type/mod-rs.mustache delete mode 100644 packages/schema/bind/src/bindings/rust/wasm/templates/imported/module-type/serialization-rs.mustache delete mode 100644 packages/schema/bind/src/bindings/rust/wasm/templates/imported/object-type/mod-rs.mustache delete mode 100644 packages/schema/bind/src/bindings/rust/wasm/templates/imported/object-type/serialization-rs.mustache delete mode 100644 packages/schema/bind/src/bindings/rust/wasm/templates/interface-type/mod-rs.mustache delete mode 100644 packages/schema/bind/src/bindings/rust/wasm/templates/mod-rs.mustache delete mode 100644 packages/schema/bind/src/bindings/rust/wasm/templates/module-type/mod-rs.mustache delete mode 100644 packages/schema/bind/src/bindings/rust/wasm/templates/module-type/module-rs.mustache delete mode 100644 packages/schema/bind/src/bindings/rust/wasm/templates/module-type/serialization-rs.mustache delete mode 100644 packages/schema/bind/src/bindings/rust/wasm/templates/module-type/wrapped-rs.mustache delete mode 100644 packages/schema/bind/src/bindings/rust/wasm/templates/object-type/mod-rs.mustache delete mode 100644 packages/schema/bind/src/bindings/rust/wasm/templates/object-type/serialization-rs.mustache delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-rs/_else/serialization.rs delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-rs/another_type/serialization.rs delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_map_value/serialization.rs delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_type/serialization.rs delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-rs/env/serialization.rs delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_another_object/serialization.rs delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_env/serialization.rs delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_module/serialization.rs delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_object/serialization.rs delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-rs/module/serialization.rs diff --git a/packages/schema/bind/src/__tests__/test-cases.spec.ts b/packages/schema/bind/src/__tests__/test-cases.spec.ts index c5f73e0f5b..0e4a9188e1 100644 --- a/packages/schema/bind/src/__tests__/test-cases.spec.ts +++ b/packages/schema/bind/src/__tests__/test-cases.spec.ts @@ -72,10 +72,10 @@ describe("Polywrap Binding Test Suite", () => { output.output.entries = sort(output.output.entries); expectedOutput.output.entries = sort(expectedOutput.output.entries); - const testResultDir = path.join(__dirname, "/test-results/"); + const testResultDir = path.join(__dirname, "/test-results/", language); if (!fs.existsSync(testResultDir)) { - fs.mkdirSync(testResultDir); + fs.mkdirSync(testResultDir, { recursive: true }); } writeFileSync( diff --git a/packages/schema/bind/src/bindings/index.ts b/packages/schema/bind/src/bindings/index.ts index 0f21b912ca..29c62535ed 100644 --- a/packages/schema/bind/src/bindings/index.ts +++ b/packages/schema/bind/src/bindings/index.ts @@ -1,10 +1,9 @@ import { GenerateBindingFn } from "./types"; import { BindLanguage } from "../"; -import * as Rust from "./rust"; import * as WrapBindgen from "./wrap-bindgen"; import * as Golang from "./golang"; -export { Rust, Golang }; +export { Golang }; export * from "./types"; export * from "./utils"; @@ -17,7 +16,9 @@ export function getGenerateBindingFn( "https://github.com/polywrap/wrap-abi-bindgen/tree/wrap-0.1/implementations/wrap-assemblyscript" ); case "wrap-rs": - return Rust.Wasm.generateBinding; + return WrapBindgen.getGenerateBindingFn( + "https://github.com/polywrap/wrap-abi-bindgen/tree/wrap-0.1/implementations/wrap-rust" + ); case "wrap-go": return Golang.Wasm.generateBinding; case "plugin-ts": diff --git a/packages/schema/bind/src/bindings/rust/functions.ts b/packages/schema/bind/src/bindings/rust/functions.ts deleted file mode 100644 index aca46a07b5..0000000000 --- a/packages/schema/bind/src/bindings/rust/functions.ts +++ /dev/null @@ -1,385 +0,0 @@ -import { isKeyword } from "./types"; -import { MustacheFn } from "../types"; - -function replaceAt(str: string, index: number, replacement: string): string { - return ( - str.substr(0, index) + replacement + str.substr(index + replacement.length) - ); -} - -function insertAt(str: string, index: number, insert: string): string { - return str.substr(0, index) + insert + str.substr(index); -} - -function removeAt(str: string, index: number): string { - return str.substr(0, index) + str.substr(index + 1); -} - -export const toLower: MustacheFn = () => { - return (value: string, render: (template: string) => string) => { - let type = render(value); - - for (let i = 0; i < type.length; ++i) { - const char = type.charAt(i); - const lower = char.toLowerCase(); - - if (char !== lower) { - // Replace the uppercase char w/ the lowercase version - type = replaceAt(type, i, lower); - - if (i !== 0 && type[i - 1] !== "_") { - // Make sure all lowercase conversions have an underscore before them - type = insertAt(type, i, "_"); - } - } - } - - return type; - }; -}; - -export const toUpper: MustacheFn = () => { - return (value: string, render: (template: string) => string) => { - let type = render(value); - - // First character must always be upper case - const firstChar = type.charAt(0); - const firstUpper = firstChar.toUpperCase(); - type = replaceAt(type, 0, firstUpper); - - // Look for any underscores, remove them if they exist, and make next letter uppercase - for (let i = 0; i < type.length; ++i) { - const char = type.charAt(i); - - if (char === "_") { - const nextChar = type.charAt(i + 1); - const nextCharUpper = nextChar.toUpperCase(); - type = replaceAt(type, i + 1, nextCharUpper); - type = removeAt(type, i); - } - } - - return type; - }; -}; - -export const noBox: MustacheFn = () => { - return (value: string, render: (template: string) => string) => { - const type = render(value); - const extract = /(.*)Box<([a-zA-Z0-9]*)>(.*)/gm; - const match = [...type.matchAll(extract)]; - - if (match.length === 0) { - return type; - } - - const strings = match[0] as string[]; - return strings[1] + strings[2] + strings[3]; - }; -}; - -export const toMsgPack: MustacheFn = () => { - return (value: string, render: (template: string) => string) => { - let type = render(value); - - let modifier = ""; - if (type[type.length - 1] === "!") { - type = type.substr(0, type.length - 1); - } else { - modifier = "optional_"; - } - - if (type[0] === "[") { - return modifier + "array"; - } - if (type.startsWith("Map<")) { - return modifier + "ext_generic_map"; - } - - switch (type) { - case "Int": - return modifier + "i32"; - case "Int8": - return modifier + "i8"; - case "Int16": - return modifier + "i16"; - case "Int32": - return modifier + "i32"; - case "Int64": - return modifier + "i64"; - case "UInt": - case "UInt32": - return modifier + "u32"; - case "UInt8": - return modifier + "u8"; - case "UInt16": - return modifier + "u16"; - case "UInt64": - return modifier + "u64"; - case "String": - return modifier + "string"; - case "Boolean": - return modifier + "bool"; - case "Bytes": - return modifier + "bytes"; - case "BigInt": - return modifier + "bigint"; - case "BigNumber": - return modifier + "bignumber"; - case "JSON": - return modifier + "json"; - default: - throw Error(`Unknown toWasm type "${type}"`); - } - }; -}; - -export const toWasmInit: MustacheFn = () => { - return (value: string, render: (template: string) => string) => { - let type = render(value); - let optional = false; - - const optionalModifier = (str: string): string => { - return !optional ? str : "None"; - }; - - if (type[type.length - 1] === "!") { - type = type.substr(0, type.length - 1); - } else { - optional = true; - } - - if (type[0] === "[") { - return optionalModifier("vec![]"); - } - - if (type.startsWith("Map<")) { - const firstOpenBracketIdx = type.indexOf("<"); - const lastCloseBracketIdx = type.lastIndexOf(">"); - - if (firstOpenBracketIdx === -1 || lastCloseBracketIdx === -1) { - throw new Error(`Invalid Map: ${type}`); - } - - const keyValTypes = type.substring( - firstOpenBracketIdx + 1, - lastCloseBracketIdx - ); - - const firstCommaIdx = keyValTypes.indexOf(","); - if (firstCommaIdx === -1) { - throw new Error(`Invalid Map: ${type}`); - } - - const keyType = keyValTypes.substring(0, firstCommaIdx).trim(); - const valType = keyValTypes.substring(firstCommaIdx + 1).trim(); - - const wasmKeyType = toWasm()(keyType, (str) => str); - const wasmValType = toWasm()(valType, (str) => str); - - return optionalModifier(`Map::<${wasmKeyType}, ${wasmValType}>::new()`); - } - - switch (type) { - case "Int": - case "Int8": - case "Int16": - case "Int32": - case "Int64": - case "UInt": - case "UInt8": - case "UInt16": - case "UInt32": - case "UInt64": - return optionalModifier("0"); - case "String": - return optionalModifier("String::new()"); - case "Boolean": - return optionalModifier("false"); - case "Bytes": - return optionalModifier("vec![]"); - case "BigInt": - return optionalModifier("BigInt::default()"); - case "BigNumber": - return optionalModifier("BigNumber::default()"); - case "JSON": - return optionalModifier("JSON::Value::Null"); - default: - if (type.includes("Enum_")) { - return optionalModifier(`${toWasm()(value, render)}::_MAX_`); - } else { - return optionalModifier(`${toWasm()(value, render)}::new()`); - } - } - }; -}; - -export const toWasm: MustacheFn = () => { - return (value: string, render: (template: string) => string) => { - let type = render(value); - - let optional = false; - if (type[type.length - 1] === "!") { - type = type.substr(0, type.length - 1); - } else { - optional = true; - } - - if (type[0] === "[") { - return toWasmArray(type, optional); - } - - if (type.startsWith("Map<")) { - return toWasmMap(type, optional); - } - - switch (type) { - case "Int": - type = "i32"; - break; - case "Int8": - type = "i8"; - break; - case "Int16": - type = "i16"; - break; - case "Int32": - type = "i32"; - break; - case "Int64": - type = "i64"; - break; - case "UInt": - case "UInt32": - type = "u32"; - break; - case "UInt8": - type = "u8"; - break; - case "UInt16": - type = "u16"; - break; - case "UInt64": - type = "u64"; - break; - case "String": - type = "String"; - break; - case "Boolean": - type = "bool"; - break; - case "Bytes": - type = "Vec"; - break; - case "BigInt": - type = "BigInt"; - break; - case "BigNumber": - type = "BigNumber"; - break; - case "JSON": - type = "JSON::Value"; - break; - default: - if (type.includes("Enum_")) { - type = type.replace("Enum_", ""); - } - type = toUpper()(type, (str) => str); - type = detectKeyword()(type, (str) => str); - } - - return applyOptional(type, optional); - }; -}; - -// check if any of the keywords match the property name; -// if there's a match, insert `_` at the beginning of the property name. -export const detectKeyword: MustacheFn = () => { - return (value: string, render: (template: string) => string): string => { - const type = render(value); - if (isKeyword(type)) { - return "_" + type; - } - return type; - }; -}; - -export const serdeKeyword: MustacheFn = () => { - return (value: string, render: (template: string) => string): string => { - const type = render(value); - if (isKeyword(type)) { - return `#[serde(rename = "${type}")]\n `; - } - return ""; - }; -}; - -export const serdeAnnotateIfBytes: MustacheFn = () => { - return (value: string, render: (template: string) => string): string => { - const scalarType: string | undefined = render(value); - - if (scalarType === "Bytes") { - return `#[serde(with = "serde_bytes")]\n `; - } - return ""; - }; -}; - -export const serdeRenameIfCaseMismatch: MustacheFn = () => { - return (value: string, render: (template: string) => string): string => { - const type = render(value); - - if (hasUppercase(type) || isKeyword(type)) { - return `#[serde(rename = "${type}")]\n `; - } - return ""; - }; -}; - -const hasUppercase = (value: string): boolean => value !== value.toLowerCase(); - -const toWasmArray = (type: string, optional: boolean): string => { - const result = type.match(/(\[)([[\]A-Za-z1-9_.!]+)(\])/); - - if (!result || result.length !== 4) { - throw Error(`Invalid Array: ${type}`); - } - - const wasmType = toWasm()(result[2], (str) => str); - return applyOptional("Vec<" + wasmType + ">", optional); -}; - -const toWasmMap = (type: string, optional: boolean): string => { - const firstOpenBracketIdx = type.indexOf("<"); - const lastCloseBracketIdx = type.lastIndexOf(">"); - - if (firstOpenBracketIdx === -1 || lastCloseBracketIdx === -1) { - throw new Error(`Invalid Map: ${type}`); - } - - const keyValTypes = type.substring( - firstOpenBracketIdx + 1, - lastCloseBracketIdx - ); - - const firstCommaIdx = keyValTypes.indexOf(","); - if (firstCommaIdx === -1) { - throw new Error(`Invalid Map: ${type}`); - } - - const keyType = keyValTypes.substring(0, firstCommaIdx).trim(); - const valType = keyValTypes.substring(firstCommaIdx + 1).trim(); - - const wasmKeyType = toWasm()(keyType, (str) => str); - const wasmValType = toWasm()(valType, (str) => str); - - return applyOptional(`Map<${wasmKeyType}, ${wasmValType}>`, optional); -}; - -const applyOptional = (type: string, optional: boolean): string => { - if (optional) { - return `Option<${type}>`; - } else { - return type; - } -}; diff --git a/packages/schema/bind/src/bindings/rust/index.ts b/packages/schema/bind/src/bindings/rust/index.ts deleted file mode 100644 index a01310ad9e..0000000000 --- a/packages/schema/bind/src/bindings/rust/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * as Wasm from "./wasm"; -export * as Functions from "./functions"; -export * as Types from "./types"; diff --git a/packages/schema/bind/src/bindings/rust/transforms/byRef.ts b/packages/schema/bind/src/bindings/rust/transforms/byRef.ts deleted file mode 100644 index b5f87a673c..0000000000 --- a/packages/schema/bind/src/bindings/rust/transforms/byRef.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { AbiTransforms } from "@polywrap/schema-parse"; -import { AnyDefinition } from "@polywrap/wrap-manifest-types-js"; - -export function byRef(): AbiTransforms { - return { - enter: { - // eslint-disable-next-line @typescript-eslint/naming-convention - AnyDefinition: (def: AnyDefinition) => { - const byRefScalars = ["String", "BigInt", "BigNumber", "Map", "Bytes"]; - - if (def.scalar) { - if (byRefScalars.indexOf(def.scalar.type) > -1 || !def.required) { - return { - ...def, - byRef: true, - }; - } - } - - return def; - }, - }, - }; -} diff --git a/packages/schema/bind/src/bindings/rust/transforms/index.ts b/packages/schema/bind/src/bindings/rust/transforms/index.ts deleted file mode 100644 index 56b11478c3..0000000000 --- a/packages/schema/bind/src/bindings/rust/transforms/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./byRef"; -export * from "./propertyDeps"; diff --git a/packages/schema/bind/src/bindings/rust/transforms/propertyDeps.ts b/packages/schema/bind/src/bindings/rust/transforms/propertyDeps.ts deleted file mode 100644 index 5a6a5d20ba..0000000000 --- a/packages/schema/bind/src/bindings/rust/transforms/propertyDeps.ts +++ /dev/null @@ -1,207 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -/* eslint-disable no-useless-escape */ -import { isBaseType, isBuiltInType } from "../types"; - -import { - ImportedModuleDefinition, - ObjectDefinition, - AnyDefinition, - ModuleDefinition, - EnvDefinition, - Abi, - ImportedEnvDefinition, -} from "@polywrap/wrap-manifest-types-js"; -import { AbiTransforms } from "@polywrap/schema-parse"; - -interface PropertyDep { - crate: string; - type: string; - isEnum: boolean; -} - -interface PropertyDepsState { - abiEnvDefinition?: EnvDefinition; - envDefinition?: EnvDefinition; - importedEnvDefinition?: ImportedEnvDefinition; - objectDefinition?: ObjectDefinition; - moduleDefinition?: ModuleDefinition; - importedModuleDefinition?: ImportedModuleDefinition; - propertyDeps?: PropertyDep[]; -} - -export function propertyDeps(): AbiTransforms { - const state: PropertyDepsState = {}; - - return { - enter: { - Abi: (abi: Abi) => { - if (abi.envType) { - state.abiEnvDefinition = abi.envType; - } - return abi; - }, - EnvDefinition: (def: EnvDefinition) => { - state.envDefinition = def; - state.propertyDeps = []; - return def; - }, - ImportedEnvDefinition: (def: ImportedEnvDefinition) => { - state.envDefinition = def; - state.propertyDeps = []; - return def; - }, - ObjectDefinition: (def: ObjectDefinition) => { - state.objectDefinition = def; - state.propertyDeps = []; - return def; - }, - ModuleDefinition: (def: ModuleDefinition) => { - state.moduleDefinition = def; - state.propertyDeps = []; - if (state.abiEnvDefinition) { - state.propertyDeps.push({ - crate: "crate", - type: "Env", - isEnum: false, - }); - } - return def; - }, - ImportedModuleDefinition: (def: ImportedModuleDefinition) => { - state.importedModuleDefinition = def; - state.propertyDeps = []; - return def; - }, - AnyDefinition: (def: AnyDefinition) => { - const appendPropertyDep = ( - rootType: string, - array: PropertyDep[] - ): PropertyDep[] => { - let typeName = def.type; - - if (typeName.indexOf("[") === 0) { - typeName = typeName.replace(/\[|\]|\!|\?/g, ""); - } - - const appendUnique = (item: PropertyDep) => { - if ( - array.findIndex( - (i) => i.crate === item.crate && i.type === item.type - ) === -1 - ) { - array.push(item); - } - }; - - const isKnownType = (name: string) => - isBaseType(name) || isBuiltInType(name) || name === rootType; - - // if type is map and the value is custom, - // we need to add it into property dependency - if (typeName.startsWith("Map<")) { - const valueName = def.map?.object?.type ?? def.map?.enum?.type; - if (valueName && !isKnownType(valueName)) { - appendUnique({ - crate: "crate", - type: valueName, - isEnum: valueName === def.map?.enum?.type, - }); - - return array; - } - - return array; - } - - if (isKnownType(typeName)) { - return array; - } - - appendUnique({ - crate: "crate", - type: typeName, - isEnum: !!def.enum || !!def.array?.enum, - }); - - return array; - }; - - if (state.envDefinition && state.propertyDeps) { - state.propertyDeps = appendPropertyDep( - state.envDefinition.type, - state.propertyDeps - ); - } else if (state.importedEnvDefinition && state.propertyDeps) { - state.propertyDeps = appendPropertyDep( - state.importedEnvDefinition.type, - state.propertyDeps - ); - } else if (state.objectDefinition && state.propertyDeps) { - state.propertyDeps = appendPropertyDep( - state.objectDefinition.type, - state.propertyDeps - ); - } else if (state.moduleDefinition && state.propertyDeps) { - state.propertyDeps = appendPropertyDep( - state.moduleDefinition.type, - state.propertyDeps - ); - } else if (state.importedModuleDefinition && state.propertyDeps) { - state.propertyDeps = appendPropertyDep( - state.importedModuleDefinition.type, - state.propertyDeps - ); - } - - return def; - }, - }, - leave: { - EnvDefinition: (def: EnvDefinition) => { - const propertyDeps = state.propertyDeps; - state.propertyDeps = undefined; - state.envDefinition = undefined; - return { - ...def, - propertyDeps, - }; - }, - ImportedEnvDefinition: (def: ImportedEnvDefinition) => { - const propertyDeps = state.propertyDeps; - state.propertyDeps = undefined; - state.importedEnvDefinition = undefined; - return { - ...def, - propertyDeps, - }; - }, - ObjectDefinition: (def: ObjectDefinition) => { - const propertyDeps = state.propertyDeps; - state.propertyDeps = undefined; - state.objectDefinition = undefined; - return { - ...def, - propertyDeps, - }; - }, - ModuleDefinition: (def: ModuleDefinition) => { - const propertyDeps = state.propertyDeps; - state.propertyDeps = undefined; - state.moduleDefinition = undefined; - return { - ...def, - propertyDeps, - }; - }, - ImportedModuleDefinition: (def: ImportedModuleDefinition) => { - const propertyDeps = state.propertyDeps; - state.propertyDeps = undefined; - state.importedModuleDefinition = undefined; - return { - ...def, - propertyDeps, - }; - }, - }, - }; -} diff --git a/packages/schema/bind/src/bindings/rust/types.ts b/packages/schema/bind/src/bindings/rust/types.ts deleted file mode 100644 index 2ca3c140a5..0000000000 --- a/packages/schema/bind/src/bindings/rust/types.ts +++ /dev/null @@ -1,103 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -const baseTypes = { - UInt: "UInt", - UInt8: "UInt8", - UInt16: "UInt16", - UInt32: "UInt32", - UInt64: "UInt64", - Int: "Int", - Int8: "Int8", - Int16: "Int16", - Int32: "Int32", - Int64: "Int64", - String: "String", - Boolean: "Boolean", - Bytes: "Bytes", -}; - -export type BaseTypes = typeof baseTypes; - -export type BaseType = keyof BaseTypes; - -export function isBaseType(type: string): type is BaseType { - return type in baseTypes; -} - -const builtInTypes = { - BigInt: "BigInt", - BigNumber: "BigNumber", - JSON: "JSON", -}; - -export type BuiltInTypes = typeof builtInTypes; - -export type BuiltInType = keyof BuiltInTypes; - -export function isBuiltInType(type: string): type is BuiltInType { - return type in builtInTypes; -} - -const keywords = { - as: "as", - break: "break", - const: "const", - continue: "continue", - crate: "crate", - else: "else", - enum: "enum", - extern: "extern", - false: "false", - fn: "fn", - for: "for", - if: "if", - impl: "impl", - in: "in", - let: "let", - loop: "loop", - match: "match", - mod: "mod", - move: "move", - mut: "mut", - pub: "pub", - ref: "ref", - return: "return", - self: "self", - Self: "Self", - static: "static", - struct: "struct", - super: "super", - trait: "trait", - true: "true", - type: "type", - unsafe: "unsafe", - use: "use", - where: "where", - while: "while", - async: "async", - await: "await", - dyn: "dyn", - abstract: "abstract", - become: "become", - box: "box", - Box: "Box", - do: "do", - final: "final", - macro: "macro", - override: "override", - priv: "priv", - typeof: "typeof", - unsized: "unsized", - virtual: "virtual", - yield: "yield", - try: "try", - macro_rules: "macro_rules", - union: "union", -}; - -export type Keywords = typeof keywords; - -export type Keyword = keyof Keywords; - -export function isKeyword(keyword: string): keyword is Keyword { - return keyword in keywords; -} diff --git a/packages/schema/bind/src/bindings/rust/wasm/index.ts b/packages/schema/bind/src/bindings/rust/wasm/index.ts deleted file mode 100644 index 8c4ce600f4..0000000000 --- a/packages/schema/bind/src/bindings/rust/wasm/index.ts +++ /dev/null @@ -1,209 +0,0 @@ -import * as Transforms from "../transforms"; -import { Functions } from "../"; -import { GenerateBindingFn, renderTemplates } from "../.."; -import { loadSubTemplates } from "../../utils"; -import { BindOptions, BindOutput } from "../../.."; - -import { - transformAbi, - extendType, - addFirstLast, - toPrefixedGraphQLType, - hasImports, - methodParentPointers, -} from "@polywrap/schema-parse"; -import { OutputEntry, readDirectorySync } from "@polywrap/os-js"; -import path from "path"; -import { WrapAbi } from "@polywrap/wrap-manifest-types-js/src"; - -const templatesDir = readDirectorySync(path.join(__dirname, "./templates")); -const subTemplates = loadSubTemplates(templatesDir.entries); -const templatePath = (subpath: string) => - path.join(__dirname, "./templates", subpath); - -const toLower = (type: string) => Functions.toLower()(type, (str) => str); - -export const generateBinding: GenerateBindingFn = ( - options: BindOptions -): BindOutput => { - const result: BindOutput = { - output: { - entries: [], - }, - outputDirAbs: options.outputDirAbs, - }; - const output = result.output; - const abi = applyTransforms(options.wrapInfo.abi); - - // Generate object type folders - if (abi.objectTypes) { - for (const objectType of abi.objectTypes) { - output.entries.push({ - type: "Directory", - name: Functions.detectKeyword()(toLower(objectType.type), (str) => str), - data: renderTemplates( - templatePath("object-type"), - objectType, - subTemplates - ), - }); - } - } - - // Generate env type folders - if (abi.envType) { - output.entries.push({ - type: "Directory", - name: Functions.detectKeyword()(toLower(abi.envType.type), (str) => str), - data: renderTemplates( - templatePath("env-type"), - abi.envType, - subTemplates - ), - }); - } - - // Generate imported folder - const importEntries: OutputEntry[] = []; - - // Generate imported module type folders - if (abi.importedModuleTypes) { - for (const importedModuleType of abi.importedModuleTypes) { - importEntries.push({ - type: "Directory", - name: toLower(importedModuleType.type), - data: renderTemplates( - templatePath("imported/module-type"), - importedModuleType, - subTemplates - ), - }); - } - } - - // Generate imported enum type folders - if (abi.importedEnumTypes) { - for (const importedEnumType of abi.importedEnumTypes) { - importEntries.push({ - type: "Directory", - name: Functions.detectKeyword()( - toLower(importedEnumType.type), - (str) => str - ), - data: renderTemplates( - templatePath("imported/enum-type"), - importedEnumType, - subTemplates - ), - }); - } - } - - // Generate imported object type folders - if (abi.importedObjectTypes) { - for (const importedObectType of abi.importedObjectTypes) { - importEntries.push({ - type: "Directory", - name: Functions.detectKeyword()( - toLower(importedObectType.type), - (str) => str - ), - data: renderTemplates( - templatePath("imported/object-type"), - importedObectType, - subTemplates - ), - }); - } - } - - // Generate imported env type folders - if (abi.importedEnvTypes) { - for (const importedEnvType of abi.importedEnvTypes) { - importEntries.push({ - type: "Directory", - name: Functions.detectKeyword()( - toLower(importedEnvType.type), - (str) => str - ), - data: renderTemplates( - templatePath("imported/env-type"), - importedEnvType, - subTemplates - ), - }); - } - } - - if (importEntries.length > 0) { - output.entries.push({ - type: "Directory", - name: "imported", - data: [ - ...importEntries, - ...renderTemplates(templatePath("imported"), abi, subTemplates), - ], - }); - } - - // Generate interface type folders - if (abi.interfaceTypes) { - for (const interfaceType of abi.interfaceTypes) { - output.entries.push({ - type: "Directory", - name: toLower(interfaceType.type), - data: renderTemplates( - templatePath("interface-type"), - interfaceType, - subTemplates - ), - }); - } - } - - // Generate module type folders - if (abi.moduleType) { - output.entries.push({ - type: "Directory", - name: toLower(abi.moduleType.type), - data: renderTemplates(templatePath("module-type"), abi, subTemplates), - }); - } - - // Generate enum type folders - if (abi.enumTypes) { - for (const enumType of abi.enumTypes) { - output.entries.push({ - type: "Directory", - name: Functions.detectKeyword()(toLower(enumType.type), (str) => str), - data: renderTemplates( - templatePath("enum-type"), - enumType, - subTemplates - ), - }); - } - } - - // Generate root entry file - output.entries.push(...renderTemplates(templatePath(""), abi, subTemplates)); - - return result; -}; - -function applyTransforms(abi: WrapAbi): WrapAbi { - const transforms = [ - extendType(Functions), - addFirstLast, - toPrefixedGraphQLType, - hasImports, - methodParentPointers(), - Transforms.propertyDeps(), - Transforms.byRef(), - ]; - - for (const transform of transforms) { - abi = transformAbi(abi, transform); - } - return abi; -} diff --git a/packages/schema/bind/src/bindings/rust/wasm/templates/$deserialize_array.mustache b/packages/schema/bind/src/bindings/rust/wasm/templates/$deserialize_array.mustache deleted file mode 100644 index 677e8785b0..0000000000 --- a/packages/schema/bind/src/bindings/rust/wasm/templates/$deserialize_array.mustache +++ /dev/null @@ -1,23 +0,0 @@ -{{#scalar}} -reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}() -{{/scalar}} -{{#array}} -reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(|reader| { - {{> deserialize_array}} -}) -{{/array}} -{{#map}} -reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(|reader| { - reader.read_{{#key}}{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}{{/key}}() -}, |reader| { - {{> deserialize_map_value}} -}) -{{/map}} -{{#enum}} -{{> deserialize_enum}} -Ok(value) -{{/enum}} -{{#object}} -{{> deserialize_object}} -Ok(object) -{{/object}} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/rust/wasm/templates/$deserialize_array_nobox.mustache b/packages/schema/bind/src/bindings/rust/wasm/templates/$deserialize_array_nobox.mustache deleted file mode 100644 index 3ff7fb4f1b..0000000000 --- a/packages/schema/bind/src/bindings/rust/wasm/templates/$deserialize_array_nobox.mustache +++ /dev/null @@ -1,23 +0,0 @@ -{{#scalar}} -reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}() -{{/scalar}} -{{#array}} -reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(|reader| { - {{> deserialize_array_nobox}} -}) -{{/array}} -{{#map}} -reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(|reader| { - reader.read_{{#key}}{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}{{/key}}() -}, |reader| { - {{> deserialize_map_value_nobox}} -}) -{{/map}} -{{#enum}} -{{> deserialize_enum}} -Ok(value) -{{/enum}} -{{#object}} -{{> deserialize_object_nobox}} -Ok(object) -{{/object}} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/rust/wasm/templates/$deserialize_enum.mustache b/packages/schema/bind/src/bindings/rust/wasm/templates/$deserialize_enum.mustache deleted file mode 100644 index 4c5c792b2f..0000000000 --- a/packages/schema/bind/src/bindings/rust/wasm/templates/$deserialize_enum.mustache +++ /dev/null @@ -1,22 +0,0 @@ -{{#required}} -let mut value: {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} = {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::_MAX_; -if reader.is_next_string()? { - value = get_{{#toLower}}{{type}}{{/toLower}}_value(&reader.read_string()?)?; -} else { - value = {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::try_from(reader.read_i32()?)?; - sanitize_{{#toLower}}{{type}}{{/toLower}}_value(value as i32)?; -} -{{/required}} -{{^required}} -let mut value: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = None; -if !reader.is_next_nil()? { - if reader.is_next_string()? { - value = Some(get_{{#toLower}}{{type}}{{/toLower}}_value(&reader.read_string()?)?); - } else { - value = Some({{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::try_from(reader.read_i32()?)?); - sanitize_{{#toLower}}{{type}}{{/toLower}}_value(value.unwrap() as i32)?; - } -} else { - value = None; -} -{{/required}} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/rust/wasm/templates/$deserialize_map_value.mustache b/packages/schema/bind/src/bindings/rust/wasm/templates/$deserialize_map_value.mustache deleted file mode 100644 index 85fa4c841b..0000000000 --- a/packages/schema/bind/src/bindings/rust/wasm/templates/$deserialize_map_value.mustache +++ /dev/null @@ -1,23 +0,0 @@ -{{#scalar}} -reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}() -{{/scalar}} -{{#array}} -reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(|reader| { - {{> deserialize_array}} -}) -{{/array}} -{{#map}} -reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(|reader| { - reader.read_{{#key}}{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}{{/key}}() -}, |reader| { - {{> deserialize_map_value}} -}) -{{/map}} -{{#enum}} -{{> deserialize_enum}} -Ok(value) -{{/enum}} -{{#object}} -{{> deserialize_object}} -Ok(object) -{{/object}} diff --git a/packages/schema/bind/src/bindings/rust/wasm/templates/$deserialize_map_value_nobox.mustache b/packages/schema/bind/src/bindings/rust/wasm/templates/$deserialize_map_value_nobox.mustache deleted file mode 100644 index 6147316f80..0000000000 --- a/packages/schema/bind/src/bindings/rust/wasm/templates/$deserialize_map_value_nobox.mustache +++ /dev/null @@ -1,23 +0,0 @@ -{{#scalar}} -reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}() -{{/scalar}} -{{#array}} -reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(|reader| { - {{> deserialize_array_nobox}} -}) -{{/array}} -{{#map}} -reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(|reader| { - reader.read_{{#key}}{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}{{/key}}() -}, |reader| { - {{> deserialize_map_value_nobox}} -}) -{{/map}} -{{#enum}} -{{> deserialize_enum}} -Ok(value) -{{/enum}} -{{#object}} -{{> deserialize_object_nobox}} -Ok(object) -{{/object}} diff --git a/packages/schema/bind/src/bindings/rust/wasm/templates/$deserialize_object.mustache b/packages/schema/bind/src/bindings/rust/wasm/templates/$deserialize_object.mustache deleted file mode 100644 index ba82c73512..0000000000 --- a/packages/schema/bind/src/bindings/rust/wasm/templates/$deserialize_object.mustache +++ /dev/null @@ -1,11 +0,0 @@ -{{#required}} -let object = Box::new({{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::read(reader)?); -{{/required}} -{{^required}} -let mut object: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = None; -if !reader.is_next_nil()? { - object = Some(Box::new({{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::read(reader)?)); -} else { - object = None; -} -{{/required}} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/rust/wasm/templates/$deserialize_object_nobox.mustache b/packages/schema/bind/src/bindings/rust/wasm/templates/$deserialize_object_nobox.mustache deleted file mode 100644 index bf4cb82114..0000000000 --- a/packages/schema/bind/src/bindings/rust/wasm/templates/$deserialize_object_nobox.mustache +++ /dev/null @@ -1,11 +0,0 @@ -{{#required}} -let object = {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::read(reader)?; -{{/required}} -{{^required}} -let mut object: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = None; -if !reader.is_next_nil()? { - object = Some({{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::read(reader)?); -} else { - object = None; -} -{{/required}} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/rust/wasm/templates/$deserialize_object_refmut.mustache b/packages/schema/bind/src/bindings/rust/wasm/templates/$deserialize_object_refmut.mustache deleted file mode 100644 index bd6e80fd9e..0000000000 --- a/packages/schema/bind/src/bindings/rust/wasm/templates/$deserialize_object_refmut.mustache +++ /dev/null @@ -1,11 +0,0 @@ -{{#required}} -let object = {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::read(&mut reader)?; -{{/required}} -{{^required}} -let mut object: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = None; -if !reader.is_next_nil()? { - object = Some({{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::read(&mut reader)?); -} else { - object = None; -} -{{/required}} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/rust/wasm/templates/$serialize_array.mustache b/packages/schema/bind/src/bindings/rust/wasm/templates/$serialize_array.mustache deleted file mode 100644 index 793cd62322..0000000000 --- a/packages/schema/bind/src/bindings/rust/wasm/templates/$serialize_array.mustache +++ /dev/null @@ -1,21 +0,0 @@ -{{#scalar}} -writer.write_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(item) -{{/scalar}} -{{#array}} -writer.write_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(item, |writer, item| { - {{> serialize_array}} -}) -{{/array}} -{{#map}} -writer.write_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(item, |writer, key| { - writer.write_{{#key}}{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}{{/key}}(key) -}, |writer, value| { - {{> serialize_map_value}} -}) -{{/map}} -{{#enum}} -{{> serialize_enum}} -{{/enum}} -{{#object}} -{{> serialize_object}} -{{/object}} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/rust/wasm/templates/$serialize_enum.mustache b/packages/schema/bind/src/bindings/rust/wasm/templates/$serialize_enum.mustache deleted file mode 100644 index 5ada8b40f4..0000000000 --- a/packages/schema/bind/src/bindings/rust/wasm/templates/$serialize_enum.mustache +++ /dev/null @@ -1,6 +0,0 @@ -{{#required}} -writer.write_i32(&(*item as i32)) -{{/required}} -{{^required}} -writer.write_optional_i32(&item.map(|f| f as i32)) -{{/required}} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/rust/wasm/templates/$serialize_map_value.mustache b/packages/schema/bind/src/bindings/rust/wasm/templates/$serialize_map_value.mustache deleted file mode 100644 index b0550dca9a..0000000000 --- a/packages/schema/bind/src/bindings/rust/wasm/templates/$serialize_map_value.mustache +++ /dev/null @@ -1,35 +0,0 @@ -{{#scalar}} -writer.write_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(value) -{{/scalar}} -{{#array}} -writer.write_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(value, |writer, item| { - {{> serialize_array}} -}) -{{/array}} -{{#map}} -writer.write_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(value, |writer, key| { - writer.write_{{#key}}{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}{{/key}}(key) -}, |writer, value| { - {{> serialize_map_value}} -}) -{{/map}} -{{#enum}} -{{#required}} -writer.write_i32(&(*value as i32)) -{{/required}} -{{^required}} -writer.write_optional_i32(&value.map(|f| f as i32)) -{{/required}} -{{/enum}} -{{#object}} -{{#required}} -{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::write(value, writer) -{{/required}} -{{^required}} -if value.is_some() { - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::write(value.as_ref().as_ref().unwrap(), writer) -} else { - writer.write_nil() -} -{{/required}} -{{/object}} diff --git a/packages/schema/bind/src/bindings/rust/wasm/templates/$serialize_object.mustache b/packages/schema/bind/src/bindings/rust/wasm/templates/$serialize_object.mustache deleted file mode 100644 index 8a1ca4d6d1..0000000000 --- a/packages/schema/bind/src/bindings/rust/wasm/templates/$serialize_object.mustache +++ /dev/null @@ -1,10 +0,0 @@ -{{#required}} -{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::write(item, writer) -{{/required}} -{{^required}} -if item.is_some() { - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::write(item.as_ref().as_ref().unwrap(), writer) -} else { - writer.write_nil() -} -{{/required}} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/rust/wasm/templates/entry-rs.mustache b/packages/schema/bind/src/bindings/rust/wasm/templates/entry-rs.mustache deleted file mode 100644 index 4287286a50..0000000000 --- a/packages/schema/bind/src/bindings/rust/wasm/templates/entry-rs.mustache +++ /dev/null @@ -1,40 +0,0 @@ -{{#moduleType}} -{{#methods.length}} -use crate::{ - {{#methods}} - {{#toLower}}{{name}}{{/toLower}}_wrapped{{^last}},{{/last}} - {{/methods}} -}; -{{/methods.length}} -{{/moduleType}} -use polywrap_wasm_rs::{ - abort, - invoke, - InvokeArgs, -}; -use crate::module::Module; - -#[no_mangle] -pub extern "C" fn _wrap_invoke(method_size: u32, args_size: u32, env_size: u32) -> bool { - // Ensure the abort handler is properly setup - abort::wrap_abort_setup(); - - let args: InvokeArgs = invoke::wrap_invoke_args(method_size, args_size); - let result: Vec; - - match args.method.as_str() { - {{#moduleType}} - {{#methods}} - "{{name}}" => { - result = {{#toLower}}{{name}}{{/toLower}}_wrapped(args.args.as_slice(), env_size); - } - {{/methods}} - {{/moduleType}} - _ => { - invoke::wrap_invoke_error(format!("Could not find invoke function {}", args.method)); - return false; - } - }; - invoke::wrap_invoke_result(result); - return true; -} diff --git a/packages/schema/bind/src/bindings/rust/wasm/templates/enum-type/mod-rs.mustache b/packages/schema/bind/src/bindings/rust/wasm/templates/enum-type/mod-rs.mustache deleted file mode 100644 index f87a2c5691..0000000000 --- a/packages/schema/bind/src/bindings/rust/wasm/templates/enum-type/mod-rs.mustache +++ /dev/null @@ -1,55 +0,0 @@ -use polywrap_wasm_rs::{EnumTypeError}; -use serde::{Serialize, Deserialize}; -use std::convert::TryFrom; - -#[derive(Clone, Copy, Debug, Deserialize, Serialize)] -pub enum {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - {{#constants}} - {{#serdeKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/serdeKeyword}}{{#detectKeyword}}{{.}}{{/detectKeyword}}, - {{/constants}} - _MAX_ -} - -pub fn sanitize_{{#toLower}}{{type}}{{/toLower}}_value(value: i32) -> Result<(), EnumTypeError> { - if value < 0 && value >= {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::_MAX_ as i32 { - return Err(EnumTypeError::EnumProcessingError(format!("Invalid value for enum '{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}': {}", value.to_string()))); - } - Ok(()) -} - -pub fn get_{{#toLower}}{{type}}{{/toLower}}_value(key: &str) -> Result<{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}, EnumTypeError> { - match key { - {{#constants}} - "{{#detectKeyword}}{{.}}{{/detectKeyword}}" => Ok({{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::{{#detectKeyword}}{{.}}{{/detectKeyword}}), - {{/constants}} - "_MAX_" => Ok({{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::_MAX_), - err => Err(EnumTypeError::EnumProcessingError(format!("Invalid key for enum '{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}': {}", err))) - } -} - -pub fn get_{{#toLower}}{{type}}{{/toLower}}_key(value: {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}) -> Result { - if sanitize_{{#toLower}}{{type}}{{/toLower}}_value(value as i32).is_ok() { - match value { - {{#constants}} - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::{{#detectKeyword}}{{.}}{{/detectKeyword}} => Ok("{{#detectKeyword}}{{.}}{{/detectKeyword}}".to_string()), - {{/constants}} - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::_MAX_ => Ok("_MAX_".to_string()), - } - } else { - Err(EnumTypeError::EnumProcessingError(format!("Invalid value for enum '{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}': {}", (value as i32).to_string()))) - } -} - -impl TryFrom for {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - type Error = EnumTypeError; - - fn try_from(v: i32) -> Result<{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}, Self::Error> { - match v { - {{#constants}} - x if x == {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::{{#detectKeyword}}{{.}}{{/detectKeyword}} as i32 => Ok({{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::{{#detectKeyword}}{{.}}{{/detectKeyword}}), - {{/constants}} - x if x == {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::_MAX_ as i32 => Ok({{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::_MAX_), - _ => Err(EnumTypeError::ParseEnumError(format!("Invalid value for enum '{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}': {}", (v as i32).to_string()))), - } - } -} diff --git a/packages/schema/bind/src/bindings/rust/wasm/templates/env-type/mod-rs.mustache b/packages/schema/bind/src/bindings/rust/wasm/templates/env-type/mod-rs.mustache deleted file mode 100644 index 77569c3e85..0000000000 --- a/packages/schema/bind/src/bindings/rust/wasm/templates/env-type/mod-rs.mustache +++ /dev/null @@ -1,54 +0,0 @@ -use serde::{Serialize, Deserialize}; -pub mod serialization; -use polywrap_wasm_rs::{ - BigInt, - BigNumber, - Map, - DecodeError, - EncodeError, - Read, - Write, - JSON, -}; -pub use serialization::{ - deserialize_{{#toLower}}{{type}}{{/toLower}}, - read_{{#toLower}}{{type}}{{/toLower}}, - serialize_{{#toLower}}{{type}}{{/toLower}}, - write_{{#toLower}}{{type}}{{/toLower}} -}; -{{#propertyDeps}} -use {{crate}}::{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}; -{{/propertyDeps}} - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - {{#properties}} - {{#serdeKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/serdeKeyword}}pub {{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}}, - {{/properties}} -} - -impl {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - pub fn new() -> {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - {{#properties}} - {{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}: {{#toWasmInit}}{{toGraphQLType}}{{/toWasmInit}}, - {{/properties}} - } - } - - pub fn to_buffer(args: &{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}) -> Result, EncodeError> { - serialize_{{#toLower}}{{type}}{{/toLower}}(args).map_err(|e| EncodeError::TypeWriteError(e.to_string())) - } - - pub fn from_buffer(args: &[u8]) -> Result<{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}, DecodeError> { - deserialize_{{#toLower}}{{type}}{{/toLower}}(args).map_err(|e| DecodeError::TypeReadError(e.to_string())) - } - - pub fn write(args: &{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}, writer: &mut W) -> Result<(), EncodeError> { - write_{{#toLower}}{{type}}{{/toLower}}(args, writer).map_err(|e| EncodeError::TypeWriteError(e.to_string())) - } - - pub fn read(reader: &mut R) -> Result<{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}, DecodeError> { - read_{{#toLower}}{{type}}{{/toLower}}(reader).map_err(|e| DecodeError::TypeReadError(e.to_string())) - } -} diff --git a/packages/schema/bind/src/bindings/rust/wasm/templates/env-type/serialization-rs.mustache b/packages/schema/bind/src/bindings/rust/wasm/templates/env-type/serialization-rs.mustache deleted file mode 100644 index fad845897d..0000000000 --- a/packages/schema/bind/src/bindings/rust/wasm/templates/env-type/serialization-rs.mustache +++ /dev/null @@ -1,169 +0,0 @@ -use std::convert::TryFrom; -use polywrap_wasm_rs::{ - BigInt, - BigNumber, - Map, - Context, - DecodeError, - EncodeError, - Read, - ReadDecoder, - Write, - WriteEncoder, - JSON, -}; -use crate::{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}; -{{#propertyDeps.length}} - -{{/propertyDeps.length}}{{#propertyDeps}} -{{^isEnum}} -use {{crate}}::{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}; -{{/isEnum}} -{{#isEnum}} -use crate::{ - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}, - get_{{#toLower}}{{type}}{{/toLower}}_value, - sanitize_{{#toLower}}{{type}}{{/toLower}}_value -}; -{{/isEnum}} -{{/propertyDeps}} - -pub fn serialize_{{#toLower}}{{type}}{{/toLower}}(args: &{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}) -> Result, EncodeError> { - let mut encoder_context = Context::new(); - encoder_context.description = "Serializing (encoding) env-type: {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}".to_string(); - let mut encoder = WriteEncoder::new(&[], encoder_context); - write_{{#toLower}}{{type}}{{/toLower}}(args, &mut encoder)?; - Ok(encoder.get_buffer()) -} - -pub fn write_{{#toLower}}{{type}}{{/toLower}}(args: &{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}, writer: &mut W) -> Result<(), EncodeError> { - {{#properties.length}} - writer.write_map_length(&{{properties.length}})?; - {{/properties.length}} - {{^properties}} - writer.write_map_length(&0)?; - {{/properties}} - {{#properties}} - writer.context().push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property"); - writer.write_string("{{name}}")?; - {{#scalar}} - writer.write_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(&args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}})?; - {{/scalar}} - {{#array}} - writer.write_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(&args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}, |writer, item| { - {{> serialize_array}} - })?; - {{/array}} - {{#map}} - writer.write_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(&args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}, |writer, key| { - writer.write_{{#key}}{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}{{/key}}(key) - }, |writer, value| { - {{> serialize_map_value}} - })?; - {{/map}} - {{#object}} - {{#required}} - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::write(&args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}, writer)?; - {{/required}} - {{^required}} - if args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}.is_some() { - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::write(args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}.as_ref().as_ref().unwrap(), writer)?; - } else { - writer.write_nil()?; - } - {{/required}} - {{/object}} - {{#enum}} - {{#required}} - writer.write_i32(&(args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}} as i32))?; - {{/required}} - {{^required}} - writer.write_optional_i32(&args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}.map(|f| f as i32))?; - {{/required}} - {{/enum}} - writer.context().pop(); - {{/properties}} - Ok(()) -} - -pub fn deserialize_{{#toLower}}{{type}}{{/toLower}}(args: &[u8]) -> Result<{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}, DecodeError> { - let mut context = Context::new(); - context.description = "Deserializing env-type: {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}".to_string(); - let mut reader = ReadDecoder::new(args, context); - read_{{#toLower}}{{type}}{{/toLower}}(&mut reader) -} - -pub fn read_{{#toLower}}{{type}}{{/toLower}}(reader: &mut R) -> Result<{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}, DecodeError> { - let mut num_of_fields = reader.read_map_length()?; - - {{#properties}} - {{^object}} - let mut _{{#toLower}}{{name}}{{/toLower}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = {{#toWasmInit}}{{toGraphQLType}}{{/toWasmInit}}; - {{/object}} - {{#object}} - {{#required}} - let mut _{{#toLower}}{{name}}{{/toLower}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = {{#toWasmInit}}{{toGraphQLType}}{{/toWasmInit}}; - {{/required}} - {{^required}} - let mut _{{#toLower}}{{name}}{{/toLower}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = None; - {{/required}} - {{/object}} - {{#required}} - let mut _{{#toLower}}{{name}}{{/toLower}}_set = false; - {{/required}} - {{/properties}} - - while num_of_fields > 0 { - num_of_fields -= 1; - let field = reader.read_string()?; - - match field.as_str() { - {{#properties}} - "{{name}}" => { - reader.context().push(&field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property"); - {{#scalar}} - _{{#toLower}}{{name}}{{/toLower}} = reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}()?; - {{/scalar}} - {{#array}} - _{{#toLower}}{{name}}{{/toLower}} = reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(|reader| { - {{> deserialize_array_nobox}} - })?; - {{/array}} - {{#map}} - _{{#toLower}}{{name}}{{/toLower}} = reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(|reader| { - reader.read_{{#key}}{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}{{/key}}()? - }, |reader| { - {{> deserialize_map_value_nobox}} - })?; - {{/map}} - {{#enum}} - {{> deserialize_enum}} - _{{#toLower}}{{name}}{{/toLower}} = value; - {{/enum}} - {{#object}} - {{> deserialize_object_nobox}} - _{{#toLower}}{{name}}{{/toLower}} = object; - {{/object}} - {{#required}} - _{{#toLower}}{{name}}{{/toLower}}_set = true; - {{/required}} - reader.context().pop(); - } - {{/properties}} - err => return Err(DecodeError::UnknownFieldName(err.to_string())), - } - } - {{#properties}} - {{#required}} - if !_{{#toLower}}{{name}}{{/toLower}}_set { - return Err(DecodeError::MissingField("{{name}}: {{type}}.".to_string())); - } - {{/required}} - {{/properties}} - - Ok({{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - {{#properties}} - {{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}: _{{#toLower}}{{name}}{{/toLower}}, - {{/properties}} - }) -} diff --git a/packages/schema/bind/src/bindings/rust/wasm/templates/imported/enum-type/mod-rs.mustache b/packages/schema/bind/src/bindings/rust/wasm/templates/imported/enum-type/mod-rs.mustache deleted file mode 100644 index ff39f8054b..0000000000 --- a/packages/schema/bind/src/bindings/rust/wasm/templates/imported/enum-type/mod-rs.mustache +++ /dev/null @@ -1,55 +0,0 @@ -use polywrap_wasm_rs::EnumTypeError; -use serde::{Serialize, Deserialize}; -use std::convert::TryFrom; - -#[derive(Clone, Copy, Debug, Deserialize, Serialize)] -pub enum {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - {{#constants}} - {{#serdeKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/serdeKeyword}}{{#detectKeyword}}{{.}}{{/detectKeyword}}, - {{/constants}} - _MAX_ -} - -pub fn sanitize_{{#toLower}}{{type}}{{/toLower}}_value(value: i32) -> Result<(), EnumTypeError> { - if value < 0 && value >= {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::_MAX_ as i32 { - return Err(EnumTypeError::EnumProcessingError(format!("Invalid value for enum '{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}': {}", value.to_string()))); - } - Ok(()) -} - -pub fn get_{{#toLower}}{{type}}{{/toLower}}_value(key: &str) -> Result<{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}, EnumTypeError> { - match key { - {{#constants}} - "{{#detectKeyword}}{{.}}{{/detectKeyword}}" => Ok({{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::{{#detectKeyword}}{{.}}{{/detectKeyword}}), - {{/constants}} - "_MAX_" => Ok({{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::_MAX_), - err => Err(EnumTypeError::EnumProcessingError(format!("Invalid key for enum '{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}': {}", err))) - } -} - -pub fn get_{{#toLower}}{{type}}{{/toLower}}_key(value: {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}) -> Result { - if sanitize_{{#toLower}}{{type}}{{/toLower}}_value(value as i32).is_ok() { - match value { - {{#constants}} - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::{{#detectKeyword}}{{.}}{{/detectKeyword}} => Ok("{{#detectKeyword}}{{.}}{{/detectKeyword}}".to_string()), - {{/constants}} - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::_MAX_ => Ok("_MAX_".to_string()), - } - } else { - Err(EnumTypeError::EnumProcessingError(format!("Invalid value for enum '{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}': {}", (value as i32).to_string()))) - } -} - -impl TryFrom for {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - type Error = EnumTypeError; - - fn try_from(v: i32) -> Result<{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}, Self::Error> { - match v { - {{#constants}} - x if x == {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::{{#detectKeyword}}{{.}}{{/detectKeyword}} as i32 => Ok({{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::{{#detectKeyword}}{{.}}{{/detectKeyword}}), - {{/constants}} - x if x == {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::_MAX_ as i32 => Ok({{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::_MAX_), - _ => Err(EnumTypeError::ParseEnumError(format!("Invalid value for enum '{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}': {}", (v as i32).to_string()))), - } - } -} diff --git a/packages/schema/bind/src/bindings/rust/wasm/templates/imported/env-type/mod-rs.mustache b/packages/schema/bind/src/bindings/rust/wasm/templates/imported/env-type/mod-rs.mustache deleted file mode 100644 index 0553426858..0000000000 --- a/packages/schema/bind/src/bindings/rust/wasm/templates/imported/env-type/mod-rs.mustache +++ /dev/null @@ -1,59 +0,0 @@ -use serde::{Serialize, Deserialize}; -pub mod serialization; -use polywrap_wasm_rs::{ - BigInt, - BigNumber, - Map, - DecodeError, - EncodeError, - Read, - Write, - JSON, -}; -pub use serialization::{ - deserialize_{{#toLower}}{{type}}{{/toLower}}, - read_{{#toLower}}{{type}}{{/toLower}}, - serialize_{{#toLower}}{{type}}{{/toLower}}, - write_{{#toLower}}{{type}}{{/toLower}} -}; -{{#propertyDeps.length}} - -{{#propertyDeps}} -use {{crate}}::{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}; -{{/propertyDeps}} -{{/propertyDeps.length}} - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - {{#properties}} - pub {{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}}, - {{/properties}} -} - -impl {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - pub const URI: &'static str = "{{uri}}"; - - pub fn new() -> {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - {{#properties}} - {{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}: {{#toWasmInit}}{{toGraphQLType}}{{/toWasmInit}}, - {{/properties}} - } - } - - pub fn to_buffer(args: &{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}) -> Result, EncodeError> { - serialize_{{#toLower}}{{type}}{{/toLower}}(args).map_err(|e| EncodeError::TypeWriteError(e.to_string())) - } - - pub fn from_buffer(args: &[u8]) -> Result<{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}, DecodeError> { - deserialize_{{#toLower}}{{type}}{{/toLower}}(args).map_err(|e| DecodeError::TypeReadError(e.to_string())) - } - - pub fn write(args: &{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}, writer: &mut W) -> Result<(), EncodeError> { - write_{{#toLower}}{{type}}{{/toLower}}(args, writer).map_err(|e| EncodeError::TypeWriteError(e.to_string())) - } - - pub fn read(reader: &mut R) -> Result<{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}, DecodeError> { - read_{{#toLower}}{{type}}{{/toLower}}(reader).map_err(|e| DecodeError::TypeReadError(e.to_string())) - } -} diff --git a/packages/schema/bind/src/bindings/rust/wasm/templates/imported/env-type/serialization-rs.mustache b/packages/schema/bind/src/bindings/rust/wasm/templates/imported/env-type/serialization-rs.mustache deleted file mode 100644 index e451fe9180..0000000000 --- a/packages/schema/bind/src/bindings/rust/wasm/templates/imported/env-type/serialization-rs.mustache +++ /dev/null @@ -1,169 +0,0 @@ -use std::convert::TryFrom; -use polywrap_wasm_rs::{ - BigInt, - BigNumber, - Map, - Context, - DecodeError, - EncodeError, - Read, - ReadDecoder, - Write, - WriteEncoder, - JSON, -}; -use crate::{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}; -{{#propertyDeps.length}} - -{{/propertyDeps.length}}{{#propertyDeps}} -{{^isEnum}} -use {{crate}}::{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}; -{{/isEnum}} -{{#isEnum}} -use crate::{ - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}, - get_{{#toLower}}{{type}}{{/toLower}}_value, - sanitize_{{#toLower}}{{type}}{{/toLower}}_value -}; -{{/isEnum}} -{{/propertyDeps}} - -pub fn serialize_{{#toLower}}{{type}}{{/toLower}}(args: &{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}) -> Result, EncodeError> { - let mut encoder_context = Context::new(); - encoder_context.description = "Serializing (encoding) imported env-type: {{#toUpper}}{{type}}{{/toUpper}}".to_string(); - let mut encoder = WriteEncoder::new(&[], encoder_context); - write_{{#toLower}}{{type}}{{/toLower}}(args, &mut encoder)?; - Ok(encoder.get_buffer()) -} - -pub fn write_{{#toLower}}{{type}}{{/toLower}}(args: &{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}, writer: &mut W) -> Result<(), EncodeError> { - {{#properties.length}} - writer.write_map_length(&{{properties.length}})?; - {{/properties.length}} - {{^properties}} - writer.write_map_length(&0)?; - {{/properties}} - {{#properties}} - writer.context().push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property"); - writer.write_string("{{name}}")?; - {{#scalar}} - writer.write_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(&args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}})?; - {{/scalar}} - {{#array}} - writer.write_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(&args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}, |writer, item| { - {{> serialize_array}} - })?; - {{/array}} - {{#map}} - writer.write_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(&args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}, |writer, key| { - writer.write_{{#key}}{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}{{/key}}(key) - }, |writer, value| { - {{> serialize_map_value}} - })?; - {{/map}} - {{#object}} - {{#required}} - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::write(&args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}, writer)?; - {{/required}} - {{^required}} - if args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}.is_some() { - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::write(args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}.as_ref().as_ref().unwrap(), writer)?; - } else { - writer.write_nil()?; - } - {{/required}} - {{/object}} - {{#enum}} - {{#required}} - writer.write_i32(&(args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}} as i32))?; - {{/required}} - {{^required}} - writer.write_optional_i32(&args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}.map(|f| f as i32))?; - {{/required}} - {{/enum}} - writer.context().pop(); - {{/properties}} - Ok(()) -} - -pub fn deserialize_{{#toLower}}{{type}}{{/toLower}}(args: &[u8]) -> Result<{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}, DecodeError> { - let mut context = Context::new(); - context.description = "Deserializing imported env-type: {{#toUpper}}{{type}}{{/toUpper}}".to_string(); - let mut reader = ReadDecoder::new(args, context); - read_{{#toLower}}{{type}}{{/toLower}}(&mut reader) -} - -pub fn read_{{#toLower}}{{type}}{{/toLower}}(reader: &mut R) -> Result<{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}, DecodeError> { - let mut num_of_fields = reader.read_map_length()?; - - {{#properties}} - {{^object}} - let mut _{{#toLower}}{{name}}{{/toLower}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = {{#toWasmInit}}{{toGraphQLType}}{{/toWasmInit}}; - {{/object}} - {{#object}} - {{#required}} - let mut _{{#toLower}}{{name}}{{/toLower}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = {{#toWasmInit}}{{toGraphQLType}}{{/toWasmInit}}; - {{/required}} - {{^required}} - let mut _{{#toLower}}{{name}}{{/toLower}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = None; - {{/required}} - {{/object}} - {{#required}} - let mut _{{#toLower}}{{name}}{{/toLower}}_set = false; - {{/required}} - {{/properties}} - - while num_of_fields > 0 { - num_of_fields -= 1; - let field = reader.read_string()?; - - match field.as_str() { - {{#properties}} - "{{name}}" => { - reader.context().push(&field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property"); - {{#scalar}} - _{{#toLower}}{{name}}{{/toLower}} = reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}()?; - {{/scalar}} - {{#array}} - _{{#toLower}}{{name}}{{/toLower}} = reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(|reader| { - {{> deserialize_array_nobox}} - })?; - {{/array}} - {{#map}} - _{{#toLower}}{{name}}{{/toLower}} = reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(|reader| { - reader.read_{{#key}}{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}{{/key}}()? - }, |reader| { - {{> deserialize_map_value_nobox}} - })?; - {{/map}} - {{#enum}} - {{> deserialize_enum}} - _{{#toLower}}{{name}}{{/toLower}} = value; - {{/enum}} - {{#object}} - {{> deserialize_object_nobox}} - _{{#toLower}}{{name}}{{/toLower}} = object; - {{/object}} - {{#required}} - _{{#toLower}}{{name}}{{/toLower}}_set = true; - {{/required}} - reader.context().pop(); - } - {{/properties}} - err => return Err(DecodeError::UnknownFieldName(err.to_string())), - } - } - {{#properties}} - {{#required}} - if !_{{#toLower}}{{name}}{{/toLower}}_set { - return Err(DecodeError::MissingField("{{name}}: {{type}}.".to_string())); - } - {{/required}} - {{/properties}} - - Ok({{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - {{#properties}} - {{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}: _{{#toLower}}{{name}}{{/toLower}}, - {{/properties}} - }) -} diff --git a/packages/schema/bind/src/bindings/rust/wasm/templates/imported/mod-rs.mustache b/packages/schema/bind/src/bindings/rust/wasm/templates/imported/mod-rs.mustache deleted file mode 100644 index 1ba73c7a99..0000000000 --- a/packages/schema/bind/src/bindings/rust/wasm/templates/imported/mod-rs.mustache +++ /dev/null @@ -1,16 +0,0 @@ -{{#importedObjectTypes}} -pub mod {{#toLower}}{{type}}{{/toLower}}; -pub use {{#toLower}}{{type}}{{/toLower}}::*; -{{/importedObjectTypes}} -{{#importedEnumTypes}} -pub mod {{#toLower}}{{type}}{{/toLower}}; -pub use {{#toLower}}{{type}}{{/toLower}}::*; -{{/importedEnumTypes}} -{{#importedModuleTypes}} -pub mod {{#toLower}}{{type}}{{/toLower}}; -pub use {{#toLower}}{{type}}{{/toLower}}::*; -{{/importedModuleTypes}} -{{#importedEnvTypes}} -pub mod {{#toLower}}{{type}}{{/toLower}}; -pub use {{#toLower}}{{type}}{{/toLower}}::*; -{{/importedEnvTypes}} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/rust/wasm/templates/imported/module-type/mod-rs.mustache b/packages/schema/bind/src/bindings/rust/wasm/templates/imported/module-type/mod-rs.mustache deleted file mode 100644 index 68a3c9bb93..0000000000 --- a/packages/schema/bind/src/bindings/rust/wasm/templates/imported/module-type/mod-rs.mustache +++ /dev/null @@ -1,85 +0,0 @@ -use serde::{Serialize, Deserialize}; -use polywrap_wasm_rs::{ - BigInt, - BigNumber, - Map, - Read, - Write, - JSON, - subinvoke, -}; -pub mod serialization; -{{#methods.length}} -pub use serialization::{ - {{#methods}} - deserialize_{{#toLower}}{{name}}{{/toLower}}_result, - serialize_{{#toLower}}{{name}}{{/toLower}}_args, - Args{{#toUpper}}{{name}}{{/toUpper}}{{^last}},{{/last}} - {{/methods}} -}; -{{/methods.length}} -{{#propertyDeps.length}} - -{{#propertyDeps}} -use {{crate}}::{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}; -{{/propertyDeps}} -{{/propertyDeps.length}} - -{{^isInterface}} -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} {} - -impl {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - pub const URI: &'static str = "{{uri}}"; - - pub fn new() -> {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} {} - } - - {{#methods}} - pub fn {{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}(args: &Args{{#toUpper}}{{name}}{{/toUpper}}) -> Result<{{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, String> { - let uri = {{#parent}}{{#toUpper}}{{type}}{{/toUpper}}{{/parent}}::URI; - let args = serialize_{{#toLower}}{{name}}{{/toLower}}_args(args).map_err(|e| e.to_string())?; - let result = subinvoke::wrap_subinvoke( - uri, - "{{name}}", - args, - )?; - deserialize_{{#toLower}}{{name}}{{/toLower}}_result(result.as_slice()).map_err(|e| e.to_string()) - } - {{^last}} - - {{/last}} - {{/methods}} -} -{{/isInterface}} -{{#isInterface}} -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - {{#isInterface}}uri: String{{/isInterface}} -} - -impl {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - pub const INTERFACE_URI: &'static str = "{{uri}}"; - - pub fn new(uri: String) -> {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { uri } - } - - {{#methods}} - pub fn {{#toLower}}{{name}}{{/toLower}}(&self, args: &Args{{#toUpper}}{{name}}{{/toUpper}}) -> Result<{{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, String> { - let ref uri = self.uri; - let args = serialize_{{#toLower}}{{name}}{{/toLower}}_args(args).map_err(|e| e.to_string())?; - let result = subinvoke::wrap_subinvoke( - uri.as_str(), - "{{name}}", - args, - )?; - deserialize_{{#toLower}}{{name}}{{/toLower}}_result(result.as_slice()).map_err(|e| e.to_string()) - } - {{^last}} - - {{/last}} - {{/methods}} -} -{{/isInterface}} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/rust/wasm/templates/imported/module-type/serialization-rs.mustache b/packages/schema/bind/src/bindings/rust/wasm/templates/imported/module-type/serialization-rs.mustache deleted file mode 100644 index c0f580c851..0000000000 --- a/packages/schema/bind/src/bindings/rust/wasm/templates/imported/module-type/serialization-rs.mustache +++ /dev/null @@ -1,268 +0,0 @@ -{{#methods.length}} -use serde::{Serialize, Deserialize}; -use polywrap_wasm_rs::{ - BigInt, - BigNumber, - Map, - Context, - DecodeError, - EncodeError, - Read, - ReadDecoder, - Write, - WriteEncoder, - JSON, -}; -{{#propertyDeps.length}} - -{{#propertyDeps}} -{{^isEnum}} -use {{crate}}::{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}; -{{/isEnum}} -{{#isEnum}} -use crate::{ - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}, - get_{{#toLower}}{{type}}{{/toLower}}_value, - sanitize_{{#toLower}}{{type}}{{/toLower}}_value -}; -{{/isEnum}} -{{/propertyDeps}} -{{/propertyDeps.length}} - -{{#methods}} -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct Args{{#toUpper}}{{name}}{{/toUpper}} { - {{#arguments}} - {{#serdeKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/serdeKeyword}}pub {{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}}, - {{/arguments}} -} - -pub fn deserialize_{{#toLower}}{{name}}{{/toLower}}_args(args: &[u8]) -> Result { - let mut context = Context::new(); - context.description = "Deserializing imported module-type: {{#toLower}}{{name}}{{/toLower}} Args".to_string(); - - {{#arguments.length}} - let mut reader = ReadDecoder::new(args, context); - let mut num_of_fields = reader.read_map_length()?; - - {{#arguments}} - {{^object}} - let mut _{{#toLower}}{{name}}{{/toLower}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = {{#toWasmInit}}{{toGraphQLType}}{{/toWasmInit}}; - {{/object}} - {{#object}} - {{#required}} - let mut _{{#toLower}}{{name}}{{/toLower}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = {{#toWasmInit}}{{toGraphQLType}}{{/toWasmInit}}; - {{/required}} - {{^required}} - let mut _{{#toLower}}{{name}}{{/toLower}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = None; - {{/required}} - {{/object}} - {{#required}} - let mut _{{#toLower}}{{name}}{{/toLower}}_set = false; - {{/required}} - {{/arguments}} - - while num_of_fields > 0 { - num_of_fields -= 1; - let field = reader.read_string()?; - - match field.as_str() { - {{#arguments}} - "{{name}}" => { - reader.context().push(&field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading argument"); - {{#scalar}} - _{{#toLower}}{{name}}{{/toLower}} = reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}()?; - {{/scalar}} - {{#array}} - _{{#toLower}}{{name}}{{/toLower}} = reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(|reader| { - {{> deserialize_array_nobox}} - })?; - {{/array}} - {{#map}} - _{{#toLower}}{{name}}{{/toLower}} = reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(|reader| { - reader.read_{{#key}}{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}{{/key}}() - }, |reader| { - {{> deserialize_map_value_nobox}} - })?; - {{/map}} - {{#enum}} - {{> deserialize_enum}} - _{{#toLower}}{{name}}{{/toLower}} = value; - {{/enum}} - {{#object}} - {{> deserialize_object_refmut}} - _{{#toLower}}{{name}}{{/toLower}} = object; - {{/object}} - {{#required}} - _{{#toLower}}{{name}}{{/toLower}}_set = true; - {{/required}} - reader.context().pop(); - } - {{/arguments}} - err => return Err(DecodeError::UnknownFieldName(err.to_string())), - } - } - {{#arguments}} - {{#required}} - if !_{{#toLower}}{{name}}{{/toLower}}_set { - return Err(DecodeError::MissingField("{{name}}: {{type}}.".to_string())); - } - {{/required}} - {{/arguments}} - {{/arguments.length}} - - Ok(Args{{#toUpper}}{{name}}{{/toUpper}} { - {{#arguments}} - {{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}: _{{#toLower}}{{name}}{{/toLower}}, - {{/arguments}} - }) -} - -pub fn serialize_{{#toLower}}{{name}}{{/toLower}}_args(args: &Args{{#toUpper}}{{name}}{{/toUpper}}) -> Result, EncodeError> { - let mut encoder_context = Context::new(); - encoder_context.description = "Serializing (encoding) imported module-type: {{#toLower}}{{name}}{{/toLower}} Args".to_string(); - let mut encoder = WriteEncoder::new(&[], encoder_context); - write_{{#toLower}}{{name}}{{/toLower}}_args(args, &mut encoder)?; - Ok(encoder.get_buffer()) -} - -pub fn write_{{#toLower}}{{name}}{{/toLower}}_args(args: &Args{{#toUpper}}{{name}}{{/toUpper}}, writer: &mut W) -> Result<(), EncodeError> { - {{#arguments.length}} - writer.write_map_length(&{{arguments.length}})?; - {{/arguments.length}} - {{^arguments}} - writer.write_map_length(&0)?; - {{/arguments}} - {{#arguments}} - writer.context().push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property"); - writer.write_string("{{name}}")?; - {{#scalar}} - writer.write_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(&args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}})?; - {{/scalar}} - {{#array}} - writer.write_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(&args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}, |writer, item| { - {{> serialize_array}} - })?; - {{/array}} - {{#map}} - writer.write_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(&args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}, |writer, key| { - writer.write_{{#key}}{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}{{/key}}(key) - }, |writer, value| { - {{> serialize_map_value}} - })?; - {{/map}} - {{#enum}} - {{#required}} - writer.write_i32(&(args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}} as i32))?; - {{/required}} - {{^required}} - writer.write_optional_i32(&args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}.map(|f| f as i32))?; - {{/required}} - {{/enum}} - {{#object}} - {{#required}} - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::write(&args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}, writer)?; - {{/required}} - {{^required}} - if args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}.is_some() { - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::write(args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}.as_ref().as_ref().unwrap(), writer)?; - } else { - writer.write_nil()?; - } - {{/required}} - {{/object}} - writer.context().pop(); - {{/arguments}} - Ok(()) -} - -pub fn serialize_{{#toLower}}{{name}}{{/toLower}}_result(result: {{#return}}&{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}) -> Result, EncodeError> { - let mut encoder_context = Context::new(); - encoder_context.description = "Serializing (encoding) imported module-type: {{#toLower}}{{name}}{{/toLower}} Result".to_string(); - let mut encoder = WriteEncoder::new(&[], encoder_context); - write_{{#toLower}}{{name}}{{/toLower}}_result(result, &mut encoder)?; - Ok(encoder.get_buffer()) -} - -pub fn write_{{#toLower}}{{name}}{{/toLower}}_result(result: {{#return}}&{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, writer: &mut W) -> Result<(), EncodeError> { - {{#return}} - writer.context().push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing result"); - {{#scalar}} - writer.write_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(result)?; - {{/scalar}} - {{#array}} - writer.write_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(&result, |writer, item| { - {{> serialize_array}} - })?; - {{/array}} - {{#map}} - writer.write_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(&result, |writer, key| { - writer.write_{{#key}}{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}{{/key}}(key) - }, |writer, value| { - {{> serialize_map_value}} - })?; - {{/map}} - {{#enum}} - {{#required}} - writer.write_i32(&(*result as i32))?; - {{/required}} - {{^required}} - writer.write_optional_i32(&result.map(|f| f as i32))?; - {{/required}} - {{/enum}} - {{#object}} - {{#required}} - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::write(&result, writer)?; - {{/required}} - {{^required}} - if result.is_some() { - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::write(result.as_ref().unwrap(), writer)?; - } else { - writer.write_nil()?; - } - {{/required}} - {{/object}} - writer.context().pop(); - {{/return}} - Ok(()) -} - -pub fn deserialize_{{#toLower}}{{name}}{{/toLower}}_result(result: &[u8]) -> Result<{{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, DecodeError> { - let mut context = Context::new(); - context.description = "Deserializing imported module-type: {{#toLower}}{{name}}{{/toLower}} Result".to_string(); - let mut reader = ReadDecoder::new(result, context); - - {{#return}} - reader.context().push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "reading function output"); - {{#scalar}} - let res = reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}()?; - {{/scalar}} - {{#array}} - let res = reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(|reader| { - {{> deserialize_array_nobox}} - })?; - {{/array}} - {{#map}} - let res = reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(|reader| { - reader.read_{{#key}}{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}{{/key}}() - }, |reader| { - {{> deserialize_map_value_nobox}} - })?; - {{/map}} - {{#enum}} - {{> deserialize_enum}} - let res = value; - {{/enum}} - {{#object}} - {{> deserialize_object_refmut}} - let res = object; - {{/object}} - {{/return}} - reader.context().pop(); - Ok(res) -} -{{^last}} - -{{/last}} -{{/methods}} -{{/methods.length}} diff --git a/packages/schema/bind/src/bindings/rust/wasm/templates/imported/object-type/mod-rs.mustache b/packages/schema/bind/src/bindings/rust/wasm/templates/imported/object-type/mod-rs.mustache deleted file mode 100644 index 80312021cc..0000000000 --- a/packages/schema/bind/src/bindings/rust/wasm/templates/imported/object-type/mod-rs.mustache +++ /dev/null @@ -1,59 +0,0 @@ -use serde::{Serialize, Deserialize}; -pub mod serialization; -use polywrap_wasm_rs::{ - BigInt, - BigNumber, - Map, - DecodeError, - EncodeError, - Read, - Write, - JSON, -}; -pub use serialization::{ - deserialize_{{#toLower}}{{type}}{{/toLower}}, - read_{{#toLower}}{{type}}{{/toLower}}, - serialize_{{#toLower}}{{type}}{{/toLower}}, - write_{{#toLower}}{{type}}{{/toLower}} -}; -{{#propertyDeps.length}} - -{{#propertyDeps}} -use {{crate}}::{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}; -{{/propertyDeps}} -{{/propertyDeps.length}} - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - {{#properties}} - {{#serdeKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/serdeKeyword}}pub {{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}}, - {{/properties}} -} - -impl {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - pub const URI: &'static str = "{{uri}}"; - - pub fn new() -> {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - {{#properties}} - {{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}: {{#toWasmInit}}{{toGraphQLType}}{{/toWasmInit}}, - {{/properties}} - } - } - - pub fn to_buffer(args: &{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}) -> Result, EncodeError> { - serialize_{{#toLower}}{{type}}{{/toLower}}(args).map_err(|e| EncodeError::TypeWriteError(e.to_string())) - } - - pub fn from_buffer(args: &[u8]) -> Result<{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}, DecodeError> { - deserialize_{{#toLower}}{{type}}{{/toLower}}(args).map_err(|e| DecodeError::TypeReadError(e.to_string())) - } - - pub fn write(args: &{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}, writer: &mut W) -> Result<(), EncodeError> { - write_{{#toLower}}{{type}}{{/toLower}}(args, writer).map_err(|e| EncodeError::TypeWriteError(e.to_string())) - } - - pub fn read(reader: &mut R) -> Result<{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}, DecodeError> { - read_{{#toLower}}{{type}}{{/toLower}}(reader).map_err(|e| DecodeError::TypeReadError(e.to_string())) - } -} diff --git a/packages/schema/bind/src/bindings/rust/wasm/templates/imported/object-type/serialization-rs.mustache b/packages/schema/bind/src/bindings/rust/wasm/templates/imported/object-type/serialization-rs.mustache deleted file mode 100644 index 5c5d2f149a..0000000000 --- a/packages/schema/bind/src/bindings/rust/wasm/templates/imported/object-type/serialization-rs.mustache +++ /dev/null @@ -1,169 +0,0 @@ -use std::convert::TryFrom; -use polywrap_wasm_rs::{ - BigInt, - BigNumber, - Map, - Context, - DecodeError, - EncodeError, - Read, - ReadDecoder, - Write, - WriteEncoder, - JSON, -}; -use crate::{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}; -{{#propertyDeps.length}} - -{{/propertyDeps.length}}{{#propertyDeps}} -{{^isEnum}} -use {{crate}}::{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}; -{{/isEnum}} -{{#isEnum}} -use crate::{ - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}, - get_{{#toLower}}{{type}}{{/toLower}}_value, - sanitize_{{#toLower}}{{type}}{{/toLower}}_value -}; -{{/isEnum}} -{{/propertyDeps}} - -pub fn serialize_{{#toLower}}{{type}}{{/toLower}}(args: &{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}) -> Result, EncodeError> { - let mut encoder_context = Context::new(); - encoder_context.description = "Serializing (encoding) imported object-type: {{#toUpper}}{{type}}{{/toUpper}}".to_string(); - let mut encoder = WriteEncoder::new(&[], encoder_context); - write_{{#toLower}}{{type}}{{/toLower}}(args, &mut encoder)?; - Ok(encoder.get_buffer()) -} - -pub fn write_{{#toLower}}{{type}}{{/toLower}}(args: &{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}, writer: &mut W) -> Result<(), EncodeError> { - {{#properties.length}} - writer.write_map_length(&{{properties.length}})?; - {{/properties.length}} - {{^properties}} - writer.write_map_length(&0)?; - {{/properties}} - {{#properties}} - writer.context().push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property"); - writer.write_string("{{name}}")?; - {{#scalar}} - writer.write_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(&args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}})?; - {{/scalar}} - {{#array}} - writer.write_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(&args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}, |writer, item| { - {{> serialize_array}} - })?; - {{/array}} - {{#map}} - writer.write_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(&args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}, |writer, key| { - writer.write_{{#key}}{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}{{/key}}(key) - }, |writer, value| { - {{> serialize_map_value}} - })?; - {{/map}} - {{#object}} - {{#required}} - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::write(&args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}, writer)?; - {{/required}} - {{^required}} - if args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}.is_some() { - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::write(args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}.as_ref().as_ref().unwrap(), writer)?; - } else { - writer.write_nil()?; - } - {{/required}} - {{/object}} - {{#enum}} - {{#required}} - writer.write_i32(&(args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}} as i32))?; - {{/required}} - {{^required}} - writer.write_optional_i32(&args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}.map(|f| f as i32))?; - {{/required}} - {{/enum}} - writer.context().pop(); - {{/properties}} - Ok(()) -} - -pub fn deserialize_{{#toLower}}{{type}}{{/toLower}}(args: &[u8]) -> Result<{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}, DecodeError> { - let mut context = Context::new(); - context.description = "Deserializing imported object-type: {{#toUpper}}{{type}}{{/toUpper}}".to_string(); - let mut reader = ReadDecoder::new(args, context); - read_{{#toLower}}{{type}}{{/toLower}}(&mut reader) -} - -pub fn read_{{#toLower}}{{type}}{{/toLower}}(reader: &mut R) -> Result<{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}, DecodeError> { - let mut num_of_fields = reader.read_map_length()?; - - {{#properties}} - {{^object}} - let mut _{{#toLower}}{{name}}{{/toLower}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = {{#toWasmInit}}{{toGraphQLType}}{{/toWasmInit}}; - {{/object}} - {{#object}} - {{#required}} - let mut _{{#toLower}}{{name}}{{/toLower}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = {{#toWasmInit}}{{toGraphQLType}}{{/toWasmInit}}; - {{/required}} - {{^required}} - let mut _{{#toLower}}{{name}}{{/toLower}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = None; - {{/required}} - {{/object}} - {{#required}} - let mut _{{#toLower}}{{name}}{{/toLower}}_set = false; - {{/required}} - {{/properties}} - - while num_of_fields > 0 { - num_of_fields -= 1; - let field = reader.read_string()?; - - match field.as_str() { - {{#properties}} - "{{name}}" => { - reader.context().push(&field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property"); - {{#scalar}} - _{{#toLower}}{{name}}{{/toLower}} = reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}()?; - {{/scalar}} - {{#array}} - _{{#toLower}}{{name}}{{/toLower}} = reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(|reader| { - {{> deserialize_array_nobox}} - })?; - {{/array}} - {{#map}} - _{{#toLower}}{{name}}{{/toLower}} = reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(|reader| { - reader.read_{{#key}}{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}{{/key}}() - }, |reader| { - {{> deserialize_map_value_nobox}} - })?; - {{/map}} - {{#enum}} - {{> deserialize_enum}} - _{{#toLower}}{{name}}{{/toLower}} = value; - {{/enum}} - {{#object}} - {{> deserialize_object_nobox}} - _{{#toLower}}{{name}}{{/toLower}} = object; - {{/object}} - {{#required}} - _{{#toLower}}{{name}}{{/toLower}}_set = true; - {{/required}} - reader.context().pop(); - } - {{/properties}} - err => return Err(DecodeError::UnknownFieldName(err.to_string())), - } - } - {{#properties}} - {{#required}} - if !_{{#toLower}}{{name}}{{/toLower}}_set { - return Err(DecodeError::MissingField("{{name}}: {{type}}.".to_string())); - } - {{/required}} - {{/properties}} - - Ok({{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - {{#properties}} - {{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}: _{{#toLower}}{{name}}{{/toLower}}, - {{/properties}} - }) -} diff --git a/packages/schema/bind/src/bindings/rust/wasm/templates/interface-type/mod-rs.mustache b/packages/schema/bind/src/bindings/rust/wasm/templates/interface-type/mod-rs.mustache deleted file mode 100644 index 3235c088b4..0000000000 --- a/packages/schema/bind/src/bindings/rust/wasm/templates/interface-type/mod-rs.mustache +++ /dev/null @@ -1,23 +0,0 @@ -{{#capabilities}} -{{#getImplementations}} -{{#enabled}} -use polywrap_wasm_rs::wrap_get_implementations; -{{/enabled}} -{{/getImplementations}} -{{/capabilities}} - -pub struct {{#detectKeyword}}{{#toUpper}}{{namespace}}{{/toUpper}}{{/detectKeyword}} {} - -impl {{#detectKeyword}}{{#toUpper}}{{namespace}}{{/toUpper}}{{/detectKeyword}} { - const uri: &'static str = "{{uri}}"; - - {{#capabilities}} - {{#getImplementations}} - {{#enabled}} - pub fn get_implementations() -> Vec { - wrap_get_implementations(Self::uri) - } - {{/enabled}} - {{/getImplementations}} - {{/capabilities}} -} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/rust/wasm/templates/mod-rs.mustache b/packages/schema/bind/src/bindings/rust/wasm/templates/mod-rs.mustache deleted file mode 100644 index 4995ae44f4..0000000000 --- a/packages/schema/bind/src/bindings/rust/wasm/templates/mod-rs.mustache +++ /dev/null @@ -1,61 +0,0 @@ -pub mod entry; -{{#objectTypes}} -pub mod {{#detectKeyword}}{{#toLower}}{{type}}{{/toLower}}{{/detectKeyword}}; -pub use {{#detectKeyword}}{{#toLower}}{{type}}{{/toLower}}{{/detectKeyword}}::{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}; -{{/objectTypes}} -{{#enumTypes}} -pub mod {{#detectKeyword}}{{#toLower}}{{type}}{{/toLower}}{{/detectKeyword}}; -pub use {{#detectKeyword}}{{#toLower}}{{type}}{{/toLower}}{{/detectKeyword}}::{ - get_{{#toLower}}{{type}}{{/toLower}}_key, - get_{{#toLower}}{{type}}{{/toLower}}_value, - sanitize_{{#toLower}}{{type}}{{/toLower}}_value, - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} -}; -{{/enumTypes}} -{{#envType}} -pub mod {{#detectKeyword}}{{#toLower}}{{type}}{{/toLower}}{{/detectKeyword}}; -pub use {{#detectKeyword}}{{#toLower}}{{type}}{{/toLower}}{{/detectKeyword}}::{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}; -{{/envType}} -{{#hasImports}} -pub mod imported; -{{/hasImports}} -{{#importedObjectTypes}} -pub use imported::{{#detectKeyword}}{{#toLower}}{{type}}{{/toLower}}{{/detectKeyword}}::{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}; -{{/importedObjectTypes}} -{{#importedEnumTypes}} -pub use imported::{{#detectKeyword}}{{#toLower}}{{type}}{{/toLower}}{{/detectKeyword}}::{ - get_{{#toLower}}{{type}}{{/toLower}}_key, - get_{{#toLower}}{{type}}{{/toLower}}_value, - sanitize_{{#toLower}}{{type}}{{/toLower}}_value, - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} -}; -{{/importedEnumTypes}} -{{#importedEnvTypes}} -pub use imported::{{#detectKeyword}}{{#toLower}}{{type}}{{/toLower}}{{/detectKeyword}}::{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}; -{{/importedEnvTypes}} -{{#importedModuleTypes}} -pub use imported::{{#detectKeyword}}{{#toLower}}{{type}}{{/toLower}}{{/detectKeyword}}::{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}; -{{/importedModuleTypes}} -{{#interfaceTypes}} -pub mod {{#detectKeyword}}{{#toLower}}{{namespace}}{{/toLower}}{{/detectKeyword}}; -pub use {{#detectKeyword}}{{#toLower}}{{namespace}}{{/toLower}}{{/detectKeyword}}::{{#detectKeyword}}{{#toUpper}}{{namespace}}{{/toUpper}}{{/detectKeyword}}; -{{/interfaceTypes}} -{{#moduleType}} -pub mod {{#detectKeyword}}{{#toLower}}{{type}}{{/toLower}}{{/detectKeyword}}; -pub use {{#detectKeyword}}{{#toLower}}{{type}}{{/toLower}}{{/detectKeyword}}::{ - Module, - ModuleTrait, - {{#methods}} - deserialize_{{#toLower}}{{name}}{{/toLower}}_args, - serialize_{{#toLower}}{{name}}{{/toLower}}_result, - {{#toLower}}{{name}}{{/toLower}}_wrapped, - Args{{#toUpper}}{{name}}{{/toUpper}}{{^last}},{{/last}} - {{/methods}} -}; -{{/moduleType}} - -// Override print!(...) & println!(...) macros -#[macro_export] -macro_rules! println { ($($args:tt)*) => { polywrap_wasm_rs::wrap_debug_log(format!($($args)*).as_str()); } } -#[macro_export] -macro_rules! print { ($($args:tt)*) => { polywrap_wasm_rs::wrap_debug_log(format!($($args)*).as_str()); } } diff --git a/packages/schema/bind/src/bindings/rust/wasm/templates/module-type/mod-rs.mustache b/packages/schema/bind/src/bindings/rust/wasm/templates/module-type/mod-rs.mustache deleted file mode 100644 index ed7476933f..0000000000 --- a/packages/schema/bind/src/bindings/rust/wasm/templates/module-type/mod-rs.mustache +++ /dev/null @@ -1,21 +0,0 @@ -{{#moduleType}} -{{#methods.length}} -pub mod wrapped; -pub use wrapped::{ - {{#methods}} - {{#toLower}}{{name}}{{/toLower}}_wrapped{{^last}},{{/last}} - {{/methods}} -}; -pub mod serialization; -pub use serialization::{ - {{#methods}} - deserialize_{{#toLower}}{{name}}{{/toLower}}_args, - serialize_{{#toLower}}{{name}}{{/toLower}}_result, - Args{{#toUpper}}{{name}}{{/toUpper}}{{^last}},{{/last}} - {{/methods}} -}; -{{/methods.length}} - -pub mod module; -pub use module::*; -{{/moduleType}} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/rust/wasm/templates/module-type/module-rs.mustache b/packages/schema/bind/src/bindings/rust/wasm/templates/module-type/module-rs.mustache deleted file mode 100644 index 1e4490872b..0000000000 --- a/packages/schema/bind/src/bindings/rust/wasm/templates/module-type/module-rs.mustache +++ /dev/null @@ -1,37 +0,0 @@ -{{#moduleType}} -use crate::{ - {{#methods}} - Args{{#toUpper}}{{name}}{{/toUpper}}, - {{/methods}} -}; -use polywrap_wasm_rs::{ - BigInt, - BigNumber, - Map, - JSON, -}; -{{#propertyDeps.length}} - -{{#propertyDeps}} -{{^isEnum}} -use {{crate}}::{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}; -{{/isEnum}} -{{#isEnum}} -use crate::{ - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}, -}; -{{/isEnum}} -{{/propertyDeps}} -{{/propertyDeps.length}} - -pub struct Module; - -pub trait ModuleTrait { - {{#methods}} - fn {{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}(args: Args{{#toUpper}}{{name}}{{/toUpper}}{{#env}}, env: {{#required}}Env{{/required}}{{^required}}Option{{/required}}{{/env}}) -> Result<{{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, String>; - {{^last}} - - {{/last}} - {{/methods}} -} -{{/moduleType}} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/rust/wasm/templates/module-type/serialization-rs.mustache b/packages/schema/bind/src/bindings/rust/wasm/templates/module-type/serialization-rs.mustache deleted file mode 100644 index 2b94133316..0000000000 --- a/packages/schema/bind/src/bindings/rust/wasm/templates/module-type/serialization-rs.mustache +++ /dev/null @@ -1,269 +0,0 @@ -{{#moduleType}} -use serde::{Serialize, Deserialize}; -use std::convert::TryFrom; -use polywrap_wasm_rs::{ - BigInt, - BigNumber, - Map, - Context, - DecodeError, - EncodeError, - Read, - ReadDecoder, - Write, - WriteEncoder, - JSON, -}; -{{#propertyDeps.length}} - -{{#propertyDeps}} -{{^isEnum}} -use {{crate}}::{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}; -{{/isEnum}} -{{#isEnum}} -use crate::{ - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}, - get_{{#toLower}}{{type}}{{/toLower}}_value, - sanitize_{{#toLower}}{{type}}{{/toLower}}_value -}; -{{/isEnum}} -{{/propertyDeps}} -{{/propertyDeps.length}} - -{{#methods}} -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct Args{{#toUpper}}{{name}}{{/toUpper}} { - {{#arguments}} - {{#serdeKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/serdeKeyword}}pub {{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}}, - {{/arguments}} -} - -pub fn deserialize_{{#toLower}}{{name}}{{/toLower}}_args(args: &[u8]) -> Result { - let mut context = Context::new(); - context.description = "Deserializing module-type: {{#toLower}}{{name}}{{/toLower}} Args".to_string(); - - {{#arguments.length}} - let mut reader = ReadDecoder::new(args, context); - let mut num_of_fields = reader.read_map_length()?; - - {{#arguments}} - {{^object}} - let mut _{{#toLower}}{{name}}{{/toLower}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = {{#toWasmInit}}{{toGraphQLType}}{{/toWasmInit}}; - {{/object}} - {{#object}} - {{#required}} - let mut _{{#toLower}}{{name}}{{/toLower}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = {{#toWasmInit}}{{toGraphQLType}}{{/toWasmInit}}; - {{/required}} - {{^required}} - let mut _{{#toLower}}{{name}}{{/toLower}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = None; - {{/required}} - {{/object}} - {{#required}} - let mut _{{#toLower}}{{name}}{{/toLower}}_set = false; - {{/required}} - {{/arguments}} - - while num_of_fields > 0 { - num_of_fields -= 1; - let field = reader.read_string()?; - - match field.as_str() { - {{#arguments}} - "{{name}}" => { - reader.context().push(&field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading argument"); - {{#scalar}} - _{{#toLower}}{{name}}{{/toLower}} = reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}()?; - {{/scalar}} - {{#array}} - _{{#toLower}}{{name}}{{/toLower}} = reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(|reader| { - {{> deserialize_array_nobox}} - })?; - {{/array}} - {{#map}} - _{{#toLower}}{{name}}{{/toLower}} = reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(|reader| { - reader.read_{{#key}}{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}{{/key}}() - }, |reader| { - {{> deserialize_map_value_nobox}} - })?; - {{/map}} - {{#enum}} - {{> deserialize_enum}} - _{{#toLower}}{{name}}{{/toLower}} = value; - {{/enum}} - {{#object}} - {{> deserialize_object_refmut}} - _{{#toLower}}{{name}}{{/toLower}} = object; - {{/object}} - {{#required}} - _{{#toLower}}{{name}}{{/toLower}}_set = true; - {{/required}} - reader.context().pop(); - } - {{/arguments}} - err => return Err(DecodeError::UnknownFieldName(err.to_string())), - } - } - {{#arguments}} - {{#required}} - if !_{{#toLower}}{{name}}{{/toLower}}_set { - return Err(DecodeError::MissingField("{{name}}: {{type}}.".to_string())); - } - {{/required}} - {{/arguments}} - {{/arguments.length}} - - Ok(Args{{#toUpper}}{{name}}{{/toUpper}} { - {{#arguments}} - {{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}: _{{#toLower}}{{name}}{{/toLower}}, - {{/arguments}} - }) -} - -pub fn serialize_{{#toLower}}{{name}}{{/toLower}}_args(args: &Args{{#toUpper}}{{name}}{{/toUpper}}) -> Result, EncodeError> { - let mut encoder_context = Context::new(); - encoder_context.description = "Serializing (encoding) module-type: {{#toLower}}{{name}}{{/toLower}} Args".to_string(); - let mut encoder = WriteEncoder::new(&[], encoder_context); - write_{{#toLower}}{{name}}{{/toLower}}_args(args, &mut encoder)?; - Ok(encoder.get_buffer()) -} - -pub fn write_{{#toLower}}{{name}}{{/toLower}}_args(args: &Args{{#toUpper}}{{name}}{{/toUpper}}, writer: &mut W) -> Result<(), EncodeError> { - {{#arguments.length}} - writer.write_map_length(&{{arguments.length}})?; - {{/arguments.length}} - {{^arguments}} - writer.write_map_length(&0)?; - {{/arguments}} - {{#arguments}} - writer.context().push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property"); - writer.write_string("{{name}}")?; - {{#scalar}} - writer.write_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(&args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}})?; - {{/scalar}} - {{#array}} - writer.write_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(&args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}, |writer, item| { - {{> serialize_array}} - })?; - {{/array}} - {{#map}} - writer.write_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(&args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}, |writer, key| { - writer.write_{{#key}}{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}{{/key}}(key) - }, |writer, value| { - {{> serialize_map_value}} - })?; - {{/map}} - {{#enum}} - {{#required}} - writer.write_i32(&(args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}} as i32))?; - {{/required}} - {{^required}} - writer.write_optional_i32(&args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}.map(|f| f as i32))?; - {{/required}} - {{/enum}} - {{#object}} - {{#required}} - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::write(&args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}, writer)?; - {{/required}} - {{^required}} - if args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}.is_some() { - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::write(args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}.as_ref().as_ref().unwrap(), writer)?; - } else { - writer.write_nil()?; - } - {{/required}} - {{/object}} - writer.context().pop(); - {{/arguments}} - Ok(()) -} - -pub fn serialize_{{#toLower}}{{name}}{{/toLower}}_result(result: {{#return}}&{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}) -> Result, EncodeError> { - let mut encoder_context = Context::new(); - encoder_context.description = "Serializing (encoding) module-type: {{#toLower}}{{name}}{{/toLower}} Result".to_string(); - let mut encoder = WriteEncoder::new(&[], encoder_context); - write_{{#toLower}}{{name}}{{/toLower}}_result(result, &mut encoder)?; - Ok(encoder.get_buffer()) -} - -pub fn write_{{#toLower}}{{name}}{{/toLower}}_result(result: {{#return}}&{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, writer: &mut W) -> Result<(), EncodeError> { - {{#return}} - writer.context().push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing result"); - {{#scalar}} - writer.write_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(result)?; - {{/scalar}} - {{#array}} - writer.write_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(&result, |writer, item| { - {{> serialize_array}} - })?; - {{/array}} - {{#map}} - writer.write_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(&result, |writer, key| { - writer.write_{{#key}}{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}{{/key}}(key) - }, |writer, value| { - {{> serialize_map_value}} - })?; - {{/map}} - {{#enum}} - {{#required}} - writer.write_i32(&(*result as i32))?; - {{/required}} - {{^required}} - writer.write_optional_i32(&result.map(|f| f as i32))?; - {{/required}} - {{/enum}} - {{#object}} - {{#required}} - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::write(&result, writer)?; - {{/required}} - {{^required}} - if result.is_some() { - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::write(result.as_ref().unwrap(), writer)?; - } else { - writer.write_nil()?; - } - {{/required}} - {{/object}} - writer.context().pop(); - {{/return}} - Ok(()) -} - -pub fn deserialize_{{#toLower}}{{name}}{{/toLower}}_result(result: &[u8]) -> Result<{{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, DecodeError> { - let mut context = Context::new(); - context.description = "Deserializing module-type: {{#toLower}}{{name}}{{/toLower}} Result".to_string(); - let mut reader = ReadDecoder::new(result, context); - - {{#return}} - reader.context().push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "reading function output"); - {{#scalar}} - let res = reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}()?; - {{/scalar}} - {{#array}} - let res = reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(|reader| { - {{> deserialize_array_nobox}} - })?; - {{/array}} - {{#map}} - let res = reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(|reader| { - reader.read_{{#key}}{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}{{/key}}() - }, |reader| { - {{> deserialize_map_value_nobox}} - })?; - {{/map}} - {{#enum}} - {{> deserialize_enum}} - let res = value; - {{/enum}} - {{#object}} - {{> deserialize_object_refmut}} - let res = object; - {{/object}} - {{/return}} - reader.context().pop(); - Ok(res) -} -{{^last}} - -{{/last}} -{{/methods}} -{{/moduleType}} diff --git a/packages/schema/bind/src/bindings/rust/wasm/templates/module-type/wrapped-rs.mustache b/packages/schema/bind/src/bindings/rust/wasm/templates/module-type/wrapped-rs.mustache deleted file mode 100644 index 1ab6becd14..0000000000 --- a/packages/schema/bind/src/bindings/rust/wasm/templates/module-type/wrapped-rs.mustache +++ /dev/null @@ -1,71 +0,0 @@ -{{#moduleType}} -{{#methods.length}} -use polywrap_wasm_rs::{ - wrap_load_env -}; - -use crate::{ - {{#methods}} - Args{{#toUpper}}{{name}}{{/toUpper}}, - deserialize_{{#toLower}}{{name}}{{/toLower}}_args, - serialize_{{#toLower}}{{name}}{{/toLower}}_result{{^last}},{{/last}} - {{/methods}} -}; -{{/methods.length}} - -use crate::module::{ModuleTrait, Module}; -{{#envType}} -use crate::Env; -{{/envType}} - -{{#methods}} -pub fn {{#toLower}}{{name}}{{/toLower}}_wrapped(args: &[u8], env_size: u32) -> Vec { - {{#env}} - {{#required}} - if env_size == 0 { - panic!("Environment is not set, and it is required by method '{{name}}'"); - } - - let env_buf = wrap_load_env(env_size); - let env = Env::from_buffer(&env_buf).unwrap(); - - {{/required}} - {{^required}} - let mut env: Option = None; - if env_size > 0 { - let env_buf = wrap_load_env(env_size); - env = Some(Env::from_buffer(&env_buf).unwrap()); - } - - {{/required}} - {{/env}} - {{#arguments.length}} - match deserialize_{{#toLower}}{{name}}{{/toLower}}_args(args) { - Ok(args) => { - {{/arguments.length}} - let result = Module::{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}(Args{{#toUpper}}{{name}}{{/toUpper}} { - {{#arguments}} - {{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}: args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}, - {{/arguments}} - }{{#env}}, env{{/env}}); - match result { - Ok(res) => { - serialize_{{#toLower}}{{name}}{{/toLower}}_result({{#return}}&{{/return}}res).unwrap() - } - Err(e) => { - panic!("{}", e.to_string()) - } - } - {{#arguments.length}} - } - Err(e) => { - panic!("{}", e.to_string()) - } - } - {{/arguments.length}} -} -{{^last}} - -{{/last}} -{{/methods}} -{{/moduleType}} \ No newline at end of file diff --git a/packages/schema/bind/src/bindings/rust/wasm/templates/object-type/mod-rs.mustache b/packages/schema/bind/src/bindings/rust/wasm/templates/object-type/mod-rs.mustache deleted file mode 100644 index 1dc58d4cb4..0000000000 --- a/packages/schema/bind/src/bindings/rust/wasm/templates/object-type/mod-rs.mustache +++ /dev/null @@ -1,55 +0,0 @@ -use serde::{Serialize, Deserialize}; -pub mod serialization; -use polywrap_wasm_rs::{ - BigInt, - BigNumber, - Map, - DecodeError, - EncodeError, - Read, - Write, - JSON, -}; -pub use serialization::{ - deserialize_{{#toLower}}{{type}}{{/toLower}}, - read_{{#toLower}}{{type}}{{/toLower}}, - serialize_{{#toLower}}{{type}}{{/toLower}}, - write_{{#toLower}}{{type}}{{/toLower}} -}; - -{{#propertyDeps}} -use {{crate}}::{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}; -{{/propertyDeps}} - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - {{#properties}} - {{#serdeKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/serdeKeyword}}pub {{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}}, - {{/properties}} -} - -impl {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - pub fn new() -> {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - {{#properties}} - {{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}: {{#toWasmInit}}{{toGraphQLType}}{{/toWasmInit}}, - {{/properties}} - } - } - - pub fn to_buffer(args: &{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}) -> Result, EncodeError> { - serialize_{{#toLower}}{{type}}{{/toLower}}(args).map_err(|e| EncodeError::TypeWriteError(e.to_string())) - } - - pub fn from_buffer(args: &[u8]) -> Result<{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}, DecodeError> { - deserialize_{{#toLower}}{{type}}{{/toLower}}(args).map_err(|e| DecodeError::TypeReadError(e.to_string())) - } - - pub fn write(args: &{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}, writer: &mut W) -> Result<(), EncodeError> { - write_{{#toLower}}{{type}}{{/toLower}}(args, writer).map_err(|e| EncodeError::TypeWriteError(e.to_string())) - } - - pub fn read(reader: &mut R) -> Result<{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}, DecodeError> { - read_{{#toLower}}{{type}}{{/toLower}}(reader).map_err(|e| DecodeError::TypeReadError(e.to_string())) - } -} diff --git a/packages/schema/bind/src/bindings/rust/wasm/templates/object-type/serialization-rs.mustache b/packages/schema/bind/src/bindings/rust/wasm/templates/object-type/serialization-rs.mustache deleted file mode 100644 index 0743b3c9f3..0000000000 --- a/packages/schema/bind/src/bindings/rust/wasm/templates/object-type/serialization-rs.mustache +++ /dev/null @@ -1,169 +0,0 @@ -use std::convert::TryFrom; -use polywrap_wasm_rs::{ - BigInt, - BigNumber, - Map, - Context, - DecodeError, - EncodeError, - Read, - ReadDecoder, - Write, - WriteEncoder, - JSON, -}; -use crate::{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}; -{{#propertyDeps.length}} - -{{/propertyDeps.length}}{{#propertyDeps}} -{{^isEnum}} -use {{crate}}::{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}; -{{/isEnum}} -{{#isEnum}} -use crate::{ - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}, - get_{{#toLower}}{{type}}{{/toLower}}_value, - sanitize_{{#toLower}}{{type}}{{/toLower}}_value -}; -{{/isEnum}} -{{/propertyDeps}} - -pub fn serialize_{{#toLower}}{{type}}{{/toLower}}(args: &{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}) -> Result, EncodeError> { - let mut encoder_context = Context::new(); - encoder_context.description = "Serializing (encoding) object-type: {{#toUpper}}{{type}}{{/toUpper}}".to_string(); - let mut encoder = WriteEncoder::new(&[], encoder_context); - write_{{#toLower}}{{type}}{{/toLower}}(args, &mut encoder)?; - Ok(encoder.get_buffer()) -} - -pub fn write_{{#toLower}}{{type}}{{/toLower}}(args: &{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}, writer: &mut W) -> Result<(), EncodeError> { - {{#properties.length}} - writer.write_map_length(&{{properties.length}})?; - {{/properties.length}} - {{^properties}} - writer.write_map_length(&0)?; - {{/properties}} - {{#properties}} - writer.context().push("{{name}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property"); - writer.write_string("{{name}}")?; - {{#scalar}} - writer.write_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(&args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}})?; - {{/scalar}} - {{#array}} - writer.write_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(&args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}, |writer, item| { - {{> serialize_array}} - })?; - {{/array}} - {{#map}} - writer.write_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(&args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}, |writer, key| { - writer.write_{{#key}}{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}{{/key}}(key) - }, |writer, value| { - {{> serialize_map_value}} - })?; - {{/map}} - {{#object}} - {{#required}} - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::write(&args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}, writer)?; - {{/required}} - {{^required}} - if args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}.is_some() { - {{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}::write(args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}.as_ref().as_ref().unwrap(), writer)?; - } else { - writer.write_nil()?; - } - {{/required}} - {{/object}} - {{#enum}} - {{#required}} - writer.write_i32(&(args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}} as i32))?; - {{/required}} - {{^required}} - writer.write_optional_i32(&args.{{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}.map(|f| f as i32))?; - {{/required}} - {{/enum}} - writer.context().pop(); - {{/properties}} - Ok(()) -} - -pub fn deserialize_{{#toLower}}{{type}}{{/toLower}}(args: &[u8]) -> Result<{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}, DecodeError> { - let mut context = Context::new(); - context.description = "Deserializing object-type: {{#toUpper}}{{type}}{{/toUpper}}".to_string(); - let mut reader = ReadDecoder::new(args, context); - read_{{#toLower}}{{type}}{{/toLower}}(&mut reader) -} - -pub fn read_{{#toLower}}{{type}}{{/toLower}}(reader: &mut R) -> Result<{{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}}, DecodeError> { - let mut num_of_fields = reader.read_map_length()?; - - {{#properties}} - {{^object}} - let mut _{{#toLower}}{{name}}{{/toLower}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = {{#toWasmInit}}{{toGraphQLType}}{{/toWasmInit}}; - {{/object}} - {{#object}} - {{#required}} - let mut _{{#toLower}}{{name}}{{/toLower}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = {{#toWasmInit}}{{toGraphQLType}}{{/toWasmInit}}; - {{/required}} - {{^required}} - let mut _{{#toLower}}{{name}}{{/toLower}}: {{#toWasm}}{{toGraphQLType}}{{/toWasm}} = None; - {{/required}} - {{/object}} - {{#required}} - let mut _{{#toLower}}{{name}}{{/toLower}}_set = false; - {{/required}} - {{/properties}} - - while num_of_fields > 0 { - num_of_fields -= 1; - let field = reader.read_string()?; - - match field.as_str() { - {{#properties}} - "{{name}}" => { - reader.context().push(&field, "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "type found, reading property"); - {{#scalar}} - _{{#toLower}}{{name}}{{/toLower}} = reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}()?; - {{/scalar}} - {{#array}} - _{{#toLower}}{{name}}{{/toLower}} = reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(|reader| { - {{> deserialize_array_nobox}} - })?; - {{/array}} - {{#map}} - _{{#toLower}}{{name}}{{/toLower}} = reader.read_{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}(|reader| { - reader.read_{{#key}}{{#toLower}}{{#toMsgPack}}{{toGraphQLType}}{{/toMsgPack}}{{/toLower}}{{/key}}() - }, |reader| { - {{> deserialize_map_value_nobox}} - })?; - {{/map}} - {{#enum}} - {{> deserialize_enum}} - _{{#toLower}}{{name}}{{/toLower}} = value; - {{/enum}} - {{#object}} - {{> deserialize_object_nobox}} - _{{#toLower}}{{name}}{{/toLower}} = object; - {{/object}} - {{#required}} - _{{#toLower}}{{name}}{{/toLower}}_set = true; - {{/required}} - reader.context().pop(); - } - {{/properties}} - err => return Err(DecodeError::UnknownFieldName(err.to_string())), - } - } - {{#properties}} - {{#required}} - if !_{{#toLower}}{{name}}{{/toLower}}_set { - return Err(DecodeError::MissingField("{{name}}: {{type}}.".to_string())); - } - {{/required}} - {{/properties}} - - Ok({{#detectKeyword}}{{#toUpper}}{{type}}{{/toUpper}}{{/detectKeyword}} { - {{#properties}} - {{#detectKeyword}}{{#toLower}}{{name}}{{/toLower}}{{/detectKeyword}}: _{{#toLower}}{{name}}{{/toLower}}, - {{/properties}} - }) -} diff --git a/packages/templates/plugin/rust/Cargo.toml b/packages/templates/plugin/rust/Cargo.toml index 1715867d8b..347cd75813 100644 --- a/packages/templates/plugin/rust/Cargo.toml +++ b/packages/templates/plugin/rust/Cargo.toml @@ -11,10 +11,11 @@ include = [ ] [dependencies] -polywrap_core = { version = "0.1.6-beta.1" } -polywrap_plugin = { version = "0.1.6-beta.1" } -polywrap_msgpack = { version = "0.1.6-beta.1" } -wrap_manifest_schemas = { version = "0.1.6-beta.1" } +polywrap_core = { version = "~0.1.6-beta.1" } +polywrap_plugin = { version = "~0.1.6-beta.1" } +polywrap_msgpack = { version = "~0.1.6-beta.1" } +polywrap_msgpack_serde = { version = "~0.0.2-beta.1" } +wrap_manifest_schemas = { version = "~0.1.6-beta.1" } serde = {version = "1.0.145", features = ["derive"]} [dev-dependencies] diff --git a/packages/templates/plugin/rust/src/lib.rs b/packages/templates/plugin/rust/src/lib.rs index 73e8c4539c..6fc1dc2105 100644 --- a/packages/templates/plugin/rust/src/lib.rs +++ b/packages/templates/plugin/rust/src/lib.rs @@ -1,5 +1,5 @@ use crate::wrap::wrap_info::get_manifest; -use polywrap_core::invoke::Invoker; +use polywrap_core::invoker::Invoker; use polywrap_plugin::{error::PluginError, implementor::plugin_impl, JSON}; use wrap::{ module::{ArgsSampleMethod, Module}, diff --git a/packages/templates/plugin/rust/tests/e2e.rs b/packages/templates/plugin/rust/tests/e2e.rs index e0dbf56088..9c16e8b54b 100644 --- a/packages/templates/plugin/rust/tests/e2e.rs +++ b/packages/templates/plugin/rust/tests/e2e.rs @@ -1,16 +1,13 @@ use template_plugin_rs::SamplePlugin; use polywrap_core::{ client::ClientConfig, - resolvers::{ - static_resolver::{StaticResolver, StaticResolverLike}, - uri_resolution_context::UriPackage, - }, uri::Uri, }; use polywrap_msgpack::{msgpack}; use polywrap_plugin::{package::PluginPackage}; use polywrap_client::{ client::PolywrapClient, + builder::{PolywrapClientConfig, PolywrapClientConfigBuilder}, }; use std::{ sync::{Arc, Mutex}, @@ -18,19 +15,15 @@ use std::{ fn get_client() -> PolywrapClient { let sample_plugin = SamplePlugin {}; - let plugin_pkg: PluginPackage = sample_plugin.into(); - let package = Arc::new(Mutex::new(plugin_pkg)); + let plugin_pkg = PluginPackage::::from(sample_plugin); - let resolver = StaticResolver::from(vec![StaticResolverLike::Package(UriPackage { - uri: Uri::try_from("plugin/sample").unwrap(), - package, - })]); + let mut config = PolywrapClientConfig::new(); + config.add_package( + Uri::try_from("plugin/sample").unwrap(), + Arc::new(plugin_pkg) + ); - PolywrapClient::new(ClientConfig { - resolver: Arc::new(resolver), - interfaces: None, - envs: None, - }) + PolywrapClient::new(config.into()) } #[test] diff --git a/packages/templates/tests.spec.ts b/packages/templates/tests.spec.ts index 395fb12314..eb5b8d3937 100644 --- a/packages/templates/tests.spec.ts +++ b/packages/templates/tests.spec.ts @@ -36,8 +36,8 @@ describe("Templates", () => { }, "plugin/rust": { codegen: "npx polywrap codegen", - build: "cargo build", - test: "cargo test", + /*build: "cargo build", + test: "cargo test",*/ }, interface: { build: "npx polywrap build" }, }; diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/_else/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/_else/mod.rs index d474a4a346..1e13036df9 100644 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/_else/mod.rs +++ b/packages/test-cases/cases/bind/sanity/output/wrap-rs/_else/mod.rs @@ -1,23 +1,15 @@ use serde::{Serialize, Deserialize}; -pub mod serialization; +use polywrap_msgpack_serde::{ + wrappers::polywrap_json::JSONString, + wrappers::polywrap_bigint::BigIntWrapper +}; use polywrap_wasm_rs::{ BigInt, BigNumber, Map, - DecodeError, - EncodeError, - Read, - Write, - JSON, -}; -pub use serialization::{ - deserialize_else, - read_else, - serialize_else, - write_else + JSON }; - #[derive(Clone, Debug, Deserialize, Serialize)] pub struct Else { #[serde(rename = "else")] @@ -30,20 +22,4 @@ impl Else { _else: String::new(), } } - - pub fn to_buffer(args: &Else) -> Result, EncodeError> { - serialize_else(args).map_err(|e| EncodeError::TypeWriteError(e.to_string())) - } - - pub fn from_buffer(args: &[u8]) -> Result { - deserialize_else(args).map_err(|e| DecodeError::TypeReadError(e.to_string())) - } - - pub fn write(args: &Else, writer: &mut W) -> Result<(), EncodeError> { - write_else(args, writer).map_err(|e| EncodeError::TypeWriteError(e.to_string())) - } - - pub fn read(reader: &mut R) -> Result { - read_else(reader).map_err(|e| DecodeError::TypeReadError(e.to_string())) - } } diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/_else/serialization.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/_else/serialization.rs deleted file mode 100644 index 5e0481623e..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/_else/serialization.rs +++ /dev/null @@ -1,68 +0,0 @@ -use std::convert::TryFrom; -use polywrap_wasm_rs::{ - BigInt, - BigNumber, - Map, - Context, - DecodeError, - EncodeError, - Read, - ReadDecoder, - Write, - WriteEncoder, - JSON, -}; -use crate::Else; - -pub fn serialize_else(args: &Else) -> Result, EncodeError> { - let mut encoder_context = Context::new(); - encoder_context.description = "Serializing (encoding) object-type: Else".to_string(); - let mut encoder = WriteEncoder::new(&[], encoder_context); - write_else(args, &mut encoder)?; - Ok(encoder.get_buffer()) -} - -pub fn write_else(args: &Else, writer: &mut W) -> Result<(), EncodeError> { - writer.write_map_length(&1)?; - writer.context().push("else", "String", "writing property"); - writer.write_string("else")?; - writer.write_string(&args._else)?; - writer.context().pop(); - Ok(()) -} - -pub fn deserialize_else(args: &[u8]) -> Result { - let mut context = Context::new(); - context.description = "Deserializing object-type: Else".to_string(); - let mut reader = ReadDecoder::new(args, context); - read_else(&mut reader) -} - -pub fn read_else(reader: &mut R) -> Result { - let mut num_of_fields = reader.read_map_length()?; - - let mut _else: String = String::new(); - let mut _else_set = false; - - while num_of_fields > 0 { - num_of_fields -= 1; - let field = reader.read_string()?; - - match field.as_str() { - "else" => { - reader.context().push(&field, "String", "type found, reading property"); - _else = reader.read_string()?; - _else_set = true; - reader.context().pop(); - } - err => return Err(DecodeError::UnknownFieldName(err.to_string())), - } - } - if !_else_set { - return Err(DecodeError::MissingField("else: String.".to_string())); - } - - Ok(Else { - _else: _else, - }) -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/_while/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/_while/mod.rs index a17acc23f4..94f61f4505 100644 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/_while/mod.rs +++ b/packages/test-cases/cases/bind/sanity/output/wrap-rs/_while/mod.rs @@ -4,7 +4,9 @@ use std::convert::TryFrom; #[derive(Clone, Copy, Debug, Deserialize, Serialize)] pub enum While { + #[serde(rename = "for")] _for, + #[serde(rename = "in")] _in, _MAX_ } diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/another_type/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/another_type/mod.rs index 15091a2e37..171fa6448a 100644 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/another_type/mod.rs +++ b/packages/test-cases/cases/bind/sanity/output/wrap-rs/another_type/mod.rs @@ -1,22 +1,14 @@ use serde::{Serialize, Deserialize}; -pub mod serialization; +use polywrap_msgpack_serde::{ + wrappers::polywrap_json::JSONString, + wrappers::polywrap_bigint::BigIntWrapper +}; use polywrap_wasm_rs::{ BigInt, BigNumber, Map, - DecodeError, - EncodeError, - Read, - Write, - JSON, -}; -pub use serialization::{ - deserialize_another_type, - read_another_type, - serialize_another_type, - write_another_type + JSON }; - use crate::CustomType; #[derive(Clone, Debug, Deserialize, Serialize)] @@ -35,20 +27,4 @@ impl AnotherType { _const: None, } } - - pub fn to_buffer(args: &AnotherType) -> Result, EncodeError> { - serialize_another_type(args).map_err(|e| EncodeError::TypeWriteError(e.to_string())) - } - - pub fn from_buffer(args: &[u8]) -> Result { - deserialize_another_type(args).map_err(|e| DecodeError::TypeReadError(e.to_string())) - } - - pub fn write(args: &AnotherType, writer: &mut W) -> Result<(), EncodeError> { - write_another_type(args, writer).map_err(|e| EncodeError::TypeWriteError(e.to_string())) - } - - pub fn read(reader: &mut R) -> Result { - read_another_type(reader).map_err(|e| DecodeError::TypeReadError(e.to_string())) - } } diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/another_type/serialization.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/another_type/serialization.rs deleted file mode 100644 index f8c50b4675..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/another_type/serialization.rs +++ /dev/null @@ -1,97 +0,0 @@ -use std::convert::TryFrom; -use polywrap_wasm_rs::{ - BigInt, - BigNumber, - Map, - Context, - DecodeError, - EncodeError, - Read, - ReadDecoder, - Write, - WriteEncoder, - JSON, -}; -use crate::AnotherType; - -use crate::CustomType; - -pub fn serialize_another_type(args: &AnotherType) -> Result, EncodeError> { - let mut encoder_context = Context::new(); - encoder_context.description = "Serializing (encoding) object-type: AnotherType".to_string(); - let mut encoder = WriteEncoder::new(&[], encoder_context); - write_another_type(args, &mut encoder)?; - Ok(encoder.get_buffer()) -} - -pub fn write_another_type(args: &AnotherType, writer: &mut W) -> Result<(), EncodeError> { - writer.write_map_length(&3)?; - writer.context().push("prop", "Option", "writing property"); - writer.write_string("prop")?; - writer.write_optional_string(&args.prop)?; - writer.context().pop(); - writer.context().push("circular", "Option", "writing property"); - writer.write_string("circular")?; - if args.circular.is_some() { - CustomType::write(args.circular.as_ref().as_ref().unwrap(), writer)?; - } else { - writer.write_nil()?; - } - writer.context().pop(); - writer.context().push("const", "Option", "writing property"); - writer.write_string("const")?; - writer.write_optional_string(&args._const)?; - writer.context().pop(); - Ok(()) -} - -pub fn deserialize_another_type(args: &[u8]) -> Result { - let mut context = Context::new(); - context.description = "Deserializing object-type: AnotherType".to_string(); - let mut reader = ReadDecoder::new(args, context); - read_another_type(&mut reader) -} - -pub fn read_another_type(reader: &mut R) -> Result { - let mut num_of_fields = reader.read_map_length()?; - - let mut _prop: Option = None; - let mut _circular: Option = None; - let mut _const: Option = None; - - while num_of_fields > 0 { - num_of_fields -= 1; - let field = reader.read_string()?; - - match field.as_str() { - "prop" => { - reader.context().push(&field, "Option", "type found, reading property"); - _prop = reader.read_optional_string()?; - reader.context().pop(); - } - "circular" => { - reader.context().push(&field, "Option", "type found, reading property"); - let mut object: Option = None; - if !reader.is_next_nil()? { - object = Some(CustomType::read(reader)?); - } else { - object = None; - } - _circular = object; - reader.context().pop(); - } - "const" => { - reader.context().push(&field, "Option", "type found, reading property"); - _const = reader.read_optional_string()?; - reader.context().pop(); - } - err => return Err(DecodeError::UnknownFieldName(err.to_string())), - } - } - - Ok(AnotherType { - prop: _prop, - circular: _circular, - _const: _const, - }) -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_enum/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_enum/mod.rs index dd8f6bb187..477827bda7 100644 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_enum/mod.rs +++ b/packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_enum/mod.rs @@ -4,7 +4,9 @@ use std::convert::TryFrom; #[derive(Clone, Copy, Debug, Deserialize, Serialize)] pub enum CustomEnum { + #[serde(rename = "STRING")] STRING, + #[serde(rename = "BYTES")] BYTES, _MAX_ } diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_map_value/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_map_value/mod.rs index e8c525f0ea..29689350bb 100644 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_map_value/mod.rs +++ b/packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_map_value/mod.rs @@ -1,23 +1,15 @@ use serde::{Serialize, Deserialize}; -pub mod serialization; +use polywrap_msgpack_serde::{ + wrappers::polywrap_json::JSONString, + wrappers::polywrap_bigint::BigIntWrapper +}; use polywrap_wasm_rs::{ BigInt, BigNumber, Map, - DecodeError, - EncodeError, - Read, - Write, - JSON, -}; -pub use serialization::{ - deserialize_custom_map_value, - read_custom_map_value, - serialize_custom_map_value, - write_custom_map_value + JSON }; - #[derive(Clone, Debug, Deserialize, Serialize)] pub struct CustomMapValue { pub foo: String, @@ -29,20 +21,4 @@ impl CustomMapValue { foo: String::new(), } } - - pub fn to_buffer(args: &CustomMapValue) -> Result, EncodeError> { - serialize_custom_map_value(args).map_err(|e| EncodeError::TypeWriteError(e.to_string())) - } - - pub fn from_buffer(args: &[u8]) -> Result { - deserialize_custom_map_value(args).map_err(|e| DecodeError::TypeReadError(e.to_string())) - } - - pub fn write(args: &CustomMapValue, writer: &mut W) -> Result<(), EncodeError> { - write_custom_map_value(args, writer).map_err(|e| EncodeError::TypeWriteError(e.to_string())) - } - - pub fn read(reader: &mut R) -> Result { - read_custom_map_value(reader).map_err(|e| DecodeError::TypeReadError(e.to_string())) - } } diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_map_value/serialization.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_map_value/serialization.rs deleted file mode 100644 index aafbc308bd..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_map_value/serialization.rs +++ /dev/null @@ -1,68 +0,0 @@ -use std::convert::TryFrom; -use polywrap_wasm_rs::{ - BigInt, - BigNumber, - Map, - Context, - DecodeError, - EncodeError, - Read, - ReadDecoder, - Write, - WriteEncoder, - JSON, -}; -use crate::CustomMapValue; - -pub fn serialize_custom_map_value(args: &CustomMapValue) -> Result, EncodeError> { - let mut encoder_context = Context::new(); - encoder_context.description = "Serializing (encoding) object-type: CustomMapValue".to_string(); - let mut encoder = WriteEncoder::new(&[], encoder_context); - write_custom_map_value(args, &mut encoder)?; - Ok(encoder.get_buffer()) -} - -pub fn write_custom_map_value(args: &CustomMapValue, writer: &mut W) -> Result<(), EncodeError> { - writer.write_map_length(&1)?; - writer.context().push("foo", "String", "writing property"); - writer.write_string("foo")?; - writer.write_string(&args.foo)?; - writer.context().pop(); - Ok(()) -} - -pub fn deserialize_custom_map_value(args: &[u8]) -> Result { - let mut context = Context::new(); - context.description = "Deserializing object-type: CustomMapValue".to_string(); - let mut reader = ReadDecoder::new(args, context); - read_custom_map_value(&mut reader) -} - -pub fn read_custom_map_value(reader: &mut R) -> Result { - let mut num_of_fields = reader.read_map_length()?; - - let mut _foo: String = String::new(); - let mut _foo_set = false; - - while num_of_fields > 0 { - num_of_fields -= 1; - let field = reader.read_string()?; - - match field.as_str() { - "foo" => { - reader.context().push(&field, "String", "type found, reading property"); - _foo = reader.read_string()?; - _foo_set = true; - reader.context().pop(); - } - err => return Err(DecodeError::UnknownFieldName(err.to_string())), - } - } - if !_foo_set { - return Err(DecodeError::MissingField("foo: String.".to_string())); - } - - Ok(CustomMapValue { - foo: _foo, - }) -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_type/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_type/mod.rs index a15c664dc8..2e53a74ff4 100644 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_type/mod.rs +++ b/packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_type/mod.rs @@ -1,22 +1,14 @@ use serde::{Serialize, Deserialize}; -pub mod serialization; +use polywrap_msgpack_serde::{ + wrappers::polywrap_json::JSONString, + wrappers::polywrap_bigint::BigIntWrapper +}; use polywrap_wasm_rs::{ BigInt, BigNumber, Map, - DecodeError, - EncodeError, - Read, - Write, - JSON, -}; -pub use serialization::{ - deserialize_custom_type, - read_custom_type, - serialize_custom_type, - write_custom_type + JSON }; - use crate::AnotherType; use crate::CustomEnum; use crate::CustomMapValue; @@ -24,8 +16,10 @@ use crate::CustomMapValue; #[derive(Clone, Debug, Deserialize, Serialize)] pub struct CustomType { pub str: String, + #[serde(rename = "optStr")] pub opt_str: Option, pub u: u32, + #[serde(rename = "optU")] pub opt_u: Option, pub u8: u8, pub u16: u16, @@ -34,36 +28,60 @@ pub struct CustomType { pub i8: i8, pub i16: i16, pub i32: i32, - pub bigint: BigInt, - pub opt_bigint: Option, + pub bigint: BigIntWrapper, + #[serde(rename = "optBigint")] + pub opt_bigint: Option, pub bignumber: BigNumber, + #[serde(rename = "optBignumber")] pub opt_bignumber: Option, - pub json: JSON::Value, - pub opt_json: Option, + pub json: JSONString, + #[serde(rename = "optJson")] + pub opt_json: Option, + #[serde(with = "serde_bytes")] pub bytes: Vec, + #[serde(with = "serde_bytes")] + #[serde(rename = "optBytes")] pub opt_bytes: Option>, pub boolean: bool, + #[serde(rename = "optBoolean")] pub opt_boolean: Option, pub u_array: Vec, + #[serde(rename = "uOpt_array")] pub u_opt_array: Option>, + #[serde(rename = "_opt_uOptArray")] pub _opt_u_opt_array: Option>>, + #[serde(rename = "optStrOptArray")] pub opt_str_opt_array: Option>>, + #[serde(rename = "uArrayArray")] pub u_array_array: Vec>, + #[serde(rename = "uOptArrayOptArray")] pub u_opt_array_opt_array: Vec>>>, + #[serde(rename = "uArrayOptArrayArray")] pub u_array_opt_array_array: Vec>>>, + #[serde(rename = "crazyArray")] pub crazy_array: Option>>>>>>, pub object: AnotherType, + #[serde(rename = "optObject")] pub opt_object: Option, + #[serde(rename = "objectArray")] pub object_array: Vec, + #[serde(rename = "optObjectArray")] pub opt_object_array: Option>>, pub en: CustomEnum, + #[serde(rename = "optEnum")] pub opt_enum: Option, + #[serde(rename = "enumArray")] pub enum_array: Vec, + #[serde(rename = "optEnumArray")] pub opt_enum_array: Option>>, pub map: Map, + #[serde(rename = "mapOfArr")] pub map_of_arr: Map>, + #[serde(rename = "mapOfObj")] pub map_of_obj: Map, + #[serde(rename = "mapOfArrOfObj")] pub map_of_arr_of_obj: Map>, + #[serde(rename = "mapCustomValue")] pub map_custom_value: Map>, } @@ -81,11 +99,11 @@ impl CustomType { i8: 0, i16: 0, i32: 0, - bigint: BigInt::default(), + bigint: BigIntWrapper(BigInt::default()), opt_bigint: None, bignumber: BigNumber::default(), opt_bignumber: None, - json: JSON::Value::Null, + json: JSONString::from(JSON::Value::Null), opt_json: None, bytes: vec![], opt_bytes: None, @@ -99,11 +117,11 @@ impl CustomType { u_opt_array_opt_array: vec![], u_array_opt_array_array: vec![], crazy_array: None, - object: AnotherType::new(), + object: Option::new(), opt_object: None, object_array: vec![], opt_object_array: None, - en: CustomEnum::_MAX_, + en: Option::_MAX_, opt_enum: None, enum_array: vec![], opt_enum_array: None, @@ -114,20 +132,4 @@ impl CustomType { map_custom_value: Map::>::new(), } } - - pub fn to_buffer(args: &CustomType) -> Result, EncodeError> { - serialize_custom_type(args).map_err(|e| EncodeError::TypeWriteError(e.to_string())) - } - - pub fn from_buffer(args: &[u8]) -> Result { - deserialize_custom_type(args).map_err(|e| DecodeError::TypeReadError(e.to_string())) - } - - pub fn write(args: &CustomType, writer: &mut W) -> Result<(), EncodeError> { - write_custom_type(args, writer).map_err(|e| EncodeError::TypeWriteError(e.to_string())) - } - - pub fn read(reader: &mut R) -> Result { - read_custom_type(reader).map_err(|e| DecodeError::TypeReadError(e.to_string())) - } } diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_type/serialization.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_type/serialization.rs deleted file mode 100644 index a9faa0a662..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_type/serialization.rs +++ /dev/null @@ -1,851 +0,0 @@ -use std::convert::TryFrom; -use polywrap_wasm_rs::{ - BigInt, - BigNumber, - Map, - Context, - DecodeError, - EncodeError, - Read, - ReadDecoder, - Write, - WriteEncoder, - JSON, -}; -use crate::CustomType; - -use crate::AnotherType; -use crate::{ - CustomEnum, - get_custom_enum_value, - sanitize_custom_enum_value -}; -use crate::CustomMapValue; - -pub fn serialize_custom_type(args: &CustomType) -> Result, EncodeError> { - let mut encoder_context = Context::new(); - encoder_context.description = "Serializing (encoding) object-type: CustomType".to_string(); - let mut encoder = WriteEncoder::new(&[], encoder_context); - write_custom_type(args, &mut encoder)?; - Ok(encoder.get_buffer()) -} - -pub fn write_custom_type(args: &CustomType, writer: &mut W) -> Result<(), EncodeError> { - writer.write_map_length(&42)?; - writer.context().push("str", "String", "writing property"); - writer.write_string("str")?; - writer.write_string(&args.str)?; - writer.context().pop(); - writer.context().push("optStr", "Option", "writing property"); - writer.write_string("optStr")?; - writer.write_optional_string(&args.opt_str)?; - writer.context().pop(); - writer.context().push("u", "u32", "writing property"); - writer.write_string("u")?; - writer.write_u32(&args.u)?; - writer.context().pop(); - writer.context().push("optU", "Option", "writing property"); - writer.write_string("optU")?; - writer.write_optional_u32(&args.opt_u)?; - writer.context().pop(); - writer.context().push("u8", "u8", "writing property"); - writer.write_string("u8")?; - writer.write_u8(&args.u8)?; - writer.context().pop(); - writer.context().push("u16", "u16", "writing property"); - writer.write_string("u16")?; - writer.write_u16(&args.u16)?; - writer.context().pop(); - writer.context().push("u32", "u32", "writing property"); - writer.write_string("u32")?; - writer.write_u32(&args.u32)?; - writer.context().pop(); - writer.context().push("i", "i32", "writing property"); - writer.write_string("i")?; - writer.write_i32(&args.i)?; - writer.context().pop(); - writer.context().push("i8", "i8", "writing property"); - writer.write_string("i8")?; - writer.write_i8(&args.i8)?; - writer.context().pop(); - writer.context().push("i16", "i16", "writing property"); - writer.write_string("i16")?; - writer.write_i16(&args.i16)?; - writer.context().pop(); - writer.context().push("i32", "i32", "writing property"); - writer.write_string("i32")?; - writer.write_i32(&args.i32)?; - writer.context().pop(); - writer.context().push("bigint", "BigInt", "writing property"); - writer.write_string("bigint")?; - writer.write_bigint(&args.bigint)?; - writer.context().pop(); - writer.context().push("optBigint", "Option", "writing property"); - writer.write_string("optBigint")?; - writer.write_optional_bigint(&args.opt_bigint)?; - writer.context().pop(); - writer.context().push("bignumber", "BigNumber", "writing property"); - writer.write_string("bignumber")?; - writer.write_bignumber(&args.bignumber)?; - writer.context().pop(); - writer.context().push("optBignumber", "Option", "writing property"); - writer.write_string("optBignumber")?; - writer.write_optional_bignumber(&args.opt_bignumber)?; - writer.context().pop(); - writer.context().push("json", "JSON::Value", "writing property"); - writer.write_string("json")?; - writer.write_json(&args.json)?; - writer.context().pop(); - writer.context().push("optJson", "Option", "writing property"); - writer.write_string("optJson")?; - writer.write_optional_json(&args.opt_json)?; - writer.context().pop(); - writer.context().push("bytes", "Vec", "writing property"); - writer.write_string("bytes")?; - writer.write_bytes(&args.bytes)?; - writer.context().pop(); - writer.context().push("optBytes", "Option>", "writing property"); - writer.write_string("optBytes")?; - writer.write_optional_bytes(&args.opt_bytes)?; - writer.context().pop(); - writer.context().push("boolean", "bool", "writing property"); - writer.write_string("boolean")?; - writer.write_bool(&args.boolean)?; - writer.context().pop(); - writer.context().push("optBoolean", "Option", "writing property"); - writer.write_string("optBoolean")?; - writer.write_optional_bool(&args.opt_boolean)?; - writer.context().pop(); - writer.context().push("u_array", "Vec", "writing property"); - writer.write_string("u_array")?; - writer.write_array(&args.u_array, |writer, item| { - writer.write_u32(item) - })?; - writer.context().pop(); - writer.context().push("uOpt_array", "Option>", "writing property"); - writer.write_string("uOpt_array")?; - writer.write_optional_array(&args.u_opt_array, |writer, item| { - writer.write_u32(item) - })?; - writer.context().pop(); - writer.context().push("_opt_uOptArray", "Option>>", "writing property"); - writer.write_string("_opt_uOptArray")?; - writer.write_optional_array(&args._opt_u_opt_array, |writer, item| { - writer.write_optional_u32(item) - })?; - writer.context().pop(); - writer.context().push("optStrOptArray", "Option>>", "writing property"); - writer.write_string("optStrOptArray")?; - writer.write_optional_array(&args.opt_str_opt_array, |writer, item| { - writer.write_optional_string(item) - })?; - writer.context().pop(); - writer.context().push("uArrayArray", "Vec>", "writing property"); - writer.write_string("uArrayArray")?; - writer.write_array(&args.u_array_array, |writer, item| { - writer.write_array(item, |writer, item| { - writer.write_u32(item) - }) - })?; - writer.context().pop(); - writer.context().push("uOptArrayOptArray", "Vec>>>", "writing property"); - writer.write_string("uOptArrayOptArray")?; - writer.write_array(&args.u_opt_array_opt_array, |writer, item| { - writer.write_optional_array(item, |writer, item| { - writer.write_optional_u32(item) - }) - })?; - writer.context().pop(); - writer.context().push("uArrayOptArrayArray", "Vec>>>", "writing property"); - writer.write_string("uArrayOptArrayArray")?; - writer.write_array(&args.u_array_opt_array_array, |writer, item| { - writer.write_optional_array(item, |writer, item| { - writer.write_array(item, |writer, item| { - writer.write_u32(item) - }) - }) - })?; - writer.context().pop(); - writer.context().push("crazyArray", "Option>>>>>>", "writing property"); - writer.write_string("crazyArray")?; - writer.write_optional_array(&args.crazy_array, |writer, item| { - writer.write_optional_array(item, |writer, item| { - writer.write_array(item, |writer, item| { - writer.write_optional_array(item, |writer, item| { - writer.write_u32(item) - }) - }) - }) - })?; - writer.context().pop(); - writer.context().push("object", "AnotherType", "writing property"); - writer.write_string("object")?; - AnotherType::write(&args.object, writer)?; - writer.context().pop(); - writer.context().push("optObject", "Option", "writing property"); - writer.write_string("optObject")?; - if args.opt_object.is_some() { - AnotherType::write(args.opt_object.as_ref().as_ref().unwrap(), writer)?; - } else { - writer.write_nil()?; - } - writer.context().pop(); - writer.context().push("objectArray", "Vec", "writing property"); - writer.write_string("objectArray")?; - writer.write_array(&args.object_array, |writer, item| { - AnotherType::write(item, writer) - })?; - writer.context().pop(); - writer.context().push("optObjectArray", "Option>>", "writing property"); - writer.write_string("optObjectArray")?; - writer.write_optional_array(&args.opt_object_array, |writer, item| { - if item.is_some() { - AnotherType::write(item.as_ref().as_ref().unwrap(), writer) - } else { - writer.write_nil() - } - })?; - writer.context().pop(); - writer.context().push("en", "CustomEnum", "writing property"); - writer.write_string("en")?; - writer.write_i32(&(args.en as i32))?; - writer.context().pop(); - writer.context().push("optEnum", "Option", "writing property"); - writer.write_string("optEnum")?; - writer.write_optional_i32(&args.opt_enum.map(|f| f as i32))?; - writer.context().pop(); - writer.context().push("enumArray", "Vec", "writing property"); - writer.write_string("enumArray")?; - writer.write_array(&args.enum_array, |writer, item| { - writer.write_i32(&(*item as i32)) - })?; - writer.context().pop(); - writer.context().push("optEnumArray", "Option>>", "writing property"); - writer.write_string("optEnumArray")?; - writer.write_optional_array(&args.opt_enum_array, |writer, item| { - writer.write_optional_i32(&item.map(|f| f as i32)) - })?; - writer.context().pop(); - writer.context().push("map", "Map", "writing property"); - writer.write_string("map")?; - writer.write_ext_generic_map(&args.map, |writer, key| { - writer.write_string(key) - }, |writer, value| { - writer.write_i32(value) - })?; - writer.context().pop(); - writer.context().push("mapOfArr", "Map>", "writing property"); - writer.write_string("mapOfArr")?; - writer.write_ext_generic_map(&args.map_of_arr, |writer, key| { - writer.write_string(key) - }, |writer, value| { - writer.write_array(value, |writer, item| { - writer.write_i32(item) - }) - })?; - writer.context().pop(); - writer.context().push("mapOfObj", "Map", "writing property"); - writer.write_string("mapOfObj")?; - writer.write_ext_generic_map(&args.map_of_obj, |writer, key| { - writer.write_string(key) - }, |writer, value| { - AnotherType::write(value, writer) - })?; - writer.context().pop(); - writer.context().push("mapOfArrOfObj", "Map>", "writing property"); - writer.write_string("mapOfArrOfObj")?; - writer.write_ext_generic_map(&args.map_of_arr_of_obj, |writer, key| { - writer.write_string(key) - }, |writer, value| { - writer.write_array(value, |writer, item| { - AnotherType::write(item, writer) - }) - })?; - writer.context().pop(); - writer.context().push("mapCustomValue", "Map>", "writing property"); - writer.write_string("mapCustomValue")?; - writer.write_ext_generic_map(&args.map_custom_value, |writer, key| { - writer.write_string(key) - }, |writer, value| { - if value.is_some() { - CustomMapValue::write(value.as_ref().as_ref().unwrap(), writer) - } else { - writer.write_nil() - } - })?; - writer.context().pop(); - Ok(()) -} - -pub fn deserialize_custom_type(args: &[u8]) -> Result { - let mut context = Context::new(); - context.description = "Deserializing object-type: CustomType".to_string(); - let mut reader = ReadDecoder::new(args, context); - read_custom_type(&mut reader) -} - -pub fn read_custom_type(reader: &mut R) -> Result { - let mut num_of_fields = reader.read_map_length()?; - - let mut _str: String = String::new(); - let mut _str_set = false; - let mut _opt_str: Option = None; - let mut _u: u32 = 0; - let mut _u_set = false; - let mut _opt_u: Option = None; - let mut _u8: u8 = 0; - let mut _u8_set = false; - let mut _u16: u16 = 0; - let mut _u16_set = false; - let mut _u32: u32 = 0; - let mut _u32_set = false; - let mut _i: i32 = 0; - let mut _i_set = false; - let mut _i8: i8 = 0; - let mut _i8_set = false; - let mut _i16: i16 = 0; - let mut _i16_set = false; - let mut _i32: i32 = 0; - let mut _i32_set = false; - let mut _bigint: BigInt = BigInt::default(); - let mut _bigint_set = false; - let mut _opt_bigint: Option = None; - let mut _bignumber: BigNumber = BigNumber::default(); - let mut _bignumber_set = false; - let mut _opt_bignumber: Option = None; - let mut _json: JSON::Value = JSON::Value::Null; - let mut _json_set = false; - let mut _opt_json: Option = None; - let mut _bytes: Vec = vec![]; - let mut _bytes_set = false; - let mut _opt_bytes: Option> = None; - let mut _boolean: bool = false; - let mut _boolean_set = false; - let mut _opt_boolean: Option = None; - let mut _u_array: Vec = vec![]; - let mut _u_array_set = false; - let mut _u_opt_array: Option> = None; - let mut __opt_u_opt_array: Option>> = None; - let mut _opt_str_opt_array: Option>> = None; - let mut _u_array_array: Vec> = vec![]; - let mut _u_array_array_set = false; - let mut _u_opt_array_opt_array: Vec>>> = vec![]; - let mut _u_opt_array_opt_array_set = false; - let mut _u_array_opt_array_array: Vec>>> = vec![]; - let mut _u_array_opt_array_array_set = false; - let mut _crazy_array: Option>>>>>> = None; - let mut _object: AnotherType = AnotherType::new(); - let mut _object_set = false; - let mut _opt_object: Option = None; - let mut _object_array: Vec = vec![]; - let mut _object_array_set = false; - let mut _opt_object_array: Option>> = None; - let mut _en: CustomEnum = CustomEnum::_MAX_; - let mut _en_set = false; - let mut _opt_enum: Option = None; - let mut _enum_array: Vec = vec![]; - let mut _enum_array_set = false; - let mut _opt_enum_array: Option>> = None; - let mut _map: Map = Map::::new(); - let mut _map_set = false; - let mut _map_of_arr: Map> = Map::>::new(); - let mut _map_of_arr_set = false; - let mut _map_of_obj: Map = Map::::new(); - let mut _map_of_obj_set = false; - let mut _map_of_arr_of_obj: Map> = Map::>::new(); - let mut _map_of_arr_of_obj_set = false; - let mut _map_custom_value: Map> = Map::>::new(); - let mut _map_custom_value_set = false; - - while num_of_fields > 0 { - num_of_fields -= 1; - let field = reader.read_string()?; - - match field.as_str() { - "str" => { - reader.context().push(&field, "String", "type found, reading property"); - _str = reader.read_string()?; - _str_set = true; - reader.context().pop(); - } - "optStr" => { - reader.context().push(&field, "Option", "type found, reading property"); - _opt_str = reader.read_optional_string()?; - reader.context().pop(); - } - "u" => { - reader.context().push(&field, "u32", "type found, reading property"); - _u = reader.read_u32()?; - _u_set = true; - reader.context().pop(); - } - "optU" => { - reader.context().push(&field, "Option", "type found, reading property"); - _opt_u = reader.read_optional_u32()?; - reader.context().pop(); - } - "u8" => { - reader.context().push(&field, "u8", "type found, reading property"); - _u8 = reader.read_u8()?; - _u8_set = true; - reader.context().pop(); - } - "u16" => { - reader.context().push(&field, "u16", "type found, reading property"); - _u16 = reader.read_u16()?; - _u16_set = true; - reader.context().pop(); - } - "u32" => { - reader.context().push(&field, "u32", "type found, reading property"); - _u32 = reader.read_u32()?; - _u32_set = true; - reader.context().pop(); - } - "i" => { - reader.context().push(&field, "i32", "type found, reading property"); - _i = reader.read_i32()?; - _i_set = true; - reader.context().pop(); - } - "i8" => { - reader.context().push(&field, "i8", "type found, reading property"); - _i8 = reader.read_i8()?; - _i8_set = true; - reader.context().pop(); - } - "i16" => { - reader.context().push(&field, "i16", "type found, reading property"); - _i16 = reader.read_i16()?; - _i16_set = true; - reader.context().pop(); - } - "i32" => { - reader.context().push(&field, "i32", "type found, reading property"); - _i32 = reader.read_i32()?; - _i32_set = true; - reader.context().pop(); - } - "bigint" => { - reader.context().push(&field, "BigInt", "type found, reading property"); - _bigint = reader.read_bigint()?; - _bigint_set = true; - reader.context().pop(); - } - "optBigint" => { - reader.context().push(&field, "Option", "type found, reading property"); - _opt_bigint = reader.read_optional_bigint()?; - reader.context().pop(); - } - "bignumber" => { - reader.context().push(&field, "BigNumber", "type found, reading property"); - _bignumber = reader.read_bignumber()?; - _bignumber_set = true; - reader.context().pop(); - } - "optBignumber" => { - reader.context().push(&field, "Option", "type found, reading property"); - _opt_bignumber = reader.read_optional_bignumber()?; - reader.context().pop(); - } - "json" => { - reader.context().push(&field, "JSON::Value", "type found, reading property"); - _json = reader.read_json()?; - _json_set = true; - reader.context().pop(); - } - "optJson" => { - reader.context().push(&field, "Option", "type found, reading property"); - _opt_json = reader.read_optional_json()?; - reader.context().pop(); - } - "bytes" => { - reader.context().push(&field, "Vec", "type found, reading property"); - _bytes = reader.read_bytes()?; - _bytes_set = true; - reader.context().pop(); - } - "optBytes" => { - reader.context().push(&field, "Option>", "type found, reading property"); - _opt_bytes = reader.read_optional_bytes()?; - reader.context().pop(); - } - "boolean" => { - reader.context().push(&field, "bool", "type found, reading property"); - _boolean = reader.read_bool()?; - _boolean_set = true; - reader.context().pop(); - } - "optBoolean" => { - reader.context().push(&field, "Option", "type found, reading property"); - _opt_boolean = reader.read_optional_bool()?; - reader.context().pop(); - } - "u_array" => { - reader.context().push(&field, "Vec", "type found, reading property"); - _u_array = reader.read_array(|reader| { - reader.read_u32() - })?; - _u_array_set = true; - reader.context().pop(); - } - "uOpt_array" => { - reader.context().push(&field, "Option>", "type found, reading property"); - _u_opt_array = reader.read_optional_array(|reader| { - reader.read_u32() - })?; - reader.context().pop(); - } - "_opt_uOptArray" => { - reader.context().push(&field, "Option>>", "type found, reading property"); - __opt_u_opt_array = reader.read_optional_array(|reader| { - reader.read_optional_u32() - })?; - reader.context().pop(); - } - "optStrOptArray" => { - reader.context().push(&field, "Option>>", "type found, reading property"); - _opt_str_opt_array = reader.read_optional_array(|reader| { - reader.read_optional_string() - })?; - reader.context().pop(); - } - "uArrayArray" => { - reader.context().push(&field, "Vec>", "type found, reading property"); - _u_array_array = reader.read_array(|reader| { - reader.read_array(|reader| { - reader.read_u32() - }) - })?; - _u_array_array_set = true; - reader.context().pop(); - } - "uOptArrayOptArray" => { - reader.context().push(&field, "Vec>>>", "type found, reading property"); - _u_opt_array_opt_array = reader.read_array(|reader| { - reader.read_optional_array(|reader| { - reader.read_optional_u32() - }) - })?; - _u_opt_array_opt_array_set = true; - reader.context().pop(); - } - "uArrayOptArrayArray" => { - reader.context().push(&field, "Vec>>>", "type found, reading property"); - _u_array_opt_array_array = reader.read_array(|reader| { - reader.read_optional_array(|reader| { - reader.read_array(|reader| { - reader.read_u32() - }) - }) - })?; - _u_array_opt_array_array_set = true; - reader.context().pop(); - } - "crazyArray" => { - reader.context().push(&field, "Option>>>>>>", "type found, reading property"); - _crazy_array = reader.read_optional_array(|reader| { - reader.read_optional_array(|reader| { - reader.read_array(|reader| { - reader.read_optional_array(|reader| { - reader.read_u32() - }) - }) - }) - })?; - reader.context().pop(); - } - "object" => { - reader.context().push(&field, "AnotherType", "type found, reading property"); - let object = AnotherType::read(reader)?; - _object = object; - _object_set = true; - reader.context().pop(); - } - "optObject" => { - reader.context().push(&field, "Option", "type found, reading property"); - let mut object: Option = None; - if !reader.is_next_nil()? { - object = Some(AnotherType::read(reader)?); - } else { - object = None; - } - _opt_object = object; - reader.context().pop(); - } - "objectArray" => { - reader.context().push(&field, "Vec", "type found, reading property"); - _object_array = reader.read_array(|reader| { - let object = AnotherType::read(reader)?; - Ok(object) - })?; - _object_array_set = true; - reader.context().pop(); - } - "optObjectArray" => { - reader.context().push(&field, "Option>>", "type found, reading property"); - _opt_object_array = reader.read_optional_array(|reader| { - let mut object: Option = None; - if !reader.is_next_nil()? { - object = Some(AnotherType::read(reader)?); - } else { - object = None; - } - Ok(object) - })?; - reader.context().pop(); - } - "en" => { - reader.context().push(&field, "CustomEnum", "type found, reading property"); - let mut value: CustomEnum = CustomEnum::_MAX_; - if reader.is_next_string()? { - value = get_custom_enum_value(&reader.read_string()?)?; - } else { - value = CustomEnum::try_from(reader.read_i32()?)?; - sanitize_custom_enum_value(value as i32)?; - } - _en = value; - _en_set = true; - reader.context().pop(); - } - "optEnum" => { - reader.context().push(&field, "Option", "type found, reading property"); - let mut value: Option = None; - if !reader.is_next_nil()? { - if reader.is_next_string()? { - value = Some(get_custom_enum_value(&reader.read_string()?)?); - } else { - value = Some(CustomEnum::try_from(reader.read_i32()?)?); - sanitize_custom_enum_value(value.unwrap() as i32)?; - } - } else { - value = None; - } - _opt_enum = value; - reader.context().pop(); - } - "enumArray" => { - reader.context().push(&field, "Vec", "type found, reading property"); - _enum_array = reader.read_array(|reader| { - let mut value: CustomEnum = CustomEnum::_MAX_; - if reader.is_next_string()? { - value = get_custom_enum_value(&reader.read_string()?)?; - } else { - value = CustomEnum::try_from(reader.read_i32()?)?; - sanitize_custom_enum_value(value as i32)?; - } - Ok(value) - })?; - _enum_array_set = true; - reader.context().pop(); - } - "optEnumArray" => { - reader.context().push(&field, "Option>>", "type found, reading property"); - _opt_enum_array = reader.read_optional_array(|reader| { - let mut value: Option = None; - if !reader.is_next_nil()? { - if reader.is_next_string()? { - value = Some(get_custom_enum_value(&reader.read_string()?)?); - } else { - value = Some(CustomEnum::try_from(reader.read_i32()?)?); - sanitize_custom_enum_value(value.unwrap() as i32)?; - } - } else { - value = None; - } - Ok(value) - })?; - reader.context().pop(); - } - "map" => { - reader.context().push(&field, "Map", "type found, reading property"); - _map = reader.read_ext_generic_map(|reader| { - reader.read_string() - }, |reader| { - reader.read_i32() - })?; - _map_set = true; - reader.context().pop(); - } - "mapOfArr" => { - reader.context().push(&field, "Map>", "type found, reading property"); - _map_of_arr = reader.read_ext_generic_map(|reader| { - reader.read_string() - }, |reader| { - reader.read_array(|reader| { - reader.read_i32() - }) - })?; - _map_of_arr_set = true; - reader.context().pop(); - } - "mapOfObj" => { - reader.context().push(&field, "Map", "type found, reading property"); - _map_of_obj = reader.read_ext_generic_map(|reader| { - reader.read_string() - }, |reader| { - let object = AnotherType::read(reader)?; - Ok(object) - })?; - _map_of_obj_set = true; - reader.context().pop(); - } - "mapOfArrOfObj" => { - reader.context().push(&field, "Map>", "type found, reading property"); - _map_of_arr_of_obj = reader.read_ext_generic_map(|reader| { - reader.read_string() - }, |reader| { - reader.read_array(|reader| { - let object = AnotherType::read(reader)?; - Ok(object) - }) - })?; - _map_of_arr_of_obj_set = true; - reader.context().pop(); - } - "mapCustomValue" => { - reader.context().push(&field, "Map>", "type found, reading property"); - _map_custom_value = reader.read_ext_generic_map(|reader| { - reader.read_string() - }, |reader| { - let mut object: Option = None; - if !reader.is_next_nil()? { - object = Some(CustomMapValue::read(reader)?); - } else { - object = None; - } - Ok(object) - })?; - _map_custom_value_set = true; - reader.context().pop(); - } - err => return Err(DecodeError::UnknownFieldName(err.to_string())), - } - } - if !_str_set { - return Err(DecodeError::MissingField("str: String.".to_string())); - } - if !_u_set { - return Err(DecodeError::MissingField("u: UInt.".to_string())); - } - if !_u8_set { - return Err(DecodeError::MissingField("u8: UInt8.".to_string())); - } - if !_u16_set { - return Err(DecodeError::MissingField("u16: UInt16.".to_string())); - } - if !_u32_set { - return Err(DecodeError::MissingField("u32: UInt32.".to_string())); - } - if !_i_set { - return Err(DecodeError::MissingField("i: Int.".to_string())); - } - if !_i8_set { - return Err(DecodeError::MissingField("i8: Int8.".to_string())); - } - if !_i16_set { - return Err(DecodeError::MissingField("i16: Int16.".to_string())); - } - if !_i32_set { - return Err(DecodeError::MissingField("i32: Int32.".to_string())); - } - if !_bigint_set { - return Err(DecodeError::MissingField("bigint: BigInt.".to_string())); - } - if !_bignumber_set { - return Err(DecodeError::MissingField("bignumber: BigNumber.".to_string())); - } - if !_json_set { - return Err(DecodeError::MissingField("json: JSON.".to_string())); - } - if !_bytes_set { - return Err(DecodeError::MissingField("bytes: Bytes.".to_string())); - } - if !_boolean_set { - return Err(DecodeError::MissingField("boolean: Boolean.".to_string())); - } - if !_u_array_set { - return Err(DecodeError::MissingField("u_array: [UInt].".to_string())); - } - if !_u_array_array_set { - return Err(DecodeError::MissingField("uArrayArray: [[UInt]].".to_string())); - } - if !_u_opt_array_opt_array_set { - return Err(DecodeError::MissingField("uOptArrayOptArray: [[UInt32]].".to_string())); - } - if !_u_array_opt_array_array_set { - return Err(DecodeError::MissingField("uArrayOptArrayArray: [[[UInt32]]].".to_string())); - } - if !_object_set { - return Err(DecodeError::MissingField("object: AnotherType.".to_string())); - } - if !_object_array_set { - return Err(DecodeError::MissingField("objectArray: [AnotherType].".to_string())); - } - if !_en_set { - return Err(DecodeError::MissingField("en: CustomEnum.".to_string())); - } - if !_enum_array_set { - return Err(DecodeError::MissingField("enumArray: [CustomEnum].".to_string())); - } - if !_map_set { - return Err(DecodeError::MissingField("map: Map.".to_string())); - } - if !_map_of_arr_set { - return Err(DecodeError::MissingField("mapOfArr: Map.".to_string())); - } - if !_map_of_obj_set { - return Err(DecodeError::MissingField("mapOfObj: Map.".to_string())); - } - if !_map_of_arr_of_obj_set { - return Err(DecodeError::MissingField("mapOfArrOfObj: Map.".to_string())); - } - if !_map_custom_value_set { - return Err(DecodeError::MissingField("mapCustomValue: Map.".to_string())); - } - - Ok(CustomType { - str: _str, - opt_str: _opt_str, - u: _u, - opt_u: _opt_u, - u8: _u8, - u16: _u16, - u32: _u32, - i: _i, - i8: _i8, - i16: _i16, - i32: _i32, - bigint: _bigint, - opt_bigint: _opt_bigint, - bignumber: _bignumber, - opt_bignumber: _opt_bignumber, - json: _json, - opt_json: _opt_json, - bytes: _bytes, - opt_bytes: _opt_bytes, - boolean: _boolean, - opt_boolean: _opt_boolean, - u_array: _u_array, - u_opt_array: _u_opt_array, - _opt_u_opt_array: __opt_u_opt_array, - opt_str_opt_array: _opt_str_opt_array, - u_array_array: _u_array_array, - u_opt_array_opt_array: _u_opt_array_opt_array, - u_array_opt_array_array: _u_array_opt_array_array, - crazy_array: _crazy_array, - object: _object, - opt_object: _opt_object, - object_array: _object_array, - opt_object_array: _opt_object_array, - en: _en, - opt_enum: _opt_enum, - enum_array: _enum_array, - opt_enum_array: _opt_enum_array, - map: _map, - map_of_arr: _map_of_arr, - map_of_obj: _map_of_obj, - map_of_arr_of_obj: _map_of_arr_of_obj, - map_custom_value: _map_custom_value, - }) -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/entry.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/entry.rs index 9a410f9c8e..25d939ff06 100644 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/entry.rs +++ b/packages/test-cases/cases/bind/sanity/output/wrap-rs/entry.rs @@ -9,7 +9,6 @@ use polywrap_wasm_rs::{ invoke, InvokeArgs, }; -use crate::module::Module; #[no_mangle] pub extern "C" fn _wrap_invoke(method_size: u32, args_size: u32, env_size: u32) -> bool { diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/env/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/env/mod.rs index 2a79852d21..cc57defade 100644 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/env/mod.rs +++ b/packages/test-cases/cases/bind/sanity/output/wrap-rs/env/mod.rs @@ -1,26 +1,21 @@ use serde::{Serialize, Deserialize}; -pub mod serialization; +use polywrap_msgpack_serde::{ + wrappers::polywrap_json::JSONString, + wrappers::polywrap_bigint::BigIntWrapper +}; use polywrap_wasm_rs::{ BigInt, BigNumber, Map, - DecodeError, - EncodeError, - Read, - Write, - JSON, -}; -pub use serialization::{ - deserialize_env, - read_env, - serialize_env, - write_env + JSON }; #[derive(Clone, Debug, Deserialize, Serialize)] pub struct Env { pub prop: String, + #[serde(rename = "optProp")] pub opt_prop: Option, + #[serde(rename = "optMap")] pub opt_map: Option>>, } @@ -32,20 +27,4 @@ impl Env { opt_map: None, } } - - pub fn to_buffer(args: &Env) -> Result, EncodeError> { - serialize_env(args).map_err(|e| EncodeError::TypeWriteError(e.to_string())) - } - - pub fn from_buffer(args: &[u8]) -> Result { - deserialize_env(args).map_err(|e| DecodeError::TypeReadError(e.to_string())) - } - - pub fn write(args: &Env, writer: &mut W) -> Result<(), EncodeError> { - write_env(args, writer).map_err(|e| EncodeError::TypeWriteError(e.to_string())) - } - - pub fn read(reader: &mut R) -> Result { - read_env(reader).map_err(|e| DecodeError::TypeReadError(e.to_string())) - } } diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/env/serialization.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/env/serialization.rs deleted file mode 100644 index df2a91bc9c..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/env/serialization.rs +++ /dev/null @@ -1,98 +0,0 @@ -use std::convert::TryFrom; -use polywrap_wasm_rs::{ - BigInt, - BigNumber, - Map, - Context, - DecodeError, - EncodeError, - Read, - ReadDecoder, - Write, - WriteEncoder, - JSON, -}; -use crate::Env; - -pub fn serialize_env(args: &Env) -> Result, EncodeError> { - let mut encoder_context = Context::new(); - encoder_context.description = "Serializing (encoding) env-type: Env".to_string(); - let mut encoder = WriteEncoder::new(&[], encoder_context); - write_env(args, &mut encoder)?; - Ok(encoder.get_buffer()) -} - -pub fn write_env(args: &Env, writer: &mut W) -> Result<(), EncodeError> { - writer.write_map_length(&3)?; - writer.context().push("prop", "String", "writing property"); - writer.write_string("prop")?; - writer.write_string(&args.prop)?; - writer.context().pop(); - writer.context().push("optProp", "Option", "writing property"); - writer.write_string("optProp")?; - writer.write_optional_string(&args.opt_prop)?; - writer.context().pop(); - writer.context().push("optMap", "Option>>", "writing property"); - writer.write_string("optMap")?; - writer.write_optional_ext_generic_map(&args.opt_map, |writer, key| { - writer.write_string(key) - }, |writer, value| { - writer.write_optional_i32(value) - })?; - writer.context().pop(); - Ok(()) -} - -pub fn deserialize_env(args: &[u8]) -> Result { - let mut context = Context::new(); - context.description = "Deserializing env-type: Env".to_string(); - let mut reader = ReadDecoder::new(args, context); - read_env(&mut reader) -} - -pub fn read_env(reader: &mut R) -> Result { - let mut num_of_fields = reader.read_map_length()?; - - let mut _prop: String = String::new(); - let mut _prop_set = false; - let mut _opt_prop: Option = None; - let mut _opt_map: Option>> = None; - - while num_of_fields > 0 { - num_of_fields -= 1; - let field = reader.read_string()?; - - match field.as_str() { - "prop" => { - reader.context().push(&field, "String", "type found, reading property"); - _prop = reader.read_string()?; - _prop_set = true; - reader.context().pop(); - } - "optProp" => { - reader.context().push(&field, "Option", "type found, reading property"); - _opt_prop = reader.read_optional_string()?; - reader.context().pop(); - } - "optMap" => { - reader.context().push(&field, "Option>>", "type found, reading property"); - _opt_map = reader.read_optional_ext_generic_map(|reader| { - reader.read_string()? - }, |reader| { - reader.read_optional_i32() - })?; - reader.context().pop(); - } - err => return Err(DecodeError::UnknownFieldName(err.to_string())), - } - } - if !_prop_set { - return Err(DecodeError::MissingField("prop: String.".to_string())); - } - - Ok(Env { - prop: _prop, - opt_prop: _opt_prop, - opt_map: _opt_map, - }) -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_another_object/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_another_object/mod.rs index 838d59b797..d5b29d8ab3 100644 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_another_object/mod.rs +++ b/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_another_object/mod.rs @@ -1,20 +1,13 @@ use serde::{Serialize, Deserialize}; -pub mod serialization; +use polywrap_msgpack_serde::{ + wrappers::polywrap_json::JSONString, + wrappers::polywrap_bigint::BigIntWrapper +}; use polywrap_wasm_rs::{ BigInt, BigNumber, Map, - DecodeError, - EncodeError, - Read, - Write, - JSON, -}; -pub use serialization::{ - deserialize_test_import_another_object, - read_test_import_another_object, - serialize_test_import_another_object, - write_test_import_another_object + JSON }; #[derive(Clone, Debug, Deserialize, Serialize)] @@ -30,20 +23,4 @@ impl TestImportAnotherObject { prop: String::new(), } } - - pub fn to_buffer(args: &TestImportAnotherObject) -> Result, EncodeError> { - serialize_test_import_another_object(args).map_err(|e| EncodeError::TypeWriteError(e.to_string())) - } - - pub fn from_buffer(args: &[u8]) -> Result { - deserialize_test_import_another_object(args).map_err(|e| DecodeError::TypeReadError(e.to_string())) - } - - pub fn write(args: &TestImportAnotherObject, writer: &mut W) -> Result<(), EncodeError> { - write_test_import_another_object(args, writer).map_err(|e| EncodeError::TypeWriteError(e.to_string())) - } - - pub fn read(reader: &mut R) -> Result { - read_test_import_another_object(reader).map_err(|e| DecodeError::TypeReadError(e.to_string())) - } } diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_another_object/serialization.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_another_object/serialization.rs deleted file mode 100644 index 43d97eb245..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_another_object/serialization.rs +++ /dev/null @@ -1,68 +0,0 @@ -use std::convert::TryFrom; -use polywrap_wasm_rs::{ - BigInt, - BigNumber, - Map, - Context, - DecodeError, - EncodeError, - Read, - ReadDecoder, - Write, - WriteEncoder, - JSON, -}; -use crate::TestImportAnotherObject; - -pub fn serialize_test_import_another_object(args: &TestImportAnotherObject) -> Result, EncodeError> { - let mut encoder_context = Context::new(); - encoder_context.description = "Serializing (encoding) imported object-type: TestImportAnotherObject".to_string(); - let mut encoder = WriteEncoder::new(&[], encoder_context); - write_test_import_another_object(args, &mut encoder)?; - Ok(encoder.get_buffer()) -} - -pub fn write_test_import_another_object(args: &TestImportAnotherObject, writer: &mut W) -> Result<(), EncodeError> { - writer.write_map_length(&1)?; - writer.context().push("prop", "String", "writing property"); - writer.write_string("prop")?; - writer.write_string(&args.prop)?; - writer.context().pop(); - Ok(()) -} - -pub fn deserialize_test_import_another_object(args: &[u8]) -> Result { - let mut context = Context::new(); - context.description = "Deserializing imported object-type: TestImportAnotherObject".to_string(); - let mut reader = ReadDecoder::new(args, context); - read_test_import_another_object(&mut reader) -} - -pub fn read_test_import_another_object(reader: &mut R) -> Result { - let mut num_of_fields = reader.read_map_length()?; - - let mut _prop: String = String::new(); - let mut _prop_set = false; - - while num_of_fields > 0 { - num_of_fields -= 1; - let field = reader.read_string()?; - - match field.as_str() { - "prop" => { - reader.context().push(&field, "String", "type found, reading property"); - _prop = reader.read_string()?; - _prop_set = true; - reader.context().pop(); - } - err => return Err(DecodeError::UnknownFieldName(err.to_string())), - } - } - if !_prop_set { - return Err(DecodeError::MissingField("prop: String.".to_string())); - } - - Ok(TestImportAnotherObject { - prop: _prop, - }) -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_enum/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_enum/mod.rs index e0426d64f1..4a22dd0029 100644 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_enum/mod.rs +++ b/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_enum/mod.rs @@ -4,7 +4,9 @@ use std::convert::TryFrom; #[derive(Clone, Copy, Debug, Deserialize, Serialize)] pub enum TestImportEnum { + #[serde(rename = "STRING")] STRING, + #[serde(rename = "BYTES")] BYTES, _MAX_ } diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_enum_return/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_enum_return/mod.rs index 137826420b..8d668d2910 100644 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_enum_return/mod.rs +++ b/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_enum_return/mod.rs @@ -4,7 +4,9 @@ use std::convert::TryFrom; #[derive(Clone, Copy, Debug, Deserialize, Serialize)] pub enum TestImportEnumReturn { + #[serde(rename = "STRING")] STRING, + #[serde(rename = "BYTES")] BYTES, _MAX_ } diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_env/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_env/mod.rs index 993de8d519..ea2dfd1b40 100644 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_env/mod.rs +++ b/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_env/mod.rs @@ -1,22 +1,14 @@ use serde::{Serialize, Deserialize}; -pub mod serialization; +use polywrap_msgpack_serde::{ + wrappers::polywrap_json::JSONString, + wrappers::polywrap_bigint::BigIntWrapper +}; use polywrap_wasm_rs::{ BigInt, BigNumber, Map, - DecodeError, - EncodeError, - Read, - Write, - JSON, -}; -pub use serialization::{ - deserialize_test_import_env, - read_test_import_env, - serialize_test_import_env, - write_test_import_env + JSON }; - use crate::TestImportAnotherObject; use crate::TestImportEnum; @@ -37,30 +29,14 @@ impl TestImportEnv { pub fn new() -> TestImportEnv { TestImportEnv { - object: TestImportAnotherObject::new(), + object: Option::new(), opt_object: None, object_array: vec![], opt_object_array: None, - en: TestImportEnum::_MAX_, + en: Option::_MAX_, opt_enum: None, enum_array: vec![], opt_enum_array: None, } } - - pub fn to_buffer(args: &TestImportEnv) -> Result, EncodeError> { - serialize_test_import_env(args).map_err(|e| EncodeError::TypeWriteError(e.to_string())) - } - - pub fn from_buffer(args: &[u8]) -> Result { - deserialize_test_import_env(args).map_err(|e| DecodeError::TypeReadError(e.to_string())) - } - - pub fn write(args: &TestImportEnv, writer: &mut W) -> Result<(), EncodeError> { - write_test_import_env(args, writer).map_err(|e| EncodeError::TypeWriteError(e.to_string())) - } - - pub fn read(reader: &mut R) -> Result { - read_test_import_env(reader).map_err(|e| DecodeError::TypeReadError(e.to_string())) - } } diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_env/serialization.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_env/serialization.rs deleted file mode 100644 index 6de6ef69d3..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_env/serialization.rs +++ /dev/null @@ -1,241 +0,0 @@ -use std::convert::TryFrom; -use polywrap_wasm_rs::{ - BigInt, - BigNumber, - Map, - Context, - DecodeError, - EncodeError, - Read, - ReadDecoder, - Write, - WriteEncoder, - JSON, -}; -use crate::TestImportEnv; - -use crate::TestImportAnotherObject; -use crate::{ - TestImportEnum, - get_test_import_enum_value, - sanitize_test_import_enum_value -}; - -pub fn serialize_test_import_env(args: &TestImportEnv) -> Result, EncodeError> { - let mut encoder_context = Context::new(); - encoder_context.description = "Serializing (encoding) imported env-type: TestImportEnv".to_string(); - let mut encoder = WriteEncoder::new(&[], encoder_context); - write_test_import_env(args, &mut encoder)?; - Ok(encoder.get_buffer()) -} - -pub fn write_test_import_env(args: &TestImportEnv, writer: &mut W) -> Result<(), EncodeError> { - writer.write_map_length(&8)?; - writer.context().push("object", "TestImportAnotherObject", "writing property"); - writer.write_string("object")?; - TestImportAnotherObject::write(&args.object, writer)?; - writer.context().pop(); - writer.context().push("optObject", "Option", "writing property"); - writer.write_string("optObject")?; - if args.opt_object.is_some() { - TestImportAnotherObject::write(args.opt_object.as_ref().as_ref().unwrap(), writer)?; - } else { - writer.write_nil()?; - } - writer.context().pop(); - writer.context().push("objectArray", "Vec", "writing property"); - writer.write_string("objectArray")?; - writer.write_array(&args.object_array, |writer, item| { - TestImportAnotherObject::write(item, writer) - })?; - writer.context().pop(); - writer.context().push("optObjectArray", "Option>>", "writing property"); - writer.write_string("optObjectArray")?; - writer.write_optional_array(&args.opt_object_array, |writer, item| { - if item.is_some() { - TestImportAnotherObject::write(item.as_ref().as_ref().unwrap(), writer) - } else { - writer.write_nil() - } - })?; - writer.context().pop(); - writer.context().push("en", "TestImportEnum", "writing property"); - writer.write_string("en")?; - writer.write_i32(&(args.en as i32))?; - writer.context().pop(); - writer.context().push("optEnum", "Option", "writing property"); - writer.write_string("optEnum")?; - writer.write_optional_i32(&args.opt_enum.map(|f| f as i32))?; - writer.context().pop(); - writer.context().push("enumArray", "Vec", "writing property"); - writer.write_string("enumArray")?; - writer.write_array(&args.enum_array, |writer, item| { - writer.write_i32(&(*item as i32)) - })?; - writer.context().pop(); - writer.context().push("optEnumArray", "Option>>", "writing property"); - writer.write_string("optEnumArray")?; - writer.write_optional_array(&args.opt_enum_array, |writer, item| { - writer.write_optional_i32(&item.map(|f| f as i32)) - })?; - writer.context().pop(); - Ok(()) -} - -pub fn deserialize_test_import_env(args: &[u8]) -> Result { - let mut context = Context::new(); - context.description = "Deserializing imported env-type: TestImportEnv".to_string(); - let mut reader = ReadDecoder::new(args, context); - read_test_import_env(&mut reader) -} - -pub fn read_test_import_env(reader: &mut R) -> Result { - let mut num_of_fields = reader.read_map_length()?; - - let mut _object: TestImportAnotherObject = TestImportAnotherObject::new(); - let mut _object_set = false; - let mut _opt_object: Option = None; - let mut _object_array: Vec = vec![]; - let mut _object_array_set = false; - let mut _opt_object_array: Option>> = None; - let mut _en: TestImportEnum = TestImportEnum::_MAX_; - let mut _en_set = false; - let mut _opt_enum: Option = None; - let mut _enum_array: Vec = vec![]; - let mut _enum_array_set = false; - let mut _opt_enum_array: Option>> = None; - - while num_of_fields > 0 { - num_of_fields -= 1; - let field = reader.read_string()?; - - match field.as_str() { - "object" => { - reader.context().push(&field, "TestImportAnotherObject", "type found, reading property"); - let object = TestImportAnotherObject::read(reader)?; - _object = object; - _object_set = true; - reader.context().pop(); - } - "optObject" => { - reader.context().push(&field, "Option", "type found, reading property"); - let mut object: Option = None; - if !reader.is_next_nil()? { - object = Some(TestImportAnotherObject::read(reader)?); - } else { - object = None; - } - _opt_object = object; - reader.context().pop(); - } - "objectArray" => { - reader.context().push(&field, "Vec", "type found, reading property"); - _object_array = reader.read_array(|reader| { - let object = TestImportAnotherObject::read(reader)?; - Ok(object) - })?; - _object_array_set = true; - reader.context().pop(); - } - "optObjectArray" => { - reader.context().push(&field, "Option>>", "type found, reading property"); - _opt_object_array = reader.read_optional_array(|reader| { - let mut object: Option = None; - if !reader.is_next_nil()? { - object = Some(TestImportAnotherObject::read(reader)?); - } else { - object = None; - } - Ok(object) - })?; - reader.context().pop(); - } - "en" => { - reader.context().push(&field, "TestImportEnum", "type found, reading property"); - let mut value: TestImportEnum = TestImportEnum::_MAX_; - if reader.is_next_string()? { - value = get_test_import_enum_value(&reader.read_string()?)?; - } else { - value = TestImportEnum::try_from(reader.read_i32()?)?; - sanitize_test_import_enum_value(value as i32)?; - } - _en = value; - _en_set = true; - reader.context().pop(); - } - "optEnum" => { - reader.context().push(&field, "Option", "type found, reading property"); - let mut value: Option = None; - if !reader.is_next_nil()? { - if reader.is_next_string()? { - value = Some(get_test_import_enum_value(&reader.read_string()?)?); - } else { - value = Some(TestImportEnum::try_from(reader.read_i32()?)?); - sanitize_test_import_enum_value(value.unwrap() as i32)?; - } - } else { - value = None; - } - _opt_enum = value; - reader.context().pop(); - } - "enumArray" => { - reader.context().push(&field, "Vec", "type found, reading property"); - _enum_array = reader.read_array(|reader| { - let mut value: TestImportEnum = TestImportEnum::_MAX_; - if reader.is_next_string()? { - value = get_test_import_enum_value(&reader.read_string()?)?; - } else { - value = TestImportEnum::try_from(reader.read_i32()?)?; - sanitize_test_import_enum_value(value as i32)?; - } - Ok(value) - })?; - _enum_array_set = true; - reader.context().pop(); - } - "optEnumArray" => { - reader.context().push(&field, "Option>>", "type found, reading property"); - _opt_enum_array = reader.read_optional_array(|reader| { - let mut value: Option = None; - if !reader.is_next_nil()? { - if reader.is_next_string()? { - value = Some(get_test_import_enum_value(&reader.read_string()?)?); - } else { - value = Some(TestImportEnum::try_from(reader.read_i32()?)?); - sanitize_test_import_enum_value(value.unwrap() as i32)?; - } - } else { - value = None; - } - Ok(value) - })?; - reader.context().pop(); - } - err => return Err(DecodeError::UnknownFieldName(err.to_string())), - } - } - if !_object_set { - return Err(DecodeError::MissingField("object: TestImport_AnotherObject.".to_string())); - } - if !_object_array_set { - return Err(DecodeError::MissingField("objectArray: [TestImport_AnotherObject].".to_string())); - } - if !_en_set { - return Err(DecodeError::MissingField("en: TestImport_Enum.".to_string())); - } - if !_enum_array_set { - return Err(DecodeError::MissingField("enumArray: [TestImport_Enum].".to_string())); - } - - Ok(TestImportEnv { - object: _object, - opt_object: _opt_object, - object_array: _object_array, - opt_object_array: _opt_object_array, - en: _en, - opt_enum: _opt_enum, - enum_array: _enum_array, - opt_enum_array: _opt_enum_array, - }) -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_module/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_module/mod.rs index d265f90a57..873e07c430 100644 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_module/mod.rs +++ b/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_module/mod.rs @@ -1,30 +1,57 @@ use serde::{Serialize, Deserialize}; +use polywrap_msgpack_serde::{ + from_slice, + to_vec, + wrappers::polywrap_json::JSONString, + wrappers::polywrap_bigint::BigIntWrapper +}; use polywrap_wasm_rs::{ BigInt, BigNumber, Map, - Read, - Write, JSON, - subinvoke, -}; -pub mod serialization; -pub use serialization::{ - deserialize_imported_method_result, - serialize_imported_method_args, - ArgsImportedMethod, - deserialize_another_method_result, - serialize_another_method_args, - ArgsAnotherMethod, - deserialize_returns_array_of_enums_result, - serialize_returns_array_of_enums_args, - ArgsReturnsArrayOfEnums + subinvoke }; - use crate::TestImportObject; use crate::TestImportEnum; use crate::TestImportEnumReturn; +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct ArgsImportedMethod { + pub str: String, + #[serde(rename = "optStr")] + pub opt_str: Option, + pub u: u32, + #[serde(rename = "optU")] + pub opt_u: Option, + #[serde(rename = "uArrayArray")] + pub u_array_array: Vec>>>, + pub object: TestImportObject, + #[serde(rename = "optObject")] + pub opt_object: Option, + #[serde(rename = "objectArray")] + pub object_array: Vec, + #[serde(rename = "optObjectArray")] + pub opt_object_array: Option>>, + pub en: TestImportEnum, + #[serde(rename = "optEnum")] + pub opt_enum: Option, + #[serde(rename = "enumArray")] + pub enum_array: Vec, + #[serde(rename = "optEnumArray")] + pub opt_enum_array: Option>>, +} + +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct ArgsAnotherMethod { + pub arg: Vec, +} + +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct ArgsReturnsArrayOfEnums { + pub arg: String, +} + #[derive(Clone, Debug, Deserialize, Serialize)] pub struct TestImportModule { uri: String @@ -39,34 +66,34 @@ impl TestImportModule { pub fn imported_method(&self, args: &ArgsImportedMethod) -> Result, String> { let ref uri = self.uri; - let args = serialize_imported_method_args(args).map_err(|e| e.to_string())?; + let args = to_vec(args).map_err(|e| e.to_string())?; let result = subinvoke::wrap_subinvoke( uri.as_str(), "importedMethod", args, )?; - deserialize_imported_method_result(result.as_slice()).map_err(|e| e.to_string()) + from_slice(result.as_slice()).map_err(|e| e.to_string()) } pub fn another_method(&self, args: &ArgsAnotherMethod) -> Result { let ref uri = self.uri; - let args = serialize_another_method_args(args).map_err(|e| e.to_string())?; + let args = to_vec(args).map_err(|e| e.to_string())?; let result = subinvoke::wrap_subinvoke( uri.as_str(), "anotherMethod", args, )?; - deserialize_another_method_result(result.as_slice()).map_err(|e| e.to_string()) + from_slice(result.as_slice()).map_err(|e| e.to_string()) } pub fn returns_array_of_enums(&self, args: &ArgsReturnsArrayOfEnums) -> Result>, String> { let ref uri = self.uri; - let args = serialize_returns_array_of_enums_args(args).map_err(|e| e.to_string())?; + let args = to_vec(args).map_err(|e| e.to_string())?; let result = subinvoke::wrap_subinvoke( uri.as_str(), "returnsArrayOfEnums", args, )?; - deserialize_returns_array_of_enums_result(result.as_slice()).map_err(|e| e.to_string()) + from_slice(result.as_slice()).map_err(|e| e.to_string()) } } diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_module/serialization.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_module/serialization.rs deleted file mode 100644 index 92ed22e3ed..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_module/serialization.rs +++ /dev/null @@ -1,554 +0,0 @@ -use serde::{Serialize, Deserialize}; -use polywrap_wasm_rs::{ - BigInt, - BigNumber, - Map, - Context, - DecodeError, - EncodeError, - Read, - ReadDecoder, - Write, - WriteEncoder, - JSON, -}; - -use crate::TestImportObject; -use crate::{ - TestImportEnum, - get_test_import_enum_value, - sanitize_test_import_enum_value -}; -use crate::{ - TestImportEnumReturn, - get_test_import_enum_return_value, - sanitize_test_import_enum_return_value -}; - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct ArgsImportedMethod { - pub str: String, - pub opt_str: Option, - pub u: u32, - pub opt_u: Option, - pub u_array_array: Vec>>>, - pub object: TestImportObject, - pub opt_object: Option, - pub object_array: Vec, - pub opt_object_array: Option>>, - pub en: TestImportEnum, - pub opt_enum: Option, - pub enum_array: Vec, - pub opt_enum_array: Option>>, -} - -pub fn deserialize_imported_method_args(args: &[u8]) -> Result { - let mut context = Context::new(); - context.description = "Deserializing imported module-type: imported_method Args".to_string(); - - let mut reader = ReadDecoder::new(args, context); - let mut num_of_fields = reader.read_map_length()?; - - let mut _str: String = String::new(); - let mut _str_set = false; - let mut _opt_str: Option = None; - let mut _u: u32 = 0; - let mut _u_set = false; - let mut _opt_u: Option = None; - let mut _u_array_array: Vec>>> = vec![]; - let mut _u_array_array_set = false; - let mut _object: TestImportObject = TestImportObject::new(); - let mut _object_set = false; - let mut _opt_object: Option = None; - let mut _object_array: Vec = vec![]; - let mut _object_array_set = false; - let mut _opt_object_array: Option>> = None; - let mut _en: TestImportEnum = TestImportEnum::_MAX_; - let mut _en_set = false; - let mut _opt_enum: Option = None; - let mut _enum_array: Vec = vec![]; - let mut _enum_array_set = false; - let mut _opt_enum_array: Option>> = None; - - while num_of_fields > 0 { - num_of_fields -= 1; - let field = reader.read_string()?; - - match field.as_str() { - "str" => { - reader.context().push(&field, "String", "type found, reading argument"); - _str = reader.read_string()?; - _str_set = true; - reader.context().pop(); - } - "optStr" => { - reader.context().push(&field, "Option", "type found, reading argument"); - _opt_str = reader.read_optional_string()?; - reader.context().pop(); - } - "u" => { - reader.context().push(&field, "u32", "type found, reading argument"); - _u = reader.read_u32()?; - _u_set = true; - reader.context().pop(); - } - "optU" => { - reader.context().push(&field, "Option", "type found, reading argument"); - _opt_u = reader.read_optional_u32()?; - reader.context().pop(); - } - "uArrayArray" => { - reader.context().push(&field, "Vec>>>", "type found, reading argument"); - _u_array_array = reader.read_array(|reader| { - reader.read_optional_array(|reader| { - reader.read_optional_u32() - }) - })?; - _u_array_array_set = true; - reader.context().pop(); - } - "object" => { - reader.context().push(&field, "TestImportObject", "type found, reading argument"); - let object = TestImportObject::read(&mut reader)?; - _object = object; - _object_set = true; - reader.context().pop(); - } - "optObject" => { - reader.context().push(&field, "Option", "type found, reading argument"); - let mut object: Option = None; - if !reader.is_next_nil()? { - object = Some(TestImportObject::read(&mut reader)?); - } else { - object = None; - } - _opt_object = object; - reader.context().pop(); - } - "objectArray" => { - reader.context().push(&field, "Vec", "type found, reading argument"); - _object_array = reader.read_array(|reader| { - let object = TestImportObject::read(reader)?; - Ok(object) - })?; - _object_array_set = true; - reader.context().pop(); - } - "optObjectArray" => { - reader.context().push(&field, "Option>>", "type found, reading argument"); - _opt_object_array = reader.read_optional_array(|reader| { - let mut object: Option = None; - if !reader.is_next_nil()? { - object = Some(TestImportObject::read(reader)?); - } else { - object = None; - } - Ok(object) - })?; - reader.context().pop(); - } - "en" => { - reader.context().push(&field, "TestImportEnum", "type found, reading argument"); - let mut value: TestImportEnum = TestImportEnum::_MAX_; - if reader.is_next_string()? { - value = get_test_import_enum_value(&reader.read_string()?)?; - } else { - value = TestImportEnum::try_from(reader.read_i32()?)?; - sanitize_test_import_enum_value(value as i32)?; - } - _en = value; - _en_set = true; - reader.context().pop(); - } - "optEnum" => { - reader.context().push(&field, "Option", "type found, reading argument"); - let mut value: Option = None; - if !reader.is_next_nil()? { - if reader.is_next_string()? { - value = Some(get_test_import_enum_value(&reader.read_string()?)?); - } else { - value = Some(TestImportEnum::try_from(reader.read_i32()?)?); - sanitize_test_import_enum_value(value.unwrap() as i32)?; - } - } else { - value = None; - } - _opt_enum = value; - reader.context().pop(); - } - "enumArray" => { - reader.context().push(&field, "Vec", "type found, reading argument"); - _enum_array = reader.read_array(|reader| { - let mut value: TestImportEnum = TestImportEnum::_MAX_; - if reader.is_next_string()? { - value = get_test_import_enum_value(&reader.read_string()?)?; - } else { - value = TestImportEnum::try_from(reader.read_i32()?)?; - sanitize_test_import_enum_value(value as i32)?; - } - Ok(value) - })?; - _enum_array_set = true; - reader.context().pop(); - } - "optEnumArray" => { - reader.context().push(&field, "Option>>", "type found, reading argument"); - _opt_enum_array = reader.read_optional_array(|reader| { - let mut value: Option = None; - if !reader.is_next_nil()? { - if reader.is_next_string()? { - value = Some(get_test_import_enum_value(&reader.read_string()?)?); - } else { - value = Some(TestImportEnum::try_from(reader.read_i32()?)?); - sanitize_test_import_enum_value(value.unwrap() as i32)?; - } - } else { - value = None; - } - Ok(value) - })?; - reader.context().pop(); - } - err => return Err(DecodeError::UnknownFieldName(err.to_string())), - } - } - if !_str_set { - return Err(DecodeError::MissingField("str: String.".to_string())); - } - if !_u_set { - return Err(DecodeError::MissingField("u: UInt.".to_string())); - } - if !_u_array_array_set { - return Err(DecodeError::MissingField("uArrayArray: [[UInt]].".to_string())); - } - if !_object_set { - return Err(DecodeError::MissingField("object: TestImport_Object.".to_string())); - } - if !_object_array_set { - return Err(DecodeError::MissingField("objectArray: [TestImport_Object].".to_string())); - } - if !_en_set { - return Err(DecodeError::MissingField("en: TestImport_Enum.".to_string())); - } - if !_enum_array_set { - return Err(DecodeError::MissingField("enumArray: [TestImport_Enum].".to_string())); - } - - Ok(ArgsImportedMethod { - str: _str, - opt_str: _opt_str, - u: _u, - opt_u: _opt_u, - u_array_array: _u_array_array, - object: _object, - opt_object: _opt_object, - object_array: _object_array, - opt_object_array: _opt_object_array, - en: _en, - opt_enum: _opt_enum, - enum_array: _enum_array, - opt_enum_array: _opt_enum_array, - }) -} - -pub fn serialize_imported_method_args(args: &ArgsImportedMethod) -> Result, EncodeError> { - let mut encoder_context = Context::new(); - encoder_context.description = "Serializing (encoding) imported module-type: imported_method Args".to_string(); - let mut encoder = WriteEncoder::new(&[], encoder_context); - write_imported_method_args(args, &mut encoder)?; - Ok(encoder.get_buffer()) -} - -pub fn write_imported_method_args(args: &ArgsImportedMethod, writer: &mut W) -> Result<(), EncodeError> { - writer.write_map_length(&13)?; - writer.context().push("str", "String", "writing property"); - writer.write_string("str")?; - writer.write_string(&args.str)?; - writer.context().pop(); - writer.context().push("optStr", "Option", "writing property"); - writer.write_string("optStr")?; - writer.write_optional_string(&args.opt_str)?; - writer.context().pop(); - writer.context().push("u", "u32", "writing property"); - writer.write_string("u")?; - writer.write_u32(&args.u)?; - writer.context().pop(); - writer.context().push("optU", "Option", "writing property"); - writer.write_string("optU")?; - writer.write_optional_u32(&args.opt_u)?; - writer.context().pop(); - writer.context().push("uArrayArray", "Vec>>>", "writing property"); - writer.write_string("uArrayArray")?; - writer.write_array(&args.u_array_array, |writer, item| { - writer.write_optional_array(item, |writer, item| { - writer.write_optional_u32(item) - }) - })?; - writer.context().pop(); - writer.context().push("object", "TestImportObject", "writing property"); - writer.write_string("object")?; - TestImportObject::write(&args.object, writer)?; - writer.context().pop(); - writer.context().push("optObject", "Option", "writing property"); - writer.write_string("optObject")?; - if args.opt_object.is_some() { - TestImportObject::write(args.opt_object.as_ref().as_ref().unwrap(), writer)?; - } else { - writer.write_nil()?; - } - writer.context().pop(); - writer.context().push("objectArray", "Vec", "writing property"); - writer.write_string("objectArray")?; - writer.write_array(&args.object_array, |writer, item| { - TestImportObject::write(item, writer) - })?; - writer.context().pop(); - writer.context().push("optObjectArray", "Option>>", "writing property"); - writer.write_string("optObjectArray")?; - writer.write_optional_array(&args.opt_object_array, |writer, item| { - if item.is_some() { - TestImportObject::write(item.as_ref().as_ref().unwrap(), writer) - } else { - writer.write_nil() - } - })?; - writer.context().pop(); - writer.context().push("en", "TestImportEnum", "writing property"); - writer.write_string("en")?; - writer.write_i32(&(args.en as i32))?; - writer.context().pop(); - writer.context().push("optEnum", "Option", "writing property"); - writer.write_string("optEnum")?; - writer.write_optional_i32(&args.opt_enum.map(|f| f as i32))?; - writer.context().pop(); - writer.context().push("enumArray", "Vec", "writing property"); - writer.write_string("enumArray")?; - writer.write_array(&args.enum_array, |writer, item| { - writer.write_i32(&(*item as i32)) - })?; - writer.context().pop(); - writer.context().push("optEnumArray", "Option>>", "writing property"); - writer.write_string("optEnumArray")?; - writer.write_optional_array(&args.opt_enum_array, |writer, item| { - writer.write_optional_i32(&item.map(|f| f as i32)) - })?; - writer.context().pop(); - Ok(()) -} - -pub fn serialize_imported_method_result(result: &Option) -> Result, EncodeError> { - let mut encoder_context = Context::new(); - encoder_context.description = "Serializing (encoding) imported module-type: imported_method Result".to_string(); - let mut encoder = WriteEncoder::new(&[], encoder_context); - write_imported_method_result(result, &mut encoder)?; - Ok(encoder.get_buffer()) -} - -pub fn write_imported_method_result(result: &Option, writer: &mut W) -> Result<(), EncodeError> { - writer.context().push("importedMethod", "Option", "writing result"); - if result.is_some() { - TestImportObject::write(result.as_ref().unwrap(), writer)?; - } else { - writer.write_nil()?; - } - writer.context().pop(); - Ok(()) -} - -pub fn deserialize_imported_method_result(result: &[u8]) -> Result, DecodeError> { - let mut context = Context::new(); - context.description = "Deserializing imported module-type: imported_method Result".to_string(); - let mut reader = ReadDecoder::new(result, context); - - reader.context().push("importedMethod", "Option", "reading function output"); - let mut object: Option = None; - if !reader.is_next_nil()? { - object = Some(TestImportObject::read(&mut reader)?); - } else { - object = None; - } - let res = object; - reader.context().pop(); - Ok(res) -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct ArgsAnotherMethod { - pub arg: Vec, -} - -pub fn deserialize_another_method_args(args: &[u8]) -> Result { - let mut context = Context::new(); - context.description = "Deserializing imported module-type: another_method Args".to_string(); - - let mut reader = ReadDecoder::new(args, context); - let mut num_of_fields = reader.read_map_length()?; - - let mut _arg: Vec = vec![]; - let mut _arg_set = false; - - while num_of_fields > 0 { - num_of_fields -= 1; - let field = reader.read_string()?; - - match field.as_str() { - "arg" => { - reader.context().push(&field, "Vec", "type found, reading argument"); - _arg = reader.read_array(|reader| { - reader.read_string() - })?; - _arg_set = true; - reader.context().pop(); - } - err => return Err(DecodeError::UnknownFieldName(err.to_string())), - } - } - if !_arg_set { - return Err(DecodeError::MissingField("arg: [String].".to_string())); - } - - Ok(ArgsAnotherMethod { - arg: _arg, - }) -} - -pub fn serialize_another_method_args(args: &ArgsAnotherMethod) -> Result, EncodeError> { - let mut encoder_context = Context::new(); - encoder_context.description = "Serializing (encoding) imported module-type: another_method Args".to_string(); - let mut encoder = WriteEncoder::new(&[], encoder_context); - write_another_method_args(args, &mut encoder)?; - Ok(encoder.get_buffer()) -} - -pub fn write_another_method_args(args: &ArgsAnotherMethod, writer: &mut W) -> Result<(), EncodeError> { - writer.write_map_length(&1)?; - writer.context().push("arg", "Vec", "writing property"); - writer.write_string("arg")?; - writer.write_array(&args.arg, |writer, item| { - writer.write_string(item) - })?; - writer.context().pop(); - Ok(()) -} - -pub fn serialize_another_method_result(result: &i32) -> Result, EncodeError> { - let mut encoder_context = Context::new(); - encoder_context.description = "Serializing (encoding) imported module-type: another_method Result".to_string(); - let mut encoder = WriteEncoder::new(&[], encoder_context); - write_another_method_result(result, &mut encoder)?; - Ok(encoder.get_buffer()) -} - -pub fn write_another_method_result(result: &i32, writer: &mut W) -> Result<(), EncodeError> { - writer.context().push("anotherMethod", "i32", "writing result"); - writer.write_i32(result)?; - writer.context().pop(); - Ok(()) -} - -pub fn deserialize_another_method_result(result: &[u8]) -> Result { - let mut context = Context::new(); - context.description = "Deserializing imported module-type: another_method Result".to_string(); - let mut reader = ReadDecoder::new(result, context); - - reader.context().push("anotherMethod", "i32", "reading function output"); - let res = reader.read_i32()?; - reader.context().pop(); - Ok(res) -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct ArgsReturnsArrayOfEnums { - pub arg: String, -} - -pub fn deserialize_returns_array_of_enums_args(args: &[u8]) -> Result { - let mut context = Context::new(); - context.description = "Deserializing imported module-type: returns_array_of_enums Args".to_string(); - - let mut reader = ReadDecoder::new(args, context); - let mut num_of_fields = reader.read_map_length()?; - - let mut _arg: String = String::new(); - let mut _arg_set = false; - - while num_of_fields > 0 { - num_of_fields -= 1; - let field = reader.read_string()?; - - match field.as_str() { - "arg" => { - reader.context().push(&field, "String", "type found, reading argument"); - _arg = reader.read_string()?; - _arg_set = true; - reader.context().pop(); - } - err => return Err(DecodeError::UnknownFieldName(err.to_string())), - } - } - if !_arg_set { - return Err(DecodeError::MissingField("arg: String.".to_string())); - } - - Ok(ArgsReturnsArrayOfEnums { - arg: _arg, - }) -} - -pub fn serialize_returns_array_of_enums_args(args: &ArgsReturnsArrayOfEnums) -> Result, EncodeError> { - let mut encoder_context = Context::new(); - encoder_context.description = "Serializing (encoding) imported module-type: returns_array_of_enums Args".to_string(); - let mut encoder = WriteEncoder::new(&[], encoder_context); - write_returns_array_of_enums_args(args, &mut encoder)?; - Ok(encoder.get_buffer()) -} - -pub fn write_returns_array_of_enums_args(args: &ArgsReturnsArrayOfEnums, writer: &mut W) -> Result<(), EncodeError> { - writer.write_map_length(&1)?; - writer.context().push("arg", "String", "writing property"); - writer.write_string("arg")?; - writer.write_string(&args.arg)?; - writer.context().pop(); - Ok(()) -} - -pub fn serialize_returns_array_of_enums_result(result: &Vec>) -> Result, EncodeError> { - let mut encoder_context = Context::new(); - encoder_context.description = "Serializing (encoding) imported module-type: returns_array_of_enums Result".to_string(); - let mut encoder = WriteEncoder::new(&[], encoder_context); - write_returns_array_of_enums_result(result, &mut encoder)?; - Ok(encoder.get_buffer()) -} - -pub fn write_returns_array_of_enums_result(result: &Vec>, writer: &mut W) -> Result<(), EncodeError> { - writer.context().push("returnsArrayOfEnums", "Vec>", "writing result"); - writer.write_array(&result, |writer, item| { - writer.write_optional_i32(&item.map(|f| f as i32)) - })?; - writer.context().pop(); - Ok(()) -} - -pub fn deserialize_returns_array_of_enums_result(result: &[u8]) -> Result>, DecodeError> { - let mut context = Context::new(); - context.description = "Deserializing imported module-type: returns_array_of_enums Result".to_string(); - let mut reader = ReadDecoder::new(result, context); - - reader.context().push("returnsArrayOfEnums", "Vec>", "reading function output"); - let res = reader.read_array(|reader| { - let mut value: Option = None; - if !reader.is_next_nil()? { - if reader.is_next_string()? { - value = Some(get_test_import_enum_return_value(&reader.read_string()?)?); - } else { - value = Some(TestImportEnumReturn::try_from(reader.read_i32()?)?); - sanitize_test_import_enum_return_value(value.unwrap() as i32)?; - } - } else { - value = None; - } - Ok(value) - })?; - reader.context().pop(); - Ok(res) -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_object/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_object/mod.rs index ab9c3cf3c4..b40e4db32d 100644 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_object/mod.rs +++ b/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_object/mod.rs @@ -1,34 +1,32 @@ use serde::{Serialize, Deserialize}; -pub mod serialization; +use polywrap_msgpack_serde::{ + wrappers::polywrap_json::JSONString, + wrappers::polywrap_bigint::BigIntWrapper +}; use polywrap_wasm_rs::{ BigInt, BigNumber, Map, - DecodeError, - EncodeError, - Read, - Write, - JSON, -}; -pub use serialization::{ - deserialize_test_import_object, - read_test_import_object, - serialize_test_import_object, - write_test_import_object + JSON }; - use crate::TestImportAnotherObject; use crate::TestImportEnum; #[derive(Clone, Debug, Deserialize, Serialize)] pub struct TestImportObject { pub object: TestImportAnotherObject, + #[serde(rename = "optObject")] pub opt_object: Option, + #[serde(rename = "objectArray")] pub object_array: Vec, + #[serde(rename = "optObjectArray")] pub opt_object_array: Option>>, pub en: TestImportEnum, + #[serde(rename = "optEnum")] pub opt_enum: Option, + #[serde(rename = "enumArray")] pub enum_array: Vec, + #[serde(rename = "optEnumArray")] pub opt_enum_array: Option>>, } @@ -37,30 +35,14 @@ impl TestImportObject { pub fn new() -> TestImportObject { TestImportObject { - object: TestImportAnotherObject::new(), + object: Option::new(), opt_object: None, object_array: vec![], opt_object_array: None, - en: TestImportEnum::_MAX_, + en: Option::_MAX_, opt_enum: None, enum_array: vec![], opt_enum_array: None, } } - - pub fn to_buffer(args: &TestImportObject) -> Result, EncodeError> { - serialize_test_import_object(args).map_err(|e| EncodeError::TypeWriteError(e.to_string())) - } - - pub fn from_buffer(args: &[u8]) -> Result { - deserialize_test_import_object(args).map_err(|e| DecodeError::TypeReadError(e.to_string())) - } - - pub fn write(args: &TestImportObject, writer: &mut W) -> Result<(), EncodeError> { - write_test_import_object(args, writer).map_err(|e| EncodeError::TypeWriteError(e.to_string())) - } - - pub fn read(reader: &mut R) -> Result { - read_test_import_object(reader).map_err(|e| DecodeError::TypeReadError(e.to_string())) - } } diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_object/serialization.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_object/serialization.rs deleted file mode 100644 index 691cf5d323..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_object/serialization.rs +++ /dev/null @@ -1,241 +0,0 @@ -use std::convert::TryFrom; -use polywrap_wasm_rs::{ - BigInt, - BigNumber, - Map, - Context, - DecodeError, - EncodeError, - Read, - ReadDecoder, - Write, - WriteEncoder, - JSON, -}; -use crate::TestImportObject; - -use crate::TestImportAnotherObject; -use crate::{ - TestImportEnum, - get_test_import_enum_value, - sanitize_test_import_enum_value -}; - -pub fn serialize_test_import_object(args: &TestImportObject) -> Result, EncodeError> { - let mut encoder_context = Context::new(); - encoder_context.description = "Serializing (encoding) imported object-type: TestImportObject".to_string(); - let mut encoder = WriteEncoder::new(&[], encoder_context); - write_test_import_object(args, &mut encoder)?; - Ok(encoder.get_buffer()) -} - -pub fn write_test_import_object(args: &TestImportObject, writer: &mut W) -> Result<(), EncodeError> { - writer.write_map_length(&8)?; - writer.context().push("object", "TestImportAnotherObject", "writing property"); - writer.write_string("object")?; - TestImportAnotherObject::write(&args.object, writer)?; - writer.context().pop(); - writer.context().push("optObject", "Option", "writing property"); - writer.write_string("optObject")?; - if args.opt_object.is_some() { - TestImportAnotherObject::write(args.opt_object.as_ref().as_ref().unwrap(), writer)?; - } else { - writer.write_nil()?; - } - writer.context().pop(); - writer.context().push("objectArray", "Vec", "writing property"); - writer.write_string("objectArray")?; - writer.write_array(&args.object_array, |writer, item| { - TestImportAnotherObject::write(item, writer) - })?; - writer.context().pop(); - writer.context().push("optObjectArray", "Option>>", "writing property"); - writer.write_string("optObjectArray")?; - writer.write_optional_array(&args.opt_object_array, |writer, item| { - if item.is_some() { - TestImportAnotherObject::write(item.as_ref().as_ref().unwrap(), writer) - } else { - writer.write_nil() - } - })?; - writer.context().pop(); - writer.context().push("en", "TestImportEnum", "writing property"); - writer.write_string("en")?; - writer.write_i32(&(args.en as i32))?; - writer.context().pop(); - writer.context().push("optEnum", "Option", "writing property"); - writer.write_string("optEnum")?; - writer.write_optional_i32(&args.opt_enum.map(|f| f as i32))?; - writer.context().pop(); - writer.context().push("enumArray", "Vec", "writing property"); - writer.write_string("enumArray")?; - writer.write_array(&args.enum_array, |writer, item| { - writer.write_i32(&(*item as i32)) - })?; - writer.context().pop(); - writer.context().push("optEnumArray", "Option>>", "writing property"); - writer.write_string("optEnumArray")?; - writer.write_optional_array(&args.opt_enum_array, |writer, item| { - writer.write_optional_i32(&item.map(|f| f as i32)) - })?; - writer.context().pop(); - Ok(()) -} - -pub fn deserialize_test_import_object(args: &[u8]) -> Result { - let mut context = Context::new(); - context.description = "Deserializing imported object-type: TestImportObject".to_string(); - let mut reader = ReadDecoder::new(args, context); - read_test_import_object(&mut reader) -} - -pub fn read_test_import_object(reader: &mut R) -> Result { - let mut num_of_fields = reader.read_map_length()?; - - let mut _object: TestImportAnotherObject = TestImportAnotherObject::new(); - let mut _object_set = false; - let mut _opt_object: Option = None; - let mut _object_array: Vec = vec![]; - let mut _object_array_set = false; - let mut _opt_object_array: Option>> = None; - let mut _en: TestImportEnum = TestImportEnum::_MAX_; - let mut _en_set = false; - let mut _opt_enum: Option = None; - let mut _enum_array: Vec = vec![]; - let mut _enum_array_set = false; - let mut _opt_enum_array: Option>> = None; - - while num_of_fields > 0 { - num_of_fields -= 1; - let field = reader.read_string()?; - - match field.as_str() { - "object" => { - reader.context().push(&field, "TestImportAnotherObject", "type found, reading property"); - let object = TestImportAnotherObject::read(reader)?; - _object = object; - _object_set = true; - reader.context().pop(); - } - "optObject" => { - reader.context().push(&field, "Option", "type found, reading property"); - let mut object: Option = None; - if !reader.is_next_nil()? { - object = Some(TestImportAnotherObject::read(reader)?); - } else { - object = None; - } - _opt_object = object; - reader.context().pop(); - } - "objectArray" => { - reader.context().push(&field, "Vec", "type found, reading property"); - _object_array = reader.read_array(|reader| { - let object = TestImportAnotherObject::read(reader)?; - Ok(object) - })?; - _object_array_set = true; - reader.context().pop(); - } - "optObjectArray" => { - reader.context().push(&field, "Option>>", "type found, reading property"); - _opt_object_array = reader.read_optional_array(|reader| { - let mut object: Option = None; - if !reader.is_next_nil()? { - object = Some(TestImportAnotherObject::read(reader)?); - } else { - object = None; - } - Ok(object) - })?; - reader.context().pop(); - } - "en" => { - reader.context().push(&field, "TestImportEnum", "type found, reading property"); - let mut value: TestImportEnum = TestImportEnum::_MAX_; - if reader.is_next_string()? { - value = get_test_import_enum_value(&reader.read_string()?)?; - } else { - value = TestImportEnum::try_from(reader.read_i32()?)?; - sanitize_test_import_enum_value(value as i32)?; - } - _en = value; - _en_set = true; - reader.context().pop(); - } - "optEnum" => { - reader.context().push(&field, "Option", "type found, reading property"); - let mut value: Option = None; - if !reader.is_next_nil()? { - if reader.is_next_string()? { - value = Some(get_test_import_enum_value(&reader.read_string()?)?); - } else { - value = Some(TestImportEnum::try_from(reader.read_i32()?)?); - sanitize_test_import_enum_value(value.unwrap() as i32)?; - } - } else { - value = None; - } - _opt_enum = value; - reader.context().pop(); - } - "enumArray" => { - reader.context().push(&field, "Vec", "type found, reading property"); - _enum_array = reader.read_array(|reader| { - let mut value: TestImportEnum = TestImportEnum::_MAX_; - if reader.is_next_string()? { - value = get_test_import_enum_value(&reader.read_string()?)?; - } else { - value = TestImportEnum::try_from(reader.read_i32()?)?; - sanitize_test_import_enum_value(value as i32)?; - } - Ok(value) - })?; - _enum_array_set = true; - reader.context().pop(); - } - "optEnumArray" => { - reader.context().push(&field, "Option>>", "type found, reading property"); - _opt_enum_array = reader.read_optional_array(|reader| { - let mut value: Option = None; - if !reader.is_next_nil()? { - if reader.is_next_string()? { - value = Some(get_test_import_enum_value(&reader.read_string()?)?); - } else { - value = Some(TestImportEnum::try_from(reader.read_i32()?)?); - sanitize_test_import_enum_value(value.unwrap() as i32)?; - } - } else { - value = None; - } - Ok(value) - })?; - reader.context().pop(); - } - err => return Err(DecodeError::UnknownFieldName(err.to_string())), - } - } - if !_object_set { - return Err(DecodeError::MissingField("object: TestImport_AnotherObject.".to_string())); - } - if !_object_array_set { - return Err(DecodeError::MissingField("objectArray: [TestImport_AnotherObject].".to_string())); - } - if !_en_set { - return Err(DecodeError::MissingField("en: TestImport_Enum.".to_string())); - } - if !_enum_array_set { - return Err(DecodeError::MissingField("enumArray: [TestImport_Enum].".to_string())); - } - - Ok(TestImportObject { - object: _object, - opt_object: _opt_object, - object_array: _object_array, - opt_object_array: _opt_object_array, - en: _en, - opt_enum: _opt_enum, - enum_array: _enum_array, - opt_enum_array: _opt_enum_array, - }) -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/mod.rs index d5a8b8e1e8..5fa8c40b25 100644 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/mod.rs +++ b/packages/test-cases/cases/bind/sanity/output/wrap-rs/mod.rs @@ -24,6 +24,7 @@ pub use _while::{ pub mod env; pub use env::Env; pub mod imported; + pub use imported::test_import_object::TestImportObject; pub use imported::test_import_another_object::TestImportAnotherObject; pub use imported::test_import_enum::{ @@ -46,20 +47,12 @@ pub mod module; pub use module::{ Module, ModuleTrait, - deserialize_module_method_args, - serialize_module_method_result, module_method_wrapped, ArgsModuleMethod, - deserialize_object_method_args, - serialize_object_method_result, object_method_wrapped, ArgsObjectMethod, - deserialize_optional_env_method_args, - serialize_optional_env_method_result, optional_env_method_wrapped, ArgsOptionalEnvMethod, - deserialize_if_args, - serialize_if_result, if_wrapped, ArgsIf }; diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/module/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/module/mod.rs index 7823ef5b88..1216287feb 100644 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/module/mod.rs +++ b/packages/test-cases/cases/bind/sanity/output/wrap-rs/module/mod.rs @@ -1,23 +1,12 @@ pub mod wrapped; pub use wrapped::{ module_method_wrapped, - object_method_wrapped, - optional_env_method_wrapped, - if_wrapped -}; -pub mod serialization; -pub use serialization::{ - deserialize_module_method_args, - serialize_module_method_result, ArgsModuleMethod, - deserialize_object_method_args, - serialize_object_method_result, + object_method_wrapped, ArgsObjectMethod, - deserialize_optional_env_method_args, - serialize_optional_env_method_result, + optional_env_method_wrapped, ArgsOptionalEnvMethod, - deserialize_if_args, - serialize_if_result, + if_wrapped, ArgsIf }; diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/module/module.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/module/module.rs index f0fbdf1bcb..e5cf0918fb 100644 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/module/module.rs +++ b/packages/test-cases/cases/bind/sanity/output/wrap-rs/module/module.rs @@ -1,22 +1,23 @@ -use crate::{ - ArgsModuleMethod, - ArgsObjectMethod, - ArgsOptionalEnvMethod, - ArgsIf, +use polywrap_msgpack_serde::{ + wrappers::polywrap_json::JSONString, + wrappers::polywrap_bigint::BigIntWrapper }; use polywrap_wasm_rs::{ BigInt, BigNumber, Map, - JSON, + JSON }; - -use crate::Env; use crate::{ - CustomEnum, + ArgsModuleMethod, + ArgsObjectMethod, + ArgsOptionalEnvMethod, + ArgsIf, }; +use crate::CustomEnum; use crate::AnotherType; use crate::Else; +use crate::env::Env; pub struct Module; diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/module/serialization.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/module/serialization.rs deleted file mode 100644 index f4146f90b0..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/module/serialization.rs +++ /dev/null @@ -1,770 +0,0 @@ -use serde::{Serialize, Deserialize}; -use std::convert::TryFrom; -use polywrap_wasm_rs::{ - BigInt, - BigNumber, - Map, - Context, - DecodeError, - EncodeError, - Read, - ReadDecoder, - Write, - WriteEncoder, - JSON, -}; - -use crate::Env; -use crate::{ - CustomEnum, - get_custom_enum_value, - sanitize_custom_enum_value -}; -use crate::AnotherType; -use crate::Else; - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct ArgsModuleMethod { - pub str: String, - pub opt_str: Option, - pub en: CustomEnum, - pub opt_enum: Option, - pub enum_array: Vec, - pub opt_enum_array: Option>>, - pub map: Map, - pub map_of_arr: Map>, - pub map_of_map: Map>, - pub map_of_obj: Map, - pub map_of_arr_of_obj: Map>, -} - -pub fn deserialize_module_method_args(args: &[u8]) -> Result { - let mut context = Context::new(); - context.description = "Deserializing module-type: module_method Args".to_string(); - - let mut reader = ReadDecoder::new(args, context); - let mut num_of_fields = reader.read_map_length()?; - - let mut _str: String = String::new(); - let mut _str_set = false; - let mut _opt_str: Option = None; - let mut _en: CustomEnum = CustomEnum::_MAX_; - let mut _en_set = false; - let mut _opt_enum: Option = None; - let mut _enum_array: Vec = vec![]; - let mut _enum_array_set = false; - let mut _opt_enum_array: Option>> = None; - let mut _map: Map = Map::::new(); - let mut _map_set = false; - let mut _map_of_arr: Map> = Map::>::new(); - let mut _map_of_arr_set = false; - let mut _map_of_map: Map> = Map::>::new(); - let mut _map_of_map_set = false; - let mut _map_of_obj: Map = Map::::new(); - let mut _map_of_obj_set = false; - let mut _map_of_arr_of_obj: Map> = Map::>::new(); - let mut _map_of_arr_of_obj_set = false; - - while num_of_fields > 0 { - num_of_fields -= 1; - let field = reader.read_string()?; - - match field.as_str() { - "str" => { - reader.context().push(&field, "String", "type found, reading argument"); - _str = reader.read_string()?; - _str_set = true; - reader.context().pop(); - } - "optStr" => { - reader.context().push(&field, "Option", "type found, reading argument"); - _opt_str = reader.read_optional_string()?; - reader.context().pop(); - } - "en" => { - reader.context().push(&field, "CustomEnum", "type found, reading argument"); - let mut value: CustomEnum = CustomEnum::_MAX_; - if reader.is_next_string()? { - value = get_custom_enum_value(&reader.read_string()?)?; - } else { - value = CustomEnum::try_from(reader.read_i32()?)?; - sanitize_custom_enum_value(value as i32)?; - } - _en = value; - _en_set = true; - reader.context().pop(); - } - "optEnum" => { - reader.context().push(&field, "Option", "type found, reading argument"); - let mut value: Option = None; - if !reader.is_next_nil()? { - if reader.is_next_string()? { - value = Some(get_custom_enum_value(&reader.read_string()?)?); - } else { - value = Some(CustomEnum::try_from(reader.read_i32()?)?); - sanitize_custom_enum_value(value.unwrap() as i32)?; - } - } else { - value = None; - } - _opt_enum = value; - reader.context().pop(); - } - "enumArray" => { - reader.context().push(&field, "Vec", "type found, reading argument"); - _enum_array = reader.read_array(|reader| { - let mut value: CustomEnum = CustomEnum::_MAX_; - if reader.is_next_string()? { - value = get_custom_enum_value(&reader.read_string()?)?; - } else { - value = CustomEnum::try_from(reader.read_i32()?)?; - sanitize_custom_enum_value(value as i32)?; - } - Ok(value) - })?; - _enum_array_set = true; - reader.context().pop(); - } - "optEnumArray" => { - reader.context().push(&field, "Option>>", "type found, reading argument"); - _opt_enum_array = reader.read_optional_array(|reader| { - let mut value: Option = None; - if !reader.is_next_nil()? { - if reader.is_next_string()? { - value = Some(get_custom_enum_value(&reader.read_string()?)?); - } else { - value = Some(CustomEnum::try_from(reader.read_i32()?)?); - sanitize_custom_enum_value(value.unwrap() as i32)?; - } - } else { - value = None; - } - Ok(value) - })?; - reader.context().pop(); - } - "map" => { - reader.context().push(&field, "Map", "type found, reading argument"); - _map = reader.read_ext_generic_map(|reader| { - reader.read_string() - }, |reader| { - reader.read_i32() - })?; - _map_set = true; - reader.context().pop(); - } - "mapOfArr" => { - reader.context().push(&field, "Map>", "type found, reading argument"); - _map_of_arr = reader.read_ext_generic_map(|reader| { - reader.read_string() - }, |reader| { - reader.read_array(|reader| { - reader.read_i32() - }) - })?; - _map_of_arr_set = true; - reader.context().pop(); - } - "mapOfMap" => { - reader.context().push(&field, "Map>", "type found, reading argument"); - _map_of_map = reader.read_ext_generic_map(|reader| { - reader.read_string() - }, |reader| { - reader.read_ext_generic_map(|reader| { - reader.read_string() - }, |reader| { - reader.read_i32() - }) - })?; - _map_of_map_set = true; - reader.context().pop(); - } - "mapOfObj" => { - reader.context().push(&field, "Map", "type found, reading argument"); - _map_of_obj = reader.read_ext_generic_map(|reader| { - reader.read_string() - }, |reader| { - let object = AnotherType::read(reader)?; - Ok(object) - })?; - _map_of_obj_set = true; - reader.context().pop(); - } - "mapOfArrOfObj" => { - reader.context().push(&field, "Map>", "type found, reading argument"); - _map_of_arr_of_obj = reader.read_ext_generic_map(|reader| { - reader.read_string() - }, |reader| { - reader.read_array(|reader| { - let object = AnotherType::read(reader)?; - Ok(object) - }) - })?; - _map_of_arr_of_obj_set = true; - reader.context().pop(); - } - err => return Err(DecodeError::UnknownFieldName(err.to_string())), - } - } - if !_str_set { - return Err(DecodeError::MissingField("str: String.".to_string())); - } - if !_en_set { - return Err(DecodeError::MissingField("en: CustomEnum.".to_string())); - } - if !_enum_array_set { - return Err(DecodeError::MissingField("enumArray: [CustomEnum].".to_string())); - } - if !_map_set { - return Err(DecodeError::MissingField("map: Map.".to_string())); - } - if !_map_of_arr_set { - return Err(DecodeError::MissingField("mapOfArr: Map.".to_string())); - } - if !_map_of_map_set { - return Err(DecodeError::MissingField("mapOfMap: Map>.".to_string())); - } - if !_map_of_obj_set { - return Err(DecodeError::MissingField("mapOfObj: Map.".to_string())); - } - if !_map_of_arr_of_obj_set { - return Err(DecodeError::MissingField("mapOfArrOfObj: Map.".to_string())); - } - - Ok(ArgsModuleMethod { - str: _str, - opt_str: _opt_str, - en: _en, - opt_enum: _opt_enum, - enum_array: _enum_array, - opt_enum_array: _opt_enum_array, - map: _map, - map_of_arr: _map_of_arr, - map_of_map: _map_of_map, - map_of_obj: _map_of_obj, - map_of_arr_of_obj: _map_of_arr_of_obj, - }) -} - -pub fn serialize_module_method_args(args: &ArgsModuleMethod) -> Result, EncodeError> { - let mut encoder_context = Context::new(); - encoder_context.description = "Serializing (encoding) module-type: module_method Args".to_string(); - let mut encoder = WriteEncoder::new(&[], encoder_context); - write_module_method_args(args, &mut encoder)?; - Ok(encoder.get_buffer()) -} - -pub fn write_module_method_args(args: &ArgsModuleMethod, writer: &mut W) -> Result<(), EncodeError> { - writer.write_map_length(&11)?; - writer.context().push("str", "String", "writing property"); - writer.write_string("str")?; - writer.write_string(&args.str)?; - writer.context().pop(); - writer.context().push("optStr", "Option", "writing property"); - writer.write_string("optStr")?; - writer.write_optional_string(&args.opt_str)?; - writer.context().pop(); - writer.context().push("en", "CustomEnum", "writing property"); - writer.write_string("en")?; - writer.write_i32(&(args.en as i32))?; - writer.context().pop(); - writer.context().push("optEnum", "Option", "writing property"); - writer.write_string("optEnum")?; - writer.write_optional_i32(&args.opt_enum.map(|f| f as i32))?; - writer.context().pop(); - writer.context().push("enumArray", "Vec", "writing property"); - writer.write_string("enumArray")?; - writer.write_array(&args.enum_array, |writer, item| { - writer.write_i32(&(*item as i32)) - })?; - writer.context().pop(); - writer.context().push("optEnumArray", "Option>>", "writing property"); - writer.write_string("optEnumArray")?; - writer.write_optional_array(&args.opt_enum_array, |writer, item| { - writer.write_optional_i32(&item.map(|f| f as i32)) - })?; - writer.context().pop(); - writer.context().push("map", "Map", "writing property"); - writer.write_string("map")?; - writer.write_ext_generic_map(&args.map, |writer, key| { - writer.write_string(key) - }, |writer, value| { - writer.write_i32(value) - })?; - writer.context().pop(); - writer.context().push("mapOfArr", "Map>", "writing property"); - writer.write_string("mapOfArr")?; - writer.write_ext_generic_map(&args.map_of_arr, |writer, key| { - writer.write_string(key) - }, |writer, value| { - writer.write_array(value, |writer, item| { - writer.write_i32(item) - }) - })?; - writer.context().pop(); - writer.context().push("mapOfMap", "Map>", "writing property"); - writer.write_string("mapOfMap")?; - writer.write_ext_generic_map(&args.map_of_map, |writer, key| { - writer.write_string(key) - }, |writer, value| { - writer.write_ext_generic_map(value, |writer, key| { - writer.write_string(key) - }, |writer, value| { - writer.write_i32(value) - }) - })?; - writer.context().pop(); - writer.context().push("mapOfObj", "Map", "writing property"); - writer.write_string("mapOfObj")?; - writer.write_ext_generic_map(&args.map_of_obj, |writer, key| { - writer.write_string(key) - }, |writer, value| { - AnotherType::write(value, writer) - })?; - writer.context().pop(); - writer.context().push("mapOfArrOfObj", "Map>", "writing property"); - writer.write_string("mapOfArrOfObj")?; - writer.write_ext_generic_map(&args.map_of_arr_of_obj, |writer, key| { - writer.write_string(key) - }, |writer, value| { - writer.write_array(value, |writer, item| { - AnotherType::write(item, writer) - }) - })?; - writer.context().pop(); - Ok(()) -} - -pub fn serialize_module_method_result(result: &i32) -> Result, EncodeError> { - let mut encoder_context = Context::new(); - encoder_context.description = "Serializing (encoding) module-type: module_method Result".to_string(); - let mut encoder = WriteEncoder::new(&[], encoder_context); - write_module_method_result(result, &mut encoder)?; - Ok(encoder.get_buffer()) -} - -pub fn write_module_method_result(result: &i32, writer: &mut W) -> Result<(), EncodeError> { - writer.context().push("moduleMethod", "i32", "writing result"); - writer.write_i32(result)?; - writer.context().pop(); - Ok(()) -} - -pub fn deserialize_module_method_result(result: &[u8]) -> Result { - let mut context = Context::new(); - context.description = "Deserializing module-type: module_method Result".to_string(); - let mut reader = ReadDecoder::new(result, context); - - reader.context().push("moduleMethod", "i32", "reading function output"); - let res = reader.read_i32()?; - reader.context().pop(); - Ok(res) -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct ArgsObjectMethod { - pub object: AnotherType, - pub opt_object: Option, - pub object_array: Vec, - pub opt_object_array: Option>>, -} - -pub fn deserialize_object_method_args(args: &[u8]) -> Result { - let mut context = Context::new(); - context.description = "Deserializing module-type: object_method Args".to_string(); - - let mut reader = ReadDecoder::new(args, context); - let mut num_of_fields = reader.read_map_length()?; - - let mut _object: AnotherType = AnotherType::new(); - let mut _object_set = false; - let mut _opt_object: Option = None; - let mut _object_array: Vec = vec![]; - let mut _object_array_set = false; - let mut _opt_object_array: Option>> = None; - - while num_of_fields > 0 { - num_of_fields -= 1; - let field = reader.read_string()?; - - match field.as_str() { - "object" => { - reader.context().push(&field, "AnotherType", "type found, reading argument"); - let object = AnotherType::read(&mut reader)?; - _object = object; - _object_set = true; - reader.context().pop(); - } - "optObject" => { - reader.context().push(&field, "Option", "type found, reading argument"); - let mut object: Option = None; - if !reader.is_next_nil()? { - object = Some(AnotherType::read(&mut reader)?); - } else { - object = None; - } - _opt_object = object; - reader.context().pop(); - } - "objectArray" => { - reader.context().push(&field, "Vec", "type found, reading argument"); - _object_array = reader.read_array(|reader| { - let object = AnotherType::read(reader)?; - Ok(object) - })?; - _object_array_set = true; - reader.context().pop(); - } - "optObjectArray" => { - reader.context().push(&field, "Option>>", "type found, reading argument"); - _opt_object_array = reader.read_optional_array(|reader| { - let mut object: Option = None; - if !reader.is_next_nil()? { - object = Some(AnotherType::read(reader)?); - } else { - object = None; - } - Ok(object) - })?; - reader.context().pop(); - } - err => return Err(DecodeError::UnknownFieldName(err.to_string())), - } - } - if !_object_set { - return Err(DecodeError::MissingField("object: AnotherType.".to_string())); - } - if !_object_array_set { - return Err(DecodeError::MissingField("objectArray: [AnotherType].".to_string())); - } - - Ok(ArgsObjectMethod { - object: _object, - opt_object: _opt_object, - object_array: _object_array, - opt_object_array: _opt_object_array, - }) -} - -pub fn serialize_object_method_args(args: &ArgsObjectMethod) -> Result, EncodeError> { - let mut encoder_context = Context::new(); - encoder_context.description = "Serializing (encoding) module-type: object_method Args".to_string(); - let mut encoder = WriteEncoder::new(&[], encoder_context); - write_object_method_args(args, &mut encoder)?; - Ok(encoder.get_buffer()) -} - -pub fn write_object_method_args(args: &ArgsObjectMethod, writer: &mut W) -> Result<(), EncodeError> { - writer.write_map_length(&4)?; - writer.context().push("object", "AnotherType", "writing property"); - writer.write_string("object")?; - AnotherType::write(&args.object, writer)?; - writer.context().pop(); - writer.context().push("optObject", "Option", "writing property"); - writer.write_string("optObject")?; - if args.opt_object.is_some() { - AnotherType::write(args.opt_object.as_ref().as_ref().unwrap(), writer)?; - } else { - writer.write_nil()?; - } - writer.context().pop(); - writer.context().push("objectArray", "Vec", "writing property"); - writer.write_string("objectArray")?; - writer.write_array(&args.object_array, |writer, item| { - AnotherType::write(item, writer) - })?; - writer.context().pop(); - writer.context().push("optObjectArray", "Option>>", "writing property"); - writer.write_string("optObjectArray")?; - writer.write_optional_array(&args.opt_object_array, |writer, item| { - if item.is_some() { - AnotherType::write(item.as_ref().as_ref().unwrap(), writer) - } else { - writer.write_nil() - } - })?; - writer.context().pop(); - Ok(()) -} - -pub fn serialize_object_method_result(result: &Option) -> Result, EncodeError> { - let mut encoder_context = Context::new(); - encoder_context.description = "Serializing (encoding) module-type: object_method Result".to_string(); - let mut encoder = WriteEncoder::new(&[], encoder_context); - write_object_method_result(result, &mut encoder)?; - Ok(encoder.get_buffer()) -} - -pub fn write_object_method_result(result: &Option, writer: &mut W) -> Result<(), EncodeError> { - writer.context().push("objectMethod", "Option", "writing result"); - if result.is_some() { - AnotherType::write(result.as_ref().unwrap(), writer)?; - } else { - writer.write_nil()?; - } - writer.context().pop(); - Ok(()) -} - -pub fn deserialize_object_method_result(result: &[u8]) -> Result, DecodeError> { - let mut context = Context::new(); - context.description = "Deserializing module-type: object_method Result".to_string(); - let mut reader = ReadDecoder::new(result, context); - - reader.context().push("objectMethod", "Option", "reading function output"); - let mut object: Option = None; - if !reader.is_next_nil()? { - object = Some(AnotherType::read(&mut reader)?); - } else { - object = None; - } - let res = object; - reader.context().pop(); - Ok(res) -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct ArgsOptionalEnvMethod { - pub object: AnotherType, - pub opt_object: Option, - pub object_array: Vec, - pub opt_object_array: Option>>, -} - -pub fn deserialize_optional_env_method_args(args: &[u8]) -> Result { - let mut context = Context::new(); - context.description = "Deserializing module-type: optional_env_method Args".to_string(); - - let mut reader = ReadDecoder::new(args, context); - let mut num_of_fields = reader.read_map_length()?; - - let mut _object: AnotherType = AnotherType::new(); - let mut _object_set = false; - let mut _opt_object: Option = None; - let mut _object_array: Vec = vec![]; - let mut _object_array_set = false; - let mut _opt_object_array: Option>> = None; - - while num_of_fields > 0 { - num_of_fields -= 1; - let field = reader.read_string()?; - - match field.as_str() { - "object" => { - reader.context().push(&field, "AnotherType", "type found, reading argument"); - let object = AnotherType::read(&mut reader)?; - _object = object; - _object_set = true; - reader.context().pop(); - } - "optObject" => { - reader.context().push(&field, "Option", "type found, reading argument"); - let mut object: Option = None; - if !reader.is_next_nil()? { - object = Some(AnotherType::read(&mut reader)?); - } else { - object = None; - } - _opt_object = object; - reader.context().pop(); - } - "objectArray" => { - reader.context().push(&field, "Vec", "type found, reading argument"); - _object_array = reader.read_array(|reader| { - let object = AnotherType::read(reader)?; - Ok(object) - })?; - _object_array_set = true; - reader.context().pop(); - } - "optObjectArray" => { - reader.context().push(&field, "Option>>", "type found, reading argument"); - _opt_object_array = reader.read_optional_array(|reader| { - let mut object: Option = None; - if !reader.is_next_nil()? { - object = Some(AnotherType::read(reader)?); - } else { - object = None; - } - Ok(object) - })?; - reader.context().pop(); - } - err => return Err(DecodeError::UnknownFieldName(err.to_string())), - } - } - if !_object_set { - return Err(DecodeError::MissingField("object: AnotherType.".to_string())); - } - if !_object_array_set { - return Err(DecodeError::MissingField("objectArray: [AnotherType].".to_string())); - } - - Ok(ArgsOptionalEnvMethod { - object: _object, - opt_object: _opt_object, - object_array: _object_array, - opt_object_array: _opt_object_array, - }) -} - -pub fn serialize_optional_env_method_args(args: &ArgsOptionalEnvMethod) -> Result, EncodeError> { - let mut encoder_context = Context::new(); - encoder_context.description = "Serializing (encoding) module-type: optional_env_method Args".to_string(); - let mut encoder = WriteEncoder::new(&[], encoder_context); - write_optional_env_method_args(args, &mut encoder)?; - Ok(encoder.get_buffer()) -} - -pub fn write_optional_env_method_args(args: &ArgsOptionalEnvMethod, writer: &mut W) -> Result<(), EncodeError> { - writer.write_map_length(&4)?; - writer.context().push("object", "AnotherType", "writing property"); - writer.write_string("object")?; - AnotherType::write(&args.object, writer)?; - writer.context().pop(); - writer.context().push("optObject", "Option", "writing property"); - writer.write_string("optObject")?; - if args.opt_object.is_some() { - AnotherType::write(args.opt_object.as_ref().as_ref().unwrap(), writer)?; - } else { - writer.write_nil()?; - } - writer.context().pop(); - writer.context().push("objectArray", "Vec", "writing property"); - writer.write_string("objectArray")?; - writer.write_array(&args.object_array, |writer, item| { - AnotherType::write(item, writer) - })?; - writer.context().pop(); - writer.context().push("optObjectArray", "Option>>", "writing property"); - writer.write_string("optObjectArray")?; - writer.write_optional_array(&args.opt_object_array, |writer, item| { - if item.is_some() { - AnotherType::write(item.as_ref().as_ref().unwrap(), writer) - } else { - writer.write_nil() - } - })?; - writer.context().pop(); - Ok(()) -} - -pub fn serialize_optional_env_method_result(result: &Option) -> Result, EncodeError> { - let mut encoder_context = Context::new(); - encoder_context.description = "Serializing (encoding) module-type: optional_env_method Result".to_string(); - let mut encoder = WriteEncoder::new(&[], encoder_context); - write_optional_env_method_result(result, &mut encoder)?; - Ok(encoder.get_buffer()) -} - -pub fn write_optional_env_method_result(result: &Option, writer: &mut W) -> Result<(), EncodeError> { - writer.context().push("optionalEnvMethod", "Option", "writing result"); - if result.is_some() { - AnotherType::write(result.as_ref().unwrap(), writer)?; - } else { - writer.write_nil()?; - } - writer.context().pop(); - Ok(()) -} - -pub fn deserialize_optional_env_method_result(result: &[u8]) -> Result, DecodeError> { - let mut context = Context::new(); - context.description = "Deserializing module-type: optional_env_method Result".to_string(); - let mut reader = ReadDecoder::new(result, context); - - reader.context().push("optionalEnvMethod", "Option", "reading function output"); - let mut object: Option = None; - if !reader.is_next_nil()? { - object = Some(AnotherType::read(&mut reader)?); - } else { - object = None; - } - let res = object; - reader.context().pop(); - Ok(res) -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct ArgsIf { - #[serde(rename = "if")] - pub _if: Else, -} - -pub fn deserialize_if_args(args: &[u8]) -> Result { - let mut context = Context::new(); - context.description = "Deserializing module-type: if Args".to_string(); - - let mut reader = ReadDecoder::new(args, context); - let mut num_of_fields = reader.read_map_length()?; - - let mut _if: Else = Else::new(); - let mut _if_set = false; - - while num_of_fields > 0 { - num_of_fields -= 1; - let field = reader.read_string()?; - - match field.as_str() { - "if" => { - reader.context().push(&field, "Else", "type found, reading argument"); - let object = Else::read(&mut reader)?; - _if = object; - _if_set = true; - reader.context().pop(); - } - err => return Err(DecodeError::UnknownFieldName(err.to_string())), - } - } - if !_if_set { - return Err(DecodeError::MissingField("if: else.".to_string())); - } - - Ok(ArgsIf { - _if: _if, - }) -} - -pub fn serialize_if_args(args: &ArgsIf) -> Result, EncodeError> { - let mut encoder_context = Context::new(); - encoder_context.description = "Serializing (encoding) module-type: if Args".to_string(); - let mut encoder = WriteEncoder::new(&[], encoder_context); - write_if_args(args, &mut encoder)?; - Ok(encoder.get_buffer()) -} - -pub fn write_if_args(args: &ArgsIf, writer: &mut W) -> Result<(), EncodeError> { - writer.write_map_length(&1)?; - writer.context().push("if", "Else", "writing property"); - writer.write_string("if")?; - Else::write(&args._if, writer)?; - writer.context().pop(); - Ok(()) -} - -pub fn serialize_if_result(result: &Else) -> Result, EncodeError> { - let mut encoder_context = Context::new(); - encoder_context.description = "Serializing (encoding) module-type: if Result".to_string(); - let mut encoder = WriteEncoder::new(&[], encoder_context); - write_if_result(result, &mut encoder)?; - Ok(encoder.get_buffer()) -} - -pub fn write_if_result(result: &Else, writer: &mut W) -> Result<(), EncodeError> { - writer.context().push("if", "Else", "writing result"); - Else::write(&result, writer)?; - writer.context().pop(); - Ok(()) -} - -pub fn deserialize_if_result(result: &[u8]) -> Result { - let mut context = Context::new(); - context.description = "Deserializing module-type: if Result".to_string(); - let mut reader = ReadDecoder::new(result, context); - - reader.context().push("if", "Else", "reading function output"); - let object = Else::read(&mut reader)?; - let res = object; - reader.context().pop(); - Ok(res) -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/module/wrapped.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/module/wrapped.rs index e9316ed244..16da48c5ba 100644 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/module/wrapped.rs +++ b/packages/test-cases/cases/bind/sanity/output/wrap-rs/module/wrapped.rs @@ -1,27 +1,48 @@ -use polywrap_wasm_rs::{ - wrap_load_env +use serde::{Deserialize, Serialize}; +use polywrap_msgpack_serde::{ + from_slice, + to_vec, + wrappers::polywrap_json::JSONString, + wrappers::polywrap_bigint::BigIntWrapper }; - -use crate::{ - ArgsModuleMethod, - deserialize_module_method_args, - serialize_module_method_result, - ArgsObjectMethod, - deserialize_object_method_args, - serialize_object_method_result, - ArgsOptionalEnvMethod, - deserialize_optional_env_method_args, - serialize_optional_env_method_result, - ArgsIf, - deserialize_if_args, - serialize_if_result +use polywrap_wasm_rs::{ + BigInt, + BigNumber, + Map, + JSON, + wrap_load_env }; - use crate::module::{ModuleTrait, Module}; +use crate::CustomEnum; +use crate::AnotherType; +use crate::Else; use crate::Env; +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct ArgsModuleMethod { + pub str: String, + #[serde(rename = "optStr")] + pub opt_str: Option, + pub en: CustomEnum, + #[serde(rename = "optEnum")] + pub opt_enum: Option, + #[serde(rename = "enumArray")] + pub enum_array: Vec, + #[serde(rename = "optEnumArray")] + pub opt_enum_array: Option>>, + pub map: Map, + #[serde(rename = "mapOfArr")] + pub map_of_arr: Map>, + #[serde(rename = "mapOfMap")] + pub map_of_map: Map>, + #[serde(rename = "mapOfObj")] + pub map_of_obj: Map, + #[serde(rename = "mapOfArrOfObj")] + pub map_of_arr_of_obj: Map>, +} + pub fn module_method_wrapped(args: &[u8], env_size: u32) -> Vec { - match deserialize_module_method_args(args) { + match from_slice::(args) { Ok(args) => { let result = Module::module_method(ArgsModuleMethod { str: args.str, @@ -38,7 +59,7 @@ pub fn module_method_wrapped(args: &[u8], env_size: u32) -> Vec { }); match result { Ok(res) => { - serialize_module_method_result(&res).unwrap() + to_vec(&res).unwrap() } Err(e) => { panic!("{}", e.to_string()) @@ -51,6 +72,17 @@ pub fn module_method_wrapped(args: &[u8], env_size: u32) -> Vec { } } +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct ArgsObjectMethod { + pub object: AnotherType, + #[serde(rename = "optObject")] + pub opt_object: Option, + #[serde(rename = "objectArray")] + pub object_array: Vec, + #[serde(rename = "optObjectArray")] + pub opt_object_array: Option>>, +} + pub fn object_method_wrapped(args: &[u8], env_size: u32) -> Vec { if env_size == 0 { panic!("Environment is not set, and it is required by method 'objectMethod'"); @@ -59,7 +91,7 @@ pub fn object_method_wrapped(args: &[u8], env_size: u32) -> Vec { let env_buf = wrap_load_env(env_size); let env = Env::from_buffer(&env_buf).unwrap(); - match deserialize_object_method_args(args) { + match from_slice::(args) { Ok(args) => { let result = Module::object_method(ArgsObjectMethod { object: args.object, @@ -69,7 +101,7 @@ pub fn object_method_wrapped(args: &[u8], env_size: u32) -> Vec { }, env); match result { Ok(res) => { - serialize_object_method_result(&res).unwrap() + to_vec(&res).unwrap() } Err(e) => { panic!("{}", e.to_string()) @@ -82,6 +114,17 @@ pub fn object_method_wrapped(args: &[u8], env_size: u32) -> Vec { } } +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct ArgsOptionalEnvMethod { + pub object: AnotherType, + #[serde(rename = "optObject")] + pub opt_object: Option, + #[serde(rename = "objectArray")] + pub object_array: Vec, + #[serde(rename = "optObjectArray")] + pub opt_object_array: Option>>, +} + pub fn optional_env_method_wrapped(args: &[u8], env_size: u32) -> Vec { let mut env: Option = None; if env_size > 0 { @@ -89,7 +132,7 @@ pub fn optional_env_method_wrapped(args: &[u8], env_size: u32) -> Vec { env = Some(Env::from_buffer(&env_buf).unwrap()); } - match deserialize_optional_env_method_args(args) { + match from_slice::(args) { Ok(args) => { let result = Module::optional_env_method(ArgsOptionalEnvMethod { object: args.object, @@ -99,7 +142,7 @@ pub fn optional_env_method_wrapped(args: &[u8], env_size: u32) -> Vec { }, env); match result { Ok(res) => { - serialize_optional_env_method_result(&res).unwrap() + to_vec(&res).unwrap() } Err(e) => { panic!("{}", e.to_string()) @@ -112,15 +155,21 @@ pub fn optional_env_method_wrapped(args: &[u8], env_size: u32) -> Vec { } } +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct ArgsIf { + #[serde(rename = "if")] + pub _if: Else, +} + pub fn if_wrapped(args: &[u8], env_size: u32) -> Vec { - match deserialize_if_args(args) { + match from_slice::(args) { Ok(args) => { let result = Module::_if(ArgsIf { _if: args._if, }); match result { Ok(res) => { - serialize_if_result(&res).unwrap() + to_vec(&res).unwrap() } Err(e) => { panic!("{}", e.to_string()) diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/test_import/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/test_import/mod.rs index 7cae6addae..e50df13ba6 100644 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/test_import/mod.rs +++ b/packages/test-cases/cases/bind/sanity/output/wrap-rs/test_import/mod.rs @@ -8,4 +8,4 @@ impl TestImport { pub fn get_implementations() -> Vec { wrap_get_implementations(Self::uri) } -} \ No newline at end of file +} From 8716e2fa698510218aceda23a7c9bd4c10e0db3b Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Sun, 16 Jul 2023 14:37:54 -0400 Subject: [PATCH 141/181] chore: remove debug logging --- .../wasm/golang/module/__tests__/e2e/integration.spec.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/templates/wasm/golang/module/__tests__/e2e/integration.spec.ts b/packages/templates/wasm/golang/module/__tests__/e2e/integration.spec.ts index 48be5b64d8..55913c174a 100644 --- a/packages/templates/wasm/golang/module/__tests__/e2e/integration.spec.ts +++ b/packages/templates/wasm/golang/module/__tests__/e2e/integration.spec.ts @@ -24,8 +24,6 @@ describe("Template Wrapper End to End Tests", () => { args: { arg: expected } }); - console.log(result); - expect(result.ok).toBeTruthy(); if (!result.ok) return; expect(result.value.result).toEqual(expected); From 288f47fc2153b8ee1e3900a43b32dda4bea0cc98 Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Mon, 17 Jul 2023 21:21:26 +0800 Subject: [PATCH 142/181] fix: add namespace for imported args --- .../imported/module-type/%type%Serialization-go.mustache | 6 +++--- .../imported/module-type/%type%Wrapped-go.mustache | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache index 24e8033ed4..5a0ded8155 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache @@ -6,7 +6,7 @@ package {{#pkgName}}{{#toSnakeCase}}{{namespace}}{{/toSnakeCase}}{{/pkgName}} {{/arguments}} {{/makeImports}} {{#methods}} -type Args{{#toUpper}}{{name}}{{/toUpper}} struct { +type {{#toUpper}}{{namespace}}{{/toUpper}}_Args{{#toUpper}}{{name}}{{/toUpper}} struct { {{#stuctProps}} {{#arguments}} {{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}} {{#toWasm}}{{toGraphQLType}}{{/toWasm}} `json:"{{name}}"` @@ -14,14 +14,14 @@ type Args{{#toUpper}}{{name}}{{/toUpper}} struct { {{/stuctProps}} } -func Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(value *Args{{#toUpper}}{{name}}{{/toUpper}}) []byte { +func Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(value *{{#toUpper}}{{namespace}}{{/toUpper}}_Args{{#toUpper}}{{name}}{{/toUpper}}) []byte { ctx := msgpack.NewContext("Serializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") encoder := msgpack.NewWriteEncoder(ctx) Write{{#toUpper}}{{name}}{{/toUpper}}Args(encoder, value) return encoder.Buffer() } -func Write{{#toUpper}}{{name}}{{/toUpper}}Args(writer msgpack.Write, value *Args{{#toUpper}}{{name}}{{/toUpper}}) { +func Write{{#toUpper}}{{name}}{{/toUpper}}Args(writer msgpack.Write, value *{{#toUpper}}{{namespace}}{{/toUpper}}_Args{{#toUpper}}{{name}}{{/toUpper}}) { {{#arguments.length}} writer.WriteMapLength({{arguments.length}}) {{/arguments.length}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache index 72c3adf3c3..6096e114ae 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache @@ -8,7 +8,7 @@ import ( {{^isInterface}} {{#methods}} -func {{#toUpper}}{{name}}{{/toUpper}}(args *Args{{#toUpper}}{{name}}{{/toUpper}}) ({{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, error) { +func {{#toUpper}}{{name}}{{/toUpper}}(args *{{#toUpper}}{{namespace}}{{/toUpper}}_Args{{#toUpper}}{{name}}{{/toUpper}}) ({{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, error) { argsBuf := Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(args) var ( err error @@ -28,7 +28,7 @@ func {{#toUpper}}{{name}}{{/toUpper}}(args *Args{{#toUpper}}{{name}}{{/toUpper}} {{/isInterface}} {{#isInterface}} {{#methods}} -func {{#toUpper}}{{name}}{{/toUpper}}(uri string, args *Args{{#toUpper}}{{name}}{{/toUpper}}) ({{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, error) { +func {{#toUpper}}{{name}}{{/toUpper}}(uri string, args *{{#toUpper}}{{namespace}}{{/toUpper}}_Args{{#toUpper}}{{name}}{{/toUpper}}) ({{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, error) { argsBuf := Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(args) var ( err error From c1debbe9d6b030fde8155d2d6c38dbfc0553b915 Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Mon, 17 Jul 2023 23:18:30 +0800 Subject: [PATCH 143/181] fix: issues --- .../module-type/%type%Serialization-go.mustache | 8 ++++---- .../imported/module-type/%type%Wrapped-go.mustache | 10 +++++----- .../wasm/templates/interface-type/%type%-go.mustache | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache index 5a0ded8155..f3487aee8e 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Serialization-go.mustache @@ -14,14 +14,14 @@ type {{#toUpper}}{{namespace}}{{/toUpper}}_Args{{#toUpper}}{{name}}{{/toUpper}} {{/stuctProps}} } -func Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(value *{{#toUpper}}{{namespace}}{{/toUpper}}_Args{{#toUpper}}{{name}}{{/toUpper}}) []byte { +func Serialize{{#toUpper}}{{namespace}}{{/toUpper}}_{{#toUpper}}{{name}}{{/toUpper}}Args(value *{{#toUpper}}{{namespace}}{{/toUpper}}_Args{{#toUpper}}{{name}}{{/toUpper}}) []byte { ctx := msgpack.NewContext("Serializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") encoder := msgpack.NewWriteEncoder(ctx) - Write{{#toUpper}}{{name}}{{/toUpper}}Args(encoder, value) + Write{{#toUpper}}{{namespace}}{{/toUpper}}_{{#toUpper}}{{name}}{{/toUpper}}Args(encoder, value) return encoder.Buffer() } -func Write{{#toUpper}}{{name}}{{/toUpper}}Args(writer msgpack.Write, value *{{#toUpper}}{{namespace}}{{/toUpper}}_Args{{#toUpper}}{{name}}{{/toUpper}}) { +func Write{{#toUpper}}{{namespace}}{{/toUpper}}_{{#toUpper}}{{name}}{{/toUpper}}Args(writer msgpack.Write, value *{{#toUpper}}{{namespace}}{{/toUpper}}_Args{{#toUpper}}{{name}}{{/toUpper}}) { {{#arguments.length}} writer.WriteMapLength({{arguments.length}}) {{/arguments.length}} @@ -54,7 +54,7 @@ func Write{{#toUpper}}{{name}}{{/toUpper}}Args(writer msgpack.Write, value *{{#t {{/arguments}} } -func Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(argsBuf []byte) {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}} { +func Deserialize{{#toUpper}}{{namespace}}{{/toUpper}}_{{#toUpper}}{{name}}{{/toUpper}}Result(argsBuf []byte) {{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}} { ctx := msgpack.NewContext("Deserializing module-type: {{#toUpper}}{{name}}{{/toUpper}}") reader := msgpack.NewReadDecoder(ctx, argsBuf) diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache index 6096e114ae..40da8e7017 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache @@ -8,8 +8,8 @@ import ( {{^isInterface}} {{#methods}} -func {{#toUpper}}{{name}}{{/toUpper}}(args *{{#toUpper}}{{namespace}}{{/toUpper}}_Args{{#toUpper}}{{name}}{{/toUpper}}) ({{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, error) { - argsBuf := Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(args) +func {{#toUpper}}{{namespace}}{{/toUpper}}_{{#toUpper}}{{name}}{{/toUpper}}(args *{{#toUpper}}{{namespace}}{{/toUpper}}_Args{{#toUpper}}{{name}}{{/toUpper}}) ({{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, error) { + argsBuf := Serialize{{#toUpper}}{{namespace}}{{/toUpper}}_{{#toUpper}}{{name}}{{/toUpper}}Args(args) var ( err error raw []byte @@ -17,7 +17,7 @@ func {{#toUpper}}{{name}}{{/toUpper}}(args *{{#toUpper}}{{namespace}}{{/toUpper} ) raw, err = wrap.WrapSubinvoke("{{uri}}", "{{name}}", argsBuf) if err == nil { - data = Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(raw) + data = Deserialize{{#toUpper}}{{namespace}}{{/toUpper}}_{{#toUpper}}{{name}}{{/toUpper}}Result(raw) } return data, err } @@ -29,7 +29,7 @@ func {{#toUpper}}{{name}}{{/toUpper}}(args *{{#toUpper}}{{namespace}}{{/toUpper} {{#isInterface}} {{#methods}} func {{#toUpper}}{{name}}{{/toUpper}}(uri string, args *{{#toUpper}}{{namespace}}{{/toUpper}}_Args{{#toUpper}}{{name}}{{/toUpper}}) ({{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, error) { - argsBuf := Serialize{{#toUpper}}{{name}}{{/toUpper}}Args(args) + argsBuf := Serialize{{#toUpper}}{{namespace}}{{/toUpper}}_{{#toUpper}}{{name}}{{/toUpper}}Args(args) var ( err error raw []byte @@ -37,7 +37,7 @@ func {{#toUpper}}{{name}}{{/toUpper}}(uri string, args *{{#toUpper}}{{namespace} ) raw, err = wrap.WrapSubinvokeImplementation("{{uri}}", uri, "{{name}}", argsBuf) if err == nil { - data = Deserialize{{#toUpper}}{{name}}{{/toUpper}}Result(raw) + data = Deserialize{{#toUpper}}{{namespace}}{{/toUpper}}_{{#toUpper}}{{name}}{{/toUpper}}Result(raw) } return data, err } diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/interface-type/%type%-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/interface-type/%type%-go.mustache index a3fa1c1a68..953c66a21a 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/interface-type/%type%-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/interface-type/%type%-go.mustache @@ -11,7 +11,7 @@ import "github.com/polywrap/go-wrap/wrap" {{#capabilities}} {{#getImplementations}} {{#enabled}} -func {{#toUpper}}{{namespace}}{{/toUpper}}Implementations() []string { +func {{#toUpper}}{{namespace}}{{/toUpper}}_GetImplementations() []string { return wrap.WrapGetImplementations("{{uri}}") } {{/enabled}} From 717b7a925101a71810f46a1401f5e095af09459e Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Mon, 17 Jul 2023 23:50:35 +0800 Subject: [PATCH 144/181] wip: issues --- .../bind/sanity/output/plugin-rs/module.rs | 32 +++++++---- .../bind/sanity/output/plugin-rs/types.rs | 38 +++++++++---- .../test_import__module_serialization.go | 12 ++--- .../output/wrap-go/interfaces/test_import.go | 2 +- .../module_wrapped/module_serialization.go | 1 + yarn.lock | 53 +++++++++++++++---- 6 files changed, 101 insertions(+), 37 deletions(-) diff --git a/packages/test-cases/cases/bind/sanity/output/plugin-rs/module.rs b/packages/test-cases/cases/bind/sanity/output/plugin-rs/module.rs index db0deb7938..451457af49 100644 --- a/packages/test-cases/cases/bind/sanity/output/plugin-rs/module.rs +++ b/packages/test-cases/cases/bind/sanity/output/plugin-rs/module.rs @@ -2,8 +2,20 @@ /// All modifications will be overwritten. use std::sync::Arc; -use polywrap_core::invoke::Invoker; +use polywrap_core::invoker::Invoker; use polywrap_plugin::{error::PluginError, module::PluginModule}; +use polywrap_msgpack::{ + to_vec, + from_slice, + BigInt, + BigNumber, + JSON, + bytes, + wrappers::{ + polywrap_bigint as bigint, + polywrap_json as json + } +}; use serde::{Serialize, Deserialize}; use super::types::*; @@ -19,15 +31,15 @@ pub struct ArgsModuleMethod { pub enum_array: Vec, #[serde(rename = "optEnumArray")] pub opt_enum_array: Option>>, - pub map: Map, - #[serde(rename = "mapOfArr")] - pub map_of_arr: Map>, - #[serde(rename = "mapOfMap")] - pub map_of_map: Map>, - #[serde(rename = "mapOfObj")] - pub map_of_obj: Map, - #[serde(rename = "mapOfArrOfObj")] - pub map_of_arr_of_obj: Map>, + pub BTreeMap: BTreeMap, + #[serde(rename = "BTreeMapOfArr")] + pub BTreeMap_of_arr: BTreeMap>, + #[serde(rename = "BTreeMapOfBTreeMap")] + pub BTreeMap_of_BTreeMap: BTreeMap>, + #[serde(rename = "BTreeMapOfObj")] + pub BTreeMap_of_obj: BTreeMap, + #[serde(rename = "BTreeMapOfArrOfObj")] + pub BTreeMap_of_arr_of_obj: BTreeMap>, } #[derive(Clone, Debug, Deserialize, Serialize)] diff --git a/packages/test-cases/cases/bind/sanity/output/plugin-rs/types.rs b/packages/test-cases/cases/bind/sanity/output/plugin-rs/types.rs index fe3c18556b..bb1f21c251 100644 --- a/packages/test-cases/cases/bind/sanity/output/plugin-rs/types.rs +++ b/packages/test-cases/cases/bind/sanity/output/plugin-rs/types.rs @@ -3,9 +3,21 @@ // NOTE: This is an auto-generated file. // All modifications will be overwritten. -use polywrap_core::{invoke::Invoker, uri::Uri}; -use polywrap_msgpack::{decode, serialize}; -use polywrap_plugin::{error::PluginError, BigInt, BigNumber, Map, JSON}; +use polywrap_core::{invoker::Invoker, uri::Uri}; +use polywrap_plugin::error::PluginError; +use polywrap_msgpack::{ + to_vec, + from_slice, + BigInt, + BigNumber, + JSON, + bytes, + wrappers::{ + polywrap_bigint as bigint, + polywrap_json as json + } +}; +use std::collections::BTreeMap; use serde::{Serialize, Deserialize}; use std::sync::Arc; @@ -17,7 +29,7 @@ pub struct Env { #[serde(rename = "optProp")] pub opt_prop: Option, #[serde(rename = "optMap")] - pub opt_map: Option>>, + pub opt_map: Option>>, } // Env END // @@ -38,18 +50,22 @@ pub struct CustomType { pub i8: i8, pub i16: i16, pub i32: i32, + #[serde(with = "bigint")] pub bigint: BigInt, + #[serde(with = "bigint")] #[serde(rename = "optBigint")] pub opt_bigint: Option, pub bignumber: BigNumber, #[serde(rename = "optBignumber")] pub opt_bignumber: Option, + #[serde(with = "json")] pub json: JSON::Value, + #[serde(with = "json")] #[serde(rename = "optJson")] pub opt_json: Option, - #[serde(with = "serde_bytes")] + #[serde(with = "bytes")] pub bytes: Vec, - #[serde(with = "serde_bytes")] + #[serde(with = "bytes")] #[serde(rename = "optBytes")] pub opt_bytes: Option>, pub boolean: bool, @@ -84,15 +100,15 @@ pub struct CustomType { pub enum_array: Vec, #[serde(rename = "optEnumArray")] pub opt_enum_array: Option>>, - pub map: Map, + pub map: BTreeMap, #[serde(rename = "mapOfArr")] - pub map_of_arr: Map>, + pub map_of_arr: BTreeMap>, #[serde(rename = "mapOfObj")] - pub map_of_obj: Map, + pub map_of_obj: BTreeMap, #[serde(rename = "mapOfArrOfObj")] - pub map_of_arr_of_obj: Map>, + pub map_of_arr_of_obj: BTreeMap>, #[serde(rename = "mapCustomValue")] - pub map_custom_value: Map>, + pub map_custom_value: BTreeMap>, } #[derive(Clone, Debug, Deserialize, Serialize)] pub struct AnotherType { diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/test_import__module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/test_import__module_serialization.go index 461da72dff..e8f3ecbe12 100644 --- a/packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/test_import__module_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/test_import__module_serialization.go @@ -4,7 +4,7 @@ import ( "github.com/polywrap/go-wrap/msgpack" ) -type ArgsImportedMethod struct { +type TestImport_ArgsImportedMethod struct { Str string `json:"str"` OptStr *string `json:"optStr"` U uint32 `json:"u"` @@ -20,14 +20,14 @@ type ArgsImportedMethod struct { OptEnumArray []*TestImport_Enum `json:"optEnumArray"` } -func SerializeImportedMethodArgs(value *ArgsImportedMethod) []byte { +func SerializeImportedMethodArgs(value *TestImport_ArgsImportedMethod) []byte { ctx := msgpack.NewContext("Serializing module-type: ImportedMethod") encoder := msgpack.NewWriteEncoder(ctx) WriteImportedMethodArgs(encoder, value) return encoder.Buffer() } -func WriteImportedMethodArgs(writer msgpack.Write, value *ArgsImportedMethod) { +func WriteImportedMethodArgs(writer msgpack.Write, value *TestImport_ArgsImportedMethod) { writer.WriteMapLength(13) writer.Context().Push("str", "string", "writing property") writer.WriteString("str") @@ -209,18 +209,18 @@ func DeserializeImportedMethodResult(argsBuf []byte) *TestImport_Object { return value } -type ArgsAnotherMethod struct { +type TestImport_ArgsAnotherMethod struct { Arg []string `json:"arg"` } -func SerializeAnotherMethodArgs(value *ArgsAnotherMethod) []byte { +func SerializeAnotherMethodArgs(value *TestImport_ArgsAnotherMethod) []byte { ctx := msgpack.NewContext("Serializing module-type: AnotherMethod") encoder := msgpack.NewWriteEncoder(ctx) WriteAnotherMethodArgs(encoder, value) return encoder.Buffer() } -func WriteAnotherMethodArgs(writer msgpack.Write, value *ArgsAnotherMethod) { +func WriteAnotherMethodArgs(writer msgpack.Write, value *TestImport_ArgsAnotherMethod) { writer.WriteMapLength(1) writer.Context().Push("arg", "[]string", "writing property") writer.WriteString("arg") diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-go/interfaces/test_import.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/interfaces/test_import.go index 7ae06bfb28..a2ce917fff 100644 --- a/packages/test-cases/cases/bind/sanity/output/wrap-go/interfaces/test_import.go +++ b/packages/test-cases/cases/bind/sanity/output/wrap-go/interfaces/test_import.go @@ -2,6 +2,6 @@ package interfaces import "github.com/polywrap/go-wrap/wrap" -func TestImportImplementations() []string { +func TestImport_GetImplementations() []string { return wrap.WrapGetImplementations("testimport.uri.eth") } diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-go/module_wrapped/module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/module_wrapped/module_serialization.go index 346056af85..77627d7244 100644 --- a/packages/test-cases/cases/bind/sanity/output/wrap-go/module_wrapped/module_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wrap-go/module_wrapped/module_serialization.go @@ -1,6 +1,7 @@ package module_wrapped import ( + . "github.com/testorg/testrepo/module/wrap/imported/test_import" . "github.com/testorg/testrepo/module/wrap/types" "github.com/polywrap/go-wrap/msgpack" ) diff --git a/yarn.lock b/yarn.lock index 2415cf732f..23fd596643 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3232,6 +3232,18 @@ array.prototype.reduce@^1.0.5: es-array-method-boxes-properly "^1.0.0" is-string "^1.0.7" +arraybuffer.prototype.slice@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz#9b5ea3868a6eebc30273da577eb888381c0044bb" + integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" + arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -3661,9 +3673,9 @@ camelcase@^6.0.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001503: - version "1.0.30001515" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001515.tgz#418aefeed9d024cd3129bfae0ccc782d4cb8f12b" - integrity sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA== + version "1.0.30001516" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001516.tgz#621b1be7d85a8843ee7d210fd9d87b52e3daab3a" + integrity sha512-Wmec9pCBY8CWbmI4HsjBeQLqDTqV91nFVR83DnZpYyRnPI1wePDsTg0bGLPC5VU/3OIZV1fmxEea1b+tFKe86g== capture-exit@^2.0.0: version "2.0.0" @@ -4438,9 +4450,9 @@ ecc-jsbn@~0.1.1: safer-buffer "^2.1.0" electron-to-chromium@^1.4.431: - version "1.4.460" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.460.tgz#f360a5059c039c4a5fb4dfa99680ad8129dd9f84" - integrity sha512-kKiHnbrHME7z8E6AYaw0ehyxY5+hdaRmeUbjBO22LZMdqTYCO29EvF0T1cQ3pJ1RN5fyMcHl1Lmcsdt9WWJpJQ== + version "1.4.461" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.461.tgz#6b14af66042732bf883ab63a4d82cac8f35eb252" + integrity sha512-1JkvV2sgEGTDXjdsaQCeSwYYuhLRphRpc+g6EHTFELJXEiznLt3/0pZ9JuAOQ5p2rI3YxKTbivtvajirIfhrEQ== elliptic@6.5.4: version "6.5.4" @@ -4514,11 +4526,12 @@ error-ex@^1.2.0, error-ex@^1.3.1: is-arrayish "^0.2.1" es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: - version "1.21.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.3.tgz#8aaa0ffc080e8a6fef6ace72631dc1ec5d47bf94" - integrity sha512-ZU4miiY1j3sGPFLJ34VJXEqhpmL+HGByCinGHv4HC+Fxl2fI2Z4yR6tl0mORnDr6PA8eihWo4LmSWDbvhALckg== + version "1.22.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" + integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== dependencies: array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.1" available-typed-arrays "^1.0.5" call-bind "^1.0.2" es-set-tostringtag "^2.0.1" @@ -4545,10 +4558,13 @@ es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: object-keys "^1.1.1" object.assign "^4.1.4" regexp.prototype.flags "^1.5.0" + safe-array-concat "^1.0.0" safe-regex-test "^1.0.0" string.prototype.trim "^1.2.7" string.prototype.trimend "^1.0.6" string.prototype.trimstart "^1.0.6" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" typed-array-byte-offset "^1.0.0" typed-array-length "^1.0.4" unbox-primitive "^1.0.2" @@ -9732,6 +9748,25 @@ type@^2.7.2: resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + typed-array-byte-offset@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" From 295b02f5faf294263f4e525645ca4d7a20b7fe48 Mon Sep 17 00:00:00 2001 From: krisbitney Date: Mon, 17 Jul 2023 12:51:42 -0500 Subject: [PATCH 145/181] added custom bindgen uri option to codegen command --- packages/cli/lang/en.json | 2 + packages/cli/lang/es.json | 2 + packages/cli/src/commands/codegen.ts | 8 ++- packages/cli/src/lib/codegen/CodeGenerator.ts | 3 ++ packages/cli/src/lib/option-parsers/uri.ts | 17 ++++++ packages/cli/src/lib/project/AppProject.ts | 5 +- packages/cli/src/lib/project/PluginProject.ts | 5 +- .../cli/src/lib/project/PolywrapProject.ts | 3 +- packages/cli/src/lib/project/Project.ts | 1 + packages/schema/bind/src/index.ts | 11 +++- yarn.lock | 53 +++++++++++++++---- 11 files changed, 93 insertions(+), 17 deletions(-) create mode 100644 packages/cli/src/lib/option-parsers/uri.ts diff --git a/packages/cli/lang/en.json b/packages/cli/lang/en.json index 4f1ebb374a..5d2ec6b6ad 100644 --- a/packages/cli/lang/en.json +++ b/packages/cli/lang/en.json @@ -92,7 +92,9 @@ "commands_codegen_options_m": "Path to the Polywrap manifest file (default: {default})", "commands_codegen_options_o": "Output directory for custom generated types (default: 'types/')", "commands_codegen_options_o_path": "path", + "commands_codegen_options_b": "Uri for custom bindgen wrap (must implement wrap-abi-bindgen interface; see https://github.com/polywrap/wrap-abi-bindgen)", "commands_codegen_success": "Types were generated successfully", + "commands_codegen_invalid_uri": "Invalid WRAP URI format: {uri}.", "commands_codegen_project_load_error": "Failed to load project, please make sure {manifestPath} is a valid Project manifest", "commands_codegen_options_publish": "Output path for the built schema and manifest (default: {default})", "commands_create_description": "Create New Projects", diff --git a/packages/cli/lang/es.json b/packages/cli/lang/es.json index 4f1ebb374a..5d2ec6b6ad 100644 --- a/packages/cli/lang/es.json +++ b/packages/cli/lang/es.json @@ -92,7 +92,9 @@ "commands_codegen_options_m": "Path to the Polywrap manifest file (default: {default})", "commands_codegen_options_o": "Output directory for custom generated types (default: 'types/')", "commands_codegen_options_o_path": "path", + "commands_codegen_options_b": "Uri for custom bindgen wrap (must implement wrap-abi-bindgen interface; see https://github.com/polywrap/wrap-abi-bindgen)", "commands_codegen_success": "Types were generated successfully", + "commands_codegen_invalid_uri": "Invalid WRAP URI format: {uri}.", "commands_codegen_project_load_error": "Failed to load project, please make sure {manifestPath} is a valid Project manifest", "commands_codegen_options_publish": "Output path for the built schema and manifest (default: {default})", "commands_create_description": "Create New Projects", diff --git a/packages/cli/src/commands/codegen.ts b/packages/cli/src/commands/codegen.ts index 3968cdbf65..e2d4e739f6 100644 --- a/packages/cli/src/commands/codegen.ts +++ b/packages/cli/src/commands/codegen.ts @@ -18,6 +18,7 @@ import { import { ScriptCodegenerator } from "../lib/codegen/ScriptCodeGenerator"; import { DEFAULT_CODEGEN_DIR } from "../lib/defaults"; import { watchProject } from "../lib/watchProject"; +import { parseUriOption } from "../lib/option-parsers/uri"; import { PolywrapClient } from "@polywrap/client-js"; @@ -27,6 +28,7 @@ const defaultManifestStr = defaultPolywrapManifestFiles.join(" | "); export interface CodegenCommandOptions extends BaseCommandOptions { manifestFile: string; codegenDir: string | false; + bindgen: string | false; script: string | false; clientConfig: string | false; wrapperEnvs: string | false; @@ -51,6 +53,7 @@ export const codegen: Command = { default: DEFAULT_CODEGEN_DIR, })}` ) + .option(`-b, --bindgen `, `${intlMsg.commands_codegen_options_b()}`) .option( `-s, --script <${pathStr}>`, `${intlMsg.commands_codegen_options_s()}` @@ -77,6 +80,7 @@ export const codegen: Command = { defaultProjectManifestFiles ), codegenDir: parseDirOptionNoDefault(options.codegenDir), + bindgen: options.bindgen || false, script: parseCodegenScriptOption(options.script), clientConfig: options.clientConfig || false, wrapperEnvs: options.wrapperEnvs || false, @@ -95,6 +99,7 @@ async function run(options: Required) { clientConfig, wrapperEnvs, codegenDir, + bindgen, script, verbose, quiet, @@ -102,7 +107,7 @@ async function run(options: Required) { watch, } = options; const logger = createLogger({ verbose, quiet, logFile }); - + const bindgenUri = parseUriOption(bindgen); const envs = await parseWrapperEnvsOption(wrapperEnvs); const configBuilder = await parseClientConfigOption(clientConfig); @@ -142,6 +147,7 @@ async function run(options: Required) { codegenDirAbs: codegenDir || undefined, schemaComposer, project, + bindgenUri, }); const execute = async (): Promise => { diff --git a/packages/cli/src/lib/codegen/CodeGenerator.ts b/packages/cli/src/lib/codegen/CodeGenerator.ts index 46a16e8bf8..1aee32cde4 100644 --- a/packages/cli/src/lib/codegen/CodeGenerator.ts +++ b/packages/cli/src/lib/codegen/CodeGenerator.ts @@ -21,11 +21,13 @@ import { CodegenOverrides, tryGetCodegenOverrides } from "./CodegenOverrides"; import path from "path"; import { BindLanguage } from "@polywrap/schema-bind"; import { writeDirectorySync } from "@polywrap/os-js"; +import { Uri } from "@polywrap/core-js"; export interface CodeGeneratorConfig { project: Project; schemaComposer: SchemaComposer; codegenDirAbs?: string; + bindgenUri?: Uri; } export class CodeGenerator { @@ -89,6 +91,7 @@ export class CodeGenerator { const binding = await this._config.project.generateSchemaBindings( abi, codegenDir, + this._config.bindgenUri?.toString(), bindConfig ); diff --git a/packages/cli/src/lib/option-parsers/uri.ts b/packages/cli/src/lib/option-parsers/uri.ts new file mode 100644 index 0000000000..2986d34d4a --- /dev/null +++ b/packages/cli/src/lib/option-parsers/uri.ts @@ -0,0 +1,17 @@ +import { intlMsg } from "../intl"; + +import { Uri } from "@polywrap/core-js"; + +export function parseUriOption( + uri: string | undefined | false +): Uri | undefined { + if (uri) { + try { + return Uri.from(uri); + } catch { + console.error(intlMsg.commands_codegen_invalid_uri({ uri })); + process.exit(1); + } + } + return undefined; +} diff --git a/packages/cli/src/lib/project/AppProject.ts b/packages/cli/src/lib/project/AppProject.ts index 371786057a..1e6dd30efe 100644 --- a/packages/cli/src/lib/project/AppProject.ts +++ b/packages/cli/src/lib/project/AppProject.ts @@ -113,7 +113,8 @@ export class AppProject extends Project { public async generateSchemaBindings( abi: WrapAbi, - generationSubPath?: string + generationSubPath?: string, + bindgenUri?: string ): Promise { const bindLanguage = appManifestLanguageToBindLanguage( await this.getManifestLanguage() @@ -128,7 +129,7 @@ export class AppProject extends Project { }, outputDirAbs: await this.getGenerationDirectory(generationSubPath), }; - return bindSchema(options); + return bindSchema(options, bindgenUri); } private _getGenerationDirectory( diff --git a/packages/cli/src/lib/project/PluginProject.ts b/packages/cli/src/lib/project/PluginProject.ts index 9da9a5d046..583f5d9046 100644 --- a/packages/cli/src/lib/project/PluginProject.ts +++ b/packages/cli/src/lib/project/PluginProject.ts @@ -117,7 +117,8 @@ export class PluginProject extends Project { public async generateSchemaBindings( abi: WrapAbi, - generationSubPath?: string + generationSubPath?: string, + bindgenUri?: string ): Promise { const moduleDirectory = await this.getGenerationDirectory( generationSubPath @@ -141,7 +142,7 @@ export class PluginProject extends Project { outputDirAbs: moduleDirectory, }; - return bindSchema(options); + return bindSchema(options, bindgenUri); } private _getGenerationDirectory( diff --git a/packages/cli/src/lib/project/PolywrapProject.ts b/packages/cli/src/lib/project/PolywrapProject.ts index bd0f3ef337..a15688aa8e 100644 --- a/packages/cli/src/lib/project/PolywrapProject.ts +++ b/packages/cli/src/lib/project/PolywrapProject.ts @@ -153,6 +153,7 @@ export class PolywrapProject extends Project { public async generateSchemaBindings( abi: WrapAbi, generationSubPath?: string, + bindgenUri?: string, bindConfig?: Record ): Promise { const codegenDirectory = await this.getGenerationDirectory( @@ -178,7 +179,7 @@ export class PolywrapProject extends Project { config: bindConfig, }; - return bindSchema(options); + return bindSchema(options, bindgenUri); } /// Polywrap Build Manifest (polywrap.build.yaml) diff --git a/packages/cli/src/lib/project/Project.ts b/packages/cli/src/lib/project/Project.ts index 03cc4b7b24..8fc8903153 100644 --- a/packages/cli/src/lib/project/Project.ts +++ b/packages/cli/src/lib/project/Project.ts @@ -73,6 +73,7 @@ export abstract class Project { public abstract generateSchemaBindings( abi: Abi, generationSubPath?: string, + bindgenUri?: string, bindConfig?: Record ): Promise; diff --git a/packages/schema/bind/src/index.ts b/packages/schema/bind/src/index.ts index 422198454a..8826be6c4c 100644 --- a/packages/schema/bind/src/index.ts +++ b/packages/schema/bind/src/index.ts @@ -1,5 +1,6 @@ import { BindOptions, BindOutput } from "./types"; import { getGenerateBindingFn } from "./bindings"; +import * as WrapBindgen from "./bindings/wrap-bindgen"; import Mustache from "mustache"; @@ -9,6 +10,12 @@ Mustache.escape = (value) => value; export * from "./types"; export * from "./bindings"; -export async function bindSchema(options: BindOptions): Promise { - return await getGenerateBindingFn(options.bindLanguage)(options); +export async function bindSchema( + options: BindOptions, + uri?: string +): Promise { + if (uri) { + return WrapBindgen.getGenerateBindingFn(uri)(options); + } + return getGenerateBindingFn(options.bindLanguage)(options); } diff --git a/yarn.lock b/yarn.lock index 2415cf732f..23fd596643 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3232,6 +3232,18 @@ array.prototype.reduce@^1.0.5: es-array-method-boxes-properly "^1.0.0" is-string "^1.0.7" +arraybuffer.prototype.slice@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz#9b5ea3868a6eebc30273da577eb888381c0044bb" + integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" + arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -3661,9 +3673,9 @@ camelcase@^6.0.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001503: - version "1.0.30001515" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001515.tgz#418aefeed9d024cd3129bfae0ccc782d4cb8f12b" - integrity sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA== + version "1.0.30001516" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001516.tgz#621b1be7d85a8843ee7d210fd9d87b52e3daab3a" + integrity sha512-Wmec9pCBY8CWbmI4HsjBeQLqDTqV91nFVR83DnZpYyRnPI1wePDsTg0bGLPC5VU/3OIZV1fmxEea1b+tFKe86g== capture-exit@^2.0.0: version "2.0.0" @@ -4438,9 +4450,9 @@ ecc-jsbn@~0.1.1: safer-buffer "^2.1.0" electron-to-chromium@^1.4.431: - version "1.4.460" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.460.tgz#f360a5059c039c4a5fb4dfa99680ad8129dd9f84" - integrity sha512-kKiHnbrHME7z8E6AYaw0ehyxY5+hdaRmeUbjBO22LZMdqTYCO29EvF0T1cQ3pJ1RN5fyMcHl1Lmcsdt9WWJpJQ== + version "1.4.461" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.461.tgz#6b14af66042732bf883ab63a4d82cac8f35eb252" + integrity sha512-1JkvV2sgEGTDXjdsaQCeSwYYuhLRphRpc+g6EHTFELJXEiznLt3/0pZ9JuAOQ5p2rI3YxKTbivtvajirIfhrEQ== elliptic@6.5.4: version "6.5.4" @@ -4514,11 +4526,12 @@ error-ex@^1.2.0, error-ex@^1.3.1: is-arrayish "^0.2.1" es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: - version "1.21.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.3.tgz#8aaa0ffc080e8a6fef6ace72631dc1ec5d47bf94" - integrity sha512-ZU4miiY1j3sGPFLJ34VJXEqhpmL+HGByCinGHv4HC+Fxl2fI2Z4yR6tl0mORnDr6PA8eihWo4LmSWDbvhALckg== + version "1.22.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" + integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== dependencies: array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.1" available-typed-arrays "^1.0.5" call-bind "^1.0.2" es-set-tostringtag "^2.0.1" @@ -4545,10 +4558,13 @@ es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: object-keys "^1.1.1" object.assign "^4.1.4" regexp.prototype.flags "^1.5.0" + safe-array-concat "^1.0.0" safe-regex-test "^1.0.0" string.prototype.trim "^1.2.7" string.prototype.trimend "^1.0.6" string.prototype.trimstart "^1.0.6" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" typed-array-byte-offset "^1.0.0" typed-array-length "^1.0.4" unbox-primitive "^1.0.2" @@ -9732,6 +9748,25 @@ type@^2.7.2: resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + typed-array-byte-offset@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" From a294dff2b3d9ca5e3a1af6213f2a7384c828d400 Mon Sep 17 00:00:00 2001 From: krisbitney Date: Mon, 17 Jul 2023 12:54:50 -0500 Subject: [PATCH 146/181] added custom bindgen uri option to build command --- packages/cli/src/commands/build.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/cli/src/commands/build.ts b/packages/cli/src/commands/build.ts index c13365018e..5b457c3766 100644 --- a/packages/cli/src/commands/build.ts +++ b/packages/cli/src/commands/build.ts @@ -28,6 +28,7 @@ import { } from "../lib/build-strategies"; import { DEFAULT_CODEGEN_DIR } from "../lib/defaults"; import { watchProject } from "../lib/watchProject"; +import { parseUriOption } from "../lib/option-parsers/uri"; import { PolywrapClient } from "@polywrap/client-js"; import { PolywrapManifest } from "@polywrap/polywrap-manifest-types-js"; @@ -46,6 +47,7 @@ const supportedProjectTypes = [ export interface BuildCommandOptions extends BaseCommandOptions { manifestFile: string; outputDir: string; + bindgen: string | false; clientConfig: string | false; wrapperEnvs: string | false; noCodegen: boolean; @@ -72,6 +74,7 @@ export const build: Command = { default: defaultOutputDir, })}` ) + .option(`-b, --bindgen `, `${intlMsg.commands_codegen_options_b()}`) .option( `-c, --client-config <${intlMsg.commands_common_options_configPath()}>`, `${intlMsg.commands_common_options_config()}` @@ -112,6 +115,7 @@ export const build: Command = { clientConfig: options.clientConfig || false, wrapperEnvs: options.wrapperEnvs || false, outputDir: parseDirOption(options.outputDir, defaultOutputDir), + bindgen: options.bindgen || false, noCodegen: !options.codegen || false, codegenDir: parseDirOptionNoDefault(options.codegenDir), strategy: options.strategy || defaultStrategy, @@ -167,6 +171,7 @@ async function run(options: Required) { clientConfig, wrapperEnvs, outputDir, + bindgen, strategy, noCodegen, codegenDir, @@ -176,7 +181,7 @@ async function run(options: Required) { } = options; const logger = createLogger({ verbose, quiet, logFile }); - + const bindgenUri = parseUriOption(bindgen); const envs = await parseWrapperEnvsOption(wrapperEnvs); const configBuilder = await parseClientConfigOption(clientConfig); @@ -243,6 +248,7 @@ async function run(options: Required) { project, schemaComposer, codegenDirAbs: codegenDir || undefined, + bindgenUri, }); const codegenSuccess = await codeGenerator.generate(); From 0977ff5e1013a721c658046faf5f10fb02250309 Mon Sep 17 00:00:00 2001 From: krisbitney Date: Mon, 17 Jul 2023 13:29:30 -0500 Subject: [PATCH 147/181] added custom bindgen uri test --- .../cli/src/__tests__/e2e/p2/codegen.spec.ts | 19 +++++++++++++++++++ yarn.lock | 6 +++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/packages/cli/src/__tests__/e2e/p2/codegen.spec.ts b/packages/cli/src/__tests__/e2e/p2/codegen.spec.ts index 060b9611d4..0fdafdfb2d 100644 --- a/packages/cli/src/__tests__/e2e/p2/codegen.spec.ts +++ b/packages/cli/src/__tests__/e2e/p2/codegen.spec.ts @@ -188,4 +188,23 @@ describe("e2e tests for codegen command", () => { rimraf.sync(`${getTestCaseDir(1)}/types`); }); + + it("Should successfully generate types with custom bindgen wrap", async () => { + rimraf.sync(`${getTestCaseDir(0)}/types`); + + const { exitCode: code, stdout: output, stderr: error } = await Commands.codegen({ + bindgen: "https://github.com/polywrap/wrap-abi-bindgen/tree/wrap-0.1/implementations/wrap-rust" + }, { + cwd: getTestCaseDir(0), + cli: polywrapCli, + }); + + expect(code).toEqual(0); + expect(error).toBe(""); + expect(clearStyle(output)).toContain( + `šŸ”„ Types were generated successfully šŸ”„` + ); + + rimraf.sync(`${getTestCaseDir(0)}/types`); + }); }); diff --git a/yarn.lock b/yarn.lock index 23fd596643..039c66d460 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4450,9 +4450,9 @@ ecc-jsbn@~0.1.1: safer-buffer "^2.1.0" electron-to-chromium@^1.4.431: - version "1.4.461" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.461.tgz#6b14af66042732bf883ab63a4d82cac8f35eb252" - integrity sha512-1JkvV2sgEGTDXjdsaQCeSwYYuhLRphRpc+g6EHTFELJXEiznLt3/0pZ9JuAOQ5p2rI3YxKTbivtvajirIfhrEQ== + version "1.4.462" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.462.tgz#4faf5072bb5f55269d35ca9dc7475e7bf91b1ac3" + integrity sha512-ux2LqN9JKRBDKXMT+78jtiBLPiXf+rLtYlsrOg5Qn7uv6Cbg7+9JyIalE3wcqkOdB2wPCUYNWAuL7suKRMHe9w== elliptic@6.5.4: version "6.5.4" From 8efe03b6b3e6de4e3c5506916c5d35c2183405dd Mon Sep 17 00:00:00 2001 From: krisbitney Date: Mon, 17 Jul 2023 13:36:55 -0500 Subject: [PATCH 148/181] updated codegen help test --- packages/cli/src/__tests__/e2e/p2/codegen.spec.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/cli/src/__tests__/e2e/p2/codegen.spec.ts b/packages/cli/src/__tests__/e2e/p2/codegen.spec.ts index 0fdafdfb2d..ba388daa40 100644 --- a/packages/cli/src/__tests__/e2e/p2/codegen.spec.ts +++ b/packages/cli/src/__tests__/e2e/p2/codegen.spec.ts @@ -16,6 +16,9 @@ Options: (default: polywrap.yaml | polywrap.yml) -g, --codegen-dir Output directory for the generated code (default: ./src/wrap) + -b, --bindgen Uri for custom bindgen wrap (must + implement wrap-abi-bindgen interface; see + https://github.com/polywrap/wrap-abi-bindgen) -s, --script Path to a custom generation script (JavaScript | TypeScript) -c, --client-config Add custom configuration to the From 794cdabbe09075a950aeaca90c61750383ffe7b4 Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Tue, 18 Jul 2023 18:52:49 +0800 Subject: [PATCH 149/181] wip: fixes --- .../addNamespaceToImportedMethods.ts | 20 ++++++++++++++ .../src/bindings/golang/transforms/index.ts | 1 + .../module-type/%type%Wrapped-go.mustache | 2 +- .../bind/sanity/output/plugin-rs/module.rs | 21 ++++++++------- .../bind/sanity/output/plugin-rs/types.rs | 14 +++++----- .../test_import__module_serialization.go | 26 +++++++++---------- .../test_import__module_wrapped.go | 18 ++++++------- 7 files changed, 62 insertions(+), 40 deletions(-) create mode 100644 packages/schema/bind/src/bindings/golang/transforms/addNamespaceToImportedMethods.ts diff --git a/packages/schema/bind/src/bindings/golang/transforms/addNamespaceToImportedMethods.ts b/packages/schema/bind/src/bindings/golang/transforms/addNamespaceToImportedMethods.ts new file mode 100644 index 0000000000..f4e0effe9f --- /dev/null +++ b/packages/schema/bind/src/bindings/golang/transforms/addNamespaceToImportedMethods.ts @@ -0,0 +1,20 @@ +/* eslint-disable @typescript-eslint/naming-convention */ +import { ImportedModuleDefinition } from "@polywrap/wrap-manifest-types-js"; +import { AbiTransforms } from "@polywrap/schema-parse"; + +export const addNamespaceToImportedMethods: AbiTransforms = { + enter: { + ImportedModuleDefinition: ( + def: ImportedModuleDefinition + ): ImportedModuleDefinition => { + const methods = def.methods?.map((method) => ({ + ...method, + namespace: def.namespace, + })); + return { + ...def, + methods, + }; + }, + }, +}; diff --git a/packages/schema/bind/src/bindings/golang/transforms/index.ts b/packages/schema/bind/src/bindings/golang/transforms/index.ts index c1d98bed8c..e2ff48a13d 100644 --- a/packages/schema/bind/src/bindings/golang/transforms/index.ts +++ b/packages/schema/bind/src/bindings/golang/transforms/index.ts @@ -1,2 +1,3 @@ export * from "./moduleNeedsTypes"; export * from "./moduleNeedsImportedTypes"; +export * from "./addNamespaceToImportedMethods"; diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache index 40da8e7017..86c2153a7f 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/module-type/%type%Wrapped-go.mustache @@ -28,7 +28,7 @@ func {{#toUpper}}{{namespace}}{{/toUpper}}_{{#toUpper}}{{name}}{{/toUpper}}(args {{/isInterface}} {{#isInterface}} {{#methods}} -func {{#toUpper}}{{name}}{{/toUpper}}(uri string, args *{{#toUpper}}{{namespace}}{{/toUpper}}_Args{{#toUpper}}{{name}}{{/toUpper}}) ({{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, error) { +func {{#toUpper}}{{namespace}}{{/toUpper}}_{{#toUpper}}{{name}}{{/toUpper}}(uri string, args *{{#toUpper}}{{namespace}}{{/toUpper}}_Args{{#toUpper}}{{name}}{{/toUpper}}) ({{#return}}{{#toWasm}}{{toGraphQLType}}{{/toWasm}}{{/return}}, error) { argsBuf := Serialize{{#toUpper}}{{namespace}}{{/toUpper}}_{{#toUpper}}{{name}}{{/toUpper}}Args(args) var ( err error diff --git a/packages/test-cases/cases/bind/sanity/output/plugin-rs/module.rs b/packages/test-cases/cases/bind/sanity/output/plugin-rs/module.rs index 451457af49..fc34f4f43a 100644 --- a/packages/test-cases/cases/bind/sanity/output/plugin-rs/module.rs +++ b/packages/test-cases/cases/bind/sanity/output/plugin-rs/module.rs @@ -4,7 +4,7 @@ use std::sync::Arc; use polywrap_core::invoker::Invoker; use polywrap_plugin::{error::PluginError, module::PluginModule}; -use polywrap_msgpack::{ +use polywrap_msgpack_serde::{ to_vec, from_slice, BigInt, @@ -16,6 +16,7 @@ use polywrap_msgpack::{ polywrap_json as json } }; +use std::collections::BTreeMap; use serde::{Serialize, Deserialize}; use super::types::*; @@ -31,15 +32,15 @@ pub struct ArgsModuleMethod { pub enum_array: Vec, #[serde(rename = "optEnumArray")] pub opt_enum_array: Option>>, - pub BTreeMap: BTreeMap, - #[serde(rename = "BTreeMapOfArr")] - pub BTreeMap_of_arr: BTreeMap>, - #[serde(rename = "BTreeMapOfBTreeMap")] - pub BTreeMap_of_BTreeMap: BTreeMap>, - #[serde(rename = "BTreeMapOfObj")] - pub BTreeMap_of_obj: BTreeMap, - #[serde(rename = "BTreeMapOfArrOfObj")] - pub BTreeMap_of_arr_of_obj: BTreeMap>, + pub map: BTreeMap, + #[serde(rename = "mapOfArr")] + pub map_of_arr: BTreeMap>, + #[serde(rename = "mapOfMap")] + pub map_of_map: BTreeMap>, + #[serde(rename = "mapOfObj")] + pub map_of_obj: BTreeMap, + #[serde(rename = "mapOfArrOfObj")] + pub map_of_arr_of_obj: BTreeMap>, } #[derive(Clone, Debug, Deserialize, Serialize)] diff --git a/packages/test-cases/cases/bind/sanity/output/plugin-rs/types.rs b/packages/test-cases/cases/bind/sanity/output/plugin-rs/types.rs index bb1f21c251..a673af6952 100644 --- a/packages/test-cases/cases/bind/sanity/output/plugin-rs/types.rs +++ b/packages/test-cases/cases/bind/sanity/output/plugin-rs/types.rs @@ -5,7 +5,7 @@ // All modifications will be overwritten. use polywrap_core::{invoker::Invoker, uri::Uri}; use polywrap_plugin::error::PluginError; -use polywrap_msgpack::{ +use polywrap_msgpack_serde::{ to_vec, from_slice, BigInt, @@ -244,7 +244,7 @@ impl<'a> TestImportModule<'a> { pub fn imported_method(&self, args: &TestImportModuleArgsImportedMethod) -> Result, PluginError> { let uri = self.uri; - let serialized_args = serialize(args.clone()).unwrap(); + let serialized_args = to_vec(args.clone()).unwrap(); let result = invoker.invoke_raw( uri, "importedMethod", @@ -259,12 +259,12 @@ impl<'a> TestImportModule<'a> { exception: e.to_string(), })?; - Ok(Some(decode(result.as_slice())?)) + Ok(Some(from_slice(result.as_slice())?)) } pub fn another_method(&self, args: &TestImportModuleArgsAnotherMethod) -> Result { let uri = self.uri; - let serialized_args = serialize(args.clone()).unwrap(); + let serialized_args = to_vec(args.clone()).unwrap(); let result = invoker.invoke_raw( uri, "anotherMethod", @@ -279,12 +279,12 @@ impl<'a> TestImportModule<'a> { exception: e.to_string(), })?; - Ok(decode(result.as_slice())?) + Ok(from_slice(result.as_slice())?) } pub fn returns_array_of_enums(&self, args: &TestImportModuleArgsReturnsArrayOfEnums) -> Result>, PluginError> { let uri = self.uri; - let serialized_args = serialize(args.clone()).unwrap(); + let serialized_args = to_vec(args.clone()).unwrap(); let result = invoker.invoke_raw( uri, "returnsArrayOfEnums", @@ -299,7 +299,7 @@ impl<'a> TestImportModule<'a> { exception: e.to_string(), })?; - Ok(decode(result.as_slice())?) + Ok(from_slice(result.as_slice())?) } } // Imported Modules END // diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/test_import__module_serialization.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/test_import__module_serialization.go index e8f3ecbe12..661c0fc8d0 100644 --- a/packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/test_import__module_serialization.go +++ b/packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/test_import__module_serialization.go @@ -20,14 +20,14 @@ type TestImport_ArgsImportedMethod struct { OptEnumArray []*TestImport_Enum `json:"optEnumArray"` } -func SerializeImportedMethodArgs(value *TestImport_ArgsImportedMethod) []byte { +func SerializeTestImport_ImportedMethodArgs(value *TestImport_ArgsImportedMethod) []byte { ctx := msgpack.NewContext("Serializing module-type: ImportedMethod") encoder := msgpack.NewWriteEncoder(ctx) - WriteImportedMethodArgs(encoder, value) + WriteTestImport_ImportedMethodArgs(encoder, value) return encoder.Buffer() } -func WriteImportedMethodArgs(writer msgpack.Write, value *TestImport_ArgsImportedMethod) { +func WriteTestImport_ImportedMethodArgs(writer msgpack.Write, value *TestImport_ArgsImportedMethod) { writer.WriteMapLength(13) writer.Context().Push("str", "string", "writing property") writer.WriteString("str") @@ -196,7 +196,7 @@ func WriteImportedMethodArgs(writer msgpack.Write, value *TestImport_ArgsImporte writer.Context().Pop() } -func DeserializeImportedMethodResult(argsBuf []byte) *TestImport_Object { +func DeserializeTestImport_ImportedMethodResult(argsBuf []byte) *TestImport_Object { ctx := msgpack.NewContext("Deserializing module-type: ImportedMethod") reader := msgpack.NewReadDecoder(ctx, argsBuf) @@ -213,14 +213,14 @@ type TestImport_ArgsAnotherMethod struct { Arg []string `json:"arg"` } -func SerializeAnotherMethodArgs(value *TestImport_ArgsAnotherMethod) []byte { +func SerializeTestImport_AnotherMethodArgs(value *TestImport_ArgsAnotherMethod) []byte { ctx := msgpack.NewContext("Serializing module-type: AnotherMethod") encoder := msgpack.NewWriteEncoder(ctx) - WriteAnotherMethodArgs(encoder, value) + WriteTestImport_AnotherMethodArgs(encoder, value) return encoder.Buffer() } -func WriteAnotherMethodArgs(writer msgpack.Write, value *TestImport_ArgsAnotherMethod) { +func WriteTestImport_AnotherMethodArgs(writer msgpack.Write, value *TestImport_ArgsAnotherMethod) { writer.WriteMapLength(1) writer.Context().Push("arg", "[]string", "writing property") writer.WriteString("arg") @@ -240,7 +240,7 @@ func WriteAnotherMethodArgs(writer msgpack.Write, value *TestImport_ArgsAnotherM writer.Context().Pop() } -func DeserializeAnotherMethodResult(argsBuf []byte) int32 { +func DeserializeTestImport_AnotherMethodResult(argsBuf []byte) int32 { ctx := msgpack.NewContext("Deserializing module-type: AnotherMethod") reader := msgpack.NewReadDecoder(ctx, argsBuf) @@ -251,18 +251,18 @@ func DeserializeAnotherMethodResult(argsBuf []byte) int32 { return value } -type ArgsReturnsArrayOfEnums struct { +type TestImport_ArgsReturnsArrayOfEnums struct { Arg string `json:"arg"` } -func SerializeReturnsArrayOfEnumsArgs(value *ArgsReturnsArrayOfEnums) []byte { +func SerializeTestImport_ReturnsArrayOfEnumsArgs(value *TestImport_ArgsReturnsArrayOfEnums) []byte { ctx := msgpack.NewContext("Serializing module-type: ReturnsArrayOfEnums") encoder := msgpack.NewWriteEncoder(ctx) - WriteReturnsArrayOfEnumsArgs(encoder, value) + WriteTestImport_ReturnsArrayOfEnumsArgs(encoder, value) return encoder.Buffer() } -func WriteReturnsArrayOfEnumsArgs(writer msgpack.Write, value *ArgsReturnsArrayOfEnums) { +func WriteTestImport_ReturnsArrayOfEnumsArgs(writer msgpack.Write, value *TestImport_ArgsReturnsArrayOfEnums) { writer.WriteMapLength(1) writer.Context().Push("arg", "string", "writing property") writer.WriteString("arg") @@ -273,7 +273,7 @@ func WriteReturnsArrayOfEnumsArgs(writer msgpack.Write, value *ArgsReturnsArrayO writer.Context().Pop() } -func DeserializeReturnsArrayOfEnumsResult(argsBuf []byte) []*TestImport_Enum_Return { +func DeserializeTestImport_ReturnsArrayOfEnumsResult(argsBuf []byte) []*TestImport_Enum_Return { ctx := msgpack.NewContext("Deserializing module-type: ReturnsArrayOfEnums") reader := msgpack.NewReadDecoder(ctx, argsBuf) diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/test_import__module_wrapped.go b/packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/test_import__module_wrapped.go index 54e30e516a..2b97c088d7 100644 --- a/packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/test_import__module_wrapped.go +++ b/packages/test-cases/cases/bind/sanity/output/wrap-go/imported/test_import/test_import__module_wrapped.go @@ -4,8 +4,8 @@ import ( "github.com/polywrap/go-wrap/wrap" ) -func ImportedMethod(uri string, args *ArgsImportedMethod) (*TestImport_Object, error) { - argsBuf := SerializeImportedMethodArgs(args) +func TestImport_ImportedMethod(uri string, args *TestImport_ArgsImportedMethod) (*TestImport_Object, error) { + argsBuf := SerializeTestImport_ImportedMethodArgs(args) var ( err error raw []byte @@ -13,13 +13,13 @@ func ImportedMethod(uri string, args *ArgsImportedMethod) (*TestImport_Object, e ) raw, err = wrap.WrapSubinvokeImplementation("testimport.uri.eth", uri, "importedMethod", argsBuf) if err == nil { - data = DeserializeImportedMethodResult(raw) + data = DeserializeTestImport_ImportedMethodResult(raw) } return data, err } -func AnotherMethod(uri string, args *ArgsAnotherMethod) (int32, error) { - argsBuf := SerializeAnotherMethodArgs(args) +func TestImport_AnotherMethod(uri string, args *TestImport_ArgsAnotherMethod) (int32, error) { + argsBuf := SerializeTestImport_AnotherMethodArgs(args) var ( err error raw []byte @@ -27,13 +27,13 @@ func AnotherMethod(uri string, args *ArgsAnotherMethod) (int32, error) { ) raw, err = wrap.WrapSubinvokeImplementation("testimport.uri.eth", uri, "anotherMethod", argsBuf) if err == nil { - data = DeserializeAnotherMethodResult(raw) + data = DeserializeTestImport_AnotherMethodResult(raw) } return data, err } -func ReturnsArrayOfEnums(uri string, args *ArgsReturnsArrayOfEnums) ([]*TestImport_Enum_Return, error) { - argsBuf := SerializeReturnsArrayOfEnumsArgs(args) +func TestImport_ReturnsArrayOfEnums(uri string, args *TestImport_ArgsReturnsArrayOfEnums) ([]*TestImport_Enum_Return, error) { + argsBuf := SerializeTestImport_ReturnsArrayOfEnumsArgs(args) var ( err error raw []byte @@ -41,7 +41,7 @@ func ReturnsArrayOfEnums(uri string, args *ArgsReturnsArrayOfEnums) ([]*TestImpo ) raw, err = wrap.WrapSubinvokeImplementation("testimport.uri.eth", uri, "returnsArrayOfEnums", argsBuf) if err == nil { - data = DeserializeReturnsArrayOfEnumsResult(raw) + data = DeserializeTestImport_ReturnsArrayOfEnumsResult(raw) } return data, err } From 9b3e17047cbbdbd5d1f13fda11c492f0f3f046d2 Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Tue, 18 Jul 2023 18:53:27 +0800 Subject: [PATCH 150/181] remove unnecessary code --- .../addNamespaceToImportedMethods.ts | 20 ------------------- .../src/bindings/golang/transforms/index.ts | 1 - 2 files changed, 21 deletions(-) delete mode 100644 packages/schema/bind/src/bindings/golang/transforms/addNamespaceToImportedMethods.ts diff --git a/packages/schema/bind/src/bindings/golang/transforms/addNamespaceToImportedMethods.ts b/packages/schema/bind/src/bindings/golang/transforms/addNamespaceToImportedMethods.ts deleted file mode 100644 index f4e0effe9f..0000000000 --- a/packages/schema/bind/src/bindings/golang/transforms/addNamespaceToImportedMethods.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -import { ImportedModuleDefinition } from "@polywrap/wrap-manifest-types-js"; -import { AbiTransforms } from "@polywrap/schema-parse"; - -export const addNamespaceToImportedMethods: AbiTransforms = { - enter: { - ImportedModuleDefinition: ( - def: ImportedModuleDefinition - ): ImportedModuleDefinition => { - const methods = def.methods?.map((method) => ({ - ...method, - namespace: def.namespace, - })); - return { - ...def, - methods, - }; - }, - }, -}; diff --git a/packages/schema/bind/src/bindings/golang/transforms/index.ts b/packages/schema/bind/src/bindings/golang/transforms/index.ts index e2ff48a13d..c1d98bed8c 100644 --- a/packages/schema/bind/src/bindings/golang/transforms/index.ts +++ b/packages/schema/bind/src/bindings/golang/transforms/index.ts @@ -1,3 +1,2 @@ export * from "./moduleNeedsTypes"; export * from "./moduleNeedsImportedTypes"; -export * from "./addNamespaceToImportedMethods"; From 3e300ee8ab3c45d9c8e8fe5584bee16a353963bf Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Tue, 18 Jul 2023 19:07:33 +0800 Subject: [PATCH 151/181] fix: add linked golang manifest for templates --- packages/templates/polywrap.wasm-golang-linked.yaml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 packages/templates/polywrap.wasm-golang-linked.yaml diff --git a/packages/templates/polywrap.wasm-golang-linked.yaml b/packages/templates/polywrap.wasm-golang-linked.yaml new file mode 100644 index 0000000000..e5f597dbb2 --- /dev/null +++ b/packages/templates/polywrap.wasm-golang-linked.yaml @@ -0,0 +1,7 @@ +format: 0.3.0 +project: + name: template-wasm-go + type: wasm/golang +source: + module: ./go.mod + schema: ./polywrap.graphql From 0425f7e52b68947cbe7416929526f154ebd213db Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Tue, 18 Jul 2023 22:28:35 +0800 Subject: [PATCH 152/181] fix: binding issues --- .../Env%type%Serialization-go.mustache | 4 +- .../Env%type%Serialization-go.mustache | 4 +- .../Object%type%Serialization-go.mustache | 4 +- .../Object%type%Serialization-go.mustache | 4 +- .../polywrap.wasm-golang-linked.build.yaml | 4 + .../polywrap.wasm-golang-linked.yaml | 2 + .../wasm/golang/build-staging/module.wasm | Bin 0 -> 575977 bytes packages/templates/wasm/golang/build.py | 106 ++++++++++++++++++ packages/templates/wasm/golang/go.mod | 2 +- packages/templates/wasm/golang/go.sum | 4 + .../module/__tests__/e2e/integration.spec.ts | 2 + .../templates/wasm/golang/wasm-target.json | 27 +++++ 12 files changed, 154 insertions(+), 9 deletions(-) create mode 100644 packages/templates/polywrap.wasm-golang-linked.build.yaml create mode 100755 packages/templates/wasm/golang/build-staging/module.wasm create mode 100644 packages/templates/wasm/golang/build.py create mode 100644 packages/templates/wasm/golang/go.sum create mode 100644 packages/templates/wasm/golang/wasm-target.json diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache index 03f0b548fa..780c629ec4 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache @@ -12,8 +12,8 @@ func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toU func write{{#toUpper}}{{type}}{{/toUpper}}(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { writer.WriteMapLength({{properties.length}}) {{#properties}} - writer.Context().Push("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") - writer.WriteString("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}") + writer.Context().Push("{{#toLower}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toLower}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + writer.WriteString("{{#toLower}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toLower}}") {{#scalar}} {{> serialize_scalar}} {{/scalar}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache index 0b03fc04e1..71bce7c036 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache @@ -15,8 +15,8 @@ func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toU func write{{#toUpper}}{{type}}{{/toUpper}}(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { writer.WriteMapLength({{properties.length}}) {{#properties}} - writer.Context().Push("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") - writer.WriteString("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}") + writer.Context().Push("{{#toLower}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toLower}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + writer.WriteString("{{#toLower}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toLower}}") {{#scalar}} {{> serialize_scalar}} {{/scalar}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache index 4620a8e956..38f4eb8711 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache @@ -15,8 +15,8 @@ func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toU func write{{#toUpper}}{{type}}{{/toUpper}}(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { writer.WriteMapLength({{properties.length}}) {{#properties}} - writer.Context().Push("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") - writer.WriteString("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}") + writer.Context().Push("{{#toLower}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toLower}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + writer.WriteString("{{#toLower}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toLower}}") {{#scalar}} {{> serialize_scalar}} {{/scalar}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache index b858842c79..fe97fbf0bd 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache @@ -15,8 +15,8 @@ func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toU func write{{#toUpper}}{{type}}{{/toUpper}}(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { writer.WriteMapLength({{properties.length}}) {{#properties}} - writer.Context().Push("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") - writer.WriteString("{{#toUpper}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toUpper}}") + writer.Context().Push("{{#toLower}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toLower}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + writer.WriteString("{{#toLower}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toLower}}") {{#scalar}} {{> serialize_scalar}} {{/scalar}} diff --git a/packages/templates/polywrap.wasm-golang-linked.build.yaml b/packages/templates/polywrap.wasm-golang-linked.build.yaml new file mode 100644 index 0000000000..7544889104 --- /dev/null +++ b/packages/templates/polywrap.wasm-golang-linked.build.yaml @@ -0,0 +1,4 @@ +format: 0.3.0 +strategies: + image: + name: template-wasm-go diff --git a/packages/templates/polywrap.wasm-golang-linked.yaml b/packages/templates/polywrap.wasm-golang-linked.yaml index e5f597dbb2..014ae3dfc5 100644 --- a/packages/templates/polywrap.wasm-golang-linked.yaml +++ b/packages/templates/polywrap.wasm-golang-linked.yaml @@ -5,3 +5,5 @@ project: source: module: ./go.mod schema: ./polywrap.graphql +extensions: + build: ./polywrap.wasm-golang-linked.build.yaml \ No newline at end of file diff --git a/packages/templates/wasm/golang/build-staging/module.wasm b/packages/templates/wasm/golang/build-staging/module.wasm new file mode 100755 index 0000000000000000000000000000000000000000..749b174e7e039ce5d609e1283190f9c77252a3bc GIT binary patch literal 575977 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 kAaZ}~ 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 arw>exjV>QAj+ZODk9n%*PhXCmjsFXtkky3% literal 0 HcmV?d00001 diff --git a/packages/templates/wasm/golang/build.py b/packages/templates/wasm/golang/build.py new file mode 100644 index 0000000000..734db3603c --- /dev/null +++ b/packages/templates/wasm/golang/build.py @@ -0,0 +1,106 @@ +import os +import subprocess +import re + +ACCEPTED_IMPORTS = {'wrap', 'env'} + +def build_wam_module(): + # subprocess.run(["yarn", "build"]) # this fails + + # go mod tidy + subprocess.run(["go", "mod", "tidy"], check=True) + + # tinygo build -o main.wasm -target wasm-target ./module/wrap/main/main.go + subprocess.run(["tinygo", "build", "-o", "./build/wrap.wasm", "-target", "wasm-target.json", "./module/wrap/main/main.go"], check=True) + + return "./build/wrap.wasm" + +def convert_wasm_to_wat(wasm_file): + wat_file = wasm_file.replace('.wasm', '.wat') + subprocess.run(['wasm2wat', wasm_file, '-o', wat_file], check=True) + return wat_file + +def find_import_functions(wat_file): + import_functions = [] + + with open(wat_file, 'r') as f: + content = f.read() + + pattern = r'\(import\s+"([^"]+)"\s+"([^"]+)"' + matches = re.findall(pattern, content) + + for match in matches: + namespace = match[0] + if namespace == 'env' and match[1] != "memory": + import_functions.append(match[1]) + if namespace not in ACCEPTED_IMPORTS: + import_functions.append(match[1]) + + return import_functions + +def find_export_functions(wat_file): + export_functions = [] + + with open(wat_file, 'r') as f: + content = f.read() + + pattern = r'\(export\s+"([^"]+)"' + matches = re.findall(pattern, content) + + for match in matches: + export = match + if export.startswith('asyncify') or export.startswith('_wrap'): + continue + export_functions.append(export) + + return export_functions + +def snip_unwanted_imports(wasm_module_path , import_functions): + if len(import_functions) == 0: + return + subprocess.run(['wasm-snip', wasm_module_path, '-o', wasm_module_path, '-p', *import_functions], check=True) + +def snip_unwanted_exports(wasm_module_path, export_functions): + if len(export_functions) == 0: + return + subprocess.run(['wasm-snip', wasm_module_path, '-o', wasm_module_path, *export_functions], check=True) + +def optimize_wasm(wasm_module_path): + subprocess.run(['wasm-opt', "-Os", wasm_module_path, '-o', wasm_module_path], check=True) + +def main(): + print("Building wasm module...") + wasm_module_path = build_wam_module() + print("Wasm module built at: ", wasm_module_path) + + print("Converting wasm to wat...") + wat_file = convert_wasm_to_wat(wasm_module_path) + print("Wat file generated at: ", wat_file) + + print("Finding unwanted import functions...") + import_functions = find_import_functions(wat_file) + print("Found unwanted import functions: ", import_functions) + + print("Finding unwanted export functions...") + export_functions = find_export_functions(wat_file) + print("Found unwanted export functions: ", export_functions) + + print("Snipping unwanted import functions...") + snip_unwanted_imports(wasm_module_path, import_functions) + print("Snipped unwanted imports ", wasm_module_path) + + print("Snipping unwanted export functions...") + snip_unwanted_exports(wasm_module_path, export_functions) + print("Snipped unwanted exports: ", wasm_module_path) + + print("Optimizing wasm module...") + optimize_wasm(wasm_module_path) + print("Wasm module optimized: ", wasm_module_path) + + print("Removing wat file...") + os.remove(wat_file) + print("Wat file removed") + + +if __name__ == "__main__": + main() diff --git a/packages/templates/wasm/golang/go.mod b/packages/templates/wasm/golang/go.mod index 87625c8648..7eee740fd6 100644 --- a/packages/templates/wasm/golang/go.mod +++ b/packages/templates/wasm/golang/go.mod @@ -2,6 +2,6 @@ module example.com/template-wasm-go go 1.18 -require github.com/polywrap/go-wrap wrap-0.1 +require github.com/polywrap/go-wrap v0.0.0-20230712212127-6895977d63c2 require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/templates/wasm/golang/go.sum b/packages/templates/wasm/golang/go.sum new file mode 100644 index 0000000000..8df2badd73 --- /dev/null +++ b/packages/templates/wasm/golang/go.sum @@ -0,0 +1,4 @@ +github.com/polywrap/go-wrap v0.0.0-20230712212127-6895977d63c2 h1:+O3G/996rX4SMlJNFA9AIjPSyrInzOEVb7PFOT96G9A= +github.com/polywrap/go-wrap v0.0.0-20230712212127-6895977d63c2/go.mod h1:rxqhIFKUzn/M46+zjnA1RHlCzLGQn2BiLWalezhLj/k= +github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= +github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= diff --git a/packages/templates/wasm/golang/module/__tests__/e2e/integration.spec.ts b/packages/templates/wasm/golang/module/__tests__/e2e/integration.spec.ts index 55913c174a..623060d9f1 100644 --- a/packages/templates/wasm/golang/module/__tests__/e2e/integration.spec.ts +++ b/packages/templates/wasm/golang/module/__tests__/e2e/integration.spec.ts @@ -24,6 +24,8 @@ describe("Template Wrapper End to End Tests", () => { args: { arg: expected } }); + console.log(result) + expect(result.ok).toBeTruthy(); if (!result.ok) return; expect(result.value.result).toEqual(expected); diff --git a/packages/templates/wasm/golang/wasm-target.json b/packages/templates/wasm/golang/wasm-target.json new file mode 100644 index 0000000000..2e45a55999 --- /dev/null +++ b/packages/templates/wasm/golang/wasm-target.json @@ -0,0 +1,27 @@ +{ + "llvm-target": "wasm32-unknown-wasi", + "cpu": "generic", + "features": "+bulk-memory,+nontrapping-fptoint,+sign-ext", + "build-tags": ["tinygo.wasm", "wasi"], + "goos": "linux", + "goarch": "arm", + "linker": "wasm-ld", + "libc": "wasi-libc", + "scheduler": "asyncify", + "default-stack-size": 24576, + "cflags": [ + "-mbulk-memory", + "-mnontrapping-fptoint", + "-msign-ext" + ], + "ldflags": [ + "--stack-first", + "--no-demangle", + "--import-memory" + ], + "extra-files": [ + "src/runtime/asm_tinygowasm.S" + ], + "emulator": "wasmtime --mapdir=/tmp::{tmpDir} {}", + "wasm-abi": "generic" +} From 576299a03fb1374bb01f3d328786ed35b8562b7f Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Tue, 18 Jul 2023 22:31:40 +0800 Subject: [PATCH 153/181] fix: tests --- .../wasm/golang/module/__tests__/e2e/integration.spec.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/templates/wasm/golang/module/__tests__/e2e/integration.spec.ts b/packages/templates/wasm/golang/module/__tests__/e2e/integration.spec.ts index 623060d9f1..55913c174a 100644 --- a/packages/templates/wasm/golang/module/__tests__/e2e/integration.spec.ts +++ b/packages/templates/wasm/golang/module/__tests__/e2e/integration.spec.ts @@ -24,8 +24,6 @@ describe("Template Wrapper End to End Tests", () => { args: { arg: expected } }); - console.log(result) - expect(result.ok).toBeTruthy(); if (!result.ok) return; expect(result.value.result).toEqual(expected); From 2d548a14d77033f77db103f934a1ac21780a9df2 Mon Sep 17 00:00:00 2001 From: Jure Bogunovic Date: Tue, 18 Jul 2023 17:09:31 +0200 Subject: [PATCH 154/181] prep 0.11.0-pre.3 --- CHANGELOG.md | 1714 ++++++++++++++++++++++++++++++-------------------- VERSION | 2 +- 2 files changed, 1034 insertions(+), 682 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b183252708..99d608c9fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,95 +1,127 @@ -# Polywrap Origin (0.11.0-pre.2) +# Polywrap Origin (0.11.0-pre.3) + ... # Polywrap Origin (0.10.6) + ## Bugs + **`polywrap` CLI:** -* [PR-1796](https://github.com/polywrap/cli/pull/1796) **`wrap/rust` Builds Now Properly Remove wasm-bindgen Imports** - * The `wasm-bindgen` CLI was emitting an unneeded `__wbindgen_throw` import, so we use `wasm-snip` to remove it. + +- [PR-1796](https://github.com/polywrap/cli/pull/1796) **`wrap/rust` Builds Now Properly Remove wasm-bindgen Imports** + - The `wasm-bindgen` CLI was emitting an unneeded `__wbindgen_throw` import, so we use `wasm-snip` to remove it. # Polywrap Origin (0.10.5) + ## Bugs + **`@polywrap/schema-bind`:** -* [PR-1786](https://github.com/polywrap/cli/pull/1786) **Update `plugin/python` plugin bindings to latest client** + +- [PR-1786](https://github.com/polywrap/cli/pull/1786) **Update `plugin/python` plugin bindings to latest client** # Polywrap Origin (0.10.4) + ## Features + **`polywrap` CLI:** -* [PR-1735](https://github.com/polywrap/cli/pull/1735) **Add Docs Manifest & `polywrap docs init` Command** - * The `polywrap.docs.yaml` manifest is used to add additional metadata to your wraps. -* [PR-1776](https://github.com/polywrap/cli/pull/1776) **Add HTTP Headers To HTTP Deploy Module** - * The `http` deploy module now supports the `headers` configuration property. + +- [PR-1735](https://github.com/polywrap/cli/pull/1735) **Add Docs Manifest & `polywrap docs init` Command** + - The `polywrap.docs.yaml` manifest is used to add additional metadata to your wraps. +- [PR-1776](https://github.com/polywrap/cli/pull/1776) **Add HTTP Headers To HTTP Deploy Module** + - The `http` deploy module now supports the `headers` configuration property. ## Bugs + **`polywrap` CLI:** -* [PR-1773](https://github.com/polywrap/cli/pull/1773) **Don't Install `wasm-opt` Every `local` Rust Build** - * The `local` strategy for rust wasm projects was unexpectedly installing `wasm-opt` every time it was run, leading to very long build times. + +- [PR-1773](https://github.com/polywrap/cli/pull/1773) **Don't Install `wasm-opt` Every `local` Rust Build** + - The `local` strategy for rust wasm projects was unexpectedly installing `wasm-opt` every time it was run, leading to very long build times. **`@polywrap/schema-bind`:** -* [PR-1775](https://github.com/polywrap/cli/pull/1775) **Fix Python Plugin Bindings** - * The wrap abi type `Bytes` can now be properly used within rust plugins. -* [PR-1753](https://github.com/polywrap/cli/pull/1753) **Fix Python Plugin Bindings** + +- [PR-1775](https://github.com/polywrap/cli/pull/1775) **Fix Python Plugin Bindings** + - The wrap abi type `Bytes` can now be properly used within rust plugins. +- [PR-1753](https://github.com/polywrap/cli/pull/1753) **Fix Python Plugin Bindings** # Polywrap Origin (0.10.3) + ## Features + **`polywrap` CLI:** -* [PR-1747](https://github.com/polywrap/toolchain/pull/1747) **Add Rust & Python plugin template projects to CLI's `create` command** - * The `create` command now supports `plugin/rust` and `plugin/python` project types. + +- [PR-1747](https://github.com/polywrap/toolchain/pull/1747) **Add Rust & Python plugin template projects to CLI's `create` command** + - The `create` command now supports `plugin/rust` and `plugin/python` project types. ## Bugs + **`@polywrap/schema-bind`:** -* [PR-1734](https://github.com/polywrap/toolchain/pull/1734) **Update `plugin/python` Bindings** - * Update `wrap.info` python module embedding. -* [PR-1728](https://github.com/polywrap/toolchain/pull/1728) **Update `plugin/rust` Bindings** - * Modify JSON serialization within rust plugin's bindings. -* [PR-1736](https://github.com/polywrap/toolchain/pull/1736) **Properly emit function name when `Env` is missing** - * Fixed the error message that's emitted when an environment is not supplied to a function that requires it. -* [PR-1733](https://github.com/polywrap/toolchain/pull/1733) **Add imported `Env` to `propertyDeps` transform** - * Adds imported `Env` to `propertyDeps` transform, so that now codegen properly generates imports for dependencies of imported env. + +- [PR-1734](https://github.com/polywrap/toolchain/pull/1734) **Update `plugin/python` Bindings** + - Update `wrap.info` python module embedding. +- [PR-1728](https://github.com/polywrap/toolchain/pull/1728) **Update `plugin/rust` Bindings** + - Modify JSON serialization within rust plugin's bindings. +- [PR-1736](https://github.com/polywrap/toolchain/pull/1736) **Properly emit function name when `Env` is missing** + - Fixed the error message that's emitted when an environment is not supplied to a function that requires it. +- [PR-1733](https://github.com/polywrap/toolchain/pull/1733) **Add imported `Env` to `propertyDeps` transform** + - Adds imported `Env` to `propertyDeps` transform, so that now codegen properly generates imports for dependencies of imported env. # Polywrap Origin (0.10.2) + ## Bugs + **`@polywrap/schema-bind`:** -* [PR-1718](https://github.com/polywrap/toolchain/pull/1718) **`plugin/python` Enum Bindings Fix** - * Enums are now properly displayed in Python plugins. + +- [PR-1718](https://github.com/polywrap/toolchain/pull/1718) **`plugin/python` Enum Bindings Fix** + - Enums are now properly displayed in Python plugins. # Polywrap Origin (0.10.1) + ## Features + **`@polywrap/schema-bind`:** -* [PR-1694](https://github.com/polywrap/toolchain/pull/1694) **`plugin/rust` Env Bindings Refactor** - * Rust plugin bindings now expose `env` as a function argument. + +- [PR-1694](https://github.com/polywrap/toolchain/pull/1694) **`plugin/rust` Env Bindings Refactor** + - Rust plugin bindings now expose `env` as a function argument. ## Bugs + **`@polywrap/schema-bind`:** -* [PR-1700](https://github.com/polywrap/toolchain/pull/1700) **`plugin/rust` Serde renaming for snake-cased properties in rust plugins types** - * Rust plugins now properly convert wrap schema property names into snake-cased names, so they are compatable with Rust naming conventions. + +- [PR-1700](https://github.com/polywrap/toolchain/pull/1700) **`plugin/rust` Serde renaming for snake-cased properties in rust plugins types** + - Rust plugins now properly convert wrap schema property names into snake-cased names, so they are compatable with Rust naming conventions. **`@polywrap/templates`:** -* [PR-1680](https://github.com/polywrap/toolchain/pull/1680) **Import newer logger in typescript template** - * Update the typescript app template to use the latest logging wrap at `ens/wraps.eth:logging@1.0.0`. + +- [PR-1680](https://github.com/polywrap/toolchain/pull/1680) **Import newer logger in typescript template** + - Update the typescript app template to use the latest logging wrap at `ens/wraps.eth:logging@1.0.0`. **`@polywrap/polywrap-manifest-types-js`:** -* [PR-1692](https://github.com/polywrap/toolchain/pull/1692) **top-level `docker` property is now removed from build manifest during migration** - * Fixes a bug where the top-level `docker` property of build manifest version 0.1.0 was not being dropped during migration, causing migrated build manifests to fail validation. + +- [PR-1692](https://github.com/polywrap/toolchain/pull/1692) **top-level `docker` property is now removed from build manifest during migration** + - Fixes a bug where the top-level `docker` property of build manifest version 0.1.0 was not being dropped during migration, causing migrated build manifests to fail validation. # Polywrap Origin (0.10.0) + ## Features + ### Toolchain + **`polywrap` CLI:** -* [PR-1592](https://github.com/polywrap/toolchain/pull/1592) **Add `primaryJob` to deploy manifest and output `URI.txt` when running `polywrap deploy`** - * The `primaryJob` option in the deploy manifest identifies the name of the job that is used for the primary deployment. The URI that is emitted from the `primaryJob` will be output to a `URI.txt` file next to the deploy manifest. -* [PR-1529](https://github.com/polywrap/toolchain/pull/1529) **`polywrap create template` Command** - * Added the `polywrap create template` command to the CLI, enabling users to provide a url to a template project. -* [PR-1584](https://github.com/polywrap/toolchain/pull/1584) **Codegen Command Now Supports `--watch`** - * You can now run npx `polywrap codegen --watch` which will automatically watch files within your project directory and re-run codegen whenever changes are detected. -* [PR-1677](https://github.com/polywrap/toolchain/pull/1677) **Python Plugin Support** - * Add bindings for `plugin/python` projects. -* [PR-1428](https://github.com/polywrap/toolchain/pull/1428) **Rust Plugin Support** - * Add bindings for `plugin/rust` projects. -* [PR-1437](https://github.com/polywrap/toolchain/pull/1437) **Support Custom Wrapper Environment Variables** - * Enable users to customize the CLI's internal client's wrapper environment via a `--wrapper-envs` option, added to the `build`, `codegen`, `docgen`, and `test` commands. -* [PR-1430](https://github.com/polywrap/toolchain/pull/1430) **Support Arbitrary Resources Files** - * Polywrap `wasm/` & `interface/` projects can now include a `resources:` directory, specified in the `polywrap.yaml` manifest. This resources directory will be copied into the `build/` folder upon runnin `polywrap build`. For example: + +- [PR-1592](https://github.com/polywrap/toolchain/pull/1592) **Add `primaryJob` to deploy manifest and output `URI.txt` when running `polywrap deploy`** + - The `primaryJob` option in the deploy manifest identifies the name of the job that is used for the primary deployment. The URI that is emitted from the `primaryJob` will be output to a `URI.txt` file next to the deploy manifest. +- [PR-1529](https://github.com/polywrap/toolchain/pull/1529) **`polywrap create template` Command** + - Added the `polywrap create template` command to the CLI, enabling users to provide a url to a template project. +- [PR-1584](https://github.com/polywrap/toolchain/pull/1584) **Codegen Command Now Supports `--watch`** + - You can now run npx `polywrap codegen --watch` which will automatically watch files within your project directory and re-run codegen whenever changes are detected. +- [PR-1677](https://github.com/polywrap/toolchain/pull/1677) **Python Plugin Support** + - Add bindings for `plugin/python` projects. +- [PR-1428](https://github.com/polywrap/toolchain/pull/1428) **Rust Plugin Support** + - Add bindings for `plugin/rust` projects. +- [PR-1437](https://github.com/polywrap/toolchain/pull/1437) **Support Custom Wrapper Environment Variables** + - Enable users to customize the CLI's internal client's wrapper environment via a `--wrapper-envs` option, added to the `build`, `codegen`, `docgen`, and `test` commands. +- [PR-1430](https://github.com/polywrap/toolchain/pull/1430) **Support Arbitrary Resources Files** + - Polywrap `wasm/` & `interface/` projects can now include a `resources:` directory, specified in the `polywrap.yaml` manifest. This resources directory will be copied into the `build/` folder upon runnin `polywrap build`. For example: ```yaml format: 0.3.0 project: @@ -99,323 +131,377 @@ ... resources: ./resources ``` -* [PR-1349](https://github.com/polywrap/toolchain/pull/1349) **Log File Support** - * A `-l, --log-file [path]` option has been added to all commands. Its purpose is to configure a `Log file to save console output to`, useful in situations when the console log overflows. +- [PR-1349](https://github.com/polywrap/toolchain/pull/1349) **Log File Support** + - A `-l, --log-file [path]` option has been added to all commands. Its purpose is to configure a `Log file to save console output to`, useful in situations when the console log overflows. **`@polywrap/cli-js`:** -* [PR-1359](https://github.com/polywrap/toolchain/pull/1359) **Polywrap CLI JS Wrapper** - * Created the `polywrap/cli-js` package to wrap the `polywrap` CLI with a JavaScript/TypeScript interface. + +- [PR-1359](https://github.com/polywrap/toolchain/pull/1359) **Polywrap CLI JS Wrapper** + - Created the `polywrap/cli-js` package to wrap the `polywrap` CLI with a JavaScript/TypeScript interface. **`@polywrap/polywrap-manifest-schemas`:** -* [PR-1430](https://github.com/polywrap/toolchain/pull/1430) **Support Arbitrary Resources Files** - * Added version `0.3.0` of the `PolywrapManifest`, which includes the new `resources: string` field. + +- [PR-1430](https://github.com/polywrap/toolchain/pull/1430) **Support Arbitrary Resources Files** + - Added version `0.3.0` of the `PolywrapManifest`, which includes the new `resources: string` field. **`@polywrap/polywrap-manifest-types-js`:** -* [PR-1379](https://github.com/polywrap/toolchain/pull/1379) **Add Logging to Manifest Migrators** - * Added an optional logger parameter to the deserialization function of all manifest types. -* [PR-1430](https://github.com/polywrap/toolchain/pull/1430) **Support Arbitrary Resources Files** - * Added version `0.3.0` of the `PolywrapManifest`, which includes the new `resources: string` field. + +- [PR-1379](https://github.com/polywrap/toolchain/pull/1379) **Add Logging to Manifest Migrators** + - Added an optional logger parameter to the deserialization function of all manifest types. +- [PR-1430](https://github.com/polywrap/toolchain/pull/1430) **Support Arbitrary Resources Files** + - Added version `0.3.0` of the `PolywrapManifest`, which includes the new `resources: string` field. **`@polywrap/schema-bind`:** -* [PR-1677](https://github.com/polywrap/toolchain/pull/1677) **Python Plugin Support** - * Add bindings for `plugin/python` projects. -* [PR-1464](https://github.com/polywrap/toolchain/pull/1464) **`wasm/rust` Bindings Now Use `ModuleTrait` Trait** - * Codegen for `wasm/rust` wraps now generates a `ModuleTrait` trait that must be implemented for the root `Module` struct. -* [PR-1460](https://github.com/polywrap/toolchain/pull/1460) **`wasm/assemblyscript` Bindings Now Use `ModuleBase` Interface** - * Codegen for `wasm/assemblyscript` wraps now generates a `ModuleBase` interface that must be extended by a root `Module` class. -* [PR-1428](https://github.com/polywrap/toolchain/pull/1428) **Rust Plugin Support** - * Add bindings for `plugin/rust` projects. -* [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** - * In `plugin-ts` bindings, the `PluginModule` type is now imported fron `@polywrap/plugin-js` instead of `@polywrap/core-js`. + +- [PR-1677](https://github.com/polywrap/toolchain/pull/1677) **Python Plugin Support** + - Add bindings for `plugin/python` projects. +- [PR-1464](https://github.com/polywrap/toolchain/pull/1464) **`wasm/rust` Bindings Now Use `ModuleTrait` Trait** + - Codegen for `wasm/rust` wraps now generates a `ModuleTrait` trait that must be implemented for the root `Module` struct. +- [PR-1460](https://github.com/polywrap/toolchain/pull/1460) **`wasm/assemblyscript` Bindings Now Use `ModuleBase` Interface** + - Codegen for `wasm/assemblyscript` wraps now generates a `ModuleBase` interface that must be extended by a root `Module` class. +- [PR-1428](https://github.com/polywrap/toolchain/pull/1428) **Rust Plugin Support** + - Add bindings for `plugin/rust` projects. +- [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** + - In `plugin-ts` bindings, the `PluginModule` type is now imported fron `@polywrap/plugin-js` instead of `@polywrap/core-js`. **`@polywrap/schema-compose`:** -* [PR-1600](https://github.com/polywrap/toolchain/pull/1600) **Allow WRAP URIs in Un-Namespaced Imports** - * Support URIs within un-namespaced import statements like so `#import { Object, Module } from "wrap://..."` - * This effectively enables the "embedding" of external ABIs, which is useful when you'd like to copy 1:1 an ABI that lives elsewhere. + +- [PR-1600](https://github.com/polywrap/toolchain/pull/1600) **Allow WRAP URIs in Un-Namespaced Imports** + - Support URIs within un-namespaced import statements like so `#import { Object, Module } from "wrap://..."` + - This effectively enables the "embedding" of external ABIs, which is useful when you'd like to copy 1:1 an ABI that lives elsewhere. ### JS Client + **`@polywrap/client-js`:** -* [PR-1582](https://github.com/polywrap/toolchain/pull/1582) **Support ENS Text Record WRAP URIs** - * Support has been added for using ENS text records as valid `wrap://` URIs. - * Example: [`wrap://ens/uniswap.wraps.eth:v3`](https://app.ens.domains/name/uniswap.wraps.eth/details) - * NOTE: Text record key names must begin with `wrap/` -* [PR-1431](https://github.com/polywrap/toolchain/pull/1431) **WRAP Error Structure** - * Integrate the `WrapError` structure, helping debug common client error scenarios. -* [PR-1340](https://github.com/polywrap/toolchain/pull/1340) **Wrapper Validation** - * Added a `validate(uri, options)` method to the `PolywrapClient` class, allowing users to guarantee the client can communicate with the provided wrapper located at the provided URI. -* [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** - * Polywrap Client now re-exports the config builder and uri-resolvers (in addition to core) packages. This is done to improve dev exp and remove the need for users to import those package themselves. - * For users who do not need those packages and are using noDefaults there will be a separate PR that refactor core client functionality into a core-client package that does not depend on the config builder and uri-resolvers packages, but has no defaults. + +- [PR-1582](https://github.com/polywrap/toolchain/pull/1582) **Support ENS Text Record WRAP URIs** + - Support has been added for using ENS text records as valid `wrap://` URIs. + - Example: [`wrap://ens/uniswap.wraps.eth:v3`](https://app.ens.domains/name/uniswap.wraps.eth/details) + - NOTE: Text record key names must begin with `wrap/` +- [PR-1431](https://github.com/polywrap/toolchain/pull/1431) **WRAP Error Structure** + - Integrate the `WrapError` structure, helping debug common client error scenarios. +- [PR-1340](https://github.com/polywrap/toolchain/pull/1340) **Wrapper Validation** + - Added a `validate(uri, options)` method to the `PolywrapClient` class, allowing users to guarantee the client can communicate with the provided wrapper located at the provided URI. +- [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** + - Polywrap Client now re-exports the config builder and uri-resolvers (in addition to core) packages. This is done to improve dev exp and remove the need for users to import those package themselves. + - For users who do not need those packages and are using noDefaults there will be a separate PR that refactor core client functionality into a core-client package that does not depend on the config builder and uri-resolvers packages, but has no defaults. **`@polywrap/client-config-builder-js`:** -* [PR-1582](https://github.com/polywrap/toolchain/pull/1582) **Integrate URI Resolver Extension Wraps** - * The default configuration bundle now has the following uri-resolver-ext wraps registered as interface implementations: - * [`wrap://ens/wraps.eth:ipfs-uri-resolver-ext@1.0.0](https://github.com/polywrap/uri-resolver-extensions/tree/master/implementations/ipfs) - * [`wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0`](https://github.com/polywrap/uri-resolver-extensions/tree/master/implementations/ens-text-record) - * [`wrap://ens/wraps.eth:http-uri-resolver-ext@1.0.0`](https://github.com/polywrap/uri-resolver-extensions/tree/master/implementations/http) - * [`wrap://ens/wraps.eth:file-system-uri-resolver-ext@1.0.0`](https://github.com/polywrap/uri-resolver-extensions/tree/master/implementations/file-system) - * [`wrap://ens/wraps.eth:ens-uri-resolver-ext@1.0.0`](https://github.com/polywrap/uri-resolver-extensions/tree/master/implementations/ens-contenthash) - * [`wrap://ens/wraps.eth:ens-ipfs-contenthash-uri-resolver-ext@1.0.0`](https://github.com/polywrap/uri-resolver-extensions/tree/master/implementations/ens-ipfs-contenthash) -* [PR-1560](https://github.com/polywrap/toolchain/pull/1560) **Add `BuildOptions` to build method in `IClientConfigBuilder`** - * This makes it possible to add a custom cache or resolver without casting. -* [PR-1475](https://github.com/polywrap/toolchain/pull/1475) **Embed IPFS HTTP Client & IPFS URI Resolver Wraps** - * The default configuration bundle now comes with two embedded wraps that enable interactions with IPFS: - * `ipfs-http-client` @ `wrap://ens/wraps.eth:ipfs-http-client@1.0.0` - * `async-ipfs-uri-resolver-ext` @ `wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.1` -* [PR-1518](https://github.com/polywrap/toolchain/pull/1518) **Optional Build Method Arguments** - * The `build(...)` method now accepts a single argument of type `BuildOptions`. -* [PR-1496](https://github.com/polywrap/toolchain/pull/1496) **Use New Concurrent Wrapper** - * The default config bundle now uses the `wrap://ens/wrappers.polywrap.eth:concurrent@1.0.0` interface, and adds the `concurrent-plugin-js` package @ `wrap://plugin/concurrent` as an implementation. -* [PR-1468](https://github.com/polywrap/toolchain/pull/1468) **Export Default Config Bundle URIs** - * The default config now exports constants for all URIs used within the config. -* [PR-1436](https://github.com/polywrap/toolchain/pull/1436) **Use New Logger Wrapper** - * The default config bundle now uses the `wrap://ens/wrappers.polywrap.eth:logger@1.0.0` interface, and adds the `@polywrap/logger-plugin-js` package @ `wrap://plugin/logger` as an implementation. -* [PR-1411](https://github.com/polywrap/toolchain/pull/1411) **Add `ens-text-record-resolver` to Default Config Bundle** - * The `ens-text-record-resolver` wrapper @ [`wrap://ipfs/QmfRCVA1MSAjUbrXXjya4xA9QHkbWeiKRsT7Um1cvrR7FY`](https://wrappers.io/v/ipfs/QmfRCVA1MSAjUbrXXjya4xA9QHkbWeiKRsT7Um1cvrR7FY) has been added to the default client config bundle. This resolver enables ENS, text-record based, WRAP URI resolution. The text-record's key must be prepended with the `wrap/...` identifier. For example, the URI `wrap://ens/domain.eth:foo` maps to `domain.eth`'s `wrap/foo` text record. The `wrap/foo` text-record's value must contain another valid WRAP URI. For examples, see [dev.polywrap.eth](https://app.ens.domains/name/dev.polywrap.eth/details). -* [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** - * Added `addRedirects`, `addWrappers`, `addPackages` methods to the `ClientConfigBuilder`, so users can add many items at once. - * Added `buildDefault` to the `ClientConfigBuilder` which builds a `ClientConfig` using default resolvers. + +- [PR-1582](https://github.com/polywrap/toolchain/pull/1582) **Integrate URI Resolver Extension Wraps** + - The default configuration bundle now has the following uri-resolver-ext wraps registered as interface implementations: + - [`wrap://ens/wraps.eth:ipfs-uri-resolver-ext@1.0.0](https://github.com/polywrap/uri-resolver-extensions/tree/master/implementations/ipfs) + - [`wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0`](https://github.com/polywrap/uri-resolver-extensions/tree/master/implementations/ens-text-record) + - [`wrap://ens/wraps.eth:http-uri-resolver-ext@1.0.0`](https://github.com/polywrap/uri-resolver-extensions/tree/master/implementations/http) + - [`wrap://ens/wraps.eth:file-system-uri-resolver-ext@1.0.0`](https://github.com/polywrap/uri-resolver-extensions/tree/master/implementations/file-system) + - [`wrap://ens/wraps.eth:ens-uri-resolver-ext@1.0.0`](https://github.com/polywrap/uri-resolver-extensions/tree/master/implementations/ens-contenthash) + - [`wrap://ens/wraps.eth:ens-ipfs-contenthash-uri-resolver-ext@1.0.0`](https://github.com/polywrap/uri-resolver-extensions/tree/master/implementations/ens-ipfs-contenthash) +- [PR-1560](https://github.com/polywrap/toolchain/pull/1560) **Add `BuildOptions` to build method in `IClientConfigBuilder`** + - This makes it possible to add a custom cache or resolver without casting. +- [PR-1475](https://github.com/polywrap/toolchain/pull/1475) **Embed IPFS HTTP Client & IPFS URI Resolver Wraps** + - The default configuration bundle now comes with two embedded wraps that enable interactions with IPFS: + - `ipfs-http-client` @ `wrap://ens/wraps.eth:ipfs-http-client@1.0.0` + - `async-ipfs-uri-resolver-ext` @ `wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.1` +- [PR-1518](https://github.com/polywrap/toolchain/pull/1518) **Optional Build Method Arguments** + - The `build(...)` method now accepts a single argument of type `BuildOptions`. +- [PR-1496](https://github.com/polywrap/toolchain/pull/1496) **Use New Concurrent Wrapper** + - The default config bundle now uses the `wrap://ens/wrappers.polywrap.eth:concurrent@1.0.0` interface, and adds the `concurrent-plugin-js` package @ `wrap://plugin/concurrent` as an implementation. +- [PR-1468](https://github.com/polywrap/toolchain/pull/1468) **Export Default Config Bundle URIs** + - The default config now exports constants for all URIs used within the config. +- [PR-1436](https://github.com/polywrap/toolchain/pull/1436) **Use New Logger Wrapper** + - The default config bundle now uses the `wrap://ens/wrappers.polywrap.eth:logger@1.0.0` interface, and adds the `@polywrap/logger-plugin-js` package @ `wrap://plugin/logger` as an implementation. +- [PR-1411](https://github.com/polywrap/toolchain/pull/1411) **Add `ens-text-record-resolver` to Default Config Bundle** + - The `ens-text-record-resolver` wrapper @ [`wrap://ipfs/QmfRCVA1MSAjUbrXXjya4xA9QHkbWeiKRsT7Um1cvrR7FY`](https://wrappers.io/v/ipfs/QmfRCVA1MSAjUbrXXjya4xA9QHkbWeiKRsT7Um1cvrR7FY) has been added to the default client config bundle. This resolver enables ENS, text-record based, WRAP URI resolution. The text-record's key must be prepended with the `wrap/...` identifier. For example, the URI `wrap://ens/domain.eth:foo` maps to `domain.eth`'s `wrap/foo` text record. The `wrap/foo` text-record's value must contain another valid WRAP URI. For examples, see [dev.polywrap.eth](https://app.ens.domains/name/dev.polywrap.eth/details). +- [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** + - Added `addRedirects`, `addWrappers`, `addPackages` methods to the `ClientConfigBuilder`, so users can add many items at once. + - Added `buildDefault` to the `ClientConfigBuilder` which builds a `ClientConfig` using default resolvers. **`@polywrap/plugin-js`:** -* [PR-1614](https://github.com/polywrap/toolchain/pull/1614) **Add `env` To `PluginModule` Invocation Method Arguments** - * `PluginModule` invocation methods will now be given an `env` the method's arguments. -* [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** - * New package for js plugins. - * Can create plugin packages with `PluginPackage.from`. - * Accepts `manifest` and a `PluginModule`, or an inline `PluginModule`. + +- [PR-1614](https://github.com/polywrap/toolchain/pull/1614) **Add `env` To `PluginModule` Invocation Method Arguments** + - `PluginModule` invocation methods will now be given an `env` the method's arguments. +- [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** + - New package for js plugins. + - Can create plugin packages with `PluginPackage.from`. + - Accepts `manifest` and a `PluginModule`, or an inline `PluginModule`. **`@polywrap/uri-resolvers-js`:** -* [PR-1646](https://github.com/polywrap/toolchain/pull/1646) **Resolution Result Cache Resolver** - * Added a new cache resolver `ResolutionResultCacheResolver`. - * Unlike the `WrapperCacheResolver`, which caches wrappers (URI => Wrapper), this resolver caches the result of the resolution process: URI, wrapper, package or error (URI => URI, URI => wrapper, URI => package, URI => error). - * By default, it does not cache errors, but a flag can be passed to enable that functionality. -* [PR-1528](https://github.com/polywrap/toolchain/pull/1528) **Request Synchronizer Resolver** - * With URI resolvers, multiple requests for the same URI, in most cases, needlessly repeat the same process (usually a network request). Using a cache resolver (like PackageToWrapperCacheResolver) helps if the resolution requests are synchronous (one after another). This new `RequestSynchronizerResolver` can be used to reuse parallel requests for the same URI, this way, only the first one needs to do the work (e.g. a network request) while others will await that same promise. -* [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** - * Added `StaticResolver` and `StaticResolver.from` to optimize building resolvers with `IUriRedirect`, `IUriWrapper` and `IUriPackage`. + +- [PR-1646](https://github.com/polywrap/toolchain/pull/1646) **Resolution Result Cache Resolver** + - Added a new cache resolver `ResolutionResultCacheResolver`. + - Unlike the `WrapperCacheResolver`, which caches wrappers (URI => Wrapper), this resolver caches the result of the resolution process: URI, wrapper, package or error (URI => URI, URI => wrapper, URI => package, URI => error). + - By default, it does not cache errors, but a flag can be passed to enable that functionality. +- [PR-1528](https://github.com/polywrap/toolchain/pull/1528) **Request Synchronizer Resolver** + - With URI resolvers, multiple requests for the same URI, in most cases, needlessly repeat the same process (usually a network request). Using a cache resolver (like PackageToWrapperCacheResolver) helps if the resolution requests are synchronous (one after another). This new `RequestSynchronizerResolver` can be used to reuse parallel requests for the same URI, this way, only the first one needs to do the work (e.g. a network request) while others will await that same promise. +- [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** + - Added `StaticResolver` and `StaticResolver.from` to optimize building resolvers with `IUriRedirect`, `IUriWrapper` and `IUriPackage`. **`@polywrap/uri-resolver-extensions-js`:** -* [PR-1582](https://github.com/polywrap/toolchain/pull/1582) **Update Default URI-Resolver-Ext Interface URI** - * The `ExtendableUriResolver` has been updated to get uri-resolver-ext implementations from the following interface URIs: - * `wrap://ens/wraps.eth:uri-resolver-ext@1.1.0` - * `wrap://ens/wraps.eth:uri-resolver-ext@1.0.0` + +- [PR-1582](https://github.com/polywrap/toolchain/pull/1582) **Update Default URI-Resolver-Ext Interface URI** + - The `ExtendableUriResolver` has been updated to get uri-resolver-ext implementations from the following interface URIs: + - `wrap://ens/wraps.eth:uri-resolver-ext@1.1.0` + - `wrap://ens/wraps.eth:uri-resolver-ext@1.0.0` **`@polywrap/core-js`:** -* [PR-1431](https://github.com/polywrap/toolchain/pull/1431) **WRAP Error Structure** - * Created a custom `WrapError` structure that improves debugging ability for common client error scenarios. -* [PR-1369](https://github.com/polywrap/toolchain/pull/1369) **Remove Legacy Redirects** - * `GetImplementationsOptions` now accepts an optional resolution context, to be used to handle infinite recursion when a resolver uses `getImplementations` - * `GetImplementationsOptions` now accepts an optional `applyResolution`. This can be used to apply URI resolution to interfaces. + +- [PR-1431](https://github.com/polywrap/toolchain/pull/1431) **WRAP Error Structure** + - Created a custom `WrapError` structure that improves debugging ability for common client error scenarios. +- [PR-1369](https://github.com/polywrap/toolchain/pull/1369) **Remove Legacy Redirects** + - `GetImplementationsOptions` now accepts an optional resolution context, to be used to handle infinite recursion when a resolver uses `getImplementations` + - `GetImplementationsOptions` now accepts an optional `applyResolution`. This can be used to apply URI resolution to interfaces. **`@polywrap/logging-js`:** -* [PR-1379](https://github.com/polywrap/toolchain/pull/1379) **Create `@polywrap/logging-js` Package** - * Created the `@polywrap/logging-js` package from the logging lib previously in the CLI's codebase. + +- [PR-1379](https://github.com/polywrap/toolchain/pull/1379) **Create `@polywrap/logging-js` Package** + - Created the `@polywrap/logging-js` package from the logging lib previously in the CLI's codebase. ### JS Plugins + **`@polywrap/http-plugin-js`:** -* [PR-1471](https://github.com/polywrap/toolchain/pull/1471) **Add form-data Support** - * Added form-data support through the inclusion of the `formData: [FormDataEntry!]` property on the `Request` object. +- [PR-1471](https://github.com/polywrap/toolchain/pull/1471) **Add form-data Support** + - Added form-data support through the inclusion of the `formData: [FormDataEntry!]` property on the `Request` object. ## Breaking Changes + ### Toolchain + **`polywrap` CLI:** -* [PR-1561](https://github.com/polywrap/toolchain/pull/1561) **Remove buildx builder by default** - * Added new `keepBuilder` option which is default to false and removed the previous `removeBuilder` option from the build manifest. -* [PR-1525](https://github.com/polywrap/toolchain/pull/1525) **Unify Typescript App Templates** - * Remove `typescript-node` & `typescript-react` app templates, and replace them with a single `typescript`. -* [PR-1432](https://github.com/polywrap/toolchain/pull/1432) **Remove Legacy Polywrap Project Metadata** - * Remove the `polywrap.meta.yaml` manifest. -* [PR-1367](https://github.com/polywrap/toolchain/pull/1367) **Client Configuration Refactor** - * The JS/TS module passed into the `--client-config` option has a new function entrypoint signature. Instead of exporting a `getCustomConfig` function, users should export the following: `configure(builder: IClientConfigBuilder): IClientConfigBuilder`. - * See example [config.ts](https://github.com/polywrap/toolchain/blob/1096f2f4dfb35fdcc29e9b66057f91ade8b82c67/packages/test-cases/cases/cli/test/008-custom-config/config.ts). -* [PR-1348](https://github.com/polywrap/toolchain/pull/1348) **Rename `run` to `test`** - * Rename the `run` command to `test`, which uses the `test` project extension, as defined in the `polywrap.test.yaml` manifest file. -* [PR-1545](https://github.com/polywrap/toolchain/pull/1545) **Remove `config` section from test manifest - * The Polywrap Test manifest (`polywrap.test.yaml`) has been upgraded to version `0.2.0` with the following change: - * The `config` section inside `step` has been removed, and manifest migrations will warn the user regarding this change. + +- [PR-1561](https://github.com/polywrap/toolchain/pull/1561) **Remove buildx builder by default** + - Added new `keepBuilder` option which is default to false and removed the previous `removeBuilder` option from the build manifest. +- [PR-1525](https://github.com/polywrap/toolchain/pull/1525) **Unify Typescript App Templates** + - Remove `typescript-node` & `typescript-react` app templates, and replace them with a single `typescript`. +- [PR-1432](https://github.com/polywrap/toolchain/pull/1432) **Remove Legacy Polywrap Project Metadata** + - Remove the `polywrap.meta.yaml` manifest. +- [PR-1367](https://github.com/polywrap/toolchain/pull/1367) **Client Configuration Refactor** + - The JS/TS module passed into the `--client-config` option has a new function entrypoint signature. Instead of exporting a `getCustomConfig` function, users should export the following: `configure(builder: IClientConfigBuilder): IClientConfigBuilder`. + - See example [config.ts](https://github.com/polywrap/toolchain/blob/1096f2f4dfb35fdcc29e9b66057f91ade8b82c67/packages/test-cases/cases/cli/test/008-custom-config/config.ts). +- [PR-1348](https://github.com/polywrap/toolchain/pull/1348) **Rename `run` to `test`** + - Rename the `run` command to `test`, which uses the `test` project extension, as defined in the `polywrap.test.yaml` manifest file. +- [PR-1545](https://github.com/polywrap/toolchain/pull/1545) \*\*Remove `config` section from test manifest + - The Polywrap Test manifest (`polywrap.test.yaml`) has been upgraded to version `0.2.0` with the following change: + - The `config` section inside `step` has been removed, and manifest migrations will warn the user regarding this change. **`@polywrap/schema-bind`** -* [PR-1464](https://github.com/polywrap/toolchain/pull/1464) **`wasm/rust` Bindings Now Use `ModuleTrait` Trait** - * Rust-based wraps no longer pub functions, but instead pub a `impl ModuleTrait for Module`. -* [PR-1460](https://github.com/polywrap/toolchain/pull/1460) **`wasm/assemblyscript` Bindings Now Use `ModuleBase` Interface** - * AssemblyScript-based wraps no longer export functions, but instead export a `class Module` which `extends ModuleBase`. + +- [PR-1464](https://github.com/polywrap/toolchain/pull/1464) **`wasm/rust` Bindings Now Use `ModuleTrait` Trait** + - Rust-based wraps no longer pub functions, but instead pub a `impl ModuleTrait for Module`. +- [PR-1460](https://github.com/polywrap/toolchain/pull/1460) **`wasm/assemblyscript` Bindings Now Use `ModuleBase` Interface** + - AssemblyScript-based wraps no longer export functions, but instead export a `class Module` which `extends ModuleBase`. **`@polywrap/test-env-js`** -* [PR-1530](https://github.com/polywrap/toolchain/pull/1530) **Deprecate Legacy Test-Env Package** - * The `test-env-js` package has been deprecated, in favor of `@polywrap/cli-js` + +- [PR-1530](https://github.com/polywrap/toolchain/pull/1530) **Deprecate Legacy Test-Env Package** + - The `test-env-js` package has been deprecated, in favor of `@polywrap/cli-js` ### JS Client + **`@polywrap/client-js`:** -* [PR-1534](https://github.com/polywrap/toolchain/pull/1534) **Remove legacy config types from `PolywrapClient`** - * The `PolywrapClient` now simply accepts a `CoreClientConfig`, which is expected to come from the config builder. -* [PR-1461](https://github.com/polywrap/toolchain/pull/1461) **Remove Legacy Invocation Methods** - * Remove `client.query(...)` & `client.subscribe(...)` methods. -* [PR-1369](https://github.com/polywrap/toolchain/pull/1369) **Remove Legacy Redirects** - * `PolywrapClient` config when using `noDefaults: true` no longer accepts `redirects` (Since redirects have been removed from `CoreClientConfig`). -* [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** - * The Polywrap Client with `noDefaults: false` no longer accepts a `plugins` field, but it accepts `wrappers` and `packages`. - * `resolver` field has been replaced with `resolvers`, since with default client the resolver used is the `RecursiveResolver` with the `PackageToWrapperCacheResolver`. - * The Polywrap Client with `noDefaults: true`, no longer accepts a `plugins` field. It is expected that devs using this option will manually configure their own resolver. - * removed `getPlugins` and `getPluginByUri`. Will add `getWrapper`, `getWrapperByUri`, `getPackage`, `getPackageByUri`, in a follow up PR. - * `createPolywrapClient` function has been deprecated. -* [PR-1534](https://github.com/polywrap/toolchain/pull/1534) **Remove legacy config types from PolywrapClient** - * The `PolywrapClient`'s constructor now accepts only an optional `CoreClientConfig` type as its configuration object. - * It is now advised to use the `ClientConfigBuilder` found in `@polywrap/client-config-builder-js` and exported by `@polywrap/client-js` in order to set up their client configurations. + +- [PR-1534](https://github.com/polywrap/toolchain/pull/1534) **Remove legacy config types from `PolywrapClient`** + - The `PolywrapClient` now simply accepts a `CoreClientConfig`, which is expected to come from the config builder. +- [PR-1461](https://github.com/polywrap/toolchain/pull/1461) **Remove Legacy Invocation Methods** + - Remove `client.query(...)` & `client.subscribe(...)` methods. +- [PR-1369](https://github.com/polywrap/toolchain/pull/1369) **Remove Legacy Redirects** + - `PolywrapClient` config when using `noDefaults: true` no longer accepts `redirects` (Since redirects have been removed from `CoreClientConfig`). +- [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** + - The Polywrap Client with `noDefaults: false` no longer accepts a `plugins` field, but it accepts `wrappers` and `packages`. + - `resolver` field has been replaced with `resolvers`, since with default client the resolver used is the `RecursiveResolver` with the `PackageToWrapperCacheResolver`. + - The Polywrap Client with `noDefaults: true`, no longer accepts a `plugins` field. It is expected that devs using this option will manually configure their own resolver. + - removed `getPlugins` and `getPluginByUri`. Will add `getWrapper`, `getWrapperByUri`, `getPackage`, `getPackageByUri`, in a follow up PR. + - `createPolywrapClient` function has been deprecated. +- [PR-1534](https://github.com/polywrap/toolchain/pull/1534) **Remove legacy config types from PolywrapClient** + - The `PolywrapClient`'s constructor now accepts only an optional `CoreClientConfig` type as its configuration object. + - It is now advised to use the `ClientConfigBuilder` found in `@polywrap/client-config-builder-js` and exported by `@polywrap/client-js` in order to set up their client configurations. **`@polywrap/client-config-builder-js`:** -* [PR-1480](https://github.com/polywrap/toolchain/pull/1480) **ClientConfigBuilder-specific `BuilderConfig` Object** - * The `ClientConfigBuilder` now uses a specific `BuilderConfig` that is easier for users to work with. It will then be turned into a `CoreClientConfig` through the use of the `build()` method. -* [PR-1498](https://github.com/polywrap/toolchain/pull/1498) **Refactor `ClientConfigBuilder.build()`** - * Rename `buildCoreConfig()` to `build()`, which returns a `CoreClientConfig` instance. -* [PR-1494](https://github.com/polywrap/toolchain/pull/1494) **Deprecate Legacy HTTP URIs in Default Config Bundle** - * The `wrap://ens/http.polywrap.eth` interface and wrapper have been removed from the default configuration bundle. -* [PR-1436](https://github.com/polywrap/toolchain/pull/1436) **Deprecate Legacy Logger URIs in Default Config Bundle** - * The `wrap://ens/logger.core.polywrap.eth` interface and the `wrap://ens/js-logger.polywrap.eth` plugin wrapper have both been removed from the default configuration bundle. -* [PR-1446](https://github.com/polywrap/toolchain/pull/1446) **Deprecate Legacy Ethereum URI in Default Config Bundle** - * The `wrap://ens/ethereum.polywrap.eth` URI + wrap has been removed from the default configuration bundle. -* [PR-1475](https://github.com/polywrap/toolchain/pull/1475) **Deprecate Legacy IPFS URIs in Default Config Bundle** - * The `wrap://ens/ipfs.polywrap.eth` & `wrap://ens/ipfs-resolver.polywrap.eth` URIs + wraps have been removed from the default configuration bundle. -* [PR-1369](https://github.com/polywrap/toolchain/pull/1369) **Remove Legacy Redirects** - * Calling `buildCoreConfig` no longer returns a `CoreClientConfig` with redirects since redirects are no longer a part of `CoreClientConfig`. -* [PR-1367](https://github.com/polywrap/toolchain/pull/1367) **URI Redirect Renaming** - * Renamed `removeUriRedirect(...)` to `removeRedirePR-15e `plugins` and a `resolver`, but now has `wrappers`, `packages` and `resolvers` - * Calling build returns an instance of the `CustomClientConfig`, which can be used with defaults from the `PolywrapClient`, but can not be used if `noDefaults: true` is passed to the `PolywrapClient` constructor. - * Removed `addPlugin` from the `ClientConfigBuilder`, users can now use `addWrapper` or `addPackage` where appropriate. + +- [PR-1480](https://github.com/polywrap/toolchain/pull/1480) **ClientConfigBuilder-specific `BuilderConfig` Object** + - The `ClientConfigBuilder` now uses a specific `BuilderConfig` that is easier for users to work with. It will then be turned into a `CoreClientConfig` through the use of the `build()` method. +- [PR-1498](https://github.com/polywrap/toolchain/pull/1498) **Refactor `ClientConfigBuilder.build()`** + - Rename `buildCoreConfig()` to `build()`, which returns a `CoreClientConfig` instance. +- [PR-1494](https://github.com/polywrap/toolchain/pull/1494) **Deprecate Legacy HTTP URIs in Default Config Bundle** + - The `wrap://ens/http.polywrap.eth` interface and wrapper have been removed from the default configuration bundle. +- [PR-1436](https://github.com/polywrap/toolchain/pull/1436) **Deprecate Legacy Logger URIs in Default Config Bundle** + - The `wrap://ens/logger.core.polywrap.eth` interface and the `wrap://ens/js-logger.polywrap.eth` plugin wrapper have both been removed from the default configuration bundle. +- [PR-1446](https://github.com/polywrap/toolchain/pull/1446) **Deprecate Legacy Ethereum URI in Default Config Bundle** + - The `wrap://ens/ethereum.polywrap.eth` URI + wrap has been removed from the default configuration bundle. +- [PR-1475](https://github.com/polywrap/toolchain/pull/1475) **Deprecate Legacy IPFS URIs in Default Config Bundle** + - The `wrap://ens/ipfs.polywrap.eth` & `wrap://ens/ipfs-resolver.polywrap.eth` URIs + wraps have been removed from the default configuration bundle. +- [PR-1369](https://github.com/polywrap/toolchain/pull/1369) **Remove Legacy Redirects** + - Calling `buildCoreConfig` no longer returns a `CoreClientConfig` with redirects since redirects are no longer a part of `CoreClientConfig`. +- [PR-1367](https://github.com/polywrap/toolchain/pull/1367) **URI Redirect Renaming** + - Renamed `removeUriRedirect(...)` to `removeRedirePR-15e `plugins`and a`resolver`, but now has `wrappers`, `packages`and`resolvers` + - Calling build returns an instance of the `CustomClientConfig`, which can be used with defaults from the `PolywrapClient`, but can not be used if `noDefaults: true` is passed to the `PolywrapClient` constructor. + - Removed `addPlugin` from the `ClientConfigBuilder`, users can now use `addWrapper` or `addPackage` where appropriate. **`@polywrap/plugin-js`:** -* [PR-1614](https://github.com/polywrap/toolchain/pull/1614) **Remove `env` Property From `PluginModule`** - * `PluginModule` instances no longer have an `env` property, and instead will be given an `env` within the invocation method's arguments. + +- [PR-1614](https://github.com/polywrap/toolchain/pull/1614) **Remove `env` Property From `PluginModule`** + - `PluginModule` instances no longer have an `env` property, and instead will be given an `env` within the invocation method's arguments. **`@polywrap/core-js`:** -* [PR-1613](https://github.com/polywrap/toolchain/pull/1613) **Core Client Config Unique Maps** - * The `CoreClientConfig` now `ReadonlyUriMap`s for its `interface` and `env` properties. -* [PR-1369](https://github.com/polywrap/toolchain/pull/1369) **Remove Legacy Redirects** - * `redirects` are no longer a part of `CoreClientConfig`. - * `getRedirects` are no longer a part of `CoreClient`. - * `getUriResolver` on `CoreClient` has been renamed to `getResolver`. - * `getImplementations` returns a promise now. - * `GetImplementationsOptions` no longer accepts `applyRedirects`. This has been replaces with `applyResolution`. - * `applyRedirects` helper function has been replaced with `applyResolution`. -* [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** - * Plugins are no longer a part of this package, they have been moved to the plugin-js package - * Renamed `UriRedirect` to `IUriRedirect` to match `IUriWrapper` and `IUriPackage` - * `IUriRedirect`, `IUriWrapper` and `IUriPackage` are now generic and their generic param implements `Uri | string` - * Removed `options` argument from `client.getManifest` method since all wrappers have a deserialized manifest + +- [PR-1613](https://github.com/polywrap/toolchain/pull/1613) **Core Client Config Unique Maps** + - The `CoreClientConfig` now `ReadonlyUriMap`s for its `interface` and `env` properties. +- [PR-1369](https://github.com/polywrap/toolchain/pull/1369) **Remove Legacy Redirects** + - `redirects` are no longer a part of `CoreClientConfig`. + - `getRedirects` are no longer a part of `CoreClient`. + - `getUriResolver` on `CoreClient` has been renamed to `getResolver`. + - `getImplementations` returns a promise now. + - `GetImplementationsOptions` no longer accepts `applyRedirects`. This has been replaces with `applyResolution`. + - `applyRedirects` helper function has been replaced with `applyResolution`. +- [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** + - Plugins are no longer a part of this package, they have been moved to the plugin-js package + - Renamed `UriRedirect` to `IUriRedirect` to match `IUriWrapper` and `IUriPackage` + - `IUriRedirect`, `IUriWrapper` and `IUriPackage` are now generic and their generic param implements `Uri | string` + - Removed `options` argument from `client.getManifest` method since all wrappers have a deserialized manifest **`@polywrap/uri-resolvers-js`:** -* [PR-1586](https://github.com/polywrap/toolchain/pull/1586) **Separate the `PackageToWrapperCacheResolver` Into Two Resolvers** - * The `PackageToWrapperCacheResolver` has been split into the `PackageToWrapperResolver` & `WrapperCacheResolver` resolvers. -* [PR-1369](https://github.com/polywrap/toolchain/pull/1369) **Remove Legacy Redirects** - * `LegacyRedirectsResolver` has been removed. -* [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** - * Replaced helper func `buildUriResolver` with `UriResolver.from` - * Constructors of built-in resolvers like `RecursiveResolver` and `PackageToWrapperCacheResolver` now accept a concrete `IUriResolver` while their static `from` methods accept a `UriResolverLike` - * Remove `PluginsResolver` and `PluginResolver`, users can now use `WrapperResolver` or `PackageResolver` + +- [PR-1586](https://github.com/polywrap/toolchain/pull/1586) **Separate the `PackageToWrapperCacheResolver` Into Two Resolvers** + - The `PackageToWrapperCacheResolver` has been split into the `PackageToWrapperResolver` & `WrapperCacheResolver` resolvers. +- [PR-1369](https://github.com/polywrap/toolchain/pull/1369) **Remove Legacy Redirects** + - `LegacyRedirectsResolver` has been removed. +- [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** + - Replaced helper func `buildUriResolver` with `UriResolver.from` + - Constructors of built-in resolvers like `RecursiveResolver` and `PackageToWrapperCacheResolver` now accept a concrete `IUriResolver` while their static `from` methods accept a `UriResolverLike` + - Remove `PluginsResolver` and `PluginResolver`, users can now use `WrapperResolver` or `PackageResolver` **`@polywrap/uri-resolver-extensions-js`:** -* [PR-1582](https://github.com/polywrap/toolchain/pull/1582) **Remove Legacy uri-resolver-ext Interface URI** - * The `ExtendableUriResolver` no longer supports the legacy interface URI `wrap://ens/uri-resolver.core.polywrap.eth`. + +- [PR-1582](https://github.com/polywrap/toolchain/pull/1582) **Remove Legacy uri-resolver-ext Interface URI** + - The `ExtendableUriResolver` no longer supports the legacy interface URI `wrap://ens/uri-resolver.core.polywrap.eth`. **`@polywrap/react`:** -* [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** - * Replaced `plugins` on the `PolywrapProvider` with `wrappers` and `packages` + +- [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** + - Replaced `plugins` on the `PolywrapProvider` with `wrappers` and `packages` ### JS Plugins + **`@polywrap/http-plugin-js`:** -* [PR-1494](https://github.com/polywrap/toolchain/pull/1494) Migrated to [polywrap/http](https://github.com/polywrap/http) + +- [PR-1494](https://github.com/polywrap/toolchain/pull/1494) Migrated to [polywrap/http](https://github.com/polywrap/http) **`@polywrap/fs-plugin-js`:** -* [PR-1495](https://github.com/polywrap/toolchain/pull/1495) Migrate to [polywrap/file-system](https://github.com/polywrap/file-system) + +- [PR-1495](https://github.com/polywrap/toolchain/pull/1495) Migrate to [polywrap/file-system](https://github.com/polywrap/file-system) **`@polywrap/ws-plugin-js`:** -* [PR-1547](https://github.com/polywrap/toolchain/pull/1547) Migrate to [polywrap/websocket](https://github.com/polywrap/websocket) + +- [PR-1547](https://github.com/polywrap/toolchain/pull/1547) Migrate to [polywrap/websocket](https://github.com/polywrap/websocket) **`@polywrap/ethereum-plugin-js`:** -* [PR-1446](https://github.com/polywrap/toolchain/pull/1446) Deprecated in favor of the [polywrap/ethereum](https://github.com/polywrap/ethereum) wasm-based wrap + +- [PR-1446](https://github.com/polywrap/toolchain/pull/1446) Deprecated in favor of the [polywrap/ethereum](https://github.com/polywrap/ethereum) wasm-based wrap **`@polywrap/ipfs-plugin-js`:** -* [PR-1475](https://github.com/polywrap/toolchain/pull/1475) Deprecated in favor of the [polywrap/ipfs](https://github.com/polywrap/ipfs) wasm-based wrap + +- [PR-1475](https://github.com/polywrap/toolchain/pull/1475) Deprecated in favor of the [polywrap/ipfs](https://github.com/polywrap/ipfs) wasm-based wrap ### Interface Wrappers + **`@polywrap/http-interface`:** -* [PR-1494](https://github.com/polywrap/toolchain/pull/1494) Migrated to [polywrap/http](https://github.com/polywrap/http) + +- [PR-1494](https://github.com/polywrap/toolchain/pull/1494) Migrated to [polywrap/http](https://github.com/polywrap/http) **`@polywrap/file-system-interface`:** -* [PR-1495](https://github.com/polywrap/toolchain/pull/1495) Migrate to [polywrap/file-system](https://github.com/polywrap/file-system) + +- [PR-1495](https://github.com/polywrap/toolchain/pull/1495) Migrate to [polywrap/file-system](https://github.com/polywrap/file-system) ## Bugs + ### Toolchain + **`polywrap` CLI:** -* [PR-1683](https://github.com/polywrap/toolchain/pull/1683) **Don't Require Docker `polywrap build` On Interface Projects** - * When building `type: interface` projects, the CLI no longer requires docker to be running. -* [PR-1610](https://github.com/polywrap/toolchain/pull/1610) **`polywrap test` Non-Zero Exit Codes** - * `polywrap test` now exits with an exit code of 1 if a test fails. -* [PR-1470](https://github.com/polywrap/toolchain/pull/1470) **Fix Build Manifest Absolute Path Support** - * Accept absolute paths within the `polywrap.build.yaml` manifest's `linked_packages` property. -* [PR-1438](https://github.com/polywrap/toolchain/pull/1438) **Support Maps In Workflows** - * Properly handle map types when running workflows using the `test` command. -* [PR-1396](https://github.com/polywrap/toolchain/pull/1396) **Remove Wasm "Interface Types" Custom Section** - * The rust build images have been updated to properly remove the needless inclusion of the `wasm-interface-types` custom section, as a result of running wasm-bindgen. More information can be found [here](https://github.com/polywrap/toolchain/issues/1420). -* [PR-1379](https://github.com/polywrap/toolchain/pull/1379) **Manifest Upgrade Warning Message** - * Automatically upgrading manifests now emits a warning, suggesting users to upgrade their manifest. -* [PR-1382](https://github.com/polywrap/toolchain/pull/1382) **Execute `asc` Using `npx`** - * Invoke `asc` using `npx` to help with program resolution. -* [PR-1368](https://github.com/polywrap/toolchain/pull/1368) **Client Config Error Messaging** - * Update error messaging for the `--client-config` option. + +- [PR-1683](https://github.com/polywrap/toolchain/pull/1683) **Don't Require Docker `polywrap build` On Interface Projects** + - When building `type: interface` projects, the CLI no longer requires docker to be running. +- [PR-1610](https://github.com/polywrap/toolchain/pull/1610) **`polywrap test` Non-Zero Exit Codes** + - `polywrap test` now exits with an exit code of 1 if a test fails. +- [PR-1470](https://github.com/polywrap/toolchain/pull/1470) **Fix Build Manifest Absolute Path Support** + - Accept absolute paths within the `polywrap.build.yaml` manifest's `linked_packages` property. +- [PR-1438](https://github.com/polywrap/toolchain/pull/1438) **Support Maps In Workflows** + - Properly handle map types when running workflows using the `test` command. +- [PR-1396](https://github.com/polywrap/toolchain/pull/1396) **Remove Wasm "Interface Types" Custom Section** + - The rust build images have been updated to properly remove the needless inclusion of the `wasm-interface-types` custom section, as a result of running wasm-bindgen. More information can be found [here](https://github.com/polywrap/toolchain/issues/1420). +- [PR-1379](https://github.com/polywrap/toolchain/pull/1379) **Manifest Upgrade Warning Message** + - Automatically upgrading manifests now emits a warning, suggesting users to upgrade their manifest. +- [PR-1382](https://github.com/polywrap/toolchain/pull/1382) **Execute `asc` Using `npx`** + - Invoke `asc` using `npx` to help with program resolution. +- [PR-1368](https://github.com/polywrap/toolchain/pull/1368) **Client Config Error Messaging** + - Update error messaging for the `--client-config` option. **`@polywrap/schema-bind`:** -* [PR-1444](https://github.com/polywrap/toolchain/pull/1444) **TypeScript Bindings Export Imports** - * The `plugin/typescript` and `app/typescript` bindings now properly export all interfaces. -* [PR-1443](https://github.com/polywrap/toolchain/pull/1443) **Rust Bindings Use String** - * The `wasm/rust` bindings now use `String` instead of `str` within imported interface module typings. + +- [PR-1444](https://github.com/polywrap/toolchain/pull/1444) **TypeScript Bindings Export Imports** + - The `plugin/typescript` and `app/typescript` bindings now properly export all interfaces. +- [PR-1443](https://github.com/polywrap/toolchain/pull/1443) **Rust Bindings Use String** + - The `wasm/rust` bindings now use `String` instead of `str` within imported interface module typings. ### JS Client + **`@polywrap/core-js`:** -* [PR-1593](https://github.com/polywrap/toolchain/pull/1593) **Display decoded args when errors are thrown in subinvocations** - * Args used to be displayed as-is in error messages when errors were thrown in Wasm wrapper invocations. This meant args for subinvocations were byte arrays. Now the args are always decoded for errors so they are human-readable. -* [PR-1556](https://github.com/polywrap/toolchain/pull/1556) **`WrapError` now correctly parses Rust unwrap errors** - * When calling `.unwrap()` on a Rust result that contains an error, Rust will panic with an error message that contains the Err. For fidelity to the original Err, Rust inserts escape characters in the string. For example, "\n" becomes "\\n". This behavior was not being handled correctly by WrapError's string parsing logic. + +- [PR-1593](https://github.com/polywrap/toolchain/pull/1593) **Display decoded args when errors are thrown in subinvocations** + - Args used to be displayed as-is in error messages when errors were thrown in Wasm wrapper invocations. This meant args for subinvocations were byte arrays. Now the args are always decoded for errors so they are human-readable. +- [PR-1556](https://github.com/polywrap/toolchain/pull/1556) **`WrapError` now correctly parses Rust unwrap errors** + - When calling `.unwrap()` on a Rust result that contains an error, Rust will panic with an error message that contains the Err. For fidelity to the original Err, Rust inserts escape characters in the string. For example, "\n" becomes "\\n". This behavior was not being handled correctly by WrapError's string parsing logic. **`@polywrap/uri-resolvers-extensions-js`:** -* [PR-1487](https://github.com/polywrap/toolchain/pull/1487) **Handle `null` URI Resolver Extension Return Results** - * Update the `MaybeUriOrManifest` & `getFile` interfaces to properly reflect the URI resolver extension interface. + +- [PR-1487](https://github.com/polywrap/toolchain/pull/1487) **Handle `null` URI Resolver Extension Return Results** + - Update the `MaybeUriOrManifest` & `getFile` interfaces to properly reflect the URI resolver extension interface. ### Templates + **`@polywrap/templates`:** -* [PR-1383](https://github.com/polywrap/toolchain/pull/1383) **Default Deploy Gateway** - * Add the `https://ipfs.wrappers.io` gateway to the interface template's `polywrap.deploy.yaml` manifest. + +- [PR-1383](https://github.com/polywrap/toolchain/pull/1383) **Default Deploy Gateway** + - Add the `https://ipfs.wrappers.io` gateway to the interface template's `polywrap.deploy.yaml` manifest. # Polywrap Origin (0.9.3) + ## Bugs -* [PR-1344](https://github.com/polywrap/toolchain/pull/1344) `@polywrap/cli`: Improve workflow validation. -* [PR-1345](https://github.com/polywrap/toolchain/pull/1345) `@polywrap/cli`: The `ens-recursive-name-register` deploy step now properly registers ENS sub-domains recursively. -* [PR-1342](https://github.com/polywrap/toolchain/pull/1342) `@polywrap/polywrap-manifest-schemas`: Accept @ character in folder paths. -* [PR-1333](https://github.com/polywrap/toolchain/pull/1333) `@polywrap/client-js`: Added TsDoc comments to the `PolywrapClient` class. -* [PR-1337](https://github.com/polywrap/toolchain/pull/1337) `@polywrap/schema-bind`: In Rust bindings, enum imports are now added in serialization modules when the enum is a subtype of an array (Vec) or map. + +- [PR-1344](https://github.com/polywrap/toolchain/pull/1344) `@polywrap/cli`: Improve workflow validation. +- [PR-1345](https://github.com/polywrap/toolchain/pull/1345) `@polywrap/cli`: The `ens-recursive-name-register` deploy step now properly registers ENS sub-domains recursively. +- [PR-1342](https://github.com/polywrap/toolchain/pull/1342) `@polywrap/polywrap-manifest-schemas`: Accept @ character in folder paths. +- [PR-1333](https://github.com/polywrap/toolchain/pull/1333) `@polywrap/client-js`: Added TsDoc comments to the `PolywrapClient` class. +- [PR-1337](https://github.com/polywrap/toolchain/pull/1337) `@polywrap/schema-bind`: In Rust bindings, enum imports are now added in serialization modules when the enum is a subtype of an array (Vec) or map. # Polywrap Origin (0.9.2) + ## Bugs -* [PR-1327](https://github.com/polywrap/toolchain/pull/1327) `@polywrap/schema-bind`: Added missing serialization bindings for module method arguments & return values. + +- [PR-1327](https://github.com/polywrap/toolchain/pull/1327) `@polywrap/schema-bind`: Added missing serialization bindings for module method arguments & return values. # Polywrap Origin (0.9.1) + ## Bugs -* [PR-1320](https://github.com/polywrap/toolchain/pull/1320) `@polywrap/ethereum-plugin-js`: Proper `view` method result parsing. -* [PR-1317](https://github.com/polywrap/toolchain/pull/1317) `@polywrap/core-js`, `@polywrap/uri-resolvers-extensions-js`: Properly check for null when using UriResolverExtensionFileReader to read wasm module. -* [PR-1318](https://github.com/polywrap/toolchain/pull/1318) `polywrap` CLI: The `codegen` command properly applies the `-g, --codegen-dir` option. -* [PR-1318](https://github.com/polywrap/toolchain/pull/1318) `@polywrap/templates`: Fix several issues within the `wasm` template projects. -* [PR-1316](https://github.com/polywrap/toolchain/pull/1316) `polywrap` CLI: Fix an issue where the CLI process would hang after the command had completed. -* [PR-1315](https://github.com/polywrap/toolchain/pull/1315) `polywrap` CLI: Minor cleanup post logging refactor. -* [PR-1310](https://github.com/polywrap/toolchain/pull/1310) `polywrap` CLI: Use base images from the "polywrap" Docker Hub organization. + +- [PR-1320](https://github.com/polywrap/toolchain/pull/1320) `@polywrap/ethereum-plugin-js`: Proper `view` method result parsing. +- [PR-1317](https://github.com/polywrap/toolchain/pull/1317) `@polywrap/core-js`, `@polywrap/uri-resolvers-extensions-js`: Properly check for null when using UriResolverExtensionFileReader to read wasm module. +- [PR-1318](https://github.com/polywrap/toolchain/pull/1318) `polywrap` CLI: The `codegen` command properly applies the `-g, --codegen-dir` option. +- [PR-1318](https://github.com/polywrap/toolchain/pull/1318) `@polywrap/templates`: Fix several issues within the `wasm` template projects. +- [PR-1316](https://github.com/polywrap/toolchain/pull/1316) `polywrap` CLI: Fix an issue where the CLI process would hang after the command had completed. +- [PR-1315](https://github.com/polywrap/toolchain/pull/1315) `polywrap` CLI: Minor cleanup post logging refactor. +- [PR-1310](https://github.com/polywrap/toolchain/pull/1310) `polywrap` CLI: Use base images from the "polywrap" Docker Hub organization. # Polywrap Origin (0.9.0) + ## Features -* [PR-1306](https://github.com/polywrap/toolchain/pull/1306) `polywrap` CLI: Console logging has been improved, and all commands now support `-q, --quiet` and `-v, --verbose` options. -* [PR-1204](https://github.com/polywrap/toolchain/pull/1204) `polywrap` CLI: **Build times are faster for wasm wrappers!!!** The `build` command has been updated to include the concept of "build strategies". The existing way of building (via `Dockerfile` image layers) is available through the `polywrap build --strategy image` command. Building without Docker (if all build-time dependencies are installed locally) can be performed using `--strategy local`. And lastly, the new default build strategy is `--strategy vm`, which runs all build steps in a pre-built base image, allowing for near-local speeds (once the image has been downloaded). - * NOTE: `--strategy image` is useful for source-code verification, something we'll be better supporting in the future. -* [PR-1297](https://github.com/polywrap/toolchain/pull/1297) `@polywrap/schema-bind`: `wasm/rust` now has support for `println!(...)` and `print!(...)` macros. They have been redefined to use the `polywrap_wasm_rs::wrap_debug_log(...)` function. -* [PR-1192](https://github.com/polywrap/toolchain/pull/1192) `@polywrap/client-js`: `PolywrapClient.invoke(...)` now supports invoke-time environment variables, passed in via the `env` property. -* [PR-1270](https://github.com/polywrap/toolchain/pull/1270) `polywrap` CLI: The `manifest` command has been added: + +- [PR-1306](https://github.com/polywrap/toolchain/pull/1306) `polywrap` CLI: Console logging has been improved, and all commands now support `-q, --quiet` and `-v, --verbose` options. +- [PR-1204](https://github.com/polywrap/toolchain/pull/1204) `polywrap` CLI: **Build times are faster for wasm wrappers!!!** The `build` command has been updated to include the concept of "build strategies". The existing way of building (via `Dockerfile` image layers) is available through the `polywrap build --strategy image` command. Building without Docker (if all build-time dependencies are installed locally) can be performed using `--strategy local`. And lastly, the new default build strategy is `--strategy vm`, which runs all build steps in a pre-built base image, allowing for near-local speeds (once the image has been downloaded). + - NOTE: `--strategy image` is useful for source-code verification, something we'll be better supporting in the future. +- [PR-1297](https://github.com/polywrap/toolchain/pull/1297) `@polywrap/schema-bind`: `wasm/rust` now has support for `println!(...)` and `print!(...)` macros. They have been redefined to use the `polywrap_wasm_rs::wrap_debug_log(...)` function. +- [PR-1192](https://github.com/polywrap/toolchain/pull/1192) `@polywrap/client-js`: `PolywrapClient.invoke(...)` now supports invoke-time environment variables, passed in via the `env` property. +- [PR-1270](https://github.com/polywrap/toolchain/pull/1270) `polywrap` CLI: The `manifest` command has been added: + ``` Usage: polywrap manifest|m [options] [command] Inspect & Migrade Polywrap Manifests @@ -426,404 +512,511 @@ Commands: migrate|m [options] [type] Migrates the polywrap project manifest to the latest version. help [command] display help for command ``` - * [PR-1301](https://github.com/polywrap/toolchain/pull/1301) Added a `--format` option to the `migrate` command, enabling the targeting of specific format versions when migrating manifests (ex: `polywrap manifest migrate -f 0.2.0`). -* [PR-1218](https://github.com/polywrap/toolchain/pull/1218) `polywrap` CLI, `@polywrap/tracing-js`: The `tracing` infrastructure module (i.e. `polywrap infra up --modules tracing`) now uses version `0.11.0` of the `SizNoz` tracing service. Additionally the underlying `@polywrap/tracing-js` library has been updated to support this, and also now has named traces via the `traceName` configuration property. + +- [PR-1301](https://github.com/polywrap/toolchain/pull/1301) Added a `--format` option to the `migrate` command, enabling the targeting of specific format versions when migrating manifests (ex: `polywrap manifest migrate -f 0.2.0`). +- [PR-1218](https://github.com/polywrap/toolchain/pull/1218) `polywrap` CLI, `@polywrap/tracing-js`: The `tracing` infrastructure module (i.e. `polywrap infra up --modules tracing`) now uses version `0.11.0` of the `SizNoz` tracing service. Additionally the underlying `@polywrap/tracing-js` library has been updated to support this, and also now has named traces via the `traceName` configuration property. ## Bugs -* [PR-1304](https://github.com/polywrap/toolchain/pull/1304) `polywrap` CLI: Generated build files from the `vm` strategy now have proper file-system permissions. -* [PR-1305](https://github.com/polywrap/toolchain/pull/1305) `@polywrap/ipfs-plugin-js`: Fallback providers are now properly being used. -* [PR-1296](https://github.com/polywrap/toolchain/pull/1296) `polywrap` CLI: The `polywrap.app.yaml` and `polywrap.plugin.yaml` project manifest file names are being deprecated in favor of a unified `polywrap.yaml` file for all types of projects (wasm, interface, plugin, app). They will still silently work now, but in the future will no longer be recognized defaults. -* [PR-1303](https://github.com/polywrap/toolchain/pull/1303) `@polywrap/core-js`: The `Uri` class now properly formats itself when being `JSON.stringify(...)`'d. -* [PR-1288](https://github.com/polywrap/toolchain/pull/1288) `@polywrap/core-js`: Correctly handle errors in the `getImplementations` algorithm. -* [PR-1298](https://github.com/polywrap/toolchain/pull/1298) `@polywrap/ipfs-plugin-js`, `@polywrap/ipfs-resolver-plugin-js`: Remove the use of `require(...)` statements. -* [PR-1286](https://github.com/polywrap/toolchain/pull/1286) `@polywrap/polywrap-manifest-types-js`: Manifest migration logic has been upgraded to use a strategy that finds a "shortest path" between the `from` and `to` format versions, using predefined migration functions. + +- [PR-1304](https://github.com/polywrap/toolchain/pull/1304) `polywrap` CLI: Generated build files from the `vm` strategy now have proper file-system permissions. +- [PR-1305](https://github.com/polywrap/toolchain/pull/1305) `@polywrap/ipfs-plugin-js`: Fallback providers are now properly being used. +- [PR-1296](https://github.com/polywrap/toolchain/pull/1296) `polywrap` CLI: The `polywrap.app.yaml` and `polywrap.plugin.yaml` project manifest file names are being deprecated in favor of a unified `polywrap.yaml` file for all types of projects (wasm, interface, plugin, app). They will still silently work now, but in the future will no longer be recognized defaults. +- [PR-1303](https://github.com/polywrap/toolchain/pull/1303) `@polywrap/core-js`: The `Uri` class now properly formats itself when being `JSON.stringify(...)`'d. +- [PR-1288](https://github.com/polywrap/toolchain/pull/1288) `@polywrap/core-js`: Correctly handle errors in the `getImplementations` algorithm. +- [PR-1298](https://github.com/polywrap/toolchain/pull/1298) `@polywrap/ipfs-plugin-js`, `@polywrap/ipfs-resolver-plugin-js`: Remove the use of `require(...)` statements. +- [PR-1286](https://github.com/polywrap/toolchain/pull/1286) `@polywrap/polywrap-manifest-types-js`: Manifest migration logic has been upgraded to use a strategy that finds a "shortest path" between the `from` and `to` format versions, using predefined migration functions. ## Breaking Changes -* [PR-1284](https://github.com/polywrap/toolchain/pull/1284) `@polywrap/core-js`: `Wrapper.getFile(...)` and `Wrapper.getManifest(...)` no longer require a `Client` instance as a second function argument. -* [PR-1291](https://github.com/polywrap/toolchain/pull/1291) `@polywrap/core-js`, `@polywrap/client-js`: All `ClientConfig` properties are now `readonly`. -* [PR-1287](https://github.com/polywrap/toolchain/pull/1287) `@polywrap/core-js`: `executeMaybeAsyncFunction` has been removed. -* [PR-1277](https://github.com/polywrap/toolchain/pull/1277) `@polywrap/client-js`: The following methods now return the `Result` type, and will not throw exceptions: `getManifest(...)`, `getFile(...)`, `getImplementations(...)`, `query(...)`, `invokeWrapper(...)`, `invoke(...)`, `loadWrapper(...)`. -* [PR-1192](https://github.com/polywrap/toolchain/pull/1192) `@polywrap/client-js`: `PolywrapClient.invoke(...)` no longer accepts invoke-time reconfiguration via the `config` property. Users who wish to reconfigure the client can do so by calling `client.getConfig()`, modifying it via the `ClientConfigBuilder`, and constructing a new `PolywrapClient` instance. + +- [PR-1284](https://github.com/polywrap/toolchain/pull/1284) `@polywrap/core-js`: `Wrapper.getFile(...)` and `Wrapper.getManifest(...)` no longer require a `Client` instance as a second function argument. +- [PR-1291](https://github.com/polywrap/toolchain/pull/1291) `@polywrap/core-js`, `@polywrap/client-js`: All `ClientConfig` properties are now `readonly`. +- [PR-1287](https://github.com/polywrap/toolchain/pull/1287) `@polywrap/core-js`: `executeMaybeAsyncFunction` has been removed. +- [PR-1277](https://github.com/polywrap/toolchain/pull/1277) `@polywrap/client-js`: The following methods now return the `Result` type, and will not throw exceptions: `getManifest(...)`, `getFile(...)`, `getImplementations(...)`, `query(...)`, `invokeWrapper(...)`, `invoke(...)`, `loadWrapper(...)`. +- [PR-1192](https://github.com/polywrap/toolchain/pull/1192) `@polywrap/client-js`: `PolywrapClient.invoke(...)` no longer accepts invoke-time reconfiguration via the `config` property. Users who wish to reconfigure the client can do so by calling `client.getConfig()`, modifying it via the `ClientConfigBuilder`, and constructing a new `PolywrapClient` instance. # Polywrap Origin (0.8.0) + ## Features -* [PR-1083](https://github.com/polywrap/toolchain/pull/1083) `@polywrap/client-config-builder-js`: The default client config now has the ability to resolve `http` URIs (ex: `wrap://http/domain.com/path`) via the `@polywrap/http-resolver-plugin-js`. -* [PR-1083](https://github.com/polywrap/toolchain/pull/1083) `polywrap` CLI: Hosting & deploying wrappers via HTTP is now possible with the new `http` deploy & infra modules. -* [PR-1097](https://github.com/polywrap/toolchain/pull/1097) & [PR-1272](https://github.com/polywrap/toolchain/pull/1272) `polywrap` CLI, `@polywrap/polywrap-manifest-schemas`, `@polywrap/polywrap-manifest-types-js`: `polywrap.deploy.yaml` format version `0.2.0` has been added, making the schema similar to the `polywrap.test.yaml` schema, where users define a series of `jobs` to be performed. -* [PR-1097](https://github.com/polywrap/toolchain/pull/1097) `polywrap` CLI: Recursive ENS domain name registration is now supported via the `ens-recursive-name-register` deploy module. -* [PR-1060](https://github.com/polywrap/toolchain/pull/1060) `@polywrap/ipfs-interface`: Added `fallbackProviders: [String!]` to `type Options`. -* [PR-1169](https://github.com/polywrap/toolchain/pull/1169) `@polywrap/core-js`, `@polywrap/client-js`: URI resolution has been refactored. Resolution is now implemented in a single `IUriResolver` instance. -* [PR-1169](https://github.com/polywrap/toolchain/pull/1169) `@polywrap/client-js`: `invokeWrapper(...)` has been added to the `PolywrapClient` class. -* [PR-1169](https://github.com/polywrap/toolchain/pull/1169) `@polywrap/client-config-builder-js`: `setResolver(...)` has been added, enabling users to set the `IUriResolver` instance on the builder's `ClientConfig`. -* [PR-1133](https://github.com/polywrap/toolchain/pull/1133) `@polywrap/core-js`, `@polywrap/client-js`: `getPluginByUri(...)` has been added to the `Client` interface, and `PolywrapClient` class. -* [PR-1231](https://github.com/polywrap/toolchain/pull/1231) `polywrap` CLI: `build` command now supports the `--no-codegen` option, which disables the automatic codegen step when compiling projects. - -## Bugs -* [PR-1244](https://github.com/polywrap/toolchain/pull/1244) `polywrap` CLI: Workflows can now properly access nested properties of previous job step output. -* [PR-1243](https://github.com/polywrap/toolchain/pull/1243) `@polywrap/schema-compose`: Multi-line imports are now properly supported within block comments. -* [PR-1097](https://github.com/polywrap/toolchain/pull/1097) `polywrap` CLI: ENS deployment URIs generated via the `deploy` command now properly contain the network's name in the URI. -* [PR-1234](https://github.com/polywrap/toolchain/pull/1234) `polywrap` CLI: The `run` command and underlying `Workflow` system has had multiple bug fixes added. - * Workflow validation always printed "SUCCESS" and errors were never printed. - * Workflow manifest was not being validated. - * The stderr messages were not being output (previously unnoticed because errors were not printed). -* [PR-1220](https://github.com/polywrap/toolchain/pull/1220) `@polywrap/schema-bind`: `wasm/rust` bindings handle the serialization of reserved words via serde, so that the original name of properties is reserved during encoding. -* [PR-1219](https://github.com/polywrap/toolchain/pull/1219) `@polywrap/schema-bind`: `wasm/rust` bindings now properly handle imported interface modules. -* [PR-1229](https://github.com/polywrap/toolchain/pull/1229) `polywrap` CLI: `run` command now properly resolves the `validation: ...` property within the `polywrap.test.yaml` manifest relative to the manifest's directory, instead of the user's cwd. + +- [PR-1083](https://github.com/polywrap/toolchain/pull/1083) `@polywrap/client-config-builder-js`: The default client config now has the ability to resolve `http` URIs (ex: `wrap://http/domain.com/path`) via the `@polywrap/http-resolver-plugin-js`. +- [PR-1083](https://github.com/polywrap/toolchain/pull/1083) `polywrap` CLI: Hosting & deploying wrappers via HTTP is now possible with the new `http` deploy & infra modules. +- [PR-1097](https://github.com/polywrap/toolchain/pull/1097) & [PR-1272](https://github.com/polywrap/toolchain/pull/1272) `polywrap` CLI, `@polywrap/polywrap-manifest-schemas`, `@polywrap/polywrap-manifest-types-js`: `polywrap.deploy.yaml` format version `0.2.0` has been added, making the schema similar to the `polywrap.test.yaml` schema, where users define a series of `jobs` to be performed. +- [PR-1097](https://github.com/polywrap/toolchain/pull/1097) `polywrap` CLI: Recursive ENS domain name registration is now supported via the `ens-recursive-name-register` deploy module. +- [PR-1060](https://github.com/polywrap/toolchain/pull/1060) `@polywrap/ipfs-interface`: Added `fallbackProviders: [String!]` to `type Options`. +- [PR-1169](https://github.com/polywrap/toolchain/pull/1169) `@polywrap/core-js`, `@polywrap/client-js`: URI resolution has been refactored. Resolution is now implemented in a single `IUriResolver` instance. +- [PR-1169](https://github.com/polywrap/toolchain/pull/1169) `@polywrap/client-js`: `invokeWrapper(...)` has been added to the `PolywrapClient` class. +- [PR-1169](https://github.com/polywrap/toolchain/pull/1169) `@polywrap/client-config-builder-js`: `setResolver(...)` has been added, enabling users to set the `IUriResolver` instance on the builder's `ClientConfig`. +- [PR-1133](https://github.com/polywrap/toolchain/pull/1133) `@polywrap/core-js`, `@polywrap/client-js`: `getPluginByUri(...)` has been added to the `Client` interface, and `PolywrapClient` class. +- [PR-1231](https://github.com/polywrap/toolchain/pull/1231) `polywrap` CLI: `build` command now supports the `--no-codegen` option, which disables the automatic codegen step when compiling projects. + +## Bugs + +- [PR-1244](https://github.com/polywrap/toolchain/pull/1244) `polywrap` CLI: Workflows can now properly access nested properties of previous job step output. +- [PR-1243](https://github.com/polywrap/toolchain/pull/1243) `@polywrap/schema-compose`: Multi-line imports are now properly supported within block comments. +- [PR-1097](https://github.com/polywrap/toolchain/pull/1097) `polywrap` CLI: ENS deployment URIs generated via the `deploy` command now properly contain the network's name in the URI. +- [PR-1234](https://github.com/polywrap/toolchain/pull/1234) `polywrap` CLI: The `run` command and underlying `Workflow` system has had multiple bug fixes added. + - Workflow validation always printed "SUCCESS" and errors were never printed. + - Workflow manifest was not being validated. + - The stderr messages were not being output (previously unnoticed because errors were not printed). +- [PR-1220](https://github.com/polywrap/toolchain/pull/1220) `@polywrap/schema-bind`: `wasm/rust` bindings handle the serialization of reserved words via serde, so that the original name of properties is reserved during encoding. +- [PR-1219](https://github.com/polywrap/toolchain/pull/1219) `@polywrap/schema-bind`: `wasm/rust` bindings now properly handle imported interface modules. +- [PR-1229](https://github.com/polywrap/toolchain/pull/1229) `polywrap` CLI: `run` command now properly resolves the `validation: ...` property within the `polywrap.test.yaml` manifest relative to the manifest's directory, instead of the user's cwd. ## Breaking Changes -* [PR-1097](https://github.com/polywrap/toolchain/pull/1097) `polywrap` CLI: The `local-dev-ens` deploy module has been removed. -* [PR-1060](https://github.com/polywrap/toolchain/pull/1060) `@polywrap/ipfs-plugin-js`: `IpfsPluginConfig` has been removed, and all properties (`provider`, `fallbackProviders`) have been moved into the wrapper's `Env`. -* [PR-1169](https://github.com/polywrap/toolchain/pull/1169) `@polywrap/client-js`: `loadUriResolvers(...)` has been removed from the `PolywrapClient` class. -* [PR-1169](https://github.com/polywrap/toolchain/pull/1169) `@polywrap/client-js`: `resolveUri(...)` has been renamed to `tryResolveUri(...)` on the `PolywrapClient` class. -* [PR-1169](https://github.com/polywrap/toolchain/pull/1169) `@polywrap/core-js`, `@polywrap/client-js`: `getUriResolvers(...)` has been renamed to `getUriResolver(...)` on the `Client` interface and `PolywrapClient` class. -* [PR-1169](https://github.com/polywrap/toolchain/pull/1169) `@polywrap/client-config-builder-js`: `addUriResolver(...)` and `setUriResolvers(...)` have been removed from the `ClientConfigBuilder` class. -* [PR-1169](https://github.com/polywrap/toolchain/pull/1169) `@polywrap/core-js`, `@polywrap/wasm-js`: Moved the `WasmWrapper` class and all related types into their own package named `@polywrap/wasm-js`. -* [PR-1235](https://github.com/polywrap/toolchain/pull/1235) `@polywrap/core-js`: `Uri.from(...)` has been added, and `toUri(...)` has been removed. + +- [PR-1097](https://github.com/polywrap/toolchain/pull/1097) `polywrap` CLI: The `local-dev-ens` deploy module has been removed. +- [PR-1060](https://github.com/polywrap/toolchain/pull/1060) `@polywrap/ipfs-plugin-js`: `IpfsPluginConfig` has been removed, and all properties (`provider`, `fallbackProviders`) have been moved into the wrapper's `Env`. +- [PR-1169](https://github.com/polywrap/toolchain/pull/1169) `@polywrap/client-js`: `loadUriResolvers(...)` has been removed from the `PolywrapClient` class. +- [PR-1169](https://github.com/polywrap/toolchain/pull/1169) `@polywrap/client-js`: `resolveUri(...)` has been renamed to `tryResolveUri(...)` on the `PolywrapClient` class. +- [PR-1169](https://github.com/polywrap/toolchain/pull/1169) `@polywrap/core-js`, `@polywrap/client-js`: `getUriResolvers(...)` has been renamed to `getUriResolver(...)` on the `Client` interface and `PolywrapClient` class. +- [PR-1169](https://github.com/polywrap/toolchain/pull/1169) `@polywrap/client-config-builder-js`: `addUriResolver(...)` and `setUriResolvers(...)` have been removed from the `ClientConfigBuilder` class. +- [PR-1169](https://github.com/polywrap/toolchain/pull/1169) `@polywrap/core-js`, `@polywrap/wasm-js`: Moved the `WasmWrapper` class and all related types into their own package named `@polywrap/wasm-js`. +- [PR-1235](https://github.com/polywrap/toolchain/pull/1235) `@polywrap/core-js`: `Uri.from(...)` has been added, and `toUri(...)` has been removed. # Polywrap Origin (0.7.0) + ## Bugs -* [PR-1158](https://github.com/polywrap/toolchain/pull/1158) `@polywrap/client-config-builder-js`: The following plugins have been removed from the default config, and replaced with their WebAssembly wrapper equivalents available at the same URIs: - * `wrap://ens/uts46.polywrap.eth` - * `wrap://ens/sha3.polywrap.eth` - * `wrap://ens/graph-node.polywrap.eth` -* [PR-1213](https://github.com/polywrap/toolchain/pull/1213) `@polywrap/schema-bind`: Nested map types (i.e. `Map>`) are now properly supported for `wasm/rust` and `wasm/assemblyscript`. -* [PR-1213](https://github.com/polywrap/toolchain/pull/1213) `@polywrap/wasm-as`: Nested map types (i.e. `Map>`) are now properly msgpack encoded. -* [PR-1212](https://github.com/polywrap/toolchain/pull/1212) `polywrap` CLI: `wasm/rust` build image now uses the `build-deps` cargo extension to properly build dependencies in a seperate Dockerfile layer, enabling the caching of compiled artifacts. + +- [PR-1158](https://github.com/polywrap/toolchain/pull/1158) `@polywrap/client-config-builder-js`: The following plugins have been removed from the default config, and replaced with their WebAssembly wrapper equivalents available at the same URIs: + - `wrap://ens/uts46.polywrap.eth` + - `wrap://ens/sha3.polywrap.eth` + - `wrap://ens/graph-node.polywrap.eth` +- [PR-1213](https://github.com/polywrap/toolchain/pull/1213) `@polywrap/schema-bind`: Nested map types (i.e. `Map>`) are now properly supported for `wasm/rust` and `wasm/assemblyscript`. +- [PR-1213](https://github.com/polywrap/toolchain/pull/1213) `@polywrap/wasm-as`: Nested map types (i.e. `Map>`) are now properly msgpack encoded. +- [PR-1212](https://github.com/polywrap/toolchain/pull/1212) `polywrap` CLI: `wasm/rust` build image now uses the `build-deps` cargo extension to properly build dependencies in a seperate Dockerfile layer, enabling the caching of compiled artifacts. ## Breaking Changes -* [PR-1217](https://github.com/polywrap/toolchain/pull/1217) `@polywrap/schema-bind`: `plugin/typescript` and `app/typescript` bindings have been updated to improve type safety, and no longer accept generic properties for all method argument types. -* [PR-1051](https://github.com/polywrap/toolchain/pull/1051) `polywrap` CLI: `polywrap plugin codegen` and `polywrap app codegen` commands have been moved into the `polywrap codegen`, which can now generate types for any Polywrap project (wasm, plugin, app). -* [PR-1154](https://github.com/polywrap/toolchain/pull/1154) `@polywrap/schema-bind`: The `wasm/assemblyscript` bindings have been updated to use `Box | null` for all optional scalar types, instead of the `Option` class used before. -* [PR-1154](https://github.com/polywrap/toolchain/pull/1154) `@polywrap/ws-plugin-js`: The WebSocket plugin's schema has been updated to use `UInt32` for socket IDs, instead of `Int32`. + +- [PR-1217](https://github.com/polywrap/toolchain/pull/1217) `@polywrap/schema-bind`: `plugin/typescript` and `app/typescript` bindings have been updated to improve type safety, and no longer accept generic properties for all method argument types. +- [PR-1051](https://github.com/polywrap/toolchain/pull/1051) `polywrap` CLI: `polywrap plugin codegen` and `polywrap app codegen` commands have been moved into the `polywrap codegen`, which can now generate types for any Polywrap project (wasm, plugin, app). +- [PR-1154](https://github.com/polywrap/toolchain/pull/1154) `@polywrap/schema-bind`: The `wasm/assemblyscript` bindings have been updated to use `Box | null` for all optional scalar types, instead of the `Option` class used before. +- [PR-1154](https://github.com/polywrap/toolchain/pull/1154) `@polywrap/ws-plugin-js`: The WebSocket plugin's schema has been updated to use `UInt32` for socket IDs, instead of `Int32`. # Polywrap Origin (0.6.0) + ## Features -* [PR-1100](https://github.com/polywrap/toolchain/pull/1100) `polywrap` CLI: A new manifest named `polywrap.test.yaml` has been added, which encapsulates workflows and validation scripts. -* [PR-1100](https://github.com/polywrap/toolchain/pull/1100) `@polywrap/polywrap-manifest-types-js`: `polywrap.test` manifest types have been added. -* [PR-1100](https://github.com/polywrap/toolchain/pull/1100) `@polywrap/polywrap-manifest-schemas`: `polywrap.test` manifest schema has been added. + +- [PR-1100](https://github.com/polywrap/toolchain/pull/1100) `polywrap` CLI: A new manifest named `polywrap.test.yaml` has been added, which encapsulates workflows and validation scripts. +- [PR-1100](https://github.com/polywrap/toolchain/pull/1100) `@polywrap/polywrap-manifest-types-js`: `polywrap.test` manifest types have been added. +- [PR-1100](https://github.com/polywrap/toolchain/pull/1100) `@polywrap/polywrap-manifest-schemas`: `polywrap.test` manifest schema has been added. ## Bugs -* [PR-1205](https://github.com/polywrap/toolchain/pull/1205) `polywrap` CLI: The `run` command's output now has deterministic ordering for text emitted from both workflow & validation steps. -* [PR-1194](https://github.com/polywrap/toolchain/pull/1194) `@polywrap/msgpack-js`: Nested `Map` serialization is now supported. -* [PR-1199](https://github.com/polywrap/toolchain/pull/1199) `@polywrap/core-js` `@polywrap/client-js`: Runtime type inference has been improved to be compatible with JavaScript minimization optimizations where the `Class.name` static property is removed. -* [PR-1196](https://github.com/polywrap/toolchain/pull/1196) `@polywrap/core-js`: All `WrapperCache` interface methods have been updated to return `MaybeAsync` promises, allowing developers to implement async logic. + +- [PR-1205](https://github.com/polywrap/toolchain/pull/1205) `polywrap` CLI: The `run` command's output now has deterministic ordering for text emitted from both workflow & validation steps. +- [PR-1194](https://github.com/polywrap/toolchain/pull/1194) `@polywrap/msgpack-js`: Nested `Map` serialization is now supported. +- [PR-1199](https://github.com/polywrap/toolchain/pull/1199) `@polywrap/core-js` `@polywrap/client-js`: Runtime type inference has been improved to be compatible with JavaScript minimization optimizations where the `Class.name` static property is removed. +- [PR-1196](https://github.com/polywrap/toolchain/pull/1196) `@polywrap/core-js`: All `WrapperCache` interface methods have been updated to return `MaybeAsync` promises, allowing developers to implement async logic. ## Breaking Changes -* [PR-1100](https://github.com/polywrap/toolchain/pull/1100) `polywrap` CLI: `run` command no longer accepts the `` argument, and instead uses the new `polywrap.test.yaml` manifest. -* [PR-1100](https://github.com/polywrap/toolchain/pull/1100) `@polywrap/client-js`: The `run` method has been removed. -* [PR-1100](https://github.com/polywrap/toolchain/pull/1100) `@polywrap/core-js`: All `Workflow` related types have been removed, and migrated into the manifest packages and the CLI. + +- [PR-1100](https://github.com/polywrap/toolchain/pull/1100) `polywrap` CLI: `run` command no longer accepts the `` argument, and instead uses the new `polywrap.test.yaml` manifest. +- [PR-1100](https://github.com/polywrap/toolchain/pull/1100) `@polywrap/client-js`: The `run` method has been removed. +- [PR-1100](https://github.com/polywrap/toolchain/pull/1100) `@polywrap/core-js`: All `Workflow` related types have been removed, and migrated into the manifest packages and the CLI. # Polywrap Origin (0.5.0) + ## Features -* [PR-1042](https://github.com/polywrap/toolchain/pull/1042) `@polywrap/client-js`: The `PolywrapClientConfig` now has a `tracerConfig: Partial` property, allowing users to easily configure the tracing level, and various toggles related to tracing. -* [PR-1042](https://github.com/polywrap/toolchain/pull/1042) `polywrap` CLI: Added the `tracer` infra module, allowing developers to easily spin up an OpenTelemetry compatible tracing server. This can be used to gather runtime tracelog events from the `PolywrapClient`. -* [PR-1042](https://github.com/polywrap/toolchain/pull/1042) `@polywrap/tracing-js`: The `@Tracer.traceMethod()` function decorator now has an optional `TracingLevel` argument. -* [PR-1143](https://github.com/polywrap/toolchain/pull/1143) `@polywrap/ethereum-plugin-js`: The `EthereumPluginConfig` now has a `connections` property, which takes an instance of the `Connections` class. This new implementation makes configuring new network connections at runtime easier and more application developer friendly. -* [PR-1045](https://github.com/polywrap/toolchain/pull/1045) `@polywrap/client-config-builder-js`: The `ClientConfigBuilder` has been added to make building & customizing `PolywrapClientConfigs` easier than before with a simple user friendly interface. -* [PR-1036](https://github.com/polywrap/toolchain/pull/1036) `@polywrap/client-js`: Added the `wrapperCache: WrapperCache` property to the `PolywrapClientConfig` interface. -* [PR-1036](https://github.com/polywrap/toolchain/pull/1036) `@polywrap/core-js`: Added the `WrapperCache` core type, along with a `SimpleCache` implementation that persists wrappers within a map. + +- [PR-1042](https://github.com/polywrap/toolchain/pull/1042) `@polywrap/client-js`: The `PolywrapClientConfig` now has a `tracerConfig: Partial` property, allowing users to easily configure the tracing level, and various toggles related to tracing. +- [PR-1042](https://github.com/polywrap/toolchain/pull/1042) `polywrap` CLI: Added the `tracer` infra module, allowing developers to easily spin up an OpenTelemetry compatible tracing server. This can be used to gather runtime tracelog events from the `PolywrapClient`. +- [PR-1042](https://github.com/polywrap/toolchain/pull/1042) `@polywrap/tracing-js`: The `@Tracer.traceMethod()` function decorator now has an optional `TracingLevel` argument. +- [PR-1143](https://github.com/polywrap/toolchain/pull/1143) `@polywrap/ethereum-plugin-js`: The `EthereumPluginConfig` now has a `connections` property, which takes an instance of the `Connections` class. This new implementation makes configuring new network connections at runtime easier and more application developer friendly. +- [PR-1045](https://github.com/polywrap/toolchain/pull/1045) `@polywrap/client-config-builder-js`: The `ClientConfigBuilder` has been added to make building & customizing `PolywrapClientConfigs` easier than before with a simple user friendly interface. +- [PR-1036](https://github.com/polywrap/toolchain/pull/1036) `@polywrap/client-js`: Added the `wrapperCache: WrapperCache` property to the `PolywrapClientConfig` interface. +- [PR-1036](https://github.com/polywrap/toolchain/pull/1036) `@polywrap/core-js`: Added the `WrapperCache` core type, along with a `SimpleCache` implementation that persists wrappers within a map. ## Bugs -* [PR-1186](https://github.com/polywrap/toolchain/pull/1186) `@polywrap/schema-bind`: Using a `Map` type within the `Map`'s value (`V`) template argument has been fixed. -* [PR-1179](https://github.com/polywrap/toolchain/pull/1179) `polywrap` CLI: Improved the readability of the `polywrap build -v` command's output from the Docker child process. + +- [PR-1186](https://github.com/polywrap/toolchain/pull/1186) `@polywrap/schema-bind`: Using a `Map` type within the `Map`'s value (`V`) template argument has been fixed. +- [PR-1179](https://github.com/polywrap/toolchain/pull/1179) `polywrap` CLI: Improved the readability of the `polywrap build -v` command's output from the Docker child process. ## Breaking Changes -* [PR-1042](https://github.com/polywrap/toolchain/pull/1042) `@polywrap/client-js`: The `PolywrapClientConfig`'s `tracingEnabled` property has been removed, and replaced by `tracerConfig`. -* [PR-1143](https://github.com/polywrap/toolchain/pull/1143) `@polywrap/ethereum-plugin-js`: The `EthereumPluginConfig`'s `networks` property has been removed, and replaced by `connections`. -* [PR-1045](https://github.com/polywrap/toolchain/pull/1045) `@polywrap/client-js`: The `getDefaultClientConfig()` & `defaultIpfsProviders` exports have been moved to the `@polywrap/client-config-builder-js` package. + +- [PR-1042](https://github.com/polywrap/toolchain/pull/1042) `@polywrap/client-js`: The `PolywrapClientConfig`'s `tracingEnabled` property has been removed, and replaced by `tracerConfig`. +- [PR-1143](https://github.com/polywrap/toolchain/pull/1143) `@polywrap/ethereum-plugin-js`: The `EthereumPluginConfig`'s `networks` property has been removed, and replaced by `connections`. +- [PR-1045](https://github.com/polywrap/toolchain/pull/1045) `@polywrap/client-js`: The `getDefaultClientConfig()` & `defaultIpfsProviders` exports have been moved to the `@polywrap/client-config-builder-js` package. # Polywrap Origin (0.4.1) + ## Features -* [PR-1171](https://github.com/polywrap/monorepo/pull/1171) `@polywrap/schema-bind`: Handle reserve words (keywords) for object, enum, and method names. + +- [PR-1171](https://github.com/polywrap/monorepo/pull/1171) `@polywrap/schema-bind`: Handle reserve words (keywords) for object, enum, and method names. ## Bugs -* [PR-1168](https://github.com/polywrap/monorepo/pull/1168) `@polywrap/schema-bind`: Fix imported optional map issue in Rust bindings. -* [PR-1167](https://github.com/polywrap/monorepo/pull/1167) Remove all `wrap-man` folders, that were published to solve the plugin's circular dependency issue. + +- [PR-1168](https://github.com/polywrap/monorepo/pull/1168) `@polywrap/schema-bind`: Fix imported optional map issue in Rust bindings. +- [PR-1167](https://github.com/polywrap/monorepo/pull/1167) Remove all `wrap-man` folders, that were published to solve the plugin's circular dependency issue. # Polywrap Origin (0.4.0) + ## Features -* [PR-1091](https://github.com/polywrap/monorepo/pull/1091) `@polywrap/polywrap-manifest-schemas`: Polywrap project manifests (`polywrap.yaml`, `polywrap.app.yaml`, `polywrap.plugin.yaml`) have a new format `0.2.0`, which restructures the manifest into 3 top level properties: `project`, `source`, and `extensions`. Additionally all project manifests can be given the `polywrap.yaml` file name. -* [PR-1092](https://github.com/polywrap/monorepo/pull/1092) `@polywrap/ws-plugin-js`: Added a WebSocket plugin. -* [PR-1096](https://github.com/polywrap/monorepo/pull/1096) `@polywrap/client-js`: Expose the `noValidate` option for the `client.getManifest(...)` method. -* [PR-820](https://github.com/polywrap/monorepo/pull/820) `polywrap` CLI: `docgen` command added, allowing wrapper developers to easily generate documentation. Supported formats: schema, docusaurus, jsdoc. -* [PR-1068](https://github.com/polywrap/monorepo/pull/1068) `@polywrap/ethereum-plugin-js`: `requestAccounts` method added, which utilizes the `eth_requestAccounts` RPC method on the configured provider. + +- [PR-1091](https://github.com/polywrap/monorepo/pull/1091) `@polywrap/polywrap-manifest-schemas`: Polywrap project manifests (`polywrap.yaml`, `polywrap.app.yaml`, `polywrap.plugin.yaml`) have a new format `0.2.0`, which restructures the manifest into 3 top level properties: `project`, `source`, and `extensions`. Additionally all project manifests can be given the `polywrap.yaml` file name. +- [PR-1092](https://github.com/polywrap/monorepo/pull/1092) `@polywrap/ws-plugin-js`: Added a WebSocket plugin. +- [PR-1096](https://github.com/polywrap/monorepo/pull/1096) `@polywrap/client-js`: Expose the `noValidate` option for the `client.getManifest(...)` method. +- [PR-820](https://github.com/polywrap/monorepo/pull/820) `polywrap` CLI: `docgen` command added, allowing wrapper developers to easily generate documentation. Supported formats: schema, docusaurus, jsdoc. +- [PR-1068](https://github.com/polywrap/monorepo/pull/1068) `@polywrap/ethereum-plugin-js`: `requestAccounts` method added, which utilizes the `eth_requestAccounts` RPC method on the configured provider. ## Bugs -* [PR-1142](https://github.com/polywrap/monorepo/pull/1142) `wasm/rust`: `Map` bugs have been fixed. -* [PR-1140](https://github.com/polywrap/monorepo/pull/1140) `polywrap` CLI: Added a check to make sure the Docker daemon is running, and provides an informative error if it is not. -* [PR-1090](https://github.com/polywrap/monorepo/pull/1090) `polywrap/wrap-manifest-types-js`: Remove runtime schema bundling, which required file system access. -* [PR-1050](https://github.com/polywrap/monorepo/pull/1050) `polywrap` CLI: Errors encounted in child processes now output both `stdtypesout` and `stderr`, allowing easier end-user debugging. + +- [PR-1142](https://github.com/polywrap/monorepo/pull/1142) `wasm/rust`: `Map` bugs have been fixed. +- [PR-1140](https://github.com/polywrap/monorepo/pull/1140) `polywrap` CLI: Added a check to make sure the Docker daemon is running, and provides an informative error if it is not. +- [PR-1090](https://github.com/polywrap/monorepo/pull/1090) `polywrap/wrap-manifest-types-js`: Remove runtime schema bundling, which required file system access. +- [PR-1050](https://github.com/polywrap/monorepo/pull/1050) `polywrap` CLI: Errors encounted in child processes now output both `stdtypesout` and `stderr`, allowing easier end-user debugging. ## Breaking Changes -* [PR-1046](https://github.com/polywrap/monorepo/pull/1046) `polywrap` CLI: `schema.graphql` has been removed from wrapper build artifacts. `polywrap.plugin.yaml` has been removed from plugin build artifacts. -* [PR-1046](https://github.com/polywrap/monorepo/pull/1046) `@polywrap/schema-bind`: `schema.ts` has been removed from typescript bindings. -* [PR-1046](https://github.com/polywrap/monorepo/pull/1046) `@polywrap/schema-bind` `@polywrap/schema-compose`: `WrapAbi` is now used in all places, instead of schema documents. -* [PR-1095](https://github.com/polywrap/monorepo/pull/1095) `@polywrap/http-plugin-js`: Use `Map` for `headers` & `urlParams`. -* [PR-1073](https://github.com/polywrap/monorepo/pull/1073) `@polywrap/schema-compose`: The `ComposerOptions` property `schemas: SchemaFile[]` has been replaced with `schema: SchemaFile`. Additionally the function argument `schemas: SchemaFile[]` on the `resolveImports` function has bee replaced with `schema: SchemaFile`. -* [PR-1073](https://github.com/polywrap/monorepo/pull/1073) `@polywrap/wrap-manifest-types-js`: In `WrapAbi` format `0.1`, properties no longer accept `null` and instead use `undefined`. -* [PR-1073](https://github.com/polywrap/monorepo/pull/1073) `@polywrap/schema-parse`: `Abi` export renamed to `WrapAbi`. + +- [PR-1046](https://github.com/polywrap/monorepo/pull/1046) `polywrap` CLI: `schema.graphql` has been removed from wrapper build artifacts. `polywrap.plugin.yaml` has been removed from plugin build artifacts. +- [PR-1046](https://github.com/polywrap/monorepo/pull/1046) `@polywrap/schema-bind`: `schema.ts` has been removed from typescript bindings. +- [PR-1046](https://github.com/polywrap/monorepo/pull/1046) `@polywrap/schema-bind` `@polywrap/schema-compose`: `WrapAbi` is now used in all places, instead of schema documents. +- [PR-1095](https://github.com/polywrap/monorepo/pull/1095) `@polywrap/http-plugin-js`: Use `Map` for `headers` & `urlParams`. +- [PR-1073](https://github.com/polywrap/monorepo/pull/1073) `@polywrap/schema-compose`: The `ComposerOptions` property `schemas: SchemaFile[]` has been replaced with `schema: SchemaFile`. Additionally the function argument `schemas: SchemaFile[]` on the `resolveImports` function has bee replaced with `schema: SchemaFile`. +- [PR-1073](https://github.com/polywrap/monorepo/pull/1073) `@polywrap/wrap-manifest-types-js`: In `WrapAbi` format `0.1`, properties no longer accept `null` and instead use `undefined`. +- [PR-1073](https://github.com/polywrap/monorepo/pull/1073) `@polywrap/schema-parse`: `Abi` export renamed to `WrapAbi`. # Polywrap Origin (0.3.0) + ## Features -* [PR-1034](https://github.com/polywrap/monorepo/pull/1034) `@polywrap/wrap-manifest-schemas`, `@polywrap/wrap-manifest-types-js`: Added a JSON-schema for the `wrap.info`'s `abi` field. -* [PR-1058](https://github.com/polywrap/monorepo/pull/1058) `polywrap` CLI: Deploy results can now be output to a file using the `-o, --output-file ` option of the `deploy` command. + +- [PR-1034](https://github.com/polywrap/monorepo/pull/1034) `@polywrap/wrap-manifest-schemas`, `@polywrap/wrap-manifest-types-js`: Added a JSON-schema for the `wrap.info`'s `abi` field. +- [PR-1058](https://github.com/polywrap/monorepo/pull/1058) `polywrap` CLI: Deploy results can now be output to a file using the `-o, --output-file ` option of the `deploy` command. ## Bugs -* [PR-1034](https://github.com/polywrap/monorepo/pull/1034) `@polywrap/wrap-manifest-schemas`, `@polywrap/polywrap-manifest-schemas`: Version numbers for the manifest's `format: ...` field have been changed to only include `.` (ex: `0.1.0` is now `0.1`). This is because there cannot be a change to a pure interface that is a ``. -* [PR-1034](https://github.com/polywrap/monorepo/pull/1034) `@polywrap/package-validation`: The `wrap.info.abi` field is no longer being validated via schema rendering, and is instead utilizing the newly added JSON-schema. -* [PR-1054](https://github.com/polywrap/monorepo/pull/1054) `polywrap` CLI: Improved `wasm/rust` build times by refactoring the build image's Dockerfile, helping reduce cache invalidations. -* [PR-1053](https://github.com/polywrap/monorepo/pull/1053) `@polywrap/wasm-as`: Increased minor version of as-bignumber. The new version has a bug fix for the toFixed method, which was incorrectly printing numbers when a decimal number was rounded to an integer. + +- [PR-1034](https://github.com/polywrap/monorepo/pull/1034) `@polywrap/wrap-manifest-schemas`, `@polywrap/polywrap-manifest-schemas`: Version numbers for the manifest's `format: ...` field have been changed to only include `.` (ex: `0.1.0` is now `0.1`). This is because there cannot be a change to a pure interface that is a ``. +- [PR-1034](https://github.com/polywrap/monorepo/pull/1034) `@polywrap/package-validation`: The `wrap.info.abi` field is no longer being validated via schema rendering, and is instead utilizing the newly added JSON-schema. +- [PR-1054](https://github.com/polywrap/monorepo/pull/1054) `polywrap` CLI: Improved `wasm/rust` build times by refactoring the build image's Dockerfile, helping reduce cache invalidations. +- [PR-1053](https://github.com/polywrap/monorepo/pull/1053) `@polywrap/wasm-as`: Increased minor version of as-bignumber. The new version has a bug fix for the toFixed method, which was incorrectly printing numbers when a decimal number was rounded to an integer. ## Breaking Changes -* [PR-1034](https://github.com/polywrap/monorepo/pull/1034) `@polywrap/wrap-manifest-types-js`: `deserializeWrapManifest` is now `async`. + +- [PR-1034](https://github.com/polywrap/monorepo/pull/1034) `@polywrap/wrap-manifest-types-js`: `deserializeWrapManifest` is now `async`. # Polywrap Origin (0.2.0) + ## Bugs -* [PR-1040](https://github.com/polywrap/monorepo/pull/1040) `polywrap` CLI: Added proper CORS handling for the IPFS node located within the `eth-ens-ipfs` default infra module. + +- [PR-1040](https://github.com/polywrap/monorepo/pull/1040) `polywrap` CLI: Added proper CORS handling for the IPFS node located within the `eth-ens-ipfs` default infra module. ## Breaking Changes -* [PR-1035](https://github.com/polywrap/monorepo/pull/1035) `polywrap.meta` Manifest: Removed the `queries` property from version `0.1.0` of the manifest. -* [PR-1039](https://github.com/polywrap/monorepo/pull/1039) `@polywrap/ipfs-resolver-plugin-js`: Remove the `IpfsResolverPlugin`'s config, as it was never being used. + +- [PR-1035](https://github.com/polywrap/monorepo/pull/1035) `polywrap.meta` Manifest: Removed the `queries` property from version `0.1.0` of the manifest. +- [PR-1039](https://github.com/polywrap/monorepo/pull/1039) `@polywrap/ipfs-resolver-plugin-js`: Remove the `IpfsResolverPlugin`'s config, as it was never being used. # Polywrap Origin (0.1.1) + ## Features -* [PR-1017](https://github.com/polywrap/monorepo/pull/1017) `@polywrap/templates`, `polywrap` CLI: Rust wasm wrapper project template has been added, and made available via the `polywrap create ...` CLI command. + +- [PR-1017](https://github.com/polywrap/monorepo/pull/1017) `@polywrap/templates`, `polywrap` CLI: Rust wasm wrapper project template has been added, and made available via the `polywrap create ...` CLI command. ## Bugs -* [PR-1016](https://github.com/polywrap/monorepo/pull/1016) `polywrap` CLI: Improved logging when running workflows using the `polywrap run ...` command. -* [PR-924](https://github.com/polywrap/monorepo/pull/924) `@polywrap/schema-parse`, `@polywrap/schema-bind`: Complex `Map` type usages within wrapper schemas lead to incorrect bindings being generated. Additional tests + fixes have been added. + +- [PR-1016](https://github.com/polywrap/monorepo/pull/1016) `polywrap` CLI: Improved logging when running workflows using the `polywrap run ...` command. +- [PR-924](https://github.com/polywrap/monorepo/pull/924) `@polywrap/schema-parse`, `@polywrap/schema-bind`: Complex `Map` type usages within wrapper schemas lead to incorrect bindings being generated. Additional tests + fixes have been added. # Polywrap Origin (0.1.0) + ![Public Release Announcement (2)](https://user-images.githubusercontent.com/5522128/177474776-76886b67-6554-41a9-841b-939728e273ca.png) -*"Good evening traveler, welcome to Polywrap, a planet in the WRAP galaxy. We're happy to have you here. Ask around, I'm sure someone can help you navigate this place..." - NPC* +_"Good evening traveler, welcome to Polywrap, a planet in the WRAP galaxy. We're happy to have you here. Ask around, I'm sure someone can help you navigate this place..." - NPC_ https://polywrap.io/ # Polywrap 0.0.1-prealpha.93 + ## Breaking Changes -* [PR-986](https://github.com/polywrap/monorepo/pull/986) WRAP build artifacts have been refined: - * Wasm module name changed from `module.wasm` to `wrap.wasm` - * Polywrap manifests are no longer written to build folder (except for project metadata). - * The `wrap.info` is now the primary manifest file describing the wrapper: - * `{ version, type, name, abi }` - * [source](https://github.com/polywrap/monorepo/blob/7fd5b2faad2cb664044edde133d8e068d685d97a/packages/js/manifests/wrap/src/formats/wrap.info/0.0.1.ts) - * encoded as msgpack binary file - * `schema.graphql` remains but will be deprecated for `wrap.info`'s built-in `abi`. + +- [PR-986](https://github.com/polywrap/monorepo/pull/986) WRAP build artifacts have been refined: + - Wasm module name changed from `module.wasm` to `wrap.wasm` + - Polywrap manifests are no longer written to build folder (except for project metadata). + - The `wrap.info` is now the primary manifest file describing the wrapper: + - `{ version, type, name, abi }` + - [source](https://github.com/polywrap/monorepo/blob/7fd5b2faad2cb664044edde133d8e068d685d97a/packages/js/manifests/wrap/src/formats/wrap.info/0.0.1.ts) + - encoded as msgpack binary file + - `schema.graphql` remains but will be deprecated for `wrap.info`'s built-in `abi`. # Polywrap 0.0.1-prealpha.92 + ## Features -* [PR-1006](https://github.com/polywrap/monorepo/pull/1006/files) `polywrap-wasm-rs`: Add Rust encoder unit tests. -* [PR-967](https://github.com/polywrap/monorepo/pull/967) `polywrap` CLI, `polywrap-wasm-rs`, `@polywrap/wasm-as`, `@polywrap/schema-parse`, `@polywrap/schema-compose`, `@polywrap/schema-bind`, `@polywrap/core-js`, `@polywrap/client-js`: Environment configuration for wrappers was refactored to enable environments at the method level, remove client env sanitization and adding support for Rust. `@env` annotation was introduced for methods declared in wrappers's schemas. -* [PR-1005](https://github.com/polywrap/monorepo/pull/1005) `@polywrap/core-js`, `@polywrap/client-js`: Refactored `client.subscribe` to use invoke syntax. + +- [PR-1006](https://github.com/polywrap/monorepo/pull/1006/files) `polywrap-wasm-rs`: Add Rust encoder unit tests. +- [PR-967](https://github.com/polywrap/monorepo/pull/967) `polywrap` CLI, `polywrap-wasm-rs`, `@polywrap/wasm-as`, `@polywrap/schema-parse`, `@polywrap/schema-compose`, `@polywrap/schema-bind`, `@polywrap/core-js`, `@polywrap/client-js`: Environment configuration for wrappers was refactored to enable environments at the method level, remove client env sanitization and adding support for Rust. `@env` annotation was introduced for methods declared in wrappers's schemas. +- [PR-1005](https://github.com/polywrap/monorepo/pull/1005) `@polywrap/core-js`, `@polywrap/client-js`: Refactored `client.subscribe` to use invoke syntax. ## Breaking Changes -* [PR-967](https://github.com/polywrap/monorepo/pull/967) Wasm runtime (`polywrap-wasm-rs`, `@polywrap/wasm-as`) changed invoke signature and imports/exports, schema pipeline (`@polywrap/schema-parse`, `@polywrap/schema-compose`, `@polywrap/schema-bind`) now supports external env imports and TypeInfo and `@env` annotation for methods, `polywrap` changed compiler's imports, `@polywrap/core-js` changed Plugin interface, `@polywrap/client-js` changed environment model implementation. -* [PR-1005](https://github.com/polywrap/monorepo/pull/1005) `@polywrap/core-js`, `@polywrap/client-js`: Refactored `client.subscribe` to use invoke syntax. + +- [PR-967](https://github.com/polywrap/monorepo/pull/967) Wasm runtime (`polywrap-wasm-rs`, `@polywrap/wasm-as`) changed invoke signature and imports/exports, schema pipeline (`@polywrap/schema-parse`, `@polywrap/schema-compose`, `@polywrap/schema-bind`) now supports external env imports and TypeInfo and `@env` annotation for methods, `polywrap` changed compiler's imports, `@polywrap/core-js` changed Plugin interface, `@polywrap/client-js` changed environment model implementation. +- [PR-1005](https://github.com/polywrap/monorepo/pull/1005) `@polywrap/core-js`, `@polywrap/client-js`: Refactored `client.subscribe` to use invoke syntax. # Polywrap 0.0.1-prealpha.91 + ## Features -* [PR-989](https://github.com/polywrap/monorepo/pull/989/files) `@polywrap/core-js`: Add job status in workflow job's result object. -* [PR-992](https://github.com/polywrap/monorepo/pull/992) `polywrap` CLI: Allow configuring the client using the `--client-config` on all applicable commands. -* [PR-1000](https://github.com/polywrap/monorepo/pull/1000) `@polywrap/core-js`: Added the `encodeResult` property to `InvokeOptions`. -* [PR-1000](https://github.com/polywrap/monorepo/pull/1000) `@polywrap/core-js`: Introduced the concept of `Invoker` and `Invocable`. -* [PR-988](https://github.com/polywrap/monorepo/pull/988) `polywrap` CLI, `wasm/rust`: Updates to the default build-image (`Dockerfile`): - * Added the system dependencies `clang`, `llvm` and `build-essentials`. - * Added steps to remove any `wasm-bindgen` imports that may have been injected. + +- [PR-989](https://github.com/polywrap/monorepo/pull/989/files) `@polywrap/core-js`: Add job status in workflow job's result object. +- [PR-992](https://github.com/polywrap/monorepo/pull/992) `polywrap` CLI: Allow configuring the client using the `--client-config` on all applicable commands. +- [PR-1000](https://github.com/polywrap/monorepo/pull/1000) `@polywrap/core-js`: Added the `encodeResult` property to `InvokeOptions`. +- [PR-1000](https://github.com/polywrap/monorepo/pull/1000) `@polywrap/core-js`: Introduced the concept of `Invoker` and `Invocable`. +- [PR-988](https://github.com/polywrap/monorepo/pull/988) `polywrap` CLI, `wasm/rust`: Updates to the default build-image (`Dockerfile`): + - Added the system dependencies `clang`, `llvm` and `build-essentials`. + - Added steps to remove any `wasm-bindgen` imports that may have been injected. ## Bugs -* [PR-1000](https://github.com/polywrap/monorepo/pull/1000) Fixed inconsistencies around `ArrayBuffer` and `Uint8Array`. -* [PR-1000](https://github.com/polywrap/monorepo/pull/1000) `@polywrap/client-js`: The `noDecode` flag (renamed to `encodeResult`) now enfoces the decoding properly, where before it could get confused with returning `Bytes` from a wrapper. -* [PR-981](https://github.com/polywrap/monorepo/pull/981) `polywrap-wasm-rs`: Remove the `wrap-invoke` feature because it is not being used at the moment. + +- [PR-1000](https://github.com/polywrap/monorepo/pull/1000) Fixed inconsistencies around `ArrayBuffer` and `Uint8Array`. +- [PR-1000](https://github.com/polywrap/monorepo/pull/1000) `@polywrap/client-js`: The `noDecode` flag (renamed to `encodeResult`) now enfoces the decoding properly, where before it could get confused with returning `Bytes` from a wrapper. +- [PR-981](https://github.com/polywrap/monorepo/pull/981) `polywrap-wasm-rs`: Remove the `wrap-invoke` feature because it is not being used at the moment. ## Breaking Changes -* [PR-980](https://github.com/polywrap/monorepo/pull/980) `@polywrap/schema-parse`: Rename `TypeInfo` from `Abi`. + +- [PR-980](https://github.com/polywrap/monorepo/pull/980) `@polywrap/schema-parse`: Rename `TypeInfo` from `Abi`. # Polywrap 0.0.1-prealpha.90 + ## Features -* [PR-912](https://github.com/polywrap/monorepo/pull/912) [PR-930](https://github.com/polywrap/monorepo/pull/930) [PR-958](https://github.com/polywrap/monorepo/pull/958) All URI resolver extensions have been decoupled and moved into their own plugin packages: - * `@polywrap/fs-resolver-plugin-js` - * `@polywrap/ipfs-resolver-plugin-js` - * `@polywrap/ens-resolver-plugin-js` -* [PR-912](https://github.com/polywrap/monorepo/pull/912) `@polywrap/file-system-interface` has been created to help standardize FileSystem wrapper implementations. -* [PR-930](https://github.com/polywrap/monorepo/pull/930) `@polywrap/ipfs-interface` has been created to help standardize IPFS wrapper implementations. + +- [PR-912](https://github.com/polywrap/monorepo/pull/912) [PR-930](https://github.com/polywrap/monorepo/pull/930) [PR-958](https://github.com/polywrap/monorepo/pull/958) All URI resolver extensions have been decoupled and moved into their own plugin packages: + - `@polywrap/fs-resolver-plugin-js` + - `@polywrap/ipfs-resolver-plugin-js` + - `@polywrap/ens-resolver-plugin-js` +- [PR-912](https://github.com/polywrap/monorepo/pull/912) `@polywrap/file-system-interface` has been created to help standardize FileSystem wrapper implementations. +- [PR-930](https://github.com/polywrap/monorepo/pull/930) `@polywrap/ipfs-interface` has been created to help standardize IPFS wrapper implementations. ## Bugs -* [PR-957](https://github.com/polywrap/monorepo/pull/957) `@polywrap/schema-bind`: `plugin/typescript` module config type interfaces no longer inherit from `Record`, making them more type-safe and less generic. + +- [PR-957](https://github.com/polywrap/monorepo/pull/957) `@polywrap/schema-bind`: `plugin/typescript` module config type interfaces no longer inherit from `Record`, making them more type-safe and less generic. ## Breaking Changes -* [PR-937](https://github.com/polywrap/monorepo/issues/937) [PR-960](https://github.com/polywrap/monorepo/pull/960) The term `Nullable` has been changed to `Optional` within the `wasm` wrapper codegen. Additionally in `wasm/assemblyscript` the `Nullable` type has been changed to a rust-style `Optional` type. -* [PR-972](https://github.com/polywrap/monorepo/pull/972) The term `input` in the context of invocations has been renamed to `args`. -* [PR-976](https://github.com/polywrap/monorepo/pull/976) The invocation `resultFilter` option has been deprecated, as it is a needless & unused feature. + +- [PR-937](https://github.com/polywrap/monorepo/issues/937) [PR-960](https://github.com/polywrap/monorepo/pull/960) The term `Nullable` has been changed to `Optional` within the `wasm` wrapper codegen. Additionally in `wasm/assemblyscript` the `Nullable` type has been changed to a rust-style `Optional` type. +- [PR-972](https://github.com/polywrap/monorepo/pull/972) The term `input` in the context of invocations has been renamed to `args`. +- [PR-976](https://github.com/polywrap/monorepo/pull/976) The invocation `resultFilter` option has been deprecated, as it is a needless & unused feature. # Polywrap 0.0.1-prealpha.89 + ## Features -* [PR-903](https://github.com/polywrap/monorepo/pull/903) `polywrap` CLI: Recipes have been re-worked into composable workflows, and they can be run using CLI commands. -* [PR-951](https://github.com/polywrap/monorepo/pull/951) `polywrap` CLI: Docker Buildx output option has been removed. -* [PR-944](https://github.com/polywrap/monorepo/pull/944) `@polywrap/schema-bind`, `@polywrap/wasm-as`: `Nullable` type has been replaced with `Option` in the Assemblyscript schema bindings. -* [PR-938](https://github.com/polywrap/monorepo/pull/938) `@polywrap/schema-bind`, `@polywrap/wasm-as`: Rollback of JSON serialization in the Assemblyscript schema bindings. + +- [PR-903](https://github.com/polywrap/monorepo/pull/903) `polywrap` CLI: Recipes have been re-worked into composable workflows, and they can be run using CLI commands. +- [PR-951](https://github.com/polywrap/monorepo/pull/951) `polywrap` CLI: Docker Buildx output option has been removed. +- [PR-944](https://github.com/polywrap/monorepo/pull/944) `@polywrap/schema-bind`, `@polywrap/wasm-as`: `Nullable` type has been replaced with `Option` in the Assemblyscript schema bindings. +- [PR-938](https://github.com/polywrap/monorepo/pull/938) `@polywrap/schema-bind`, `@polywrap/wasm-as`: Rollback of JSON serialization in the Assemblyscript schema bindings. ## Bugs -* [PR-946](https://github.com/polywrap/monorepo/pull/946) `@polywrap/test-env-js`: Path fix for `npmCLI` test utility. + +- [PR-946](https://github.com/polywrap/monorepo/pull/946) `@polywrap/test-env-js`: Path fix for `npmCLI` test utility. ## Breaking Changes -* [PR-903](https://github.com/polywrap/monorepo/pull/903) `polywrap` CLI: Running recipes via the `polywrap query ...` command has been deprecated in favor of a new workflows system, accessible via the `polywrap run ...` command. -* [PR-944](https://github.com/polywrap/monorepo/pull/944) `wasm/assemblyscript` Wrappers: `Nullable` type has been removed in favor of `Option` which also has a different interface. -* [PR-938](https://github.com/polywrap/monorepo/pull/938) `wasm/assemblyscript` Wrappers: `JSON` serializer and deserializer, and related methods `fromJson` and `toJson` have been removed in favor of `parse` and `stringify`. + +- [PR-903](https://github.com/polywrap/monorepo/pull/903) `polywrap` CLI: Running recipes via the `polywrap query ...` command has been deprecated in favor of a new workflows system, accessible via the `polywrap run ...` command. +- [PR-944](https://github.com/polywrap/monorepo/pull/944) `wasm/assemblyscript` Wrappers: `Nullable` type has been removed in favor of `Option` which also has a different interface. +- [PR-938](https://github.com/polywrap/monorepo/pull/938) `wasm/assemblyscript` Wrappers: `JSON` serializer and deserializer, and related methods `fromJson` and `toJson` have been removed in favor of `parse` and `stringify`. # Polywrap 0.0.1-prealpha.88 + ## Bugs -* Various CI/CD fixes. + +- Various CI/CD fixes. # Polywrap 0.0.1-prealpha.87 + ## Features -* [PR-928](https://github.com/polywrap/monorepo/pull/928) `@polywrap/manifest-schemas`: Inline documentation has been added to manifest JSON-schemas. -* [PR-933](https://github.com/polywrap/monorepo/pull/933) Validation package `@polywrap/package-validation` has been implemented to validate WASM wrapper packages. + +- [PR-928](https://github.com/polywrap/monorepo/pull/928) `@polywrap/manifest-schemas`: Inline documentation has been added to manifest JSON-schemas. +- [PR-933](https://github.com/polywrap/monorepo/pull/933) Validation package `@polywrap/package-validation` has been implemented to validate WASM wrapper packages. ## Bugs -* [PR-932](https://github.com/polywrap/monorepo/pull/932) `@polywrap/schema-bind`: Minor fix for JSON type schema bindings -* [PR-935](https://github.com/polywrap/monorepo/pull/935) `@polywrap/test-env-js`: Path fix for `npmCLI` test utility + +- [PR-932](https://github.com/polywrap/monorepo/pull/932) `@polywrap/schema-bind`: Minor fix for JSON type schema bindings +- [PR-935](https://github.com/polywrap/monorepo/pull/935) `@polywrap/test-env-js`: Path fix for `npmCLI` test utility # Polywrap 0.0.1-prealpha.86 + ## Features -* [PR-923](https://github.com/polywrap/monorepo/pull/923) The Polywrap brand has been applied to the codebase. -* [PR-906](https://github.com/polywrap/monorepo/pull/906) The concept of `Mutation` and `Query` modules has been deprecated. Now all wrapper methods are defined within a single `Module`. + +- [PR-923](https://github.com/polywrap/monorepo/pull/923) The Polywrap brand has been applied to the codebase. +- [PR-906](https://github.com/polywrap/monorepo/pull/906) The concept of `Mutation` and `Query` modules has been deprecated. Now all wrapper methods are defined within a single `Module`. ## Breaking Changes -* [PR-923](https://github.com/polywrap/monorepo/pull/923) All prior integrations using the "Web3API" packages must upgrade to the new "Polywrap" equivalents. -* [PR-906](https://github.com/polywrap/monorepo/pull/906) All wrappers created prior to this change are incompatible. + +- [PR-923](https://github.com/polywrap/monorepo/pull/923) All prior integrations using the "Web3API" packages must upgrade to the new "Polywrap" equivalents. +- [PR-906](https://github.com/polywrap/monorepo/pull/906) All wrappers created prior to this change are incompatible. # Web3API 0.0.1-prealpha.85 + ## Features -* [PR-910](https://github.com/polywrap/monorepo/pull/910) `@web3api/cli`: `web3api.infra.yaml` manifests now support the concept of "default" modules. -* [PR-878](https://github.com/polywrap/monorepo/pull/878) `@web3api/client-js`: `Workflows` can now be run using the `client.run(...)` method. Integration into the Polywrap CLI will be released in the near future. + +- [PR-910](https://github.com/polywrap/monorepo/pull/910) `@web3api/cli`: `web3api.infra.yaml` manifests now support the concept of "default" modules. +- [PR-878](https://github.com/polywrap/monorepo/pull/878) `@web3api/client-js`: `Workflows` can now be run using the `client.run(...)` method. Integration into the Polywrap CLI will be released in the near future. ## Bugs -* [PR-908](https://github.com/polywrap/monorepo/pull/908) `@web3api/asyncify-js`: Improved WebAssembly import sanitization has been added, resolving an ambiguous error that was found when extraneous imports were added to a built module. -* [PR-902](https://github.com/polywrap/monorepo/pull/902) `@web3api/cli`: `w3 create plugin ...` & `w3 create app ...` now properly parse their expected `language` and `name` arguments. + +- [PR-908](https://github.com/polywrap/monorepo/pull/908) `@web3api/asyncify-js`: Improved WebAssembly import sanitization has been added, resolving an ambiguous error that was found when extraneous imports were added to a built module. +- [PR-902](https://github.com/polywrap/monorepo/pull/902) `@web3api/cli`: `w3 create plugin ...` & `w3 create app ...` now properly parse their expected `language` and `name` arguments. # Web3API 0.0.1-prealpha.84 + ## Features -* [PR-328](https://github.com/polywrap/monorepo/pull/328) `@web3api/infra`: A modular infrastructure pipeline has been added to the CLI, available via the `w3 infra ...` command. This command allows for custom infra modules to be defined and combined, able to support any 3rd party services your development requires. This command supersedes the old `w3 test-env ...` command. -* [PR-898](https://github.com/polywrap/monorepo/pull/898) `@web3api/cli`: The `wasm/rust` default build image has been updated to include the `wasm-snip` utility, which helps remove dead code from the wasm modules in a post-processing step. This has reduce the average Rust-based wasm module's size by ~85%. -* [PR-885](https://github.com/polywrap/monorepo/pull/885) `@web3api/test-env-js`: A `buildApi` helper function has been added. + +- [PR-328](https://github.com/polywrap/monorepo/pull/328) `@web3api/infra`: A modular infrastructure pipeline has been added to the CLI, available via the `w3 infra ...` command. This command allows for custom infra modules to be defined and combined, able to support any 3rd party services your development requires. This command supersedes the old `w3 test-env ...` command. +- [PR-898](https://github.com/polywrap/monorepo/pull/898) `@web3api/cli`: The `wasm/rust` default build image has been updated to include the `wasm-snip` utility, which helps remove dead code from the wasm modules in a post-processing step. This has reduce the average Rust-based wasm module's size by ~85%. +- [PR-885](https://github.com/polywrap/monorepo/pull/885) `@web3api/test-env-js`: A `buildApi` helper function has been added. ## Breaking Changes -* [PR-328](https://github.com/polywrap/monorepo/pull/328) `@web3api/cli`: The `w3 test-env ...` command has been removed and replaced by the `w3 infra ...` command. + +- [PR-328](https://github.com/polywrap/monorepo/pull/328) `@web3api/cli`: The `w3 test-env ...` command has been removed and replaced by the `w3 infra ...` command. # Web3API 0.0.1-prealpha.83 + ## Features -* [PR-870](https://github.com/polywrap/monorepo/pull/870) `@web3api/cli`: The `web3api.deploy.yaml` manifest file now supports the use of environment variables. -* [PR-866](https://github.com/polywrap/monorepo/pull/866) `@web3api/test-env-js`: The `buildAndDeployApi` test utility now supports recursive ENS subdomain registration. + +- [PR-870](https://github.com/polywrap/monorepo/pull/870) `@web3api/cli`: The `web3api.deploy.yaml` manifest file now supports the use of environment variables. +- [PR-866](https://github.com/polywrap/monorepo/pull/866) `@web3api/test-env-js`: The `buildAndDeployApi` test utility now supports recursive ENS subdomain registration. ## Bugs -* [PR-884](https://github.com/polywrap/monorepo/pull/884) `@web3api/client-js`: Plugin registrations are now properly sanitized, and overridden plugins will be removed from the plugins array. -* [PR-892](https://github.com/polywrap/monorepo/pull/892) `@web3api/cli`: Some minor fixes have been made to the `wasm/rust` build image's default Dockerfile. + +- [PR-884](https://github.com/polywrap/monorepo/pull/884) `@web3api/client-js`: Plugin registrations are now properly sanitized, and overridden plugins will be removed from the plugins array. +- [PR-892](https://github.com/polywrap/monorepo/pull/892) `@web3api/cli`: Some minor fixes have been made to the `wasm/rust` build image's default Dockerfile. # Web3API 0.0.1-prealpha.82 + ## Features -* [PR-699](https://github.com/polywrap/monorepo/pull/699) `@web3api/cli`: Support for Rust based WebAssembly wrappers has been added. + +- [PR-699](https://github.com/polywrap/monorepo/pull/699) `@web3api/cli`: Support for Rust based WebAssembly wrappers has been added. ## Breaking Changes -* [PR-872](https://github.com/polywrap/monorepo/pull/872) `@web3api/schema-bind`: TypeScript bindings for both app & plugin projects now use `ArrayBuffer` to represent the schema's `Bytes` type, instead of the previous `Uint8Array`. + +- [PR-872](https://github.com/polywrap/monorepo/pull/872) `@web3api/schema-bind`: TypeScript bindings for both app & plugin projects now use `ArrayBuffer` to represent the schema's `Bytes` type, instead of the previous `Uint8Array`. # Web3API 0.0.1-prealpha.81 + ## Features -* [PR-864](https://github.com/polywrap/monorepo/pull/864) `@web3api/react`: `useWeb3ApiInvoke` and `useWeb3ApiQuery` hooks now support configuring the client's environment, along with all other configuration options. -* [PR-808](https://github.com/polywrap/monorepo/pull/808) `@web3api/cli`: The `web3api.build.yaml` manifest now supports additional docker buildkit configuration options, including: - * local docker image layer cache - * custom image output location - * remove image after build - * remove builder instance after build -* [PR-827](https://github.com/polywrap/monorepo/pull/827) `@web3api/ethereum-plugin-js`: The provider's connection can now be configured via the wrapper's environment. -* [PR-807](https://github.com/polywrap/monorepo/pull/807) `@web3api/cli`: Make the CLI's Docker file-lock project specific, instead of global to the CLI installation. -## Bugs -* [PR-847](https://github.com/polywrap/monorepo/pull/847) `@web3api/templates`: The template projects used for the `w3 create ...` CLI command now have proper CI setup, and multiple bugs were fixed within them. -* [PR-861](https://github.com/polywrap/monorepo/pull/861) `@web3api/test-env-js`: The `buildAndDeployApi` function's `ensName` no longer assumes the `.eth` TLD is ommitted, and requires the user to provide it along with the domain name. This was the original behavior, and was modified in release `0.0.1-prealpha.75`. + +- [PR-864](https://github.com/polywrap/monorepo/pull/864) `@web3api/react`: `useWeb3ApiInvoke` and `useWeb3ApiQuery` hooks now support configuring the client's environment, along with all other configuration options. +- [PR-808](https://github.com/polywrap/monorepo/pull/808) `@web3api/cli`: The `web3api.build.yaml` manifest now supports additional docker buildkit configuration options, including: + - local docker image layer cache + - custom image output location + - remove image after build + - remove builder instance after build +- [PR-827](https://github.com/polywrap/monorepo/pull/827) `@web3api/ethereum-plugin-js`: The provider's connection can now be configured via the wrapper's environment. +- [PR-807](https://github.com/polywrap/monorepo/pull/807) `@web3api/cli`: Make the CLI's Docker file-lock project specific, instead of global to the CLI installation. + +## Bugs + +- [PR-847](https://github.com/polywrap/monorepo/pull/847) `@web3api/templates`: The template projects used for the `w3 create ...` CLI command now have proper CI setup, and multiple bugs were fixed within them. +- [PR-861](https://github.com/polywrap/monorepo/pull/861) `@web3api/test-env-js`: The `buildAndDeployApi` function's `ensName` no longer assumes the `.eth` TLD is ommitted, and requires the user to provide it along with the domain name. This was the original behavior, and was modified in release `0.0.1-prealpha.75`. + ## Breaking Changes -* [PR-859](https://github.com/polywrap/monorepo/pull/859) `@web3api/cli`: The CLI is now built using the `commander` package. The CLI's help text formatting has changed in structure as a result. + +- [PR-859](https://github.com/polywrap/monorepo/pull/859) `@web3api/cli`: The CLI is now built using the `commander` package. The CLI's help text formatting has changed in structure as a result. # Web3API 0.0.1-prealpha.80 + ## Bugs -* [PR-855](https://github.com/polywrap/monorepo/pull/855) Pinned `@types/prettier` to version `2.6.0` to fix [an issue](https://github.com/DefinitelyTyped/DefinitelyTyped/discussions/60310) that was created by the latest release. + +- [PR-855](https://github.com/polywrap/monorepo/pull/855) Pinned `@types/prettier` to version `2.6.0` to fix [an issue](https://github.com/DefinitelyTyped/DefinitelyTyped/discussions/60310) that was created by the latest release. # Web3API 0.0.1-prealpha.79 + ## Bugs -* [PR-852](https://github.com/polywrap/monorepo/pull/852) `@web3api/client-test-env`: The IPFS node's API endpoint now has CORS enabled via the following configuration properties: - * API.HTTPHeaders.Access-Control-Allow-Origin: `["*"]` - * API.HTTPHeaders.Access-Control-Allow-Methods: `["GET", "POST", "PUT", "DELETE"]` + +- [PR-852](https://github.com/polywrap/monorepo/pull/852) `@web3api/client-test-env`: The IPFS node's API endpoint now has CORS enabled via the following configuration properties: + - API.HTTPHeaders.Access-Control-Allow-Origin: `["*"]` + - API.HTTPHeaders.Access-Control-Allow-Methods: `["GET", "POST", "PUT", "DELETE"]` # Web3API 0.0.1-prealpha.78 + ## Bugs -* Pinned `@types/prettier` to version `2.6.0` to fix [an issue](https://github.com/DefinitelyTyped/DefinitelyTyped/discussions/60310) that was created by the latest release. + +- Pinned `@types/prettier` to version `2.6.0` to fix [an issue](https://github.com/DefinitelyTyped/DefinitelyTyped/discussions/60310) that was created by the latest release. # Web3API 0.0.1-prealpha.77 + ## Features -* [PR-846](https://github.com/polywrap/monorepo/pull/846) `@web3api/wasm-as`: Add support for automatic JSON serialization via the `@serial-as/transform` `asc` compiler transformation. -* [PR-846](https://github.com/polywrap/monorepo/pull/846) `@web3api/schema-bind`: Assemblyscript object types now have `Type.toJson(type)` and `Type.fromJson(json)` static helper methods added to all class instances. -* [PR-840](https://github.com/polywrap/monorepo/pull/840) `@web3api/cli`: Allow `async getClientConfig` functions within modules passed into the `w3 query` command's `--client-config` option. + +- [PR-846](https://github.com/polywrap/monorepo/pull/846) `@web3api/wasm-as`: Add support for automatic JSON serialization via the `@serial-as/transform` `asc` compiler transformation. +- [PR-846](https://github.com/polywrap/monorepo/pull/846) `@web3api/schema-bind`: Assemblyscript object types now have `Type.toJson(type)` and `Type.fromJson(json)` static helper methods added to all class instances. +- [PR-840](https://github.com/polywrap/monorepo/pull/840) `@web3api/cli`: Allow `async getClientConfig` functions within modules passed into the `w3 query` command's `--client-config` option. # Web3API 0.0.1-prealpha.76 + ## Bugs -* [PR-836](https://github.com/polywrap/monorepo/pull/836) `@web3api/cli`: All commands properly handle the `--help` option. + +- [PR-836](https://github.com/polywrap/monorepo/pull/836) `@web3api/cli`: All commands properly handle the `--help` option. # Web3API 0.0.1-prealpha.75 + ## Features -* [PR-814](https://github.com/polywrap/monorepo/pull/814) `@web3api/cli`: A modular deployment pipeline has been added to the CLI. It can be accessed via the `w3 deploy` command. + +- [PR-814](https://github.com/polywrap/monorepo/pull/814) `@web3api/cli`: A modular deployment pipeline has been added to the CLI. It can be accessed via the `w3 deploy` command. # Web3API 0.0.1-prealpha.74 + ## Bugs -* `@web3api/schema-bind`: Fix incorrect export from `plugin-ts` bindings. + +- `@web3api/schema-bind`: Fix incorrect export from `plugin-ts` bindings. # Web3API 0.0.1-prealpha.73 + ## Bugs -* [PR-821](https://github.com/polywrap/monorepo/pull/821) `@web3api/cli`: Fixed a codegen issue when generating types for plugins with only one module. + +- [PR-821](https://github.com/polywrap/monorepo/pull/821) `@web3api/cli`: Fixed a codegen issue when generating types for plugins with only one module. # Web3API 0.0.1-prealpha.72 + ## Features -* [PR-620](https://github.com/polywrap/monorepo/pull/620) Plugin DevExp Improvements: The plugin developer experience has been revised to be very close to the API development experience. -* [PR-697](https://github.com/polywrap/monorepo/pull/697) `BigNumber` Schema Type: The `BigNumber` type is now available for use as a base type for Web3API schemas. -* [PR-802](https://github.com/polywrap/monorepo/pull/802) `@web3api/cli`: `w3 query ...` command now supports the following options: - * `-o, --output-file`: Output file path for the query result. - * `-q, --quiet`: Suppress output. -* [PR-790](https://github.com/polywrap/monorepo/pull/790) `@web3api/schema-bind`: `wasm-as` bindings have been updated to include a helper function `requireEnv()`, which can be used to check if the environment is null or not. -* [PR-795](https://github.com/polywrap/monorepo/pull/795) `@web3api/templates`: The AssemblyScript & interface templates used for the `w3 create api ...` command has been updated to include metadata (descriptions, icons, etc). -* [PR-794](https://github.com/polywrap/monorepo/pull/794) `@web3api/templates`: The AssemblyScript template used for the `w3 create api assemblyscript ...` command has been updated to include e2e tests. + +- [PR-620](https://github.com/polywrap/monorepo/pull/620) Plugin DevExp Improvements: The plugin developer experience has been revised to be very close to the API development experience. +- [PR-697](https://github.com/polywrap/monorepo/pull/697) `BigNumber` Schema Type: The `BigNumber` type is now available for use as a base type for Web3API schemas. +- [PR-802](https://github.com/polywrap/monorepo/pull/802) `@web3api/cli`: `w3 query ...` command now supports the following options: + - `-o, --output-file`: Output file path for the query result. + - `-q, --quiet`: Suppress output. +- [PR-790](https://github.com/polywrap/monorepo/pull/790) `@web3api/schema-bind`: `wasm-as` bindings have been updated to include a helper function `requireEnv()`, which can be used to check if the environment is null or not. +- [PR-795](https://github.com/polywrap/monorepo/pull/795) `@web3api/templates`: The AssemblyScript & interface templates used for the `w3 create api ...` command has been updated to include metadata (descriptions, icons, etc). +- [PR-794](https://github.com/polywrap/monorepo/pull/794) `@web3api/templates`: The AssemblyScript template used for the `w3 create api assemblyscript ...` command has been updated to include e2e tests. # Web3API 0.0.1-prealpha.71 + ## Features -* [PR-777](https://github.com/polywrap/monorepo/pull/777) `@web3api/client-js`: The `Web3ApiClient` now has a public method `loadUriResolvers()`, which will pre-fetch all URI resolver implementations. + +- [PR-777](https://github.com/polywrap/monorepo/pull/777) `@web3api/client-js`: The `Web3ApiClient` now has a public method `loadUriResolvers()`, which will pre-fetch all URI resolver implementations. ## Bugs -* [Issue-715](https://github.com/polywrap/monorepo/pull/777) [PR-777](https://github.com/polywrap/monorepo/pull/777) `@web3api/client-js`: Custom URI resolver implementations now no longer cause an infinite loop during URI resolution. + +- [Issue-715](https://github.com/polywrap/monorepo/pull/777) [PR-777](https://github.com/polywrap/monorepo/pull/777) `@web3api/client-js`: Custom URI resolver implementations now no longer cause an infinite loop during URI resolution. ## Breaking Changes -* [PR-777](https://github.com/polywrap/monorepo/pull/777) `@web3api/client-js`: `Web3ApiClient` public method `getResolvers(...)` renamed to `getUriResolvers(...)`. -* [PR-777](https://github.com/polywrap/monorepo/pull/777) `@web3api/client-js`: `Web3ApiClientConfig` property `resolvers` renamed to `uriResolvers`. + +- [PR-777](https://github.com/polywrap/monorepo/pull/777) `@web3api/client-js`: `Web3ApiClient` public method `getResolvers(...)` renamed to `getUriResolvers(...)`. +- [PR-777](https://github.com/polywrap/monorepo/pull/777) `@web3api/client-js`: `Web3ApiClientConfig` property `resolvers` renamed to `uriResolvers`. # Web3API 0.0.1-prealpha.70 + ## Bugs -* `@web3api/core-js`: Fixed the manifest migration script for `web3api.meta` from v1 to v3. The `name` property is now migrating properly to `displayName`. + +- `@web3api/core-js`: Fixed the manifest migration script for `web3api.meta` from v1 to v3. The `name` property is now migrating properly to `displayName`. # Web3API 0.0.1-prealpha.69 + ## Features -* [PR-669](https://github.com/polywrap/monorepo/pull/669) `Map` schema base-type has been added. -* [PR-761](https://github.com/polywrap/monorepo/pull/761) Modules now subinvoke interface implementation wrappers through the `__w3_subinvokeImplementation` host import. This now gives us a specific import function for these sort of invocations, which can allow for additional types of verification features to be added by clients. -* [PR-769](https://github.com/polywrap/monorepo/pull/769) `@web3api/schema-bind`: Add support for `getImplementations` capability in TypeScript plugin (`plugin-ts`) codegen. -* [PR-763](https://github.com/polywrap/monorepo/pull/763) `@web3api/schema-bind`: The `schema-bind` project is now "module agnostic" and accepts an array of arbitrary modules, which it will pass directly to the different binding projects (`wasm-as`, `plugin-ts`, `app-ts`, etc). -* [PR-759](https://github.com/polywrap/monorepo/pull/759) `@web3api/manifest-schemas`: Added the `name: string` property to the `web3api` manifest. -* [PR-759](https://github.com/polywrap/monorepo/pull/759) `@web3api/manifest-schemas`: Renamed `web3api.meta`'s `name` property to `displayName`. -* [PR-772](https://github.com/polywrap/monorepo/pull/772) `@web3api/manifest-schemas`: Added the `tags: string[]` property to the `web3api.meta` manifest, allowing wrapper to developers to add tag keywords to their package's metadata, helping improve searchability on package indexers like The Polywrap Hub. -* [PR-747](https://github.com/polywrap/monorepo/pull/747) `@web3api/ethereum-plugin-js`: Changed all instances of the `chainId` property's type to `BigInt` from `UInt32`. -* [PR-776](https://github.com/polywrap/monorepo/pull/776) `@web3api/ethereum-plugin-js`: Added `getBalance` to the `Query` module, allowing callers to check the native balance of arbitrary addresses. + +- [PR-669](https://github.com/polywrap/monorepo/pull/669) `Map` schema base-type has been added. +- [PR-761](https://github.com/polywrap/monorepo/pull/761) Modules now subinvoke interface implementation wrappers through the `__w3_subinvokeImplementation` host import. This now gives us a specific import function for these sort of invocations, which can allow for additional types of verification features to be added by clients. +- [PR-769](https://github.com/polywrap/monorepo/pull/769) `@web3api/schema-bind`: Add support for `getImplementations` capability in TypeScript plugin (`plugin-ts`) codegen. +- [PR-763](https://github.com/polywrap/monorepo/pull/763) `@web3api/schema-bind`: The `schema-bind` project is now "module agnostic" and accepts an array of arbitrary modules, which it will pass directly to the different binding projects (`wasm-as`, `plugin-ts`, `app-ts`, etc). +- [PR-759](https://github.com/polywrap/monorepo/pull/759) `@web3api/manifest-schemas`: Added the `name: string` property to the `web3api` manifest. +- [PR-759](https://github.com/polywrap/monorepo/pull/759) `@web3api/manifest-schemas`: Renamed `web3api.meta`'s `name` property to `displayName`. +- [PR-772](https://github.com/polywrap/monorepo/pull/772) `@web3api/manifest-schemas`: Added the `tags: string[]` property to the `web3api.meta` manifest, allowing wrapper to developers to add tag keywords to their package's metadata, helping improve searchability on package indexers like The Polywrap Hub. +- [PR-747](https://github.com/polywrap/monorepo/pull/747) `@web3api/ethereum-plugin-js`: Changed all instances of the `chainId` property's type to `BigInt` from `UInt32`. +- [PR-776](https://github.com/polywrap/monorepo/pull/776) `@web3api/ethereum-plugin-js`: Added `getBalance` to the `Query` module, allowing callers to check the native balance of arbitrary addresses. ## Breaking Changes -* [PR-669](https://github.com/polywrap/monorepo/pull/669) Wrappers that utilize the new `Map` schema base-type will break forward compatability of Polywrap clients. - * Relevant Downstream Dependencies: `@web3api/client-js` -* [PR-761](https://github.com/polywrap/monorepo/pull/761) Modules that use the `getImplementations` capability for interfaces will now require the following host imports: `__w3_subinvokeImplementation`, `__w3_subinvokeImplementation_result_len`, `__w3_subinvokeImplementation_result`, `__w3_subinvokeImplementation_error_len`, `__w3_subinvokeImplementation_error` - * Relevant Upstream Dependencies: `@web3api/wasm-as`, `@web3api/schema-bind`, `@web3api/cli`, `@web3api/client-js` -* [PR-763](https://github.com/polywrap/monorepo/pull/763) `@web3api/schema-bind`: The entry point function's input & output types have changed. -* [PR-763](https://github.com/polywrap/monorepo/pull/763) `@web3api/cli`: The type of the expected export from user-defined codegen scripts has changed from: + +- [PR-669](https://github.com/polywrap/monorepo/pull/669) Wrappers that utilize the new `Map` schema base-type will break forward compatability of Polywrap clients. + - Relevant Downstream Dependencies: `@web3api/client-js` +- [PR-761](https://github.com/polywrap/monorepo/pull/761) Modules that use the `getImplementations` capability for interfaces will now require the following host imports: `__w3_subinvokeImplementation`, `__w3_subinvokeImplementation_result_len`, `__w3_subinvokeImplementation_result`, `__w3_subinvokeImplementation_error_len`, `__w3_subinvokeImplementation_error` + - Relevant Upstream Dependencies: `@web3api/wasm-as`, `@web3api/schema-bind`, `@web3api/cli`, `@web3api/client-js` +- [PR-763](https://github.com/polywrap/monorepo/pull/763) `@web3api/schema-bind`: The entry point function's input & output types have changed. +- [PR-763](https://github.com/polywrap/monorepo/pull/763) `@web3api/cli`: The type of the expected export from user-defined codegen scripts has changed from: + ```typescript generateBinding = ( output: OutputDirectory, @@ -832,443 +1025,602 @@ generateBinding = ( config: Record ) => void; ``` + to + ```typescript -generateBinding = ( - options: BindOptions -) => BindOutput; +generateBinding = (options: BindOptions) => BindOutput; ``` ## Bugs -* [PR-766](https://github.com/polywrap/monorepo/pull/766) `@web3api/client-js`: User-configured interface implementations now extend the default configuration's, instead of overwritting them. + +- [PR-766](https://github.com/polywrap/monorepo/pull/766) `@web3api/client-js`: User-configured interface implementations now extend the default configuration's, instead of overwritting them. # Web3API 0.0.1-prealpha.68 + ## Bugs -* [PR-756](https://github.com/polywrap/monorepo/pull/756) `@web3api/schema-bind`: Imported enums are properly included in the schema bindings when there are no objects imported. + +- [PR-756](https://github.com/polywrap/monorepo/pull/756) `@web3api/schema-bind`: Imported enums are properly included in the schema bindings when there are no objects imported. # Web3API 0.0.1-prealpha.67 + ## Features -* [PR-726](https://github.com/polywrap/monorepo/pull/726) Improved the application developer experience by creating a new `w3 app codegen` command, which generated types based on the apps wrapper / plugin integrations. For an example of how this works, see the updated application template projects by running `w3 create app typescript-node my-app` or `w3 create app typescript-react my-app`. -* [PR-726](https://github.com/polywrap/monorepo/pull/726) `@web3api/react`: Added the `useWeb3ApiInvoke` hook as a non-graphql alternative to `useWeb3ApiQuery`. -* [PR-726](https://github.com/polywrap/monorepo/pull/726) `@web3api/schema-compose`: Importing all dependency types from a schema import schema statement can now be done through the new wild-card syntax: `#import * into Namespace from "w3://authority/path"`. + +- [PR-726](https://github.com/polywrap/monorepo/pull/726) Improved the application developer experience by creating a new `w3 app codegen` command, which generated types based on the apps wrapper / plugin integrations. For an example of how this works, see the updated application template projects by running `w3 create app typescript-node my-app` or `w3 create app typescript-react my-app`. +- [PR-726](https://github.com/polywrap/monorepo/pull/726) `@web3api/react`: Added the `useWeb3ApiInvoke` hook as a non-graphql alternative to `useWeb3ApiQuery`. +- [PR-726](https://github.com/polywrap/monorepo/pull/726) `@web3api/schema-compose`: Importing all dependency types from a schema import schema statement can now be done through the new wild-card syntax: `#import * into Namespace from "w3://authority/path"`. ## Breaking Changes -* [PR-726](https://github.com/polywrap/monorepo/pull/726) `@web3api/cli`: `w3 build` CLI command now requires the use of the `--manifest-file ` option in order to specify a custom build manifest file path. -* [PR-726](https://github.com/polywrap/monorepo/pull/726) `@web3api/cli`: `w3 codegen` CLI command option renaming: - * `-m, --manifest-path ` to `-m, --manifest-file ` - * `-c, --custom ` to `-s, --script ` - * `-o, --output-dir ` to `-c, --codegen-dir ` -* [PR-726](https://github.com/polywrap/monorepo/pull/726) `@web3api/cli`: `w3 plugin` CLI command option renaming: - * `-m, --manifest-path ` to `-m, --manifest-file ` + +- [PR-726](https://github.com/polywrap/monorepo/pull/726) `@web3api/cli`: `w3 build` CLI command now requires the use of the `--manifest-file ` option in order to specify a custom build manifest file path. +- [PR-726](https://github.com/polywrap/monorepo/pull/726) `@web3api/cli`: `w3 codegen` CLI command option renaming: + - `-m, --manifest-path ` to `-m, --manifest-file ` + - `-c, --custom ` to `-s, --script ` + - `-o, --output-dir ` to `-c, --codegen-dir ` +- [PR-726](https://github.com/polywrap/monorepo/pull/726) `@web3api/cli`: `w3 plugin` CLI command option renaming: + - `-m, --manifest-path ` to `-m, --manifest-file ` # Web3API 0.0.1-prealpha.66 + ## Features -* [PR-718](https://github.com/polywrap/monorepo/pull/718) `@web3api/cli`: `w3 plugin codegen` now outputs the plugin manifest to the build directory. -* [PR-695](https://github.com/polywrap/monorepo/pull/695) `@web3api/ethereum-plugin-js`: Added Query methods: `solidityPack`, `solidityKeccak256`, `soliditySha256`. + +- [PR-718](https://github.com/polywrap/monorepo/pull/718) `@web3api/cli`: `w3 plugin codegen` now outputs the plugin manifest to the build directory. +- [PR-695](https://github.com/polywrap/monorepo/pull/695) `@web3api/ethereum-plugin-js`: Added Query methods: `solidityPack`, `solidityKeccak256`, `soliditySha256`. ## Breaking Changes -* [PR-718](https://github.com/polywrap/monorepo/pull/718) `@web3api/cli`: `w3 plugin codegen` option `-s, --output-schema-path` changed to `-p, --publish-dir`. -* [PR-718](https://github.com/polywrap/monorepo/pull/718) `@web3api/cli`: `w3 plugin codegen` option `-t, --output-types-dir` changed to `-c, --codegen-dir`. + +- [PR-718](https://github.com/polywrap/monorepo/pull/718) `@web3api/cli`: `w3 plugin codegen` option `-s, --output-schema-path` changed to `-p, --publish-dir`. +- [PR-718](https://github.com/polywrap/monorepo/pull/718) `@web3api/cli`: `w3 plugin codegen` option `-t, --output-types-dir` changed to `-c, --codegen-dir`. # Web3API 0.0.1-prealpha.65 + ## Bugs -* [PR-690](https://github.com/polywrap/monorepo/pull/690) `@web3api/http-plugin-js`: Better axios response header handling for lists. -* [PR-692](https://github.com/polywrap/monorepo/pull/692) `@web3api/wasm-as`: Properly propogate `Result` error upon unwrap exception. + +- [PR-690](https://github.com/polywrap/monorepo/pull/690) `@web3api/http-plugin-js`: Better axios response header handling for lists. +- [PR-692](https://github.com/polywrap/monorepo/pull/692) `@web3api/wasm-as`: Properly propogate `Result` error upon unwrap exception. # Web3API 0.0.1-prealpha.64 + ## Bugs -* [PR-685](https://github.com/polywrap/monorepo/pull/685) `@web3api/schema-parse`: Properly support recursive object definition properties. + +- [PR-685](https://github.com/polywrap/monorepo/pull/685) `@web3api/schema-parse`: Properly support recursive object definition properties. # Web3API 0.0.1-prealpha.63 + ## Features -* [PR-650](https://github.com/polywrap/monorepo/pull/650) `@web3api/cli`: Add YAML support for query recipes. -* [PR-385](https://github.com/polywrap/monorepo/pull/385) `@web3api/cli`, `@web3api/client-js`: Use JSON for manifest build artifacts. -* [PR-678](https://github.com/polywrap/monorepo/pull/678) `@web3api/cli`: Build command no longer uses same docker image name by default. The concept of a "build UUID" has been added, and will be appended to the docker image name (if the develoer has not specified their own inside `web3api.build.yaml`). -* [PR-610](https://github.com/polywrap/monorepo/pull/610) `@web3api/client-js`: Support the `resolveUri(...)` method on `Web3ApiClient` instances. + +- [PR-650](https://github.com/polywrap/monorepo/pull/650) `@web3api/cli`: Add YAML support for query recipes. +- [PR-385](https://github.com/polywrap/monorepo/pull/385) `@web3api/cli`, `@web3api/client-js`: Use JSON for manifest build artifacts. +- [PR-678](https://github.com/polywrap/monorepo/pull/678) `@web3api/cli`: Build command no longer uses same docker image name by default. The concept of a "build UUID" has been added, and will be appended to the docker image name (if the develoer has not specified their own inside `web3api.build.yaml`). +- [PR-610](https://github.com/polywrap/monorepo/pull/610) `@web3api/client-js`: Support the `resolveUri(...)` method on `Web3ApiClient` instances. ## Bugs -* [PR-665](https://github.com/polywrap/monorepo/pull/665) `@web3api/ethereum-plugin-js`: Fix `TxRequest` property mapping to ethers.js types. -* [PR-672](https://github.com/polywrap/monorepo/pull/672) `@web3api/core-js`, `@web3api/schema-bind`, `@web3api/schema-parse`: Remove use of the JS string `.substr` method. -* [PR-673](https://github.com/polywrap/monorepo/pull/673) `@web3api/cli`: The `w3 query ...` command now property sets `exitCode` to 1 if a query fails. -* [PR-651](https://github.com/polywrap/monorepo/pull/651) `@web3api/http-plugin-js`: JSON payloads are now property supported. + +- [PR-665](https://github.com/polywrap/monorepo/pull/665) `@web3api/ethereum-plugin-js`: Fix `TxRequest` property mapping to ethers.js types. +- [PR-672](https://github.com/polywrap/monorepo/pull/672) `@web3api/core-js`, `@web3api/schema-bind`, `@web3api/schema-parse`: Remove use of the JS string `.substr` method. +- [PR-673](https://github.com/polywrap/monorepo/pull/673) `@web3api/cli`: The `w3 query ...` command now property sets `exitCode` to 1 if a query fails. +- [PR-651](https://github.com/polywrap/monorepo/pull/651) `@web3api/http-plugin-js`: JSON payloads are now property supported. ## Breaking Changes -* [PR-674](https://github.com/polywrap/monorepo/pull/674) `@web3api/cli`, `@web3api/schema-bind`: Return `Result` objects from all AssemblyScript subinvoke methods. + +- [PR-674](https://github.com/polywrap/monorepo/pull/674) `@web3api/cli`, `@web3api/schema-bind`: Return `Result` objects from all AssemblyScript subinvoke methods. # Web3API 0.0.1-prealpha.62 + ## Features -* Use the https://ipfs.wrappers.io IPFS gateway throughout the codebase. -* Rename TypeInfo `queryTypes` & `importedQueryTypes` to `moduleTypes` & `importedModuleTypes`. -* `@web3api/ipfs-plugin-js`: Improve the IPFS plugin's URI resolver implementation, and add the ability to query from multiple gateways in parallel. + +- Use the https://ipfs.wrappers.io IPFS gateway throughout the codebase. +- Rename TypeInfo `queryTypes` & `importedQueryTypes` to `moduleTypes` & `importedModuleTypes`. +- `@web3api/ipfs-plugin-js`: Improve the IPFS plugin's URI resolver implementation, and add the ability to query from multiple gateways in parallel. # Web3API 0.0.1-prealpha.61 + ## Features -* `@web3api/cli`: Added the `--client-config` / `-c` option to the `w3 query` CLI command, allowing the user the define their own client configurations within a JavaScript or TypeScript module. -* `@web3api/client-js`: Plugins can now be initialized with the client's environment registered at the plugin's URI. + +- `@web3api/cli`: Added the `--client-config` / `-c` option to the `w3 query` CLI command, allowing the user the define their own client configurations within a JavaScript or TypeScript module. +- `@web3api/client-js`: Plugins can now be initialized with the client's environment registered at the plugin's URI. ## Bugs -* `@web3api/schema-bind`: Properly handle reserve words for the bind target's language. Reserved words will be prepended with `m_` in order to avoid compiler errors. + +- `@web3api/schema-bind`: Properly handle reserve words for the bind target's language. Reserved words will be prepended with `m_` in order to avoid compiler errors. # Web3API 0.0.1-prealpha.60 + ## Breaking Changes -* `@web3api/schema-compose`: `ComposerOptions` property `schemas` is now of type `Record` and not `Record`. -* `@web3api/schema-bind`: `TargetLanguage` type has been renamed to `BindLanguage`. -* `@web3api/schema-bind`: `BindOptions` property `language` has been renamed to `bindLanguage`. + +- `@web3api/schema-compose`: `ComposerOptions` property `schemas` is now of type `Record` and not `Record`. +- `@web3api/schema-bind`: `TargetLanguage` type has been renamed to `BindLanguage`. +- `@web3api/schema-bind`: `BindOptions` property `language` has been renamed to `bindLanguage`. ## Bugs -* `@web3api/cli`: Properly resolve NPM dependency `colors` due to it being [corrupted](https://www.bleepingcomputer.com/news/security/dev-corrupts-npm-libs-colors-and-faker-breaking-thousands-of-apps/). -* `@web3api/cli`: Plugin schema codegen now properly represents imports types from both Query and Mutation modules. -* `@web3api/cli`: Properly defined the separation of the `ManifestLanguage` and `BindLanguage` (ex: wasm/assemblyscript -> wasm-as). -* `@web3api/schema-compose`: Introduce the concept of a `SchemaKind` to help determine how schemas should be combined. -* `@web3api/schema-compose`: Allow plugins to import mutations within their schemas. -* `@web3api/schema-bind`: Introduced the concept of `BindTarget` to represent a list of known-good bind targets (`wasm-as`, `plugin-ts`, etc). + +- `@web3api/cli`: Properly resolve NPM dependency `colors` due to it being [corrupted](https://www.bleepingcomputer.com/news/security/dev-corrupts-npm-libs-colors-and-faker-breaking-thousands-of-apps/). +- `@web3api/cli`: Plugin schema codegen now properly represents imports types from both Query and Mutation modules. +- `@web3api/cli`: Properly defined the separation of the `ManifestLanguage` and `BindLanguage` (ex: wasm/assemblyscript -> wasm-as). +- `@web3api/schema-compose`: Introduce the concept of a `SchemaKind` to help determine how schemas should be combined. +- `@web3api/schema-compose`: Allow plugins to import mutations within their schemas. +- `@web3api/schema-bind`: Introduced the concept of `BindTarget` to represent a list of known-good bind targets (`wasm-as`, `plugin-ts`, etc). # Web3API 0.0.1-prealpha.59 + ## Features -* Web3APIs can now be configured via environment variables. Documentation will be created soon. Initial details on this features specification can be found [here](https://github.com/polywrap/monorepo/issues/140). + +- Web3APIs can now be configured via environment variables. Documentation will be created soon. Initial details on this features specification can be found [here](https://github.com/polywrap/monorepo/issues/140). # Web3API 0.0.1-prealpha.58 + ## Features -* `@web3api/client-js`: Added `noDecode` invocation option. -* `@web3api/client-js`: Added `noDefaults` constructor option. + +- `@web3api/client-js`: Added `noDecode` invocation option. +- `@web3api/client-js`: Added `noDefaults` constructor option. ## Bugs -* `@web3api/ethereum-plugin-js`: The `encodeParams` now properly parses arguments of type Array & Tuple. + +- `@web3api/ethereum-plugin-js`: The `encodeParams` now properly parses arguments of type Array & Tuple. # Web3API 0.0.1-prealpha.57 + ## Features -* `@web3api/cli`: CLI command middleware support has been added. The first use-cases implemented are to help ensure Docker is available to the CLI instance, and not in-use by another CLI instance. -* `@web3api/client-js`: Query-time configuration overrides have been added, allowing developers to define new configurations without having to re-create the client instance. + +- `@web3api/cli`: CLI command middleware support has been added. The first use-cases implemented are to help ensure Docker is available to the CLI instance, and not in-use by another CLI instance. +- `@web3api/client-js`: Query-time configuration overrides have been added, allowing developers to define new configurations without having to re-create the client instance. ## Bugs -* `@web3api/asyncify-js`: Fixed issue [#570](https://github.com/polywrap/monorepo/issues/570) by using a node-version-agnostic way of indexing into the Uint8Array buffer. + +- `@web3api/asyncify-js`: Fixed issue [#570](https://github.com/polywrap/monorepo/issues/570) by using a node-version-agnostic way of indexing into the Uint8Array buffer. # Web3API 0.0.1-prealpha.56 + ## Bugs -* `@web3api/ethereum-plugin-js`: The encodeFunction now support array & object arg types. + +- `@web3api/ethereum-plugin-js`: The encodeFunction now support array & object arg types. # Web3API 0.0.1-prealpha.55 + ## Bugs -* `@web3api/schema-compose`: Properly support empty schema types. -* `@web3api/asyncify-js`: Fixed a low-level inconsistency between Wasm modules when using imported memory. More details [here](https://github.com/polywrap/monorepo/issues/561). -* `@web3api/schema-bind`: Fixed issue where imports were inconsistent between `serialization.ts` assemblyscript files, and some necessary imports were missing. + +- `@web3api/schema-compose`: Properly support empty schema types. +- `@web3api/asyncify-js`: Fixed a low-level inconsistency between Wasm modules when using imported memory. More details [here](https://github.com/polywrap/monorepo/issues/561). +- `@web3api/schema-bind`: Fixed issue where imports were inconsistent between `serialization.ts` assemblyscript files, and some necessary imports were missing. # Web3API 0.0.1-prealpha.54 + ## Features -* `@web3api/ethereum-plugin-js`: Added `getNetwork` to the Ethereum plugin's `Query` module. + +- `@web3api/ethereum-plugin-js`: Added `getNetwork` to the Ethereum plugin's `Query` module. # Web3API 0.0.1-prealpha.53 + ## Features -* `as-bigint` upgraded to version `0.4.0`. Improvements made found [here](https://github.com/polywrap/monorepo/pull/552). + +- `as-bigint` upgraded to version `0.4.0`. Improvements made found [here](https://github.com/polywrap/monorepo/pull/552). # Web3API 0.0.1-prealpha.52 + ## Features -* Querying an interface implementation's modules given its URI is now supported within Wasm. + +- Querying an interface implementation's modules given its URI is now supported within Wasm. # Web3API 0.0.1-prealpha.51 + ## Features -* `as-bigint` upgraded to version `0.3.2`. Improvements made found [here](https://github.com/polywrap/monorepo/pull/535). + +- `as-bigint` upgraded to version `0.3.2`. Improvements made found [here](https://github.com/polywrap/monorepo/pull/535). # Web3API 0.0.1-prealpha.50 + ## Features -* Getting the implementations of an interface is now supported from within Wasm. -* `@web3api/tracing-js`: Added a class method decorator for tracing. + +- Getting the implementations of an interface is now supported from within Wasm. +- `@web3api/tracing-js`: Added a class method decorator for tracing. # Web3API 0.0.1-prealpha.49 + ## Features -* `@web3api/fs-plugin-js`: Added a "File System" plugin, which implements the `uri-resolver` interface, enabling users to load Web3API packages from their local filesystem. For example, a user could specify the URI `/fs/path/to/package/directory`. -* Upgraded the toolchain's Node.JS version to 16.13.0, which solves compatibility issues with Mac computers using the new M1 processor. + +- `@web3api/fs-plugin-js`: Added a "File System" plugin, which implements the `uri-resolver` interface, enabling users to load Web3API packages from their local filesystem. For example, a user could specify the URI `/fs/path/to/package/directory`. +- Upgraded the toolchain's Node.JS version to 16.13.0, which solves compatibility issues with Mac computers using the new M1 processor. ## Bugs -* `@web3api/cli`: Fixed the `w3 query ...` command's recipe variable parsing logic, better supporting arrays and objects. -* `@web3api/schema-compose`: Improved import parsing, and added support for recursive schema imports. + +- `@web3api/cli`: Fixed the `w3 query ...` command's recipe variable parsing logic, better supporting arrays and objects. +- `@web3api/schema-compose`: Improved import parsing, and added support for recursive schema imports. # Web3API 0.0.1-prealpha.48 + ## Bugs -* `@web3api/test-env-js`: Allow the usage of this package as an npm package outside of the monorepo folder structure. + +- `@web3api/test-env-js`: Allow the usage of this package as an npm package outside of the monorepo folder structure. # Web3API 0.0.1-prealpha.47 + ## Features -* `@web3api/client-js`: Add the Graph Node plugin to the client's default configuration. -* `@web3api/ethereum-plugin-js`: Add the `encodeFunction` query method, allowing callers to encode smart contract methods w/ argument values. + +- `@web3api/client-js`: Add the Graph Node plugin to the client's default configuration. +- `@web3api/ethereum-plugin-js`: Add the `encodeFunction` query method, allowing callers to encode smart contract methods w/ argument values. # Web3API 0.0.1-prealpha.46 + ## Bugs -* `@web3api/core-js`: Properly check for "undefined" values in query arguments. -* `@web3api/wasm-as`: Improved MsgPack deserialization of integers (signed & unsigned). + +- `@web3api/core-js`: Properly check for "undefined" values in query arguments. +- `@web3api/wasm-as`: Improved MsgPack deserialization of integers (signed & unsigned). # Web3API 0.0.1-prealpha.45 + ## Features -* `@web3api/tracing-js`: Support service name configuration. + +- `@web3api/tracing-js`: Support service name configuration. # Web3API 0.0.1-prealpha.44 + ## Features -* `@web3api/client-js`: Use Fleek's IPFS gateway. + +- `@web3api/client-js`: Use Fleek's IPFS gateway. # Web3API 0.0.1-prealpha.43 + ## Features -* `@web3api/client-js`: Added the `client.subscribe(...)` method, enabling users to easily send queries at a specified frequency. + +- `@web3api/client-js`: Added the `client.subscribe(...)` method, enabling users to easily send queries at a specified frequency. ## Bugs -* `@web3api/tracing-js`: Replaced the `util-inspect` dependency with a browser compatible one. + +- `@web3api/tracing-js`: Replaced the `util-inspect` dependency with a browser compatible one. # Web3API 0.0.1-prealpha.42 + ## Bugs -* `@web3api/schema-parse`: Removed unnecessary sanitization for imported methods without any arguments. + +- `@web3api/schema-parse`: Removed unnecessary sanitization for imported methods without any arguments. # Web3API 0.0.1-prealpha.41 + ## Features -* `@web3api/schema-parse`: Added support for `JSON` as a base type. -* `@web3api/ens-api`: Merged in an initial version of the ENS Wasm based Web3Api. -* `web3api.build.yaml`: Added support for the `linked_packages` property, allowing you to link local packages into the dockerized build-env. + +- `@web3api/schema-parse`: Added support for `JSON` as a base type. +- `@web3api/ens-api`: Merged in an initial version of the ENS Wasm based Web3Api. +- `web3api.build.yaml`: Added support for the `linked_packages` property, allowing you to link local packages into the dockerized build-env. ## Bugs -* `@web3api/schema-compose`: Fixed an invalid GraphQL bug that occured when an imported query method did not have any arguments. + +- `@web3api/schema-compose`: Fixed an invalid GraphQL bug that occured when an imported query method did not have any arguments. # Web3API 0.0.1-prealpha.40 + ## Features -* `@web3api/client-js`: Added `getManifest(...)`, `getFile(...)`, and `getSchema(...)` methods to the client, simply provide a URI. -* `@web3api/cli`: APIs can now define metadata via the `web3api.meta.yaml` manifest file. Upon compiling your project, the CLI will copy all referenced metadata files into the build directory. Applications such as The Polywrap Hub will use this metadata file to display details about your package such as: title, description, icon, example queries, etc. + +- `@web3api/client-js`: Added `getManifest(...)`, `getFile(...)`, and `getSchema(...)` methods to the client, simply provide a URI. +- `@web3api/cli`: APIs can now define metadata via the `web3api.meta.yaml` manifest file. Upon compiling your project, the CLI will copy all referenced metadata files into the build directory. Applications such as The Polywrap Hub will use this metadata file to display details about your package such as: title, description, icon, example queries, etc. ## Bugs -* `@web3api/schema-parse`: Duplicate fields on object & query types are not detected, and will cause a compiler error. + +- `@web3api/schema-parse`: Duplicate fields on object & query types are not detected, and will cause a compiler error. ## Breaking Changes -* `@web3api/client-js`: Removed the `loadWeb3Api(...)` method from the client. This is because we do not want to give the user of the client a direct reference to the underlying API class object. Since garbage collection will delete these, having the user able to hang onto references, will result in them staying in memory. + +- `@web3api/client-js`: Removed the `loadWeb3Api(...)` method from the client. This is because we do not want to give the user of the client a direct reference to the underlying API class object. Since garbage collection will delete these, having the user able to hang onto references, will result in them staying in memory. # Web3API 0.0.1-prealpha.39 + ## Features -* `@web3api/client-js`: Added `https://polywrap-dev.mypinata.cloud` and `https://ipfs.infura.io` as default fallback IPFS providers. + +- `@web3api/client-js`: Added `https://polywrap-dev.mypinata.cloud` and `https://ipfs.infura.io` as default fallback IPFS providers. ## Bugs -* `@web3api/ipfs-plugin-js`: Fallback providers are now used if an error is encountered, not just for timeouts. + +- `@web3api/ipfs-plugin-js`: Fallback providers are now used if an error is encountered, not just for timeouts. # Web3API 0.0.1-prealpha.38 + ## Breaking Changes -* `@web3api/client-js`: Removed the usage of `_w3_init`, as it's unnecessary and caused issues with adding Rust-Wasm support. + +- `@web3api/client-js`: Removed the usage of `_w3_init`, as it's unnecessary and caused issues with adding Rust-Wasm support. # Web3API 0.0.1-prealpha.37 + ## Bugs -* `@web3api/asyncify-js`: Fixed problem when Wasm modules are larger than 4 KB. More info [here](https://github.com/polywrap/monorepo/pull/450). -* `@web3api/client-js`: Use new asyncify-js package, where instantiation is asynchronous. + +- `@web3api/asyncify-js`: Fixed problem when Wasm modules are larger than 4 KB. More info [here](https://github.com/polywrap/monorepo/pull/450). +- `@web3api/client-js`: Use new asyncify-js package, where instantiation is asynchronous. # Web3API 0.0.1-prealpha.36 + ## Features -* Upgrade all JavaScript plugins to use the new `w3 plugin codegen` command. The command generates typings based on the GraphQL schema of the plugin. This ensures the plugin's resolvers match 1:1 with the GraphQL schema. + +- Upgrade all JavaScript plugins to use the new `w3 plugin codegen` command. The command generates typings based on the GraphQL schema of the plugin. This ensures the plugin's resolvers match 1:1 with the GraphQL schema. # Web3API 0.0.1-prealpha.35 + ## Bugs -* `@web3api/schema-bind`: Fix TypeScript plugin enum bindings. + +- `@web3api/schema-bind`: Fix TypeScript plugin enum bindings. # Web3API 0.0.1-prealpha.34 + ## Bugs -* `@web3api/schema-bind`: Fix TypeScript enum bindings. -* `@web3api/graph-node-plugin-js`: Fix mismatched schema. + +- `@web3api/schema-bind`: Fix TypeScript enum bindings. +- `@web3api/graph-node-plugin-js`: Fix mismatched schema. # Web3API 0.0.1-prealpha.33 + ## Bugs -* `@web3api/schema-bind`: Fixed plugin code generation oversight. Should be using `null` instead of `undefined`. + +- `@web3api/schema-bind`: Fixed plugin code generation oversight. Should be using `null` instead of `undefined`. # Web3API 0.0.1-prealpha.32 + ## Features -* Improved the plugin developer experience by creating a new `w3 plugin codegen` command, which generated types based on the plugin's schema. For an example of how this works, see the updated plugin template project by running `w3 create plugin typescript my-plugin`. -* `@web3api/cli`: Refactored the `w3 codegen` command, making its default behavior the generation of types for Web3APIs. It's "old" behavior of loading a custom generation script is now usable through the `--custom` option. + +- Improved the plugin developer experience by creating a new `w3 plugin codegen` command, which generated types based on the plugin's schema. For an example of how this works, see the updated plugin template project by running `w3 create plugin typescript my-plugin`. +- `@web3api/cli`: Refactored the `w3 codegen` command, making its default behavior the generation of types for Web3APIs. It's "old" behavior of loading a custom generation script is now usable through the `--custom` option. ## Bugs -* `@web3api/cli`: Properly validate all required Wasm exports when compiling Web3APIs. + +- `@web3api/cli`: Properly validate all required Wasm exports when compiling Web3APIs. # Web3API 0.0.1-prealpha.31 + ## Features -* Use Binaryen's Asyncify to support async Wasm import calls. Deprecate the Wasm threading model we were using previously. This now means that the client now supports all browsers, as it no longer requires `SharedArrayBuffer` & the `atomics` library. -* `@web3api/graph-node-plugin-js`: Finalized the graph-node plugin implementation, added e2e tests. It currently only works with the hosted service. + +- Use Binaryen's Asyncify to support async Wasm import calls. Deprecate the Wasm threading model we were using previously. This now means that the client now supports all browsers, as it no longer requires `SharedArrayBuffer` & the `atomics` library. +- `@web3api/graph-node-plugin-js`: Finalized the graph-node plugin implementation, added e2e tests. It currently only works with the hosted service. ## Bugs -* Removed support for UInt64 & Int64 base types. More info [here](https://github.com/polywrap/monorepo/pull/414). -* `@web3api/cli`: Properly validate all required exports from Web3API Wasm modules at compile-time. -* `@web3api/ethereum-plugin-js`: Properly support smart contract methods with structures as arguments. + +- Removed support for UInt64 & Int64 base types. More info [here](https://github.com/polywrap/monorepo/pull/414). +- `@web3api/cli`: Properly validate all required exports from Web3API Wasm modules at compile-time. +- `@web3api/ethereum-plugin-js`: Properly support smart contract methods with structures as arguments. # Web3API 0.0.1-prealpha.30 + ## Bugs -* `@web3api/ethereum-plugin-js`: Fix ethers.js inconsistencies. + +- `@web3api/ethereum-plugin-js`: Fix ethers.js inconsistencies. # Web3API 0.0.1-prealpha.29 + ## Feature -* Web3API Interfaces are now fully supported in the tool-chain. -* GraphQL schema comments are now retained, and will show up in the build folder. -* `@web3api/parse`: Reference types definitions are now differentiated from the root definitions the reference. + +- Web3API Interfaces are now fully supported in the tool-chain. +- GraphQL schema comments are now retained, and will show up in the build folder. +- `@web3api/parse`: Reference types definitions are now differentiated from the root definitions the reference. ## Bugs -* `@web3api/cli`: Fix MacOS specific issue w/ PATH not being retained. -* The `config` property in `web3api.build.yaml` is now optional. + +- `@web3api/cli`: Fix MacOS specific issue w/ PATH not being retained. +- The `config` property in `web3api.build.yaml` is now optional. # Web3API 0.0.1-prealpha.28 + ## Bugs -* Fixed API template project + +- Fixed API template project # Web3API 0.0.1-prealpha.27 + ## Bugs -* Fixed API template project + +- Fixed API template project # Web3API 0.0.1-prealpha.26 + ## Feature -* `@web3api/uniswapV2-api`: Completed the Uniswap V2 Web3API implementation. -* `@web3api/ethereum-plugin-js`: Upgraded the Ethereum plugin, added lots of new functionality. -* `@web3api/cli`: Implemented a "reproducible build pipeline", where Web3APIs are now built in an isolated docker container. These builds can be fully configurable by developers. This also paves the way for implementing Web3APIs in any Wasm compatible language. Rust support on the way! -* `@web3api/react`: Added the ability to set query `variables` within the `execute` function returned by the `useWeb3ApiQuery` hook. -* `@web3api/sha3-plugin-js`: A SHA3 plugin has been implemented, and added to the client as a "default plugin". -* `@web3api/uts46-plugin-js`: A UTS46 plugin has been implemented, and added to the client as a "default plugin". -* CI: Windows CI has been implemented using appveyor. + +- `@web3api/uniswapV2-api`: Completed the Uniswap V2 Web3API implementation. +- `@web3api/ethereum-plugin-js`: Upgraded the Ethereum plugin, added lots of new functionality. +- `@web3api/cli`: Implemented a "reproducible build pipeline", where Web3APIs are now built in an isolated docker container. These builds can be fully configurable by developers. This also paves the way for implementing Web3APIs in any Wasm compatible language. Rust support on the way! +- `@web3api/react`: Added the ability to set query `variables` within the `execute` function returned by the `useWeb3ApiQuery` hook. +- `@web3api/sha3-plugin-js`: A SHA3 plugin has been implemented, and added to the client as a "default plugin". +- `@web3api/uts46-plugin-js`: A UTS46 plugin has been implemented, and added to the client as a "default plugin". +- CI: Windows CI has been implemented using appveyor. ## Bugs -* `@web3api/client-js`: Fixed threading issue causing the "unknown wake status" error. -* Fixed Windows specific errors. + +- `@web3api/client-js`: Fixed threading issue causing the "unknown wake status" error. +- Fixed Windows specific errors. # Web3API 0.0.1-prealpha.25 + ## Feature -* `@web3api/client-js`: Added the `WEB3API_THREAD_PATH` env variable, allowing integrators to customize where the `thread.js` worker thread module is imported from. -* `@web3api/wasm-as`: Improved error logging w/ better error messages and a "context stack" showing exactly what properties of the MsgPack blob the serialization / deserialization is failing at. + +- `@web3api/client-js`: Added the `WEB3API_THREAD_PATH` env variable, allowing integrators to customize where the `thread.js` worker thread module is imported from. +- `@web3api/wasm-as`: Improved error logging w/ better error messages and a "context stack" showing exactly what properties of the MsgPack blob the serialization / deserialization is failing at. # Web3API 0.0.1-prealpha.24 + ## Bugs -* `@web3api/wasm-as`: Moved `as-bigint` from `devDependencies` to `dependencies`. Fixes [issue #347](https://github.com/Web3-API/monorepo/issues/347) + +- `@web3api/wasm-as`: Moved `as-bigint` from `devDependencies` to `dependencies`. Fixes [issue #347](https://github.com/Web3-API/monorepo/issues/347) # Web3API 0.0.1-prealpha.23 + ## Feature -* `@web3api/os-js`: This package contains OS agnostic code for doing things like writing files w/ consistent line endings. -* Windows Support: The toolchain now builds and runs properly on the Windows operating system. -* `BigInt` Schema Type: The `BigInt` type is now available for use as a base type for Web3API GraphQL schemas. -* `@web3api/react`: The `useWeb3ApiClient` hook was added, allowing users to easily get a reference to the Web3ApiClient used by the Web3ApiProvider. + +- `@web3api/os-js`: This package contains OS agnostic code for doing things like writing files w/ consistent line endings. +- Windows Support: The toolchain now builds and runs properly on the Windows operating system. +- `BigInt` Schema Type: The `BigInt` type is now available for use as a base type for Web3API GraphQL schemas. +- `@web3api/react`: The `useWeb3ApiClient` hook was added, allowing users to easily get a reference to the Web3ApiClient used by the Web3ApiProvider. # Web3API 0.0.1-prealpha.22 + ## Feature -* `@web3api/tracing-js`: The `tracing-js` package uses the [OpenTelemetry Standard](https://opentelemetry.io/) for logging trace events. This enables things like: - * Benchmark Timings - * Input Argument + Output Result Logging - * In-Depth Exception Tracing -* `@web3api/core-js`: All functions are now traceable. -* `@web3api/client-js`: All functions are now traceable. + +- `@web3api/tracing-js`: The `tracing-js` package uses the [OpenTelemetry Standard](https://opentelemetry.io/) for logging trace events. This enables things like: + - Benchmark Timings + - Input Argument + Output Result Logging + - In-Depth Exception Tracing +- `@web3api/core-js`: All functions are now traceable. +- `@web3api/client-js`: All functions are now traceable. # Web3API 0.0.1-prealpha.21 + ## Feature -* Sharing code & types between `query` and `mutation` modules is now possible. + +- Sharing code & types between `query` and `mutation` modules is now possible. ## Bugs -* Common types found in both `query` and `mutation` schemas are properly consolidated. If types have the same name, but a different structure, and error is thrown. + +- Common types found in both `query` and `mutation` schemas are properly consolidated. If types have the same name, but a different structure, and error is thrown. # Web3API 0.0.1-prealpha.20 + ## Bugs -* Fix the `w3 create app react ...` template project's styling to be responsive. + +- Fix the `w3 create app react ...` template project's styling to be responsive. # Web3API 0.0.1-prealpha.19 + ## Features -* `@web3api/ipfs-plugin-js`: Added options for request timeouts, provider overrides, and fallback providers. Additionally a new method has been added, `resolve`, which allows the caller to try and resolve a given IFPS CID to ensure the document exists. + +- `@web3api/ipfs-plugin-js`: Added options for request timeouts, provider overrides, and fallback providers. Additionally a new method has been added, `resolve`, which allows the caller to try and resolve a given IFPS CID to ensure the document exists. # Web3API 0.0.1-prealpha.18 + ## Features -* Updated the `app/react` template project to use the latest "Hello World" Web3API published at `ens/helloworld.web3api.eth`. + +- Updated the `app/react` template project to use the latest "Hello World" Web3API published at `ens/helloworld.web3api.eth`. # Web3API 0.0.1-prealpha.17 + ## Bugs -* `@web3api/ethereum-plugin-js`: Network configurations must be nested within a property in order to allow for the `defaultNetwork` property to be set w/o causing a typing error (for not being of the `ConnectionConfig` type). + +- `@web3api/ethereum-plugin-js`: Network configurations must be nested within a property in order to allow for the `defaultNetwork` property to be set w/o causing a typing error (for not being of the `ConnectionConfig` type). # Web3API 0.0.1-prealpha.16 + ## Bugs -* `@web3api/test-env`: Expose the IPFS node's swarm port (4001). + +- `@web3api/test-env`: Expose the IPFS node's swarm port (4001). # Web3API 0.0.1-prealpha.15 + ## Bugs -* Fix `extractPluginConfigs.ts` output. + +- Fix `extractPluginConfigs.ts` output. # Web3API 0.0.1-prealpha.14 + ## Features -* Network Specific ENS Lookup - * `@web3api/ethereum-plugin-js`: The EthereumPlugin can now be constructed with multiple network connections (mainnet, rinkeby, testnet, etc). - * All Query & Mutation methods now accept an optional `connection` property which can be used to configure a specific network to be used for the action. - * `@web3api/ens-plugin-js`: The EnsPlugin can now handle URIs that address specific networks. For example: `w3://ens/testnet/myweb3api.eth`. It will request the `testnet` connection to be used when querying the Ethereum Web3API. + +- Network Specific ENS Lookup + - `@web3api/ethereum-plugin-js`: The EthereumPlugin can now be constructed with multiple network connections (mainnet, rinkeby, testnet, etc). + - All Query & Mutation methods now accept an optional `connection` property which can be used to configure a specific network to be used for the action. + - `@web3api/ens-plugin-js`: The EnsPlugin can now handle URIs that address specific networks. For example: `w3://ens/testnet/myweb3api.eth`. It will request the `testnet` connection to be used when querying the Ethereum Web3API. # Web3API 0.0.1-prealpha.13 + ## Features -* Improved template projects that are used with the `w3 create ...` CLI command. + +- Improved template projects that are used with the `w3 create ...` CLI command. # Web3API 0.0.1-prealpha.12 + ## Bug Fixes -* Added schemas to plugin manifest modules, removing the need for `import_redirects`. -* Fixed the IpfsPlugin's `addFile` method. -* Improved the api/assemblyscript template project. + +- Added schemas to plugin manifest modules, removing the need for `import_redirects`. +- Fixed the IpfsPlugin's `addFile` method. +- Improved the api/assemblyscript template project. # Web3API 0.0.1-prealpha.11 + ## Bug Fixes -* `@web3api/cli`: Include the internationalization JSON files in the published package. + +- `@web3api/cli`: Include the internationalization JSON files in the published package. # Web3API 0.0.1-prealpha.10 + ## Bug Fixes -* `@web3api/ens-plugin-js`: Fix the schema. + +- `@web3api/ens-plugin-js`: Fix the schema. # Web3API 0.0.1-prealpha.9 + ## Features -* `@web3api/cli`: CLI Internalized Text Support - * Currently English is implemented, and Spanish support is slated to be added next. -* `@web3api/schema-parse`: GraphQL Infinite Cycle Detection - * Bad object relationships within the Web3API's GraphQL schema are now automatically detected, ensuring developers never create objects that can never be instantiated properly. -* `@web3api/templates`: Auto-Generate Smart Contract ABI & Bytecode Assemblyscript Module - * This auto-generated module is being used within the `deployContract` mutation. + +- `@web3api/cli`: CLI Internalized Text Support + - Currently English is implemented, and Spanish support is slated to be added next. +- `@web3api/schema-parse`: GraphQL Infinite Cycle Detection + - Bad object relationships within the Web3API's GraphQL schema are now automatically detected, ensuring developers never create objects that can never be instantiated properly. +- `@web3api/templates`: Auto-Generate Smart Contract ABI & Bytecode Assemblyscript Module + - This auto-generated module is being used within the `deployContract` mutation. ## Bug Fixes -* `@web3api/core-js`: The `resolve-uri` core algorithm had an "off by one" iteration bug, where it never retried the first `api-resolver` in the implementations array. -* `@web3api/ethereum-plugin-js`: When using a provider that lacks signing capabilities (ex: Infura RPC endpoint), the `getContract` function was trying to get a signer when one did not exist. -* `@web3api/ipfs-plugin-js`: Fixed this plugin's schema, as it was using unsupported syntax. + +- `@web3api/core-js`: The `resolve-uri` core algorithm had an "off by one" iteration bug, where it never retried the first `api-resolver` in the implementations array. +- `@web3api/ethereum-plugin-js`: When using a provider that lacks signing capabilities (ex: Infura RPC endpoint), the `getContract` function was trying to get a signer when one did not exist. +- `@web3api/ipfs-plugin-js`: Fixed this plugin's schema, as it was using unsupported syntax. ## Misc -* Upgrade node version to v14.16.0. -* Upgrade TypeScript version to v4.0.7. + +- Upgrade node version to v14.16.0. +- Upgrade TypeScript version to v4.0.7. # Web3API 0.0.1-prealpha.8 + ## Bug Fixes -* Fixed bug in `@web3api/react` package. + +- Fixed bug in `@web3api/react` package. ## Misc -* Removed documentation & demos from the monorepo. + +- Removed documentation & demos from the monorepo. # Web3API 0.0.1-prealpha.7 + ## Features -* Console Log Web3API - * Calls log on logger plugin at uri w3://w3/logger. Default logger logs to console, but can be overridden with redirect to custom logger web3api implementation. - * Log levels: Debug, Info, Warn, Error -* `createWeb3ApiClient(...)` helper for easily setting up a Web3API Client with all needed plugins (ex: ethereum, ipfs, etc) in one function call. - * Additional support for plugins can be added in the future, without bloating the `@web3api/client-js` package thanks to dynamic imports! -* When using the Web3ApiClient, specify Web3API URIs without having to create a new URI class (`new Uri("...")`). Simply provide a string instead. -* Improved plugin instantiation interface. + +- Console Log Web3API + - Calls log on logger plugin at uri w3://w3/logger. Default logger logs to console, but can be overridden with redirect to custom logger web3api implementation. + - Log levels: Debug, Info, Warn, Error +- `createWeb3ApiClient(...)` helper for easily setting up a Web3API Client with all needed plugins (ex: ethereum, ipfs, etc) in one function call. + - Additional support for plugins can be added in the future, without bloating the `@web3api/client-js` package thanks to dynamic imports! +- When using the Web3ApiClient, specify Web3API URIs without having to create a new URI class (`new Uri("...")`). Simply provide a string instead. +- Improved plugin instantiation interface. ## Bug Fixes -* Proper MsgPack numeric overflow assertions (closes: [#150](https://github.com/Web3-API/monorepo/issues/150)) -* Proper usage of [GraphQL Aliases](https://graphql.org/learn/queries/#aliases) when invoking multiple methods in one query. + +- Proper MsgPack numeric overflow assertions (closes: [#150](https://github.com/Web3-API/monorepo/issues/150)) +- Proper usage of [GraphQL Aliases](https://graphql.org/learn/queries/#aliases) when invoking multiple methods in one query. # Web3API 0.0.1-prealpha.6 + ## Features -* Web3API React Integration: `@web3api/react` - * Add the `Web3ApiProvider` HOC to the root of your application. - * Use the `useWeb3ApiQuery` hook to execute queries. -* Web3API CLI e2e tests. -* `@web3api/test-env-js` package for common testing logic. -* `@web3api/test-cases` for common test cases. + +- Web3API React Integration: `@web3api/react` + - Add the `Web3ApiProvider` HOC to the root of your application. + - Use the `useWeb3ApiQuery` hook to execute queries. +- Web3API CLI e2e tests. +- `@web3api/test-env-js` package for common testing logic. +- `@web3api/test-cases` for common test cases. ## Bug Fixes -* Remove unused `workerize-loader` package & logic. + +- Remove unused `workerize-loader` package & logic. # Web3API 0.0.1-prealpha.5 + ## Features -* `w3 build --watch` support, enabling the automatic rebuilding of Web3APIs whenever project files have changed. + +- `w3 build --watch` support, enabling the automatic rebuilding of Web3APIs whenever project files have changed. # Web3API 0.0.1-prealpha.4 + ## Features -* Enum Support + +- Enum Support ## Bug Fixes -* `w3 create ...` CLI Fix (closes: [#167](https://github.com/Web3-API/monorepo/issues/167)) + +- `w3 create ...` CLI Fix (closes: [#167](https://github.com/Web3-API/monorepo/issues/167)) # Web3API 0.0.1-prealpha.2 + ## Bug Fixes -* Fix typescript plugin template's package.json + +- Fix typescript plugin template's package.json # Web3API 0.0.1-prealpha.1 + Pre-Alpha Initial Release diff --git a/VERSION b/VERSION index faa4a407a9..66d1ae5e88 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.11.0-pre.2 +0.11.0-pre.3 From 5cbd70eab4ed8a44490da381a3fa94ec2b872331 Mon Sep 17 00:00:00 2001 From: Jure Bogunovic Date: Tue, 18 Jul 2023 17:13:04 +0200 Subject: [PATCH 155/181] reverted changelog formatting --- CHANGELOG.md | 1714 ++++++++++++++++++++------------------------------ 1 file changed, 681 insertions(+), 1033 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 99d608c9fb..0bd6429d6a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,127 +1,95 @@ # Polywrap Origin (0.11.0-pre.3) - ... # Polywrap Origin (0.10.6) - ## Bugs - **`polywrap` CLI:** - -- [PR-1796](https://github.com/polywrap/cli/pull/1796) **`wrap/rust` Builds Now Properly Remove wasm-bindgen Imports** - - The `wasm-bindgen` CLI was emitting an unneeded `__wbindgen_throw` import, so we use `wasm-snip` to remove it. +* [PR-1796](https://github.com/polywrap/cli/pull/1796) **`wrap/rust` Builds Now Properly Remove wasm-bindgen Imports** + * The `wasm-bindgen` CLI was emitting an unneeded `__wbindgen_throw` import, so we use `wasm-snip` to remove it. # Polywrap Origin (0.10.5) - ## Bugs - **`@polywrap/schema-bind`:** - -- [PR-1786](https://github.com/polywrap/cli/pull/1786) **Update `plugin/python` plugin bindings to latest client** +* [PR-1786](https://github.com/polywrap/cli/pull/1786) **Update `plugin/python` plugin bindings to latest client** # Polywrap Origin (0.10.4) - ## Features - **`polywrap` CLI:** - -- [PR-1735](https://github.com/polywrap/cli/pull/1735) **Add Docs Manifest & `polywrap docs init` Command** - - The `polywrap.docs.yaml` manifest is used to add additional metadata to your wraps. -- [PR-1776](https://github.com/polywrap/cli/pull/1776) **Add HTTP Headers To HTTP Deploy Module** - - The `http` deploy module now supports the `headers` configuration property. +* [PR-1735](https://github.com/polywrap/cli/pull/1735) **Add Docs Manifest & `polywrap docs init` Command** + * The `polywrap.docs.yaml` manifest is used to add additional metadata to your wraps. +* [PR-1776](https://github.com/polywrap/cli/pull/1776) **Add HTTP Headers To HTTP Deploy Module** + * The `http` deploy module now supports the `headers` configuration property. ## Bugs - **`polywrap` CLI:** - -- [PR-1773](https://github.com/polywrap/cli/pull/1773) **Don't Install `wasm-opt` Every `local` Rust Build** - - The `local` strategy for rust wasm projects was unexpectedly installing `wasm-opt` every time it was run, leading to very long build times. +* [PR-1773](https://github.com/polywrap/cli/pull/1773) **Don't Install `wasm-opt` Every `local` Rust Build** + * The `local` strategy for rust wasm projects was unexpectedly installing `wasm-opt` every time it was run, leading to very long build times. **`@polywrap/schema-bind`:** - -- [PR-1775](https://github.com/polywrap/cli/pull/1775) **Fix Python Plugin Bindings** - - The wrap abi type `Bytes` can now be properly used within rust plugins. -- [PR-1753](https://github.com/polywrap/cli/pull/1753) **Fix Python Plugin Bindings** +* [PR-1775](https://github.com/polywrap/cli/pull/1775) **Fix Python Plugin Bindings** + * The wrap abi type `Bytes` can now be properly used within rust plugins. +* [PR-1753](https://github.com/polywrap/cli/pull/1753) **Fix Python Plugin Bindings** # Polywrap Origin (0.10.3) - ## Features - **`polywrap` CLI:** - -- [PR-1747](https://github.com/polywrap/toolchain/pull/1747) **Add Rust & Python plugin template projects to CLI's `create` command** - - The `create` command now supports `plugin/rust` and `plugin/python` project types. +* [PR-1747](https://github.com/polywrap/toolchain/pull/1747) **Add Rust & Python plugin template projects to CLI's `create` command** + * The `create` command now supports `plugin/rust` and `plugin/python` project types. ## Bugs - **`@polywrap/schema-bind`:** - -- [PR-1734](https://github.com/polywrap/toolchain/pull/1734) **Update `plugin/python` Bindings** - - Update `wrap.info` python module embedding. -- [PR-1728](https://github.com/polywrap/toolchain/pull/1728) **Update `plugin/rust` Bindings** - - Modify JSON serialization within rust plugin's bindings. -- [PR-1736](https://github.com/polywrap/toolchain/pull/1736) **Properly emit function name when `Env` is missing** - - Fixed the error message that's emitted when an environment is not supplied to a function that requires it. -- [PR-1733](https://github.com/polywrap/toolchain/pull/1733) **Add imported `Env` to `propertyDeps` transform** - - Adds imported `Env` to `propertyDeps` transform, so that now codegen properly generates imports for dependencies of imported env. +* [PR-1734](https://github.com/polywrap/toolchain/pull/1734) **Update `plugin/python` Bindings** + * Update `wrap.info` python module embedding. +* [PR-1728](https://github.com/polywrap/toolchain/pull/1728) **Update `plugin/rust` Bindings** + * Modify JSON serialization within rust plugin's bindings. +* [PR-1736](https://github.com/polywrap/toolchain/pull/1736) **Properly emit function name when `Env` is missing** + * Fixed the error message that's emitted when an environment is not supplied to a function that requires it. +* [PR-1733](https://github.com/polywrap/toolchain/pull/1733) **Add imported `Env` to `propertyDeps` transform** + * Adds imported `Env` to `propertyDeps` transform, so that now codegen properly generates imports for dependencies of imported env. # Polywrap Origin (0.10.2) - ## Bugs - **`@polywrap/schema-bind`:** - -- [PR-1718](https://github.com/polywrap/toolchain/pull/1718) **`plugin/python` Enum Bindings Fix** - - Enums are now properly displayed in Python plugins. +* [PR-1718](https://github.com/polywrap/toolchain/pull/1718) **`plugin/python` Enum Bindings Fix** + * Enums are now properly displayed in Python plugins. # Polywrap Origin (0.10.1) - ## Features - **`@polywrap/schema-bind`:** - -- [PR-1694](https://github.com/polywrap/toolchain/pull/1694) **`plugin/rust` Env Bindings Refactor** - - Rust plugin bindings now expose `env` as a function argument. +* [PR-1694](https://github.com/polywrap/toolchain/pull/1694) **`plugin/rust` Env Bindings Refactor** + * Rust plugin bindings now expose `env` as a function argument. ## Bugs - **`@polywrap/schema-bind`:** - -- [PR-1700](https://github.com/polywrap/toolchain/pull/1700) **`plugin/rust` Serde renaming for snake-cased properties in rust plugins types** - - Rust plugins now properly convert wrap schema property names into snake-cased names, so they are compatable with Rust naming conventions. +* [PR-1700](https://github.com/polywrap/toolchain/pull/1700) **`plugin/rust` Serde renaming for snake-cased properties in rust plugins types** + * Rust plugins now properly convert wrap schema property names into snake-cased names, so they are compatable with Rust naming conventions. **`@polywrap/templates`:** - -- [PR-1680](https://github.com/polywrap/toolchain/pull/1680) **Import newer logger in typescript template** - - Update the typescript app template to use the latest logging wrap at `ens/wraps.eth:logging@1.0.0`. +* [PR-1680](https://github.com/polywrap/toolchain/pull/1680) **Import newer logger in typescript template** + * Update the typescript app template to use the latest logging wrap at `ens/wraps.eth:logging@1.0.0`. **`@polywrap/polywrap-manifest-types-js`:** - -- [PR-1692](https://github.com/polywrap/toolchain/pull/1692) **top-level `docker` property is now removed from build manifest during migration** - - Fixes a bug where the top-level `docker` property of build manifest version 0.1.0 was not being dropped during migration, causing migrated build manifests to fail validation. +* [PR-1692](https://github.com/polywrap/toolchain/pull/1692) **top-level `docker` property is now removed from build manifest during migration** + * Fixes a bug where the top-level `docker` property of build manifest version 0.1.0 was not being dropped during migration, causing migrated build manifests to fail validation. # Polywrap Origin (0.10.0) - ## Features - ### Toolchain - **`polywrap` CLI:** - -- [PR-1592](https://github.com/polywrap/toolchain/pull/1592) **Add `primaryJob` to deploy manifest and output `URI.txt` when running `polywrap deploy`** - - The `primaryJob` option in the deploy manifest identifies the name of the job that is used for the primary deployment. The URI that is emitted from the `primaryJob` will be output to a `URI.txt` file next to the deploy manifest. -- [PR-1529](https://github.com/polywrap/toolchain/pull/1529) **`polywrap create template` Command** - - Added the `polywrap create template` command to the CLI, enabling users to provide a url to a template project. -- [PR-1584](https://github.com/polywrap/toolchain/pull/1584) **Codegen Command Now Supports `--watch`** - - You can now run npx `polywrap codegen --watch` which will automatically watch files within your project directory and re-run codegen whenever changes are detected. -- [PR-1677](https://github.com/polywrap/toolchain/pull/1677) **Python Plugin Support** - - Add bindings for `plugin/python` projects. -- [PR-1428](https://github.com/polywrap/toolchain/pull/1428) **Rust Plugin Support** - - Add bindings for `plugin/rust` projects. -- [PR-1437](https://github.com/polywrap/toolchain/pull/1437) **Support Custom Wrapper Environment Variables** - - Enable users to customize the CLI's internal client's wrapper environment via a `--wrapper-envs` option, added to the `build`, `codegen`, `docgen`, and `test` commands. -- [PR-1430](https://github.com/polywrap/toolchain/pull/1430) **Support Arbitrary Resources Files** - - Polywrap `wasm/` & `interface/` projects can now include a `resources:` directory, specified in the `polywrap.yaml` manifest. This resources directory will be copied into the `build/` folder upon runnin `polywrap build`. For example: +* [PR-1592](https://github.com/polywrap/toolchain/pull/1592) **Add `primaryJob` to deploy manifest and output `URI.txt` when running `polywrap deploy`** + * The `primaryJob` option in the deploy manifest identifies the name of the job that is used for the primary deployment. The URI that is emitted from the `primaryJob` will be output to a `URI.txt` file next to the deploy manifest. +* [PR-1529](https://github.com/polywrap/toolchain/pull/1529) **`polywrap create template` Command** + * Added the `polywrap create template` command to the CLI, enabling users to provide a url to a template project. +* [PR-1584](https://github.com/polywrap/toolchain/pull/1584) **Codegen Command Now Supports `--watch`** + * You can now run npx `polywrap codegen --watch` which will automatically watch files within your project directory and re-run codegen whenever changes are detected. +* [PR-1677](https://github.com/polywrap/toolchain/pull/1677) **Python Plugin Support** + * Add bindings for `plugin/python` projects. +* [PR-1428](https://github.com/polywrap/toolchain/pull/1428) **Rust Plugin Support** + * Add bindings for `plugin/rust` projects. +* [PR-1437](https://github.com/polywrap/toolchain/pull/1437) **Support Custom Wrapper Environment Variables** + * Enable users to customize the CLI's internal client's wrapper environment via a `--wrapper-envs` option, added to the `build`, `codegen`, `docgen`, and `test` commands. +* [PR-1430](https://github.com/polywrap/toolchain/pull/1430) **Support Arbitrary Resources Files** + * Polywrap `wasm/` & `interface/` projects can now include a `resources:` directory, specified in the `polywrap.yaml` manifest. This resources directory will be copied into the `build/` folder upon runnin `polywrap build`. For example: ```yaml format: 0.3.0 project: @@ -131,377 +99,323 @@ ... resources: ./resources ``` -- [PR-1349](https://github.com/polywrap/toolchain/pull/1349) **Log File Support** - - A `-l, --log-file [path]` option has been added to all commands. Its purpose is to configure a `Log file to save console output to`, useful in situations when the console log overflows. +* [PR-1349](https://github.com/polywrap/toolchain/pull/1349) **Log File Support** + * A `-l, --log-file [path]` option has been added to all commands. Its purpose is to configure a `Log file to save console output to`, useful in situations when the console log overflows. **`@polywrap/cli-js`:** - -- [PR-1359](https://github.com/polywrap/toolchain/pull/1359) **Polywrap CLI JS Wrapper** - - Created the `polywrap/cli-js` package to wrap the `polywrap` CLI with a JavaScript/TypeScript interface. +* [PR-1359](https://github.com/polywrap/toolchain/pull/1359) **Polywrap CLI JS Wrapper** + * Created the `polywrap/cli-js` package to wrap the `polywrap` CLI with a JavaScript/TypeScript interface. **`@polywrap/polywrap-manifest-schemas`:** - -- [PR-1430](https://github.com/polywrap/toolchain/pull/1430) **Support Arbitrary Resources Files** - - Added version `0.3.0` of the `PolywrapManifest`, which includes the new `resources: string` field. +* [PR-1430](https://github.com/polywrap/toolchain/pull/1430) **Support Arbitrary Resources Files** + * Added version `0.3.0` of the `PolywrapManifest`, which includes the new `resources: string` field. **`@polywrap/polywrap-manifest-types-js`:** - -- [PR-1379](https://github.com/polywrap/toolchain/pull/1379) **Add Logging to Manifest Migrators** - - Added an optional logger parameter to the deserialization function of all manifest types. -- [PR-1430](https://github.com/polywrap/toolchain/pull/1430) **Support Arbitrary Resources Files** - - Added version `0.3.0` of the `PolywrapManifest`, which includes the new `resources: string` field. +* [PR-1379](https://github.com/polywrap/toolchain/pull/1379) **Add Logging to Manifest Migrators** + * Added an optional logger parameter to the deserialization function of all manifest types. +* [PR-1430](https://github.com/polywrap/toolchain/pull/1430) **Support Arbitrary Resources Files** + * Added version `0.3.0` of the `PolywrapManifest`, which includes the new `resources: string` field. **`@polywrap/schema-bind`:** - -- [PR-1677](https://github.com/polywrap/toolchain/pull/1677) **Python Plugin Support** - - Add bindings for `plugin/python` projects. -- [PR-1464](https://github.com/polywrap/toolchain/pull/1464) **`wasm/rust` Bindings Now Use `ModuleTrait` Trait** - - Codegen for `wasm/rust` wraps now generates a `ModuleTrait` trait that must be implemented for the root `Module` struct. -- [PR-1460](https://github.com/polywrap/toolchain/pull/1460) **`wasm/assemblyscript` Bindings Now Use `ModuleBase` Interface** - - Codegen for `wasm/assemblyscript` wraps now generates a `ModuleBase` interface that must be extended by a root `Module` class. -- [PR-1428](https://github.com/polywrap/toolchain/pull/1428) **Rust Plugin Support** - - Add bindings for `plugin/rust` projects. -- [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** - - In `plugin-ts` bindings, the `PluginModule` type is now imported fron `@polywrap/plugin-js` instead of `@polywrap/core-js`. +* [PR-1677](https://github.com/polywrap/toolchain/pull/1677) **Python Plugin Support** + * Add bindings for `plugin/python` projects. +* [PR-1464](https://github.com/polywrap/toolchain/pull/1464) **`wasm/rust` Bindings Now Use `ModuleTrait` Trait** + * Codegen for `wasm/rust` wraps now generates a `ModuleTrait` trait that must be implemented for the root `Module` struct. +* [PR-1460](https://github.com/polywrap/toolchain/pull/1460) **`wasm/assemblyscript` Bindings Now Use `ModuleBase` Interface** + * Codegen for `wasm/assemblyscript` wraps now generates a `ModuleBase` interface that must be extended by a root `Module` class. +* [PR-1428](https://github.com/polywrap/toolchain/pull/1428) **Rust Plugin Support** + * Add bindings for `plugin/rust` projects. +* [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** + * In `plugin-ts` bindings, the `PluginModule` type is now imported fron `@polywrap/plugin-js` instead of `@polywrap/core-js`. **`@polywrap/schema-compose`:** - -- [PR-1600](https://github.com/polywrap/toolchain/pull/1600) **Allow WRAP URIs in Un-Namespaced Imports** - - Support URIs within un-namespaced import statements like so `#import { Object, Module } from "wrap://..."` - - This effectively enables the "embedding" of external ABIs, which is useful when you'd like to copy 1:1 an ABI that lives elsewhere. +* [PR-1600](https://github.com/polywrap/toolchain/pull/1600) **Allow WRAP URIs in Un-Namespaced Imports** + * Support URIs within un-namespaced import statements like so `#import { Object, Module } from "wrap://..."` + * This effectively enables the "embedding" of external ABIs, which is useful when you'd like to copy 1:1 an ABI that lives elsewhere. ### JS Client - **`@polywrap/client-js`:** - -- [PR-1582](https://github.com/polywrap/toolchain/pull/1582) **Support ENS Text Record WRAP URIs** - - Support has been added for using ENS text records as valid `wrap://` URIs. - - Example: [`wrap://ens/uniswap.wraps.eth:v3`](https://app.ens.domains/name/uniswap.wraps.eth/details) - - NOTE: Text record key names must begin with `wrap/` -- [PR-1431](https://github.com/polywrap/toolchain/pull/1431) **WRAP Error Structure** - - Integrate the `WrapError` structure, helping debug common client error scenarios. -- [PR-1340](https://github.com/polywrap/toolchain/pull/1340) **Wrapper Validation** - - Added a `validate(uri, options)` method to the `PolywrapClient` class, allowing users to guarantee the client can communicate with the provided wrapper located at the provided URI. -- [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** - - Polywrap Client now re-exports the config builder and uri-resolvers (in addition to core) packages. This is done to improve dev exp and remove the need for users to import those package themselves. - - For users who do not need those packages and are using noDefaults there will be a separate PR that refactor core client functionality into a core-client package that does not depend on the config builder and uri-resolvers packages, but has no defaults. +* [PR-1582](https://github.com/polywrap/toolchain/pull/1582) **Support ENS Text Record WRAP URIs** + * Support has been added for using ENS text records as valid `wrap://` URIs. + * Example: [`wrap://ens/uniswap.wraps.eth:v3`](https://app.ens.domains/name/uniswap.wraps.eth/details) + * NOTE: Text record key names must begin with `wrap/` +* [PR-1431](https://github.com/polywrap/toolchain/pull/1431) **WRAP Error Structure** + * Integrate the `WrapError` structure, helping debug common client error scenarios. +* [PR-1340](https://github.com/polywrap/toolchain/pull/1340) **Wrapper Validation** + * Added a `validate(uri, options)` method to the `PolywrapClient` class, allowing users to guarantee the client can communicate with the provided wrapper located at the provided URI. +* [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** + * Polywrap Client now re-exports the config builder and uri-resolvers (in addition to core) packages. This is done to improve dev exp and remove the need for users to import those package themselves. + * For users who do not need those packages and are using noDefaults there will be a separate PR that refactor core client functionality into a core-client package that does not depend on the config builder and uri-resolvers packages, but has no defaults. **`@polywrap/client-config-builder-js`:** - -- [PR-1582](https://github.com/polywrap/toolchain/pull/1582) **Integrate URI Resolver Extension Wraps** - - The default configuration bundle now has the following uri-resolver-ext wraps registered as interface implementations: - - [`wrap://ens/wraps.eth:ipfs-uri-resolver-ext@1.0.0](https://github.com/polywrap/uri-resolver-extensions/tree/master/implementations/ipfs) - - [`wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0`](https://github.com/polywrap/uri-resolver-extensions/tree/master/implementations/ens-text-record) - - [`wrap://ens/wraps.eth:http-uri-resolver-ext@1.0.0`](https://github.com/polywrap/uri-resolver-extensions/tree/master/implementations/http) - - [`wrap://ens/wraps.eth:file-system-uri-resolver-ext@1.0.0`](https://github.com/polywrap/uri-resolver-extensions/tree/master/implementations/file-system) - - [`wrap://ens/wraps.eth:ens-uri-resolver-ext@1.0.0`](https://github.com/polywrap/uri-resolver-extensions/tree/master/implementations/ens-contenthash) - - [`wrap://ens/wraps.eth:ens-ipfs-contenthash-uri-resolver-ext@1.0.0`](https://github.com/polywrap/uri-resolver-extensions/tree/master/implementations/ens-ipfs-contenthash) -- [PR-1560](https://github.com/polywrap/toolchain/pull/1560) **Add `BuildOptions` to build method in `IClientConfigBuilder`** - - This makes it possible to add a custom cache or resolver without casting. -- [PR-1475](https://github.com/polywrap/toolchain/pull/1475) **Embed IPFS HTTP Client & IPFS URI Resolver Wraps** - - The default configuration bundle now comes with two embedded wraps that enable interactions with IPFS: - - `ipfs-http-client` @ `wrap://ens/wraps.eth:ipfs-http-client@1.0.0` - - `async-ipfs-uri-resolver-ext` @ `wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.1` -- [PR-1518](https://github.com/polywrap/toolchain/pull/1518) **Optional Build Method Arguments** - - The `build(...)` method now accepts a single argument of type `BuildOptions`. -- [PR-1496](https://github.com/polywrap/toolchain/pull/1496) **Use New Concurrent Wrapper** - - The default config bundle now uses the `wrap://ens/wrappers.polywrap.eth:concurrent@1.0.0` interface, and adds the `concurrent-plugin-js` package @ `wrap://plugin/concurrent` as an implementation. -- [PR-1468](https://github.com/polywrap/toolchain/pull/1468) **Export Default Config Bundle URIs** - - The default config now exports constants for all URIs used within the config. -- [PR-1436](https://github.com/polywrap/toolchain/pull/1436) **Use New Logger Wrapper** - - The default config bundle now uses the `wrap://ens/wrappers.polywrap.eth:logger@1.0.0` interface, and adds the `@polywrap/logger-plugin-js` package @ `wrap://plugin/logger` as an implementation. -- [PR-1411](https://github.com/polywrap/toolchain/pull/1411) **Add `ens-text-record-resolver` to Default Config Bundle** - - The `ens-text-record-resolver` wrapper @ [`wrap://ipfs/QmfRCVA1MSAjUbrXXjya4xA9QHkbWeiKRsT7Um1cvrR7FY`](https://wrappers.io/v/ipfs/QmfRCVA1MSAjUbrXXjya4xA9QHkbWeiKRsT7Um1cvrR7FY) has been added to the default client config bundle. This resolver enables ENS, text-record based, WRAP URI resolution. The text-record's key must be prepended with the `wrap/...` identifier. For example, the URI `wrap://ens/domain.eth:foo` maps to `domain.eth`'s `wrap/foo` text record. The `wrap/foo` text-record's value must contain another valid WRAP URI. For examples, see [dev.polywrap.eth](https://app.ens.domains/name/dev.polywrap.eth/details). -- [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** - - Added `addRedirects`, `addWrappers`, `addPackages` methods to the `ClientConfigBuilder`, so users can add many items at once. - - Added `buildDefault` to the `ClientConfigBuilder` which builds a `ClientConfig` using default resolvers. +* [PR-1582](https://github.com/polywrap/toolchain/pull/1582) **Integrate URI Resolver Extension Wraps** + * The default configuration bundle now has the following uri-resolver-ext wraps registered as interface implementations: + * [`wrap://ens/wraps.eth:ipfs-uri-resolver-ext@1.0.0](https://github.com/polywrap/uri-resolver-extensions/tree/master/implementations/ipfs) + * [`wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0`](https://github.com/polywrap/uri-resolver-extensions/tree/master/implementations/ens-text-record) + * [`wrap://ens/wraps.eth:http-uri-resolver-ext@1.0.0`](https://github.com/polywrap/uri-resolver-extensions/tree/master/implementations/http) + * [`wrap://ens/wraps.eth:file-system-uri-resolver-ext@1.0.0`](https://github.com/polywrap/uri-resolver-extensions/tree/master/implementations/file-system) + * [`wrap://ens/wraps.eth:ens-uri-resolver-ext@1.0.0`](https://github.com/polywrap/uri-resolver-extensions/tree/master/implementations/ens-contenthash) + * [`wrap://ens/wraps.eth:ens-ipfs-contenthash-uri-resolver-ext@1.0.0`](https://github.com/polywrap/uri-resolver-extensions/tree/master/implementations/ens-ipfs-contenthash) +* [PR-1560](https://github.com/polywrap/toolchain/pull/1560) **Add `BuildOptions` to build method in `IClientConfigBuilder`** + * This makes it possible to add a custom cache or resolver without casting. +* [PR-1475](https://github.com/polywrap/toolchain/pull/1475) **Embed IPFS HTTP Client & IPFS URI Resolver Wraps** + * The default configuration bundle now comes with two embedded wraps that enable interactions with IPFS: + * `ipfs-http-client` @ `wrap://ens/wraps.eth:ipfs-http-client@1.0.0` + * `async-ipfs-uri-resolver-ext` @ `wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.1` +* [PR-1518](https://github.com/polywrap/toolchain/pull/1518) **Optional Build Method Arguments** + * The `build(...)` method now accepts a single argument of type `BuildOptions`. +* [PR-1496](https://github.com/polywrap/toolchain/pull/1496) **Use New Concurrent Wrapper** + * The default config bundle now uses the `wrap://ens/wrappers.polywrap.eth:concurrent@1.0.0` interface, and adds the `concurrent-plugin-js` package @ `wrap://plugin/concurrent` as an implementation. +* [PR-1468](https://github.com/polywrap/toolchain/pull/1468) **Export Default Config Bundle URIs** + * The default config now exports constants for all URIs used within the config. +* [PR-1436](https://github.com/polywrap/toolchain/pull/1436) **Use New Logger Wrapper** + * The default config bundle now uses the `wrap://ens/wrappers.polywrap.eth:logger@1.0.0` interface, and adds the `@polywrap/logger-plugin-js` package @ `wrap://plugin/logger` as an implementation. +* [PR-1411](https://github.com/polywrap/toolchain/pull/1411) **Add `ens-text-record-resolver` to Default Config Bundle** + * The `ens-text-record-resolver` wrapper @ [`wrap://ipfs/QmfRCVA1MSAjUbrXXjya4xA9QHkbWeiKRsT7Um1cvrR7FY`](https://wrappers.io/v/ipfs/QmfRCVA1MSAjUbrXXjya4xA9QHkbWeiKRsT7Um1cvrR7FY) has been added to the default client config bundle. This resolver enables ENS, text-record based, WRAP URI resolution. The text-record's key must be prepended with the `wrap/...` identifier. For example, the URI `wrap://ens/domain.eth:foo` maps to `domain.eth`'s `wrap/foo` text record. The `wrap/foo` text-record's value must contain another valid WRAP URI. For examples, see [dev.polywrap.eth](https://app.ens.domains/name/dev.polywrap.eth/details). +* [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** + * Added `addRedirects`, `addWrappers`, `addPackages` methods to the `ClientConfigBuilder`, so users can add many items at once. + * Added `buildDefault` to the `ClientConfigBuilder` which builds a `ClientConfig` using default resolvers. **`@polywrap/plugin-js`:** - -- [PR-1614](https://github.com/polywrap/toolchain/pull/1614) **Add `env` To `PluginModule` Invocation Method Arguments** - - `PluginModule` invocation methods will now be given an `env` the method's arguments. -- [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** - - New package for js plugins. - - Can create plugin packages with `PluginPackage.from`. - - Accepts `manifest` and a `PluginModule`, or an inline `PluginModule`. +* [PR-1614](https://github.com/polywrap/toolchain/pull/1614) **Add `env` To `PluginModule` Invocation Method Arguments** + * `PluginModule` invocation methods will now be given an `env` the method's arguments. +* [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** + * New package for js plugins. + * Can create plugin packages with `PluginPackage.from`. + * Accepts `manifest` and a `PluginModule`, or an inline `PluginModule`. **`@polywrap/uri-resolvers-js`:** - -- [PR-1646](https://github.com/polywrap/toolchain/pull/1646) **Resolution Result Cache Resolver** - - Added a new cache resolver `ResolutionResultCacheResolver`. - - Unlike the `WrapperCacheResolver`, which caches wrappers (URI => Wrapper), this resolver caches the result of the resolution process: URI, wrapper, package or error (URI => URI, URI => wrapper, URI => package, URI => error). - - By default, it does not cache errors, but a flag can be passed to enable that functionality. -- [PR-1528](https://github.com/polywrap/toolchain/pull/1528) **Request Synchronizer Resolver** - - With URI resolvers, multiple requests for the same URI, in most cases, needlessly repeat the same process (usually a network request). Using a cache resolver (like PackageToWrapperCacheResolver) helps if the resolution requests are synchronous (one after another). This new `RequestSynchronizerResolver` can be used to reuse parallel requests for the same URI, this way, only the first one needs to do the work (e.g. a network request) while others will await that same promise. -- [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** - - Added `StaticResolver` and `StaticResolver.from` to optimize building resolvers with `IUriRedirect`, `IUriWrapper` and `IUriPackage`. +* [PR-1646](https://github.com/polywrap/toolchain/pull/1646) **Resolution Result Cache Resolver** + * Added a new cache resolver `ResolutionResultCacheResolver`. + * Unlike the `WrapperCacheResolver`, which caches wrappers (URI => Wrapper), this resolver caches the result of the resolution process: URI, wrapper, package or error (URI => URI, URI => wrapper, URI => package, URI => error). + * By default, it does not cache errors, but a flag can be passed to enable that functionality. +* [PR-1528](https://github.com/polywrap/toolchain/pull/1528) **Request Synchronizer Resolver** + * With URI resolvers, multiple requests for the same URI, in most cases, needlessly repeat the same process (usually a network request). Using a cache resolver (like PackageToWrapperCacheResolver) helps if the resolution requests are synchronous (one after another). This new `RequestSynchronizerResolver` can be used to reuse parallel requests for the same URI, this way, only the first one needs to do the work (e.g. a network request) while others will await that same promise. +* [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** + * Added `StaticResolver` and `StaticResolver.from` to optimize building resolvers with `IUriRedirect`, `IUriWrapper` and `IUriPackage`. **`@polywrap/uri-resolver-extensions-js`:** - -- [PR-1582](https://github.com/polywrap/toolchain/pull/1582) **Update Default URI-Resolver-Ext Interface URI** - - The `ExtendableUriResolver` has been updated to get uri-resolver-ext implementations from the following interface URIs: - - `wrap://ens/wraps.eth:uri-resolver-ext@1.1.0` - - `wrap://ens/wraps.eth:uri-resolver-ext@1.0.0` +* [PR-1582](https://github.com/polywrap/toolchain/pull/1582) **Update Default URI-Resolver-Ext Interface URI** + * The `ExtendableUriResolver` has been updated to get uri-resolver-ext implementations from the following interface URIs: + * `wrap://ens/wraps.eth:uri-resolver-ext@1.1.0` + * `wrap://ens/wraps.eth:uri-resolver-ext@1.0.0` **`@polywrap/core-js`:** - -- [PR-1431](https://github.com/polywrap/toolchain/pull/1431) **WRAP Error Structure** - - Created a custom `WrapError` structure that improves debugging ability for common client error scenarios. -- [PR-1369](https://github.com/polywrap/toolchain/pull/1369) **Remove Legacy Redirects** - - `GetImplementationsOptions` now accepts an optional resolution context, to be used to handle infinite recursion when a resolver uses `getImplementations` - - `GetImplementationsOptions` now accepts an optional `applyResolution`. This can be used to apply URI resolution to interfaces. +* [PR-1431](https://github.com/polywrap/toolchain/pull/1431) **WRAP Error Structure** + * Created a custom `WrapError` structure that improves debugging ability for common client error scenarios. +* [PR-1369](https://github.com/polywrap/toolchain/pull/1369) **Remove Legacy Redirects** + * `GetImplementationsOptions` now accepts an optional resolution context, to be used to handle infinite recursion when a resolver uses `getImplementations` + * `GetImplementationsOptions` now accepts an optional `applyResolution`. This can be used to apply URI resolution to interfaces. **`@polywrap/logging-js`:** - -- [PR-1379](https://github.com/polywrap/toolchain/pull/1379) **Create `@polywrap/logging-js` Package** - - Created the `@polywrap/logging-js` package from the logging lib previously in the CLI's codebase. +* [PR-1379](https://github.com/polywrap/toolchain/pull/1379) **Create `@polywrap/logging-js` Package** + * Created the `@polywrap/logging-js` package from the logging lib previously in the CLI's codebase. ### JS Plugins - **`@polywrap/http-plugin-js`:** +* [PR-1471](https://github.com/polywrap/toolchain/pull/1471) **Add form-data Support** + * Added form-data support through the inclusion of the `formData: [FormDataEntry!]` property on the `Request` object. -- [PR-1471](https://github.com/polywrap/toolchain/pull/1471) **Add form-data Support** - - Added form-data support through the inclusion of the `formData: [FormDataEntry!]` property on the `Request` object. ## Breaking Changes - ### Toolchain - **`polywrap` CLI:** - -- [PR-1561](https://github.com/polywrap/toolchain/pull/1561) **Remove buildx builder by default** - - Added new `keepBuilder` option which is default to false and removed the previous `removeBuilder` option from the build manifest. -- [PR-1525](https://github.com/polywrap/toolchain/pull/1525) **Unify Typescript App Templates** - - Remove `typescript-node` & `typescript-react` app templates, and replace them with a single `typescript`. -- [PR-1432](https://github.com/polywrap/toolchain/pull/1432) **Remove Legacy Polywrap Project Metadata** - - Remove the `polywrap.meta.yaml` manifest. -- [PR-1367](https://github.com/polywrap/toolchain/pull/1367) **Client Configuration Refactor** - - The JS/TS module passed into the `--client-config` option has a new function entrypoint signature. Instead of exporting a `getCustomConfig` function, users should export the following: `configure(builder: IClientConfigBuilder): IClientConfigBuilder`. - - See example [config.ts](https://github.com/polywrap/toolchain/blob/1096f2f4dfb35fdcc29e9b66057f91ade8b82c67/packages/test-cases/cases/cli/test/008-custom-config/config.ts). -- [PR-1348](https://github.com/polywrap/toolchain/pull/1348) **Rename `run` to `test`** - - Rename the `run` command to `test`, which uses the `test` project extension, as defined in the `polywrap.test.yaml` manifest file. -- [PR-1545](https://github.com/polywrap/toolchain/pull/1545) \*\*Remove `config` section from test manifest - - The Polywrap Test manifest (`polywrap.test.yaml`) has been upgraded to version `0.2.0` with the following change: - - The `config` section inside `step` has been removed, and manifest migrations will warn the user regarding this change. +* [PR-1561](https://github.com/polywrap/toolchain/pull/1561) **Remove buildx builder by default** + * Added new `keepBuilder` option which is default to false and removed the previous `removeBuilder` option from the build manifest. +* [PR-1525](https://github.com/polywrap/toolchain/pull/1525) **Unify Typescript App Templates** + * Remove `typescript-node` & `typescript-react` app templates, and replace them with a single `typescript`. +* [PR-1432](https://github.com/polywrap/toolchain/pull/1432) **Remove Legacy Polywrap Project Metadata** + * Remove the `polywrap.meta.yaml` manifest. +* [PR-1367](https://github.com/polywrap/toolchain/pull/1367) **Client Configuration Refactor** + * The JS/TS module passed into the `--client-config` option has a new function entrypoint signature. Instead of exporting a `getCustomConfig` function, users should export the following: `configure(builder: IClientConfigBuilder): IClientConfigBuilder`. + * See example [config.ts](https://github.com/polywrap/toolchain/blob/1096f2f4dfb35fdcc29e9b66057f91ade8b82c67/packages/test-cases/cases/cli/test/008-custom-config/config.ts). +* [PR-1348](https://github.com/polywrap/toolchain/pull/1348) **Rename `run` to `test`** + * Rename the `run` command to `test`, which uses the `test` project extension, as defined in the `polywrap.test.yaml` manifest file. +* [PR-1545](https://github.com/polywrap/toolchain/pull/1545) **Remove `config` section from test manifest + * The Polywrap Test manifest (`polywrap.test.yaml`) has been upgraded to version `0.2.0` with the following change: + * The `config` section inside `step` has been removed, and manifest migrations will warn the user regarding this change. **`@polywrap/schema-bind`** - -- [PR-1464](https://github.com/polywrap/toolchain/pull/1464) **`wasm/rust` Bindings Now Use `ModuleTrait` Trait** - - Rust-based wraps no longer pub functions, but instead pub a `impl ModuleTrait for Module`. -- [PR-1460](https://github.com/polywrap/toolchain/pull/1460) **`wasm/assemblyscript` Bindings Now Use `ModuleBase` Interface** - - AssemblyScript-based wraps no longer export functions, but instead export a `class Module` which `extends ModuleBase`. +* [PR-1464](https://github.com/polywrap/toolchain/pull/1464) **`wasm/rust` Bindings Now Use `ModuleTrait` Trait** + * Rust-based wraps no longer pub functions, but instead pub a `impl ModuleTrait for Module`. +* [PR-1460](https://github.com/polywrap/toolchain/pull/1460) **`wasm/assemblyscript` Bindings Now Use `ModuleBase` Interface** + * AssemblyScript-based wraps no longer export functions, but instead export a `class Module` which `extends ModuleBase`. **`@polywrap/test-env-js`** - -- [PR-1530](https://github.com/polywrap/toolchain/pull/1530) **Deprecate Legacy Test-Env Package** - - The `test-env-js` package has been deprecated, in favor of `@polywrap/cli-js` +* [PR-1530](https://github.com/polywrap/toolchain/pull/1530) **Deprecate Legacy Test-Env Package** + * The `test-env-js` package has been deprecated, in favor of `@polywrap/cli-js` ### JS Client - **`@polywrap/client-js`:** - -- [PR-1534](https://github.com/polywrap/toolchain/pull/1534) **Remove legacy config types from `PolywrapClient`** - - The `PolywrapClient` now simply accepts a `CoreClientConfig`, which is expected to come from the config builder. -- [PR-1461](https://github.com/polywrap/toolchain/pull/1461) **Remove Legacy Invocation Methods** - - Remove `client.query(...)` & `client.subscribe(...)` methods. -- [PR-1369](https://github.com/polywrap/toolchain/pull/1369) **Remove Legacy Redirects** - - `PolywrapClient` config when using `noDefaults: true` no longer accepts `redirects` (Since redirects have been removed from `CoreClientConfig`). -- [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** - - The Polywrap Client with `noDefaults: false` no longer accepts a `plugins` field, but it accepts `wrappers` and `packages`. - - `resolver` field has been replaced with `resolvers`, since with default client the resolver used is the `RecursiveResolver` with the `PackageToWrapperCacheResolver`. - - The Polywrap Client with `noDefaults: true`, no longer accepts a `plugins` field. It is expected that devs using this option will manually configure their own resolver. - - removed `getPlugins` and `getPluginByUri`. Will add `getWrapper`, `getWrapperByUri`, `getPackage`, `getPackageByUri`, in a follow up PR. - - `createPolywrapClient` function has been deprecated. -- [PR-1534](https://github.com/polywrap/toolchain/pull/1534) **Remove legacy config types from PolywrapClient** - - The `PolywrapClient`'s constructor now accepts only an optional `CoreClientConfig` type as its configuration object. - - It is now advised to use the `ClientConfigBuilder` found in `@polywrap/client-config-builder-js` and exported by `@polywrap/client-js` in order to set up their client configurations. +* [PR-1534](https://github.com/polywrap/toolchain/pull/1534) **Remove legacy config types from `PolywrapClient`** + * The `PolywrapClient` now simply accepts a `CoreClientConfig`, which is expected to come from the config builder. +* [PR-1461](https://github.com/polywrap/toolchain/pull/1461) **Remove Legacy Invocation Methods** + * Remove `client.query(...)` & `client.subscribe(...)` methods. +* [PR-1369](https://github.com/polywrap/toolchain/pull/1369) **Remove Legacy Redirects** + * `PolywrapClient` config when using `noDefaults: true` no longer accepts `redirects` (Since redirects have been removed from `CoreClientConfig`). +* [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** + * The Polywrap Client with `noDefaults: false` no longer accepts a `plugins` field, but it accepts `wrappers` and `packages`. + * `resolver` field has been replaced with `resolvers`, since with default client the resolver used is the `RecursiveResolver` with the `PackageToWrapperCacheResolver`. + * The Polywrap Client with `noDefaults: true`, no longer accepts a `plugins` field. It is expected that devs using this option will manually configure their own resolver. + * removed `getPlugins` and `getPluginByUri`. Will add `getWrapper`, `getWrapperByUri`, `getPackage`, `getPackageByUri`, in a follow up PR. + * `createPolywrapClient` function has been deprecated. +* [PR-1534](https://github.com/polywrap/toolchain/pull/1534) **Remove legacy config types from PolywrapClient** + * The `PolywrapClient`'s constructor now accepts only an optional `CoreClientConfig` type as its configuration object. + * It is now advised to use the `ClientConfigBuilder` found in `@polywrap/client-config-builder-js` and exported by `@polywrap/client-js` in order to set up their client configurations. **`@polywrap/client-config-builder-js`:** - -- [PR-1480](https://github.com/polywrap/toolchain/pull/1480) **ClientConfigBuilder-specific `BuilderConfig` Object** - - The `ClientConfigBuilder` now uses a specific `BuilderConfig` that is easier for users to work with. It will then be turned into a `CoreClientConfig` through the use of the `build()` method. -- [PR-1498](https://github.com/polywrap/toolchain/pull/1498) **Refactor `ClientConfigBuilder.build()`** - - Rename `buildCoreConfig()` to `build()`, which returns a `CoreClientConfig` instance. -- [PR-1494](https://github.com/polywrap/toolchain/pull/1494) **Deprecate Legacy HTTP URIs in Default Config Bundle** - - The `wrap://ens/http.polywrap.eth` interface and wrapper have been removed from the default configuration bundle. -- [PR-1436](https://github.com/polywrap/toolchain/pull/1436) **Deprecate Legacy Logger URIs in Default Config Bundle** - - The `wrap://ens/logger.core.polywrap.eth` interface and the `wrap://ens/js-logger.polywrap.eth` plugin wrapper have both been removed from the default configuration bundle. -- [PR-1446](https://github.com/polywrap/toolchain/pull/1446) **Deprecate Legacy Ethereum URI in Default Config Bundle** - - The `wrap://ens/ethereum.polywrap.eth` URI + wrap has been removed from the default configuration bundle. -- [PR-1475](https://github.com/polywrap/toolchain/pull/1475) **Deprecate Legacy IPFS URIs in Default Config Bundle** - - The `wrap://ens/ipfs.polywrap.eth` & `wrap://ens/ipfs-resolver.polywrap.eth` URIs + wraps have been removed from the default configuration bundle. -- [PR-1369](https://github.com/polywrap/toolchain/pull/1369) **Remove Legacy Redirects** - - Calling `buildCoreConfig` no longer returns a `CoreClientConfig` with redirects since redirects are no longer a part of `CoreClientConfig`. -- [PR-1367](https://github.com/polywrap/toolchain/pull/1367) **URI Redirect Renaming** - - Renamed `removeUriRedirect(...)` to `removeRedirePR-15e `plugins`and a`resolver`, but now has `wrappers`, `packages`and`resolvers` - - Calling build returns an instance of the `CustomClientConfig`, which can be used with defaults from the `PolywrapClient`, but can not be used if `noDefaults: true` is passed to the `PolywrapClient` constructor. - - Removed `addPlugin` from the `ClientConfigBuilder`, users can now use `addWrapper` or `addPackage` where appropriate. +* [PR-1480](https://github.com/polywrap/toolchain/pull/1480) **ClientConfigBuilder-specific `BuilderConfig` Object** + * The `ClientConfigBuilder` now uses a specific `BuilderConfig` that is easier for users to work with. It will then be turned into a `CoreClientConfig` through the use of the `build()` method. +* [PR-1498](https://github.com/polywrap/toolchain/pull/1498) **Refactor `ClientConfigBuilder.build()`** + * Rename `buildCoreConfig()` to `build()`, which returns a `CoreClientConfig` instance. +* [PR-1494](https://github.com/polywrap/toolchain/pull/1494) **Deprecate Legacy HTTP URIs in Default Config Bundle** + * The `wrap://ens/http.polywrap.eth` interface and wrapper have been removed from the default configuration bundle. +* [PR-1436](https://github.com/polywrap/toolchain/pull/1436) **Deprecate Legacy Logger URIs in Default Config Bundle** + * The `wrap://ens/logger.core.polywrap.eth` interface and the `wrap://ens/js-logger.polywrap.eth` plugin wrapper have both been removed from the default configuration bundle. +* [PR-1446](https://github.com/polywrap/toolchain/pull/1446) **Deprecate Legacy Ethereum URI in Default Config Bundle** + * The `wrap://ens/ethereum.polywrap.eth` URI + wrap has been removed from the default configuration bundle. +* [PR-1475](https://github.com/polywrap/toolchain/pull/1475) **Deprecate Legacy IPFS URIs in Default Config Bundle** + * The `wrap://ens/ipfs.polywrap.eth` & `wrap://ens/ipfs-resolver.polywrap.eth` URIs + wraps have been removed from the default configuration bundle. +* [PR-1369](https://github.com/polywrap/toolchain/pull/1369) **Remove Legacy Redirects** + * Calling `buildCoreConfig` no longer returns a `CoreClientConfig` with redirects since redirects are no longer a part of `CoreClientConfig`. +* [PR-1367](https://github.com/polywrap/toolchain/pull/1367) **URI Redirect Renaming** + * Renamed `removeUriRedirect(...)` to `removeRedirePR-15e `plugins` and a `resolver`, but now has `wrappers`, `packages` and `resolvers` + * Calling build returns an instance of the `CustomClientConfig`, which can be used with defaults from the `PolywrapClient`, but can not be used if `noDefaults: true` is passed to the `PolywrapClient` constructor. + * Removed `addPlugin` from the `ClientConfigBuilder`, users can now use `addWrapper` or `addPackage` where appropriate. **`@polywrap/plugin-js`:** - -- [PR-1614](https://github.com/polywrap/toolchain/pull/1614) **Remove `env` Property From `PluginModule`** - - `PluginModule` instances no longer have an `env` property, and instead will be given an `env` within the invocation method's arguments. +* [PR-1614](https://github.com/polywrap/toolchain/pull/1614) **Remove `env` Property From `PluginModule`** + * `PluginModule` instances no longer have an `env` property, and instead will be given an `env` within the invocation method's arguments. **`@polywrap/core-js`:** - -- [PR-1613](https://github.com/polywrap/toolchain/pull/1613) **Core Client Config Unique Maps** - - The `CoreClientConfig` now `ReadonlyUriMap`s for its `interface` and `env` properties. -- [PR-1369](https://github.com/polywrap/toolchain/pull/1369) **Remove Legacy Redirects** - - `redirects` are no longer a part of `CoreClientConfig`. - - `getRedirects` are no longer a part of `CoreClient`. - - `getUriResolver` on `CoreClient` has been renamed to `getResolver`. - - `getImplementations` returns a promise now. - - `GetImplementationsOptions` no longer accepts `applyRedirects`. This has been replaces with `applyResolution`. - - `applyRedirects` helper function has been replaced with `applyResolution`. -- [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** - - Plugins are no longer a part of this package, they have been moved to the plugin-js package - - Renamed `UriRedirect` to `IUriRedirect` to match `IUriWrapper` and `IUriPackage` - - `IUriRedirect`, `IUriWrapper` and `IUriPackage` are now generic and their generic param implements `Uri | string` - - Removed `options` argument from `client.getManifest` method since all wrappers have a deserialized manifest +* [PR-1613](https://github.com/polywrap/toolchain/pull/1613) **Core Client Config Unique Maps** + * The `CoreClientConfig` now `ReadonlyUriMap`s for its `interface` and `env` properties. +* [PR-1369](https://github.com/polywrap/toolchain/pull/1369) **Remove Legacy Redirects** + * `redirects` are no longer a part of `CoreClientConfig`. + * `getRedirects` are no longer a part of `CoreClient`. + * `getUriResolver` on `CoreClient` has been renamed to `getResolver`. + * `getImplementations` returns a promise now. + * `GetImplementationsOptions` no longer accepts `applyRedirects`. This has been replaces with `applyResolution`. + * `applyRedirects` helper function has been replaced with `applyResolution`. +* [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** + * Plugins are no longer a part of this package, they have been moved to the plugin-js package + * Renamed `UriRedirect` to `IUriRedirect` to match `IUriWrapper` and `IUriPackage` + * `IUriRedirect`, `IUriWrapper` and `IUriPackage` are now generic and their generic param implements `Uri | string` + * Removed `options` argument from `client.getManifest` method since all wrappers have a deserialized manifest **`@polywrap/uri-resolvers-js`:** - -- [PR-1586](https://github.com/polywrap/toolchain/pull/1586) **Separate the `PackageToWrapperCacheResolver` Into Two Resolvers** - - The `PackageToWrapperCacheResolver` has been split into the `PackageToWrapperResolver` & `WrapperCacheResolver` resolvers. -- [PR-1369](https://github.com/polywrap/toolchain/pull/1369) **Remove Legacy Redirects** - - `LegacyRedirectsResolver` has been removed. -- [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** - - Replaced helper func `buildUriResolver` with `UriResolver.from` - - Constructors of built-in resolvers like `RecursiveResolver` and `PackageToWrapperCacheResolver` now accept a concrete `IUriResolver` while their static `from` methods accept a `UriResolverLike` - - Remove `PluginsResolver` and `PluginResolver`, users can now use `WrapperResolver` or `PackageResolver` +* [PR-1586](https://github.com/polywrap/toolchain/pull/1586) **Separate the `PackageToWrapperCacheResolver` Into Two Resolvers** + * The `PackageToWrapperCacheResolver` has been split into the `PackageToWrapperResolver` & `WrapperCacheResolver` resolvers. +* [PR-1369](https://github.com/polywrap/toolchain/pull/1369) **Remove Legacy Redirects** + * `LegacyRedirectsResolver` has been removed. +* [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** + * Replaced helper func `buildUriResolver` with `UriResolver.from` + * Constructors of built-in resolvers like `RecursiveResolver` and `PackageToWrapperCacheResolver` now accept a concrete `IUriResolver` while their static `from` methods accept a `UriResolverLike` + * Remove `PluginsResolver` and `PluginResolver`, users can now use `WrapperResolver` or `PackageResolver` **`@polywrap/uri-resolver-extensions-js`:** - -- [PR-1582](https://github.com/polywrap/toolchain/pull/1582) **Remove Legacy uri-resolver-ext Interface URI** - - The `ExtendableUriResolver` no longer supports the legacy interface URI `wrap://ens/uri-resolver.core.polywrap.eth`. +* [PR-1582](https://github.com/polywrap/toolchain/pull/1582) **Remove Legacy uri-resolver-ext Interface URI** + * The `ExtendableUriResolver` no longer supports the legacy interface URI `wrap://ens/uri-resolver.core.polywrap.eth`. **`@polywrap/react`:** - -- [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** - - Replaced `plugins` on the `PolywrapProvider` with `wrappers` and `packages` +* [PR-1236](https://github.com/polywrap/toolchain/pull/1236) **Plugin Refactor** + * Replaced `plugins` on the `PolywrapProvider` with `wrappers` and `packages` ### JS Plugins - **`@polywrap/http-plugin-js`:** - -- [PR-1494](https://github.com/polywrap/toolchain/pull/1494) Migrated to [polywrap/http](https://github.com/polywrap/http) +* [PR-1494](https://github.com/polywrap/toolchain/pull/1494) Migrated to [polywrap/http](https://github.com/polywrap/http) **`@polywrap/fs-plugin-js`:** - -- [PR-1495](https://github.com/polywrap/toolchain/pull/1495) Migrate to [polywrap/file-system](https://github.com/polywrap/file-system) +* [PR-1495](https://github.com/polywrap/toolchain/pull/1495) Migrate to [polywrap/file-system](https://github.com/polywrap/file-system) **`@polywrap/ws-plugin-js`:** - -- [PR-1547](https://github.com/polywrap/toolchain/pull/1547) Migrate to [polywrap/websocket](https://github.com/polywrap/websocket) +* [PR-1547](https://github.com/polywrap/toolchain/pull/1547) Migrate to [polywrap/websocket](https://github.com/polywrap/websocket) **`@polywrap/ethereum-plugin-js`:** - -- [PR-1446](https://github.com/polywrap/toolchain/pull/1446) Deprecated in favor of the [polywrap/ethereum](https://github.com/polywrap/ethereum) wasm-based wrap +* [PR-1446](https://github.com/polywrap/toolchain/pull/1446) Deprecated in favor of the [polywrap/ethereum](https://github.com/polywrap/ethereum) wasm-based wrap **`@polywrap/ipfs-plugin-js`:** - -- [PR-1475](https://github.com/polywrap/toolchain/pull/1475) Deprecated in favor of the [polywrap/ipfs](https://github.com/polywrap/ipfs) wasm-based wrap +* [PR-1475](https://github.com/polywrap/toolchain/pull/1475) Deprecated in favor of the [polywrap/ipfs](https://github.com/polywrap/ipfs) wasm-based wrap ### Interface Wrappers - **`@polywrap/http-interface`:** - -- [PR-1494](https://github.com/polywrap/toolchain/pull/1494) Migrated to [polywrap/http](https://github.com/polywrap/http) +* [PR-1494](https://github.com/polywrap/toolchain/pull/1494) Migrated to [polywrap/http](https://github.com/polywrap/http) **`@polywrap/file-system-interface`:** - -- [PR-1495](https://github.com/polywrap/toolchain/pull/1495) Migrate to [polywrap/file-system](https://github.com/polywrap/file-system) +* [PR-1495](https://github.com/polywrap/toolchain/pull/1495) Migrate to [polywrap/file-system](https://github.com/polywrap/file-system) ## Bugs - ### Toolchain - **`polywrap` CLI:** - -- [PR-1683](https://github.com/polywrap/toolchain/pull/1683) **Don't Require Docker `polywrap build` On Interface Projects** - - When building `type: interface` projects, the CLI no longer requires docker to be running. -- [PR-1610](https://github.com/polywrap/toolchain/pull/1610) **`polywrap test` Non-Zero Exit Codes** - - `polywrap test` now exits with an exit code of 1 if a test fails. -- [PR-1470](https://github.com/polywrap/toolchain/pull/1470) **Fix Build Manifest Absolute Path Support** - - Accept absolute paths within the `polywrap.build.yaml` manifest's `linked_packages` property. -- [PR-1438](https://github.com/polywrap/toolchain/pull/1438) **Support Maps In Workflows** - - Properly handle map types when running workflows using the `test` command. -- [PR-1396](https://github.com/polywrap/toolchain/pull/1396) **Remove Wasm "Interface Types" Custom Section** - - The rust build images have been updated to properly remove the needless inclusion of the `wasm-interface-types` custom section, as a result of running wasm-bindgen. More information can be found [here](https://github.com/polywrap/toolchain/issues/1420). -- [PR-1379](https://github.com/polywrap/toolchain/pull/1379) **Manifest Upgrade Warning Message** - - Automatically upgrading manifests now emits a warning, suggesting users to upgrade their manifest. -- [PR-1382](https://github.com/polywrap/toolchain/pull/1382) **Execute `asc` Using `npx`** - - Invoke `asc` using `npx` to help with program resolution. -- [PR-1368](https://github.com/polywrap/toolchain/pull/1368) **Client Config Error Messaging** - - Update error messaging for the `--client-config` option. +* [PR-1683](https://github.com/polywrap/toolchain/pull/1683) **Don't Require Docker `polywrap build` On Interface Projects** + * When building `type: interface` projects, the CLI no longer requires docker to be running. +* [PR-1610](https://github.com/polywrap/toolchain/pull/1610) **`polywrap test` Non-Zero Exit Codes** + * `polywrap test` now exits with an exit code of 1 if a test fails. +* [PR-1470](https://github.com/polywrap/toolchain/pull/1470) **Fix Build Manifest Absolute Path Support** + * Accept absolute paths within the `polywrap.build.yaml` manifest's `linked_packages` property. +* [PR-1438](https://github.com/polywrap/toolchain/pull/1438) **Support Maps In Workflows** + * Properly handle map types when running workflows using the `test` command. +* [PR-1396](https://github.com/polywrap/toolchain/pull/1396) **Remove Wasm "Interface Types" Custom Section** + * The rust build images have been updated to properly remove the needless inclusion of the `wasm-interface-types` custom section, as a result of running wasm-bindgen. More information can be found [here](https://github.com/polywrap/toolchain/issues/1420). +* [PR-1379](https://github.com/polywrap/toolchain/pull/1379) **Manifest Upgrade Warning Message** + * Automatically upgrading manifests now emits a warning, suggesting users to upgrade their manifest. +* [PR-1382](https://github.com/polywrap/toolchain/pull/1382) **Execute `asc` Using `npx`** + * Invoke `asc` using `npx` to help with program resolution. +* [PR-1368](https://github.com/polywrap/toolchain/pull/1368) **Client Config Error Messaging** + * Update error messaging for the `--client-config` option. **`@polywrap/schema-bind`:** - -- [PR-1444](https://github.com/polywrap/toolchain/pull/1444) **TypeScript Bindings Export Imports** - - The `plugin/typescript` and `app/typescript` bindings now properly export all interfaces. -- [PR-1443](https://github.com/polywrap/toolchain/pull/1443) **Rust Bindings Use String** - - The `wasm/rust` bindings now use `String` instead of `str` within imported interface module typings. +* [PR-1444](https://github.com/polywrap/toolchain/pull/1444) **TypeScript Bindings Export Imports** + * The `plugin/typescript` and `app/typescript` bindings now properly export all interfaces. +* [PR-1443](https://github.com/polywrap/toolchain/pull/1443) **Rust Bindings Use String** + * The `wasm/rust` bindings now use `String` instead of `str` within imported interface module typings. ### JS Client - **`@polywrap/core-js`:** - -- [PR-1593](https://github.com/polywrap/toolchain/pull/1593) **Display decoded args when errors are thrown in subinvocations** - - Args used to be displayed as-is in error messages when errors were thrown in Wasm wrapper invocations. This meant args for subinvocations were byte arrays. Now the args are always decoded for errors so they are human-readable. -- [PR-1556](https://github.com/polywrap/toolchain/pull/1556) **`WrapError` now correctly parses Rust unwrap errors** - - When calling `.unwrap()` on a Rust result that contains an error, Rust will panic with an error message that contains the Err. For fidelity to the original Err, Rust inserts escape characters in the string. For example, "\n" becomes "\\n". This behavior was not being handled correctly by WrapError's string parsing logic. +* [PR-1593](https://github.com/polywrap/toolchain/pull/1593) **Display decoded args when errors are thrown in subinvocations** + * Args used to be displayed as-is in error messages when errors were thrown in Wasm wrapper invocations. This meant args for subinvocations were byte arrays. Now the args are always decoded for errors so they are human-readable. +* [PR-1556](https://github.com/polywrap/toolchain/pull/1556) **`WrapError` now correctly parses Rust unwrap errors** + * When calling `.unwrap()` on a Rust result that contains an error, Rust will panic with an error message that contains the Err. For fidelity to the original Err, Rust inserts escape characters in the string. For example, "\n" becomes "\\n". This behavior was not being handled correctly by WrapError's string parsing logic. **`@polywrap/uri-resolvers-extensions-js`:** - -- [PR-1487](https://github.com/polywrap/toolchain/pull/1487) **Handle `null` URI Resolver Extension Return Results** - - Update the `MaybeUriOrManifest` & `getFile` interfaces to properly reflect the URI resolver extension interface. +* [PR-1487](https://github.com/polywrap/toolchain/pull/1487) **Handle `null` URI Resolver Extension Return Results** + * Update the `MaybeUriOrManifest` & `getFile` interfaces to properly reflect the URI resolver extension interface. ### Templates - **`@polywrap/templates`:** - -- [PR-1383](https://github.com/polywrap/toolchain/pull/1383) **Default Deploy Gateway** - - Add the `https://ipfs.wrappers.io` gateway to the interface template's `polywrap.deploy.yaml` manifest. +* [PR-1383](https://github.com/polywrap/toolchain/pull/1383) **Default Deploy Gateway** + * Add the `https://ipfs.wrappers.io` gateway to the interface template's `polywrap.deploy.yaml` manifest. # Polywrap Origin (0.9.3) - ## Bugs - -- [PR-1344](https://github.com/polywrap/toolchain/pull/1344) `@polywrap/cli`: Improve workflow validation. -- [PR-1345](https://github.com/polywrap/toolchain/pull/1345) `@polywrap/cli`: The `ens-recursive-name-register` deploy step now properly registers ENS sub-domains recursively. -- [PR-1342](https://github.com/polywrap/toolchain/pull/1342) `@polywrap/polywrap-manifest-schemas`: Accept @ character in folder paths. -- [PR-1333](https://github.com/polywrap/toolchain/pull/1333) `@polywrap/client-js`: Added TsDoc comments to the `PolywrapClient` class. -- [PR-1337](https://github.com/polywrap/toolchain/pull/1337) `@polywrap/schema-bind`: In Rust bindings, enum imports are now added in serialization modules when the enum is a subtype of an array (Vec) or map. +* [PR-1344](https://github.com/polywrap/toolchain/pull/1344) `@polywrap/cli`: Improve workflow validation. +* [PR-1345](https://github.com/polywrap/toolchain/pull/1345) `@polywrap/cli`: The `ens-recursive-name-register` deploy step now properly registers ENS sub-domains recursively. +* [PR-1342](https://github.com/polywrap/toolchain/pull/1342) `@polywrap/polywrap-manifest-schemas`: Accept @ character in folder paths. +* [PR-1333](https://github.com/polywrap/toolchain/pull/1333) `@polywrap/client-js`: Added TsDoc comments to the `PolywrapClient` class. +* [PR-1337](https://github.com/polywrap/toolchain/pull/1337) `@polywrap/schema-bind`: In Rust bindings, enum imports are now added in serialization modules when the enum is a subtype of an array (Vec) or map. # Polywrap Origin (0.9.2) - ## Bugs - -- [PR-1327](https://github.com/polywrap/toolchain/pull/1327) `@polywrap/schema-bind`: Added missing serialization bindings for module method arguments & return values. +* [PR-1327](https://github.com/polywrap/toolchain/pull/1327) `@polywrap/schema-bind`: Added missing serialization bindings for module method arguments & return values. # Polywrap Origin (0.9.1) - ## Bugs - -- [PR-1320](https://github.com/polywrap/toolchain/pull/1320) `@polywrap/ethereum-plugin-js`: Proper `view` method result parsing. -- [PR-1317](https://github.com/polywrap/toolchain/pull/1317) `@polywrap/core-js`, `@polywrap/uri-resolvers-extensions-js`: Properly check for null when using UriResolverExtensionFileReader to read wasm module. -- [PR-1318](https://github.com/polywrap/toolchain/pull/1318) `polywrap` CLI: The `codegen` command properly applies the `-g, --codegen-dir` option. -- [PR-1318](https://github.com/polywrap/toolchain/pull/1318) `@polywrap/templates`: Fix several issues within the `wasm` template projects. -- [PR-1316](https://github.com/polywrap/toolchain/pull/1316) `polywrap` CLI: Fix an issue where the CLI process would hang after the command had completed. -- [PR-1315](https://github.com/polywrap/toolchain/pull/1315) `polywrap` CLI: Minor cleanup post logging refactor. -- [PR-1310](https://github.com/polywrap/toolchain/pull/1310) `polywrap` CLI: Use base images from the "polywrap" Docker Hub organization. +* [PR-1320](https://github.com/polywrap/toolchain/pull/1320) `@polywrap/ethereum-plugin-js`: Proper `view` method result parsing. +* [PR-1317](https://github.com/polywrap/toolchain/pull/1317) `@polywrap/core-js`, `@polywrap/uri-resolvers-extensions-js`: Properly check for null when using UriResolverExtensionFileReader to read wasm module. +* [PR-1318](https://github.com/polywrap/toolchain/pull/1318) `polywrap` CLI: The `codegen` command properly applies the `-g, --codegen-dir` option. +* [PR-1318](https://github.com/polywrap/toolchain/pull/1318) `@polywrap/templates`: Fix several issues within the `wasm` template projects. +* [PR-1316](https://github.com/polywrap/toolchain/pull/1316) `polywrap` CLI: Fix an issue where the CLI process would hang after the command had completed. +* [PR-1315](https://github.com/polywrap/toolchain/pull/1315) `polywrap` CLI: Minor cleanup post logging refactor. +* [PR-1310](https://github.com/polywrap/toolchain/pull/1310) `polywrap` CLI: Use base images from the "polywrap" Docker Hub organization. # Polywrap Origin (0.9.0) - ## Features - -- [PR-1306](https://github.com/polywrap/toolchain/pull/1306) `polywrap` CLI: Console logging has been improved, and all commands now support `-q, --quiet` and `-v, --verbose` options. -- [PR-1204](https://github.com/polywrap/toolchain/pull/1204) `polywrap` CLI: **Build times are faster for wasm wrappers!!!** The `build` command has been updated to include the concept of "build strategies". The existing way of building (via `Dockerfile` image layers) is available through the `polywrap build --strategy image` command. Building without Docker (if all build-time dependencies are installed locally) can be performed using `--strategy local`. And lastly, the new default build strategy is `--strategy vm`, which runs all build steps in a pre-built base image, allowing for near-local speeds (once the image has been downloaded). - - NOTE: `--strategy image` is useful for source-code verification, something we'll be better supporting in the future. -- [PR-1297](https://github.com/polywrap/toolchain/pull/1297) `@polywrap/schema-bind`: `wasm/rust` now has support for `println!(...)` and `print!(...)` macros. They have been redefined to use the `polywrap_wasm_rs::wrap_debug_log(...)` function. -- [PR-1192](https://github.com/polywrap/toolchain/pull/1192) `@polywrap/client-js`: `PolywrapClient.invoke(...)` now supports invoke-time environment variables, passed in via the `env` property. -- [PR-1270](https://github.com/polywrap/toolchain/pull/1270) `polywrap` CLI: The `manifest` command has been added: - +* [PR-1306](https://github.com/polywrap/toolchain/pull/1306) `polywrap` CLI: Console logging has been improved, and all commands now support `-q, --quiet` and `-v, --verbose` options. +* [PR-1204](https://github.com/polywrap/toolchain/pull/1204) `polywrap` CLI: **Build times are faster for wasm wrappers!!!** The `build` command has been updated to include the concept of "build strategies". The existing way of building (via `Dockerfile` image layers) is available through the `polywrap build --strategy image` command. Building without Docker (if all build-time dependencies are installed locally) can be performed using `--strategy local`. And lastly, the new default build strategy is `--strategy vm`, which runs all build steps in a pre-built base image, allowing for near-local speeds (once the image has been downloaded). + * NOTE: `--strategy image` is useful for source-code verification, something we'll be better supporting in the future. +* [PR-1297](https://github.com/polywrap/toolchain/pull/1297) `@polywrap/schema-bind`: `wasm/rust` now has support for `println!(...)` and `print!(...)` macros. They have been redefined to use the `polywrap_wasm_rs::wrap_debug_log(...)` function. +* [PR-1192](https://github.com/polywrap/toolchain/pull/1192) `@polywrap/client-js`: `PolywrapClient.invoke(...)` now supports invoke-time environment variables, passed in via the `env` property. +* [PR-1270](https://github.com/polywrap/toolchain/pull/1270) `polywrap` CLI: The `manifest` command has been added: ``` Usage: polywrap manifest|m [options] [command] Inspect & Migrade Polywrap Manifests @@ -512,511 +426,404 @@ Commands: migrate|m [options] [type] Migrates the polywrap project manifest to the latest version. help [command] display help for command ``` - -- [PR-1301](https://github.com/polywrap/toolchain/pull/1301) Added a `--format` option to the `migrate` command, enabling the targeting of specific format versions when migrating manifests (ex: `polywrap manifest migrate -f 0.2.0`). -- [PR-1218](https://github.com/polywrap/toolchain/pull/1218) `polywrap` CLI, `@polywrap/tracing-js`: The `tracing` infrastructure module (i.e. `polywrap infra up --modules tracing`) now uses version `0.11.0` of the `SizNoz` tracing service. Additionally the underlying `@polywrap/tracing-js` library has been updated to support this, and also now has named traces via the `traceName` configuration property. + * [PR-1301](https://github.com/polywrap/toolchain/pull/1301) Added a `--format` option to the `migrate` command, enabling the targeting of specific format versions when migrating manifests (ex: `polywrap manifest migrate -f 0.2.0`). +* [PR-1218](https://github.com/polywrap/toolchain/pull/1218) `polywrap` CLI, `@polywrap/tracing-js`: The `tracing` infrastructure module (i.e. `polywrap infra up --modules tracing`) now uses version `0.11.0` of the `SizNoz` tracing service. Additionally the underlying `@polywrap/tracing-js` library has been updated to support this, and also now has named traces via the `traceName` configuration property. ## Bugs - -- [PR-1304](https://github.com/polywrap/toolchain/pull/1304) `polywrap` CLI: Generated build files from the `vm` strategy now have proper file-system permissions. -- [PR-1305](https://github.com/polywrap/toolchain/pull/1305) `@polywrap/ipfs-plugin-js`: Fallback providers are now properly being used. -- [PR-1296](https://github.com/polywrap/toolchain/pull/1296) `polywrap` CLI: The `polywrap.app.yaml` and `polywrap.plugin.yaml` project manifest file names are being deprecated in favor of a unified `polywrap.yaml` file for all types of projects (wasm, interface, plugin, app). They will still silently work now, but in the future will no longer be recognized defaults. -- [PR-1303](https://github.com/polywrap/toolchain/pull/1303) `@polywrap/core-js`: The `Uri` class now properly formats itself when being `JSON.stringify(...)`'d. -- [PR-1288](https://github.com/polywrap/toolchain/pull/1288) `@polywrap/core-js`: Correctly handle errors in the `getImplementations` algorithm. -- [PR-1298](https://github.com/polywrap/toolchain/pull/1298) `@polywrap/ipfs-plugin-js`, `@polywrap/ipfs-resolver-plugin-js`: Remove the use of `require(...)` statements. -- [PR-1286](https://github.com/polywrap/toolchain/pull/1286) `@polywrap/polywrap-manifest-types-js`: Manifest migration logic has been upgraded to use a strategy that finds a "shortest path" between the `from` and `to` format versions, using predefined migration functions. +* [PR-1304](https://github.com/polywrap/toolchain/pull/1304) `polywrap` CLI: Generated build files from the `vm` strategy now have proper file-system permissions. +* [PR-1305](https://github.com/polywrap/toolchain/pull/1305) `@polywrap/ipfs-plugin-js`: Fallback providers are now properly being used. +* [PR-1296](https://github.com/polywrap/toolchain/pull/1296) `polywrap` CLI: The `polywrap.app.yaml` and `polywrap.plugin.yaml` project manifest file names are being deprecated in favor of a unified `polywrap.yaml` file for all types of projects (wasm, interface, plugin, app). They will still silently work now, but in the future will no longer be recognized defaults. +* [PR-1303](https://github.com/polywrap/toolchain/pull/1303) `@polywrap/core-js`: The `Uri` class now properly formats itself when being `JSON.stringify(...)`'d. +* [PR-1288](https://github.com/polywrap/toolchain/pull/1288) `@polywrap/core-js`: Correctly handle errors in the `getImplementations` algorithm. +* [PR-1298](https://github.com/polywrap/toolchain/pull/1298) `@polywrap/ipfs-plugin-js`, `@polywrap/ipfs-resolver-plugin-js`: Remove the use of `require(...)` statements. +* [PR-1286](https://github.com/polywrap/toolchain/pull/1286) `@polywrap/polywrap-manifest-types-js`: Manifest migration logic has been upgraded to use a strategy that finds a "shortest path" between the `from` and `to` format versions, using predefined migration functions. ## Breaking Changes - -- [PR-1284](https://github.com/polywrap/toolchain/pull/1284) `@polywrap/core-js`: `Wrapper.getFile(...)` and `Wrapper.getManifest(...)` no longer require a `Client` instance as a second function argument. -- [PR-1291](https://github.com/polywrap/toolchain/pull/1291) `@polywrap/core-js`, `@polywrap/client-js`: All `ClientConfig` properties are now `readonly`. -- [PR-1287](https://github.com/polywrap/toolchain/pull/1287) `@polywrap/core-js`: `executeMaybeAsyncFunction` has been removed. -- [PR-1277](https://github.com/polywrap/toolchain/pull/1277) `@polywrap/client-js`: The following methods now return the `Result` type, and will not throw exceptions: `getManifest(...)`, `getFile(...)`, `getImplementations(...)`, `query(...)`, `invokeWrapper(...)`, `invoke(...)`, `loadWrapper(...)`. -- [PR-1192](https://github.com/polywrap/toolchain/pull/1192) `@polywrap/client-js`: `PolywrapClient.invoke(...)` no longer accepts invoke-time reconfiguration via the `config` property. Users who wish to reconfigure the client can do so by calling `client.getConfig()`, modifying it via the `ClientConfigBuilder`, and constructing a new `PolywrapClient` instance. +* [PR-1284](https://github.com/polywrap/toolchain/pull/1284) `@polywrap/core-js`: `Wrapper.getFile(...)` and `Wrapper.getManifest(...)` no longer require a `Client` instance as a second function argument. +* [PR-1291](https://github.com/polywrap/toolchain/pull/1291) `@polywrap/core-js`, `@polywrap/client-js`: All `ClientConfig` properties are now `readonly`. +* [PR-1287](https://github.com/polywrap/toolchain/pull/1287) `@polywrap/core-js`: `executeMaybeAsyncFunction` has been removed. +* [PR-1277](https://github.com/polywrap/toolchain/pull/1277) `@polywrap/client-js`: The following methods now return the `Result` type, and will not throw exceptions: `getManifest(...)`, `getFile(...)`, `getImplementations(...)`, `query(...)`, `invokeWrapper(...)`, `invoke(...)`, `loadWrapper(...)`. +* [PR-1192](https://github.com/polywrap/toolchain/pull/1192) `@polywrap/client-js`: `PolywrapClient.invoke(...)` no longer accepts invoke-time reconfiguration via the `config` property. Users who wish to reconfigure the client can do so by calling `client.getConfig()`, modifying it via the `ClientConfigBuilder`, and constructing a new `PolywrapClient` instance. # Polywrap Origin (0.8.0) - ## Features - -- [PR-1083](https://github.com/polywrap/toolchain/pull/1083) `@polywrap/client-config-builder-js`: The default client config now has the ability to resolve `http` URIs (ex: `wrap://http/domain.com/path`) via the `@polywrap/http-resolver-plugin-js`. -- [PR-1083](https://github.com/polywrap/toolchain/pull/1083) `polywrap` CLI: Hosting & deploying wrappers via HTTP is now possible with the new `http` deploy & infra modules. -- [PR-1097](https://github.com/polywrap/toolchain/pull/1097) & [PR-1272](https://github.com/polywrap/toolchain/pull/1272) `polywrap` CLI, `@polywrap/polywrap-manifest-schemas`, `@polywrap/polywrap-manifest-types-js`: `polywrap.deploy.yaml` format version `0.2.0` has been added, making the schema similar to the `polywrap.test.yaml` schema, where users define a series of `jobs` to be performed. -- [PR-1097](https://github.com/polywrap/toolchain/pull/1097) `polywrap` CLI: Recursive ENS domain name registration is now supported via the `ens-recursive-name-register` deploy module. -- [PR-1060](https://github.com/polywrap/toolchain/pull/1060) `@polywrap/ipfs-interface`: Added `fallbackProviders: [String!]` to `type Options`. -- [PR-1169](https://github.com/polywrap/toolchain/pull/1169) `@polywrap/core-js`, `@polywrap/client-js`: URI resolution has been refactored. Resolution is now implemented in a single `IUriResolver` instance. -- [PR-1169](https://github.com/polywrap/toolchain/pull/1169) `@polywrap/client-js`: `invokeWrapper(...)` has been added to the `PolywrapClient` class. -- [PR-1169](https://github.com/polywrap/toolchain/pull/1169) `@polywrap/client-config-builder-js`: `setResolver(...)` has been added, enabling users to set the `IUriResolver` instance on the builder's `ClientConfig`. -- [PR-1133](https://github.com/polywrap/toolchain/pull/1133) `@polywrap/core-js`, `@polywrap/client-js`: `getPluginByUri(...)` has been added to the `Client` interface, and `PolywrapClient` class. -- [PR-1231](https://github.com/polywrap/toolchain/pull/1231) `polywrap` CLI: `build` command now supports the `--no-codegen` option, which disables the automatic codegen step when compiling projects. - -## Bugs - -- [PR-1244](https://github.com/polywrap/toolchain/pull/1244) `polywrap` CLI: Workflows can now properly access nested properties of previous job step output. -- [PR-1243](https://github.com/polywrap/toolchain/pull/1243) `@polywrap/schema-compose`: Multi-line imports are now properly supported within block comments. -- [PR-1097](https://github.com/polywrap/toolchain/pull/1097) `polywrap` CLI: ENS deployment URIs generated via the `deploy` command now properly contain the network's name in the URI. -- [PR-1234](https://github.com/polywrap/toolchain/pull/1234) `polywrap` CLI: The `run` command and underlying `Workflow` system has had multiple bug fixes added. - - Workflow validation always printed "SUCCESS" and errors were never printed. - - Workflow manifest was not being validated. - - The stderr messages were not being output (previously unnoticed because errors were not printed). -- [PR-1220](https://github.com/polywrap/toolchain/pull/1220) `@polywrap/schema-bind`: `wasm/rust` bindings handle the serialization of reserved words via serde, so that the original name of properties is reserved during encoding. -- [PR-1219](https://github.com/polywrap/toolchain/pull/1219) `@polywrap/schema-bind`: `wasm/rust` bindings now properly handle imported interface modules. -- [PR-1229](https://github.com/polywrap/toolchain/pull/1229) `polywrap` CLI: `run` command now properly resolves the `validation: ...` property within the `polywrap.test.yaml` manifest relative to the manifest's directory, instead of the user's cwd. +* [PR-1083](https://github.com/polywrap/toolchain/pull/1083) `@polywrap/client-config-builder-js`: The default client config now has the ability to resolve `http` URIs (ex: `wrap://http/domain.com/path`) via the `@polywrap/http-resolver-plugin-js`. +* [PR-1083](https://github.com/polywrap/toolchain/pull/1083) `polywrap` CLI: Hosting & deploying wrappers via HTTP is now possible with the new `http` deploy & infra modules. +* [PR-1097](https://github.com/polywrap/toolchain/pull/1097) & [PR-1272](https://github.com/polywrap/toolchain/pull/1272) `polywrap` CLI, `@polywrap/polywrap-manifest-schemas`, `@polywrap/polywrap-manifest-types-js`: `polywrap.deploy.yaml` format version `0.2.0` has been added, making the schema similar to the `polywrap.test.yaml` schema, where users define a series of `jobs` to be performed. +* [PR-1097](https://github.com/polywrap/toolchain/pull/1097) `polywrap` CLI: Recursive ENS domain name registration is now supported via the `ens-recursive-name-register` deploy module. +* [PR-1060](https://github.com/polywrap/toolchain/pull/1060) `@polywrap/ipfs-interface`: Added `fallbackProviders: [String!]` to `type Options`. +* [PR-1169](https://github.com/polywrap/toolchain/pull/1169) `@polywrap/core-js`, `@polywrap/client-js`: URI resolution has been refactored. Resolution is now implemented in a single `IUriResolver` instance. +* [PR-1169](https://github.com/polywrap/toolchain/pull/1169) `@polywrap/client-js`: `invokeWrapper(...)` has been added to the `PolywrapClient` class. +* [PR-1169](https://github.com/polywrap/toolchain/pull/1169) `@polywrap/client-config-builder-js`: `setResolver(...)` has been added, enabling users to set the `IUriResolver` instance on the builder's `ClientConfig`. +* [PR-1133](https://github.com/polywrap/toolchain/pull/1133) `@polywrap/core-js`, `@polywrap/client-js`: `getPluginByUri(...)` has been added to the `Client` interface, and `PolywrapClient` class. +* [PR-1231](https://github.com/polywrap/toolchain/pull/1231) `polywrap` CLI: `build` command now supports the `--no-codegen` option, which disables the automatic codegen step when compiling projects. + +## Bugs +* [PR-1244](https://github.com/polywrap/toolchain/pull/1244) `polywrap` CLI: Workflows can now properly access nested properties of previous job step output. +* [PR-1243](https://github.com/polywrap/toolchain/pull/1243) `@polywrap/schema-compose`: Multi-line imports are now properly supported within block comments. +* [PR-1097](https://github.com/polywrap/toolchain/pull/1097) `polywrap` CLI: ENS deployment URIs generated via the `deploy` command now properly contain the network's name in the URI. +* [PR-1234](https://github.com/polywrap/toolchain/pull/1234) `polywrap` CLI: The `run` command and underlying `Workflow` system has had multiple bug fixes added. + * Workflow validation always printed "SUCCESS" and errors were never printed. + * Workflow manifest was not being validated. + * The stderr messages were not being output (previously unnoticed because errors were not printed). +* [PR-1220](https://github.com/polywrap/toolchain/pull/1220) `@polywrap/schema-bind`: `wasm/rust` bindings handle the serialization of reserved words via serde, so that the original name of properties is reserved during encoding. +* [PR-1219](https://github.com/polywrap/toolchain/pull/1219) `@polywrap/schema-bind`: `wasm/rust` bindings now properly handle imported interface modules. +* [PR-1229](https://github.com/polywrap/toolchain/pull/1229) `polywrap` CLI: `run` command now properly resolves the `validation: ...` property within the `polywrap.test.yaml` manifest relative to the manifest's directory, instead of the user's cwd. ## Breaking Changes - -- [PR-1097](https://github.com/polywrap/toolchain/pull/1097) `polywrap` CLI: The `local-dev-ens` deploy module has been removed. -- [PR-1060](https://github.com/polywrap/toolchain/pull/1060) `@polywrap/ipfs-plugin-js`: `IpfsPluginConfig` has been removed, and all properties (`provider`, `fallbackProviders`) have been moved into the wrapper's `Env`. -- [PR-1169](https://github.com/polywrap/toolchain/pull/1169) `@polywrap/client-js`: `loadUriResolvers(...)` has been removed from the `PolywrapClient` class. -- [PR-1169](https://github.com/polywrap/toolchain/pull/1169) `@polywrap/client-js`: `resolveUri(...)` has been renamed to `tryResolveUri(...)` on the `PolywrapClient` class. -- [PR-1169](https://github.com/polywrap/toolchain/pull/1169) `@polywrap/core-js`, `@polywrap/client-js`: `getUriResolvers(...)` has been renamed to `getUriResolver(...)` on the `Client` interface and `PolywrapClient` class. -- [PR-1169](https://github.com/polywrap/toolchain/pull/1169) `@polywrap/client-config-builder-js`: `addUriResolver(...)` and `setUriResolvers(...)` have been removed from the `ClientConfigBuilder` class. -- [PR-1169](https://github.com/polywrap/toolchain/pull/1169) `@polywrap/core-js`, `@polywrap/wasm-js`: Moved the `WasmWrapper` class and all related types into their own package named `@polywrap/wasm-js`. -- [PR-1235](https://github.com/polywrap/toolchain/pull/1235) `@polywrap/core-js`: `Uri.from(...)` has been added, and `toUri(...)` has been removed. +* [PR-1097](https://github.com/polywrap/toolchain/pull/1097) `polywrap` CLI: The `local-dev-ens` deploy module has been removed. +* [PR-1060](https://github.com/polywrap/toolchain/pull/1060) `@polywrap/ipfs-plugin-js`: `IpfsPluginConfig` has been removed, and all properties (`provider`, `fallbackProviders`) have been moved into the wrapper's `Env`. +* [PR-1169](https://github.com/polywrap/toolchain/pull/1169) `@polywrap/client-js`: `loadUriResolvers(...)` has been removed from the `PolywrapClient` class. +* [PR-1169](https://github.com/polywrap/toolchain/pull/1169) `@polywrap/client-js`: `resolveUri(...)` has been renamed to `tryResolveUri(...)` on the `PolywrapClient` class. +* [PR-1169](https://github.com/polywrap/toolchain/pull/1169) `@polywrap/core-js`, `@polywrap/client-js`: `getUriResolvers(...)` has been renamed to `getUriResolver(...)` on the `Client` interface and `PolywrapClient` class. +* [PR-1169](https://github.com/polywrap/toolchain/pull/1169) `@polywrap/client-config-builder-js`: `addUriResolver(...)` and `setUriResolvers(...)` have been removed from the `ClientConfigBuilder` class. +* [PR-1169](https://github.com/polywrap/toolchain/pull/1169) `@polywrap/core-js`, `@polywrap/wasm-js`: Moved the `WasmWrapper` class and all related types into their own package named `@polywrap/wasm-js`. +* [PR-1235](https://github.com/polywrap/toolchain/pull/1235) `@polywrap/core-js`: `Uri.from(...)` has been added, and `toUri(...)` has been removed. # Polywrap Origin (0.7.0) - ## Bugs - -- [PR-1158](https://github.com/polywrap/toolchain/pull/1158) `@polywrap/client-config-builder-js`: The following plugins have been removed from the default config, and replaced with their WebAssembly wrapper equivalents available at the same URIs: - - `wrap://ens/uts46.polywrap.eth` - - `wrap://ens/sha3.polywrap.eth` - - `wrap://ens/graph-node.polywrap.eth` -- [PR-1213](https://github.com/polywrap/toolchain/pull/1213) `@polywrap/schema-bind`: Nested map types (i.e. `Map>`) are now properly supported for `wasm/rust` and `wasm/assemblyscript`. -- [PR-1213](https://github.com/polywrap/toolchain/pull/1213) `@polywrap/wasm-as`: Nested map types (i.e. `Map>`) are now properly msgpack encoded. -- [PR-1212](https://github.com/polywrap/toolchain/pull/1212) `polywrap` CLI: `wasm/rust` build image now uses the `build-deps` cargo extension to properly build dependencies in a seperate Dockerfile layer, enabling the caching of compiled artifacts. +* [PR-1158](https://github.com/polywrap/toolchain/pull/1158) `@polywrap/client-config-builder-js`: The following plugins have been removed from the default config, and replaced with their WebAssembly wrapper equivalents available at the same URIs: + * `wrap://ens/uts46.polywrap.eth` + * `wrap://ens/sha3.polywrap.eth` + * `wrap://ens/graph-node.polywrap.eth` +* [PR-1213](https://github.com/polywrap/toolchain/pull/1213) `@polywrap/schema-bind`: Nested map types (i.e. `Map>`) are now properly supported for `wasm/rust` and `wasm/assemblyscript`. +* [PR-1213](https://github.com/polywrap/toolchain/pull/1213) `@polywrap/wasm-as`: Nested map types (i.e. `Map>`) are now properly msgpack encoded. +* [PR-1212](https://github.com/polywrap/toolchain/pull/1212) `polywrap` CLI: `wasm/rust` build image now uses the `build-deps` cargo extension to properly build dependencies in a seperate Dockerfile layer, enabling the caching of compiled artifacts. ## Breaking Changes - -- [PR-1217](https://github.com/polywrap/toolchain/pull/1217) `@polywrap/schema-bind`: `plugin/typescript` and `app/typescript` bindings have been updated to improve type safety, and no longer accept generic properties for all method argument types. -- [PR-1051](https://github.com/polywrap/toolchain/pull/1051) `polywrap` CLI: `polywrap plugin codegen` and `polywrap app codegen` commands have been moved into the `polywrap codegen`, which can now generate types for any Polywrap project (wasm, plugin, app). -- [PR-1154](https://github.com/polywrap/toolchain/pull/1154) `@polywrap/schema-bind`: The `wasm/assemblyscript` bindings have been updated to use `Box | null` for all optional scalar types, instead of the `Option` class used before. -- [PR-1154](https://github.com/polywrap/toolchain/pull/1154) `@polywrap/ws-plugin-js`: The WebSocket plugin's schema has been updated to use `UInt32` for socket IDs, instead of `Int32`. +* [PR-1217](https://github.com/polywrap/toolchain/pull/1217) `@polywrap/schema-bind`: `plugin/typescript` and `app/typescript` bindings have been updated to improve type safety, and no longer accept generic properties for all method argument types. +* [PR-1051](https://github.com/polywrap/toolchain/pull/1051) `polywrap` CLI: `polywrap plugin codegen` and `polywrap app codegen` commands have been moved into the `polywrap codegen`, which can now generate types for any Polywrap project (wasm, plugin, app). +* [PR-1154](https://github.com/polywrap/toolchain/pull/1154) `@polywrap/schema-bind`: The `wasm/assemblyscript` bindings have been updated to use `Box | null` for all optional scalar types, instead of the `Option` class used before. +* [PR-1154](https://github.com/polywrap/toolchain/pull/1154) `@polywrap/ws-plugin-js`: The WebSocket plugin's schema has been updated to use `UInt32` for socket IDs, instead of `Int32`. # Polywrap Origin (0.6.0) - ## Features - -- [PR-1100](https://github.com/polywrap/toolchain/pull/1100) `polywrap` CLI: A new manifest named `polywrap.test.yaml` has been added, which encapsulates workflows and validation scripts. -- [PR-1100](https://github.com/polywrap/toolchain/pull/1100) `@polywrap/polywrap-manifest-types-js`: `polywrap.test` manifest types have been added. -- [PR-1100](https://github.com/polywrap/toolchain/pull/1100) `@polywrap/polywrap-manifest-schemas`: `polywrap.test` manifest schema has been added. +* [PR-1100](https://github.com/polywrap/toolchain/pull/1100) `polywrap` CLI: A new manifest named `polywrap.test.yaml` has been added, which encapsulates workflows and validation scripts. +* [PR-1100](https://github.com/polywrap/toolchain/pull/1100) `@polywrap/polywrap-manifest-types-js`: `polywrap.test` manifest types have been added. +* [PR-1100](https://github.com/polywrap/toolchain/pull/1100) `@polywrap/polywrap-manifest-schemas`: `polywrap.test` manifest schema has been added. ## Bugs - -- [PR-1205](https://github.com/polywrap/toolchain/pull/1205) `polywrap` CLI: The `run` command's output now has deterministic ordering for text emitted from both workflow & validation steps. -- [PR-1194](https://github.com/polywrap/toolchain/pull/1194) `@polywrap/msgpack-js`: Nested `Map` serialization is now supported. -- [PR-1199](https://github.com/polywrap/toolchain/pull/1199) `@polywrap/core-js` `@polywrap/client-js`: Runtime type inference has been improved to be compatible with JavaScript minimization optimizations where the `Class.name` static property is removed. -- [PR-1196](https://github.com/polywrap/toolchain/pull/1196) `@polywrap/core-js`: All `WrapperCache` interface methods have been updated to return `MaybeAsync` promises, allowing developers to implement async logic. +* [PR-1205](https://github.com/polywrap/toolchain/pull/1205) `polywrap` CLI: The `run` command's output now has deterministic ordering for text emitted from both workflow & validation steps. +* [PR-1194](https://github.com/polywrap/toolchain/pull/1194) `@polywrap/msgpack-js`: Nested `Map` serialization is now supported. +* [PR-1199](https://github.com/polywrap/toolchain/pull/1199) `@polywrap/core-js` `@polywrap/client-js`: Runtime type inference has been improved to be compatible with JavaScript minimization optimizations where the `Class.name` static property is removed. +* [PR-1196](https://github.com/polywrap/toolchain/pull/1196) `@polywrap/core-js`: All `WrapperCache` interface methods have been updated to return `MaybeAsync` promises, allowing developers to implement async logic. ## Breaking Changes - -- [PR-1100](https://github.com/polywrap/toolchain/pull/1100) `polywrap` CLI: `run` command no longer accepts the `` argument, and instead uses the new `polywrap.test.yaml` manifest. -- [PR-1100](https://github.com/polywrap/toolchain/pull/1100) `@polywrap/client-js`: The `run` method has been removed. -- [PR-1100](https://github.com/polywrap/toolchain/pull/1100) `@polywrap/core-js`: All `Workflow` related types have been removed, and migrated into the manifest packages and the CLI. +* [PR-1100](https://github.com/polywrap/toolchain/pull/1100) `polywrap` CLI: `run` command no longer accepts the `` argument, and instead uses the new `polywrap.test.yaml` manifest. +* [PR-1100](https://github.com/polywrap/toolchain/pull/1100) `@polywrap/client-js`: The `run` method has been removed. +* [PR-1100](https://github.com/polywrap/toolchain/pull/1100) `@polywrap/core-js`: All `Workflow` related types have been removed, and migrated into the manifest packages and the CLI. # Polywrap Origin (0.5.0) - ## Features - -- [PR-1042](https://github.com/polywrap/toolchain/pull/1042) `@polywrap/client-js`: The `PolywrapClientConfig` now has a `tracerConfig: Partial` property, allowing users to easily configure the tracing level, and various toggles related to tracing. -- [PR-1042](https://github.com/polywrap/toolchain/pull/1042) `polywrap` CLI: Added the `tracer` infra module, allowing developers to easily spin up an OpenTelemetry compatible tracing server. This can be used to gather runtime tracelog events from the `PolywrapClient`. -- [PR-1042](https://github.com/polywrap/toolchain/pull/1042) `@polywrap/tracing-js`: The `@Tracer.traceMethod()` function decorator now has an optional `TracingLevel` argument. -- [PR-1143](https://github.com/polywrap/toolchain/pull/1143) `@polywrap/ethereum-plugin-js`: The `EthereumPluginConfig` now has a `connections` property, which takes an instance of the `Connections` class. This new implementation makes configuring new network connections at runtime easier and more application developer friendly. -- [PR-1045](https://github.com/polywrap/toolchain/pull/1045) `@polywrap/client-config-builder-js`: The `ClientConfigBuilder` has been added to make building & customizing `PolywrapClientConfigs` easier than before with a simple user friendly interface. -- [PR-1036](https://github.com/polywrap/toolchain/pull/1036) `@polywrap/client-js`: Added the `wrapperCache: WrapperCache` property to the `PolywrapClientConfig` interface. -- [PR-1036](https://github.com/polywrap/toolchain/pull/1036) `@polywrap/core-js`: Added the `WrapperCache` core type, along with a `SimpleCache` implementation that persists wrappers within a map. +* [PR-1042](https://github.com/polywrap/toolchain/pull/1042) `@polywrap/client-js`: The `PolywrapClientConfig` now has a `tracerConfig: Partial` property, allowing users to easily configure the tracing level, and various toggles related to tracing. +* [PR-1042](https://github.com/polywrap/toolchain/pull/1042) `polywrap` CLI: Added the `tracer` infra module, allowing developers to easily spin up an OpenTelemetry compatible tracing server. This can be used to gather runtime tracelog events from the `PolywrapClient`. +* [PR-1042](https://github.com/polywrap/toolchain/pull/1042) `@polywrap/tracing-js`: The `@Tracer.traceMethod()` function decorator now has an optional `TracingLevel` argument. +* [PR-1143](https://github.com/polywrap/toolchain/pull/1143) `@polywrap/ethereum-plugin-js`: The `EthereumPluginConfig` now has a `connections` property, which takes an instance of the `Connections` class. This new implementation makes configuring new network connections at runtime easier and more application developer friendly. +* [PR-1045](https://github.com/polywrap/toolchain/pull/1045) `@polywrap/client-config-builder-js`: The `ClientConfigBuilder` has been added to make building & customizing `PolywrapClientConfigs` easier than before with a simple user friendly interface. +* [PR-1036](https://github.com/polywrap/toolchain/pull/1036) `@polywrap/client-js`: Added the `wrapperCache: WrapperCache` property to the `PolywrapClientConfig` interface. +* [PR-1036](https://github.com/polywrap/toolchain/pull/1036) `@polywrap/core-js`: Added the `WrapperCache` core type, along with a `SimpleCache` implementation that persists wrappers within a map. ## Bugs - -- [PR-1186](https://github.com/polywrap/toolchain/pull/1186) `@polywrap/schema-bind`: Using a `Map` type within the `Map`'s value (`V`) template argument has been fixed. -- [PR-1179](https://github.com/polywrap/toolchain/pull/1179) `polywrap` CLI: Improved the readability of the `polywrap build -v` command's output from the Docker child process. +* [PR-1186](https://github.com/polywrap/toolchain/pull/1186) `@polywrap/schema-bind`: Using a `Map` type within the `Map`'s value (`V`) template argument has been fixed. +* [PR-1179](https://github.com/polywrap/toolchain/pull/1179) `polywrap` CLI: Improved the readability of the `polywrap build -v` command's output from the Docker child process. ## Breaking Changes - -- [PR-1042](https://github.com/polywrap/toolchain/pull/1042) `@polywrap/client-js`: The `PolywrapClientConfig`'s `tracingEnabled` property has been removed, and replaced by `tracerConfig`. -- [PR-1143](https://github.com/polywrap/toolchain/pull/1143) `@polywrap/ethereum-plugin-js`: The `EthereumPluginConfig`'s `networks` property has been removed, and replaced by `connections`. -- [PR-1045](https://github.com/polywrap/toolchain/pull/1045) `@polywrap/client-js`: The `getDefaultClientConfig()` & `defaultIpfsProviders` exports have been moved to the `@polywrap/client-config-builder-js` package. +* [PR-1042](https://github.com/polywrap/toolchain/pull/1042) `@polywrap/client-js`: The `PolywrapClientConfig`'s `tracingEnabled` property has been removed, and replaced by `tracerConfig`. +* [PR-1143](https://github.com/polywrap/toolchain/pull/1143) `@polywrap/ethereum-plugin-js`: The `EthereumPluginConfig`'s `networks` property has been removed, and replaced by `connections`. +* [PR-1045](https://github.com/polywrap/toolchain/pull/1045) `@polywrap/client-js`: The `getDefaultClientConfig()` & `defaultIpfsProviders` exports have been moved to the `@polywrap/client-config-builder-js` package. # Polywrap Origin (0.4.1) - ## Features - -- [PR-1171](https://github.com/polywrap/monorepo/pull/1171) `@polywrap/schema-bind`: Handle reserve words (keywords) for object, enum, and method names. +* [PR-1171](https://github.com/polywrap/monorepo/pull/1171) `@polywrap/schema-bind`: Handle reserve words (keywords) for object, enum, and method names. ## Bugs - -- [PR-1168](https://github.com/polywrap/monorepo/pull/1168) `@polywrap/schema-bind`: Fix imported optional map issue in Rust bindings. -- [PR-1167](https://github.com/polywrap/monorepo/pull/1167) Remove all `wrap-man` folders, that were published to solve the plugin's circular dependency issue. +* [PR-1168](https://github.com/polywrap/monorepo/pull/1168) `@polywrap/schema-bind`: Fix imported optional map issue in Rust bindings. +* [PR-1167](https://github.com/polywrap/monorepo/pull/1167) Remove all `wrap-man` folders, that were published to solve the plugin's circular dependency issue. # Polywrap Origin (0.4.0) - ## Features - -- [PR-1091](https://github.com/polywrap/monorepo/pull/1091) `@polywrap/polywrap-manifest-schemas`: Polywrap project manifests (`polywrap.yaml`, `polywrap.app.yaml`, `polywrap.plugin.yaml`) have a new format `0.2.0`, which restructures the manifest into 3 top level properties: `project`, `source`, and `extensions`. Additionally all project manifests can be given the `polywrap.yaml` file name. -- [PR-1092](https://github.com/polywrap/monorepo/pull/1092) `@polywrap/ws-plugin-js`: Added a WebSocket plugin. -- [PR-1096](https://github.com/polywrap/monorepo/pull/1096) `@polywrap/client-js`: Expose the `noValidate` option for the `client.getManifest(...)` method. -- [PR-820](https://github.com/polywrap/monorepo/pull/820) `polywrap` CLI: `docgen` command added, allowing wrapper developers to easily generate documentation. Supported formats: schema, docusaurus, jsdoc. -- [PR-1068](https://github.com/polywrap/monorepo/pull/1068) `@polywrap/ethereum-plugin-js`: `requestAccounts` method added, which utilizes the `eth_requestAccounts` RPC method on the configured provider. +* [PR-1091](https://github.com/polywrap/monorepo/pull/1091) `@polywrap/polywrap-manifest-schemas`: Polywrap project manifests (`polywrap.yaml`, `polywrap.app.yaml`, `polywrap.plugin.yaml`) have a new format `0.2.0`, which restructures the manifest into 3 top level properties: `project`, `source`, and `extensions`. Additionally all project manifests can be given the `polywrap.yaml` file name. +* [PR-1092](https://github.com/polywrap/monorepo/pull/1092) `@polywrap/ws-plugin-js`: Added a WebSocket plugin. +* [PR-1096](https://github.com/polywrap/monorepo/pull/1096) `@polywrap/client-js`: Expose the `noValidate` option for the `client.getManifest(...)` method. +* [PR-820](https://github.com/polywrap/monorepo/pull/820) `polywrap` CLI: `docgen` command added, allowing wrapper developers to easily generate documentation. Supported formats: schema, docusaurus, jsdoc. +* [PR-1068](https://github.com/polywrap/monorepo/pull/1068) `@polywrap/ethereum-plugin-js`: `requestAccounts` method added, which utilizes the `eth_requestAccounts` RPC method on the configured provider. ## Bugs - -- [PR-1142](https://github.com/polywrap/monorepo/pull/1142) `wasm/rust`: `Map` bugs have been fixed. -- [PR-1140](https://github.com/polywrap/monorepo/pull/1140) `polywrap` CLI: Added a check to make sure the Docker daemon is running, and provides an informative error if it is not. -- [PR-1090](https://github.com/polywrap/monorepo/pull/1090) `polywrap/wrap-manifest-types-js`: Remove runtime schema bundling, which required file system access. -- [PR-1050](https://github.com/polywrap/monorepo/pull/1050) `polywrap` CLI: Errors encounted in child processes now output both `stdtypesout` and `stderr`, allowing easier end-user debugging. +* [PR-1142](https://github.com/polywrap/monorepo/pull/1142) `wasm/rust`: `Map` bugs have been fixed. +* [PR-1140](https://github.com/polywrap/monorepo/pull/1140) `polywrap` CLI: Added a check to make sure the Docker daemon is running, and provides an informative error if it is not. +* [PR-1090](https://github.com/polywrap/monorepo/pull/1090) `polywrap/wrap-manifest-types-js`: Remove runtime schema bundling, which required file system access. +* [PR-1050](https://github.com/polywrap/monorepo/pull/1050) `polywrap` CLI: Errors encounted in child processes now output both `stdtypesout` and `stderr`, allowing easier end-user debugging. ## Breaking Changes - -- [PR-1046](https://github.com/polywrap/monorepo/pull/1046) `polywrap` CLI: `schema.graphql` has been removed from wrapper build artifacts. `polywrap.plugin.yaml` has been removed from plugin build artifacts. -- [PR-1046](https://github.com/polywrap/monorepo/pull/1046) `@polywrap/schema-bind`: `schema.ts` has been removed from typescript bindings. -- [PR-1046](https://github.com/polywrap/monorepo/pull/1046) `@polywrap/schema-bind` `@polywrap/schema-compose`: `WrapAbi` is now used in all places, instead of schema documents. -- [PR-1095](https://github.com/polywrap/monorepo/pull/1095) `@polywrap/http-plugin-js`: Use `Map` for `headers` & `urlParams`. -- [PR-1073](https://github.com/polywrap/monorepo/pull/1073) `@polywrap/schema-compose`: The `ComposerOptions` property `schemas: SchemaFile[]` has been replaced with `schema: SchemaFile`. Additionally the function argument `schemas: SchemaFile[]` on the `resolveImports` function has bee replaced with `schema: SchemaFile`. -- [PR-1073](https://github.com/polywrap/monorepo/pull/1073) `@polywrap/wrap-manifest-types-js`: In `WrapAbi` format `0.1`, properties no longer accept `null` and instead use `undefined`. -- [PR-1073](https://github.com/polywrap/monorepo/pull/1073) `@polywrap/schema-parse`: `Abi` export renamed to `WrapAbi`. +* [PR-1046](https://github.com/polywrap/monorepo/pull/1046) `polywrap` CLI: `schema.graphql` has been removed from wrapper build artifacts. `polywrap.plugin.yaml` has been removed from plugin build artifacts. +* [PR-1046](https://github.com/polywrap/monorepo/pull/1046) `@polywrap/schema-bind`: `schema.ts` has been removed from typescript bindings. +* [PR-1046](https://github.com/polywrap/monorepo/pull/1046) `@polywrap/schema-bind` `@polywrap/schema-compose`: `WrapAbi` is now used in all places, instead of schema documents. +* [PR-1095](https://github.com/polywrap/monorepo/pull/1095) `@polywrap/http-plugin-js`: Use `Map` for `headers` & `urlParams`. +* [PR-1073](https://github.com/polywrap/monorepo/pull/1073) `@polywrap/schema-compose`: The `ComposerOptions` property `schemas: SchemaFile[]` has been replaced with `schema: SchemaFile`. Additionally the function argument `schemas: SchemaFile[]` on the `resolveImports` function has bee replaced with `schema: SchemaFile`. +* [PR-1073](https://github.com/polywrap/monorepo/pull/1073) `@polywrap/wrap-manifest-types-js`: In `WrapAbi` format `0.1`, properties no longer accept `null` and instead use `undefined`. +* [PR-1073](https://github.com/polywrap/monorepo/pull/1073) `@polywrap/schema-parse`: `Abi` export renamed to `WrapAbi`. # Polywrap Origin (0.3.0) - ## Features - -- [PR-1034](https://github.com/polywrap/monorepo/pull/1034) `@polywrap/wrap-manifest-schemas`, `@polywrap/wrap-manifest-types-js`: Added a JSON-schema for the `wrap.info`'s `abi` field. -- [PR-1058](https://github.com/polywrap/monorepo/pull/1058) `polywrap` CLI: Deploy results can now be output to a file using the `-o, --output-file ` option of the `deploy` command. +* [PR-1034](https://github.com/polywrap/monorepo/pull/1034) `@polywrap/wrap-manifest-schemas`, `@polywrap/wrap-manifest-types-js`: Added a JSON-schema for the `wrap.info`'s `abi` field. +* [PR-1058](https://github.com/polywrap/monorepo/pull/1058) `polywrap` CLI: Deploy results can now be output to a file using the `-o, --output-file ` option of the `deploy` command. ## Bugs - -- [PR-1034](https://github.com/polywrap/monorepo/pull/1034) `@polywrap/wrap-manifest-schemas`, `@polywrap/polywrap-manifest-schemas`: Version numbers for the manifest's `format: ...` field have been changed to only include `.` (ex: `0.1.0` is now `0.1`). This is because there cannot be a change to a pure interface that is a ``. -- [PR-1034](https://github.com/polywrap/monorepo/pull/1034) `@polywrap/package-validation`: The `wrap.info.abi` field is no longer being validated via schema rendering, and is instead utilizing the newly added JSON-schema. -- [PR-1054](https://github.com/polywrap/monorepo/pull/1054) `polywrap` CLI: Improved `wasm/rust` build times by refactoring the build image's Dockerfile, helping reduce cache invalidations. -- [PR-1053](https://github.com/polywrap/monorepo/pull/1053) `@polywrap/wasm-as`: Increased minor version of as-bignumber. The new version has a bug fix for the toFixed method, which was incorrectly printing numbers when a decimal number was rounded to an integer. +* [PR-1034](https://github.com/polywrap/monorepo/pull/1034) `@polywrap/wrap-manifest-schemas`, `@polywrap/polywrap-manifest-schemas`: Version numbers for the manifest's `format: ...` field have been changed to only include `.` (ex: `0.1.0` is now `0.1`). This is because there cannot be a change to a pure interface that is a ``. +* [PR-1034](https://github.com/polywrap/monorepo/pull/1034) `@polywrap/package-validation`: The `wrap.info.abi` field is no longer being validated via schema rendering, and is instead utilizing the newly added JSON-schema. +* [PR-1054](https://github.com/polywrap/monorepo/pull/1054) `polywrap` CLI: Improved `wasm/rust` build times by refactoring the build image's Dockerfile, helping reduce cache invalidations. +* [PR-1053](https://github.com/polywrap/monorepo/pull/1053) `@polywrap/wasm-as`: Increased minor version of as-bignumber. The new version has a bug fix for the toFixed method, which was incorrectly printing numbers when a decimal number was rounded to an integer. ## Breaking Changes - -- [PR-1034](https://github.com/polywrap/monorepo/pull/1034) `@polywrap/wrap-manifest-types-js`: `deserializeWrapManifest` is now `async`. +* [PR-1034](https://github.com/polywrap/monorepo/pull/1034) `@polywrap/wrap-manifest-types-js`: `deserializeWrapManifest` is now `async`. # Polywrap Origin (0.2.0) - ## Bugs - -- [PR-1040](https://github.com/polywrap/monorepo/pull/1040) `polywrap` CLI: Added proper CORS handling for the IPFS node located within the `eth-ens-ipfs` default infra module. +* [PR-1040](https://github.com/polywrap/monorepo/pull/1040) `polywrap` CLI: Added proper CORS handling for the IPFS node located within the `eth-ens-ipfs` default infra module. ## Breaking Changes - -- [PR-1035](https://github.com/polywrap/monorepo/pull/1035) `polywrap.meta` Manifest: Removed the `queries` property from version `0.1.0` of the manifest. -- [PR-1039](https://github.com/polywrap/monorepo/pull/1039) `@polywrap/ipfs-resolver-plugin-js`: Remove the `IpfsResolverPlugin`'s config, as it was never being used. +* [PR-1035](https://github.com/polywrap/monorepo/pull/1035) `polywrap.meta` Manifest: Removed the `queries` property from version `0.1.0` of the manifest. +* [PR-1039](https://github.com/polywrap/monorepo/pull/1039) `@polywrap/ipfs-resolver-plugin-js`: Remove the `IpfsResolverPlugin`'s config, as it was never being used. # Polywrap Origin (0.1.1) - ## Features - -- [PR-1017](https://github.com/polywrap/monorepo/pull/1017) `@polywrap/templates`, `polywrap` CLI: Rust wasm wrapper project template has been added, and made available via the `polywrap create ...` CLI command. +* [PR-1017](https://github.com/polywrap/monorepo/pull/1017) `@polywrap/templates`, `polywrap` CLI: Rust wasm wrapper project template has been added, and made available via the `polywrap create ...` CLI command. ## Bugs - -- [PR-1016](https://github.com/polywrap/monorepo/pull/1016) `polywrap` CLI: Improved logging when running workflows using the `polywrap run ...` command. -- [PR-924](https://github.com/polywrap/monorepo/pull/924) `@polywrap/schema-parse`, `@polywrap/schema-bind`: Complex `Map` type usages within wrapper schemas lead to incorrect bindings being generated. Additional tests + fixes have been added. +* [PR-1016](https://github.com/polywrap/monorepo/pull/1016) `polywrap` CLI: Improved logging when running workflows using the `polywrap run ...` command. +* [PR-924](https://github.com/polywrap/monorepo/pull/924) `@polywrap/schema-parse`, `@polywrap/schema-bind`: Complex `Map` type usages within wrapper schemas lead to incorrect bindings being generated. Additional tests + fixes have been added. # Polywrap Origin (0.1.0) - ![Public Release Announcement (2)](https://user-images.githubusercontent.com/5522128/177474776-76886b67-6554-41a9-841b-939728e273ca.png) -_"Good evening traveler, welcome to Polywrap, a planet in the WRAP galaxy. We're happy to have you here. Ask around, I'm sure someone can help you navigate this place..." - NPC_ +*"Good evening traveler, welcome to Polywrap, a planet in the WRAP galaxy. We're happy to have you here. Ask around, I'm sure someone can help you navigate this place..." - NPC* https://polywrap.io/ # Polywrap 0.0.1-prealpha.93 - ## Breaking Changes - -- [PR-986](https://github.com/polywrap/monorepo/pull/986) WRAP build artifacts have been refined: - - Wasm module name changed from `module.wasm` to `wrap.wasm` - - Polywrap manifests are no longer written to build folder (except for project metadata). - - The `wrap.info` is now the primary manifest file describing the wrapper: - - `{ version, type, name, abi }` - - [source](https://github.com/polywrap/monorepo/blob/7fd5b2faad2cb664044edde133d8e068d685d97a/packages/js/manifests/wrap/src/formats/wrap.info/0.0.1.ts) - - encoded as msgpack binary file - - `schema.graphql` remains but will be deprecated for `wrap.info`'s built-in `abi`. +* [PR-986](https://github.com/polywrap/monorepo/pull/986) WRAP build artifacts have been refined: + * Wasm module name changed from `module.wasm` to `wrap.wasm` + * Polywrap manifests are no longer written to build folder (except for project metadata). + * The `wrap.info` is now the primary manifest file describing the wrapper: + * `{ version, type, name, abi }` + * [source](https://github.com/polywrap/monorepo/blob/7fd5b2faad2cb664044edde133d8e068d685d97a/packages/js/manifests/wrap/src/formats/wrap.info/0.0.1.ts) + * encoded as msgpack binary file + * `schema.graphql` remains but will be deprecated for `wrap.info`'s built-in `abi`. # Polywrap 0.0.1-prealpha.92 - ## Features - -- [PR-1006](https://github.com/polywrap/monorepo/pull/1006/files) `polywrap-wasm-rs`: Add Rust encoder unit tests. -- [PR-967](https://github.com/polywrap/monorepo/pull/967) `polywrap` CLI, `polywrap-wasm-rs`, `@polywrap/wasm-as`, `@polywrap/schema-parse`, `@polywrap/schema-compose`, `@polywrap/schema-bind`, `@polywrap/core-js`, `@polywrap/client-js`: Environment configuration for wrappers was refactored to enable environments at the method level, remove client env sanitization and adding support for Rust. `@env` annotation was introduced for methods declared in wrappers's schemas. -- [PR-1005](https://github.com/polywrap/monorepo/pull/1005) `@polywrap/core-js`, `@polywrap/client-js`: Refactored `client.subscribe` to use invoke syntax. +* [PR-1006](https://github.com/polywrap/monorepo/pull/1006/files) `polywrap-wasm-rs`: Add Rust encoder unit tests. +* [PR-967](https://github.com/polywrap/monorepo/pull/967) `polywrap` CLI, `polywrap-wasm-rs`, `@polywrap/wasm-as`, `@polywrap/schema-parse`, `@polywrap/schema-compose`, `@polywrap/schema-bind`, `@polywrap/core-js`, `@polywrap/client-js`: Environment configuration for wrappers was refactored to enable environments at the method level, remove client env sanitization and adding support for Rust. `@env` annotation was introduced for methods declared in wrappers's schemas. +* [PR-1005](https://github.com/polywrap/monorepo/pull/1005) `@polywrap/core-js`, `@polywrap/client-js`: Refactored `client.subscribe` to use invoke syntax. ## Breaking Changes - -- [PR-967](https://github.com/polywrap/monorepo/pull/967) Wasm runtime (`polywrap-wasm-rs`, `@polywrap/wasm-as`) changed invoke signature and imports/exports, schema pipeline (`@polywrap/schema-parse`, `@polywrap/schema-compose`, `@polywrap/schema-bind`) now supports external env imports and TypeInfo and `@env` annotation for methods, `polywrap` changed compiler's imports, `@polywrap/core-js` changed Plugin interface, `@polywrap/client-js` changed environment model implementation. -- [PR-1005](https://github.com/polywrap/monorepo/pull/1005) `@polywrap/core-js`, `@polywrap/client-js`: Refactored `client.subscribe` to use invoke syntax. +* [PR-967](https://github.com/polywrap/monorepo/pull/967) Wasm runtime (`polywrap-wasm-rs`, `@polywrap/wasm-as`) changed invoke signature and imports/exports, schema pipeline (`@polywrap/schema-parse`, `@polywrap/schema-compose`, `@polywrap/schema-bind`) now supports external env imports and TypeInfo and `@env` annotation for methods, `polywrap` changed compiler's imports, `@polywrap/core-js` changed Plugin interface, `@polywrap/client-js` changed environment model implementation. +* [PR-1005](https://github.com/polywrap/monorepo/pull/1005) `@polywrap/core-js`, `@polywrap/client-js`: Refactored `client.subscribe` to use invoke syntax. # Polywrap 0.0.1-prealpha.91 - ## Features - -- [PR-989](https://github.com/polywrap/monorepo/pull/989/files) `@polywrap/core-js`: Add job status in workflow job's result object. -- [PR-992](https://github.com/polywrap/monorepo/pull/992) `polywrap` CLI: Allow configuring the client using the `--client-config` on all applicable commands. -- [PR-1000](https://github.com/polywrap/monorepo/pull/1000) `@polywrap/core-js`: Added the `encodeResult` property to `InvokeOptions`. -- [PR-1000](https://github.com/polywrap/monorepo/pull/1000) `@polywrap/core-js`: Introduced the concept of `Invoker` and `Invocable`. -- [PR-988](https://github.com/polywrap/monorepo/pull/988) `polywrap` CLI, `wasm/rust`: Updates to the default build-image (`Dockerfile`): - - Added the system dependencies `clang`, `llvm` and `build-essentials`. - - Added steps to remove any `wasm-bindgen` imports that may have been injected. +* [PR-989](https://github.com/polywrap/monorepo/pull/989/files) `@polywrap/core-js`: Add job status in workflow job's result object. +* [PR-992](https://github.com/polywrap/monorepo/pull/992) `polywrap` CLI: Allow configuring the client using the `--client-config` on all applicable commands. +* [PR-1000](https://github.com/polywrap/monorepo/pull/1000) `@polywrap/core-js`: Added the `encodeResult` property to `InvokeOptions`. +* [PR-1000](https://github.com/polywrap/monorepo/pull/1000) `@polywrap/core-js`: Introduced the concept of `Invoker` and `Invocable`. +* [PR-988](https://github.com/polywrap/monorepo/pull/988) `polywrap` CLI, `wasm/rust`: Updates to the default build-image (`Dockerfile`): + * Added the system dependencies `clang`, `llvm` and `build-essentials`. + * Added steps to remove any `wasm-bindgen` imports that may have been injected. ## Bugs - -- [PR-1000](https://github.com/polywrap/monorepo/pull/1000) Fixed inconsistencies around `ArrayBuffer` and `Uint8Array`. -- [PR-1000](https://github.com/polywrap/monorepo/pull/1000) `@polywrap/client-js`: The `noDecode` flag (renamed to `encodeResult`) now enfoces the decoding properly, where before it could get confused with returning `Bytes` from a wrapper. -- [PR-981](https://github.com/polywrap/monorepo/pull/981) `polywrap-wasm-rs`: Remove the `wrap-invoke` feature because it is not being used at the moment. +* [PR-1000](https://github.com/polywrap/monorepo/pull/1000) Fixed inconsistencies around `ArrayBuffer` and `Uint8Array`. +* [PR-1000](https://github.com/polywrap/monorepo/pull/1000) `@polywrap/client-js`: The `noDecode` flag (renamed to `encodeResult`) now enfoces the decoding properly, where before it could get confused with returning `Bytes` from a wrapper. +* [PR-981](https://github.com/polywrap/monorepo/pull/981) `polywrap-wasm-rs`: Remove the `wrap-invoke` feature because it is not being used at the moment. ## Breaking Changes - -- [PR-980](https://github.com/polywrap/monorepo/pull/980) `@polywrap/schema-parse`: Rename `TypeInfo` from `Abi`. +* [PR-980](https://github.com/polywrap/monorepo/pull/980) `@polywrap/schema-parse`: Rename `TypeInfo` from `Abi`. # Polywrap 0.0.1-prealpha.90 - ## Features - -- [PR-912](https://github.com/polywrap/monorepo/pull/912) [PR-930](https://github.com/polywrap/monorepo/pull/930) [PR-958](https://github.com/polywrap/monorepo/pull/958) All URI resolver extensions have been decoupled and moved into their own plugin packages: - - `@polywrap/fs-resolver-plugin-js` - - `@polywrap/ipfs-resolver-plugin-js` - - `@polywrap/ens-resolver-plugin-js` -- [PR-912](https://github.com/polywrap/monorepo/pull/912) `@polywrap/file-system-interface` has been created to help standardize FileSystem wrapper implementations. -- [PR-930](https://github.com/polywrap/monorepo/pull/930) `@polywrap/ipfs-interface` has been created to help standardize IPFS wrapper implementations. +* [PR-912](https://github.com/polywrap/monorepo/pull/912) [PR-930](https://github.com/polywrap/monorepo/pull/930) [PR-958](https://github.com/polywrap/monorepo/pull/958) All URI resolver extensions have been decoupled and moved into their own plugin packages: + * `@polywrap/fs-resolver-plugin-js` + * `@polywrap/ipfs-resolver-plugin-js` + * `@polywrap/ens-resolver-plugin-js` +* [PR-912](https://github.com/polywrap/monorepo/pull/912) `@polywrap/file-system-interface` has been created to help standardize FileSystem wrapper implementations. +* [PR-930](https://github.com/polywrap/monorepo/pull/930) `@polywrap/ipfs-interface` has been created to help standardize IPFS wrapper implementations. ## Bugs - -- [PR-957](https://github.com/polywrap/monorepo/pull/957) `@polywrap/schema-bind`: `plugin/typescript` module config type interfaces no longer inherit from `Record`, making them more type-safe and less generic. +* [PR-957](https://github.com/polywrap/monorepo/pull/957) `@polywrap/schema-bind`: `plugin/typescript` module config type interfaces no longer inherit from `Record`, making them more type-safe and less generic. ## Breaking Changes - -- [PR-937](https://github.com/polywrap/monorepo/issues/937) [PR-960](https://github.com/polywrap/monorepo/pull/960) The term `Nullable` has been changed to `Optional` within the `wasm` wrapper codegen. Additionally in `wasm/assemblyscript` the `Nullable` type has been changed to a rust-style `Optional` type. -- [PR-972](https://github.com/polywrap/monorepo/pull/972) The term `input` in the context of invocations has been renamed to `args`. -- [PR-976](https://github.com/polywrap/monorepo/pull/976) The invocation `resultFilter` option has been deprecated, as it is a needless & unused feature. +* [PR-937](https://github.com/polywrap/monorepo/issues/937) [PR-960](https://github.com/polywrap/monorepo/pull/960) The term `Nullable` has been changed to `Optional` within the `wasm` wrapper codegen. Additionally in `wasm/assemblyscript` the `Nullable` type has been changed to a rust-style `Optional` type. +* [PR-972](https://github.com/polywrap/monorepo/pull/972) The term `input` in the context of invocations has been renamed to `args`. +* [PR-976](https://github.com/polywrap/monorepo/pull/976) The invocation `resultFilter` option has been deprecated, as it is a needless & unused feature. # Polywrap 0.0.1-prealpha.89 - ## Features - -- [PR-903](https://github.com/polywrap/monorepo/pull/903) `polywrap` CLI: Recipes have been re-worked into composable workflows, and they can be run using CLI commands. -- [PR-951](https://github.com/polywrap/monorepo/pull/951) `polywrap` CLI: Docker Buildx output option has been removed. -- [PR-944](https://github.com/polywrap/monorepo/pull/944) `@polywrap/schema-bind`, `@polywrap/wasm-as`: `Nullable` type has been replaced with `Option` in the Assemblyscript schema bindings. -- [PR-938](https://github.com/polywrap/monorepo/pull/938) `@polywrap/schema-bind`, `@polywrap/wasm-as`: Rollback of JSON serialization in the Assemblyscript schema bindings. +* [PR-903](https://github.com/polywrap/monorepo/pull/903) `polywrap` CLI: Recipes have been re-worked into composable workflows, and they can be run using CLI commands. +* [PR-951](https://github.com/polywrap/monorepo/pull/951) `polywrap` CLI: Docker Buildx output option has been removed. +* [PR-944](https://github.com/polywrap/monorepo/pull/944) `@polywrap/schema-bind`, `@polywrap/wasm-as`: `Nullable` type has been replaced with `Option` in the Assemblyscript schema bindings. +* [PR-938](https://github.com/polywrap/monorepo/pull/938) `@polywrap/schema-bind`, `@polywrap/wasm-as`: Rollback of JSON serialization in the Assemblyscript schema bindings. ## Bugs - -- [PR-946](https://github.com/polywrap/monorepo/pull/946) `@polywrap/test-env-js`: Path fix for `npmCLI` test utility. +* [PR-946](https://github.com/polywrap/monorepo/pull/946) `@polywrap/test-env-js`: Path fix for `npmCLI` test utility. ## Breaking Changes - -- [PR-903](https://github.com/polywrap/monorepo/pull/903) `polywrap` CLI: Running recipes via the `polywrap query ...` command has been deprecated in favor of a new workflows system, accessible via the `polywrap run ...` command. -- [PR-944](https://github.com/polywrap/monorepo/pull/944) `wasm/assemblyscript` Wrappers: `Nullable` type has been removed in favor of `Option` which also has a different interface. -- [PR-938](https://github.com/polywrap/monorepo/pull/938) `wasm/assemblyscript` Wrappers: `JSON` serializer and deserializer, and related methods `fromJson` and `toJson` have been removed in favor of `parse` and `stringify`. +* [PR-903](https://github.com/polywrap/monorepo/pull/903) `polywrap` CLI: Running recipes via the `polywrap query ...` command has been deprecated in favor of a new workflows system, accessible via the `polywrap run ...` command. +* [PR-944](https://github.com/polywrap/monorepo/pull/944) `wasm/assemblyscript` Wrappers: `Nullable` type has been removed in favor of `Option` which also has a different interface. +* [PR-938](https://github.com/polywrap/monorepo/pull/938) `wasm/assemblyscript` Wrappers: `JSON` serializer and deserializer, and related methods `fromJson` and `toJson` have been removed in favor of `parse` and `stringify`. # Polywrap 0.0.1-prealpha.88 - ## Bugs - -- Various CI/CD fixes. +* Various CI/CD fixes. # Polywrap 0.0.1-prealpha.87 - ## Features - -- [PR-928](https://github.com/polywrap/monorepo/pull/928) `@polywrap/manifest-schemas`: Inline documentation has been added to manifest JSON-schemas. -- [PR-933](https://github.com/polywrap/monorepo/pull/933) Validation package `@polywrap/package-validation` has been implemented to validate WASM wrapper packages. +* [PR-928](https://github.com/polywrap/monorepo/pull/928) `@polywrap/manifest-schemas`: Inline documentation has been added to manifest JSON-schemas. +* [PR-933](https://github.com/polywrap/monorepo/pull/933) Validation package `@polywrap/package-validation` has been implemented to validate WASM wrapper packages. ## Bugs - -- [PR-932](https://github.com/polywrap/monorepo/pull/932) `@polywrap/schema-bind`: Minor fix for JSON type schema bindings -- [PR-935](https://github.com/polywrap/monorepo/pull/935) `@polywrap/test-env-js`: Path fix for `npmCLI` test utility +* [PR-932](https://github.com/polywrap/monorepo/pull/932) `@polywrap/schema-bind`: Minor fix for JSON type schema bindings +* [PR-935](https://github.com/polywrap/monorepo/pull/935) `@polywrap/test-env-js`: Path fix for `npmCLI` test utility # Polywrap 0.0.1-prealpha.86 - ## Features - -- [PR-923](https://github.com/polywrap/monorepo/pull/923) The Polywrap brand has been applied to the codebase. -- [PR-906](https://github.com/polywrap/monorepo/pull/906) The concept of `Mutation` and `Query` modules has been deprecated. Now all wrapper methods are defined within a single `Module`. +* [PR-923](https://github.com/polywrap/monorepo/pull/923) The Polywrap brand has been applied to the codebase. +* [PR-906](https://github.com/polywrap/monorepo/pull/906) The concept of `Mutation` and `Query` modules has been deprecated. Now all wrapper methods are defined within a single `Module`. ## Breaking Changes - -- [PR-923](https://github.com/polywrap/monorepo/pull/923) All prior integrations using the "Web3API" packages must upgrade to the new "Polywrap" equivalents. -- [PR-906](https://github.com/polywrap/monorepo/pull/906) All wrappers created prior to this change are incompatible. +* [PR-923](https://github.com/polywrap/monorepo/pull/923) All prior integrations using the "Web3API" packages must upgrade to the new "Polywrap" equivalents. +* [PR-906](https://github.com/polywrap/monorepo/pull/906) All wrappers created prior to this change are incompatible. # Web3API 0.0.1-prealpha.85 - ## Features - -- [PR-910](https://github.com/polywrap/monorepo/pull/910) `@web3api/cli`: `web3api.infra.yaml` manifests now support the concept of "default" modules. -- [PR-878](https://github.com/polywrap/monorepo/pull/878) `@web3api/client-js`: `Workflows` can now be run using the `client.run(...)` method. Integration into the Polywrap CLI will be released in the near future. +* [PR-910](https://github.com/polywrap/monorepo/pull/910) `@web3api/cli`: `web3api.infra.yaml` manifests now support the concept of "default" modules. +* [PR-878](https://github.com/polywrap/monorepo/pull/878) `@web3api/client-js`: `Workflows` can now be run using the `client.run(...)` method. Integration into the Polywrap CLI will be released in the near future. ## Bugs - -- [PR-908](https://github.com/polywrap/monorepo/pull/908) `@web3api/asyncify-js`: Improved WebAssembly import sanitization has been added, resolving an ambiguous error that was found when extraneous imports were added to a built module. -- [PR-902](https://github.com/polywrap/monorepo/pull/902) `@web3api/cli`: `w3 create plugin ...` & `w3 create app ...` now properly parse their expected `language` and `name` arguments. +* [PR-908](https://github.com/polywrap/monorepo/pull/908) `@web3api/asyncify-js`: Improved WebAssembly import sanitization has been added, resolving an ambiguous error that was found when extraneous imports were added to a built module. +* [PR-902](https://github.com/polywrap/monorepo/pull/902) `@web3api/cli`: `w3 create plugin ...` & `w3 create app ...` now properly parse their expected `language` and `name` arguments. # Web3API 0.0.1-prealpha.84 - ## Features - -- [PR-328](https://github.com/polywrap/monorepo/pull/328) `@web3api/infra`: A modular infrastructure pipeline has been added to the CLI, available via the `w3 infra ...` command. This command allows for custom infra modules to be defined and combined, able to support any 3rd party services your development requires. This command supersedes the old `w3 test-env ...` command. -- [PR-898](https://github.com/polywrap/monorepo/pull/898) `@web3api/cli`: The `wasm/rust` default build image has been updated to include the `wasm-snip` utility, which helps remove dead code from the wasm modules in a post-processing step. This has reduce the average Rust-based wasm module's size by ~85%. -- [PR-885](https://github.com/polywrap/monorepo/pull/885) `@web3api/test-env-js`: A `buildApi` helper function has been added. +* [PR-328](https://github.com/polywrap/monorepo/pull/328) `@web3api/infra`: A modular infrastructure pipeline has been added to the CLI, available via the `w3 infra ...` command. This command allows for custom infra modules to be defined and combined, able to support any 3rd party services your development requires. This command supersedes the old `w3 test-env ...` command. +* [PR-898](https://github.com/polywrap/monorepo/pull/898) `@web3api/cli`: The `wasm/rust` default build image has been updated to include the `wasm-snip` utility, which helps remove dead code from the wasm modules in a post-processing step. This has reduce the average Rust-based wasm module's size by ~85%. +* [PR-885](https://github.com/polywrap/monorepo/pull/885) `@web3api/test-env-js`: A `buildApi` helper function has been added. ## Breaking Changes - -- [PR-328](https://github.com/polywrap/monorepo/pull/328) `@web3api/cli`: The `w3 test-env ...` command has been removed and replaced by the `w3 infra ...` command. +* [PR-328](https://github.com/polywrap/monorepo/pull/328) `@web3api/cli`: The `w3 test-env ...` command has been removed and replaced by the `w3 infra ...` command. # Web3API 0.0.1-prealpha.83 - ## Features - -- [PR-870](https://github.com/polywrap/monorepo/pull/870) `@web3api/cli`: The `web3api.deploy.yaml` manifest file now supports the use of environment variables. -- [PR-866](https://github.com/polywrap/monorepo/pull/866) `@web3api/test-env-js`: The `buildAndDeployApi` test utility now supports recursive ENS subdomain registration. +* [PR-870](https://github.com/polywrap/monorepo/pull/870) `@web3api/cli`: The `web3api.deploy.yaml` manifest file now supports the use of environment variables. +* [PR-866](https://github.com/polywrap/monorepo/pull/866) `@web3api/test-env-js`: The `buildAndDeployApi` test utility now supports recursive ENS subdomain registration. ## Bugs - -- [PR-884](https://github.com/polywrap/monorepo/pull/884) `@web3api/client-js`: Plugin registrations are now properly sanitized, and overridden plugins will be removed from the plugins array. -- [PR-892](https://github.com/polywrap/monorepo/pull/892) `@web3api/cli`: Some minor fixes have been made to the `wasm/rust` build image's default Dockerfile. +* [PR-884](https://github.com/polywrap/monorepo/pull/884) `@web3api/client-js`: Plugin registrations are now properly sanitized, and overridden plugins will be removed from the plugins array. +* [PR-892](https://github.com/polywrap/monorepo/pull/892) `@web3api/cli`: Some minor fixes have been made to the `wasm/rust` build image's default Dockerfile. # Web3API 0.0.1-prealpha.82 - ## Features - -- [PR-699](https://github.com/polywrap/monorepo/pull/699) `@web3api/cli`: Support for Rust based WebAssembly wrappers has been added. +* [PR-699](https://github.com/polywrap/monorepo/pull/699) `@web3api/cli`: Support for Rust based WebAssembly wrappers has been added. ## Breaking Changes - -- [PR-872](https://github.com/polywrap/monorepo/pull/872) `@web3api/schema-bind`: TypeScript bindings for both app & plugin projects now use `ArrayBuffer` to represent the schema's `Bytes` type, instead of the previous `Uint8Array`. +* [PR-872](https://github.com/polywrap/monorepo/pull/872) `@web3api/schema-bind`: TypeScript bindings for both app & plugin projects now use `ArrayBuffer` to represent the schema's `Bytes` type, instead of the previous `Uint8Array`. # Web3API 0.0.1-prealpha.81 - ## Features - -- [PR-864](https://github.com/polywrap/monorepo/pull/864) `@web3api/react`: `useWeb3ApiInvoke` and `useWeb3ApiQuery` hooks now support configuring the client's environment, along with all other configuration options. -- [PR-808](https://github.com/polywrap/monorepo/pull/808) `@web3api/cli`: The `web3api.build.yaml` manifest now supports additional docker buildkit configuration options, including: - - local docker image layer cache - - custom image output location - - remove image after build - - remove builder instance after build -- [PR-827](https://github.com/polywrap/monorepo/pull/827) `@web3api/ethereum-plugin-js`: The provider's connection can now be configured via the wrapper's environment. -- [PR-807](https://github.com/polywrap/monorepo/pull/807) `@web3api/cli`: Make the CLI's Docker file-lock project specific, instead of global to the CLI installation. - -## Bugs - -- [PR-847](https://github.com/polywrap/monorepo/pull/847) `@web3api/templates`: The template projects used for the `w3 create ...` CLI command now have proper CI setup, and multiple bugs were fixed within them. -- [PR-861](https://github.com/polywrap/monorepo/pull/861) `@web3api/test-env-js`: The `buildAndDeployApi` function's `ensName` no longer assumes the `.eth` TLD is ommitted, and requires the user to provide it along with the domain name. This was the original behavior, and was modified in release `0.0.1-prealpha.75`. - +* [PR-864](https://github.com/polywrap/monorepo/pull/864) `@web3api/react`: `useWeb3ApiInvoke` and `useWeb3ApiQuery` hooks now support configuring the client's environment, along with all other configuration options. +* [PR-808](https://github.com/polywrap/monorepo/pull/808) `@web3api/cli`: The `web3api.build.yaml` manifest now supports additional docker buildkit configuration options, including: + * local docker image layer cache + * custom image output location + * remove image after build + * remove builder instance after build +* [PR-827](https://github.com/polywrap/monorepo/pull/827) `@web3api/ethereum-plugin-js`: The provider's connection can now be configured via the wrapper's environment. +* [PR-807](https://github.com/polywrap/monorepo/pull/807) `@web3api/cli`: Make the CLI's Docker file-lock project specific, instead of global to the CLI installation. +## Bugs +* [PR-847](https://github.com/polywrap/monorepo/pull/847) `@web3api/templates`: The template projects used for the `w3 create ...` CLI command now have proper CI setup, and multiple bugs were fixed within them. +* [PR-861](https://github.com/polywrap/monorepo/pull/861) `@web3api/test-env-js`: The `buildAndDeployApi` function's `ensName` no longer assumes the `.eth` TLD is ommitted, and requires the user to provide it along with the domain name. This was the original behavior, and was modified in release `0.0.1-prealpha.75`. ## Breaking Changes - -- [PR-859](https://github.com/polywrap/monorepo/pull/859) `@web3api/cli`: The CLI is now built using the `commander` package. The CLI's help text formatting has changed in structure as a result. +* [PR-859](https://github.com/polywrap/monorepo/pull/859) `@web3api/cli`: The CLI is now built using the `commander` package. The CLI's help text formatting has changed in structure as a result. # Web3API 0.0.1-prealpha.80 - ## Bugs - -- [PR-855](https://github.com/polywrap/monorepo/pull/855) Pinned `@types/prettier` to version `2.6.0` to fix [an issue](https://github.com/DefinitelyTyped/DefinitelyTyped/discussions/60310) that was created by the latest release. +* [PR-855](https://github.com/polywrap/monorepo/pull/855) Pinned `@types/prettier` to version `2.6.0` to fix [an issue](https://github.com/DefinitelyTyped/DefinitelyTyped/discussions/60310) that was created by the latest release. # Web3API 0.0.1-prealpha.79 - ## Bugs - -- [PR-852](https://github.com/polywrap/monorepo/pull/852) `@web3api/client-test-env`: The IPFS node's API endpoint now has CORS enabled via the following configuration properties: - - API.HTTPHeaders.Access-Control-Allow-Origin: `["*"]` - - API.HTTPHeaders.Access-Control-Allow-Methods: `["GET", "POST", "PUT", "DELETE"]` +* [PR-852](https://github.com/polywrap/monorepo/pull/852) `@web3api/client-test-env`: The IPFS node's API endpoint now has CORS enabled via the following configuration properties: + * API.HTTPHeaders.Access-Control-Allow-Origin: `["*"]` + * API.HTTPHeaders.Access-Control-Allow-Methods: `["GET", "POST", "PUT", "DELETE"]` # Web3API 0.0.1-prealpha.78 - ## Bugs - -- Pinned `@types/prettier` to version `2.6.0` to fix [an issue](https://github.com/DefinitelyTyped/DefinitelyTyped/discussions/60310) that was created by the latest release. +* Pinned `@types/prettier` to version `2.6.0` to fix [an issue](https://github.com/DefinitelyTyped/DefinitelyTyped/discussions/60310) that was created by the latest release. # Web3API 0.0.1-prealpha.77 - ## Features - -- [PR-846](https://github.com/polywrap/monorepo/pull/846) `@web3api/wasm-as`: Add support for automatic JSON serialization via the `@serial-as/transform` `asc` compiler transformation. -- [PR-846](https://github.com/polywrap/monorepo/pull/846) `@web3api/schema-bind`: Assemblyscript object types now have `Type.toJson(type)` and `Type.fromJson(json)` static helper methods added to all class instances. -- [PR-840](https://github.com/polywrap/monorepo/pull/840) `@web3api/cli`: Allow `async getClientConfig` functions within modules passed into the `w3 query` command's `--client-config` option. +* [PR-846](https://github.com/polywrap/monorepo/pull/846) `@web3api/wasm-as`: Add support for automatic JSON serialization via the `@serial-as/transform` `asc` compiler transformation. +* [PR-846](https://github.com/polywrap/monorepo/pull/846) `@web3api/schema-bind`: Assemblyscript object types now have `Type.toJson(type)` and `Type.fromJson(json)` static helper methods added to all class instances. +* [PR-840](https://github.com/polywrap/monorepo/pull/840) `@web3api/cli`: Allow `async getClientConfig` functions within modules passed into the `w3 query` command's `--client-config` option. # Web3API 0.0.1-prealpha.76 - ## Bugs - -- [PR-836](https://github.com/polywrap/monorepo/pull/836) `@web3api/cli`: All commands properly handle the `--help` option. +* [PR-836](https://github.com/polywrap/monorepo/pull/836) `@web3api/cli`: All commands properly handle the `--help` option. # Web3API 0.0.1-prealpha.75 - ## Features - -- [PR-814](https://github.com/polywrap/monorepo/pull/814) `@web3api/cli`: A modular deployment pipeline has been added to the CLI. It can be accessed via the `w3 deploy` command. +* [PR-814](https://github.com/polywrap/monorepo/pull/814) `@web3api/cli`: A modular deployment pipeline has been added to the CLI. It can be accessed via the `w3 deploy` command. # Web3API 0.0.1-prealpha.74 - ## Bugs - -- `@web3api/schema-bind`: Fix incorrect export from `plugin-ts` bindings. +* `@web3api/schema-bind`: Fix incorrect export from `plugin-ts` bindings. # Web3API 0.0.1-prealpha.73 - ## Bugs - -- [PR-821](https://github.com/polywrap/monorepo/pull/821) `@web3api/cli`: Fixed a codegen issue when generating types for plugins with only one module. +* [PR-821](https://github.com/polywrap/monorepo/pull/821) `@web3api/cli`: Fixed a codegen issue when generating types for plugins with only one module. # Web3API 0.0.1-prealpha.72 - ## Features - -- [PR-620](https://github.com/polywrap/monorepo/pull/620) Plugin DevExp Improvements: The plugin developer experience has been revised to be very close to the API development experience. -- [PR-697](https://github.com/polywrap/monorepo/pull/697) `BigNumber` Schema Type: The `BigNumber` type is now available for use as a base type for Web3API schemas. -- [PR-802](https://github.com/polywrap/monorepo/pull/802) `@web3api/cli`: `w3 query ...` command now supports the following options: - - `-o, --output-file`: Output file path for the query result. - - `-q, --quiet`: Suppress output. -- [PR-790](https://github.com/polywrap/monorepo/pull/790) `@web3api/schema-bind`: `wasm-as` bindings have been updated to include a helper function `requireEnv()`, which can be used to check if the environment is null or not. -- [PR-795](https://github.com/polywrap/monorepo/pull/795) `@web3api/templates`: The AssemblyScript & interface templates used for the `w3 create api ...` command has been updated to include metadata (descriptions, icons, etc). -- [PR-794](https://github.com/polywrap/monorepo/pull/794) `@web3api/templates`: The AssemblyScript template used for the `w3 create api assemblyscript ...` command has been updated to include e2e tests. +* [PR-620](https://github.com/polywrap/monorepo/pull/620) Plugin DevExp Improvements: The plugin developer experience has been revised to be very close to the API development experience. +* [PR-697](https://github.com/polywrap/monorepo/pull/697) `BigNumber` Schema Type: The `BigNumber` type is now available for use as a base type for Web3API schemas. +* [PR-802](https://github.com/polywrap/monorepo/pull/802) `@web3api/cli`: `w3 query ...` command now supports the following options: + * `-o, --output-file`: Output file path for the query result. + * `-q, --quiet`: Suppress output. +* [PR-790](https://github.com/polywrap/monorepo/pull/790) `@web3api/schema-bind`: `wasm-as` bindings have been updated to include a helper function `requireEnv()`, which can be used to check if the environment is null or not. +* [PR-795](https://github.com/polywrap/monorepo/pull/795) `@web3api/templates`: The AssemblyScript & interface templates used for the `w3 create api ...` command has been updated to include metadata (descriptions, icons, etc). +* [PR-794](https://github.com/polywrap/monorepo/pull/794) `@web3api/templates`: The AssemblyScript template used for the `w3 create api assemblyscript ...` command has been updated to include e2e tests. # Web3API 0.0.1-prealpha.71 - ## Features - -- [PR-777](https://github.com/polywrap/monorepo/pull/777) `@web3api/client-js`: The `Web3ApiClient` now has a public method `loadUriResolvers()`, which will pre-fetch all URI resolver implementations. +* [PR-777](https://github.com/polywrap/monorepo/pull/777) `@web3api/client-js`: The `Web3ApiClient` now has a public method `loadUriResolvers()`, which will pre-fetch all URI resolver implementations. ## Bugs - -- [Issue-715](https://github.com/polywrap/monorepo/pull/777) [PR-777](https://github.com/polywrap/monorepo/pull/777) `@web3api/client-js`: Custom URI resolver implementations now no longer cause an infinite loop during URI resolution. +* [Issue-715](https://github.com/polywrap/monorepo/pull/777) [PR-777](https://github.com/polywrap/monorepo/pull/777) `@web3api/client-js`: Custom URI resolver implementations now no longer cause an infinite loop during URI resolution. ## Breaking Changes - -- [PR-777](https://github.com/polywrap/monorepo/pull/777) `@web3api/client-js`: `Web3ApiClient` public method `getResolvers(...)` renamed to `getUriResolvers(...)`. -- [PR-777](https://github.com/polywrap/monorepo/pull/777) `@web3api/client-js`: `Web3ApiClientConfig` property `resolvers` renamed to `uriResolvers`. +* [PR-777](https://github.com/polywrap/monorepo/pull/777) `@web3api/client-js`: `Web3ApiClient` public method `getResolvers(...)` renamed to `getUriResolvers(...)`. +* [PR-777](https://github.com/polywrap/monorepo/pull/777) `@web3api/client-js`: `Web3ApiClientConfig` property `resolvers` renamed to `uriResolvers`. # Web3API 0.0.1-prealpha.70 - ## Bugs - -- `@web3api/core-js`: Fixed the manifest migration script for `web3api.meta` from v1 to v3. The `name` property is now migrating properly to `displayName`. +* `@web3api/core-js`: Fixed the manifest migration script for `web3api.meta` from v1 to v3. The `name` property is now migrating properly to `displayName`. # Web3API 0.0.1-prealpha.69 - ## Features - -- [PR-669](https://github.com/polywrap/monorepo/pull/669) `Map` schema base-type has been added. -- [PR-761](https://github.com/polywrap/monorepo/pull/761) Modules now subinvoke interface implementation wrappers through the `__w3_subinvokeImplementation` host import. This now gives us a specific import function for these sort of invocations, which can allow for additional types of verification features to be added by clients. -- [PR-769](https://github.com/polywrap/monorepo/pull/769) `@web3api/schema-bind`: Add support for `getImplementations` capability in TypeScript plugin (`plugin-ts`) codegen. -- [PR-763](https://github.com/polywrap/monorepo/pull/763) `@web3api/schema-bind`: The `schema-bind` project is now "module agnostic" and accepts an array of arbitrary modules, which it will pass directly to the different binding projects (`wasm-as`, `plugin-ts`, `app-ts`, etc). -- [PR-759](https://github.com/polywrap/monorepo/pull/759) `@web3api/manifest-schemas`: Added the `name: string` property to the `web3api` manifest. -- [PR-759](https://github.com/polywrap/monorepo/pull/759) `@web3api/manifest-schemas`: Renamed `web3api.meta`'s `name` property to `displayName`. -- [PR-772](https://github.com/polywrap/monorepo/pull/772) `@web3api/manifest-schemas`: Added the `tags: string[]` property to the `web3api.meta` manifest, allowing wrapper to developers to add tag keywords to their package's metadata, helping improve searchability on package indexers like The Polywrap Hub. -- [PR-747](https://github.com/polywrap/monorepo/pull/747) `@web3api/ethereum-plugin-js`: Changed all instances of the `chainId` property's type to `BigInt` from `UInt32`. -- [PR-776](https://github.com/polywrap/monorepo/pull/776) `@web3api/ethereum-plugin-js`: Added `getBalance` to the `Query` module, allowing callers to check the native balance of arbitrary addresses. +* [PR-669](https://github.com/polywrap/monorepo/pull/669) `Map` schema base-type has been added. +* [PR-761](https://github.com/polywrap/monorepo/pull/761) Modules now subinvoke interface implementation wrappers through the `__w3_subinvokeImplementation` host import. This now gives us a specific import function for these sort of invocations, which can allow for additional types of verification features to be added by clients. +* [PR-769](https://github.com/polywrap/monorepo/pull/769) `@web3api/schema-bind`: Add support for `getImplementations` capability in TypeScript plugin (`plugin-ts`) codegen. +* [PR-763](https://github.com/polywrap/monorepo/pull/763) `@web3api/schema-bind`: The `schema-bind` project is now "module agnostic" and accepts an array of arbitrary modules, which it will pass directly to the different binding projects (`wasm-as`, `plugin-ts`, `app-ts`, etc). +* [PR-759](https://github.com/polywrap/monorepo/pull/759) `@web3api/manifest-schemas`: Added the `name: string` property to the `web3api` manifest. +* [PR-759](https://github.com/polywrap/monorepo/pull/759) `@web3api/manifest-schemas`: Renamed `web3api.meta`'s `name` property to `displayName`. +* [PR-772](https://github.com/polywrap/monorepo/pull/772) `@web3api/manifest-schemas`: Added the `tags: string[]` property to the `web3api.meta` manifest, allowing wrapper to developers to add tag keywords to their package's metadata, helping improve searchability on package indexers like The Polywrap Hub. +* [PR-747](https://github.com/polywrap/monorepo/pull/747) `@web3api/ethereum-plugin-js`: Changed all instances of the `chainId` property's type to `BigInt` from `UInt32`. +* [PR-776](https://github.com/polywrap/monorepo/pull/776) `@web3api/ethereum-plugin-js`: Added `getBalance` to the `Query` module, allowing callers to check the native balance of arbitrary addresses. ## Breaking Changes - -- [PR-669](https://github.com/polywrap/monorepo/pull/669) Wrappers that utilize the new `Map` schema base-type will break forward compatability of Polywrap clients. - - Relevant Downstream Dependencies: `@web3api/client-js` -- [PR-761](https://github.com/polywrap/monorepo/pull/761) Modules that use the `getImplementations` capability for interfaces will now require the following host imports: `__w3_subinvokeImplementation`, `__w3_subinvokeImplementation_result_len`, `__w3_subinvokeImplementation_result`, `__w3_subinvokeImplementation_error_len`, `__w3_subinvokeImplementation_error` - - Relevant Upstream Dependencies: `@web3api/wasm-as`, `@web3api/schema-bind`, `@web3api/cli`, `@web3api/client-js` -- [PR-763](https://github.com/polywrap/monorepo/pull/763) `@web3api/schema-bind`: The entry point function's input & output types have changed. -- [PR-763](https://github.com/polywrap/monorepo/pull/763) `@web3api/cli`: The type of the expected export from user-defined codegen scripts has changed from: - +* [PR-669](https://github.com/polywrap/monorepo/pull/669) Wrappers that utilize the new `Map` schema base-type will break forward compatability of Polywrap clients. + * Relevant Downstream Dependencies: `@web3api/client-js` +* [PR-761](https://github.com/polywrap/monorepo/pull/761) Modules that use the `getImplementations` capability for interfaces will now require the following host imports: `__w3_subinvokeImplementation`, `__w3_subinvokeImplementation_result_len`, `__w3_subinvokeImplementation_result`, `__w3_subinvokeImplementation_error_len`, `__w3_subinvokeImplementation_error` + * Relevant Upstream Dependencies: `@web3api/wasm-as`, `@web3api/schema-bind`, `@web3api/cli`, `@web3api/client-js` +* [PR-763](https://github.com/polywrap/monorepo/pull/763) `@web3api/schema-bind`: The entry point function's input & output types have changed. +* [PR-763](https://github.com/polywrap/monorepo/pull/763) `@web3api/cli`: The type of the expected export from user-defined codegen scripts has changed from: ```typescript generateBinding = ( output: OutputDirectory, @@ -1025,602 +832,443 @@ generateBinding = ( config: Record ) => void; ``` - to - ```typescript -generateBinding = (options: BindOptions) => BindOutput; +generateBinding = ( + options: BindOptions +) => BindOutput; ``` ## Bugs - -- [PR-766](https://github.com/polywrap/monorepo/pull/766) `@web3api/client-js`: User-configured interface implementations now extend the default configuration's, instead of overwritting them. +* [PR-766](https://github.com/polywrap/monorepo/pull/766) `@web3api/client-js`: User-configured interface implementations now extend the default configuration's, instead of overwritting them. # Web3API 0.0.1-prealpha.68 - ## Bugs - -- [PR-756](https://github.com/polywrap/monorepo/pull/756) `@web3api/schema-bind`: Imported enums are properly included in the schema bindings when there are no objects imported. +* [PR-756](https://github.com/polywrap/monorepo/pull/756) `@web3api/schema-bind`: Imported enums are properly included in the schema bindings when there are no objects imported. # Web3API 0.0.1-prealpha.67 - ## Features - -- [PR-726](https://github.com/polywrap/monorepo/pull/726) Improved the application developer experience by creating a new `w3 app codegen` command, which generated types based on the apps wrapper / plugin integrations. For an example of how this works, see the updated application template projects by running `w3 create app typescript-node my-app` or `w3 create app typescript-react my-app`. -- [PR-726](https://github.com/polywrap/monorepo/pull/726) `@web3api/react`: Added the `useWeb3ApiInvoke` hook as a non-graphql alternative to `useWeb3ApiQuery`. -- [PR-726](https://github.com/polywrap/monorepo/pull/726) `@web3api/schema-compose`: Importing all dependency types from a schema import schema statement can now be done through the new wild-card syntax: `#import * into Namespace from "w3://authority/path"`. +* [PR-726](https://github.com/polywrap/monorepo/pull/726) Improved the application developer experience by creating a new `w3 app codegen` command, which generated types based on the apps wrapper / plugin integrations. For an example of how this works, see the updated application template projects by running `w3 create app typescript-node my-app` or `w3 create app typescript-react my-app`. +* [PR-726](https://github.com/polywrap/monorepo/pull/726) `@web3api/react`: Added the `useWeb3ApiInvoke` hook as a non-graphql alternative to `useWeb3ApiQuery`. +* [PR-726](https://github.com/polywrap/monorepo/pull/726) `@web3api/schema-compose`: Importing all dependency types from a schema import schema statement can now be done through the new wild-card syntax: `#import * into Namespace from "w3://authority/path"`. ## Breaking Changes - -- [PR-726](https://github.com/polywrap/monorepo/pull/726) `@web3api/cli`: `w3 build` CLI command now requires the use of the `--manifest-file ` option in order to specify a custom build manifest file path. -- [PR-726](https://github.com/polywrap/monorepo/pull/726) `@web3api/cli`: `w3 codegen` CLI command option renaming: - - `-m, --manifest-path ` to `-m, --manifest-file ` - - `-c, --custom ` to `-s, --script ` - - `-o, --output-dir ` to `-c, --codegen-dir ` -- [PR-726](https://github.com/polywrap/monorepo/pull/726) `@web3api/cli`: `w3 plugin` CLI command option renaming: - - `-m, --manifest-path ` to `-m, --manifest-file ` +* [PR-726](https://github.com/polywrap/monorepo/pull/726) `@web3api/cli`: `w3 build` CLI command now requires the use of the `--manifest-file ` option in order to specify a custom build manifest file path. +* [PR-726](https://github.com/polywrap/monorepo/pull/726) `@web3api/cli`: `w3 codegen` CLI command option renaming: + * `-m, --manifest-path ` to `-m, --manifest-file ` + * `-c, --custom ` to `-s, --script ` + * `-o, --output-dir ` to `-c, --codegen-dir ` +* [PR-726](https://github.com/polywrap/monorepo/pull/726) `@web3api/cli`: `w3 plugin` CLI command option renaming: + * `-m, --manifest-path ` to `-m, --manifest-file ` # Web3API 0.0.1-prealpha.66 - ## Features - -- [PR-718](https://github.com/polywrap/monorepo/pull/718) `@web3api/cli`: `w3 plugin codegen` now outputs the plugin manifest to the build directory. -- [PR-695](https://github.com/polywrap/monorepo/pull/695) `@web3api/ethereum-plugin-js`: Added Query methods: `solidityPack`, `solidityKeccak256`, `soliditySha256`. +* [PR-718](https://github.com/polywrap/monorepo/pull/718) `@web3api/cli`: `w3 plugin codegen` now outputs the plugin manifest to the build directory. +* [PR-695](https://github.com/polywrap/monorepo/pull/695) `@web3api/ethereum-plugin-js`: Added Query methods: `solidityPack`, `solidityKeccak256`, `soliditySha256`. ## Breaking Changes - -- [PR-718](https://github.com/polywrap/monorepo/pull/718) `@web3api/cli`: `w3 plugin codegen` option `-s, --output-schema-path` changed to `-p, --publish-dir`. -- [PR-718](https://github.com/polywrap/monorepo/pull/718) `@web3api/cli`: `w3 plugin codegen` option `-t, --output-types-dir` changed to `-c, --codegen-dir`. +* [PR-718](https://github.com/polywrap/monorepo/pull/718) `@web3api/cli`: `w3 plugin codegen` option `-s, --output-schema-path` changed to `-p, --publish-dir`. +* [PR-718](https://github.com/polywrap/monorepo/pull/718) `@web3api/cli`: `w3 plugin codegen` option `-t, --output-types-dir` changed to `-c, --codegen-dir`. # Web3API 0.0.1-prealpha.65 - ## Bugs - -- [PR-690](https://github.com/polywrap/monorepo/pull/690) `@web3api/http-plugin-js`: Better axios response header handling for lists. -- [PR-692](https://github.com/polywrap/monorepo/pull/692) `@web3api/wasm-as`: Properly propogate `Result` error upon unwrap exception. +* [PR-690](https://github.com/polywrap/monorepo/pull/690) `@web3api/http-plugin-js`: Better axios response header handling for lists. +* [PR-692](https://github.com/polywrap/monorepo/pull/692) `@web3api/wasm-as`: Properly propogate `Result` error upon unwrap exception. # Web3API 0.0.1-prealpha.64 - ## Bugs - -- [PR-685](https://github.com/polywrap/monorepo/pull/685) `@web3api/schema-parse`: Properly support recursive object definition properties. +* [PR-685](https://github.com/polywrap/monorepo/pull/685) `@web3api/schema-parse`: Properly support recursive object definition properties. # Web3API 0.0.1-prealpha.63 - ## Features - -- [PR-650](https://github.com/polywrap/monorepo/pull/650) `@web3api/cli`: Add YAML support for query recipes. -- [PR-385](https://github.com/polywrap/monorepo/pull/385) `@web3api/cli`, `@web3api/client-js`: Use JSON for manifest build artifacts. -- [PR-678](https://github.com/polywrap/monorepo/pull/678) `@web3api/cli`: Build command no longer uses same docker image name by default. The concept of a "build UUID" has been added, and will be appended to the docker image name (if the develoer has not specified their own inside `web3api.build.yaml`). -- [PR-610](https://github.com/polywrap/monorepo/pull/610) `@web3api/client-js`: Support the `resolveUri(...)` method on `Web3ApiClient` instances. +* [PR-650](https://github.com/polywrap/monorepo/pull/650) `@web3api/cli`: Add YAML support for query recipes. +* [PR-385](https://github.com/polywrap/monorepo/pull/385) `@web3api/cli`, `@web3api/client-js`: Use JSON for manifest build artifacts. +* [PR-678](https://github.com/polywrap/monorepo/pull/678) `@web3api/cli`: Build command no longer uses same docker image name by default. The concept of a "build UUID" has been added, and will be appended to the docker image name (if the develoer has not specified their own inside `web3api.build.yaml`). +* [PR-610](https://github.com/polywrap/monorepo/pull/610) `@web3api/client-js`: Support the `resolveUri(...)` method on `Web3ApiClient` instances. ## Bugs - -- [PR-665](https://github.com/polywrap/monorepo/pull/665) `@web3api/ethereum-plugin-js`: Fix `TxRequest` property mapping to ethers.js types. -- [PR-672](https://github.com/polywrap/monorepo/pull/672) `@web3api/core-js`, `@web3api/schema-bind`, `@web3api/schema-parse`: Remove use of the JS string `.substr` method. -- [PR-673](https://github.com/polywrap/monorepo/pull/673) `@web3api/cli`: The `w3 query ...` command now property sets `exitCode` to 1 if a query fails. -- [PR-651](https://github.com/polywrap/monorepo/pull/651) `@web3api/http-plugin-js`: JSON payloads are now property supported. +* [PR-665](https://github.com/polywrap/monorepo/pull/665) `@web3api/ethereum-plugin-js`: Fix `TxRequest` property mapping to ethers.js types. +* [PR-672](https://github.com/polywrap/monorepo/pull/672) `@web3api/core-js`, `@web3api/schema-bind`, `@web3api/schema-parse`: Remove use of the JS string `.substr` method. +* [PR-673](https://github.com/polywrap/monorepo/pull/673) `@web3api/cli`: The `w3 query ...` command now property sets `exitCode` to 1 if a query fails. +* [PR-651](https://github.com/polywrap/monorepo/pull/651) `@web3api/http-plugin-js`: JSON payloads are now property supported. ## Breaking Changes - -- [PR-674](https://github.com/polywrap/monorepo/pull/674) `@web3api/cli`, `@web3api/schema-bind`: Return `Result` objects from all AssemblyScript subinvoke methods. +* [PR-674](https://github.com/polywrap/monorepo/pull/674) `@web3api/cli`, `@web3api/schema-bind`: Return `Result` objects from all AssemblyScript subinvoke methods. # Web3API 0.0.1-prealpha.62 - ## Features - -- Use the https://ipfs.wrappers.io IPFS gateway throughout the codebase. -- Rename TypeInfo `queryTypes` & `importedQueryTypes` to `moduleTypes` & `importedModuleTypes`. -- `@web3api/ipfs-plugin-js`: Improve the IPFS plugin's URI resolver implementation, and add the ability to query from multiple gateways in parallel. +* Use the https://ipfs.wrappers.io IPFS gateway throughout the codebase. +* Rename TypeInfo `queryTypes` & `importedQueryTypes` to `moduleTypes` & `importedModuleTypes`. +* `@web3api/ipfs-plugin-js`: Improve the IPFS plugin's URI resolver implementation, and add the ability to query from multiple gateways in parallel. # Web3API 0.0.1-prealpha.61 - ## Features - -- `@web3api/cli`: Added the `--client-config` / `-c` option to the `w3 query` CLI command, allowing the user the define their own client configurations within a JavaScript or TypeScript module. -- `@web3api/client-js`: Plugins can now be initialized with the client's environment registered at the plugin's URI. +* `@web3api/cli`: Added the `--client-config` / `-c` option to the `w3 query` CLI command, allowing the user the define their own client configurations within a JavaScript or TypeScript module. +* `@web3api/client-js`: Plugins can now be initialized with the client's environment registered at the plugin's URI. ## Bugs - -- `@web3api/schema-bind`: Properly handle reserve words for the bind target's language. Reserved words will be prepended with `m_` in order to avoid compiler errors. +* `@web3api/schema-bind`: Properly handle reserve words for the bind target's language. Reserved words will be prepended with `m_` in order to avoid compiler errors. # Web3API 0.0.1-prealpha.60 - ## Breaking Changes - -- `@web3api/schema-compose`: `ComposerOptions` property `schemas` is now of type `Record` and not `Record`. -- `@web3api/schema-bind`: `TargetLanguage` type has been renamed to `BindLanguage`. -- `@web3api/schema-bind`: `BindOptions` property `language` has been renamed to `bindLanguage`. +* `@web3api/schema-compose`: `ComposerOptions` property `schemas` is now of type `Record` and not `Record`. +* `@web3api/schema-bind`: `TargetLanguage` type has been renamed to `BindLanguage`. +* `@web3api/schema-bind`: `BindOptions` property `language` has been renamed to `bindLanguage`. ## Bugs - -- `@web3api/cli`: Properly resolve NPM dependency `colors` due to it being [corrupted](https://www.bleepingcomputer.com/news/security/dev-corrupts-npm-libs-colors-and-faker-breaking-thousands-of-apps/). -- `@web3api/cli`: Plugin schema codegen now properly represents imports types from both Query and Mutation modules. -- `@web3api/cli`: Properly defined the separation of the `ManifestLanguage` and `BindLanguage` (ex: wasm/assemblyscript -> wasm-as). -- `@web3api/schema-compose`: Introduce the concept of a `SchemaKind` to help determine how schemas should be combined. -- `@web3api/schema-compose`: Allow plugins to import mutations within their schemas. -- `@web3api/schema-bind`: Introduced the concept of `BindTarget` to represent a list of known-good bind targets (`wasm-as`, `plugin-ts`, etc). +* `@web3api/cli`: Properly resolve NPM dependency `colors` due to it being [corrupted](https://www.bleepingcomputer.com/news/security/dev-corrupts-npm-libs-colors-and-faker-breaking-thousands-of-apps/). +* `@web3api/cli`: Plugin schema codegen now properly represents imports types from both Query and Mutation modules. +* `@web3api/cli`: Properly defined the separation of the `ManifestLanguage` and `BindLanguage` (ex: wasm/assemblyscript -> wasm-as). +* `@web3api/schema-compose`: Introduce the concept of a `SchemaKind` to help determine how schemas should be combined. +* `@web3api/schema-compose`: Allow plugins to import mutations within their schemas. +* `@web3api/schema-bind`: Introduced the concept of `BindTarget` to represent a list of known-good bind targets (`wasm-as`, `plugin-ts`, etc). # Web3API 0.0.1-prealpha.59 - ## Features - -- Web3APIs can now be configured via environment variables. Documentation will be created soon. Initial details on this features specification can be found [here](https://github.com/polywrap/monorepo/issues/140). +* Web3APIs can now be configured via environment variables. Documentation will be created soon. Initial details on this features specification can be found [here](https://github.com/polywrap/monorepo/issues/140). # Web3API 0.0.1-prealpha.58 - ## Features - -- `@web3api/client-js`: Added `noDecode` invocation option. -- `@web3api/client-js`: Added `noDefaults` constructor option. +* `@web3api/client-js`: Added `noDecode` invocation option. +* `@web3api/client-js`: Added `noDefaults` constructor option. ## Bugs - -- `@web3api/ethereum-plugin-js`: The `encodeParams` now properly parses arguments of type Array & Tuple. +* `@web3api/ethereum-plugin-js`: The `encodeParams` now properly parses arguments of type Array & Tuple. # Web3API 0.0.1-prealpha.57 - ## Features - -- `@web3api/cli`: CLI command middleware support has been added. The first use-cases implemented are to help ensure Docker is available to the CLI instance, and not in-use by another CLI instance. -- `@web3api/client-js`: Query-time configuration overrides have been added, allowing developers to define new configurations without having to re-create the client instance. +* `@web3api/cli`: CLI command middleware support has been added. The first use-cases implemented are to help ensure Docker is available to the CLI instance, and not in-use by another CLI instance. +* `@web3api/client-js`: Query-time configuration overrides have been added, allowing developers to define new configurations without having to re-create the client instance. ## Bugs - -- `@web3api/asyncify-js`: Fixed issue [#570](https://github.com/polywrap/monorepo/issues/570) by using a node-version-agnostic way of indexing into the Uint8Array buffer. +* `@web3api/asyncify-js`: Fixed issue [#570](https://github.com/polywrap/monorepo/issues/570) by using a node-version-agnostic way of indexing into the Uint8Array buffer. # Web3API 0.0.1-prealpha.56 - ## Bugs - -- `@web3api/ethereum-plugin-js`: The encodeFunction now support array & object arg types. +* `@web3api/ethereum-plugin-js`: The encodeFunction now support array & object arg types. # Web3API 0.0.1-prealpha.55 - ## Bugs - -- `@web3api/schema-compose`: Properly support empty schema types. -- `@web3api/asyncify-js`: Fixed a low-level inconsistency between Wasm modules when using imported memory. More details [here](https://github.com/polywrap/monorepo/issues/561). -- `@web3api/schema-bind`: Fixed issue where imports were inconsistent between `serialization.ts` assemblyscript files, and some necessary imports were missing. +* `@web3api/schema-compose`: Properly support empty schema types. +* `@web3api/asyncify-js`: Fixed a low-level inconsistency between Wasm modules when using imported memory. More details [here](https://github.com/polywrap/monorepo/issues/561). +* `@web3api/schema-bind`: Fixed issue where imports were inconsistent between `serialization.ts` assemblyscript files, and some necessary imports were missing. # Web3API 0.0.1-prealpha.54 - ## Features - -- `@web3api/ethereum-plugin-js`: Added `getNetwork` to the Ethereum plugin's `Query` module. +* `@web3api/ethereum-plugin-js`: Added `getNetwork` to the Ethereum plugin's `Query` module. # Web3API 0.0.1-prealpha.53 - ## Features - -- `as-bigint` upgraded to version `0.4.0`. Improvements made found [here](https://github.com/polywrap/monorepo/pull/552). +* `as-bigint` upgraded to version `0.4.0`. Improvements made found [here](https://github.com/polywrap/monorepo/pull/552). # Web3API 0.0.1-prealpha.52 - ## Features - -- Querying an interface implementation's modules given its URI is now supported within Wasm. +* Querying an interface implementation's modules given its URI is now supported within Wasm. # Web3API 0.0.1-prealpha.51 - ## Features - -- `as-bigint` upgraded to version `0.3.2`. Improvements made found [here](https://github.com/polywrap/monorepo/pull/535). +* `as-bigint` upgraded to version `0.3.2`. Improvements made found [here](https://github.com/polywrap/monorepo/pull/535). # Web3API 0.0.1-prealpha.50 - ## Features - -- Getting the implementations of an interface is now supported from within Wasm. -- `@web3api/tracing-js`: Added a class method decorator for tracing. +* Getting the implementations of an interface is now supported from within Wasm. +* `@web3api/tracing-js`: Added a class method decorator for tracing. # Web3API 0.0.1-prealpha.49 - ## Features - -- `@web3api/fs-plugin-js`: Added a "File System" plugin, which implements the `uri-resolver` interface, enabling users to load Web3API packages from their local filesystem. For example, a user could specify the URI `/fs/path/to/package/directory`. -- Upgraded the toolchain's Node.JS version to 16.13.0, which solves compatibility issues with Mac computers using the new M1 processor. +* `@web3api/fs-plugin-js`: Added a "File System" plugin, which implements the `uri-resolver` interface, enabling users to load Web3API packages from their local filesystem. For example, a user could specify the URI `/fs/path/to/package/directory`. +* Upgraded the toolchain's Node.JS version to 16.13.0, which solves compatibility issues with Mac computers using the new M1 processor. ## Bugs - -- `@web3api/cli`: Fixed the `w3 query ...` command's recipe variable parsing logic, better supporting arrays and objects. -- `@web3api/schema-compose`: Improved import parsing, and added support for recursive schema imports. +* `@web3api/cli`: Fixed the `w3 query ...` command's recipe variable parsing logic, better supporting arrays and objects. +* `@web3api/schema-compose`: Improved import parsing, and added support for recursive schema imports. # Web3API 0.0.1-prealpha.48 - ## Bugs - -- `@web3api/test-env-js`: Allow the usage of this package as an npm package outside of the monorepo folder structure. +* `@web3api/test-env-js`: Allow the usage of this package as an npm package outside of the monorepo folder structure. # Web3API 0.0.1-prealpha.47 - ## Features - -- `@web3api/client-js`: Add the Graph Node plugin to the client's default configuration. -- `@web3api/ethereum-plugin-js`: Add the `encodeFunction` query method, allowing callers to encode smart contract methods w/ argument values. +* `@web3api/client-js`: Add the Graph Node plugin to the client's default configuration. +* `@web3api/ethereum-plugin-js`: Add the `encodeFunction` query method, allowing callers to encode smart contract methods w/ argument values. # Web3API 0.0.1-prealpha.46 - ## Bugs - -- `@web3api/core-js`: Properly check for "undefined" values in query arguments. -- `@web3api/wasm-as`: Improved MsgPack deserialization of integers (signed & unsigned). +* `@web3api/core-js`: Properly check for "undefined" values in query arguments. +* `@web3api/wasm-as`: Improved MsgPack deserialization of integers (signed & unsigned). # Web3API 0.0.1-prealpha.45 - ## Features - -- `@web3api/tracing-js`: Support service name configuration. +* `@web3api/tracing-js`: Support service name configuration. # Web3API 0.0.1-prealpha.44 - ## Features - -- `@web3api/client-js`: Use Fleek's IPFS gateway. +* `@web3api/client-js`: Use Fleek's IPFS gateway. # Web3API 0.0.1-prealpha.43 - ## Features - -- `@web3api/client-js`: Added the `client.subscribe(...)` method, enabling users to easily send queries at a specified frequency. +* `@web3api/client-js`: Added the `client.subscribe(...)` method, enabling users to easily send queries at a specified frequency. ## Bugs - -- `@web3api/tracing-js`: Replaced the `util-inspect` dependency with a browser compatible one. +* `@web3api/tracing-js`: Replaced the `util-inspect` dependency with a browser compatible one. # Web3API 0.0.1-prealpha.42 - ## Bugs - -- `@web3api/schema-parse`: Removed unnecessary sanitization for imported methods without any arguments. +* `@web3api/schema-parse`: Removed unnecessary sanitization for imported methods without any arguments. # Web3API 0.0.1-prealpha.41 - ## Features - -- `@web3api/schema-parse`: Added support for `JSON` as a base type. -- `@web3api/ens-api`: Merged in an initial version of the ENS Wasm based Web3Api. -- `web3api.build.yaml`: Added support for the `linked_packages` property, allowing you to link local packages into the dockerized build-env. +* `@web3api/schema-parse`: Added support for `JSON` as a base type. +* `@web3api/ens-api`: Merged in an initial version of the ENS Wasm based Web3Api. +* `web3api.build.yaml`: Added support for the `linked_packages` property, allowing you to link local packages into the dockerized build-env. ## Bugs - -- `@web3api/schema-compose`: Fixed an invalid GraphQL bug that occured when an imported query method did not have any arguments. +* `@web3api/schema-compose`: Fixed an invalid GraphQL bug that occured when an imported query method did not have any arguments. # Web3API 0.0.1-prealpha.40 - ## Features - -- `@web3api/client-js`: Added `getManifest(...)`, `getFile(...)`, and `getSchema(...)` methods to the client, simply provide a URI. -- `@web3api/cli`: APIs can now define metadata via the `web3api.meta.yaml` manifest file. Upon compiling your project, the CLI will copy all referenced metadata files into the build directory. Applications such as The Polywrap Hub will use this metadata file to display details about your package such as: title, description, icon, example queries, etc. +* `@web3api/client-js`: Added `getManifest(...)`, `getFile(...)`, and `getSchema(...)` methods to the client, simply provide a URI. +* `@web3api/cli`: APIs can now define metadata via the `web3api.meta.yaml` manifest file. Upon compiling your project, the CLI will copy all referenced metadata files into the build directory. Applications such as The Polywrap Hub will use this metadata file to display details about your package such as: title, description, icon, example queries, etc. ## Bugs - -- `@web3api/schema-parse`: Duplicate fields on object & query types are not detected, and will cause a compiler error. +* `@web3api/schema-parse`: Duplicate fields on object & query types are not detected, and will cause a compiler error. ## Breaking Changes - -- `@web3api/client-js`: Removed the `loadWeb3Api(...)` method from the client. This is because we do not want to give the user of the client a direct reference to the underlying API class object. Since garbage collection will delete these, having the user able to hang onto references, will result in them staying in memory. +* `@web3api/client-js`: Removed the `loadWeb3Api(...)` method from the client. This is because we do not want to give the user of the client a direct reference to the underlying API class object. Since garbage collection will delete these, having the user able to hang onto references, will result in them staying in memory. # Web3API 0.0.1-prealpha.39 - ## Features - -- `@web3api/client-js`: Added `https://polywrap-dev.mypinata.cloud` and `https://ipfs.infura.io` as default fallback IPFS providers. +* `@web3api/client-js`: Added `https://polywrap-dev.mypinata.cloud` and `https://ipfs.infura.io` as default fallback IPFS providers. ## Bugs - -- `@web3api/ipfs-plugin-js`: Fallback providers are now used if an error is encountered, not just for timeouts. +* `@web3api/ipfs-plugin-js`: Fallback providers are now used if an error is encountered, not just for timeouts. # Web3API 0.0.1-prealpha.38 - ## Breaking Changes - -- `@web3api/client-js`: Removed the usage of `_w3_init`, as it's unnecessary and caused issues with adding Rust-Wasm support. +* `@web3api/client-js`: Removed the usage of `_w3_init`, as it's unnecessary and caused issues with adding Rust-Wasm support. # Web3API 0.0.1-prealpha.37 - ## Bugs - -- `@web3api/asyncify-js`: Fixed problem when Wasm modules are larger than 4 KB. More info [here](https://github.com/polywrap/monorepo/pull/450). -- `@web3api/client-js`: Use new asyncify-js package, where instantiation is asynchronous. +* `@web3api/asyncify-js`: Fixed problem when Wasm modules are larger than 4 KB. More info [here](https://github.com/polywrap/monorepo/pull/450). +* `@web3api/client-js`: Use new asyncify-js package, where instantiation is asynchronous. # Web3API 0.0.1-prealpha.36 - ## Features - -- Upgrade all JavaScript plugins to use the new `w3 plugin codegen` command. The command generates typings based on the GraphQL schema of the plugin. This ensures the plugin's resolvers match 1:1 with the GraphQL schema. +* Upgrade all JavaScript plugins to use the new `w3 plugin codegen` command. The command generates typings based on the GraphQL schema of the plugin. This ensures the plugin's resolvers match 1:1 with the GraphQL schema. # Web3API 0.0.1-prealpha.35 - ## Bugs - -- `@web3api/schema-bind`: Fix TypeScript plugin enum bindings. +* `@web3api/schema-bind`: Fix TypeScript plugin enum bindings. # Web3API 0.0.1-prealpha.34 - ## Bugs - -- `@web3api/schema-bind`: Fix TypeScript enum bindings. -- `@web3api/graph-node-plugin-js`: Fix mismatched schema. +* `@web3api/schema-bind`: Fix TypeScript enum bindings. +* `@web3api/graph-node-plugin-js`: Fix mismatched schema. # Web3API 0.0.1-prealpha.33 - ## Bugs - -- `@web3api/schema-bind`: Fixed plugin code generation oversight. Should be using `null` instead of `undefined`. +* `@web3api/schema-bind`: Fixed plugin code generation oversight. Should be using `null` instead of `undefined`. # Web3API 0.0.1-prealpha.32 - ## Features - -- Improved the plugin developer experience by creating a new `w3 plugin codegen` command, which generated types based on the plugin's schema. For an example of how this works, see the updated plugin template project by running `w3 create plugin typescript my-plugin`. -- `@web3api/cli`: Refactored the `w3 codegen` command, making its default behavior the generation of types for Web3APIs. It's "old" behavior of loading a custom generation script is now usable through the `--custom` option. +* Improved the plugin developer experience by creating a new `w3 plugin codegen` command, which generated types based on the plugin's schema. For an example of how this works, see the updated plugin template project by running `w3 create plugin typescript my-plugin`. +* `@web3api/cli`: Refactored the `w3 codegen` command, making its default behavior the generation of types for Web3APIs. It's "old" behavior of loading a custom generation script is now usable through the `--custom` option. ## Bugs - -- `@web3api/cli`: Properly validate all required Wasm exports when compiling Web3APIs. +* `@web3api/cli`: Properly validate all required Wasm exports when compiling Web3APIs. # Web3API 0.0.1-prealpha.31 - ## Features - -- Use Binaryen's Asyncify to support async Wasm import calls. Deprecate the Wasm threading model we were using previously. This now means that the client now supports all browsers, as it no longer requires `SharedArrayBuffer` & the `atomics` library. -- `@web3api/graph-node-plugin-js`: Finalized the graph-node plugin implementation, added e2e tests. It currently only works with the hosted service. +* Use Binaryen's Asyncify to support async Wasm import calls. Deprecate the Wasm threading model we were using previously. This now means that the client now supports all browsers, as it no longer requires `SharedArrayBuffer` & the `atomics` library. +* `@web3api/graph-node-plugin-js`: Finalized the graph-node plugin implementation, added e2e tests. It currently only works with the hosted service. ## Bugs - -- Removed support for UInt64 & Int64 base types. More info [here](https://github.com/polywrap/monorepo/pull/414). -- `@web3api/cli`: Properly validate all required exports from Web3API Wasm modules at compile-time. -- `@web3api/ethereum-plugin-js`: Properly support smart contract methods with structures as arguments. +* Removed support for UInt64 & Int64 base types. More info [here](https://github.com/polywrap/monorepo/pull/414). +* `@web3api/cli`: Properly validate all required exports from Web3API Wasm modules at compile-time. +* `@web3api/ethereum-plugin-js`: Properly support smart contract methods with structures as arguments. # Web3API 0.0.1-prealpha.30 - ## Bugs - -- `@web3api/ethereum-plugin-js`: Fix ethers.js inconsistencies. +* `@web3api/ethereum-plugin-js`: Fix ethers.js inconsistencies. # Web3API 0.0.1-prealpha.29 - ## Feature - -- Web3API Interfaces are now fully supported in the tool-chain. -- GraphQL schema comments are now retained, and will show up in the build folder. -- `@web3api/parse`: Reference types definitions are now differentiated from the root definitions the reference. +* Web3API Interfaces are now fully supported in the tool-chain. +* GraphQL schema comments are now retained, and will show up in the build folder. +* `@web3api/parse`: Reference types definitions are now differentiated from the root definitions the reference. ## Bugs - -- `@web3api/cli`: Fix MacOS specific issue w/ PATH not being retained. -- The `config` property in `web3api.build.yaml` is now optional. +* `@web3api/cli`: Fix MacOS specific issue w/ PATH not being retained. +* The `config` property in `web3api.build.yaml` is now optional. # Web3API 0.0.1-prealpha.28 - ## Bugs - -- Fixed API template project +* Fixed API template project # Web3API 0.0.1-prealpha.27 - ## Bugs - -- Fixed API template project +* Fixed API template project # Web3API 0.0.1-prealpha.26 - ## Feature - -- `@web3api/uniswapV2-api`: Completed the Uniswap V2 Web3API implementation. -- `@web3api/ethereum-plugin-js`: Upgraded the Ethereum plugin, added lots of new functionality. -- `@web3api/cli`: Implemented a "reproducible build pipeline", where Web3APIs are now built in an isolated docker container. These builds can be fully configurable by developers. This also paves the way for implementing Web3APIs in any Wasm compatible language. Rust support on the way! -- `@web3api/react`: Added the ability to set query `variables` within the `execute` function returned by the `useWeb3ApiQuery` hook. -- `@web3api/sha3-plugin-js`: A SHA3 plugin has been implemented, and added to the client as a "default plugin". -- `@web3api/uts46-plugin-js`: A UTS46 plugin has been implemented, and added to the client as a "default plugin". -- CI: Windows CI has been implemented using appveyor. +* `@web3api/uniswapV2-api`: Completed the Uniswap V2 Web3API implementation. +* `@web3api/ethereum-plugin-js`: Upgraded the Ethereum plugin, added lots of new functionality. +* `@web3api/cli`: Implemented a "reproducible build pipeline", where Web3APIs are now built in an isolated docker container. These builds can be fully configurable by developers. This also paves the way for implementing Web3APIs in any Wasm compatible language. Rust support on the way! +* `@web3api/react`: Added the ability to set query `variables` within the `execute` function returned by the `useWeb3ApiQuery` hook. +* `@web3api/sha3-plugin-js`: A SHA3 plugin has been implemented, and added to the client as a "default plugin". +* `@web3api/uts46-plugin-js`: A UTS46 plugin has been implemented, and added to the client as a "default plugin". +* CI: Windows CI has been implemented using appveyor. ## Bugs - -- `@web3api/client-js`: Fixed threading issue causing the "unknown wake status" error. -- Fixed Windows specific errors. +* `@web3api/client-js`: Fixed threading issue causing the "unknown wake status" error. +* Fixed Windows specific errors. # Web3API 0.0.1-prealpha.25 - ## Feature - -- `@web3api/client-js`: Added the `WEB3API_THREAD_PATH` env variable, allowing integrators to customize where the `thread.js` worker thread module is imported from. -- `@web3api/wasm-as`: Improved error logging w/ better error messages and a "context stack" showing exactly what properties of the MsgPack blob the serialization / deserialization is failing at. +* `@web3api/client-js`: Added the `WEB3API_THREAD_PATH` env variable, allowing integrators to customize where the `thread.js` worker thread module is imported from. +* `@web3api/wasm-as`: Improved error logging w/ better error messages and a "context stack" showing exactly what properties of the MsgPack blob the serialization / deserialization is failing at. # Web3API 0.0.1-prealpha.24 - ## Bugs - -- `@web3api/wasm-as`: Moved `as-bigint` from `devDependencies` to `dependencies`. Fixes [issue #347](https://github.com/Web3-API/monorepo/issues/347) +* `@web3api/wasm-as`: Moved `as-bigint` from `devDependencies` to `dependencies`. Fixes [issue #347](https://github.com/Web3-API/monorepo/issues/347) # Web3API 0.0.1-prealpha.23 - ## Feature - -- `@web3api/os-js`: This package contains OS agnostic code for doing things like writing files w/ consistent line endings. -- Windows Support: The toolchain now builds and runs properly on the Windows operating system. -- `BigInt` Schema Type: The `BigInt` type is now available for use as a base type for Web3API GraphQL schemas. -- `@web3api/react`: The `useWeb3ApiClient` hook was added, allowing users to easily get a reference to the Web3ApiClient used by the Web3ApiProvider. +* `@web3api/os-js`: This package contains OS agnostic code for doing things like writing files w/ consistent line endings. +* Windows Support: The toolchain now builds and runs properly on the Windows operating system. +* `BigInt` Schema Type: The `BigInt` type is now available for use as a base type for Web3API GraphQL schemas. +* `@web3api/react`: The `useWeb3ApiClient` hook was added, allowing users to easily get a reference to the Web3ApiClient used by the Web3ApiProvider. # Web3API 0.0.1-prealpha.22 - ## Feature - -- `@web3api/tracing-js`: The `tracing-js` package uses the [OpenTelemetry Standard](https://opentelemetry.io/) for logging trace events. This enables things like: - - Benchmark Timings - - Input Argument + Output Result Logging - - In-Depth Exception Tracing -- `@web3api/core-js`: All functions are now traceable. -- `@web3api/client-js`: All functions are now traceable. +* `@web3api/tracing-js`: The `tracing-js` package uses the [OpenTelemetry Standard](https://opentelemetry.io/) for logging trace events. This enables things like: + * Benchmark Timings + * Input Argument + Output Result Logging + * In-Depth Exception Tracing +* `@web3api/core-js`: All functions are now traceable. +* `@web3api/client-js`: All functions are now traceable. # Web3API 0.0.1-prealpha.21 - ## Feature - -- Sharing code & types between `query` and `mutation` modules is now possible. +* Sharing code & types between `query` and `mutation` modules is now possible. ## Bugs - -- Common types found in both `query` and `mutation` schemas are properly consolidated. If types have the same name, but a different structure, and error is thrown. +* Common types found in both `query` and `mutation` schemas are properly consolidated. If types have the same name, but a different structure, and error is thrown. # Web3API 0.0.1-prealpha.20 - ## Bugs - -- Fix the `w3 create app react ...` template project's styling to be responsive. +* Fix the `w3 create app react ...` template project's styling to be responsive. # Web3API 0.0.1-prealpha.19 - ## Features - -- `@web3api/ipfs-plugin-js`: Added options for request timeouts, provider overrides, and fallback providers. Additionally a new method has been added, `resolve`, which allows the caller to try and resolve a given IFPS CID to ensure the document exists. +* `@web3api/ipfs-plugin-js`: Added options for request timeouts, provider overrides, and fallback providers. Additionally a new method has been added, `resolve`, which allows the caller to try and resolve a given IFPS CID to ensure the document exists. # Web3API 0.0.1-prealpha.18 - ## Features - -- Updated the `app/react` template project to use the latest "Hello World" Web3API published at `ens/helloworld.web3api.eth`. +* Updated the `app/react` template project to use the latest "Hello World" Web3API published at `ens/helloworld.web3api.eth`. # Web3API 0.0.1-prealpha.17 - ## Bugs - -- `@web3api/ethereum-plugin-js`: Network configurations must be nested within a property in order to allow for the `defaultNetwork` property to be set w/o causing a typing error (for not being of the `ConnectionConfig` type). +* `@web3api/ethereum-plugin-js`: Network configurations must be nested within a property in order to allow for the `defaultNetwork` property to be set w/o causing a typing error (for not being of the `ConnectionConfig` type). # Web3API 0.0.1-prealpha.16 - ## Bugs - -- `@web3api/test-env`: Expose the IPFS node's swarm port (4001). +* `@web3api/test-env`: Expose the IPFS node's swarm port (4001). # Web3API 0.0.1-prealpha.15 - ## Bugs - -- Fix `extractPluginConfigs.ts` output. +* Fix `extractPluginConfigs.ts` output. # Web3API 0.0.1-prealpha.14 - ## Features - -- Network Specific ENS Lookup - - `@web3api/ethereum-plugin-js`: The EthereumPlugin can now be constructed with multiple network connections (mainnet, rinkeby, testnet, etc). - - All Query & Mutation methods now accept an optional `connection` property which can be used to configure a specific network to be used for the action. - - `@web3api/ens-plugin-js`: The EnsPlugin can now handle URIs that address specific networks. For example: `w3://ens/testnet/myweb3api.eth`. It will request the `testnet` connection to be used when querying the Ethereum Web3API. +* Network Specific ENS Lookup + * `@web3api/ethereum-plugin-js`: The EthereumPlugin can now be constructed with multiple network connections (mainnet, rinkeby, testnet, etc). + * All Query & Mutation methods now accept an optional `connection` property which can be used to configure a specific network to be used for the action. + * `@web3api/ens-plugin-js`: The EnsPlugin can now handle URIs that address specific networks. For example: `w3://ens/testnet/myweb3api.eth`. It will request the `testnet` connection to be used when querying the Ethereum Web3API. # Web3API 0.0.1-prealpha.13 - ## Features - -- Improved template projects that are used with the `w3 create ...` CLI command. +* Improved template projects that are used with the `w3 create ...` CLI command. # Web3API 0.0.1-prealpha.12 - ## Bug Fixes - -- Added schemas to plugin manifest modules, removing the need for `import_redirects`. -- Fixed the IpfsPlugin's `addFile` method. -- Improved the api/assemblyscript template project. +* Added schemas to plugin manifest modules, removing the need for `import_redirects`. +* Fixed the IpfsPlugin's `addFile` method. +* Improved the api/assemblyscript template project. # Web3API 0.0.1-prealpha.11 - ## Bug Fixes - -- `@web3api/cli`: Include the internationalization JSON files in the published package. +* `@web3api/cli`: Include the internationalization JSON files in the published package. # Web3API 0.0.1-prealpha.10 - ## Bug Fixes - -- `@web3api/ens-plugin-js`: Fix the schema. +* `@web3api/ens-plugin-js`: Fix the schema. # Web3API 0.0.1-prealpha.9 - ## Features - -- `@web3api/cli`: CLI Internalized Text Support - - Currently English is implemented, and Spanish support is slated to be added next. -- `@web3api/schema-parse`: GraphQL Infinite Cycle Detection - - Bad object relationships within the Web3API's GraphQL schema are now automatically detected, ensuring developers never create objects that can never be instantiated properly. -- `@web3api/templates`: Auto-Generate Smart Contract ABI & Bytecode Assemblyscript Module - - This auto-generated module is being used within the `deployContract` mutation. +* `@web3api/cli`: CLI Internalized Text Support + * Currently English is implemented, and Spanish support is slated to be added next. +* `@web3api/schema-parse`: GraphQL Infinite Cycle Detection + * Bad object relationships within the Web3API's GraphQL schema are now automatically detected, ensuring developers never create objects that can never be instantiated properly. +* `@web3api/templates`: Auto-Generate Smart Contract ABI & Bytecode Assemblyscript Module + * This auto-generated module is being used within the `deployContract` mutation. ## Bug Fixes - -- `@web3api/core-js`: The `resolve-uri` core algorithm had an "off by one" iteration bug, where it never retried the first `api-resolver` in the implementations array. -- `@web3api/ethereum-plugin-js`: When using a provider that lacks signing capabilities (ex: Infura RPC endpoint), the `getContract` function was trying to get a signer when one did not exist. -- `@web3api/ipfs-plugin-js`: Fixed this plugin's schema, as it was using unsupported syntax. +* `@web3api/core-js`: The `resolve-uri` core algorithm had an "off by one" iteration bug, where it never retried the first `api-resolver` in the implementations array. +* `@web3api/ethereum-plugin-js`: When using a provider that lacks signing capabilities (ex: Infura RPC endpoint), the `getContract` function was trying to get a signer when one did not exist. +* `@web3api/ipfs-plugin-js`: Fixed this plugin's schema, as it was using unsupported syntax. ## Misc - -- Upgrade node version to v14.16.0. -- Upgrade TypeScript version to v4.0.7. +* Upgrade node version to v14.16.0. +* Upgrade TypeScript version to v4.0.7. # Web3API 0.0.1-prealpha.8 - ## Bug Fixes - -- Fixed bug in `@web3api/react` package. +* Fixed bug in `@web3api/react` package. ## Misc - -- Removed documentation & demos from the monorepo. +* Removed documentation & demos from the monorepo. # Web3API 0.0.1-prealpha.7 - ## Features - -- Console Log Web3API - - Calls log on logger plugin at uri w3://w3/logger. Default logger logs to console, but can be overridden with redirect to custom logger web3api implementation. - - Log levels: Debug, Info, Warn, Error -- `createWeb3ApiClient(...)` helper for easily setting up a Web3API Client with all needed plugins (ex: ethereum, ipfs, etc) in one function call. - - Additional support for plugins can be added in the future, without bloating the `@web3api/client-js` package thanks to dynamic imports! -- When using the Web3ApiClient, specify Web3API URIs without having to create a new URI class (`new Uri("...")`). Simply provide a string instead. -- Improved plugin instantiation interface. +* Console Log Web3API + * Calls log on logger plugin at uri w3://w3/logger. Default logger logs to console, but can be overridden with redirect to custom logger web3api implementation. + * Log levels: Debug, Info, Warn, Error +* `createWeb3ApiClient(...)` helper for easily setting up a Web3API Client with all needed plugins (ex: ethereum, ipfs, etc) in one function call. + * Additional support for plugins can be added in the future, without bloating the `@web3api/client-js` package thanks to dynamic imports! +* When using the Web3ApiClient, specify Web3API URIs without having to create a new URI class (`new Uri("...")`). Simply provide a string instead. +* Improved plugin instantiation interface. ## Bug Fixes - -- Proper MsgPack numeric overflow assertions (closes: [#150](https://github.com/Web3-API/monorepo/issues/150)) -- Proper usage of [GraphQL Aliases](https://graphql.org/learn/queries/#aliases) when invoking multiple methods in one query. +* Proper MsgPack numeric overflow assertions (closes: [#150](https://github.com/Web3-API/monorepo/issues/150)) +* Proper usage of [GraphQL Aliases](https://graphql.org/learn/queries/#aliases) when invoking multiple methods in one query. # Web3API 0.0.1-prealpha.6 - ## Features - -- Web3API React Integration: `@web3api/react` - - Add the `Web3ApiProvider` HOC to the root of your application. - - Use the `useWeb3ApiQuery` hook to execute queries. -- Web3API CLI e2e tests. -- `@web3api/test-env-js` package for common testing logic. -- `@web3api/test-cases` for common test cases. +* Web3API React Integration: `@web3api/react` + * Add the `Web3ApiProvider` HOC to the root of your application. + * Use the `useWeb3ApiQuery` hook to execute queries. +* Web3API CLI e2e tests. +* `@web3api/test-env-js` package for common testing logic. +* `@web3api/test-cases` for common test cases. ## Bug Fixes - -- Remove unused `workerize-loader` package & logic. +* Remove unused `workerize-loader` package & logic. # Web3API 0.0.1-prealpha.5 - ## Features - -- `w3 build --watch` support, enabling the automatic rebuilding of Web3APIs whenever project files have changed. +* `w3 build --watch` support, enabling the automatic rebuilding of Web3APIs whenever project files have changed. # Web3API 0.0.1-prealpha.4 - ## Features - -- Enum Support +* Enum Support ## Bug Fixes - -- `w3 create ...` CLI Fix (closes: [#167](https://github.com/Web3-API/monorepo/issues/167)) +* `w3 create ...` CLI Fix (closes: [#167](https://github.com/Web3-API/monorepo/issues/167)) # Web3API 0.0.1-prealpha.2 - ## Bug Fixes - -- Fix typescript plugin template's package.json +* Fix typescript plugin template's package.json # Web3API 0.0.1-prealpha.1 - -Pre-Alpha Initial Release +Pre-Alpha Initial Release \ No newline at end of file From ebc07755c2af8d2b6e2e0dc12e714431c830347a Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Tue, 18 Jul 2023 23:45:18 +0800 Subject: [PATCH 156/181] fix: issues --- .../bindings/golang/transforms/moduleNeedsTypes.ts | 13 ++++++++++++- .../schema/bind/src/bindings/golang/wasm/index.ts | 2 +- .../module_wrapped/%type%Wrapped-go.mustache | 2 +- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/schema/bind/src/bindings/golang/transforms/moduleNeedsTypes.ts b/packages/schema/bind/src/bindings/golang/transforms/moduleNeedsTypes.ts index 060a8f9936..766010c8a9 100644 --- a/packages/schema/bind/src/bindings/golang/transforms/moduleNeedsTypes.ts +++ b/packages/schema/bind/src/bindings/golang/transforms/moduleNeedsTypes.ts @@ -10,6 +10,7 @@ import { AbiTransforms } from "@polywrap/schema-parse"; interface ModuleNeedsTypesState { moduleDefinition?: ModuleDefinition; needsTypes?: boolean; + importedTypes?: Map; } export function moduleNeedsTypes(): AbiTransforms { @@ -17,6 +18,12 @@ export function moduleNeedsTypes(): AbiTransforms { return { enter: { + Abi: (abi) => { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + state.importedTypes = abi._importedTypes; + return abi; + }, ModuleDefinition: (def: ModuleDefinition) => { state.moduleDefinition = def; state.needsTypes = false; @@ -29,7 +36,11 @@ export function moduleNeedsTypes(): AbiTransforms { if (def.return) { const returnType = def.return.type; - if (!isBaseType(returnType) && !isBuiltInType(returnType)) { + if ( + !isBaseType(returnType) && + !isBuiltInType(returnType) && + !state.importedTypes?.has(returnType) + ) { state.needsTypes = true; } } diff --git a/packages/schema/bind/src/bindings/golang/wasm/index.ts b/packages/schema/bind/src/bindings/golang/wasm/index.ts index 27033fb91d..4c3faf5a7e 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/index.ts +++ b/packages/schema/bind/src/bindings/golang/wasm/index.ts @@ -271,10 +271,10 @@ function applyTransforms(abi: Abi): Abi { extendType(Functions), addFirstLast, toPrefixedGraphQLType, - Transforms.moduleNeedsTypes(), Transforms.extractImportedTypes(), Transforms.extractNeededImportedNamespaces(), Transforms.needsImportedNamespaces(), + Transforms.moduleNeedsTypes(), ]; for (const transform of transforms) { diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache index cd6794431f..c4822d1d06 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache @@ -1,6 +1,6 @@ package module_wrapped {{#makeImports}} - {{#methods}}{{#env}}github.com/polywrap/go-wrap/wrap,{{#needsTypes}}. {{goImport}}/module/wrap/types,{{/needsTypes}}{{/env}}{{/methods}} + {{#methods}}{{#env}}github.com/polywrap/go-wrap/wrap,. {{goImport}}/module/wrap/types,{{/env}}{{^env}}{{#needsTypes}}. {{goImport}}/module/wrap/types,{{/needsTypes}}{{/env}}{{/methods}} {{goImport}}/module as methods, {{/makeImports}} {{#methods}} From 4d6e91b8d7e3309d845f600960f1cb0f27bbef97 Mon Sep 17 00:00:00 2001 From: Pileks Date: Tue, 18 Jul 2023 18:31:27 +0200 Subject: [PATCH 157/181] use version from package.json instead of reading VERSION file which can break create tests in CI --- packages/cli/src/__tests__/e2e/p1/create.spec.ts | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/packages/cli/src/__tests__/e2e/p1/create.spec.ts b/packages/cli/src/__tests__/e2e/p1/create.spec.ts index 7749b8e6c1..574b6c0d26 100644 --- a/packages/cli/src/__tests__/e2e/p1/create.spec.ts +++ b/packages/cli/src/__tests__/e2e/p1/create.spec.ts @@ -4,8 +4,7 @@ import { UrlFormat } from "../../../lib"; import { runCli } from "@polywrap/cli-js"; import rimraf from "rimraf"; -import path from "path"; -import fs from "fs"; +import pjson from "../../../../package.json"; const HELP = `Usage: polywrap create|c [options] [command] @@ -26,13 +25,7 @@ Commands: help [command] display help for command `; -const VERSION = - fs.readFileSync( - path.join(__dirname, "../../../../../../VERSION"), - "utf-8" - ) - .replace(/\n/g, "") - .replace(/\r/g, ""); +const VERSION = pjson.version; const urlExamples = (format: UrlFormat): string => { if (format === UrlFormat.git) { From da46221c6c7a6408427cf879f3c37aaec66273bc Mon Sep 17 00:00:00 2001 From: polywrap-build-bot Date: Tue, 18 Jul 2023 17:21:10 +0000 Subject: [PATCH 158/181] build(release): migrate to 0.11.0-pre.3 --- packages/cli/package.json | 20 +++++++++---------- packages/js/cli/package.json | 4 ++-- packages/js/logging/package.json | 2 +- packages/js/manifests/polywrap/package.json | 8 ++++---- packages/js/os/package.json | 2 +- packages/js/validation/package.json | 6 +++--- packages/manifests/polywrap/package.json | 2 +- packages/schema/bind/package.json | 8 ++++---- packages/schema/compose/package.json | 8 ++++---- packages/schema/parse/package.json | 4 ++-- .../templates/app/typescript/package.json | 4 ++-- packages/templates/package.json | 2 +- packages/templates/plugin/python/package.json | 4 ++-- packages/templates/plugin/rust/package.json | 4 ++-- .../templates/plugin/typescript/package.json | 4 ++-- .../wasm/assemblyscript/package.json | 6 +++--- packages/templates/wasm/golang/package.json | 4 ++-- packages/templates/wasm/rust/package.json | 4 ++-- packages/test-cases/package.json | 4 ++-- packages/wasm/as/package.json | 2 +- packages/wasm/rs/Cargo.toml | 2 +- 21 files changed, 52 insertions(+), 52 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 4d82655efd..3d002437d3 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,7 +1,7 @@ { "name": "polywrap", "description": "Polywrap CLI", - "version": "0.11.0-pre.2", + "version": "0.11.0-pre.3", "license": "MIT", "repository": { "type": "git", @@ -48,19 +48,19 @@ "@polywrap/client-js": "0.12.0-pre.1", "@polywrap/core-js": "0.12.0-pre.1", "@polywrap/ethereum-provider-js": "0.3.1", - "@polywrap/logging-js": "0.11.0-pre.2", - "@polywrap/os-js": "0.11.0-pre.2", - "@polywrap/polywrap-manifest-types-js": "0.11.0-pre.2", + "@polywrap/logging-js": "0.11.0-pre.3", + "@polywrap/os-js": "0.11.0-pre.3", + "@polywrap/polywrap-manifest-types-js": "0.11.0-pre.3", "@polywrap/result": "0.12.0-pre.1", - "@polywrap/schema-bind": "0.11.0-pre.2", - "@polywrap/schema-compose": "0.11.0-pre.2", - "@polywrap/schema-parse": "0.11.0-pre.2", + "@polywrap/schema-bind": "0.11.0-pre.3", + "@polywrap/schema-compose": "0.11.0-pre.3", + "@polywrap/schema-parse": "0.11.0-pre.3", + "@polywrap/sys-config-bundle-js": "0.12.0-pre.1", "@polywrap/uri-resolver-extensions-js": "0.12.0-pre.1", "@polywrap/uri-resolvers-js": "0.12.0-pre.1", "@polywrap/wasm-js": "0.12.0-pre.1", - "@polywrap/wrap-manifest-types-js": "0.12.0-pre.1", "@polywrap/web3-config-bundle-js": "0.12.0-pre.1", - "@polywrap/sys-config-bundle-js": "0.12.0-pre.1", + "@polywrap/wrap-manifest-types-js": "0.12.0-pre.1", "axios": "0.21.2", "chalk": "4.1.0", "chokidar": "3.5.1", @@ -83,7 +83,7 @@ "yesno": "0.4.0" }, "devDependencies": { - "@polywrap/cli-js": "0.11.0-pre.2", + "@polywrap/cli-js": "0.11.0-pre.3", "@types/copyfiles": "2.4.0", "@types/fs-extra": "9.0.12", "@types/jest": "26.0.8", diff --git a/packages/js/cli/package.json b/packages/js/cli/package.json index 343d8ec21a..0a1e922e58 100644 --- a/packages/js/cli/package.json +++ b/packages/js/cli/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/cli-js", "description": "Programmatically execute the Polywrap CLI", - "version": "0.11.0-pre.2", + "version": "0.11.0-pre.3", "license": "MIT", "repository": { "type": "git", @@ -17,7 +17,7 @@ "test": "jest --passWithNoTests --runInBand --detectOpenHandles --verbose" }, "dependencies": { - "polywrap": "0.11.0-pre.2", + "polywrap": "0.11.0-pre.3", "spawn-command": "0.0.2-1" }, "devDependencies": { diff --git a/packages/js/logging/package.json b/packages/js/logging/package.json index 368f6ab917..41633904e5 100644 --- a/packages/js/logging/package.json +++ b/packages/js/logging/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/logging-js", "description": "Polywrap Core Logging Interface", - "version": "0.11.0-pre.2", + "version": "0.11.0-pre.3", "license": "MIT", "repository": { "type": "git", diff --git a/packages/js/manifests/polywrap/package.json b/packages/js/manifests/polywrap/package.json index 0ef9122cf6..4ae0ec1cf0 100644 --- a/packages/js/manifests/polywrap/package.json +++ b/packages/js/manifests/polywrap/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/polywrap-manifest-types-js", "description": "Polywrap Manifest TypeScript Typings", - "version": "0.11.0-pre.2", + "version": "0.11.0-pre.3", "license": "MIT", "repository": { "type": "git", @@ -15,14 +15,14 @@ "test:watch": "yarn test -- --watch" }, "dependencies": { - "@polywrap/logging-js": "0.11.0-pre.2", - "@polywrap/polywrap-manifest-schemas": "0.11.0-pre.2", + "@polywrap/logging-js": "0.11.0-pre.3", + "@polywrap/polywrap-manifest-schemas": "0.11.0-pre.3", "jsonschema": "1.4.0", "semver": "7.5.3", "yaml": "2.2.2" }, "devDependencies": { - "@polywrap/os-js": "0.11.0-pre.2", + "@polywrap/os-js": "0.11.0-pre.3", "@types/jest": "26.0.8", "@types/mustache": "4.0.1", "@types/prettier": "2.6.0", diff --git a/packages/js/os/package.json b/packages/js/os/package.json index 4aab01db3f..84a75658bb 100644 --- a/packages/js/os/package.json +++ b/packages/js/os/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/os-js", "description": "Polywrap Javascript OS Utilities", - "version": "0.11.0-pre.2", + "version": "0.11.0-pre.3", "license": "MIT", "repository": { "type": "git", diff --git a/packages/js/validation/package.json b/packages/js/validation/package.json index 95424cbec6..35d7509869 100644 --- a/packages/js/validation/package.json +++ b/packages/js/validation/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/package-validation", "description": "Polywrap Package Validator", - "version": "0.11.0-pre.2", + "version": "0.11.0-pre.3", "license": "MIT", "repository": { "type": "git", @@ -18,12 +18,12 @@ "test:watch": "yarn test -- --watch" }, "dependencies": { - "@polywrap/schema-compose": "0.11.0-pre.2", + "@polywrap/schema-compose": "0.11.0-pre.3", "@polywrap/wrap-manifest-types-js": "0.12.0-pre.1" }, "devDependencies": { "@polywrap/msgpack-js": "0.10.0", - "@polywrap/os-js": "0.11.0-pre.2", + "@polywrap/os-js": "0.11.0-pre.3", "@types/jest": "26.0.8", "jest": "26.6.3", "rimraf": "3.0.2", diff --git a/packages/manifests/polywrap/package.json b/packages/manifests/polywrap/package.json index 1020e71ae8..b440068e9f 100644 --- a/packages/manifests/polywrap/package.json +++ b/packages/manifests/polywrap/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/polywrap-manifest-schemas", "description": "Polywrap Manifest Schemas", - "version": "0.11.0-pre.2", + "version": "0.11.0-pre.3", "license": "MIT", "repository": { "type": "git", diff --git a/packages/schema/bind/package.json b/packages/schema/bind/package.json index 37b32994c8..cfe88baedb 100644 --- a/packages/schema/bind/package.json +++ b/packages/schema/bind/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/schema-bind", "description": "Polywrap Schema Binding", - "version": "0.11.0-pre.2", + "version": "0.11.0-pre.3", "license": "MIT", "repository": { "type": "git", @@ -20,13 +20,13 @@ }, "dependencies": { "@polywrap/client-js": "0.12.0-pre.1", - "@polywrap/os-js": "0.11.0-pre.2", - "@polywrap/schema-parse": "0.11.0-pre.2", + "@polywrap/os-js": "0.11.0-pre.3", + "@polywrap/schema-parse": "0.11.0-pre.3", "@polywrap/wrap-manifest-types-js": "0.12.0-pre.1", "mustache": "4.0.1" }, "devDependencies": { - "@polywrap/test-cases": "0.11.0-pre.2", + "@polywrap/test-cases": "0.11.0-pre.3", "@types/jest": "26.0.8", "@types/lodash": "4.14.178", "@types/mustache": "4.0.1", diff --git a/packages/schema/compose/package.json b/packages/schema/compose/package.json index 0c2d48b34d..4af04778ec 100644 --- a/packages/schema/compose/package.json +++ b/packages/schema/compose/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/schema-compose", "description": "Polywrap Schema Composition", - "version": "0.11.0-pre.2", + "version": "0.11.0-pre.3", "license": "MIT", "repository": { "type": "git", @@ -18,14 +18,14 @@ "test:watch": "yarn test -- --watch" }, "dependencies": { - "@polywrap/schema-parse": "0.11.0-pre.2", + "@polywrap/schema-parse": "0.11.0-pre.3", "@polywrap/wrap-manifest-types-js": "0.12.0-pre.1", "graphql": "15.5.0", "mustache": "4.0.1" }, "devDependencies": { - "@polywrap/os-js": "0.11.0-pre.2", - "@polywrap/test-cases": "0.11.0-pre.2", + "@polywrap/os-js": "0.11.0-pre.3", + "@polywrap/test-cases": "0.11.0-pre.3", "@types/jest": "26.0.8", "@types/mustache": "4.0.1", "@types/prettier": "2.6.0", diff --git a/packages/schema/parse/package.json b/packages/schema/parse/package.json index ae074d87b2..e34b004f10 100644 --- a/packages/schema/parse/package.json +++ b/packages/schema/parse/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/schema-parse", "description": "Polywrap Schema Parsing", - "version": "0.11.0-pre.2", + "version": "0.11.0-pre.3", "license": "MIT", "repository": { "type": "git", @@ -23,7 +23,7 @@ "graphql": "15.5.0" }, "devDependencies": { - "@polywrap/test-cases": "0.11.0-pre.2", + "@polywrap/test-cases": "0.11.0-pre.3", "@types/deep-equal": "1.0.1", "@types/jest": "26.0.8", "@types/prettier": "2.6.0", diff --git a/packages/templates/app/typescript/package.json b/packages/templates/app/typescript/package.json index f654af96a7..478f4feb1d 100644 --- a/packages/templates/app/typescript/package.json +++ b/packages/templates/app/typescript/package.json @@ -2,7 +2,7 @@ "name": "templates-app-typescript", "description": "Polywrap App TypeScript Template", "private": true, - "version": "0.11.0-pre.2", + "version": "0.11.0-pre.3", "scripts": { "build": "npx polywrap codegen", "test": "ts-node ./src/index.ts" @@ -12,7 +12,7 @@ }, "devDependencies": { "@types/node": "18.15.0", - "polywrap": "0.11.0-pre.2", + "polywrap": "0.11.0-pre.3", "ts-node": "10.9.1", "typescript": "4.9.5" } diff --git a/packages/templates/package.json b/packages/templates/package.json index 9d8e85b6ea..9afef11c93 100644 --- a/packages/templates/package.json +++ b/packages/templates/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/templates", "description": "Polywrap Templates", - "version": "0.11.0-pre.2", + "version": "0.11.0-pre.3", "license": "MIT", "repository": { "type": "git", diff --git a/packages/templates/plugin/python/package.json b/packages/templates/plugin/python/package.json index 807cecad9c..afe3318b22 100644 --- a/packages/templates/plugin/python/package.json +++ b/packages/templates/plugin/python/package.json @@ -1,8 +1,8 @@ { "name": "templates-plugin-python", "private": true, - "version": "0.11.0-pre.2", + "version": "0.11.0-pre.3", "dependencies": { - "polywrap": "0.11.0-pre.2" + "polywrap": "0.11.0-pre.3" } } diff --git a/packages/templates/plugin/rust/package.json b/packages/templates/plugin/rust/package.json index 186420e598..f1679da7a5 100644 --- a/packages/templates/plugin/rust/package.json +++ b/packages/templates/plugin/rust/package.json @@ -1,8 +1,8 @@ { "name": "templates-plugin-rust", "private": true, - "version": "0.11.0-pre.2", + "version": "0.11.0-pre.3", "dependencies": { - "polywrap": "0.11.0-pre.2" + "polywrap": "0.11.0-pre.3" } } diff --git a/packages/templates/plugin/typescript/package.json b/packages/templates/plugin/typescript/package.json index 3b4819c505..2be15df965 100644 --- a/packages/templates/plugin/typescript/package.json +++ b/packages/templates/plugin/typescript/package.json @@ -2,7 +2,7 @@ "name": "templates-plugin-typescript", "description": "Polywrap Plugin Typescript Template", "private": true, - "version": "0.11.0-pre.2", + "version": "0.11.0-pre.3", "main": "build/index.js", "scripts": { "build": "rimraf ./build && yarn codegen && tsc --project tsconfig.json", @@ -23,7 +23,7 @@ "@types/jest": "26.0.8", "@types/prettier": "2.6.0", "jest": "26.6.3", - "polywrap": "0.11.0-pre.2", + "polywrap": "0.11.0-pre.3", "rimraf": "3.0.2", "ts-jest": "26.5.4", "ts-node": "10.9.1", diff --git a/packages/templates/wasm/assemblyscript/package.json b/packages/templates/wasm/assemblyscript/package.json index cbea4363a4..448f865d14 100644 --- a/packages/templates/wasm/assemblyscript/package.json +++ b/packages/templates/wasm/assemblyscript/package.json @@ -2,7 +2,7 @@ "name": "template-wasm-as", "description": "Polywrap AssemblyScript Wrapper Template", "private": true, - "version": "0.11.0-pre.2", + "version": "0.11.0-pre.3", "scripts": { "codegen": "npx polywrap codegen", "build": "npx polywrap build", @@ -17,12 +17,12 @@ "devDependencies": { "@types/jest": "26.0.8", "jest": "26.6.3", - "polywrap": "0.11.0-pre.2", + "polywrap": "0.11.0-pre.3", "ts-jest": "26.5.4", "typescript": "4.9.5" }, "dependencies": { - "@polywrap/wasm-as": "0.11.0-pre.2", + "@polywrap/wasm-as": "0.11.0-pre.3", "assemblyscript": "0.19.23" } } diff --git a/packages/templates/wasm/golang/package.json b/packages/templates/wasm/golang/package.json index 9232700a83..31fb0a2797 100644 --- a/packages/templates/wasm/golang/package.json +++ b/packages/templates/wasm/golang/package.json @@ -2,7 +2,7 @@ "name": "template-wasm-go", "description": "Polywrap Golang Wrapper Template", "private": true, - "version": "0.11.0-pre.2", + "version": "0.11.0-pre.3", "scripts": { "codegen": "npx polywrap codegen", "build": "npx polywrap build", @@ -15,7 +15,7 @@ "devDependencies": { "@types/jest": "26.0.8", "jest": "26.6.3", - "polywrap": "0.11.0-pre.2", + "polywrap": "0.11.0-pre.3", "ts-jest": "26.5.4", "typescript": "4.9.5" } diff --git a/packages/templates/wasm/rust/package.json b/packages/templates/wasm/rust/package.json index 97a8b9f721..4fcc74c393 100644 --- a/packages/templates/wasm/rust/package.json +++ b/packages/templates/wasm/rust/package.json @@ -2,7 +2,7 @@ "name": "template-wasm-rs", "description": "Polywrap Rust Wrapper Template", "private": true, - "version": "0.11.0-pre.2", + "version": "0.11.0-pre.3", "scripts": { "codegen": "npx polywrap codegen", "build": "npx polywrap build", @@ -15,7 +15,7 @@ "devDependencies": { "@types/jest": "26.0.8", "jest": "26.6.3", - "polywrap": "0.11.0-pre.2", + "polywrap": "0.11.0-pre.3", "ts-jest": "26.5.4", "typescript": "4.9.5" } diff --git a/packages/test-cases/package.json b/packages/test-cases/package.json index d5026d2199..abc1cc9d48 100644 --- a/packages/test-cases/package.json +++ b/packages/test-cases/package.json @@ -2,14 +2,14 @@ "name": "@polywrap/test-cases", "description": "Reusable Polywrap Test Cases", "private": true, - "version": "0.11.0-pre.2", + "version": "0.11.0-pre.3", "license": "MIT", "main": "index.ts", "scripts": { "generate:wrappers": "ts-node -e \"import { fetchWrappers } from './'; (async () => await fetchWrappers())()\"" }, "dependencies": { - "@polywrap/os-js": "0.11.0-pre.2" + "@polywrap/os-js": "0.11.0-pre.3" }, "devDependencies": { "@types/adm-zip": "0.5.0", diff --git a/packages/wasm/as/package.json b/packages/wasm/as/package.json index cac2329e32..e440667217 100644 --- a/packages/wasm/as/package.json +++ b/packages/wasm/as/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/wasm-as", "description": "Polywrap Assemblyscript Runtime", - "version": "0.11.0-pre.2", + "version": "0.11.0-pre.3", "license": "MIT", "repository": { "type": "git", diff --git a/packages/wasm/rs/Cargo.toml b/packages/wasm/rs/Cargo.toml index 918c06ba97..159077bca4 100644 --- a/packages/wasm/rs/Cargo.toml +++ b/packages/wasm/rs/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polywrap-wasm-rs" -version = "0.11.0-pre.2" +version = "0.11.0-pre.3" license = "MIT" description = "Polywrap's Rust-Wasm Runtime" homepage = "https://polywrap.io" From a99bea19dabf732eeff81b0b1bd24b0f6a56a5b8 Mon Sep 17 00:00:00 2001 From: Cesar Date: Tue, 18 Jul 2023 21:13:04 +0200 Subject: [PATCH 159/181] chore: update wrap test harness branch --- WRAP_TEST_HARNESS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WRAP_TEST_HARNESS b/WRAP_TEST_HARNESS index 8b25206ff9..650c38f2e9 100644 --- a/WRAP_TEST_HARNESS +++ b/WRAP_TEST_HARNESS @@ -1 +1 @@ -master \ No newline at end of file +chore/latest-rust-wrap-bindings \ No newline at end of file From ebf764b9dbee438339f4c421ad76b1afaa9e0e64 Mon Sep 17 00:00:00 2001 From: Jure Bogunovic Date: Tue, 18 Jul 2023 21:47:18 +0200 Subject: [PATCH 160/181] prep-0.11.0-pre.4 --- CHANGELOG.md | 2 +- VERSION | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0bd6429d6a..4188221bef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -# Polywrap Origin (0.11.0-pre.3) +# Polywrap Origin (0.11.0-pre.4) ... # Polywrap Origin (0.10.6) diff --git a/VERSION b/VERSION index 66d1ae5e88..86e88990e2 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.11.0-pre.3 +0.11.0-pre.4 From 64de0abe3b0079229a63048fd2b5d6c4f9463f2d Mon Sep 17 00:00:00 2001 From: polywrap-build-bot Date: Tue, 18 Jul 2023 19:58:43 +0000 Subject: [PATCH 161/181] build(release): migrate to 0.11.0-pre.4 --- packages/cli/package.json | 16 ++++++++-------- packages/js/cli/package.json | 4 ++-- packages/js/logging/package.json | 2 +- packages/js/manifests/polywrap/package.json | 8 ++++---- packages/js/os/package.json | 2 +- packages/js/validation/package.json | 6 +++--- packages/manifests/polywrap/package.json | 2 +- packages/schema/bind/package.json | 8 ++++---- packages/schema/compose/package.json | 8 ++++---- packages/schema/parse/package.json | 4 ++-- packages/templates/app/typescript/package.json | 4 ++-- packages/templates/package.json | 2 +- packages/templates/plugin/python/package.json | 4 ++-- packages/templates/plugin/rust/package.json | 4 ++-- .../templates/plugin/typescript/package.json | 4 ++-- .../templates/wasm/assemblyscript/package.json | 6 +++--- packages/templates/wasm/golang/package.json | 4 ++-- packages/templates/wasm/rust/package.json | 4 ++-- packages/test-cases/package.json | 4 ++-- packages/wasm/as/package.json | 2 +- packages/wasm/rs/Cargo.toml | 2 +- 21 files changed, 50 insertions(+), 50 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 3d002437d3..6c79da5bf6 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,7 +1,7 @@ { "name": "polywrap", "description": "Polywrap CLI", - "version": "0.11.0-pre.3", + "version": "0.11.0-pre.4", "license": "MIT", "repository": { "type": "git", @@ -48,13 +48,13 @@ "@polywrap/client-js": "0.12.0-pre.1", "@polywrap/core-js": "0.12.0-pre.1", "@polywrap/ethereum-provider-js": "0.3.1", - "@polywrap/logging-js": "0.11.0-pre.3", - "@polywrap/os-js": "0.11.0-pre.3", - "@polywrap/polywrap-manifest-types-js": "0.11.0-pre.3", + "@polywrap/logging-js": "0.11.0-pre.4", + "@polywrap/os-js": "0.11.0-pre.4", + "@polywrap/polywrap-manifest-types-js": "0.11.0-pre.4", "@polywrap/result": "0.12.0-pre.1", - "@polywrap/schema-bind": "0.11.0-pre.3", - "@polywrap/schema-compose": "0.11.0-pre.3", - "@polywrap/schema-parse": "0.11.0-pre.3", + "@polywrap/schema-bind": "0.11.0-pre.4", + "@polywrap/schema-compose": "0.11.0-pre.4", + "@polywrap/schema-parse": "0.11.0-pre.4", "@polywrap/sys-config-bundle-js": "0.12.0-pre.1", "@polywrap/uri-resolver-extensions-js": "0.12.0-pre.1", "@polywrap/uri-resolvers-js": "0.12.0-pre.1", @@ -83,7 +83,7 @@ "yesno": "0.4.0" }, "devDependencies": { - "@polywrap/cli-js": "0.11.0-pre.3", + "@polywrap/cli-js": "0.11.0-pre.4", "@types/copyfiles": "2.4.0", "@types/fs-extra": "9.0.12", "@types/jest": "26.0.8", diff --git a/packages/js/cli/package.json b/packages/js/cli/package.json index 0a1e922e58..f2457ab079 100644 --- a/packages/js/cli/package.json +++ b/packages/js/cli/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/cli-js", "description": "Programmatically execute the Polywrap CLI", - "version": "0.11.0-pre.3", + "version": "0.11.0-pre.4", "license": "MIT", "repository": { "type": "git", @@ -17,7 +17,7 @@ "test": "jest --passWithNoTests --runInBand --detectOpenHandles --verbose" }, "dependencies": { - "polywrap": "0.11.0-pre.3", + "polywrap": "0.11.0-pre.4", "spawn-command": "0.0.2-1" }, "devDependencies": { diff --git a/packages/js/logging/package.json b/packages/js/logging/package.json index 41633904e5..a8cc296c26 100644 --- a/packages/js/logging/package.json +++ b/packages/js/logging/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/logging-js", "description": "Polywrap Core Logging Interface", - "version": "0.11.0-pre.3", + "version": "0.11.0-pre.4", "license": "MIT", "repository": { "type": "git", diff --git a/packages/js/manifests/polywrap/package.json b/packages/js/manifests/polywrap/package.json index 4ae0ec1cf0..ecd21410b6 100644 --- a/packages/js/manifests/polywrap/package.json +++ b/packages/js/manifests/polywrap/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/polywrap-manifest-types-js", "description": "Polywrap Manifest TypeScript Typings", - "version": "0.11.0-pre.3", + "version": "0.11.0-pre.4", "license": "MIT", "repository": { "type": "git", @@ -15,14 +15,14 @@ "test:watch": "yarn test -- --watch" }, "dependencies": { - "@polywrap/logging-js": "0.11.0-pre.3", - "@polywrap/polywrap-manifest-schemas": "0.11.0-pre.3", + "@polywrap/logging-js": "0.11.0-pre.4", + "@polywrap/polywrap-manifest-schemas": "0.11.0-pre.4", "jsonschema": "1.4.0", "semver": "7.5.3", "yaml": "2.2.2" }, "devDependencies": { - "@polywrap/os-js": "0.11.0-pre.3", + "@polywrap/os-js": "0.11.0-pre.4", "@types/jest": "26.0.8", "@types/mustache": "4.0.1", "@types/prettier": "2.6.0", diff --git a/packages/js/os/package.json b/packages/js/os/package.json index 84a75658bb..dc5b68dca7 100644 --- a/packages/js/os/package.json +++ b/packages/js/os/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/os-js", "description": "Polywrap Javascript OS Utilities", - "version": "0.11.0-pre.3", + "version": "0.11.0-pre.4", "license": "MIT", "repository": { "type": "git", diff --git a/packages/js/validation/package.json b/packages/js/validation/package.json index 35d7509869..14f3b4182b 100644 --- a/packages/js/validation/package.json +++ b/packages/js/validation/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/package-validation", "description": "Polywrap Package Validator", - "version": "0.11.0-pre.3", + "version": "0.11.0-pre.4", "license": "MIT", "repository": { "type": "git", @@ -18,12 +18,12 @@ "test:watch": "yarn test -- --watch" }, "dependencies": { - "@polywrap/schema-compose": "0.11.0-pre.3", + "@polywrap/schema-compose": "0.11.0-pre.4", "@polywrap/wrap-manifest-types-js": "0.12.0-pre.1" }, "devDependencies": { "@polywrap/msgpack-js": "0.10.0", - "@polywrap/os-js": "0.11.0-pre.3", + "@polywrap/os-js": "0.11.0-pre.4", "@types/jest": "26.0.8", "jest": "26.6.3", "rimraf": "3.0.2", diff --git a/packages/manifests/polywrap/package.json b/packages/manifests/polywrap/package.json index b440068e9f..c6f58b5b40 100644 --- a/packages/manifests/polywrap/package.json +++ b/packages/manifests/polywrap/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/polywrap-manifest-schemas", "description": "Polywrap Manifest Schemas", - "version": "0.11.0-pre.3", + "version": "0.11.0-pre.4", "license": "MIT", "repository": { "type": "git", diff --git a/packages/schema/bind/package.json b/packages/schema/bind/package.json index cfe88baedb..4ca365879b 100644 --- a/packages/schema/bind/package.json +++ b/packages/schema/bind/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/schema-bind", "description": "Polywrap Schema Binding", - "version": "0.11.0-pre.3", + "version": "0.11.0-pre.4", "license": "MIT", "repository": { "type": "git", @@ -20,13 +20,13 @@ }, "dependencies": { "@polywrap/client-js": "0.12.0-pre.1", - "@polywrap/os-js": "0.11.0-pre.3", - "@polywrap/schema-parse": "0.11.0-pre.3", + "@polywrap/os-js": "0.11.0-pre.4", + "@polywrap/schema-parse": "0.11.0-pre.4", "@polywrap/wrap-manifest-types-js": "0.12.0-pre.1", "mustache": "4.0.1" }, "devDependencies": { - "@polywrap/test-cases": "0.11.0-pre.3", + "@polywrap/test-cases": "0.11.0-pre.4", "@types/jest": "26.0.8", "@types/lodash": "4.14.178", "@types/mustache": "4.0.1", diff --git a/packages/schema/compose/package.json b/packages/schema/compose/package.json index 4af04778ec..d2bccfcb0d 100644 --- a/packages/schema/compose/package.json +++ b/packages/schema/compose/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/schema-compose", "description": "Polywrap Schema Composition", - "version": "0.11.0-pre.3", + "version": "0.11.0-pre.4", "license": "MIT", "repository": { "type": "git", @@ -18,14 +18,14 @@ "test:watch": "yarn test -- --watch" }, "dependencies": { - "@polywrap/schema-parse": "0.11.0-pre.3", + "@polywrap/schema-parse": "0.11.0-pre.4", "@polywrap/wrap-manifest-types-js": "0.12.0-pre.1", "graphql": "15.5.0", "mustache": "4.0.1" }, "devDependencies": { - "@polywrap/os-js": "0.11.0-pre.3", - "@polywrap/test-cases": "0.11.0-pre.3", + "@polywrap/os-js": "0.11.0-pre.4", + "@polywrap/test-cases": "0.11.0-pre.4", "@types/jest": "26.0.8", "@types/mustache": "4.0.1", "@types/prettier": "2.6.0", diff --git a/packages/schema/parse/package.json b/packages/schema/parse/package.json index e34b004f10..3f2480a104 100644 --- a/packages/schema/parse/package.json +++ b/packages/schema/parse/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/schema-parse", "description": "Polywrap Schema Parsing", - "version": "0.11.0-pre.3", + "version": "0.11.0-pre.4", "license": "MIT", "repository": { "type": "git", @@ -23,7 +23,7 @@ "graphql": "15.5.0" }, "devDependencies": { - "@polywrap/test-cases": "0.11.0-pre.3", + "@polywrap/test-cases": "0.11.0-pre.4", "@types/deep-equal": "1.0.1", "@types/jest": "26.0.8", "@types/prettier": "2.6.0", diff --git a/packages/templates/app/typescript/package.json b/packages/templates/app/typescript/package.json index 478f4feb1d..2ff7666a05 100644 --- a/packages/templates/app/typescript/package.json +++ b/packages/templates/app/typescript/package.json @@ -2,7 +2,7 @@ "name": "templates-app-typescript", "description": "Polywrap App TypeScript Template", "private": true, - "version": "0.11.0-pre.3", + "version": "0.11.0-pre.4", "scripts": { "build": "npx polywrap codegen", "test": "ts-node ./src/index.ts" @@ -12,7 +12,7 @@ }, "devDependencies": { "@types/node": "18.15.0", - "polywrap": "0.11.0-pre.3", + "polywrap": "0.11.0-pre.4", "ts-node": "10.9.1", "typescript": "4.9.5" } diff --git a/packages/templates/package.json b/packages/templates/package.json index 9afef11c93..6efbfad803 100644 --- a/packages/templates/package.json +++ b/packages/templates/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/templates", "description": "Polywrap Templates", - "version": "0.11.0-pre.3", + "version": "0.11.0-pre.4", "license": "MIT", "repository": { "type": "git", diff --git a/packages/templates/plugin/python/package.json b/packages/templates/plugin/python/package.json index afe3318b22..5fed5a933f 100644 --- a/packages/templates/plugin/python/package.json +++ b/packages/templates/plugin/python/package.json @@ -1,8 +1,8 @@ { "name": "templates-plugin-python", "private": true, - "version": "0.11.0-pre.3", + "version": "0.11.0-pre.4", "dependencies": { - "polywrap": "0.11.0-pre.3" + "polywrap": "0.11.0-pre.4" } } diff --git a/packages/templates/plugin/rust/package.json b/packages/templates/plugin/rust/package.json index f1679da7a5..8c1c23108b 100644 --- a/packages/templates/plugin/rust/package.json +++ b/packages/templates/plugin/rust/package.json @@ -1,8 +1,8 @@ { "name": "templates-plugin-rust", "private": true, - "version": "0.11.0-pre.3", + "version": "0.11.0-pre.4", "dependencies": { - "polywrap": "0.11.0-pre.3" + "polywrap": "0.11.0-pre.4" } } diff --git a/packages/templates/plugin/typescript/package.json b/packages/templates/plugin/typescript/package.json index 2be15df965..a85e27eea3 100644 --- a/packages/templates/plugin/typescript/package.json +++ b/packages/templates/plugin/typescript/package.json @@ -2,7 +2,7 @@ "name": "templates-plugin-typescript", "description": "Polywrap Plugin Typescript Template", "private": true, - "version": "0.11.0-pre.3", + "version": "0.11.0-pre.4", "main": "build/index.js", "scripts": { "build": "rimraf ./build && yarn codegen && tsc --project tsconfig.json", @@ -23,7 +23,7 @@ "@types/jest": "26.0.8", "@types/prettier": "2.6.0", "jest": "26.6.3", - "polywrap": "0.11.0-pre.3", + "polywrap": "0.11.0-pre.4", "rimraf": "3.0.2", "ts-jest": "26.5.4", "ts-node": "10.9.1", diff --git a/packages/templates/wasm/assemblyscript/package.json b/packages/templates/wasm/assemblyscript/package.json index 448f865d14..5f9310b855 100644 --- a/packages/templates/wasm/assemblyscript/package.json +++ b/packages/templates/wasm/assemblyscript/package.json @@ -2,7 +2,7 @@ "name": "template-wasm-as", "description": "Polywrap AssemblyScript Wrapper Template", "private": true, - "version": "0.11.0-pre.3", + "version": "0.11.0-pre.4", "scripts": { "codegen": "npx polywrap codegen", "build": "npx polywrap build", @@ -17,12 +17,12 @@ "devDependencies": { "@types/jest": "26.0.8", "jest": "26.6.3", - "polywrap": "0.11.0-pre.3", + "polywrap": "0.11.0-pre.4", "ts-jest": "26.5.4", "typescript": "4.9.5" }, "dependencies": { - "@polywrap/wasm-as": "0.11.0-pre.3", + "@polywrap/wasm-as": "0.11.0-pre.4", "assemblyscript": "0.19.23" } } diff --git a/packages/templates/wasm/golang/package.json b/packages/templates/wasm/golang/package.json index 31fb0a2797..9d6d0cc44f 100644 --- a/packages/templates/wasm/golang/package.json +++ b/packages/templates/wasm/golang/package.json @@ -2,7 +2,7 @@ "name": "template-wasm-go", "description": "Polywrap Golang Wrapper Template", "private": true, - "version": "0.11.0-pre.3", + "version": "0.11.0-pre.4", "scripts": { "codegen": "npx polywrap codegen", "build": "npx polywrap build", @@ -15,7 +15,7 @@ "devDependencies": { "@types/jest": "26.0.8", "jest": "26.6.3", - "polywrap": "0.11.0-pre.3", + "polywrap": "0.11.0-pre.4", "ts-jest": "26.5.4", "typescript": "4.9.5" } diff --git a/packages/templates/wasm/rust/package.json b/packages/templates/wasm/rust/package.json index 4fcc74c393..cf073b47d0 100644 --- a/packages/templates/wasm/rust/package.json +++ b/packages/templates/wasm/rust/package.json @@ -2,7 +2,7 @@ "name": "template-wasm-rs", "description": "Polywrap Rust Wrapper Template", "private": true, - "version": "0.11.0-pre.3", + "version": "0.11.0-pre.4", "scripts": { "codegen": "npx polywrap codegen", "build": "npx polywrap build", @@ -15,7 +15,7 @@ "devDependencies": { "@types/jest": "26.0.8", "jest": "26.6.3", - "polywrap": "0.11.0-pre.3", + "polywrap": "0.11.0-pre.4", "ts-jest": "26.5.4", "typescript": "4.9.5" } diff --git a/packages/test-cases/package.json b/packages/test-cases/package.json index abc1cc9d48..60910699bb 100644 --- a/packages/test-cases/package.json +++ b/packages/test-cases/package.json @@ -2,14 +2,14 @@ "name": "@polywrap/test-cases", "description": "Reusable Polywrap Test Cases", "private": true, - "version": "0.11.0-pre.3", + "version": "0.11.0-pre.4", "license": "MIT", "main": "index.ts", "scripts": { "generate:wrappers": "ts-node -e \"import { fetchWrappers } from './'; (async () => await fetchWrappers())()\"" }, "dependencies": { - "@polywrap/os-js": "0.11.0-pre.3" + "@polywrap/os-js": "0.11.0-pre.4" }, "devDependencies": { "@types/adm-zip": "0.5.0", diff --git a/packages/wasm/as/package.json b/packages/wasm/as/package.json index e440667217..f6e8d828d8 100644 --- a/packages/wasm/as/package.json +++ b/packages/wasm/as/package.json @@ -1,7 +1,7 @@ { "name": "@polywrap/wasm-as", "description": "Polywrap Assemblyscript Runtime", - "version": "0.11.0-pre.3", + "version": "0.11.0-pre.4", "license": "MIT", "repository": { "type": "git", diff --git a/packages/wasm/rs/Cargo.toml b/packages/wasm/rs/Cargo.toml index 159077bca4..eae5b9bee7 100644 --- a/packages/wasm/rs/Cargo.toml +++ b/packages/wasm/rs/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polywrap-wasm-rs" -version = "0.11.0-pre.3" +version = "0.11.0-pre.4" license = "MIT" description = "Polywrap's Rust-Wasm Runtime" homepage = "https://polywrap.io" From 78a8e0418fc1a0af13f00bcc4fcfe34363f91ff7 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Wed, 19 Jul 2023 00:31:02 +0200 Subject: [PATCH 162/181] chore: fix rust builds --- packages/templates/wasm/rust/Cargo.toml | 3 +- .../build-cmd/wasm/rust/001-sanity/Cargo.toml | 1 + yarn.lock | 74 +++++++++++++------ 3 files changed, 55 insertions(+), 23 deletions(-) diff --git a/packages/templates/wasm/rust/Cargo.toml b/packages/templates/wasm/rust/Cargo.toml index a9c46a250c..fa09362006 100644 --- a/packages/templates/wasm/rust/Cargo.toml +++ b/packages/templates/wasm/rust/Cargo.toml @@ -8,7 +8,8 @@ license = "MIT" edition = "2021" [dependencies] -polywrap-wasm-rs = { version = "0.11.0-pre.0" } +polywrap-wasm-rs = { version = "0.11.0-pre.4" } +polywrap_msgpack_serde = "0.0.2-beta.4" serde = { version = "1.0", features = ["derive"] } [lib] diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/rust/001-sanity/Cargo.toml b/packages/test-cases/cases/cli/build-cmd/wasm/rust/001-sanity/Cargo.toml index 0604b9b1a7..1187466f98 100644 --- a/packages/test-cases/cases/cli/build-cmd/wasm/rust/001-sanity/Cargo.toml +++ b/packages/test-cases/cases/cli/build-cmd/wasm/rust/001-sanity/Cargo.toml @@ -12,6 +12,7 @@ edition = "2021" [dependencies] polywrap-wasm-rs = { path = "../../../../../../../wasm/rs" } +polywrap_msgpack_serde = "0.0.2-beta.4" serde = { version = "1.0", features = ["derive"] } [lib] diff --git a/yarn.lock b/yarn.lock index 2415cf732f..6ab94ecb8c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3232,6 +3232,18 @@ array.prototype.reduce@^1.0.5: es-array-method-boxes-properly "^1.0.0" is-string "^1.0.7" +arraybuffer.prototype.slice@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz#9b5ea3868a6eebc30273da577eb888381c0044bb" + integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" + arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -3661,9 +3673,9 @@ camelcase@^6.0.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001503: - version "1.0.30001515" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001515.tgz#418aefeed9d024cd3129bfae0ccc782d4cb8f12b" - integrity sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA== + version "1.0.30001516" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001516.tgz#621b1be7d85a8843ee7d210fd9d87b52e3daab3a" + integrity sha512-Wmec9pCBY8CWbmI4HsjBeQLqDTqV91nFVR83DnZpYyRnPI1wePDsTg0bGLPC5VU/3OIZV1fmxEea1b+tFKe86g== capture-exit@^2.0.0: version "2.0.0" @@ -4438,9 +4450,9 @@ ecc-jsbn@~0.1.1: safer-buffer "^2.1.0" electron-to-chromium@^1.4.431: - version "1.4.460" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.460.tgz#f360a5059c039c4a5fb4dfa99680ad8129dd9f84" - integrity sha512-kKiHnbrHME7z8E6AYaw0ehyxY5+hdaRmeUbjBO22LZMdqTYCO29EvF0T1cQ3pJ1RN5fyMcHl1Lmcsdt9WWJpJQ== + version "1.4.464" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.464.tgz#2f94bad78dff34e527aacbfc5d0b1a33cf046507" + integrity sha512-guZ84yoou4+ILNdj0XEbmGs6DEWj6zpVOWYpY09GU66yEb0DSYvP/biBPzHn0GuW/3RC/pnaYNUWlQE1fJYtgA== elliptic@6.5.4: version "6.5.4" @@ -4514,11 +4526,12 @@ error-ex@^1.2.0, error-ex@^1.3.1: is-arrayish "^0.2.1" es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: - version "1.21.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.3.tgz#8aaa0ffc080e8a6fef6ace72631dc1ec5d47bf94" - integrity sha512-ZU4miiY1j3sGPFLJ34VJXEqhpmL+HGByCinGHv4HC+Fxl2fI2Z4yR6tl0mORnDr6PA8eihWo4LmSWDbvhALckg== + version "1.22.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" + integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== dependencies: array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.1" available-typed-arrays "^1.0.5" call-bind "^1.0.2" es-set-tostringtag "^2.0.1" @@ -4545,10 +4558,13 @@ es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: object-keys "^1.1.1" object.assign "^4.1.4" regexp.prototype.flags "^1.5.0" + safe-array-concat "^1.0.0" safe-regex-test "^1.0.0" string.prototype.trim "^1.2.7" string.prototype.trimend "^1.0.6" string.prototype.trimstart "^1.0.6" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" typed-array-byte-offset "^1.0.0" typed-array-length "^1.0.4" unbox-primitive "^1.0.2" @@ -6158,15 +6174,11 @@ is-text-path@^1.0.1: text-extensions "^1.0.0" is-typed-array@^1.1.10, is-typed-array@^1.1.9: - version "1.1.10" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" - integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" + which-typed-array "^1.1.11" is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" @@ -9732,6 +9744,25 @@ type@^2.7.2: resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + typed-array-byte-offset@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" @@ -10091,17 +10122,16 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.10: - version "1.1.10" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.10.tgz#74baa2789991905c2076abb317103b866c64e69e" - integrity sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA== +which-typed-array@^1.1.10, which-typed-array@^1.1.11: + version "1.1.11" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" + integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== dependencies: available-typed-arrays "^1.0.5" call-bind "^1.0.2" for-each "^0.3.3" gopd "^1.0.1" has-tostringtag "^1.0.0" - is-typed-array "^1.1.10" which@^1.2.9, which@^1.3.1: version "1.3.1" From 8a714bc09e0c8a3920c64030048ca982310b38ef Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Wed, 19 Jul 2023 00:59:19 +0200 Subject: [PATCH 163/181] chore: add back rust plugin template tests --- packages/templates/plugin/rust/Cargo.toml | 2 +- packages/templates/tests.spec.ts | 4 ++-- packages/templates/wasm/rust/Cargo.toml | 4 ++-- .../cases/cli/build-cmd/wasm/rust/001-sanity/Cargo.toml | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/templates/plugin/rust/Cargo.toml b/packages/templates/plugin/rust/Cargo.toml index 347cd75813..79b0b23af8 100644 --- a/packages/templates/plugin/rust/Cargo.toml +++ b/packages/templates/plugin/rust/Cargo.toml @@ -14,7 +14,7 @@ include = [ polywrap_core = { version = "~0.1.6-beta.1" } polywrap_plugin = { version = "~0.1.6-beta.1" } polywrap_msgpack = { version = "~0.1.6-beta.1" } -polywrap_msgpack_serde = { version = "~0.0.2-beta.1" } +polywrap_msgpack_serde = { version = "~0.0.2-beta.5" } wrap_manifest_schemas = { version = "~0.1.6-beta.1" } serde = {version = "1.0.145", features = ["derive"]} diff --git a/packages/templates/tests.spec.ts b/packages/templates/tests.spec.ts index eb5b8d3937..395fb12314 100644 --- a/packages/templates/tests.spec.ts +++ b/packages/templates/tests.spec.ts @@ -36,8 +36,8 @@ describe("Templates", () => { }, "plugin/rust": { codegen: "npx polywrap codegen", - /*build: "cargo build", - test: "cargo test",*/ + build: "cargo build", + test: "cargo test", }, interface: { build: "npx polywrap build" }, }; diff --git a/packages/templates/wasm/rust/Cargo.toml b/packages/templates/wasm/rust/Cargo.toml index fa09362006..b5e4af31ea 100644 --- a/packages/templates/wasm/rust/Cargo.toml +++ b/packages/templates/wasm/rust/Cargo.toml @@ -8,8 +8,8 @@ license = "MIT" edition = "2021" [dependencies] -polywrap-wasm-rs = { version = "0.11.0-pre.4" } -polywrap_msgpack_serde = "0.0.2-beta.4" +polywrap-wasm-rs = { version = "~0.11.0-pre.4" } +polywrap_msgpack_serde = "~0.0.2-beta.5" serde = { version = "1.0", features = ["derive"] } [lib] diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/rust/001-sanity/Cargo.toml b/packages/test-cases/cases/cli/build-cmd/wasm/rust/001-sanity/Cargo.toml index 1187466f98..0f0fc6300b 100644 --- a/packages/test-cases/cases/cli/build-cmd/wasm/rust/001-sanity/Cargo.toml +++ b/packages/test-cases/cases/cli/build-cmd/wasm/rust/001-sanity/Cargo.toml @@ -12,7 +12,7 @@ edition = "2021" [dependencies] polywrap-wasm-rs = { path = "../../../../../../../wasm/rs" } -polywrap_msgpack_serde = "0.0.2-beta.4" +polywrap_msgpack_serde = "~0.0.2-beta.5" serde = { version = "1.0", features = ["derive"] } [lib] From 90b3f1bd9469753b08b0f2d4e3877e2c25a4c741 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Wed, 19 Jul 2023 01:20:14 +0200 Subject: [PATCH 164/181] chore: remove bind test-case output --- packages/schema/bind/src/__tests__/index.ts | 30 +- .../bind/src/__tests__/test-cases.spec.ts | 40 +- packages/schema/bind/src/types.ts | 23 +- .../cases/bind/sanity/output/app-ts/index.ts | 1 - .../cases/bind/sanity/output/app-ts/types.ts | 224 -- .../bind/sanity/output/plugin-kt/module.kt | 142 - .../bind/sanity/output/plugin-kt/types.kt | 223 -- .../bind/sanity/output/plugin-kt/wrap.info.kt | 17 - .../bind/sanity/output/plugin-py/__init__.py | 6 - .../bind/sanity/output/plugin-py/module.py | 94 - .../bind/sanity/output/plugin-py/types.py | 244 -- .../bind/sanity/output/plugin-py/wrap_info.py | 2441 ----------------- .../cases/bind/sanity/output/plugin-rs/mod.rs | 7 - .../bind/sanity/output/plugin-rs/module.rs | 69 - .../bind/sanity/output/plugin-rs/types.rs | 289 -- .../bind/sanity/output/plugin-rs/wrap.info.rs | 2436 ---------------- .../bind/sanity/output/plugin-ts/index.ts | 8 - .../bind/sanity/output/plugin-ts/module.ts | 67 - .../bind/sanity/output/plugin-ts/types.ts | 257 -- .../bind/sanity/output/plugin-ts/wrap.info.ts | 2433 ---------------- .../output/wrap-as/AnotherType/index.ts | 37 - .../wrap-as/AnotherType/serialization.ts | 93 - .../sanity/output/wrap-as/CustomEnum/index.ts | 34 - .../output/wrap-as/CustomMapValue/index.ts | 35 - .../wrap-as/CustomMapValue/serialization.ts | 68 - .../sanity/output/wrap-as/CustomType/index.ts | 76 - .../wrap-as/CustomType/serialization.ts | 845 ------ .../bind/sanity/output/wrap-as/Env/index.ts | 37 - .../output/wrap-as/Env/serialization.ts | 98 - .../sanity/output/wrap-as/Module/index.ts | 14 - .../sanity/output/wrap-as/Module/module.ts | 28 - .../output/wrap-as/Module/serialization.ts | 770 ------ .../sanity/output/wrap-as/Module/wrapped.ts | 86 - .../sanity/output/wrap-as/TestImport/index.ts | 11 - .../bind/sanity/output/wrap-as/else/index.ts | 35 - .../output/wrap-as/else/serialization.ts | 68 - .../cases/bind/sanity/output/wrap-as/entry.ts | 59 - .../TestImport_AnotherObject/index.ts | 38 - .../TestImport_AnotherObject/serialization.ts | 68 - .../wrap-as/imported/TestImport_Enum/index.ts | 34 - .../imported/TestImport_Enum_Return/index.ts | 34 - .../wrap-as/imported/TestImport_Env/index.ts | 46 - .../imported/TestImport_Env/serialization.ts | 238 -- .../imported/TestImport_Module/index.ts | 98 - .../TestImport_Module/serialization.ts | 559 ---- .../imported/TestImport_Object/index.ts | 45 - .../TestImport_Object/serialization.ts | 238 -- .../sanity/output/wrap-as/imported/index.ts | 6 - .../cases/bind/sanity/output/wrap-as/index.ts | 47 - .../bind/sanity/output/wrap-as/while/index.ts | 34 - .../bind/sanity/output/wrap-rs/_else/mod.rs | 25 - .../bind/sanity/output/wrap-rs/_while/mod.rs | 53 - .../sanity/output/wrap-rs/another_type/mod.rs | 30 - .../sanity/output/wrap-rs/custom_enum/mod.rs | 53 - .../output/wrap-rs/custom_map_value/mod.rs | 24 - .../sanity/output/wrap-rs/custom_type/mod.rs | 135 - .../cases/bind/sanity/output/wrap-rs/entry.rs | 41 - .../bind/sanity/output/wrap-rs/env/mod.rs | 30 - .../sanity/output/wrap-rs/imported/mod.rs | 12 - .../test_import_another_object/mod.rs | 26 - .../wrap-rs/imported/test_import_enum/mod.rs | 53 - .../imported/test_import_enum_return/mod.rs | 53 - .../wrap-rs/imported/test_import_env/mod.rs | 42 - .../imported/test_import_module/mod.rs | 99 - .../imported/test_import_object/mod.rs | 48 - .../cases/bind/sanity/output/wrap-rs/mod.rs | 64 - .../bind/sanity/output/wrap-rs/module/mod.rs | 14 - .../sanity/output/wrap-rs/module/module.rs | 32 - .../sanity/output/wrap-rs/module/wrapped.rs | 183 -- .../sanity/output/wrap-rs/test_import/mod.rs | 11 - 70 files changed, 48 insertions(+), 13910 deletions(-) delete mode 100644 packages/test-cases/cases/bind/sanity/output/app-ts/index.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/app-ts/types.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/plugin-kt/module.kt delete mode 100644 packages/test-cases/cases/bind/sanity/output/plugin-kt/types.kt delete mode 100644 packages/test-cases/cases/bind/sanity/output/plugin-kt/wrap.info.kt delete mode 100644 packages/test-cases/cases/bind/sanity/output/plugin-py/__init__.py delete mode 100644 packages/test-cases/cases/bind/sanity/output/plugin-py/module.py delete mode 100644 packages/test-cases/cases/bind/sanity/output/plugin-py/types.py delete mode 100644 packages/test-cases/cases/bind/sanity/output/plugin-py/wrap_info.py delete mode 100644 packages/test-cases/cases/bind/sanity/output/plugin-rs/mod.rs delete mode 100644 packages/test-cases/cases/bind/sanity/output/plugin-rs/module.rs delete mode 100644 packages/test-cases/cases/bind/sanity/output/plugin-rs/types.rs delete mode 100644 packages/test-cases/cases/bind/sanity/output/plugin-rs/wrap.info.rs delete mode 100644 packages/test-cases/cases/bind/sanity/output/plugin-ts/index.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/plugin-ts/module.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/plugin-ts/types.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/plugin-ts/wrap.info.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-as/AnotherType/index.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-as/AnotherType/serialization.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-as/CustomEnum/index.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-as/CustomMapValue/index.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-as/CustomMapValue/serialization.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-as/CustomType/index.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-as/CustomType/serialization.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-as/Env/index.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-as/Env/serialization.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-as/Module/index.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-as/Module/module.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-as/Module/serialization.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-as/Module/wrapped.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-as/TestImport/index.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-as/else/index.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-as/else/serialization.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-as/entry.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_AnotherObject/index.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_AnotherObject/serialization.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Enum/index.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Enum_Return/index.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Env/index.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Env/serialization.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Module/index.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Module/serialization.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Object/index.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Object/serialization.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-as/imported/index.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-as/index.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-as/while/index.ts delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-rs/_else/mod.rs delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-rs/_while/mod.rs delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-rs/another_type/mod.rs delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_enum/mod.rs delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_map_value/mod.rs delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_type/mod.rs delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-rs/entry.rs delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-rs/env/mod.rs delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/mod.rs delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_another_object/mod.rs delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_enum/mod.rs delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_enum_return/mod.rs delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_env/mod.rs delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_module/mod.rs delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_object/mod.rs delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-rs/mod.rs delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-rs/module/mod.rs delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-rs/module/module.rs delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-rs/module/wrapped.rs delete mode 100644 packages/test-cases/cases/bind/sanity/output/wrap-rs/test_import/mod.rs diff --git a/packages/schema/bind/src/__tests__/index.ts b/packages/schema/bind/src/__tests__/index.ts index 43e2574058..1b2dd4bcd3 100644 --- a/packages/schema/bind/src/__tests__/index.ts +++ b/packages/schema/bind/src/__tests__/index.ts @@ -1,4 +1,4 @@ -import { BindOptions, BindLanguage } from "../"; +import { BindOptions, BindLanguage, bindLanguage } from "../"; import fs from "fs"; import path from "path"; @@ -14,7 +14,7 @@ export type TestCase = { input: BindOptions; outputLanguages: { language: string; - directory: string; + directory?: string; }[]; }; @@ -25,6 +25,7 @@ export type TestCases = { export function fetchTestCases(): TestCases { const cases: TestCases = []; + const bindLanguages = Object.keys(bindLanguage); const fetchIfExists = (file: string): string | undefined => { if (fs.existsSync(file)) { @@ -61,15 +62,22 @@ export function fetchTestCases(): TestCases { // Fetch each language's expected output const outputDir = path.join(root, dirent.name, "output"); - const outputLanguages = fs - .readdirSync(outputDir, { withFileTypes: true }) - .filter((item: fs.Dirent) => item.isDirectory()) - .map((item: fs.Dirent) => { - return { - language: item.name, - directory: path.join(outputDir, item.name) - }; - }); + const outputLanguages: { + language: string; + directory?: string; + }[] = []; + + for (const language of bindLanguages) { + const outputLanguageDir = path.join(outputDir, language); + if (fs.existsSync(outputLanguageDir)) { + outputLanguages.push({ + language, + directory: outputLanguageDir + }); + } else { + outputLanguages.push({ language }); + } + } // Parse the input schema into the Abi structure const abi = parseSchema(schema); diff --git a/packages/schema/bind/src/__tests__/test-cases.spec.ts b/packages/schema/bind/src/__tests__/test-cases.spec.ts index 0e4a9188e1..08768073a6 100644 --- a/packages/schema/bind/src/__tests__/test-cases.spec.ts +++ b/packages/schema/bind/src/__tests__/test-cases.spec.ts @@ -37,12 +37,6 @@ describe("Polywrap Binding Test Suite", () => { // Verify it binds correctly const { language, directory } = outputLanguage; - // Read the expected output directories - let expectedOutput: BindOutput = { - output: readDirectorySync(directory), - outputDirAbs: testCase.input.outputDirAbs, - }; - const bindOptions: BindOptions = { ...deepCopy(testCase.input), wrapInfo: { @@ -61,6 +55,12 @@ describe("Polywrap Binding Test Suite", () => { const output = await bindSchema(bindOptions); + // Read the expected output directories + let expectedOutput: BindOutput | undefined = !directory ? undefined : { + output: readDirectorySync(directory), + outputDirAbs: testCase.input.outputDirAbs, + }; + const sort = (array: OutputEntry[]): OutputEntry[] => { array.forEach((entry) => { if (typeof entry.data !== "string") entry.data = sort(entry.data); @@ -70,7 +70,10 @@ describe("Polywrap Binding Test Suite", () => { }; output.output.entries = sort(output.output.entries); - expectedOutput.output.entries = sort(expectedOutput.output.entries); + + if (expectedOutput) { + expectedOutput.output.entries = sort(expectedOutput.output.entries); + } const testResultDir = path.join(__dirname, "/test-results/", language); @@ -78,24 +81,8 @@ describe("Polywrap Binding Test Suite", () => { fs.mkdirSync(testResultDir, { recursive: true }); } - writeFileSync( - path.join( - testResultDir, - `${language}-output.json` - ), - JSON.stringify(output, null, 2), - ); - writeFileSync( - path.join( - testResultDir, - `${language}-expected.json` - ), - JSON.stringify(expectedOutput, null, 2), - ); - const paths: string[] = []; - const outputDirectoryEntry = (root: string, entry: OutputEntry) => { const entryPath = path.join(root, entry.name); paths.push(entryPath); @@ -128,8 +115,11 @@ describe("Polywrap Binding Test Suite", () => { outputDirectoryEntry(testResultDir, entry); } - - expect(output).toMatchObject(expectedOutput); + if (expectedOutput) { + expect(output).toMatchObject(expectedOutput); + } else { + expect(output.output.entries.length).toBeGreaterThan(0); + } } }); } diff --git a/packages/schema/bind/src/types.ts b/packages/schema/bind/src/types.ts index cb92c63d1f..93a0402f0d 100644 --- a/packages/schema/bind/src/types.ts +++ b/packages/schema/bind/src/types.ts @@ -1,15 +1,20 @@ import { OutputDirectory } from "@polywrap/os-js"; import { WrapManifest } from "@polywrap/wrap-manifest-types-js"; -export type BindLanguage = - | "wrap-as" - | "wrap-rs" - | "wrap-go" - | "plugin-ts" - | "plugin-rs" - | "plugin-py" - | "plugin-kt" - | "app-ts"; +export const bindLanguage = { + "wrap-as": "wrap-as", + "wrap-rs": "wrap-rs", + "wrap-go": "wrap-go", + "plugin-ts": "plugin-ts", + "plugin-rs": "plugin-rs", + "plugin-py": "plugin-py", + "plugin-kt": "plugin-kt", + "app-ts": "app-ts", +}; + +export type BindLanguages = typeof bindLanguage; + +export type BindLanguage = keyof BindLanguages; export interface BindOutput { output: OutputDirectory; diff --git a/packages/test-cases/cases/bind/sanity/output/app-ts/index.ts b/packages/test-cases/cases/bind/sanity/output/app-ts/index.ts deleted file mode 100644 index eea524d655..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/app-ts/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./types"; diff --git a/packages/test-cases/cases/bind/sanity/output/app-ts/types.ts b/packages/test-cases/cases/bind/sanity/output/app-ts/types.ts deleted file mode 100644 index 63cbd9c017..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/app-ts/types.ts +++ /dev/null @@ -1,224 +0,0 @@ -// @ts-ignore -import * as Types from "./"; - -// @ts-ignore -import { - CoreClient, - InvokeResult, - Uri, -} from "@polywrap/core-js"; - -export type UInt = number; -export type UInt8 = number; -export type UInt16 = number; -export type UInt32 = number; -export type Int = number; -export type Int8 = number; -export type Int16 = number; -export type Int32 = number; -export type Bytes = Uint8Array; -export type BigInt = string; -export type BigNumber = string; -export type Json = string; -export type String = string; -export type Boolean = boolean; - -export interface CustomType { - str: Types.String; - optStr?: Types.String | null; - u: Types.UInt; - optU?: Types.UInt | null; - u8: Types.UInt8; - u16: Types.UInt16; - u32: Types.UInt32; - i: Types.Int; - i8: Types.Int8; - i16: Types.Int16; - i32: Types.Int32; - bigint: Types.BigInt; - optBigint?: Types.BigInt | null; - bignumber: Types.BigNumber; - optBignumber?: Types.BigNumber | null; - json: Types.Json; - optJson?: Types.Json | null; - bytes: Types.Bytes; - optBytes?: Types.Bytes | null; - boolean: Types.Boolean; - optBoolean?: Types.Boolean | null; - u_array: Array; - uOpt_array?: Array | null; - _opt_uOptArray?: Array | null; - optStrOptArray?: Array | null; - uArrayArray: Array>; - uOptArrayOptArray: Array | null>; - uArrayOptArrayArray: Array> | null>; - crazyArray?: Array | null>> | null> | null; - object: Types.AnotherType; - optObject?: Types.AnotherType | null; - objectArray: Array; - optObjectArray?: Array | null; - en: Types.CustomEnum; - optEnum?: Types.CustomEnum | null; - enumArray: Array; - optEnumArray?: Array | null; - map: Map; - mapOfArr: Map>; - mapOfObj: Map; - mapOfArrOfObj: Map>; - mapCustomValue: Map; -} - -export interface AnotherType { - prop?: Types.String | null; - circular?: Types.CustomType | null; - const?: Types.String | null; -} - -export interface CustomMapValue { - foo: Types.String; -} - -export interface _else { - else: Types.String; -} - -export enum CustomEnumEnum { - STRING, - BYTES, -} - -export type CustomEnumString = - | "STRING" - | "BYTES" - -export type CustomEnum = CustomEnumEnum | CustomEnumString; - -export enum whileEnum { - for, - in, -} - -export type whileString = - | "for" - | "in" - -export type _while = whileEnum | whileString; - -/// Imported Objects START /// - -/* URI: "testimport.uri.eth" */ -export interface TestImport_Object { - object: Types.TestImport_AnotherObject; - optObject?: Types.TestImport_AnotherObject | null; - objectArray: Array; - optObjectArray?: Array | null; - en: Types.TestImport_Enum; - optEnum?: Types.TestImport_Enum | null; - enumArray: Array; - optEnumArray?: Array | null; -} - -/* URI: "testimport.uri.eth" */ -export interface TestImport_AnotherObject { - prop: Types.String; -} - -/// Imported Objects END /// - -/// Imported Enums START /// - -/* URI: "testimport.uri.eth" */ -export enum TestImport_EnumEnum { - STRING, - BYTES, -} - -export type TestImport_EnumString = - | "STRING" - | "BYTES" - -export type TestImport_Enum = TestImport_EnumEnum | TestImport_EnumString; - -/* URI: "testimport.uri.eth" */ -export enum TestImport_Enum_ReturnEnum { - STRING, - BYTES, -} - -export type TestImport_Enum_ReturnString = - | "STRING" - | "BYTES" - -export type TestImport_Enum_Return = TestImport_Enum_ReturnEnum | TestImport_Enum_ReturnString; - -/// Imported Enums END /// - -/// Imported Modules START /// - -/* URI: "testimport.uri.eth" */ -export interface TestImport_Module_Args_importedMethod { - str: Types.String; - optStr?: Types.String | null; - u: Types.UInt; - optU?: Types.UInt | null; - uArrayArray: Array | null>; - object: Types.TestImport_Object; - optObject?: Types.TestImport_Object | null; - objectArray: Array; - optObjectArray?: Array | null; - en: Types.TestImport_Enum; - optEnum?: Types.TestImport_Enum | null; - enumArray: Array; - optEnumArray?: Array | null; -} - -/* URI: "testimport.uri.eth" */ -export interface TestImport_Module_Args_anotherMethod { - arg: Array; -} - -/* URI: "testimport.uri.eth" */ -export interface TestImport_Module_Args_returnsArrayOfEnums { - arg: Types.String; -} - -/* URI: "testimport.uri.eth" */ -export const TestImport_Module = { - importedMethod: async ( - args: TestImport_Module_Args_importedMethod, - client: CoreClient, - uri: string = "testimport.uri.eth" - ): Promise> => { - return client.invoke({ - uri: Uri.from(uri), - method: "importedMethod", - args: (args as unknown) as Record, - }); - }, - - anotherMethod: async ( - args: TestImport_Module_Args_anotherMethod, - client: CoreClient, - uri: string = "testimport.uri.eth" - ): Promise> => { - return client.invoke({ - uri: Uri.from(uri), - method: "anotherMethod", - args: (args as unknown) as Record, - }); - }, - - returnsArrayOfEnums: async ( - args: TestImport_Module_Args_returnsArrayOfEnums, - client: CoreClient, - uri: string = "testimport.uri.eth" - ): Promise>> => { - return client.invoke>({ - uri: Uri.from(uri), - method: "returnsArrayOfEnums", - args: (args as unknown) as Record, - }); - } -}; - -/// Imported Modules END /// diff --git a/packages/test-cases/cases/bind/sanity/output/plugin-kt/module.kt b/packages/test-cases/cases/bind/sanity/output/plugin-kt/module.kt deleted file mode 100644 index c230059e30..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/plugin-kt/module.kt +++ /dev/null @@ -1,142 +0,0 @@ -/// NOTE: This is an auto-generated file. -/// All modifications will be overwritten. - -package test.wrap - -import io.polywrap.core.Invoker -import io.polywrap.core.msgpack.msgPackDecode -import io.polywrap.core.msgpack.msgPackEncode -import io.polywrap.core.msgpack.MsgPackMap -import io.polywrap.plugin.PluginMethod -import io.polywrap.plugin.PluginModule -import kotlinx.serialization.Serializable -import kotlinx.serialization.serializer - -@Serializable -data class ArgsModuleMethod( - val str: String, - val optStr: String? = null, - val en: CustomEnum, - val optEnum: CustomEnum? = null, - val enumArray: List, - val optEnumArray: List? = null, - val map: MsgPackMap, - val mapOfArr: MsgPackMap>, - val mapOfMap: MsgPackMap>, - val mapOfObj: MsgPackMap, - val mapOfArrOfObj: MsgPackMap>, -) - -@Serializable -data class ArgsObjectMethod( - val _object: AnotherType, - val optObject: AnotherType? = null, - val objectArray: List, - val optObjectArray: List? = null, -) - -@Serializable -data class ArgsOptionalEnvMethod( - val _object: AnotherType, - val optObject: AnotherType? = null, - val objectArray: List, - val optObjectArray: List? = null, -) - -@Serializable -data class ArgsIf( - val _if: Else, -) - -@Suppress("UNUSED_PARAMETER", "FunctionName") -abstract class Module(config: TConfig) : PluginModule(config) { - - final override val methods: Map = mapOf( - "moduleMethod" to ::__moduleMethod, - "objectMethod" to ::__objectMethod, - "optionalEnvMethod" to ::__optionalEnvMethod, - "if" to ::__if, - ) - - abstract suspend fun moduleMethod( - args: ArgsModuleMethod, - invoker: Invoker - ): Int - - abstract suspend fun objectMethod( - args: ArgsObjectMethod, - env: Env, - invoker: Invoker - ): AnotherType? - - abstract suspend fun optionalEnvMethod( - args: ArgsOptionalEnvMethod, - env: Env? = null, - invoker: Invoker - ): AnotherType? - - abstract suspend fun _if( - args: ArgsIf, - invoker: Invoker - ): Else - - private suspend fun __moduleMethod( - encodedArgs: ByteArray?, - encodedEnv: ByteArray?, - invoker: Invoker - ): ByteArray { - val args: ArgsModuleMethod = encodedArgs?.let { - msgPackDecode(ArgsModuleMethod.serializer(), it).getOrNull() - ?: throw Exception("Failed to decode args in invocation to plugin method 'moduleMethod'") - } ?: throw Exception("Missing args in invocation to plugin method 'moduleMethod'") - val response = moduleMethod(args, invoker) - return msgPackEncode(serializer(), response) - } - - private suspend fun __objectMethod( - encodedArgs: ByteArray?, - encodedEnv: ByteArray?, - invoker: Invoker - ): ByteArray { - val args: ArgsObjectMethod = encodedArgs?.let { - msgPackDecode(ArgsObjectMethod.serializer(), it).getOrNull() - ?: throw Exception("Failed to decode args in invocation to plugin method 'objectMethod'") - } ?: throw Exception("Missing args in invocation to plugin method 'objectMethod'") - val env: Env = encodedEnv?.let { - msgPackDecode(Env.serializer(), it).getOrNull() - ?: throw Exception("Failed to decode env in invocation to plugin method 'objectMethod'") - } ?: throw Exception("Missing env in invocation to plugin method 'objectMethod'") - val response = objectMethod(args, env, invoker) - return msgPackEncode(serializer(), response) - } - - private suspend fun __optionalEnvMethod( - encodedArgs: ByteArray?, - encodedEnv: ByteArray?, - invoker: Invoker - ): ByteArray { - val args: ArgsOptionalEnvMethod = encodedArgs?.let { - msgPackDecode(ArgsOptionalEnvMethod.serializer(), it).getOrNull() - ?: throw Exception("Failed to decode args in invocation to plugin method 'optionalEnvMethod'") - } ?: throw Exception("Missing args in invocation to plugin method 'optionalEnvMethod'") - val env: Env? = encodedEnv?.let { - msgPackDecode(Env.serializer(), it).getOrNull() - ?: throw Exception("Failed to decode env in invocation to plugin method 'optionalEnvMethod'") - } - val response = optionalEnvMethod(args, env, invoker) - return msgPackEncode(serializer(), response) - } - - private suspend fun __if( - encodedArgs: ByteArray?, - encodedEnv: ByteArray?, - invoker: Invoker - ): ByteArray { - val args: ArgsIf = encodedArgs?.let { - msgPackDecode(ArgsIf.serializer(), it).getOrNull() - ?: throw Exception("Failed to decode args in invocation to plugin method 'if'") - } ?: throw Exception("Missing args in invocation to plugin method 'if'") - val response = _if(args, invoker) - return msgPackEncode(serializer(), response) - } -} diff --git a/packages/test-cases/cases/bind/sanity/output/plugin-kt/types.kt b/packages/test-cases/cases/bind/sanity/output/plugin-kt/types.kt deleted file mode 100644 index 639ab3bc55..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/plugin-kt/types.kt +++ /dev/null @@ -1,223 +0,0 @@ -/// NOTE: This is an auto-generated file. -/// All modifications will be overwritten. - -package test.wrap - -import io.polywrap.core.Invoker -import io.polywrap.core.InvokeResult -import io.polywrap.core.resolution.Uri -import io.polywrap.core.msgpack.MsgPackMap -import kotlinx.serialization.Serializable - -typealias BigInt = String -typealias BigNumber = String -typealias Json = String - -/// Env START /// -@Serializable -data class Env( - val prop: String, - val optProp: String? = null, - val optMap: MsgPackMap? = null, -) -/// Env END /// - -/// Objects START /// -@Serializable -data class CustomType( - val str: String, - val optStr: String? = null, - val u: UInt, - val optU: UInt? = null, - val u8: UByte, - val u16: UShort, - val u32: UInt, - val i: Int, - val i8: Byte, - val i16: Short, - val i32: Int, - val bigint: BigInt, - val optBigint: BigInt? = null, - val bignumber: BigNumber, - val optBignumber: BigNumber? = null, - val json: Json, - val optJson: Json? = null, - val bytes: ByteArray, - val optBytes: ByteArray? = null, - val boolean: Boolean, - val optBoolean: Boolean? = null, - val u_array: List, - val uOpt_array: List? = null, - val _opt_uOptArray: List? = null, - val optStrOptArray: List? = null, - val uArrayArray: List>, - val uOptArrayOptArray: List?>, - val uArrayOptArrayArray: List>?>, - val crazyArray: List?>>?>? = null, - val _object: AnotherType, - val optObject: AnotherType? = null, - val objectArray: List, - val optObjectArray: List? = null, - val en: CustomEnum, - val optEnum: CustomEnum? = null, - val enumArray: List, - val optEnumArray: List? = null, - val map: MsgPackMap, - val mapOfArr: MsgPackMap>, - val mapOfObj: MsgPackMap, - val mapOfArrOfObj: MsgPackMap>, - val mapCustomValue: MsgPackMap, -) - -@Serializable -data class AnotherType( - val prop: String? = null, - val circular: CustomType? = null, - val const: String? = null, -) - -@Serializable -data class CustomMapValue( - val foo: String, -) - -@Serializable -data class Else( - val _else: String, -) - -/// Objects END /// - -/// Enums START /// -@Serializable -enum class CustomEnum { - STRING, - BYTES -} - -@Serializable -enum class While { - _for, - _in -} - -/// Enums END /// - -/// Imported Objects START /// -/* URI: "testimport.uri.eth" */ -@Serializable -data class TestImportObject( - val _object: TestImportAnotherObject, - val optObject: TestImportAnotherObject? = null, - val objectArray: List, - val optObjectArray: List? = null, - val en: TestImportEnum, - val optEnum: TestImportEnum? = null, - val enumArray: List, - val optEnumArray: List? = null, -) - -/* URI: "testimport.uri.eth" */ -@Serializable -data class TestImportAnotherObject( - val prop: String, -) - -/* URI: "testimport.uri.eth" */ -@Serializable -enum class TestImportEnum { - STRING, - BYTES -} - -/* URI: "testimport.uri.eth" */ -@Serializable -enum class TestImportEnumReturn { - STRING, - BYTES -} - -/// Imported Objects END /// - -/// Imported Modules START /// -/* URI: "testimport.uri.eth" */ -@Serializable -data class TestImportModuleArgsImportedMethod( - val str: String, - val optStr: String? = null, - val u: UInt, - val optU: UInt? = null, - val uArrayArray: List?>, - val _object: TestImportObject, - val optObject: TestImportObject? = null, - val objectArray: List, - val optObjectArray: List? = null, - val en: TestImportEnum, - val optEnum: TestImportEnum? = null, - val enumArray: List, - val optEnumArray: List? = null, -) - -/* URI: "testimport.uri.eth" */ -@Serializable -data class TestImportModuleArgsAnotherMethod( - val arg: List, -) - -/* URI: "testimport.uri.eth" */ -@Serializable -data class TestImportModuleArgsReturnsArrayOfEnums( - val arg: String, -) - -/* URI: "testimport.uri.eth" */ -class TestImportModule(uri: String) { - companion object { - val interfaceUri: String = "testimport.uri.eth" - } - - val uri: Uri = Uri(uri) - - suspend fun importedMethod( - args: TestImportModuleArgsImportedMethod, - invoker: Invoker - ): InvokeResult { - return invoker.invoke( - uri = this.uri, - method = "importedMethod", - args = args - ); - } - - suspend fun anotherMethod( - args: TestImportModuleArgsAnotherMethod, - invoker: Invoker - ): InvokeResult { - return invoker.invoke( - uri = this.uri, - method = "anotherMethod", - args = args - ); - } - - suspend fun returnsArrayOfEnums( - args: TestImportModuleArgsReturnsArrayOfEnums, - invoker: Invoker - ): InvokeResult> { - return invoker.invoke( - uri = this.uri, - method = "returnsArrayOfEnums", - args = args - ); - } -} - -/// Imported Modules END /// - -object TestImport { - val uri: Uri = Uri("testimport.uri.eth"); - - suspend fun getImplementations(invoker: Invoker): Result> { - return invoker.getImplementations(this.uri) - } -} diff --git a/packages/test-cases/cases/bind/sanity/output/plugin-kt/wrap.info.kt b/packages/test-cases/cases/bind/sanity/output/plugin-kt/wrap.info.kt deleted file mode 100644 index 803d28343d..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/plugin-kt/wrap.info.kt +++ /dev/null @@ -1,17 +0,0 @@ -/// NOTE: This is an auto-generated file. -/// All modifications will be overwritten. - -package test.wrap - -import io.polywrap.core.wrap.WrapManifest -import io.polywrap.core.wrap.formats.wrap01.abi.Abi01 -import io.polywrap.core.msgpack.msgPackDecode - -val manifest = WrapManifest( - name = "Test", - type = "plugin", - version = "0.1", - abi = msgPackDecode(Abi01.serializer(), byteArrayOf( - 200.toByte(),89.toByte(),48.toByte(),1.toByte(),138.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),115.toByte(),146.toByte(),199.toByte(),47.toByte(),1.toByte(),131.toByte(),169.toByte(),99.toByte(),111.toByte(),110.toByte(),115.toByte(),116.toByte(),97.toByte(),110.toByte(),116.toByte(),115.toByte(),146.toByte(),166.toByte(),83.toByte(),84.toByte(),82.toByte(),73.toByte(),78.toByte(),71.toByte(),165.toByte(),66.toByte(),89.toByte(),84.toByte(),69.toByte(),83.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),8.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),36.toByte(),1.toByte(),131.toByte(),169.toByte(),99.toByte(),111.toByte(),110.toByte(),115.toByte(),116.toByte(),97.toByte(),110.toByte(),116.toByte(),115.toByte(),146.toByte(),163.toByte(),102.toByte(),111.toByte(),114.toByte(),162.toByte(),105.toByte(),110.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),8.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),165.toByte(),119.toByte(),104.toByte(),105.toByte(),108.toByte(),101.toByte(),167.toByte(),101.toByte(),110.toByte(),118.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),200.toByte(),1.toByte(),163.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),206.toByte(),0.toByte(),1.toByte(),0.toByte(),0.toByte(),170.toByte(),112.toByte(),114.toByte(),111.toByte(),112.toByte(),101.toByte(),114.toByte(),116.toByte(),105.toByte(),101.toByte(),115.toByte(),147.toByte(),199.toByte(),88.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),164.toByte(),112.toByte(),114.toByte(),111.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),39.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),164.toByte(),112.toByte(),114.toByte(),111.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),199.toByte(),74.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),111.toByte(),112.toByte(),116.toByte(),80.toByte(),114.toByte(),111.toByte(),112.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),32.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),111.toByte(),112.toByte(),116.toByte(),80.toByte(),114.toByte(),111.toByte(),112.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),199.toByte(),216.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),199.toByte(),168.toByte(),1.toByte(),134.toByte(),163.toByte(),107.toByte(),101.toByte(),121.toByte(),199.toByte(),41.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),112.toByte(),116.toByte(),77.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),206.toByte(),0.toByte(),4.toByte(),0.toByte(),2.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),112.toByte(),116.toByte(),77.toByte(),97.toByte(),112.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),28.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),112.toByte(),116.toByte(),77.toByte(),97.toByte(),112.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),176.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),73.toByte(),110.toByte(),116.toByte(),62.toByte(),165.toByte(),118.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),199.toByte(),28.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),112.toByte(),116.toByte(),77.toByte(),97.toByte(),112.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),112.toByte(),116.toByte(),77.toByte(),97.toByte(),112.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),176.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),73.toByte(),110.toByte(),116.toByte(),62.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),69.toByte(),110.toByte(),118.toByte(),177.toByte(),105.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),101.toByte(),100.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),115.toByte(),146.toByte(),199.toByte(),114.toByte(),1.toByte(),134.toByte(),169.toByte(),99.toByte(),111.toByte(),110.toByte(),115.toByte(),116.toByte(),97.toByte(),110.toByte(),116.toByte(),115.toByte(),146.toByte(),166.toByte(),83.toByte(),84.toByte(),82.toByte(),73.toByte(),78.toByte(),71.toByte(),165.toByte(),66.toByte(),89.toByte(),84.toByte(),69.toByte(),83.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),2.toByte(),8.toByte(),169.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),115.toByte(),112.toByte(),97.toByte(),99.toByte(),101.toByte(),170.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),170.toByte(),110.toByte(),97.toByte(),116.toByte(),105.toByte(),118.toByte(),101.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),163.toByte(),117.toByte(),114.toByte(),105.toByte(),178.toByte(),116.toByte(),101.toByte(),115.toByte(),116.toByte(),105.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),46.toByte(),117.toByte(),114.toByte(),105.toByte(),46.toByte(),101.toByte(),116.toByte(),104.toByte(),199.toByte(),121.toByte(),1.toByte(),134.toByte(),169.toByte(),99.toByte(),111.toByte(),110.toByte(),115.toByte(),116.toByte(),97.toByte(),110.toByte(),116.toByte(),115.toByte(),146.toByte(),166.toByte(),83.toByte(),84.toByte(),82.toByte(),73.toByte(),78.toByte(),71.toByte(),165.toByte(),66.toByte(),89.toByte(),84.toByte(),69.toByte(),83.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),2.toByte(),8.toByte(),169.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),115.toByte(),112.toByte(),97.toByte(),99.toByte(),101.toByte(),170.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),170.toByte(),110.toByte(),97.toByte(),116.toByte(),105.toByte(),118.toByte(),101.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),182.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),95.toByte(),82.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),163.toByte(),117.toByte(),114.toByte(),105.toByte(),178.toByte(),116.toByte(),101.toByte(),115.toByte(),116.toByte(),105.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),46.toByte(),117.toByte(),114.toByte(),105.toByte(),46.toByte(),101.toByte(),116.toByte(),104.toByte(),176.toByte(),105.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),101.toByte(),100.toByte(),69.toByte(),110.toByte(),118.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),115.toByte(),145.toByte(),200.toByte(),6.toByte(),48.toByte(),1.toByte(),134.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),206.toByte(),0.toByte(),8.toByte(),0.toByte(),0.toByte(),169.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),115.toByte(),112.toByte(),97.toByte(),99.toByte(),101.toByte(),170.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),170.toByte(),110.toByte(),97.toByte(),116.toByte(),105.toByte(),118.toByte(),101.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),69.toByte(),110.toByte(),118.toByte(),170.toByte(),112.toByte(),114.toByte(),111.toByte(),112.toByte(),101.toByte(),114.toByte(),116.toByte(),105.toByte(),101.toByte(),115.toByte(),152.toByte(),199.toByte(),130.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),61.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),116.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),54.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),200.toByte(),1.toByte(),35.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),216.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),66.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),66.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),186.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),186.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),93.toByte(),200.toByte(),1.toByte(),7.toByte(),1.toByte(),132.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),195.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),59.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),59.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),186.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),186.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),93.toByte(),199.toByte(),102.toByte(),1.toByte(),133.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),48.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),101.toByte(),110.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),101.toByte(),110.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),92.toByte(),1.toByte(),132.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),43.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),245.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),181.toByte(),1.toByte(),134.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),55.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),55.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),199.toByte(),217.toByte(),1.toByte(),132.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),160.toByte(),1.toByte(),133.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),48.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),48.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),174.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),118.toByte(),163.toByte(),117.toByte(),114.toByte(),105.toByte(),178.toByte(),116.toByte(),101.toByte(),115.toByte(),116.toByte(),105.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),46.toByte(),117.toByte(),114.toByte(),105.toByte(),46.toByte(),101.toByte(),116.toByte(),104.toByte(),179.toByte(),105.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),101.toByte(),100.toByte(),77.toByte(),111.toByte(),100.toByte(),117.toByte(),108.toByte(),101.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),115.toByte(),145.toByte(),200.toByte(),12.toByte(),153.toByte(),1.toByte(),135.toByte(),171.toByte(),105.toByte(),115.toByte(),73.toByte(),110.toByte(),116.toByte(),101.toByte(),114.toByte(),102.toByte(),97.toByte(),99.toByte(),101.toByte(),195.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),1.toByte(),0.toByte(),167.toByte(),109.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),115.toByte(),147.toByte(),200.toByte(),8.toByte(),232.toByte(),1.toByte(),135.toByte(),169.toByte(),97.toByte(),114.toByte(),103.toByte(),117.toByte(),109.toByte(),101.toByte(),110.toByte(),116.toByte(),115.toByte(),157.toByte(),199.toByte(),86.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),115.toByte(),116.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),38.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),115.toByte(),116.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),199.toByte(),72.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),112.toByte(),116.toByte(),83.toByte(),116.toByte(),114.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),31.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),112.toByte(),116.toByte(),83.toByte(),116.toByte(),114.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),199.toByte(),78.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),161.toByte(),117.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),34.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),161.toByte(),117.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),199.toByte(),64.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),164.toByte(),111.toByte(),112.toByte(),116.toByte(),85.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),27.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),164.toByte(),111.toByte(),112.toByte(),116.toByte(),85.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),200.toByte(),1.toByte(),111.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),200.toByte(),1.toByte(),53.toByte(),1.toByte(),134.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),122.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),34.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),34.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),122.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),34.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),34.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),93.toByte(),199.toByte(),116.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),54.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),102.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),47.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),200.toByte(),1.toByte(),7.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),195.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),59.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),59.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),179.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),179.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),93.toByte(),199.toByte(),235.toByte(),1.toByte(),132.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),174.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),52.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),52.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),179.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),179.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),93.toByte(),199.toByte(),102.toByte(),1.toByte(),133.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),48.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),101.toByte(),110.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),101.toByte(),110.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),92.toByte(),1.toByte(),132.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),43.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),245.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),181.toByte(),1.toByte(),134.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),55.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),55.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),199.toByte(),217.toByte(),1.toByte(),132.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),160.toByte(),1.toByte(),133.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),48.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),48.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),163.toByte(),101.toByte(),110.toByte(),118.toByte(),199.toByte(),11.toByte(),1.toByte(),129.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),64.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),105.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),101.toByte(),100.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),114.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),199.toByte(),112.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),105.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),101.toByte(),100.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),52.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),105.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),101.toByte(),100.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),200.toByte(),1.toByte(),103.toByte(),1.toByte(),134.toByte(),169.toByte(),97.toByte(),114.toByte(),103.toByte(),117.toByte(),109.toByte(),101.toByte(),110.toByte(),116.toByte(),115.toByte(),145.toByte(),199.toByte(),183.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),134.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),38.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),97.toByte(),114.toByte(),103.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),97.toByte(),114.toByte(),103.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),38.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),97.toByte(),114.toByte(),103.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),97.toByte(),114.toByte(),103.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),64.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),97.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),114.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),199.toByte(),104.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),97.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),47.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),97.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),165.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),165.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),200.toByte(),1.toByte(),202.toByte(),1.toByte(),134.toByte(),169.toByte(),97.toByte(),114.toByte(),103.toByte(),117.toByte(),109.toByte(),101.toByte(),110.toByte(),116.toByte(),115.toByte(),145.toByte(),199.toByte(),86.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),97.toByte(),114.toByte(),103.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),38.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),97.toByte(),114.toByte(),103.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),64.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),114.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),115.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),102.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),115.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),114.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),200.toByte(),1.toByte(),37.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),212.toByte(),1.toByte(),134.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),62.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),114.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),115.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),102.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),115.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),182.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),95.toByte(),82.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),62.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),114.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),115.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),102.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),115.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),182.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),95.toByte(),82.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),114.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),115.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),102.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),115.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),95.toByte(),82.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),114.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),115.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),102.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),115.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),95.toByte(),82.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),93.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),169.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),115.toByte(),112.toByte(),97.toByte(),99.toByte(),101.toByte(),170.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),170.toByte(),110.toByte(),97.toByte(),116.toByte(),105.toByte(),118.toByte(),101.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),77.toByte(),111.toByte(),100.toByte(),117.toByte(),108.toByte(),101.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),77.toByte(),111.toByte(),100.toByte(),117.toByte(),108.toByte(),101.toByte(),163.toByte(),117.toByte(),114.toByte(),105.toByte(),178.toByte(),116.toByte(),101.toByte(),115.toByte(),116.toByte(),105.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),46.toByte(),117.toByte(),114.toByte(),105.toByte(),46.toByte(),101.toByte(),116.toByte(),104.toByte(),179.toByte(),105.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),101.toByte(),100.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),115.toByte(),146.toByte(),200.toByte(),6.toByte(),52.toByte(),1.toByte(),134.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),4.toByte(),1.toByte(),169.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),115.toByte(),112.toByte(),97.toByte(),99.toByte(),101.toByte(),170.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),170.toByte(),110.toByte(),97.toByte(),116.toByte(),105.toByte(),118.toByte(),101.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),170.toByte(),112.toByte(),114.toByte(),111.toByte(),112.toByte(),101.toByte(),114.toByte(),116.toByte(),105.toByte(),101.toByte(),115.toByte(),152.toByte(),199.toByte(),130.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),61.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),116.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),54.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),200.toByte(),1.toByte(),35.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),216.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),66.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),66.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),186.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),186.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),93.toByte(),200.toByte(),1.toByte(),7.toByte(),1.toByte(),132.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),195.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),59.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),59.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),186.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),186.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),93.toByte(),199.toByte(),102.toByte(),1.toByte(),133.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),48.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),101.toByte(),110.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),101.toByte(),110.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),92.toByte(),1.toByte(),132.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),43.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),245.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),181.toByte(),1.toByte(),134.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),55.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),55.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),199.toByte(),217.toByte(),1.toByte(),132.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),160.toByte(),1.toByte(),133.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),48.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),48.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),91.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),163.toByte(),117.toByte(),114.toByte(),105.toByte(),178.toByte(),116.toByte(),101.toByte(),115.toByte(),116.toByte(),105.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),46.toByte(),117.toByte(),114.toByte(),105.toByte(),46.toByte(),101.toByte(),116.toByte(),104.toByte(),199.toByte(),211.toByte(),1.toByte(),134.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),4.toByte(),1.toByte(),169.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),115.toByte(),112.toByte(),97.toByte(),99.toByte(),101.toByte(),170.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),170.toByte(),110.toByte(),97.toByte(),116.toByte(),105.toByte(),118.toByte(),101.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),173.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),170.toByte(),112.toByte(),114.toByte(),111.toByte(),112.toByte(),101.toByte(),114.toByte(),116.toByte(),105.toByte(),101.toByte(),115.toByte(),145.toByte(),199.toByte(),88.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),164.toByte(),112.toByte(),114.toByte(),111.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),39.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),164.toByte(),112.toByte(),114.toByte(),111.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),163.toByte(),117.toByte(),114.toByte(),105.toByte(),178.toByte(),116.toByte(),101.toByte(),115.toByte(),116.toByte(),105.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),46.toByte(),117.toByte(),114.toByte(),105.toByte(),46.toByte(),101.toByte(),116.toByte(),104.toByte(),174.toByte(),105.toByte(),110.toByte(),116.toByte(),101.toByte(),114.toByte(),102.toByte(),97.toByte(),99.toByte(),101.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),115.toByte(),145.toByte(),199.toByte(),139.toByte(),1.toByte(),134.toByte(),172.toByte(),99.toByte(),97.toByte(),112.toByte(),97.toByte(),98.toByte(),105.toByte(),108.toByte(),105.toByte(),116.toByte(),105.toByte(),101.toByte(),115.toByte(),199.toByte(),33.toByte(),1.toByte(),129.toByte(),178.toByte(),103.toByte(),101.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),108.toByte(),101.toByte(),109.toByte(),101.toByte(),110.toByte(),116.toByte(),97.toByte(),116.toByte(),105.toByte(),111.toByte(),110.toByte(),115.toByte(),199.toByte(),10.toByte(),1.toByte(),129.toByte(),167.toByte(),101.toByte(),110.toByte(),97.toByte(),98.toByte(),108.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),128.toByte(),0.toByte(),169.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),115.toByte(),112.toByte(),97.toByte(),99.toByte(),101.toByte(),170.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),170.toByte(),110.toByte(),97.toByte(),116.toByte(),105.toByte(),118.toByte(),101.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),169.toByte(),73.toByte(),110.toByte(),116.toByte(),101.toByte(),114.toByte(),102.toByte(),97.toByte(),99.toByte(),101.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),163.toByte(),117.toByte(),114.toByte(),105.toByte(),178.toByte(),116.toByte(),101.toByte(),115.toByte(),116.toByte(),105.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),46.toByte(),117.toByte(),114.toByte(),105.toByte(),46.toByte(),101.toByte(),116.toByte(),104.toByte(),170.toByte(),109.toByte(),111.toByte(),100.toByte(),117.toByte(),108.toByte(),101.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),200.toByte(),20.toByte(),173.toByte(),1.toByte(),132.toByte(),167.toByte(),105.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),115.toByte(),149.toByte(),199.toByte(),24.toByte(),1.toByte(),129.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),77.toByte(),111.toByte(),100.toByte(),117.toByte(),108.toByte(),101.toByte(),199.toByte(),24.toByte(),1.toByte(),129.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),177.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),31.toByte(),1.toByte(),129.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),22.toByte(),1.toByte(),129.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),175.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),29.toByte(),1.toByte(),129.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),182.toByte(),84.toByte(),101.toByte(),115.toByte(),116.toByte(),73.toByte(),109.toByte(),112.toByte(),111.toByte(),114.toByte(),116.toByte(),95.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),95.toByte(),82.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),204.toByte(),128.toByte(),167.toByte(),109.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),115.toByte(),148.toByte(),200.toByte(),12.toByte(),107.toByte(),1.toByte(),134.toByte(),169.toByte(),97.toByte(),114.toByte(),103.toByte(),117.toByte(),109.toByte(),101.toByte(),110.toByte(),116.toByte(),115.toByte(),155.toByte(),199.toByte(),86.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),115.toByte(),116.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),38.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),115.toByte(),116.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),199.toByte(),72.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),112.toByte(),116.toByte(),83.toByte(),116.toByte(),114.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),31.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),112.toByte(),116.toByte(),83.toByte(),116.toByte(),114.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),199.toByte(),92.toByte(),1.toByte(),133.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),43.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),101.toByte(),110.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),101.toByte(),110.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),82.toByte(),1.toByte(),132.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),38.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),225.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),166.toByte(),1.toByte(),134.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),50.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),50.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),172.toByte(),91.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),172.toByte(),91.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),199.toByte(),197.toByte(),1.toByte(),132.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),145.toByte(),1.toByte(),133.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),43.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),43.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),172.toByte(),91.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),172.toByte(),91.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),199.toByte(),241.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),199.toByte(),186.toByte(),1.toByte(),135.toByte(),163.toByte(),107.toByte(),101.toByte(),121.toByte(),199.toByte(),38.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),206.toByte(),0.toByte(),4.toByte(),0.toByte(),2.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),35.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),176.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),73.toByte(),110.toByte(),116.toByte(),62.toByte(),165.toByte(),118.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),199.toByte(),35.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),176.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),73.toByte(),110.toByte(),116.toByte(),62.toByte(),200.toByte(),1.toByte(),214.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),200.toByte(),1.toByte(),151.toByte(),1.toByte(),135.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),140.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),40.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),40.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),165.toByte(),91.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),163.toByte(),107.toByte(),101.toByte(),121.toByte(),199.toByte(),43.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),206.toByte(),0.toByte(),4.toByte(),0.toByte(),2.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),178.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),91.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),62.toByte(),165.toByte(),118.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),199.toByte(),140.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),40.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),40.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),165.toByte(),91.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),178.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),91.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),62.toByte(),200.toByte(),2.toByte(),110.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),200.toByte(),2.toByte(),36.toByte(),1.toByte(),135.toByte(),163.toByte(),107.toByte(),101.toByte(),121.toByte(),199.toByte(),43.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),77.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),206.toByte(),0.toByte(),4.toByte(),0.toByte(),2.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),199.toByte(),206.toByte(),1.toByte(),135.toByte(),163.toByte(),107.toByte(),101.toByte(),121.toByte(),199.toByte(),43.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),77.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),206.toByte(),0.toByte(),4.toByte(),0.toByte(),2.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),77.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),40.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),77.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),176.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),73.toByte(),110.toByte(),116.toByte(),62.toByte(),165.toByte(),118.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),199.toByte(),40.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),77.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),77.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),189.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),73.toByte(),110.toByte(),116.toByte(),62.toByte(),62.toByte(),165.toByte(),118.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),199.toByte(),206.toByte(),1.toByte(),135.toByte(),163.toByte(),107.toByte(),101.toByte(),121.toByte(),199.toByte(),43.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),77.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),206.toByte(),0.toByte(),4.toByte(),0.toByte(),2.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),77.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),40.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),77.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),176.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),73.toByte(),110.toByte(),116.toByte(),62.toByte(),165.toByte(),118.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),199.toByte(),40.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),77.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),77.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),189.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),73.toByte(),110.toByte(),116.toByte(),62.toByte(),62.toByte(),200.toByte(),1.toByte(),46.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),199.toByte(),234.toByte(),1.toByte(),135.toByte(),163.toByte(),107.toByte(),101.toByte(),121.toByte(),199.toByte(),43.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),206.toByte(),0.toByte(),4.toByte(),0.toByte(),2.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),50.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),62.toByte(),165.toByte(),118.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),199.toByte(),50.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),62.toByte(),200.toByte(),2.toByte(),75.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),200.toByte(),1.toByte(),255.toByte(),1.toByte(),135.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),183.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),55.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),55.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),173.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),163.toByte(),107.toByte(),101.toByte(),121.toByte(),199.toByte(),48.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),206.toByte(),0.toByte(),4.toByte(),0.toByte(),2.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),186.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),62.toByte(),165.toByte(),118.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),199.toByte(),183.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),55.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),55.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),173.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),186.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),62.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),64.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),109.toByte(),111.toByte(),100.toByte(),117.toByte(),108.toByte(),101.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),114.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),199.toByte(),98.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),109.toByte(),111.toByte(),100.toByte(),117.toByte(),108.toByte(),101.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),44.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),109.toByte(),111.toByte(),100.toByte(),117.toByte(),108.toByte(),101.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),200.toByte(),3.toByte(),70.toByte(),1.toByte(),135.toByte(),169.toByte(),97.toByte(),114.toByte(),103.toByte(),117.toByte(),109.toByte(),101.toByte(),110.toByte(),116.toByte(),115.toByte(),148.toByte(),199.toByte(),104.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),48.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),199.toByte(),90.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),41.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),199.toByte(),239.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),177.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),53.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),53.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),173.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),173.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),199.toByte(),211.toByte(),1.toByte(),132.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),156.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),46.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),46.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),173.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),173.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),163.toByte(),101.toByte(),110.toByte(),118.toByte(),199.toByte(),11.toByte(),1.toByte(),129.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),64.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),114.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),199.toByte(),96.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),44.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),200.toByte(),3.toByte(),85.toByte(),1.toByte(),135.toByte(),169.toByte(),97.toByte(),114.toByte(),103.toByte(),117.toByte(),109.toByte(),101.toByte(),110.toByte(),116.toByte(),115.toByte(),148.toByte(),199.toByte(),104.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),48.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),199.toByte(),90.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),41.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),199.toByte(),239.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),177.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),53.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),53.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),173.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),173.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),199.toByte(),211.toByte(),1.toByte(),132.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),156.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),46.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),46.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),173.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),173.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),163.toByte(),101.toByte(),110.toByte(),118.toByte(),199.toByte(),11.toByte(),1.toByte(),129.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),194.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),64.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),177.toByte(),111.toByte(),112.toByte(),116.toByte(),105.toByte(),111.toByte(),110.toByte(),97.toByte(),108.toByte(),69.toByte(),110.toByte(),118.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),114.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),199.toByte(),106.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),177.toByte(),111.toByte(),112.toByte(),116.toByte(),105.toByte(),111.toByte(),110.toByte(),97.toByte(),108.toByte(),69.toByte(),110.toByte(),118.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),49.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),177.toByte(),111.toByte(),112.toByte(),116.toByte(),105.toByte(),111.toByte(),110.toByte(),97.toByte(),108.toByte(),69.toByte(),110.toByte(),118.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),199.toByte(),225.toByte(),1.toByte(),134.toByte(),169.toByte(),97.toByte(),114.toByte(),103.toByte(),117.toByte(),109.toByte(),101.toByte(),110.toByte(),116.toByte(),115.toByte(),145.toByte(),199.toByte(),82.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),105.toByte(),102.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),37.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),105.toByte(),102.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),101.toByte(),108.toByte(),115.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),101.toByte(),108.toByte(),115.toByte(),101.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),64.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),105.toByte(),102.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),114.toByte(),101.toByte(),116.toByte(),117.toByte(),114.toByte(),110.toByte(),199.toByte(),82.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),105.toByte(),102.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),37.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),105.toByte(),102.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),101.toByte(),108.toByte(),115.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),101.toByte(),108.toByte(),115.toByte(),101.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),77.toByte(),101.toByte(),116.toByte(),104.toByte(),111.toByte(),100.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),77.toByte(),111.toByte(),100.toByte(),117.toByte(),108.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),115.toByte(),148.toByte(),200.toByte(),36.toByte(),119.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),1.toByte(),170.toByte(),112.toByte(),114.toByte(),111.toByte(),112.toByte(),101.toByte(),114.toByte(),116.toByte(),105.toByte(),101.toByte(),115.toByte(),220.toByte(),0.toByte(),42.toByte(),199.toByte(),86.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),115.toByte(),116.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),38.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),115.toByte(),116.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),199.toByte(),72.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),112.toByte(),116.toByte(),83.toByte(),116.toByte(),114.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),31.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),112.toByte(),116.toByte(),83.toByte(),116.toByte(),114.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),199.toByte(),78.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),161.toByte(),117.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),34.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),161.toByte(),117.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),199.toByte(),64.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),164.toByte(),111.toByte(),112.toByte(),116.toByte(),85.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),27.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),164.toByte(),111.toByte(),112.toByte(),116.toByte(),85.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),199.toByte(),82.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),117.toByte(),56.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),36.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),117.toByte(),56.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),165.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),56.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),165.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),56.toByte(),199.toByte(),86.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),117.toByte(),49.toByte(),54.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),38.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),117.toByte(),49.toByte(),54.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),49.toByte(),54.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),49.toByte(),54.toByte(),199.toByte(),86.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),117.toByte(),51.toByte(),50.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),38.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),117.toByte(),51.toByte(),50.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),199.toByte(),76.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),161.toByte(),105.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),33.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),161.toByte(),105.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),199.toByte(),80.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),105.toByte(),56.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),35.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),105.toByte(),56.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),73.toByte(),110.toByte(),116.toByte(),56.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),73.toByte(),110.toByte(),116.toByte(),56.toByte(),199.toByte(),84.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),105.toByte(),49.toByte(),54.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),37.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),105.toByte(),49.toByte(),54.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),165.toByte(),73.toByte(),110.toByte(),116.toByte(),49.toByte(),54.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),165.toByte(),73.toByte(),110.toByte(),116.toByte(),49.toByte(),54.toByte(),199.toByte(),84.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),105.toByte(),51.toByte(),50.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),37.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),105.toByte(),51.toByte(),50.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),165.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),165.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),199.toByte(),92.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),98.toByte(),105.toByte(),103.toByte(),105.toByte(),110.toByte(),116.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),41.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),98.toByte(),105.toByte(),103.toByte(),105.toByte(),110.toByte(),116.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),66.toByte(),105.toByte(),103.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),66.toByte(),105.toByte(),103.toByte(),73.toByte(),110.toByte(),116.toByte(),199.toByte(),78.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),111.toByte(),112.toByte(),116.toByte(),66.toByte(),105.toByte(),103.toByte(),105.toByte(),110.toByte(),116.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),34.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),111.toByte(),112.toByte(),116.toByte(),66.toByte(),105.toByte(),103.toByte(),105.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),66.toByte(),105.toByte(),103.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),66.toByte(),105.toByte(),103.toByte(),73.toByte(),110.toByte(),116.toByte(),199.toByte(),104.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),98.toByte(),105.toByte(),103.toByte(),110.toByte(),117.toByte(),109.toByte(),98.toByte(),101.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),47.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),98.toByte(),105.toByte(),103.toByte(),110.toByte(),117.toByte(),109.toByte(),98.toByte(),101.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),169.toByte(),66.toByte(),105.toByte(),103.toByte(),78.toByte(),117.toByte(),109.toByte(),98.toByte(),101.toByte(),114.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),169.toByte(),66.toByte(),105.toByte(),103.toByte(),78.toByte(),117.toByte(),109.toByte(),98.toByte(),101.toByte(),114.toByte(),199.toByte(),90.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),66.toByte(),105.toByte(),103.toByte(),110.toByte(),117.toByte(),109.toByte(),98.toByte(),101.toByte(),114.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),40.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),66.toByte(),105.toByte(),103.toByte(),110.toByte(),117.toByte(),109.toByte(),98.toByte(),101.toByte(),114.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),169.toByte(),66.toByte(),105.toByte(),103.toByte(),78.toByte(),117.toByte(),109.toByte(),98.toByte(),101.toByte(),114.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),169.toByte(),66.toByte(),105.toByte(),103.toByte(),78.toByte(),117.toByte(),109.toByte(),98.toByte(),101.toByte(),114.toByte(),199.toByte(),84.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),164.toByte(),106.toByte(),115.toByte(),111.toByte(),110.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),37.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),164.toByte(),106.toByte(),115.toByte(),111.toByte(),110.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),74.toByte(),83.toByte(),79.toByte(),78.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),74.toByte(),83.toByte(),79.toByte(),78.toByte(),199.toByte(),70.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),111.toByte(),112.toByte(),116.toByte(),74.toByte(),115.toByte(),111.toByte(),110.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),30.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),111.toByte(),112.toByte(),116.toByte(),74.toByte(),115.toByte(),111.toByte(),110.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),74.toByte(),83.toByte(),79.toByte(),78.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),74.toByte(),83.toByte(),79.toByte(),78.toByte(),199.toByte(),88.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),165.toByte(),98.toByte(),121.toByte(),116.toByte(),101.toByte(),115.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),39.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),165.toByte(),98.toByte(),121.toByte(),116.toByte(),101.toByte(),115.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),165.toByte(),66.toByte(),121.toByte(),116.toByte(),101.toByte(),115.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),165.toByte(),66.toByte(),121.toByte(),116.toByte(),101.toByte(),115.toByte(),199.toByte(),74.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),111.toByte(),112.toByte(),116.toByte(),66.toByte(),121.toByte(),116.toByte(),101.toByte(),115.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),32.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),111.toByte(),112.toByte(),116.toByte(),66.toByte(),121.toByte(),116.toByte(),101.toByte(),115.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),165.toByte(),66.toByte(),121.toByte(),116.toByte(),101.toByte(),115.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),165.toByte(),66.toByte(),121.toByte(),116.toByte(),101.toByte(),115.toByte(),199.toByte(),96.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),98.toByte(),111.toByte(),111.toByte(),108.toByte(),101.toByte(),97.toByte(),110.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),43.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),98.toByte(),111.toByte(),111.toByte(),108.toByte(),101.toByte(),97.toByte(),110.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),167.toByte(),66.toByte(),111.toByte(),111.toByte(),108.toByte(),101.toByte(),97.toByte(),110.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),167.toByte(),66.toByte(),111.toByte(),111.toByte(),108.toByte(),101.toByte(),97.toByte(),110.toByte(),199.toByte(),82.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),111.toByte(),112.toByte(),116.toByte(),66.toByte(),111.toByte(),111.toByte(),108.toByte(),101.toByte(),97.toByte(),110.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),36.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),111.toByte(),112.toByte(),116.toByte(),66.toByte(),111.toByte(),111.toByte(),108.toByte(),101.toByte(),97.toByte(),110.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),167.toByte(),66.toByte(),111.toByte(),111.toByte(),108.toByte(),101.toByte(),97.toByte(),110.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),167.toByte(),66.toByte(),111.toByte(),111.toByte(),108.toByte(),101.toByte(),97.toByte(),110.toByte(),199.toByte(),191.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),140.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),40.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),117.toByte(),95.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),117.toByte(),95.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),40.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),117.toByte(),95.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),117.toByte(),95.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),199.toByte(),183.toByte(),1.toByte(),132.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),139.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),43.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),117.toByte(),79.toByte(),112.toByte(),116.toByte(),95.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),117.toByte(),79.toByte(),112.toByte(),116.toByte(),95.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),43.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),117.toByte(),79.toByte(),112.toByte(),116.toByte(),95.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),117.toByte(),79.toByte(),112.toByte(),116.toByte(),95.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),199.toByte(),179.toByte(),1.toByte(),132.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),131.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),37.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),95.toByte(),111.toByte(),112.toByte(),116.toByte(),95.toByte(),117.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),95.toByte(),111.toByte(),112.toByte(),116.toByte(),95.toByte(),117.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),37.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),95.toByte(),111.toByte(),112.toByte(),116.toByte(),95.toByte(),117.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),95.toByte(),111.toByte(),112.toByte(),116.toByte(),95.toByte(),117.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),199.toByte(),187.toByte(),1.toByte(),132.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),137.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),39.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),83.toByte(),116.toByte(),114.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),83.toByte(),116.toByte(),114.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),39.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),83.toByte(),116.toByte(),114.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),83.toByte(),116.toByte(),114.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),93.toByte(),200.toByte(),1.toByte(),171.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),200.toByte(),1.toByte(),113.toByte(),1.toByte(),134.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),152.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),44.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),44.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),152.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),44.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),44.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),93.toByte(),200.toByte(),1.toByte(),175.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),200.toByte(),1.toByte(),109.toByte(),1.toByte(),134.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),146.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),42.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),177.toByte(),117.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),177.toByte(),117.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),42.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),177.toByte(),117.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),146.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),42.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),177.toByte(),117.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),177.toByte(),117.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),42.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),177.toByte(),117.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),177.toByte(),117.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),177.toByte(),117.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),93.toByte(),200.toByte(),3.toByte(),239.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),200.toByte(),3.toByte(),169.toByte(),1.toByte(),134.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),200.toByte(),1.toByte(),173.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),182.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),54.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),54.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),182.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),54.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),54.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),93.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),200.toByte(),1.toByte(),173.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),182.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),54.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),54.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),182.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),54.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),54.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),172.toByte(),91.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),93.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),179.toByte(),117.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),79.toByte(),112.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),172.toByte(),91.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),93.toByte(),93.toByte(),200.toByte(),6.toByte(),123.toByte(),1.toByte(),132.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),200.toByte(),6.toByte(),70.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),200.toByte(),3.toByte(),4.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),200.toByte(),1.toByte(),100.toByte(),1.toByte(),134.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),145.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),45.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),45.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),145.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),45.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),45.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),93.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),200.toByte(),1.toByte(),100.toByte(),1.toByte(),134.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),145.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),45.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),45.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),145.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),45.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),45.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),172.toByte(),91.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),93.toByte(),93.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),200.toByte(),3.toByte(),4.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),200.toByte(),1.toByte(),100.toByte(),1.toByte(),134.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),145.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),45.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),45.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),145.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),45.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),45.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),93.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),200.toByte(),1.toByte(),100.toByte(),1.toByte(),134.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),145.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),45.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),45.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),145.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),45.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),45.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),172.toByte(),91.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),93.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),174.toByte(),91.toByte(),91.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),93.toByte(),93.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),170.toByte(),99.toByte(),114.toByte(),97.toByte(),122.toByte(),121.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),174.toByte(),91.toByte(),91.toByte(),91.toByte(),91.toByte(),85.toByte(),73.toByte(),110.toByte(),116.toByte(),51.toByte(),50.toByte(),93.toByte(),93.toByte(),93.toByte(),93.toByte(),199.toByte(),104.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),48.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),199.toByte(),90.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),41.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),199.toByte(),239.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),177.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),53.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),53.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),173.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),171.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),173.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),199.toByte(),211.toByte(),1.toByte(),132.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),156.toByte(),1.toByte(),133.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),46.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),46.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),173.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),111.toByte(),112.toByte(),116.toByte(),79.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),173.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),199.toByte(),92.toByte(),1.toByte(),133.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),43.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),101.toByte(),110.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),162.toByte(),101.toByte(),110.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),82.toByte(),1.toByte(),132.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),38.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),167.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),225.toByte(),1.toByte(),133.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),166.toByte(),1.toByte(),134.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),50.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),50.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),172.toByte(),91.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),169.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),172.toByte(),91.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),199.toByte(),197.toByte(),1.toByte(),132.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),145.toByte(),1.toByte(),133.toByte(),164.toByte(),101.toByte(),110.toByte(),117.toByte(),109.toByte(),199.toByte(),43.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),43.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),64.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),172.toByte(),91.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),172.toByte(),111.toByte(),112.toByte(),116.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),65.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),172.toByte(),91.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),69.toByte(),110.toByte(),117.toByte(),109.toByte(),93.toByte(),199.toByte(),241.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),199.toByte(),186.toByte(),1.toByte(),135.toByte(),163.toByte(),107.toByte(),101.toByte(),121.toByte(),199.toByte(),38.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),206.toByte(),0.toByte(),4.toByte(),0.toByte(),2.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),35.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),176.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),73.toByte(),110.toByte(),116.toByte(),62.toByte(),165.toByte(),118.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),199.toByte(),35.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),176.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),73.toByte(),110.toByte(),116.toByte(),62.toByte(),200.toByte(),1.toByte(),214.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),200.toByte(),1.toByte(),151.toByte(),1.toByte(),135.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),140.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),40.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),40.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),165.toByte(),91.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),163.toByte(),107.toByte(),101.toByte(),121.toByte(),199.toByte(),43.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),206.toByte(),0.toByte(),4.toByte(),0.toByte(),2.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),178.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),91.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),62.toByte(),165.toByte(),118.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),199.toByte(),140.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),40.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),40.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),163.toByte(),73.toByte(),110.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),165.toByte(),91.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),178.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),91.toByte(),73.toByte(),110.toByte(),116.toByte(),93.toByte(),62.toByte(),200.toByte(),1.toByte(),46.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),199.toByte(),234.toByte(),1.toByte(),135.toByte(),163.toByte(),107.toByte(),101.toByte(),121.toByte(),199.toByte(),43.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),206.toByte(),0.toByte(),4.toByte(),0.toByte(),2.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),50.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),62.toByte(),165.toByte(),118.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),199.toByte(),50.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),184.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),62.toByte(),200.toByte(),2.toByte(),75.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),200.toByte(),1.toByte(),255.toByte(),1.toByte(),135.toByte(),165.toByte(),97.toByte(),114.toByte(),114.toByte(),97.toByte(),121.toByte(),199.toByte(),183.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),55.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),55.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),173.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),163.toByte(),107.toByte(),101.toByte(),121.toByte(),199.toByte(),48.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),206.toByte(),0.toByte(),4.toByte(),0.toByte(),2.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),186.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),62.toByte(),165.toByte(),118.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),199.toByte(),183.toByte(),1.toByte(),134.toByte(),164.toByte(),105.toByte(),116.toByte(),101.toByte(),109.toByte(),199.toByte(),55.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),18.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),55.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),173.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),173.toByte(),109.toByte(),97.toByte(),112.toByte(),79.toByte(),102.toByte(),65.toByte(),114.toByte(),114.toByte(),79.toByte(),102.toByte(),79.toByte(),98.toByte(),106.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),186.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),91.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),93.toByte(),62.toByte(),200.toByte(),1.toByte(),68.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),163.toByte(),109.toByte(),97.toByte(),112.toByte(),199.toByte(),247.toByte(),1.toByte(),135.toByte(),163.toByte(),107.toByte(),101.toByte(),121.toByte(),199.toByte(),49.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),109.toByte(),97.toByte(),112.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),86.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),206.toByte(),0.toByte(),4.toByte(),0.toByte(),2.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),109.toByte(),97.toByte(),112.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),86.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),49.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),109.toByte(),97.toByte(),112.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),86.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),174.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),77.toByte(),97.toByte(),112.toByte(),86.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),187.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),77.toByte(),97.toByte(),112.toByte(),86.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),62.toByte(),165.toByte(),118.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),199.toByte(),49.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),109.toByte(),97.toByte(),112.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),86.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),174.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),77.toByte(),97.toByte(),112.toByte(),86.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),174.toByte(),109.toByte(),97.toByte(),112.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),86.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),187.toByte(),77.toByte(),97.toByte(),112.toByte(),60.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),44.toByte(),32.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),77.toByte(),97.toByte(),112.toByte(),86.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),62.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),200.toByte(),1.toByte(),13.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),1.toByte(),170.toByte(),112.toByte(),114.toByte(),111.toByte(),112.toByte(),101.toByte(),114.toByte(),116.toByte(),105.toByte(),101.toByte(),115.toByte(),147.toByte(),199.toByte(),68.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),164.toByte(),112.toByte(),114.toByte(),111.toByte(),112.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),29.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),164.toByte(),112.toByte(),114.toByte(),111.toByte(),112.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),199.toByte(),86.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),99.toByte(),105.toByte(),114.toByte(),99.toByte(),117.toByte(),108.toByte(),97.toByte(),114.toByte(),166.toByte(),111.toByte(),98.toByte(),106.toByte(),101.toByte(),99.toByte(),116.toByte(),199.toByte(),39.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),205.toByte(),32.toByte(),0.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),168.toByte(),99.toByte(),105.toByte(),114.toByte(),99.toByte(),117.toByte(),108.toByte(),97.toByte(),114.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),170.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),199.toByte(),70.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),165.toByte(),99.toByte(),111.toByte(),110.toByte(),115.toByte(),116.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),30.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),165.toByte(),99.toByte(),111.toByte(),110.toByte(),115.toByte(),116.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),171.toByte(),65.toByte(),110.toByte(),111.toByte(),116.toByte(),104.toByte(),101.toByte(),114.toByte(),84.toByte(),121.toByte(),112.toByte(),101.toByte(),199.toByte(),128.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),1.toByte(),170.toByte(),112.toByte(),114.toByte(),111.toByte(),112.toByte(),101.toByte(),114.toByte(),116.toByte(),105.toByte(),101.toByte(),115.toByte(),145.toByte(),199.toByte(),86.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),102.toByte(),111.toByte(),111.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),38.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),163.toByte(),102.toByte(),111.toByte(),111.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),174.toByte(),67.toByte(),117.toByte(),115.toByte(),116.toByte(),111.toByte(),109.toByte(),77.toByte(),97.toByte(),112.toByte(),86.toByte(),97.toByte(),108.toByte(),117.toByte(),101.toByte(),199.toByte(),120.toByte(),1.toByte(),131.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),1.toByte(),170.toByte(),112.toByte(),114.toByte(),111.toByte(),112.toByte(),101.toByte(),114.toByte(),116.toByte(),105.toByte(),101.toByte(),115.toByte(),145.toByte(),199.toByte(),88.toByte(),1.toByte(),133.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),34.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),164.toByte(),101.toByte(),108.toByte(),115.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),166.toByte(),115.toByte(),99.toByte(),97.toByte(),108.toByte(),97.toByte(),114.toByte(),199.toByte(),39.toByte(),1.toByte(),132.toByte(),164.toByte(),107.toByte(),105.toByte(),110.toByte(),100.toByte(),4.toByte(),164.toByte(),110.toByte(),97.toByte(),109.toByte(),101.toByte(),164.toByte(),101.toByte(),108.toByte(),115.toByte(),101.toByte(),168.toByte(),114.toByte(),101.toByte(),113.toByte(),117.toByte(),105.toByte(),114.toByte(),101.toByte(),100.toByte(),195.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),166.toByte(),83.toByte(),116.toByte(),114.toByte(),105.toByte(),110.toByte(),103.toByte(),164.toByte(),116.toByte(),121.toByte(),112.toByte(),101.toByte(),164.toByte(),101.toByte(),108.toByte(),115.toByte(),101.toByte(),167.toByte(),118.toByte(),101.toByte(),114.toByte(),115.toByte(),105.toByte(),111.toByte(),110.toByte(),163.toByte(),48.toByte(),46.toByte(),49.toByte() - )).getOrThrow() - ) diff --git a/packages/test-cases/cases/bind/sanity/output/plugin-py/__init__.py b/packages/test-cases/cases/bind/sanity/output/plugin-py/__init__.py deleted file mode 100644 index d2ad6b3725..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/plugin-py/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# NOTE: This is an auto-generated file. All modifications will be overwritten. -# type: ignore - -from .types import * -from .module import * -from .wrap_info import * diff --git a/packages/test-cases/cases/bind/sanity/output/plugin-py/module.py b/packages/test-cases/cases/bind/sanity/output/plugin-py/module.py deleted file mode 100644 index 836ffbc767..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/plugin-py/module.py +++ /dev/null @@ -1,94 +0,0 @@ -# NOTE: This is an auto-generated file. All modifications will be overwritten. -# type: ignore -from __future__ import annotations - -from abc import abstractmethod -from typing import TypeVar, Generic, TypedDict, Optional - -from .types import * - -from polywrap_core import InvokerClient -from polywrap_plugin import PluginModule -from polywrap_msgpack import GenericMap - -TConfig = TypeVar("TConfig") - - -ArgsModuleMethod = TypedDict("ArgsModuleMethod", { - "str": str, - "optStr": Optional[str], - "en": "CustomEnum", - "optEnum": Optional["CustomEnum"], - "enumArray": list["CustomEnum"], - "optEnumArray": Optional[list[Optional["CustomEnum"]]], - "map": GenericMap[str, int], - "mapOfArr": GenericMap[str, list[int]], - "mapOfMap": GenericMap[str, GenericMap[str, int]], - "mapOfObj": GenericMap[str, "AnotherType"], - "mapOfArrOfObj": GenericMap[str, list["AnotherType"]] -}) - -ArgsObjectMethod = TypedDict("ArgsObjectMethod", { - "object": "AnotherType", - "optObject": Optional["AnotherType"], - "objectArray": list["AnotherType"], - "optObjectArray": Optional[list[Optional["AnotherType"]]] -}) - -ArgsOptionalEnvMethod = TypedDict("ArgsOptionalEnvMethod", { - "object": "AnotherType", - "optObject": Optional["AnotherType"], - "objectArray": list["AnotherType"], - "optObjectArray": Optional[list[Optional["AnotherType"]]] -}) - -ArgsIf = TypedDict("ArgsIf", { - "if": "Else" -}) - - -class Module(Generic[TConfig], PluginModule[TConfig]): - def __new__(cls, *args, **kwargs): - # NOTE: This is used to dynamically add WRAP ABI compatible methods to the class - instance = super().__new__(cls) - setattr(instance, "moduleMethod", instance.module_method) - setattr(instance, "objectMethod", instance.object_method) - setattr(instance, "optionalEnvMethod", instance.optional_env_method) - setattr(instance, "if", instance.r_if) - return instance - - @abstractmethod - def module_method( - self, - args: ArgsModuleMethod, - client: InvokerClient, - env: None - ) -> int: - pass - - @abstractmethod - def object_method( - self, - args: ArgsObjectMethod, - client: InvokerClient, - env: Env - ) -> Optional["AnotherType"]: - pass - - @abstractmethod - def optional_env_method( - self, - args: ArgsOptionalEnvMethod, - client: InvokerClient, - env: Optional[Env] = None - ) -> Optional["AnotherType"]: - pass - - @abstractmethod - def r_if( - self, - args: ArgsIf, - client: InvokerClient, - env: None - ) -> "Else": - pass diff --git a/packages/test-cases/cases/bind/sanity/output/plugin-py/types.py b/packages/test-cases/cases/bind/sanity/output/plugin-py/types.py deleted file mode 100644 index fa5d31f1a3..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/plugin-py/types.py +++ /dev/null @@ -1,244 +0,0 @@ -# NOTE: This is an auto-generated file. All modifications will be overwritten. -# type: ignore -from __future__ import annotations - -from typing import TypedDict, Optional -from enum import IntEnum - -from polywrap_core import InvokerClient, Uri -from polywrap_msgpack import GenericMap - - -### Env START ### - -Env = TypedDict("Env", { - "prop": str, - "optProp": Optional[str], - "optMap": Optional[GenericMap[str, Optional[int]]], -}) - -### Env END ### - -### Objects START ### - -CustomType = TypedDict("CustomType", { - "str": str, - "optStr": Optional[str], - "u": int, - "optU": Optional[int], - "u8": int, - "u16": int, - "u32": int, - "i": int, - "i8": int, - "i16": int, - "i32": int, - "bigint": str, - "optBigint": Optional[str], - "bignumber": str, - "optBignumber": Optional[str], - "json": str, - "optJson": Optional[str], - "bytes": bytes, - "optBytes": Optional[bytes], - "boolean": bool, - "optBoolean": Optional[bool], - "u_array": list[int], - "uOpt_array": Optional[list[int]], - "_opt_uOptArray": Optional[list[Optional[int]]], - "optStrOptArray": Optional[list[Optional[str]]], - "uArrayArray": list[list[int]], - "uOptArrayOptArray": list[Optional[list[Optional[int]]]], - "uArrayOptArrayArray": list[Optional[list[list[int]]]], - "crazyArray": Optional[list[Optional[list[list[Optional[list[int]]]]]]], - "object": "AnotherType", - "optObject": Optional["AnotherType"], - "objectArray": list["AnotherType"], - "optObjectArray": Optional[list[Optional["AnotherType"]]], - "en": "CustomEnum", - "optEnum": Optional["CustomEnum"], - "enumArray": list["CustomEnum"], - "optEnumArray": Optional[list[Optional["CustomEnum"]]], - "map": GenericMap[str, int], - "mapOfArr": GenericMap[str, list[int]], - "mapOfObj": GenericMap[str, "AnotherType"], - "mapOfArrOfObj": GenericMap[str, list["AnotherType"]], - "mapCustomValue": GenericMap[str, Optional["CustomMapValue"]], -}) - -AnotherType = TypedDict("AnotherType", { - "prop": Optional[str], - "circular": Optional["CustomType"], - "const": Optional[str], -}) - -CustomMapValue = TypedDict("CustomMapValue", { - "foo": str, -}) - -Else = TypedDict("Else", { - "else": str, -}) - -### Objects END ### - -### Enums START ### -class CustomEnum(IntEnum): - STRING = 0, "0", "STRING" - BYTES = 1, "1", "BYTES" - - def __new__(cls, value: int, *aliases: str): - obj = int.__new__(cls) - obj._value_ = value - for alias in aliases: - cls._value2member_map_[alias] = obj - return obj - -class While(IntEnum): - r_for = 0, "0", "for" - r_in = 1, "1", "in" - - def __new__(cls, value: int, *aliases: str): - obj = int.__new__(cls) - obj._value_ = value - for alias in aliases: - cls._value2member_map_[alias] = obj - return obj - -### Enums END ### - -### Imported Objects START ### - -# URI: "testimport.uri.eth" # -TestImportObject = TypedDict("TestImportObject", { - "object": "TestImportAnotherObject", - "optObject": Optional["TestImportAnotherObject"], - "objectArray": list["TestImportAnotherObject"], - "optObjectArray": Optional[list[Optional["TestImportAnotherObject"]]], - "en": "TestImportEnum", - "optEnum": Optional["TestImportEnum"], - "enumArray": list["TestImportEnum"], - "optEnumArray": Optional[list[Optional["TestImportEnum"]]], -}) - -# URI: "testimport.uri.eth" # -TestImportAnotherObject = TypedDict("TestImportAnotherObject", { - "prop": str, -}) - -### Imported Objects END ### - -### Imported Enums START ### - -# URI: "testimport.uri.eth" # -class TestImportEnum(IntEnum): - STRING = 0, "0", "STRING" - BYTES = 1, "1", "BYTES" - - def __new__(cls, value: int, *aliases: str): - obj = int.__new__(cls) - obj._value_ = value - for alias in aliases: - cls._value2member_map_[alias] = obj - return obj - -# URI: "testimport.uri.eth" # -class TestImportEnumReturn(IntEnum): - STRING = 0, "0", "STRING" - BYTES = 1, "1", "BYTES" - - def __new__(cls, value: int, *aliases: str): - obj = int.__new__(cls) - obj._value_ = value - for alias in aliases: - cls._value2member_map_[alias] = obj - return obj - - -### Imported Enums END ### - -### Imported Modules START ### - -# URI: "testimport.uri.eth" # -TestImportModuleArgsImportedMethod = TypedDict("TestImportModuleArgsImportedMethod", { - "str": str, - "optStr": Optional[str], - "u": int, - "optU": Optional[int], - "uArrayArray": list[Optional[list[Optional[int]]]], - "object": "TestImportObject", - "optObject": Optional["TestImportObject"], - "objectArray": list["TestImportObject"], - "optObjectArray": Optional[list[Optional["TestImportObject"]]], - "en": "TestImportEnum", - "optEnum": Optional["TestImportEnum"], - "enumArray": list["TestImportEnum"], - "optEnumArray": Optional[list[Optional["TestImportEnum"]]], -}) - -# URI: "testimport.uri.eth" # -TestImportModuleArgsAnotherMethod = TypedDict("TestImportModuleArgsAnotherMethod", { - "arg": list[str], -}) - -# URI: "testimport.uri.eth" # -TestImportModuleArgsReturnsArrayOfEnums = TypedDict("TestImportModuleArgsReturnsArrayOfEnums", { - "arg": str, -}) - -# URI: "testimport.uri.eth" # -class TestImportModule: - INTERFACE_URI: Uri = Uri.from_str("testimport.uri.eth") - uri: Uri - - def __init__(self, uri: Uri): - self.uri = uri - - def imported_method( - self, - args: TestImportModuleArgsImportedMethod, - client: InvokerClient - ) -> Optional["TestImportObject"]: - return client.invoke( - uri=self.uri, - method="importedMethod", - args=args, - ) - - def another_method( - self, - args: TestImportModuleArgsAnotherMethod, - client: InvokerClient - ) -> int: - return client.invoke( - uri=self.uri, - method="anotherMethod", - args=args, - ) - - def returns_array_of_enums( - self, - args: TestImportModuleArgsReturnsArrayOfEnums, - client: InvokerClient - ) -> list[Optional["TestImportEnumReturn"]]: - return client.invoke( - uri=self.uri, - method="returnsArrayOfEnums", - args=args, - ) - -### Imported Modules END ### - -### Interface START ### - - -class TestImport: - URI: Uri = Uri.from_str("testimport.uri.eth") - - def get_implementations( - client: InvokerClient - ) -> list[str]: - impls = client.getImplementations(self.uri) - return [impl.uri for impl in impls] - -### Interface END ### diff --git a/packages/test-cases/cases/bind/sanity/output/plugin-py/wrap_info.py b/packages/test-cases/cases/bind/sanity/output/plugin-py/wrap_info.py deleted file mode 100644 index 7bf75c8e64..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/plugin-py/wrap_info.py +++ /dev/null @@ -1,2441 +0,0 @@ -# NOTE: This is an auto-generated file. All modifications will be overwritten. -# type: ignore -from __future__ import annotations - -import json - -from polywrap_manifest import WrapManifest - -abi = json.loads(""" -{ - "enumTypes": [ - { - "constants": [ - "STRING", - "BYTES" - ], - "kind": 8, - "type": "CustomEnum" - }, - { - "constants": [ - "for", - "in" - ], - "kind": 8, - "type": "while" - } - ], - "envType": { - "kind": 65536, - "properties": [ - { - "kind": 34, - "name": "prop", - "required": true, - "scalar": { - "kind": 4, - "name": "prop", - "required": true, - "type": "String" - }, - "type": "String" - }, - { - "kind": 34, - "name": "optProp", - "scalar": { - "kind": 4, - "name": "optProp", - "type": "String" - }, - "type": "String" - }, - { - "kind": 34, - "map": { - "key": { - "kind": 4, - "name": "optMap", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "optMap", - "scalar": { - "kind": 4, - "name": "optMap", - "type": "Int" - }, - "type": "Map", - "value": { - "kind": 4, - "name": "optMap", - "type": "Int" - } - }, - "name": "optMap", - "type": "Map" - } - ], - "type": "Env" - }, - "importedEnumTypes": [ - { - "constants": [ - "STRING", - "BYTES" - ], - "kind": 520, - "namespace": "TestImport", - "nativeType": "Enum", - "type": "TestImport_Enum", - "uri": "testimport.uri.eth" - }, - { - "constants": [ - "STRING", - "BYTES" - ], - "kind": 520, - "namespace": "TestImport", - "nativeType": "Enum", - "type": "TestImport_Enum_Return", - "uri": "testimport.uri.eth" - } - ], - "importedEnvTypes": [ - { - "kind": 524288, - "namespace": "TestImport", - "nativeType": "Env", - "properties": [ - { - "kind": 34, - "name": "object", - "object": { - "kind": 8192, - "name": "object", - "required": true, - "type": "TestImport_AnotherObject" - }, - "required": true, - "type": "TestImport_AnotherObject" - }, - { - "kind": 34, - "name": "optObject", - "object": { - "kind": 8192, - "name": "optObject", - "type": "TestImport_AnotherObject" - }, - "type": "TestImport_AnotherObject" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "TestImport_AnotherObject" - }, - "kind": 18, - "name": "objectArray", - "object": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "TestImport_AnotherObject" - }, - "required": true, - "type": "[TestImport_AnotherObject]" - }, - "kind": 34, - "name": "objectArray", - "required": true, - "type": "[TestImport_AnotherObject]" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "optObjectArray", - "type": "TestImport_AnotherObject" - }, - "kind": 18, - "name": "optObjectArray", - "object": { - "kind": 8192, - "name": "optObjectArray", - "type": "TestImport_AnotherObject" - }, - "type": "[TestImport_AnotherObject]" - }, - "kind": 34, - "name": "optObjectArray", - "type": "[TestImport_AnotherObject]" - }, - { - "enum": { - "kind": 16384, - "name": "en", - "required": true, - "type": "TestImport_Enum" - }, - "kind": 34, - "name": "en", - "required": true, - "type": "TestImport_Enum" - }, - { - "enum": { - "kind": 16384, - "name": "optEnum", - "type": "TestImport_Enum" - }, - "kind": 34, - "name": "optEnum", - "type": "TestImport_Enum" - }, - { - "array": { - "enum": { - "kind": 16384, - "name": "enumArray", - "required": true, - "type": "TestImport_Enum" - }, - "item": { - "kind": 16384, - "name": "enumArray", - "required": true, - "type": "TestImport_Enum" - }, - "kind": 18, - "name": "enumArray", - "required": true, - "type": "[TestImport_Enum]" - }, - "kind": 34, - "name": "enumArray", - "required": true, - "type": "[TestImport_Enum]" - }, - { - "array": { - "enum": { - "kind": 16384, - "name": "optEnumArray", - "type": "TestImport_Enum" - }, - "item": { - "kind": 16384, - "name": "optEnumArray", - "type": "TestImport_Enum" - }, - "kind": 18, - "name": "optEnumArray", - "type": "[TestImport_Enum]" - }, - "kind": 34, - "name": "optEnumArray", - "type": "[TestImport_Enum]" - } - ], - "type": "TestImport_Env", - "uri": "testimport.uri.eth" - } - ], - "importedModuleTypes": [ - { - "isInterface": true, - "kind": 256, - "methods": [ - { - "arguments": [ - { - "kind": 34, - "name": "str", - "required": true, - "scalar": { - "kind": 4, - "name": "str", - "required": true, - "type": "String" - }, - "type": "String" - }, - { - "kind": 34, - "name": "optStr", - "scalar": { - "kind": 4, - "name": "optStr", - "type": "String" - }, - "type": "String" - }, - { - "kind": 34, - "name": "u", - "required": true, - "scalar": { - "kind": 4, - "name": "u", - "required": true, - "type": "UInt" - }, - "type": "UInt" - }, - { - "kind": 34, - "name": "optU", - "scalar": { - "kind": 4, - "name": "optU", - "type": "UInt" - }, - "type": "UInt" - }, - { - "array": { - "array": { - "item": { - "kind": 4, - "name": "uArrayArray", - "type": "UInt" - }, - "kind": 18, - "name": "uArrayArray", - "scalar": { - "kind": 4, - "name": "uArrayArray", - "type": "UInt" - }, - "type": "[UInt]" - }, - "item": { - "item": { - "kind": 4, - "name": "uArrayArray", - "type": "UInt" - }, - "kind": 18, - "name": "uArrayArray", - "scalar": { - "kind": 4, - "name": "uArrayArray", - "type": "UInt" - }, - "type": "[UInt]" - }, - "kind": 18, - "name": "uArrayArray", - "required": true, - "type": "[[UInt]]" - }, - "kind": 34, - "name": "uArrayArray", - "required": true, - "type": "[[UInt]]" - }, - { - "kind": 34, - "name": "object", - "object": { - "kind": 8192, - "name": "object", - "required": true, - "type": "TestImport_Object" - }, - "required": true, - "type": "TestImport_Object" - }, - { - "kind": 34, - "name": "optObject", - "object": { - "kind": 8192, - "name": "optObject", - "type": "TestImport_Object" - }, - "type": "TestImport_Object" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "TestImport_Object" - }, - "kind": 18, - "name": "objectArray", - "object": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "TestImport_Object" - }, - "required": true, - "type": "[TestImport_Object]" - }, - "kind": 34, - "name": "objectArray", - "required": true, - "type": "[TestImport_Object]" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "optObjectArray", - "type": "TestImport_Object" - }, - "kind": 18, - "name": "optObjectArray", - "object": { - "kind": 8192, - "name": "optObjectArray", - "type": "TestImport_Object" - }, - "type": "[TestImport_Object]" - }, - "kind": 34, - "name": "optObjectArray", - "type": "[TestImport_Object]" - }, - { - "enum": { - "kind": 16384, - "name": "en", - "required": true, - "type": "TestImport_Enum" - }, - "kind": 34, - "name": "en", - "required": true, - "type": "TestImport_Enum" - }, - { - "enum": { - "kind": 16384, - "name": "optEnum", - "type": "TestImport_Enum" - }, - "kind": 34, - "name": "optEnum", - "type": "TestImport_Enum" - }, - { - "array": { - "enum": { - "kind": 16384, - "name": "enumArray", - "required": true, - "type": "TestImport_Enum" - }, - "item": { - "kind": 16384, - "name": "enumArray", - "required": true, - "type": "TestImport_Enum" - }, - "kind": 18, - "name": "enumArray", - "required": true, - "type": "[TestImport_Enum]" - }, - "kind": 34, - "name": "enumArray", - "required": true, - "type": "[TestImport_Enum]" - }, - { - "array": { - "enum": { - "kind": 16384, - "name": "optEnumArray", - "type": "TestImport_Enum" - }, - "item": { - "kind": 16384, - "name": "optEnumArray", - "type": "TestImport_Enum" - }, - "kind": 18, - "name": "optEnumArray", - "type": "[TestImport_Enum]" - }, - "kind": 34, - "name": "optEnumArray", - "type": "[TestImport_Enum]" - } - ], - "env": { - "required": true - }, - "kind": 64, - "name": "importedMethod", - "required": true, - "return": { - "kind": 34, - "name": "importedMethod", - "object": { - "kind": 8192, - "name": "importedMethod", - "type": "TestImport_Object" - }, - "type": "TestImport_Object" - }, - "type": "Method" - }, - { - "arguments": [ - { - "array": { - "item": { - "kind": 4, - "name": "arg", - "required": true, - "type": "String" - }, - "kind": 18, - "name": "arg", - "required": true, - "scalar": { - "kind": 4, - "name": "arg", - "required": true, - "type": "String" - }, - "type": "[String]" - }, - "kind": 34, - "name": "arg", - "required": true, - "type": "[String]" - } - ], - "kind": 64, - "name": "anotherMethod", - "required": true, - "return": { - "kind": 34, - "name": "anotherMethod", - "required": true, - "scalar": { - "kind": 4, - "name": "anotherMethod", - "required": true, - "type": "Int32" - }, - "type": "Int32" - }, - "type": "Method" - }, - { - "arguments": [ - { - "kind": 34, - "name": "arg", - "required": true, - "scalar": { - "kind": 4, - "name": "arg", - "required": true, - "type": "String" - }, - "type": "String" - } - ], - "kind": 64, - "name": "returnsArrayOfEnums", - "required": true, - "return": { - "array": { - "enum": { - "kind": 16384, - "name": "returnsArrayOfEnums", - "type": "TestImport_Enum_Return" - }, - "item": { - "kind": 16384, - "name": "returnsArrayOfEnums", - "type": "TestImport_Enum_Return" - }, - "kind": 18, - "name": "returnsArrayOfEnums", - "required": true, - "type": "[TestImport_Enum_Return]" - }, - "kind": 34, - "name": "returnsArrayOfEnums", - "required": true, - "type": "[TestImport_Enum_Return]" - }, - "type": "Method" - } - ], - "namespace": "TestImport", - "nativeType": "Module", - "type": "TestImport_Module", - "uri": "testimport.uri.eth" - } - ], - "importedObjectTypes": [ - { - "kind": 1025, - "namespace": "TestImport", - "nativeType": "Object", - "properties": [ - { - "kind": 34, - "name": "object", - "object": { - "kind": 8192, - "name": "object", - "required": true, - "type": "TestImport_AnotherObject" - }, - "required": true, - "type": "TestImport_AnotherObject" - }, - { - "kind": 34, - "name": "optObject", - "object": { - "kind": 8192, - "name": "optObject", - "type": "TestImport_AnotherObject" - }, - "type": "TestImport_AnotherObject" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "TestImport_AnotherObject" - }, - "kind": 18, - "name": "objectArray", - "object": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "TestImport_AnotherObject" - }, - "required": true, - "type": "[TestImport_AnotherObject]" - }, - "kind": 34, - "name": "objectArray", - "required": true, - "type": "[TestImport_AnotherObject]" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "optObjectArray", - "type": "TestImport_AnotherObject" - }, - "kind": 18, - "name": "optObjectArray", - "object": { - "kind": 8192, - "name": "optObjectArray", - "type": "TestImport_AnotherObject" - }, - "type": "[TestImport_AnotherObject]" - }, - "kind": 34, - "name": "optObjectArray", - "type": "[TestImport_AnotherObject]" - }, - { - "enum": { - "kind": 16384, - "name": "en", - "required": true, - "type": "TestImport_Enum" - }, - "kind": 34, - "name": "en", - "required": true, - "type": "TestImport_Enum" - }, - { - "enum": { - "kind": 16384, - "name": "optEnum", - "type": "TestImport_Enum" - }, - "kind": 34, - "name": "optEnum", - "type": "TestImport_Enum" - }, - { - "array": { - "enum": { - "kind": 16384, - "name": "enumArray", - "required": true, - "type": "TestImport_Enum" - }, - "item": { - "kind": 16384, - "name": "enumArray", - "required": true, - "type": "TestImport_Enum" - }, - "kind": 18, - "name": "enumArray", - "required": true, - "type": "[TestImport_Enum]" - }, - "kind": 34, - "name": "enumArray", - "required": true, - "type": "[TestImport_Enum]" - }, - { - "array": { - "enum": { - "kind": 16384, - "name": "optEnumArray", - "type": "TestImport_Enum" - }, - "item": { - "kind": 16384, - "name": "optEnumArray", - "type": "TestImport_Enum" - }, - "kind": 18, - "name": "optEnumArray", - "type": "[TestImport_Enum]" - }, - "kind": 34, - "name": "optEnumArray", - "type": "[TestImport_Enum]" - } - ], - "type": "TestImport_Object", - "uri": "testimport.uri.eth" - }, - { - "kind": 1025, - "namespace": "TestImport", - "nativeType": "AnotherObject", - "properties": [ - { - "kind": 34, - "name": "prop", - "required": true, - "scalar": { - "kind": 4, - "name": "prop", - "required": true, - "type": "String" - }, - "type": "String" - } - ], - "type": "TestImport_AnotherObject", - "uri": "testimport.uri.eth" - } - ], - "interfaceTypes": [ - { - "capabilities": { - "getImplementations": { - "enabled": true - } - }, - "kind": 32768, - "namespace": "TestImport", - "nativeType": "Interface", - "type": "TestImport", - "uri": "testimport.uri.eth" - } - ], - "moduleType": { - "imports": [ - { - "type": "TestImport_Module" - }, - { - "type": "TestImport_Object" - }, - { - "type": "TestImport_AnotherObject" - }, - { - "type": "TestImport_Enum" - }, - { - "type": "TestImport_Enum_Return" - } - ], - "kind": 128, - "methods": [ - { - "arguments": [ - { - "kind": 34, - "name": "str", - "required": true, - "scalar": { - "kind": 4, - "name": "str", - "required": true, - "type": "String" - }, - "type": "String" - }, - { - "kind": 34, - "name": "optStr", - "scalar": { - "kind": 4, - "name": "optStr", - "type": "String" - }, - "type": "String" - }, - { - "enum": { - "kind": 16384, - "name": "en", - "required": true, - "type": "CustomEnum" - }, - "kind": 34, - "name": "en", - "required": true, - "type": "CustomEnum" - }, - { - "enum": { - "kind": 16384, - "name": "optEnum", - "type": "CustomEnum" - }, - "kind": 34, - "name": "optEnum", - "type": "CustomEnum" - }, - { - "array": { - "enum": { - "kind": 16384, - "name": "enumArray", - "required": true, - "type": "CustomEnum" - }, - "item": { - "kind": 16384, - "name": "enumArray", - "required": true, - "type": "CustomEnum" - }, - "kind": 18, - "name": "enumArray", - "required": true, - "type": "[CustomEnum]" - }, - "kind": 34, - "name": "enumArray", - "required": true, - "type": "[CustomEnum]" - }, - { - "array": { - "enum": { - "kind": 16384, - "name": "optEnumArray", - "type": "CustomEnum" - }, - "item": { - "kind": 16384, - "name": "optEnumArray", - "type": "CustomEnum" - }, - "kind": 18, - "name": "optEnumArray", - "type": "[CustomEnum]" - }, - "kind": 34, - "name": "optEnumArray", - "type": "[CustomEnum]" - }, - { - "kind": 34, - "map": { - "key": { - "kind": 4, - "name": "map", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "map", - "required": true, - "scalar": { - "kind": 4, - "name": "map", - "required": true, - "type": "Int" - }, - "type": "Map", - "value": { - "kind": 4, - "name": "map", - "required": true, - "type": "Int" - } - }, - "name": "map", - "required": true, - "type": "Map" - }, - { - "kind": 34, - "map": { - "array": { - "item": { - "kind": 4, - "name": "mapOfArr", - "required": true, - "type": "Int" - }, - "kind": 18, - "name": "mapOfArr", - "required": true, - "scalar": { - "kind": 4, - "name": "mapOfArr", - "required": true, - "type": "Int" - }, - "type": "[Int]" - }, - "key": { - "kind": 4, - "name": "mapOfArr", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "mapOfArr", - "required": true, - "type": "Map", - "value": { - "item": { - "kind": 4, - "name": "mapOfArr", - "required": true, - "type": "Int" - }, - "kind": 18, - "name": "mapOfArr", - "required": true, - "scalar": { - "kind": 4, - "name": "mapOfArr", - "required": true, - "type": "Int" - }, - "type": "[Int]" - } - }, - "name": "mapOfArr", - "required": true, - "type": "Map" - }, - { - "kind": 34, - "map": { - "key": { - "kind": 4, - "name": "mapOfMap", - "required": true, - "type": "String" - }, - "kind": 262146, - "map": { - "key": { - "kind": 4, - "name": "mapOfMap", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "mapOfMap", - "required": true, - "scalar": { - "kind": 4, - "name": "mapOfMap", - "required": true, - "type": "Int" - }, - "type": "Map", - "value": { - "kind": 4, - "name": "mapOfMap", - "required": true, - "type": "Int" - } - }, - "name": "mapOfMap", - "required": true, - "type": "Map>", - "value": { - "key": { - "kind": 4, - "name": "mapOfMap", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "mapOfMap", - "required": true, - "scalar": { - "kind": 4, - "name": "mapOfMap", - "required": true, - "type": "Int" - }, - "type": "Map", - "value": { - "kind": 4, - "name": "mapOfMap", - "required": true, - "type": "Int" - } - } - }, - "name": "mapOfMap", - "required": true, - "type": "Map>" - }, - { - "kind": 34, - "map": { - "key": { - "kind": 4, - "name": "mapOfObj", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "mapOfObj", - "object": { - "kind": 8192, - "name": "mapOfObj", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "Map", - "value": { - "kind": 8192, - "name": "mapOfObj", - "required": true, - "type": "AnotherType" - } - }, - "name": "mapOfObj", - "required": true, - "type": "Map" - }, - { - "kind": 34, - "map": { - "array": { - "item": { - "kind": 8192, - "name": "mapOfArrOfObj", - "required": true, - "type": "AnotherType" - }, - "kind": 18, - "name": "mapOfArrOfObj", - "object": { - "kind": 8192, - "name": "mapOfArrOfObj", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "[AnotherType]" - }, - "key": { - "kind": 4, - "name": "mapOfArrOfObj", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "mapOfArrOfObj", - "required": true, - "type": "Map", - "value": { - "item": { - "kind": 8192, - "name": "mapOfArrOfObj", - "required": true, - "type": "AnotherType" - }, - "kind": 18, - "name": "mapOfArrOfObj", - "object": { - "kind": 8192, - "name": "mapOfArrOfObj", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "[AnotherType]" - } - }, - "name": "mapOfArrOfObj", - "required": true, - "type": "Map" - } - ], - "kind": 64, - "name": "moduleMethod", - "required": true, - "return": { - "kind": 34, - "name": "moduleMethod", - "required": true, - "scalar": { - "kind": 4, - "name": "moduleMethod", - "required": true, - "type": "Int" - }, - "type": "Int" - }, - "type": "Method" - }, - { - "arguments": [ - { - "kind": 34, - "name": "object", - "object": { - "kind": 8192, - "name": "object", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "AnotherType" - }, - { - "kind": 34, - "name": "optObject", - "object": { - "kind": 8192, - "name": "optObject", - "type": "AnotherType" - }, - "type": "AnotherType" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "AnotherType" - }, - "kind": 18, - "name": "objectArray", - "object": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "[AnotherType]" - }, - "kind": 34, - "name": "objectArray", - "required": true, - "type": "[AnotherType]" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "optObjectArray", - "type": "AnotherType" - }, - "kind": 18, - "name": "optObjectArray", - "object": { - "kind": 8192, - "name": "optObjectArray", - "type": "AnotherType" - }, - "type": "[AnotherType]" - }, - "kind": 34, - "name": "optObjectArray", - "type": "[AnotherType]" - } - ], - "env": { - "required": true - }, - "kind": 64, - "name": "objectMethod", - "required": true, - "return": { - "kind": 34, - "name": "objectMethod", - "object": { - "kind": 8192, - "name": "objectMethod", - "type": "AnotherType" - }, - "type": "AnotherType" - }, - "type": "Method" - }, - { - "arguments": [ - { - "kind": 34, - "name": "object", - "object": { - "kind": 8192, - "name": "object", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "AnotherType" - }, - { - "kind": 34, - "name": "optObject", - "object": { - "kind": 8192, - "name": "optObject", - "type": "AnotherType" - }, - "type": "AnotherType" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "AnotherType" - }, - "kind": 18, - "name": "objectArray", - "object": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "[AnotherType]" - }, - "kind": 34, - "name": "objectArray", - "required": true, - "type": "[AnotherType]" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "optObjectArray", - "type": "AnotherType" - }, - "kind": 18, - "name": "optObjectArray", - "object": { - "kind": 8192, - "name": "optObjectArray", - "type": "AnotherType" - }, - "type": "[AnotherType]" - }, - "kind": 34, - "name": "optObjectArray", - "type": "[AnotherType]" - } - ], - "env": { - "required": false - }, - "kind": 64, - "name": "optionalEnvMethod", - "required": true, - "return": { - "kind": 34, - "name": "optionalEnvMethod", - "object": { - "kind": 8192, - "name": "optionalEnvMethod", - "type": "AnotherType" - }, - "type": "AnotherType" - }, - "type": "Method" - }, - { - "arguments": [ - { - "kind": 34, - "name": "if", - "object": { - "kind": 8192, - "name": "if", - "required": true, - "type": "else" - }, - "required": true, - "type": "else" - } - ], - "kind": 64, - "name": "if", - "required": true, - "return": { - "kind": 34, - "name": "if", - "object": { - "kind": 8192, - "name": "if", - "required": true, - "type": "else" - }, - "required": true, - "type": "else" - }, - "type": "Method" - } - ], - "type": "Module" - }, - "objectTypes": [ - { - "kind": 1, - "properties": [ - { - "kind": 34, - "name": "str", - "required": true, - "scalar": { - "kind": 4, - "name": "str", - "required": true, - "type": "String" - }, - "type": "String" - }, - { - "kind": 34, - "name": "optStr", - "scalar": { - "kind": 4, - "name": "optStr", - "type": "String" - }, - "type": "String" - }, - { - "kind": 34, - "name": "u", - "required": true, - "scalar": { - "kind": 4, - "name": "u", - "required": true, - "type": "UInt" - }, - "type": "UInt" - }, - { - "kind": 34, - "name": "optU", - "scalar": { - "kind": 4, - "name": "optU", - "type": "UInt" - }, - "type": "UInt" - }, - { - "kind": 34, - "name": "u8", - "required": true, - "scalar": { - "kind": 4, - "name": "u8", - "required": true, - "type": "UInt8" - }, - "type": "UInt8" - }, - { - "kind": 34, - "name": "u16", - "required": true, - "scalar": { - "kind": 4, - "name": "u16", - "required": true, - "type": "UInt16" - }, - "type": "UInt16" - }, - { - "kind": 34, - "name": "u32", - "required": true, - "scalar": { - "kind": 4, - "name": "u32", - "required": true, - "type": "UInt32" - }, - "type": "UInt32" - }, - { - "kind": 34, - "name": "i", - "required": true, - "scalar": { - "kind": 4, - "name": "i", - "required": true, - "type": "Int" - }, - "type": "Int" - }, - { - "kind": 34, - "name": "i8", - "required": true, - "scalar": { - "kind": 4, - "name": "i8", - "required": true, - "type": "Int8" - }, - "type": "Int8" - }, - { - "kind": 34, - "name": "i16", - "required": true, - "scalar": { - "kind": 4, - "name": "i16", - "required": true, - "type": "Int16" - }, - "type": "Int16" - }, - { - "kind": 34, - "name": "i32", - "required": true, - "scalar": { - "kind": 4, - "name": "i32", - "required": true, - "type": "Int32" - }, - "type": "Int32" - }, - { - "kind": 34, - "name": "bigint", - "required": true, - "scalar": { - "kind": 4, - "name": "bigint", - "required": true, - "type": "BigInt" - }, - "type": "BigInt" - }, - { - "kind": 34, - "name": "optBigint", - "scalar": { - "kind": 4, - "name": "optBigint", - "type": "BigInt" - }, - "type": "BigInt" - }, - { - "kind": 34, - "name": "bignumber", - "required": true, - "scalar": { - "kind": 4, - "name": "bignumber", - "required": true, - "type": "BigNumber" - }, - "type": "BigNumber" - }, - { - "kind": 34, - "name": "optBignumber", - "scalar": { - "kind": 4, - "name": "optBignumber", - "type": "BigNumber" - }, - "type": "BigNumber" - }, - { - "kind": 34, - "name": "json", - "required": true, - "scalar": { - "kind": 4, - "name": "json", - "required": true, - "type": "JSON" - }, - "type": "JSON" - }, - { - "kind": 34, - "name": "optJson", - "scalar": { - "kind": 4, - "name": "optJson", - "type": "JSON" - }, - "type": "JSON" - }, - { - "kind": 34, - "name": "bytes", - "required": true, - "scalar": { - "kind": 4, - "name": "bytes", - "required": true, - "type": "Bytes" - }, - "type": "Bytes" - }, - { - "kind": 34, - "name": "optBytes", - "scalar": { - "kind": 4, - "name": "optBytes", - "type": "Bytes" - }, - "type": "Bytes" - }, - { - "kind": 34, - "name": "boolean", - "required": true, - "scalar": { - "kind": 4, - "name": "boolean", - "required": true, - "type": "Boolean" - }, - "type": "Boolean" - }, - { - "kind": 34, - "name": "optBoolean", - "scalar": { - "kind": 4, - "name": "optBoolean", - "type": "Boolean" - }, - "type": "Boolean" - }, - { - "array": { - "item": { - "kind": 4, - "name": "u_array", - "required": true, - "type": "UInt" - }, - "kind": 18, - "name": "u_array", - "required": true, - "scalar": { - "kind": 4, - "name": "u_array", - "required": true, - "type": "UInt" - }, - "type": "[UInt]" - }, - "kind": 34, - "name": "u_array", - "required": true, - "type": "[UInt]" - }, - { - "array": { - "item": { - "kind": 4, - "name": "uOpt_array", - "required": true, - "type": "UInt" - }, - "kind": 18, - "name": "uOpt_array", - "scalar": { - "kind": 4, - "name": "uOpt_array", - "required": true, - "type": "UInt" - }, - "type": "[UInt]" - }, - "kind": 34, - "name": "uOpt_array", - "type": "[UInt]" - }, - { - "array": { - "item": { - "kind": 4, - "name": "_opt_uOptArray", - "type": "UInt" - }, - "kind": 18, - "name": "_opt_uOptArray", - "scalar": { - "kind": 4, - "name": "_opt_uOptArray", - "type": "UInt" - }, - "type": "[UInt]" - }, - "kind": 34, - "name": "_opt_uOptArray", - "type": "[UInt]" - }, - { - "array": { - "item": { - "kind": 4, - "name": "optStrOptArray", - "type": "String" - }, - "kind": 18, - "name": "optStrOptArray", - "scalar": { - "kind": 4, - "name": "optStrOptArray", - "type": "String" - }, - "type": "[String]" - }, - "kind": 34, - "name": "optStrOptArray", - "type": "[String]" - }, - { - "array": { - "array": { - "item": { - "kind": 4, - "name": "uArrayArray", - "required": true, - "type": "UInt" - }, - "kind": 18, - "name": "uArrayArray", - "required": true, - "scalar": { - "kind": 4, - "name": "uArrayArray", - "required": true, - "type": "UInt" - }, - "type": "[UInt]" - }, - "item": { - "item": { - "kind": 4, - "name": "uArrayArray", - "required": true, - "type": "UInt" - }, - "kind": 18, - "name": "uArrayArray", - "required": true, - "scalar": { - "kind": 4, - "name": "uArrayArray", - "required": true, - "type": "UInt" - }, - "type": "[UInt]" - }, - "kind": 18, - "name": "uArrayArray", - "required": true, - "type": "[[UInt]]" - }, - "kind": 34, - "name": "uArrayArray", - "required": true, - "type": "[[UInt]]" - }, - { - "array": { - "array": { - "item": { - "kind": 4, - "name": "uOptArrayOptArray", - "type": "UInt32" - }, - "kind": 18, - "name": "uOptArrayOptArray", - "scalar": { - "kind": 4, - "name": "uOptArrayOptArray", - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "item": { - "item": { - "kind": 4, - "name": "uOptArrayOptArray", - "type": "UInt32" - }, - "kind": 18, - "name": "uOptArrayOptArray", - "scalar": { - "kind": 4, - "name": "uOptArrayOptArray", - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "kind": 18, - "name": "uOptArrayOptArray", - "required": true, - "type": "[[UInt32]]" - }, - "kind": 34, - "name": "uOptArrayOptArray", - "required": true, - "type": "[[UInt32]]" - }, - { - "array": { - "array": { - "array": { - "item": { - "kind": 4, - "name": "uArrayOptArrayArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "uArrayOptArrayArray", - "required": true, - "scalar": { - "kind": 4, - "name": "uArrayOptArrayArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "item": { - "item": { - "kind": 4, - "name": "uArrayOptArrayArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "uArrayOptArrayArray", - "required": true, - "scalar": { - "kind": 4, - "name": "uArrayOptArrayArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "kind": 18, - "name": "uArrayOptArrayArray", - "type": "[[UInt32]]" - }, - "item": { - "array": { - "item": { - "kind": 4, - "name": "uArrayOptArrayArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "uArrayOptArrayArray", - "required": true, - "scalar": { - "kind": 4, - "name": "uArrayOptArrayArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "item": { - "item": { - "kind": 4, - "name": "uArrayOptArrayArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "uArrayOptArrayArray", - "required": true, - "scalar": { - "kind": 4, - "name": "uArrayOptArrayArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "kind": 18, - "name": "uArrayOptArrayArray", - "type": "[[UInt32]]" - }, - "kind": 18, - "name": "uArrayOptArrayArray", - "required": true, - "type": "[[[UInt32]]]" - }, - "kind": 34, - "name": "uArrayOptArrayArray", - "required": true, - "type": "[[[UInt32]]]" - }, - { - "array": { - "array": { - "array": { - "array": { - "item": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "crazyArray", - "scalar": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "item": { - "item": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "crazyArray", - "scalar": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "kind": 18, - "name": "crazyArray", - "required": true, - "type": "[[UInt32]]" - }, - "item": { - "array": { - "item": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "crazyArray", - "scalar": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "item": { - "item": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "crazyArray", - "scalar": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "kind": 18, - "name": "crazyArray", - "required": true, - "type": "[[UInt32]]" - }, - "kind": 18, - "name": "crazyArray", - "type": "[[[UInt32]]]" - }, - "item": { - "array": { - "array": { - "item": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "crazyArray", - "scalar": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "item": { - "item": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "crazyArray", - "scalar": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "kind": 18, - "name": "crazyArray", - "required": true, - "type": "[[UInt32]]" - }, - "item": { - "array": { - "item": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "crazyArray", - "scalar": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "item": { - "item": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "crazyArray", - "scalar": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "kind": 18, - "name": "crazyArray", - "required": true, - "type": "[[UInt32]]" - }, - "kind": 18, - "name": "crazyArray", - "type": "[[[UInt32]]]" - }, - "kind": 18, - "name": "crazyArray", - "type": "[[[[UInt32]]]]" - }, - "kind": 34, - "name": "crazyArray", - "type": "[[[[UInt32]]]]" - }, - { - "kind": 34, - "name": "object", - "object": { - "kind": 8192, - "name": "object", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "AnotherType" - }, - { - "kind": 34, - "name": "optObject", - "object": { - "kind": 8192, - "name": "optObject", - "type": "AnotherType" - }, - "type": "AnotherType" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "AnotherType" - }, - "kind": 18, - "name": "objectArray", - "object": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "[AnotherType]" - }, - "kind": 34, - "name": "objectArray", - "required": true, - "type": "[AnotherType]" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "optObjectArray", - "type": "AnotherType" - }, - "kind": 18, - "name": "optObjectArray", - "object": { - "kind": 8192, - "name": "optObjectArray", - "type": "AnotherType" - }, - "type": "[AnotherType]" - }, - "kind": 34, - "name": "optObjectArray", - "type": "[AnotherType]" - }, - { - "enum": { - "kind": 16384, - "name": "en", - "required": true, - "type": "CustomEnum" - }, - "kind": 34, - "name": "en", - "required": true, - "type": "CustomEnum" - }, - { - "enum": { - "kind": 16384, - "name": "optEnum", - "type": "CustomEnum" - }, - "kind": 34, - "name": "optEnum", - "type": "CustomEnum" - }, - { - "array": { - "enum": { - "kind": 16384, - "name": "enumArray", - "required": true, - "type": "CustomEnum" - }, - "item": { - "kind": 16384, - "name": "enumArray", - "required": true, - "type": "CustomEnum" - }, - "kind": 18, - "name": "enumArray", - "required": true, - "type": "[CustomEnum]" - }, - "kind": 34, - "name": "enumArray", - "required": true, - "type": "[CustomEnum]" - }, - { - "array": { - "enum": { - "kind": 16384, - "name": "optEnumArray", - "type": "CustomEnum" - }, - "item": { - "kind": 16384, - "name": "optEnumArray", - "type": "CustomEnum" - }, - "kind": 18, - "name": "optEnumArray", - "type": "[CustomEnum]" - }, - "kind": 34, - "name": "optEnumArray", - "type": "[CustomEnum]" - }, - { - "kind": 34, - "map": { - "key": { - "kind": 4, - "name": "map", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "map", - "required": true, - "scalar": { - "kind": 4, - "name": "map", - "required": true, - "type": "Int" - }, - "type": "Map", - "value": { - "kind": 4, - "name": "map", - "required": true, - "type": "Int" - } - }, - "name": "map", - "required": true, - "type": "Map" - }, - { - "kind": 34, - "map": { - "array": { - "item": { - "kind": 4, - "name": "mapOfArr", - "required": true, - "type": "Int" - }, - "kind": 18, - "name": "mapOfArr", - "required": true, - "scalar": { - "kind": 4, - "name": "mapOfArr", - "required": true, - "type": "Int" - }, - "type": "[Int]" - }, - "key": { - "kind": 4, - "name": "mapOfArr", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "mapOfArr", - "required": true, - "type": "Map", - "value": { - "item": { - "kind": 4, - "name": "mapOfArr", - "required": true, - "type": "Int" - }, - "kind": 18, - "name": "mapOfArr", - "required": true, - "scalar": { - "kind": 4, - "name": "mapOfArr", - "required": true, - "type": "Int" - }, - "type": "[Int]" - } - }, - "name": "mapOfArr", - "required": true, - "type": "Map" - }, - { - "kind": 34, - "map": { - "key": { - "kind": 4, - "name": "mapOfObj", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "mapOfObj", - "object": { - "kind": 8192, - "name": "mapOfObj", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "Map", - "value": { - "kind": 8192, - "name": "mapOfObj", - "required": true, - "type": "AnotherType" - } - }, - "name": "mapOfObj", - "required": true, - "type": "Map" - }, - { - "kind": 34, - "map": { - "array": { - "item": { - "kind": 8192, - "name": "mapOfArrOfObj", - "required": true, - "type": "AnotherType" - }, - "kind": 18, - "name": "mapOfArrOfObj", - "object": { - "kind": 8192, - "name": "mapOfArrOfObj", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "[AnotherType]" - }, - "key": { - "kind": 4, - "name": "mapOfArrOfObj", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "mapOfArrOfObj", - "required": true, - "type": "Map", - "value": { - "item": { - "kind": 8192, - "name": "mapOfArrOfObj", - "required": true, - "type": "AnotherType" - }, - "kind": 18, - "name": "mapOfArrOfObj", - "object": { - "kind": 8192, - "name": "mapOfArrOfObj", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "[AnotherType]" - } - }, - "name": "mapOfArrOfObj", - "required": true, - "type": "Map" - }, - { - "kind": 34, - "map": { - "key": { - "kind": 4, - "name": "mapCustomValue", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "mapCustomValue", - "object": { - "kind": 8192, - "name": "mapCustomValue", - "type": "CustomMapValue" - }, - "required": true, - "type": "Map", - "value": { - "kind": 8192, - "name": "mapCustomValue", - "type": "CustomMapValue" - } - }, - "name": "mapCustomValue", - "required": true, - "type": "Map" - } - ], - "type": "CustomType" - }, - { - "kind": 1, - "properties": [ - { - "kind": 34, - "name": "prop", - "scalar": { - "kind": 4, - "name": "prop", - "type": "String" - }, - "type": "String" - }, - { - "kind": 34, - "name": "circular", - "object": { - "kind": 8192, - "name": "circular", - "type": "CustomType" - }, - "type": "CustomType" - }, - { - "kind": 34, - "name": "const", - "scalar": { - "kind": 4, - "name": "const", - "type": "String" - }, - "type": "String" - } - ], - "type": "AnotherType" - }, - { - "kind": 1, - "properties": [ - { - "kind": 34, - "name": "foo", - "required": true, - "scalar": { - "kind": 4, - "name": "foo", - "required": true, - "type": "String" - }, - "type": "String" - } - ], - "type": "CustomMapValue" - }, - { - "kind": 1, - "properties": [ - { - "kind": 34, - "name": "else", - "required": true, - "scalar": { - "kind": 4, - "name": "else", - "required": true, - "type": "String" - }, - "type": "String" - } - ], - "type": "else" - } - ], - "version": "0.1" -} -""") - -manifest = WrapManifest.parse_obj({ - "name": "Test", - "type": "plugin", - "version": "0.1", - "abi": abi, -}) diff --git a/packages/test-cases/cases/bind/sanity/output/plugin-rs/mod.rs b/packages/test-cases/cases/bind/sanity/output/plugin-rs/mod.rs deleted file mode 100644 index 88b7de7bdf..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/plugin-rs/mod.rs +++ /dev/null @@ -1,7 +0,0 @@ -/// NOTE: This is an auto-generated file. -/// All modifications will be overwritten. - -pub mod types; -#[path = "wrap.info.rs"] -pub mod wrap_info; -pub mod module; \ No newline at end of file diff --git a/packages/test-cases/cases/bind/sanity/output/plugin-rs/module.rs b/packages/test-cases/cases/bind/sanity/output/plugin-rs/module.rs deleted file mode 100644 index db0deb7938..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/plugin-rs/module.rs +++ /dev/null @@ -1,69 +0,0 @@ -/// NOTE: This is an auto-generated file. -/// All modifications will be overwritten. - -use std::sync::Arc; -use polywrap_core::invoke::Invoker; -use polywrap_plugin::{error::PluginError, module::PluginModule}; -use serde::{Serialize, Deserialize}; -use super::types::*; - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct ArgsModuleMethod { - pub str: String, - #[serde(rename = "optStr")] - pub opt_str: Option, - pub en: CustomEnum, - #[serde(rename = "optEnum")] - pub opt_enum: Option, - #[serde(rename = "enumArray")] - pub enum_array: Vec, - #[serde(rename = "optEnumArray")] - pub opt_enum_array: Option>>, - pub map: Map, - #[serde(rename = "mapOfArr")] - pub map_of_arr: Map>, - #[serde(rename = "mapOfMap")] - pub map_of_map: Map>, - #[serde(rename = "mapOfObj")] - pub map_of_obj: Map, - #[serde(rename = "mapOfArrOfObj")] - pub map_of_arr_of_obj: Map>, -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct ArgsObjectMethod { - pub object: AnotherType, - #[serde(rename = "optObject")] - pub opt_object: Option, - #[serde(rename = "objectArray")] - pub object_array: Vec, - #[serde(rename = "optObjectArray")] - pub opt_object_array: Option>>, -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct ArgsOptionalEnvMethod { - pub object: AnotherType, - #[serde(rename = "optObject")] - pub opt_object: Option, - #[serde(rename = "objectArray")] - pub object_array: Vec, - #[serde(rename = "optObjectArray")] - pub opt_object_array: Option>>, -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct ArgsIf { - #[serde(rename = "if")] - pub _if: Else, -} - -pub trait Module: PluginModule { - fn module_method(&mut self, args: &ArgsModuleMethod, invoker: Arc) -> Result; - - fn object_method(&mut self, args: &ArgsObjectMethod, invoker: Arc, env: Env) -> Result, PluginError>; - - fn optional_env_method(&mut self, args: &ArgsOptionalEnvMethod, invoker: Arc, env: Option) -> Result, PluginError>; - - fn _if(&mut self, args: &ArgsIf, invoker: Arc) -> Result; -} diff --git a/packages/test-cases/cases/bind/sanity/output/plugin-rs/types.rs b/packages/test-cases/cases/bind/sanity/output/plugin-rs/types.rs deleted file mode 100644 index fe3c18556b..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/plugin-rs/types.rs +++ /dev/null @@ -1,289 +0,0 @@ -#![allow(unused_imports)] -#![allow(non_camel_case_types)] - -// NOTE: This is an auto-generated file. -// All modifications will be overwritten. -use polywrap_core::{invoke::Invoker, uri::Uri}; -use polywrap_msgpack::{decode, serialize}; -use polywrap_plugin::{error::PluginError, BigInt, BigNumber, Map, JSON}; -use serde::{Serialize, Deserialize}; -use std::sync::Arc; - -// Env START // - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct Env { - pub prop: String, - #[serde(rename = "optProp")] - pub opt_prop: Option, - #[serde(rename = "optMap")] - pub opt_map: Option>>, -} -// Env END // - -// Objects START // - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct CustomType { - pub str: String, - #[serde(rename = "optStr")] - pub opt_str: Option, - pub u: u32, - #[serde(rename = "optU")] - pub opt_u: Option, - pub u8: u8, - pub u16: u16, - pub u32: u32, - pub i: i32, - pub i8: i8, - pub i16: i16, - pub i32: i32, - pub bigint: BigInt, - #[serde(rename = "optBigint")] - pub opt_bigint: Option, - pub bignumber: BigNumber, - #[serde(rename = "optBignumber")] - pub opt_bignumber: Option, - pub json: JSON::Value, - #[serde(rename = "optJson")] - pub opt_json: Option, - #[serde(with = "serde_bytes")] - pub bytes: Vec, - #[serde(with = "serde_bytes")] - #[serde(rename = "optBytes")] - pub opt_bytes: Option>, - pub boolean: bool, - #[serde(rename = "optBoolean")] - pub opt_boolean: Option, - pub u_array: Vec, - #[serde(rename = "uOpt_array")] - pub u_opt_array: Option>, - #[serde(rename = "_opt_uOptArray")] - pub _opt_u_opt_array: Option>>, - #[serde(rename = "optStrOptArray")] - pub opt_str_opt_array: Option>>, - #[serde(rename = "uArrayArray")] - pub u_array_array: Vec>, - #[serde(rename = "uOptArrayOptArray")] - pub u_opt_array_opt_array: Vec>>>, - #[serde(rename = "uArrayOptArrayArray")] - pub u_array_opt_array_array: Vec>>>, - #[serde(rename = "crazyArray")] - pub crazy_array: Option>>>>>>, - pub object: AnotherType, - #[serde(rename = "optObject")] - pub opt_object: Option, - #[serde(rename = "objectArray")] - pub object_array: Vec, - #[serde(rename = "optObjectArray")] - pub opt_object_array: Option>>, - pub en: CustomEnum, - #[serde(rename = "optEnum")] - pub opt_enum: Option, - #[serde(rename = "enumArray")] - pub enum_array: Vec, - #[serde(rename = "optEnumArray")] - pub opt_enum_array: Option>>, - pub map: Map, - #[serde(rename = "mapOfArr")] - pub map_of_arr: Map>, - #[serde(rename = "mapOfObj")] - pub map_of_obj: Map, - #[serde(rename = "mapOfArrOfObj")] - pub map_of_arr_of_obj: Map>, - #[serde(rename = "mapCustomValue")] - pub map_custom_value: Map>, -} -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct AnotherType { - pub prop: Option, - pub circular: Option, - #[serde(rename = "const")] - pub _const: Option, -} -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct CustomMapValue { - pub foo: String, -} -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct Else { - #[serde(rename = "else")] - pub _else: String, -} -// Objects END // - -// Enums START // - -#[derive(Clone, Copy, Debug, Deserialize, Serialize)] -pub enum CustomEnum { - STRING, - BYTES, - _MAX_ -} -#[derive(Clone, Copy, Debug, Deserialize, Serialize)] -pub enum While { - _for, - _in, - _MAX_ -} -// Enums END // - -// Imported objects START // - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct TestImportObject { - pub object: TestImportAnotherObject, - #[serde(rename = "optObject")] - pub opt_object: Option, - #[serde(rename = "objectArray")] - pub object_array: Vec, - #[serde(rename = "optObjectArray")] - pub opt_object_array: Option>>, - pub en: TestImportEnum, - #[serde(rename = "optEnum")] - pub opt_enum: Option, - #[serde(rename = "enumArray")] - pub enum_array: Vec, - #[serde(rename = "optEnumArray")] - pub opt_enum_array: Option>>, -} -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct TestImportAnotherObject { - pub prop: String, -} -// Imported objects END // - -// Imported envs START // - -// Imported envs END // - -// Imported enums START // - -#[derive(Clone, Copy, Debug, Deserialize, Serialize)] -pub enum TestImportEnum { - STRING, - BYTES, - _MAX_ -} -#[derive(Clone, Copy, Debug, Deserialize, Serialize)] -pub enum TestImportEnumReturn { - STRING, - BYTES, - _MAX_ -} -// Imported enums END // - -// Imported Modules START // - -// URI: "testimport.uri.eth" // -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct TestImportModuleArgsImportedMethod { - pub str: String, - #[serde(rename = "optStr")] - pub opt_str: Option, - pub u: u32, - #[serde(rename = "optU")] - pub opt_u: Option, - #[serde(rename = "uArrayArray")] - pub u_array_array: Vec>>>, - pub object: TestImportObject, - #[serde(rename = "optObject")] - pub opt_object: Option, - #[serde(rename = "objectArray")] - pub object_array: Vec, - #[serde(rename = "optObjectArray")] - pub opt_object_array: Option>>, - pub en: TestImportEnum, - #[serde(rename = "optEnum")] - pub opt_enum: Option, - #[serde(rename = "enumArray")] - pub enum_array: Vec, - #[serde(rename = "optEnumArray")] - pub opt_enum_array: Option>>, -} - -// URI: "testimport.uri.eth" // -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct TestImportModuleArgsAnotherMethod { - pub arg: Vec, -} - -// URI: "testimport.uri.eth" // -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct TestImportModuleArgsReturnsArrayOfEnums { - pub arg: String, -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct TestImportModule<'a> { - uri: &'a str -} - -impl<'a> TestImportModule<'a> { - pub const INTERFACE_URI: &'static str = "testimport.uri.eth"; - - pub fn new(uri: &'a str) -> TestImportModule<'a> { - TestImportModule { uri: uri } - } - - pub fn imported_method(&self, args: &TestImportModuleArgsImportedMethod) -> Result, PluginError> { - let uri = self.uri; - let serialized_args = serialize(args.clone()).unwrap(); - let result = invoker.invoke_raw( - uri, - "importedMethod", - serialized_args, - None, - None - ) - .map_err(|e| PluginError::SubinvocationError { - uri: uri.to_string(), - method: "importedMethod".to_string(), - args: JSON::to_string(&args).unwrap(), - exception: e.to_string(), - })?; - - Ok(Some(decode(result.as_slice())?)) - } - - pub fn another_method(&self, args: &TestImportModuleArgsAnotherMethod) -> Result { - let uri = self.uri; - let serialized_args = serialize(args.clone()).unwrap(); - let result = invoker.invoke_raw( - uri, - "anotherMethod", - serialized_args, - None, - None - ) - .map_err(|e| PluginError::SubinvocationError { - uri: uri.to_string(), - method: "anotherMethod".to_string(), - args: JSON::to_string(&args).unwrap(), - exception: e.to_string(), - })?; - - Ok(decode(result.as_slice())?) - } - - pub fn returns_array_of_enums(&self, args: &TestImportModuleArgsReturnsArrayOfEnums) -> Result>, PluginError> { - let uri = self.uri; - let serialized_args = serialize(args.clone()).unwrap(); - let result = invoker.invoke_raw( - uri, - "returnsArrayOfEnums", - serialized_args, - None, - None - ) - .map_err(|e| PluginError::SubinvocationError { - uri: uri.to_string(), - method: "returnsArrayOfEnums".to_string(), - args: JSON::to_string(&args).unwrap(), - exception: e.to_string(), - })?; - - Ok(decode(result.as_slice())?) - } -} -// Imported Modules END // diff --git a/packages/test-cases/cases/bind/sanity/output/plugin-rs/wrap.info.rs b/packages/test-cases/cases/bind/sanity/output/plugin-rs/wrap.info.rs deleted file mode 100644 index a7fab1e26d..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/plugin-rs/wrap.info.rs +++ /dev/null @@ -1,2436 +0,0 @@ -/// NOTE: This is an auto-generated file. -/// All modifications will be overwritten. -use polywrap_plugin::JSON::{from_value, json}; -use wrap_manifest_schemas::versions::{WrapManifest, WrapManifestAbi}; - -pub fn get_manifest() -> WrapManifest { - WrapManifest { - name: "Test".to_string(), - type_: "plugin".to_string(), - version: "0.1".to_string(), - abi: from_value::(json!({ - "enumTypes": [ - { - "constants": [ - "STRING", - "BYTES" - ], - "kind": 8, - "type": "CustomEnum" - }, - { - "constants": [ - "for", - "in" - ], - "kind": 8, - "type": "while" - } - ], - "envType": { - "kind": 65536, - "properties": [ - { - "kind": 34, - "name": "prop", - "required": true, - "scalar": { - "kind": 4, - "name": "prop", - "required": true, - "type": "String" - }, - "type": "String" - }, - { - "kind": 34, - "name": "optProp", - "scalar": { - "kind": 4, - "name": "optProp", - "type": "String" - }, - "type": "String" - }, - { - "kind": 34, - "map": { - "key": { - "kind": 4, - "name": "optMap", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "optMap", - "scalar": { - "kind": 4, - "name": "optMap", - "type": "Int" - }, - "type": "Map", - "value": { - "kind": 4, - "name": "optMap", - "type": "Int" - } - }, - "name": "optMap", - "type": "Map" - } - ], - "type": "Env" - }, - "importedEnumTypes": [ - { - "constants": [ - "STRING", - "BYTES" - ], - "kind": 520, - "namespace": "TestImport", - "nativeType": "Enum", - "type": "TestImport_Enum", - "uri": "testimport.uri.eth" - }, - { - "constants": [ - "STRING", - "BYTES" - ], - "kind": 520, - "namespace": "TestImport", - "nativeType": "Enum", - "type": "TestImport_Enum_Return", - "uri": "testimport.uri.eth" - } - ], - "importedEnvTypes": [ - { - "kind": 524288, - "namespace": "TestImport", - "nativeType": "Env", - "properties": [ - { - "kind": 34, - "name": "object", - "object": { - "kind": 8192, - "name": "object", - "required": true, - "type": "TestImport_AnotherObject" - }, - "required": true, - "type": "TestImport_AnotherObject" - }, - { - "kind": 34, - "name": "optObject", - "object": { - "kind": 8192, - "name": "optObject", - "type": "TestImport_AnotherObject" - }, - "type": "TestImport_AnotherObject" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "TestImport_AnotherObject" - }, - "kind": 18, - "name": "objectArray", - "object": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "TestImport_AnotherObject" - }, - "required": true, - "type": "[TestImport_AnotherObject]" - }, - "kind": 34, - "name": "objectArray", - "required": true, - "type": "[TestImport_AnotherObject]" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "optObjectArray", - "type": "TestImport_AnotherObject" - }, - "kind": 18, - "name": "optObjectArray", - "object": { - "kind": 8192, - "name": "optObjectArray", - "type": "TestImport_AnotherObject" - }, - "type": "[TestImport_AnotherObject]" - }, - "kind": 34, - "name": "optObjectArray", - "type": "[TestImport_AnotherObject]" - }, - { - "enum": { - "kind": 16384, - "name": "en", - "required": true, - "type": "TestImport_Enum" - }, - "kind": 34, - "name": "en", - "required": true, - "type": "TestImport_Enum" - }, - { - "enum": { - "kind": 16384, - "name": "optEnum", - "type": "TestImport_Enum" - }, - "kind": 34, - "name": "optEnum", - "type": "TestImport_Enum" - }, - { - "array": { - "enum": { - "kind": 16384, - "name": "enumArray", - "required": true, - "type": "TestImport_Enum" - }, - "item": { - "kind": 16384, - "name": "enumArray", - "required": true, - "type": "TestImport_Enum" - }, - "kind": 18, - "name": "enumArray", - "required": true, - "type": "[TestImport_Enum]" - }, - "kind": 34, - "name": "enumArray", - "required": true, - "type": "[TestImport_Enum]" - }, - { - "array": { - "enum": { - "kind": 16384, - "name": "optEnumArray", - "type": "TestImport_Enum" - }, - "item": { - "kind": 16384, - "name": "optEnumArray", - "type": "TestImport_Enum" - }, - "kind": 18, - "name": "optEnumArray", - "type": "[TestImport_Enum]" - }, - "kind": 34, - "name": "optEnumArray", - "type": "[TestImport_Enum]" - } - ], - "type": "TestImport_Env", - "uri": "testimport.uri.eth" - } - ], - "importedModuleTypes": [ - { - "isInterface": true, - "kind": 256, - "methods": [ - { - "arguments": [ - { - "kind": 34, - "name": "str", - "required": true, - "scalar": { - "kind": 4, - "name": "str", - "required": true, - "type": "String" - }, - "type": "String" - }, - { - "kind": 34, - "name": "optStr", - "scalar": { - "kind": 4, - "name": "optStr", - "type": "String" - }, - "type": "String" - }, - { - "kind": 34, - "name": "u", - "required": true, - "scalar": { - "kind": 4, - "name": "u", - "required": true, - "type": "UInt" - }, - "type": "UInt" - }, - { - "kind": 34, - "name": "optU", - "scalar": { - "kind": 4, - "name": "optU", - "type": "UInt" - }, - "type": "UInt" - }, - { - "array": { - "array": { - "item": { - "kind": 4, - "name": "uArrayArray", - "type": "UInt" - }, - "kind": 18, - "name": "uArrayArray", - "scalar": { - "kind": 4, - "name": "uArrayArray", - "type": "UInt" - }, - "type": "[UInt]" - }, - "item": { - "item": { - "kind": 4, - "name": "uArrayArray", - "type": "UInt" - }, - "kind": 18, - "name": "uArrayArray", - "scalar": { - "kind": 4, - "name": "uArrayArray", - "type": "UInt" - }, - "type": "[UInt]" - }, - "kind": 18, - "name": "uArrayArray", - "required": true, - "type": "[[UInt]]" - }, - "kind": 34, - "name": "uArrayArray", - "required": true, - "type": "[[UInt]]" - }, - { - "kind": 34, - "name": "object", - "object": { - "kind": 8192, - "name": "object", - "required": true, - "type": "TestImport_Object" - }, - "required": true, - "type": "TestImport_Object" - }, - { - "kind": 34, - "name": "optObject", - "object": { - "kind": 8192, - "name": "optObject", - "type": "TestImport_Object" - }, - "type": "TestImport_Object" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "TestImport_Object" - }, - "kind": 18, - "name": "objectArray", - "object": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "TestImport_Object" - }, - "required": true, - "type": "[TestImport_Object]" - }, - "kind": 34, - "name": "objectArray", - "required": true, - "type": "[TestImport_Object]" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "optObjectArray", - "type": "TestImport_Object" - }, - "kind": 18, - "name": "optObjectArray", - "object": { - "kind": 8192, - "name": "optObjectArray", - "type": "TestImport_Object" - }, - "type": "[TestImport_Object]" - }, - "kind": 34, - "name": "optObjectArray", - "type": "[TestImport_Object]" - }, - { - "enum": { - "kind": 16384, - "name": "en", - "required": true, - "type": "TestImport_Enum" - }, - "kind": 34, - "name": "en", - "required": true, - "type": "TestImport_Enum" - }, - { - "enum": { - "kind": 16384, - "name": "optEnum", - "type": "TestImport_Enum" - }, - "kind": 34, - "name": "optEnum", - "type": "TestImport_Enum" - }, - { - "array": { - "enum": { - "kind": 16384, - "name": "enumArray", - "required": true, - "type": "TestImport_Enum" - }, - "item": { - "kind": 16384, - "name": "enumArray", - "required": true, - "type": "TestImport_Enum" - }, - "kind": 18, - "name": "enumArray", - "required": true, - "type": "[TestImport_Enum]" - }, - "kind": 34, - "name": "enumArray", - "required": true, - "type": "[TestImport_Enum]" - }, - { - "array": { - "enum": { - "kind": 16384, - "name": "optEnumArray", - "type": "TestImport_Enum" - }, - "item": { - "kind": 16384, - "name": "optEnumArray", - "type": "TestImport_Enum" - }, - "kind": 18, - "name": "optEnumArray", - "type": "[TestImport_Enum]" - }, - "kind": 34, - "name": "optEnumArray", - "type": "[TestImport_Enum]" - } - ], - "env": { - "required": true - }, - "kind": 64, - "name": "importedMethod", - "required": true, - "return": { - "kind": 34, - "name": "importedMethod", - "object": { - "kind": 8192, - "name": "importedMethod", - "type": "TestImport_Object" - }, - "type": "TestImport_Object" - }, - "type": "Method" - }, - { - "arguments": [ - { - "array": { - "item": { - "kind": 4, - "name": "arg", - "required": true, - "type": "String" - }, - "kind": 18, - "name": "arg", - "required": true, - "scalar": { - "kind": 4, - "name": "arg", - "required": true, - "type": "String" - }, - "type": "[String]" - }, - "kind": 34, - "name": "arg", - "required": true, - "type": "[String]" - } - ], - "kind": 64, - "name": "anotherMethod", - "required": true, - "return": { - "kind": 34, - "name": "anotherMethod", - "required": true, - "scalar": { - "kind": 4, - "name": "anotherMethod", - "required": true, - "type": "Int32" - }, - "type": "Int32" - }, - "type": "Method" - }, - { - "arguments": [ - { - "kind": 34, - "name": "arg", - "required": true, - "scalar": { - "kind": 4, - "name": "arg", - "required": true, - "type": "String" - }, - "type": "String" - } - ], - "kind": 64, - "name": "returnsArrayOfEnums", - "required": true, - "return": { - "array": { - "enum": { - "kind": 16384, - "name": "returnsArrayOfEnums", - "type": "TestImport_Enum_Return" - }, - "item": { - "kind": 16384, - "name": "returnsArrayOfEnums", - "type": "TestImport_Enum_Return" - }, - "kind": 18, - "name": "returnsArrayOfEnums", - "required": true, - "type": "[TestImport_Enum_Return]" - }, - "kind": 34, - "name": "returnsArrayOfEnums", - "required": true, - "type": "[TestImport_Enum_Return]" - }, - "type": "Method" - } - ], - "namespace": "TestImport", - "nativeType": "Module", - "type": "TestImport_Module", - "uri": "testimport.uri.eth" - } - ], - "importedObjectTypes": [ - { - "kind": 1025, - "namespace": "TestImport", - "nativeType": "Object", - "properties": [ - { - "kind": 34, - "name": "object", - "object": { - "kind": 8192, - "name": "object", - "required": true, - "type": "TestImport_AnotherObject" - }, - "required": true, - "type": "TestImport_AnotherObject" - }, - { - "kind": 34, - "name": "optObject", - "object": { - "kind": 8192, - "name": "optObject", - "type": "TestImport_AnotherObject" - }, - "type": "TestImport_AnotherObject" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "TestImport_AnotherObject" - }, - "kind": 18, - "name": "objectArray", - "object": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "TestImport_AnotherObject" - }, - "required": true, - "type": "[TestImport_AnotherObject]" - }, - "kind": 34, - "name": "objectArray", - "required": true, - "type": "[TestImport_AnotherObject]" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "optObjectArray", - "type": "TestImport_AnotherObject" - }, - "kind": 18, - "name": "optObjectArray", - "object": { - "kind": 8192, - "name": "optObjectArray", - "type": "TestImport_AnotherObject" - }, - "type": "[TestImport_AnotherObject]" - }, - "kind": 34, - "name": "optObjectArray", - "type": "[TestImport_AnotherObject]" - }, - { - "enum": { - "kind": 16384, - "name": "en", - "required": true, - "type": "TestImport_Enum" - }, - "kind": 34, - "name": "en", - "required": true, - "type": "TestImport_Enum" - }, - { - "enum": { - "kind": 16384, - "name": "optEnum", - "type": "TestImport_Enum" - }, - "kind": 34, - "name": "optEnum", - "type": "TestImport_Enum" - }, - { - "array": { - "enum": { - "kind": 16384, - "name": "enumArray", - "required": true, - "type": "TestImport_Enum" - }, - "item": { - "kind": 16384, - "name": "enumArray", - "required": true, - "type": "TestImport_Enum" - }, - "kind": 18, - "name": "enumArray", - "required": true, - "type": "[TestImport_Enum]" - }, - "kind": 34, - "name": "enumArray", - "required": true, - "type": "[TestImport_Enum]" - }, - { - "array": { - "enum": { - "kind": 16384, - "name": "optEnumArray", - "type": "TestImport_Enum" - }, - "item": { - "kind": 16384, - "name": "optEnumArray", - "type": "TestImport_Enum" - }, - "kind": 18, - "name": "optEnumArray", - "type": "[TestImport_Enum]" - }, - "kind": 34, - "name": "optEnumArray", - "type": "[TestImport_Enum]" - } - ], - "type": "TestImport_Object", - "uri": "testimport.uri.eth" - }, - { - "kind": 1025, - "namespace": "TestImport", - "nativeType": "AnotherObject", - "properties": [ - { - "kind": 34, - "name": "prop", - "required": true, - "scalar": { - "kind": 4, - "name": "prop", - "required": true, - "type": "String" - }, - "type": "String" - } - ], - "type": "TestImport_AnotherObject", - "uri": "testimport.uri.eth" - } - ], - "interfaceTypes": [ - { - "capabilities": { - "getImplementations": { - "enabled": true - } - }, - "kind": 32768, - "namespace": "TestImport", - "nativeType": "Interface", - "type": "TestImport", - "uri": "testimport.uri.eth" - } - ], - "moduleType": { - "imports": [ - { - "type": "TestImport_Module" - }, - { - "type": "TestImport_Object" - }, - { - "type": "TestImport_AnotherObject" - }, - { - "type": "TestImport_Enum" - }, - { - "type": "TestImport_Enum_Return" - } - ], - "kind": 128, - "methods": [ - { - "arguments": [ - { - "kind": 34, - "name": "str", - "required": true, - "scalar": { - "kind": 4, - "name": "str", - "required": true, - "type": "String" - }, - "type": "String" - }, - { - "kind": 34, - "name": "optStr", - "scalar": { - "kind": 4, - "name": "optStr", - "type": "String" - }, - "type": "String" - }, - { - "enum": { - "kind": 16384, - "name": "en", - "required": true, - "type": "CustomEnum" - }, - "kind": 34, - "name": "en", - "required": true, - "type": "CustomEnum" - }, - { - "enum": { - "kind": 16384, - "name": "optEnum", - "type": "CustomEnum" - }, - "kind": 34, - "name": "optEnum", - "type": "CustomEnum" - }, - { - "array": { - "enum": { - "kind": 16384, - "name": "enumArray", - "required": true, - "type": "CustomEnum" - }, - "item": { - "kind": 16384, - "name": "enumArray", - "required": true, - "type": "CustomEnum" - }, - "kind": 18, - "name": "enumArray", - "required": true, - "type": "[CustomEnum]" - }, - "kind": 34, - "name": "enumArray", - "required": true, - "type": "[CustomEnum]" - }, - { - "array": { - "enum": { - "kind": 16384, - "name": "optEnumArray", - "type": "CustomEnum" - }, - "item": { - "kind": 16384, - "name": "optEnumArray", - "type": "CustomEnum" - }, - "kind": 18, - "name": "optEnumArray", - "type": "[CustomEnum]" - }, - "kind": 34, - "name": "optEnumArray", - "type": "[CustomEnum]" - }, - { - "kind": 34, - "map": { - "key": { - "kind": 4, - "name": "map", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "map", - "required": true, - "scalar": { - "kind": 4, - "name": "map", - "required": true, - "type": "Int" - }, - "type": "Map", - "value": { - "kind": 4, - "name": "map", - "required": true, - "type": "Int" - } - }, - "name": "map", - "required": true, - "type": "Map" - }, - { - "kind": 34, - "map": { - "array": { - "item": { - "kind": 4, - "name": "mapOfArr", - "required": true, - "type": "Int" - }, - "kind": 18, - "name": "mapOfArr", - "required": true, - "scalar": { - "kind": 4, - "name": "mapOfArr", - "required": true, - "type": "Int" - }, - "type": "[Int]" - }, - "key": { - "kind": 4, - "name": "mapOfArr", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "mapOfArr", - "required": true, - "type": "Map", - "value": { - "item": { - "kind": 4, - "name": "mapOfArr", - "required": true, - "type": "Int" - }, - "kind": 18, - "name": "mapOfArr", - "required": true, - "scalar": { - "kind": 4, - "name": "mapOfArr", - "required": true, - "type": "Int" - }, - "type": "[Int]" - } - }, - "name": "mapOfArr", - "required": true, - "type": "Map" - }, - { - "kind": 34, - "map": { - "key": { - "kind": 4, - "name": "mapOfMap", - "required": true, - "type": "String" - }, - "kind": 262146, - "map": { - "key": { - "kind": 4, - "name": "mapOfMap", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "mapOfMap", - "required": true, - "scalar": { - "kind": 4, - "name": "mapOfMap", - "required": true, - "type": "Int" - }, - "type": "Map", - "value": { - "kind": 4, - "name": "mapOfMap", - "required": true, - "type": "Int" - } - }, - "name": "mapOfMap", - "required": true, - "type": "Map>", - "value": { - "key": { - "kind": 4, - "name": "mapOfMap", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "mapOfMap", - "required": true, - "scalar": { - "kind": 4, - "name": "mapOfMap", - "required": true, - "type": "Int" - }, - "type": "Map", - "value": { - "kind": 4, - "name": "mapOfMap", - "required": true, - "type": "Int" - } - } - }, - "name": "mapOfMap", - "required": true, - "type": "Map>" - }, - { - "kind": 34, - "map": { - "key": { - "kind": 4, - "name": "mapOfObj", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "mapOfObj", - "object": { - "kind": 8192, - "name": "mapOfObj", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "Map", - "value": { - "kind": 8192, - "name": "mapOfObj", - "required": true, - "type": "AnotherType" - } - }, - "name": "mapOfObj", - "required": true, - "type": "Map" - }, - { - "kind": 34, - "map": { - "array": { - "item": { - "kind": 8192, - "name": "mapOfArrOfObj", - "required": true, - "type": "AnotherType" - }, - "kind": 18, - "name": "mapOfArrOfObj", - "object": { - "kind": 8192, - "name": "mapOfArrOfObj", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "[AnotherType]" - }, - "key": { - "kind": 4, - "name": "mapOfArrOfObj", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "mapOfArrOfObj", - "required": true, - "type": "Map", - "value": { - "item": { - "kind": 8192, - "name": "mapOfArrOfObj", - "required": true, - "type": "AnotherType" - }, - "kind": 18, - "name": "mapOfArrOfObj", - "object": { - "kind": 8192, - "name": "mapOfArrOfObj", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "[AnotherType]" - } - }, - "name": "mapOfArrOfObj", - "required": true, - "type": "Map" - } - ], - "kind": 64, - "name": "moduleMethod", - "required": true, - "return": { - "kind": 34, - "name": "moduleMethod", - "required": true, - "scalar": { - "kind": 4, - "name": "moduleMethod", - "required": true, - "type": "Int" - }, - "type": "Int" - }, - "type": "Method" - }, - { - "arguments": [ - { - "kind": 34, - "name": "object", - "object": { - "kind": 8192, - "name": "object", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "AnotherType" - }, - { - "kind": 34, - "name": "optObject", - "object": { - "kind": 8192, - "name": "optObject", - "type": "AnotherType" - }, - "type": "AnotherType" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "AnotherType" - }, - "kind": 18, - "name": "objectArray", - "object": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "[AnotherType]" - }, - "kind": 34, - "name": "objectArray", - "required": true, - "type": "[AnotherType]" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "optObjectArray", - "type": "AnotherType" - }, - "kind": 18, - "name": "optObjectArray", - "object": { - "kind": 8192, - "name": "optObjectArray", - "type": "AnotherType" - }, - "type": "[AnotherType]" - }, - "kind": 34, - "name": "optObjectArray", - "type": "[AnotherType]" - } - ], - "env": { - "required": true - }, - "kind": 64, - "name": "objectMethod", - "required": true, - "return": { - "kind": 34, - "name": "objectMethod", - "object": { - "kind": 8192, - "name": "objectMethod", - "type": "AnotherType" - }, - "type": "AnotherType" - }, - "type": "Method" - }, - { - "arguments": [ - { - "kind": 34, - "name": "object", - "object": { - "kind": 8192, - "name": "object", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "AnotherType" - }, - { - "kind": 34, - "name": "optObject", - "object": { - "kind": 8192, - "name": "optObject", - "type": "AnotherType" - }, - "type": "AnotherType" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "AnotherType" - }, - "kind": 18, - "name": "objectArray", - "object": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "[AnotherType]" - }, - "kind": 34, - "name": "objectArray", - "required": true, - "type": "[AnotherType]" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "optObjectArray", - "type": "AnotherType" - }, - "kind": 18, - "name": "optObjectArray", - "object": { - "kind": 8192, - "name": "optObjectArray", - "type": "AnotherType" - }, - "type": "[AnotherType]" - }, - "kind": 34, - "name": "optObjectArray", - "type": "[AnotherType]" - } - ], - "env": { - "required": false - }, - "kind": 64, - "name": "optionalEnvMethod", - "required": true, - "return": { - "kind": 34, - "name": "optionalEnvMethod", - "object": { - "kind": 8192, - "name": "optionalEnvMethod", - "type": "AnotherType" - }, - "type": "AnotherType" - }, - "type": "Method" - }, - { - "arguments": [ - { - "kind": 34, - "name": "if", - "object": { - "kind": 8192, - "name": "if", - "required": true, - "type": "else" - }, - "required": true, - "type": "else" - } - ], - "kind": 64, - "name": "if", - "required": true, - "return": { - "kind": 34, - "name": "if", - "object": { - "kind": 8192, - "name": "if", - "required": true, - "type": "else" - }, - "required": true, - "type": "else" - }, - "type": "Method" - } - ], - "type": "Module" - }, - "objectTypes": [ - { - "kind": 1, - "properties": [ - { - "kind": 34, - "name": "str", - "required": true, - "scalar": { - "kind": 4, - "name": "str", - "required": true, - "type": "String" - }, - "type": "String" - }, - { - "kind": 34, - "name": "optStr", - "scalar": { - "kind": 4, - "name": "optStr", - "type": "String" - }, - "type": "String" - }, - { - "kind": 34, - "name": "u", - "required": true, - "scalar": { - "kind": 4, - "name": "u", - "required": true, - "type": "UInt" - }, - "type": "UInt" - }, - { - "kind": 34, - "name": "optU", - "scalar": { - "kind": 4, - "name": "optU", - "type": "UInt" - }, - "type": "UInt" - }, - { - "kind": 34, - "name": "u8", - "required": true, - "scalar": { - "kind": 4, - "name": "u8", - "required": true, - "type": "UInt8" - }, - "type": "UInt8" - }, - { - "kind": 34, - "name": "u16", - "required": true, - "scalar": { - "kind": 4, - "name": "u16", - "required": true, - "type": "UInt16" - }, - "type": "UInt16" - }, - { - "kind": 34, - "name": "u32", - "required": true, - "scalar": { - "kind": 4, - "name": "u32", - "required": true, - "type": "UInt32" - }, - "type": "UInt32" - }, - { - "kind": 34, - "name": "i", - "required": true, - "scalar": { - "kind": 4, - "name": "i", - "required": true, - "type": "Int" - }, - "type": "Int" - }, - { - "kind": 34, - "name": "i8", - "required": true, - "scalar": { - "kind": 4, - "name": "i8", - "required": true, - "type": "Int8" - }, - "type": "Int8" - }, - { - "kind": 34, - "name": "i16", - "required": true, - "scalar": { - "kind": 4, - "name": "i16", - "required": true, - "type": "Int16" - }, - "type": "Int16" - }, - { - "kind": 34, - "name": "i32", - "required": true, - "scalar": { - "kind": 4, - "name": "i32", - "required": true, - "type": "Int32" - }, - "type": "Int32" - }, - { - "kind": 34, - "name": "bigint", - "required": true, - "scalar": { - "kind": 4, - "name": "bigint", - "required": true, - "type": "BigInt" - }, - "type": "BigInt" - }, - { - "kind": 34, - "name": "optBigint", - "scalar": { - "kind": 4, - "name": "optBigint", - "type": "BigInt" - }, - "type": "BigInt" - }, - { - "kind": 34, - "name": "bignumber", - "required": true, - "scalar": { - "kind": 4, - "name": "bignumber", - "required": true, - "type": "BigNumber" - }, - "type": "BigNumber" - }, - { - "kind": 34, - "name": "optBignumber", - "scalar": { - "kind": 4, - "name": "optBignumber", - "type": "BigNumber" - }, - "type": "BigNumber" - }, - { - "kind": 34, - "name": "json", - "required": true, - "scalar": { - "kind": 4, - "name": "json", - "required": true, - "type": "JSON" - }, - "type": "JSON" - }, - { - "kind": 34, - "name": "optJson", - "scalar": { - "kind": 4, - "name": "optJson", - "type": "JSON" - }, - "type": "JSON" - }, - { - "kind": 34, - "name": "bytes", - "required": true, - "scalar": { - "kind": 4, - "name": "bytes", - "required": true, - "type": "Bytes" - }, - "type": "Bytes" - }, - { - "kind": 34, - "name": "optBytes", - "scalar": { - "kind": 4, - "name": "optBytes", - "type": "Bytes" - }, - "type": "Bytes" - }, - { - "kind": 34, - "name": "boolean", - "required": true, - "scalar": { - "kind": 4, - "name": "boolean", - "required": true, - "type": "Boolean" - }, - "type": "Boolean" - }, - { - "kind": 34, - "name": "optBoolean", - "scalar": { - "kind": 4, - "name": "optBoolean", - "type": "Boolean" - }, - "type": "Boolean" - }, - { - "array": { - "item": { - "kind": 4, - "name": "u_array", - "required": true, - "type": "UInt" - }, - "kind": 18, - "name": "u_array", - "required": true, - "scalar": { - "kind": 4, - "name": "u_array", - "required": true, - "type": "UInt" - }, - "type": "[UInt]" - }, - "kind": 34, - "name": "u_array", - "required": true, - "type": "[UInt]" - }, - { - "array": { - "item": { - "kind": 4, - "name": "uOpt_array", - "required": true, - "type": "UInt" - }, - "kind": 18, - "name": "uOpt_array", - "scalar": { - "kind": 4, - "name": "uOpt_array", - "required": true, - "type": "UInt" - }, - "type": "[UInt]" - }, - "kind": 34, - "name": "uOpt_array", - "type": "[UInt]" - }, - { - "array": { - "item": { - "kind": 4, - "name": "_opt_uOptArray", - "type": "UInt" - }, - "kind": 18, - "name": "_opt_uOptArray", - "scalar": { - "kind": 4, - "name": "_opt_uOptArray", - "type": "UInt" - }, - "type": "[UInt]" - }, - "kind": 34, - "name": "_opt_uOptArray", - "type": "[UInt]" - }, - { - "array": { - "item": { - "kind": 4, - "name": "optStrOptArray", - "type": "String" - }, - "kind": 18, - "name": "optStrOptArray", - "scalar": { - "kind": 4, - "name": "optStrOptArray", - "type": "String" - }, - "type": "[String]" - }, - "kind": 34, - "name": "optStrOptArray", - "type": "[String]" - }, - { - "array": { - "array": { - "item": { - "kind": 4, - "name": "uArrayArray", - "required": true, - "type": "UInt" - }, - "kind": 18, - "name": "uArrayArray", - "required": true, - "scalar": { - "kind": 4, - "name": "uArrayArray", - "required": true, - "type": "UInt" - }, - "type": "[UInt]" - }, - "item": { - "item": { - "kind": 4, - "name": "uArrayArray", - "required": true, - "type": "UInt" - }, - "kind": 18, - "name": "uArrayArray", - "required": true, - "scalar": { - "kind": 4, - "name": "uArrayArray", - "required": true, - "type": "UInt" - }, - "type": "[UInt]" - }, - "kind": 18, - "name": "uArrayArray", - "required": true, - "type": "[[UInt]]" - }, - "kind": 34, - "name": "uArrayArray", - "required": true, - "type": "[[UInt]]" - }, - { - "array": { - "array": { - "item": { - "kind": 4, - "name": "uOptArrayOptArray", - "type": "UInt32" - }, - "kind": 18, - "name": "uOptArrayOptArray", - "scalar": { - "kind": 4, - "name": "uOptArrayOptArray", - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "item": { - "item": { - "kind": 4, - "name": "uOptArrayOptArray", - "type": "UInt32" - }, - "kind": 18, - "name": "uOptArrayOptArray", - "scalar": { - "kind": 4, - "name": "uOptArrayOptArray", - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "kind": 18, - "name": "uOptArrayOptArray", - "required": true, - "type": "[[UInt32]]" - }, - "kind": 34, - "name": "uOptArrayOptArray", - "required": true, - "type": "[[UInt32]]" - }, - { - "array": { - "array": { - "array": { - "item": { - "kind": 4, - "name": "uArrayOptArrayArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "uArrayOptArrayArray", - "required": true, - "scalar": { - "kind": 4, - "name": "uArrayOptArrayArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "item": { - "item": { - "kind": 4, - "name": "uArrayOptArrayArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "uArrayOptArrayArray", - "required": true, - "scalar": { - "kind": 4, - "name": "uArrayOptArrayArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "kind": 18, - "name": "uArrayOptArrayArray", - "type": "[[UInt32]]" - }, - "item": { - "array": { - "item": { - "kind": 4, - "name": "uArrayOptArrayArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "uArrayOptArrayArray", - "required": true, - "scalar": { - "kind": 4, - "name": "uArrayOptArrayArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "item": { - "item": { - "kind": 4, - "name": "uArrayOptArrayArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "uArrayOptArrayArray", - "required": true, - "scalar": { - "kind": 4, - "name": "uArrayOptArrayArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "kind": 18, - "name": "uArrayOptArrayArray", - "type": "[[UInt32]]" - }, - "kind": 18, - "name": "uArrayOptArrayArray", - "required": true, - "type": "[[[UInt32]]]" - }, - "kind": 34, - "name": "uArrayOptArrayArray", - "required": true, - "type": "[[[UInt32]]]" - }, - { - "array": { - "array": { - "array": { - "array": { - "item": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "crazyArray", - "scalar": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "item": { - "item": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "crazyArray", - "scalar": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "kind": 18, - "name": "crazyArray", - "required": true, - "type": "[[UInt32]]" - }, - "item": { - "array": { - "item": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "crazyArray", - "scalar": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "item": { - "item": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "crazyArray", - "scalar": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "kind": 18, - "name": "crazyArray", - "required": true, - "type": "[[UInt32]]" - }, - "kind": 18, - "name": "crazyArray", - "type": "[[[UInt32]]]" - }, - "item": { - "array": { - "array": { - "item": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "crazyArray", - "scalar": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "item": { - "item": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "crazyArray", - "scalar": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "kind": 18, - "name": "crazyArray", - "required": true, - "type": "[[UInt32]]" - }, - "item": { - "array": { - "item": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "crazyArray", - "scalar": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "item": { - "item": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "crazyArray", - "scalar": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "kind": 18, - "name": "crazyArray", - "required": true, - "type": "[[UInt32]]" - }, - "kind": 18, - "name": "crazyArray", - "type": "[[[UInt32]]]" - }, - "kind": 18, - "name": "crazyArray", - "type": "[[[[UInt32]]]]" - }, - "kind": 34, - "name": "crazyArray", - "type": "[[[[UInt32]]]]" - }, - { - "kind": 34, - "name": "object", - "object": { - "kind": 8192, - "name": "object", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "AnotherType" - }, - { - "kind": 34, - "name": "optObject", - "object": { - "kind": 8192, - "name": "optObject", - "type": "AnotherType" - }, - "type": "AnotherType" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "AnotherType" - }, - "kind": 18, - "name": "objectArray", - "object": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "[AnotherType]" - }, - "kind": 34, - "name": "objectArray", - "required": true, - "type": "[AnotherType]" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "optObjectArray", - "type": "AnotherType" - }, - "kind": 18, - "name": "optObjectArray", - "object": { - "kind": 8192, - "name": "optObjectArray", - "type": "AnotherType" - }, - "type": "[AnotherType]" - }, - "kind": 34, - "name": "optObjectArray", - "type": "[AnotherType]" - }, - { - "enum": { - "kind": 16384, - "name": "en", - "required": true, - "type": "CustomEnum" - }, - "kind": 34, - "name": "en", - "required": true, - "type": "CustomEnum" - }, - { - "enum": { - "kind": 16384, - "name": "optEnum", - "type": "CustomEnum" - }, - "kind": 34, - "name": "optEnum", - "type": "CustomEnum" - }, - { - "array": { - "enum": { - "kind": 16384, - "name": "enumArray", - "required": true, - "type": "CustomEnum" - }, - "item": { - "kind": 16384, - "name": "enumArray", - "required": true, - "type": "CustomEnum" - }, - "kind": 18, - "name": "enumArray", - "required": true, - "type": "[CustomEnum]" - }, - "kind": 34, - "name": "enumArray", - "required": true, - "type": "[CustomEnum]" - }, - { - "array": { - "enum": { - "kind": 16384, - "name": "optEnumArray", - "type": "CustomEnum" - }, - "item": { - "kind": 16384, - "name": "optEnumArray", - "type": "CustomEnum" - }, - "kind": 18, - "name": "optEnumArray", - "type": "[CustomEnum]" - }, - "kind": 34, - "name": "optEnumArray", - "type": "[CustomEnum]" - }, - { - "kind": 34, - "map": { - "key": { - "kind": 4, - "name": "map", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "map", - "required": true, - "scalar": { - "kind": 4, - "name": "map", - "required": true, - "type": "Int" - }, - "type": "Map", - "value": { - "kind": 4, - "name": "map", - "required": true, - "type": "Int" - } - }, - "name": "map", - "required": true, - "type": "Map" - }, - { - "kind": 34, - "map": { - "array": { - "item": { - "kind": 4, - "name": "mapOfArr", - "required": true, - "type": "Int" - }, - "kind": 18, - "name": "mapOfArr", - "required": true, - "scalar": { - "kind": 4, - "name": "mapOfArr", - "required": true, - "type": "Int" - }, - "type": "[Int]" - }, - "key": { - "kind": 4, - "name": "mapOfArr", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "mapOfArr", - "required": true, - "type": "Map", - "value": { - "item": { - "kind": 4, - "name": "mapOfArr", - "required": true, - "type": "Int" - }, - "kind": 18, - "name": "mapOfArr", - "required": true, - "scalar": { - "kind": 4, - "name": "mapOfArr", - "required": true, - "type": "Int" - }, - "type": "[Int]" - } - }, - "name": "mapOfArr", - "required": true, - "type": "Map" - }, - { - "kind": 34, - "map": { - "key": { - "kind": 4, - "name": "mapOfObj", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "mapOfObj", - "object": { - "kind": 8192, - "name": "mapOfObj", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "Map", - "value": { - "kind": 8192, - "name": "mapOfObj", - "required": true, - "type": "AnotherType" - } - }, - "name": "mapOfObj", - "required": true, - "type": "Map" - }, - { - "kind": 34, - "map": { - "array": { - "item": { - "kind": 8192, - "name": "mapOfArrOfObj", - "required": true, - "type": "AnotherType" - }, - "kind": 18, - "name": "mapOfArrOfObj", - "object": { - "kind": 8192, - "name": "mapOfArrOfObj", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "[AnotherType]" - }, - "key": { - "kind": 4, - "name": "mapOfArrOfObj", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "mapOfArrOfObj", - "required": true, - "type": "Map", - "value": { - "item": { - "kind": 8192, - "name": "mapOfArrOfObj", - "required": true, - "type": "AnotherType" - }, - "kind": 18, - "name": "mapOfArrOfObj", - "object": { - "kind": 8192, - "name": "mapOfArrOfObj", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "[AnotherType]" - } - }, - "name": "mapOfArrOfObj", - "required": true, - "type": "Map" - }, - { - "kind": 34, - "map": { - "key": { - "kind": 4, - "name": "mapCustomValue", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "mapCustomValue", - "object": { - "kind": 8192, - "name": "mapCustomValue", - "type": "CustomMapValue" - }, - "required": true, - "type": "Map", - "value": { - "kind": 8192, - "name": "mapCustomValue", - "type": "CustomMapValue" - } - }, - "name": "mapCustomValue", - "required": true, - "type": "Map" - } - ], - "type": "CustomType" - }, - { - "kind": 1, - "properties": [ - { - "kind": 34, - "name": "prop", - "scalar": { - "kind": 4, - "name": "prop", - "type": "String" - }, - "type": "String" - }, - { - "kind": 34, - "name": "circular", - "object": { - "kind": 8192, - "name": "circular", - "type": "CustomType" - }, - "type": "CustomType" - }, - { - "kind": 34, - "name": "const", - "scalar": { - "kind": 4, - "name": "const", - "type": "String" - }, - "type": "String" - } - ], - "type": "AnotherType" - }, - { - "kind": 1, - "properties": [ - { - "kind": 34, - "name": "foo", - "required": true, - "scalar": { - "kind": 4, - "name": "foo", - "required": true, - "type": "String" - }, - "type": "String" - } - ], - "type": "CustomMapValue" - }, - { - "kind": 1, - "properties": [ - { - "kind": 34, - "name": "else", - "required": true, - "scalar": { - "kind": 4, - "name": "else", - "required": true, - "type": "String" - }, - "type": "String" - } - ], - "type": "else" - } - ], - "version": "0.1" -})).unwrap() - } -} diff --git a/packages/test-cases/cases/bind/sanity/output/plugin-ts/index.ts b/packages/test-cases/cases/bind/sanity/output/plugin-ts/index.ts deleted file mode 100644 index 4f5ca809d5..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/plugin-ts/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -/// NOTE: This is an auto-generated file. -/// All modifications will be overwritten. - -export * from "./wrap.info"; -export * from "./module"; -export * from "./types"; - -export { CoreClient } from "@polywrap/core-js"; diff --git a/packages/test-cases/cases/bind/sanity/output/plugin-ts/module.ts b/packages/test-cases/cases/bind/sanity/output/plugin-ts/module.ts deleted file mode 100644 index 96d6faf2fb..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/plugin-ts/module.ts +++ /dev/null @@ -1,67 +0,0 @@ -/// NOTE: This is an auto-generated file. -/// All modifications will be overwritten. - -// @ts-ignore -import * as Types from "./types"; - -// @ts-ignore -import { CoreClient, MaybeAsync } from "@polywrap/core-js"; -import { PluginModule } from "@polywrap/plugin-js"; - -export interface Args_moduleMethod { - str: Types.String; - optStr?: Types.String | null; - en: Types.CustomEnum; - optEnum?: Types.CustomEnum | null; - enumArray: Array; - optEnumArray?: Array | null; - map: Map; - mapOfArr: Map>; - mapOfMap: Map>; - mapOfObj: Map; - mapOfArrOfObj: Map>; -} - -export interface Args_objectMethod { - object: Types.AnotherType; - optObject?: Types.AnotherType | null; - objectArray: Array; - optObjectArray?: Array | null; -} - -export interface Args_optionalEnvMethod { - object: Types.AnotherType; - optObject?: Types.AnotherType | null; - objectArray: Array; - optObjectArray?: Array | null; -} - -export interface Args_if { - if: Types._else; -} - -export abstract class Module extends PluginModule { - abstract moduleMethod( - args: Args_moduleMethod, - client: CoreClient, - env?: null - ): MaybeAsync; - - abstract objectMethod( - args: Args_objectMethod, - client: CoreClient, - env: Types.Env - ): MaybeAsync; - - abstract optionalEnvMethod( - args: Args_optionalEnvMethod, - client: CoreClient, - env?: Types.Env | null - ): MaybeAsync; - - abstract if( - args: Args_if, - client: CoreClient, - env?: null - ): MaybeAsync; -} diff --git a/packages/test-cases/cases/bind/sanity/output/plugin-ts/types.ts b/packages/test-cases/cases/bind/sanity/output/plugin-ts/types.ts deleted file mode 100644 index 428ddf9e92..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/plugin-ts/types.ts +++ /dev/null @@ -1,257 +0,0 @@ -/// NOTE: This is an auto-generated file. -/// All modifications will be overwritten. - -// @ts-ignore -import * as Types from "./"; - -// @ts-ignore -import { - CoreClient, - Result, - InvokeResult, - Uri, -} from "@polywrap/core-js"; - -export type UInt = number; -export type UInt8 = number; -export type UInt16 = number; -export type UInt32 = number; -export type Int = number; -export type Int8 = number; -export type Int16 = number; -export type Int32 = number; -export type Bytes = Uint8Array; -export type BigInt = string; -export type BigNumber = string; -export type Json = string; -export type String = string; -export type Boolean = boolean; - -/// Env START /// -export interface Env extends Record { - prop: Types.String; - optProp?: Types.String | null; - optMap?: Map | null; -} -/// Env END /// - -/// Objects START /// -export interface CustomType { - str: Types.String; - optStr?: Types.String | null; - u: Types.UInt; - optU?: Types.UInt | null; - u8: Types.UInt8; - u16: Types.UInt16; - u32: Types.UInt32; - i: Types.Int; - i8: Types.Int8; - i16: Types.Int16; - i32: Types.Int32; - bigint: Types.BigInt; - optBigint?: Types.BigInt | null; - bignumber: Types.BigNumber; - optBignumber?: Types.BigNumber | null; - json: Types.Json; - optJson?: Types.Json | null; - bytes: Types.Bytes; - optBytes?: Types.Bytes | null; - boolean: Types.Boolean; - optBoolean?: Types.Boolean | null; - u_array: Array; - uOpt_array?: Array | null; - _opt_uOptArray?: Array | null; - optStrOptArray?: Array | null; - uArrayArray: Array>; - uOptArrayOptArray: Array | null>; - uArrayOptArrayArray: Array> | null>; - crazyArray?: Array | null>> | null> | null; - object: Types.AnotherType; - optObject?: Types.AnotherType | null; - objectArray: Array; - optObjectArray?: Array | null; - en: Types.CustomEnum; - optEnum?: Types.CustomEnum | null; - enumArray: Array; - optEnumArray?: Array | null; - map: Map; - mapOfArr: Map>; - mapOfObj: Map; - mapOfArrOfObj: Map>; - mapCustomValue: Map; -} - -export interface AnotherType { - prop?: Types.String | null; - circular?: Types.CustomType | null; - const?: Types.String | null; -} - -export interface CustomMapValue { - foo: Types.String; -} - -export interface _else { - else: Types.String; -} - -/// Objects END /// - -/// Enums START /// -export enum CustomEnumEnum { - STRING, - BYTES, -} - -export type CustomEnumString = - | "STRING" - | "BYTES" - -export type CustomEnum = CustomEnumEnum | CustomEnumString; - -export enum whileEnum { - for, - in, -} - -export type whileString = - | "for" - | "in" - -export type _while = whileEnum | whileString; - -/// Enums END /// - -/// Imported Objects START /// - -/* URI: "testimport.uri.eth" */ -export interface TestImport_Object { - object: Types.TestImport_AnotherObject; - optObject?: Types.TestImport_AnotherObject | null; - objectArray: Array; - optObjectArray?: Array | null; - en: Types.TestImport_Enum; - optEnum?: Types.TestImport_Enum | null; - enumArray: Array; - optEnumArray?: Array | null; -} - -/* URI: "testimport.uri.eth" */ -export interface TestImport_AnotherObject { - prop: Types.String; -} - -/* URI: "testimport.uri.eth" */ -export enum TestImport_EnumEnum { - STRING, - BYTES, -} - -export type TestImport_EnumString = - | "STRING" - | "BYTES" - -export type TestImport_Enum = TestImport_EnumEnum | TestImport_EnumString; - -/* URI: "testimport.uri.eth" */ -export enum TestImport_Enum_ReturnEnum { - STRING, - BYTES, -} - -export type TestImport_Enum_ReturnString = - | "STRING" - | "BYTES" - -export type TestImport_Enum_Return = TestImport_Enum_ReturnEnum | TestImport_Enum_ReturnString; - -/// Imported Objects END /// - -/// Imported Modules START /// - -/* URI: "testimport.uri.eth" */ -export interface TestImport_Module_Args_importedMethod { - str: Types.String; - optStr?: Types.String | null; - u: Types.UInt; - optU?: Types.UInt | null; - uArrayArray: Array | null>; - object: Types.TestImport_Object; - optObject?: Types.TestImport_Object | null; - objectArray: Array; - optObjectArray?: Array | null; - en: Types.TestImport_Enum; - optEnum?: Types.TestImport_Enum | null; - enumArray: Array; - optEnumArray?: Array | null; -} - -/* URI: "testimport.uri.eth" */ -export interface TestImport_Module_Args_anotherMethod { - arg: Array; -} - -/* URI: "testimport.uri.eth" */ -export interface TestImport_Module_Args_returnsArrayOfEnums { - arg: Types.String; -} - -/* URI: "testimport.uri.eth" */ -export class TestImport_Module { - public static interfaceUri: string = "testimport.uri.eth"; - public uri: Uri; - - constructor(uri: string) { - this.uri = Uri.from(uri); - } - - public async importedMethod( - args: TestImport_Module_Args_importedMethod, - client: CoreClient - ): Promise> { - return client.invoke({ - uri: this.uri, - method: "importedMethod", - args: (args as unknown) as Record, - }); - } - - public async anotherMethod( - args: TestImport_Module_Args_anotherMethod, - client: CoreClient - ): Promise> { - return client.invoke({ - uri: this.uri, - method: "anotherMethod", - args: (args as unknown) as Record, - }); - } - - public async returnsArrayOfEnums( - args: TestImport_Module_Args_returnsArrayOfEnums, - client: CoreClient - ): Promise>> { - return client.invoke>({ - uri: this.uri, - method: "returnsArrayOfEnums", - args: (args as unknown) as Record, - }); - } -} - -/// Imported Modules END /// - -export class TestImport { - static uri: Uri = Uri.from("testimport.uri.eth"); - - public static async getImplementations( - client: CoreClient - ): Promise> { - const impls = await client.getImplementations(this.uri, {}); - if (!impls.ok) { - return { ok: false, error: impls.error}; - } - - return { ok: true, value: impls.value.map((impl) => (impl.uri))}; - } -} diff --git a/packages/test-cases/cases/bind/sanity/output/plugin-ts/wrap.info.ts b/packages/test-cases/cases/bind/sanity/output/plugin-ts/wrap.info.ts deleted file mode 100644 index 559110bb09..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/plugin-ts/wrap.info.ts +++ /dev/null @@ -1,2433 +0,0 @@ -/// NOTE: This is an auto-generated file. -/// All modifications will be overwritten. -import { WrapManifest } from "@polywrap/wrap-manifest-types-js" - -export const manifest: WrapManifest = { - name: "Test", - type: "plugin", - version: "0.1", - abi: { - "enumTypes": [ - { - "constants": [ - "STRING", - "BYTES" - ], - "kind": 8, - "type": "CustomEnum" - }, - { - "constants": [ - "for", - "in" - ], - "kind": 8, - "type": "while" - } - ], - "envType": { - "kind": 65536, - "properties": [ - { - "kind": 34, - "name": "prop", - "required": true, - "scalar": { - "kind": 4, - "name": "prop", - "required": true, - "type": "String" - }, - "type": "String" - }, - { - "kind": 34, - "name": "optProp", - "scalar": { - "kind": 4, - "name": "optProp", - "type": "String" - }, - "type": "String" - }, - { - "kind": 34, - "map": { - "key": { - "kind": 4, - "name": "optMap", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "optMap", - "scalar": { - "kind": 4, - "name": "optMap", - "type": "Int" - }, - "type": "Map", - "value": { - "kind": 4, - "name": "optMap", - "type": "Int" - } - }, - "name": "optMap", - "type": "Map" - } - ], - "type": "Env" - }, - "importedEnumTypes": [ - { - "constants": [ - "STRING", - "BYTES" - ], - "kind": 520, - "namespace": "TestImport", - "nativeType": "Enum", - "type": "TestImport_Enum", - "uri": "testimport.uri.eth" - }, - { - "constants": [ - "STRING", - "BYTES" - ], - "kind": 520, - "namespace": "TestImport", - "nativeType": "Enum", - "type": "TestImport_Enum_Return", - "uri": "testimport.uri.eth" - } - ], - "importedEnvTypes": [ - { - "kind": 524288, - "namespace": "TestImport", - "nativeType": "Env", - "properties": [ - { - "kind": 34, - "name": "object", - "object": { - "kind": 8192, - "name": "object", - "required": true, - "type": "TestImport_AnotherObject" - }, - "required": true, - "type": "TestImport_AnotherObject" - }, - { - "kind": 34, - "name": "optObject", - "object": { - "kind": 8192, - "name": "optObject", - "type": "TestImport_AnotherObject" - }, - "type": "TestImport_AnotherObject" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "TestImport_AnotherObject" - }, - "kind": 18, - "name": "objectArray", - "object": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "TestImport_AnotherObject" - }, - "required": true, - "type": "[TestImport_AnotherObject]" - }, - "kind": 34, - "name": "objectArray", - "required": true, - "type": "[TestImport_AnotherObject]" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "optObjectArray", - "type": "TestImport_AnotherObject" - }, - "kind": 18, - "name": "optObjectArray", - "object": { - "kind": 8192, - "name": "optObjectArray", - "type": "TestImport_AnotherObject" - }, - "type": "[TestImport_AnotherObject]" - }, - "kind": 34, - "name": "optObjectArray", - "type": "[TestImport_AnotherObject]" - }, - { - "enum": { - "kind": 16384, - "name": "en", - "required": true, - "type": "TestImport_Enum" - }, - "kind": 34, - "name": "en", - "required": true, - "type": "TestImport_Enum" - }, - { - "enum": { - "kind": 16384, - "name": "optEnum", - "type": "TestImport_Enum" - }, - "kind": 34, - "name": "optEnum", - "type": "TestImport_Enum" - }, - { - "array": { - "enum": { - "kind": 16384, - "name": "enumArray", - "required": true, - "type": "TestImport_Enum" - }, - "item": { - "kind": 16384, - "name": "enumArray", - "required": true, - "type": "TestImport_Enum" - }, - "kind": 18, - "name": "enumArray", - "required": true, - "type": "[TestImport_Enum]" - }, - "kind": 34, - "name": "enumArray", - "required": true, - "type": "[TestImport_Enum]" - }, - { - "array": { - "enum": { - "kind": 16384, - "name": "optEnumArray", - "type": "TestImport_Enum" - }, - "item": { - "kind": 16384, - "name": "optEnumArray", - "type": "TestImport_Enum" - }, - "kind": 18, - "name": "optEnumArray", - "type": "[TestImport_Enum]" - }, - "kind": 34, - "name": "optEnumArray", - "type": "[TestImport_Enum]" - } - ], - "type": "TestImport_Env", - "uri": "testimport.uri.eth" - } - ], - "importedModuleTypes": [ - { - "isInterface": true, - "kind": 256, - "methods": [ - { - "arguments": [ - { - "kind": 34, - "name": "str", - "required": true, - "scalar": { - "kind": 4, - "name": "str", - "required": true, - "type": "String" - }, - "type": "String" - }, - { - "kind": 34, - "name": "optStr", - "scalar": { - "kind": 4, - "name": "optStr", - "type": "String" - }, - "type": "String" - }, - { - "kind": 34, - "name": "u", - "required": true, - "scalar": { - "kind": 4, - "name": "u", - "required": true, - "type": "UInt" - }, - "type": "UInt" - }, - { - "kind": 34, - "name": "optU", - "scalar": { - "kind": 4, - "name": "optU", - "type": "UInt" - }, - "type": "UInt" - }, - { - "array": { - "array": { - "item": { - "kind": 4, - "name": "uArrayArray", - "type": "UInt" - }, - "kind": 18, - "name": "uArrayArray", - "scalar": { - "kind": 4, - "name": "uArrayArray", - "type": "UInt" - }, - "type": "[UInt]" - }, - "item": { - "item": { - "kind": 4, - "name": "uArrayArray", - "type": "UInt" - }, - "kind": 18, - "name": "uArrayArray", - "scalar": { - "kind": 4, - "name": "uArrayArray", - "type": "UInt" - }, - "type": "[UInt]" - }, - "kind": 18, - "name": "uArrayArray", - "required": true, - "type": "[[UInt]]" - }, - "kind": 34, - "name": "uArrayArray", - "required": true, - "type": "[[UInt]]" - }, - { - "kind": 34, - "name": "object", - "object": { - "kind": 8192, - "name": "object", - "required": true, - "type": "TestImport_Object" - }, - "required": true, - "type": "TestImport_Object" - }, - { - "kind": 34, - "name": "optObject", - "object": { - "kind": 8192, - "name": "optObject", - "type": "TestImport_Object" - }, - "type": "TestImport_Object" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "TestImport_Object" - }, - "kind": 18, - "name": "objectArray", - "object": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "TestImport_Object" - }, - "required": true, - "type": "[TestImport_Object]" - }, - "kind": 34, - "name": "objectArray", - "required": true, - "type": "[TestImport_Object]" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "optObjectArray", - "type": "TestImport_Object" - }, - "kind": 18, - "name": "optObjectArray", - "object": { - "kind": 8192, - "name": "optObjectArray", - "type": "TestImport_Object" - }, - "type": "[TestImport_Object]" - }, - "kind": 34, - "name": "optObjectArray", - "type": "[TestImport_Object]" - }, - { - "enum": { - "kind": 16384, - "name": "en", - "required": true, - "type": "TestImport_Enum" - }, - "kind": 34, - "name": "en", - "required": true, - "type": "TestImport_Enum" - }, - { - "enum": { - "kind": 16384, - "name": "optEnum", - "type": "TestImport_Enum" - }, - "kind": 34, - "name": "optEnum", - "type": "TestImport_Enum" - }, - { - "array": { - "enum": { - "kind": 16384, - "name": "enumArray", - "required": true, - "type": "TestImport_Enum" - }, - "item": { - "kind": 16384, - "name": "enumArray", - "required": true, - "type": "TestImport_Enum" - }, - "kind": 18, - "name": "enumArray", - "required": true, - "type": "[TestImport_Enum]" - }, - "kind": 34, - "name": "enumArray", - "required": true, - "type": "[TestImport_Enum]" - }, - { - "array": { - "enum": { - "kind": 16384, - "name": "optEnumArray", - "type": "TestImport_Enum" - }, - "item": { - "kind": 16384, - "name": "optEnumArray", - "type": "TestImport_Enum" - }, - "kind": 18, - "name": "optEnumArray", - "type": "[TestImport_Enum]" - }, - "kind": 34, - "name": "optEnumArray", - "type": "[TestImport_Enum]" - } - ], - "env": { - "required": true - }, - "kind": 64, - "name": "importedMethod", - "required": true, - "return": { - "kind": 34, - "name": "importedMethod", - "object": { - "kind": 8192, - "name": "importedMethod", - "type": "TestImport_Object" - }, - "type": "TestImport_Object" - }, - "type": "Method" - }, - { - "arguments": [ - { - "array": { - "item": { - "kind": 4, - "name": "arg", - "required": true, - "type": "String" - }, - "kind": 18, - "name": "arg", - "required": true, - "scalar": { - "kind": 4, - "name": "arg", - "required": true, - "type": "String" - }, - "type": "[String]" - }, - "kind": 34, - "name": "arg", - "required": true, - "type": "[String]" - } - ], - "kind": 64, - "name": "anotherMethod", - "required": true, - "return": { - "kind": 34, - "name": "anotherMethod", - "required": true, - "scalar": { - "kind": 4, - "name": "anotherMethod", - "required": true, - "type": "Int32" - }, - "type": "Int32" - }, - "type": "Method" - }, - { - "arguments": [ - { - "kind": 34, - "name": "arg", - "required": true, - "scalar": { - "kind": 4, - "name": "arg", - "required": true, - "type": "String" - }, - "type": "String" - } - ], - "kind": 64, - "name": "returnsArrayOfEnums", - "required": true, - "return": { - "array": { - "enum": { - "kind": 16384, - "name": "returnsArrayOfEnums", - "type": "TestImport_Enum_Return" - }, - "item": { - "kind": 16384, - "name": "returnsArrayOfEnums", - "type": "TestImport_Enum_Return" - }, - "kind": 18, - "name": "returnsArrayOfEnums", - "required": true, - "type": "[TestImport_Enum_Return]" - }, - "kind": 34, - "name": "returnsArrayOfEnums", - "required": true, - "type": "[TestImport_Enum_Return]" - }, - "type": "Method" - } - ], - "namespace": "TestImport", - "nativeType": "Module", - "type": "TestImport_Module", - "uri": "testimport.uri.eth" - } - ], - "importedObjectTypes": [ - { - "kind": 1025, - "namespace": "TestImport", - "nativeType": "Object", - "properties": [ - { - "kind": 34, - "name": "object", - "object": { - "kind": 8192, - "name": "object", - "required": true, - "type": "TestImport_AnotherObject" - }, - "required": true, - "type": "TestImport_AnotherObject" - }, - { - "kind": 34, - "name": "optObject", - "object": { - "kind": 8192, - "name": "optObject", - "type": "TestImport_AnotherObject" - }, - "type": "TestImport_AnotherObject" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "TestImport_AnotherObject" - }, - "kind": 18, - "name": "objectArray", - "object": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "TestImport_AnotherObject" - }, - "required": true, - "type": "[TestImport_AnotherObject]" - }, - "kind": 34, - "name": "objectArray", - "required": true, - "type": "[TestImport_AnotherObject]" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "optObjectArray", - "type": "TestImport_AnotherObject" - }, - "kind": 18, - "name": "optObjectArray", - "object": { - "kind": 8192, - "name": "optObjectArray", - "type": "TestImport_AnotherObject" - }, - "type": "[TestImport_AnotherObject]" - }, - "kind": 34, - "name": "optObjectArray", - "type": "[TestImport_AnotherObject]" - }, - { - "enum": { - "kind": 16384, - "name": "en", - "required": true, - "type": "TestImport_Enum" - }, - "kind": 34, - "name": "en", - "required": true, - "type": "TestImport_Enum" - }, - { - "enum": { - "kind": 16384, - "name": "optEnum", - "type": "TestImport_Enum" - }, - "kind": 34, - "name": "optEnum", - "type": "TestImport_Enum" - }, - { - "array": { - "enum": { - "kind": 16384, - "name": "enumArray", - "required": true, - "type": "TestImport_Enum" - }, - "item": { - "kind": 16384, - "name": "enumArray", - "required": true, - "type": "TestImport_Enum" - }, - "kind": 18, - "name": "enumArray", - "required": true, - "type": "[TestImport_Enum]" - }, - "kind": 34, - "name": "enumArray", - "required": true, - "type": "[TestImport_Enum]" - }, - { - "array": { - "enum": { - "kind": 16384, - "name": "optEnumArray", - "type": "TestImport_Enum" - }, - "item": { - "kind": 16384, - "name": "optEnumArray", - "type": "TestImport_Enum" - }, - "kind": 18, - "name": "optEnumArray", - "type": "[TestImport_Enum]" - }, - "kind": 34, - "name": "optEnumArray", - "type": "[TestImport_Enum]" - } - ], - "type": "TestImport_Object", - "uri": "testimport.uri.eth" - }, - { - "kind": 1025, - "namespace": "TestImport", - "nativeType": "AnotherObject", - "properties": [ - { - "kind": 34, - "name": "prop", - "required": true, - "scalar": { - "kind": 4, - "name": "prop", - "required": true, - "type": "String" - }, - "type": "String" - } - ], - "type": "TestImport_AnotherObject", - "uri": "testimport.uri.eth" - } - ], - "interfaceTypes": [ - { - "capabilities": { - "getImplementations": { - "enabled": true - } - }, - "kind": 32768, - "namespace": "TestImport", - "nativeType": "Interface", - "type": "TestImport", - "uri": "testimport.uri.eth" - } - ], - "moduleType": { - "imports": [ - { - "type": "TestImport_Module" - }, - { - "type": "TestImport_Object" - }, - { - "type": "TestImport_AnotherObject" - }, - { - "type": "TestImport_Enum" - }, - { - "type": "TestImport_Enum_Return" - } - ], - "kind": 128, - "methods": [ - { - "arguments": [ - { - "kind": 34, - "name": "str", - "required": true, - "scalar": { - "kind": 4, - "name": "str", - "required": true, - "type": "String" - }, - "type": "String" - }, - { - "kind": 34, - "name": "optStr", - "scalar": { - "kind": 4, - "name": "optStr", - "type": "String" - }, - "type": "String" - }, - { - "enum": { - "kind": 16384, - "name": "en", - "required": true, - "type": "CustomEnum" - }, - "kind": 34, - "name": "en", - "required": true, - "type": "CustomEnum" - }, - { - "enum": { - "kind": 16384, - "name": "optEnum", - "type": "CustomEnum" - }, - "kind": 34, - "name": "optEnum", - "type": "CustomEnum" - }, - { - "array": { - "enum": { - "kind": 16384, - "name": "enumArray", - "required": true, - "type": "CustomEnum" - }, - "item": { - "kind": 16384, - "name": "enumArray", - "required": true, - "type": "CustomEnum" - }, - "kind": 18, - "name": "enumArray", - "required": true, - "type": "[CustomEnum]" - }, - "kind": 34, - "name": "enumArray", - "required": true, - "type": "[CustomEnum]" - }, - { - "array": { - "enum": { - "kind": 16384, - "name": "optEnumArray", - "type": "CustomEnum" - }, - "item": { - "kind": 16384, - "name": "optEnumArray", - "type": "CustomEnum" - }, - "kind": 18, - "name": "optEnumArray", - "type": "[CustomEnum]" - }, - "kind": 34, - "name": "optEnumArray", - "type": "[CustomEnum]" - }, - { - "kind": 34, - "map": { - "key": { - "kind": 4, - "name": "map", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "map", - "required": true, - "scalar": { - "kind": 4, - "name": "map", - "required": true, - "type": "Int" - }, - "type": "Map", - "value": { - "kind": 4, - "name": "map", - "required": true, - "type": "Int" - } - }, - "name": "map", - "required": true, - "type": "Map" - }, - { - "kind": 34, - "map": { - "array": { - "item": { - "kind": 4, - "name": "mapOfArr", - "required": true, - "type": "Int" - }, - "kind": 18, - "name": "mapOfArr", - "required": true, - "scalar": { - "kind": 4, - "name": "mapOfArr", - "required": true, - "type": "Int" - }, - "type": "[Int]" - }, - "key": { - "kind": 4, - "name": "mapOfArr", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "mapOfArr", - "required": true, - "type": "Map", - "value": { - "item": { - "kind": 4, - "name": "mapOfArr", - "required": true, - "type": "Int" - }, - "kind": 18, - "name": "mapOfArr", - "required": true, - "scalar": { - "kind": 4, - "name": "mapOfArr", - "required": true, - "type": "Int" - }, - "type": "[Int]" - } - }, - "name": "mapOfArr", - "required": true, - "type": "Map" - }, - { - "kind": 34, - "map": { - "key": { - "kind": 4, - "name": "mapOfMap", - "required": true, - "type": "String" - }, - "kind": 262146, - "map": { - "key": { - "kind": 4, - "name": "mapOfMap", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "mapOfMap", - "required": true, - "scalar": { - "kind": 4, - "name": "mapOfMap", - "required": true, - "type": "Int" - }, - "type": "Map", - "value": { - "kind": 4, - "name": "mapOfMap", - "required": true, - "type": "Int" - } - }, - "name": "mapOfMap", - "required": true, - "type": "Map>", - "value": { - "key": { - "kind": 4, - "name": "mapOfMap", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "mapOfMap", - "required": true, - "scalar": { - "kind": 4, - "name": "mapOfMap", - "required": true, - "type": "Int" - }, - "type": "Map", - "value": { - "kind": 4, - "name": "mapOfMap", - "required": true, - "type": "Int" - } - } - }, - "name": "mapOfMap", - "required": true, - "type": "Map>" - }, - { - "kind": 34, - "map": { - "key": { - "kind": 4, - "name": "mapOfObj", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "mapOfObj", - "object": { - "kind": 8192, - "name": "mapOfObj", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "Map", - "value": { - "kind": 8192, - "name": "mapOfObj", - "required": true, - "type": "AnotherType" - } - }, - "name": "mapOfObj", - "required": true, - "type": "Map" - }, - { - "kind": 34, - "map": { - "array": { - "item": { - "kind": 8192, - "name": "mapOfArrOfObj", - "required": true, - "type": "AnotherType" - }, - "kind": 18, - "name": "mapOfArrOfObj", - "object": { - "kind": 8192, - "name": "mapOfArrOfObj", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "[AnotherType]" - }, - "key": { - "kind": 4, - "name": "mapOfArrOfObj", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "mapOfArrOfObj", - "required": true, - "type": "Map", - "value": { - "item": { - "kind": 8192, - "name": "mapOfArrOfObj", - "required": true, - "type": "AnotherType" - }, - "kind": 18, - "name": "mapOfArrOfObj", - "object": { - "kind": 8192, - "name": "mapOfArrOfObj", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "[AnotherType]" - } - }, - "name": "mapOfArrOfObj", - "required": true, - "type": "Map" - } - ], - "kind": 64, - "name": "moduleMethod", - "required": true, - "return": { - "kind": 34, - "name": "moduleMethod", - "required": true, - "scalar": { - "kind": 4, - "name": "moduleMethod", - "required": true, - "type": "Int" - }, - "type": "Int" - }, - "type": "Method" - }, - { - "arguments": [ - { - "kind": 34, - "name": "object", - "object": { - "kind": 8192, - "name": "object", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "AnotherType" - }, - { - "kind": 34, - "name": "optObject", - "object": { - "kind": 8192, - "name": "optObject", - "type": "AnotherType" - }, - "type": "AnotherType" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "AnotherType" - }, - "kind": 18, - "name": "objectArray", - "object": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "[AnotherType]" - }, - "kind": 34, - "name": "objectArray", - "required": true, - "type": "[AnotherType]" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "optObjectArray", - "type": "AnotherType" - }, - "kind": 18, - "name": "optObjectArray", - "object": { - "kind": 8192, - "name": "optObjectArray", - "type": "AnotherType" - }, - "type": "[AnotherType]" - }, - "kind": 34, - "name": "optObjectArray", - "type": "[AnotherType]" - } - ], - "env": { - "required": true - }, - "kind": 64, - "name": "objectMethod", - "required": true, - "return": { - "kind": 34, - "name": "objectMethod", - "object": { - "kind": 8192, - "name": "objectMethod", - "type": "AnotherType" - }, - "type": "AnotherType" - }, - "type": "Method" - }, - { - "arguments": [ - { - "kind": 34, - "name": "object", - "object": { - "kind": 8192, - "name": "object", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "AnotherType" - }, - { - "kind": 34, - "name": "optObject", - "object": { - "kind": 8192, - "name": "optObject", - "type": "AnotherType" - }, - "type": "AnotherType" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "AnotherType" - }, - "kind": 18, - "name": "objectArray", - "object": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "[AnotherType]" - }, - "kind": 34, - "name": "objectArray", - "required": true, - "type": "[AnotherType]" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "optObjectArray", - "type": "AnotherType" - }, - "kind": 18, - "name": "optObjectArray", - "object": { - "kind": 8192, - "name": "optObjectArray", - "type": "AnotherType" - }, - "type": "[AnotherType]" - }, - "kind": 34, - "name": "optObjectArray", - "type": "[AnotherType]" - } - ], - "env": { - "required": false - }, - "kind": 64, - "name": "optionalEnvMethod", - "required": true, - "return": { - "kind": 34, - "name": "optionalEnvMethod", - "object": { - "kind": 8192, - "name": "optionalEnvMethod", - "type": "AnotherType" - }, - "type": "AnotherType" - }, - "type": "Method" - }, - { - "arguments": [ - { - "kind": 34, - "name": "if", - "object": { - "kind": 8192, - "name": "if", - "required": true, - "type": "else" - }, - "required": true, - "type": "else" - } - ], - "kind": 64, - "name": "if", - "required": true, - "return": { - "kind": 34, - "name": "if", - "object": { - "kind": 8192, - "name": "if", - "required": true, - "type": "else" - }, - "required": true, - "type": "else" - }, - "type": "Method" - } - ], - "type": "Module" - }, - "objectTypes": [ - { - "kind": 1, - "properties": [ - { - "kind": 34, - "name": "str", - "required": true, - "scalar": { - "kind": 4, - "name": "str", - "required": true, - "type": "String" - }, - "type": "String" - }, - { - "kind": 34, - "name": "optStr", - "scalar": { - "kind": 4, - "name": "optStr", - "type": "String" - }, - "type": "String" - }, - { - "kind": 34, - "name": "u", - "required": true, - "scalar": { - "kind": 4, - "name": "u", - "required": true, - "type": "UInt" - }, - "type": "UInt" - }, - { - "kind": 34, - "name": "optU", - "scalar": { - "kind": 4, - "name": "optU", - "type": "UInt" - }, - "type": "UInt" - }, - { - "kind": 34, - "name": "u8", - "required": true, - "scalar": { - "kind": 4, - "name": "u8", - "required": true, - "type": "UInt8" - }, - "type": "UInt8" - }, - { - "kind": 34, - "name": "u16", - "required": true, - "scalar": { - "kind": 4, - "name": "u16", - "required": true, - "type": "UInt16" - }, - "type": "UInt16" - }, - { - "kind": 34, - "name": "u32", - "required": true, - "scalar": { - "kind": 4, - "name": "u32", - "required": true, - "type": "UInt32" - }, - "type": "UInt32" - }, - { - "kind": 34, - "name": "i", - "required": true, - "scalar": { - "kind": 4, - "name": "i", - "required": true, - "type": "Int" - }, - "type": "Int" - }, - { - "kind": 34, - "name": "i8", - "required": true, - "scalar": { - "kind": 4, - "name": "i8", - "required": true, - "type": "Int8" - }, - "type": "Int8" - }, - { - "kind": 34, - "name": "i16", - "required": true, - "scalar": { - "kind": 4, - "name": "i16", - "required": true, - "type": "Int16" - }, - "type": "Int16" - }, - { - "kind": 34, - "name": "i32", - "required": true, - "scalar": { - "kind": 4, - "name": "i32", - "required": true, - "type": "Int32" - }, - "type": "Int32" - }, - { - "kind": 34, - "name": "bigint", - "required": true, - "scalar": { - "kind": 4, - "name": "bigint", - "required": true, - "type": "BigInt" - }, - "type": "BigInt" - }, - { - "kind": 34, - "name": "optBigint", - "scalar": { - "kind": 4, - "name": "optBigint", - "type": "BigInt" - }, - "type": "BigInt" - }, - { - "kind": 34, - "name": "bignumber", - "required": true, - "scalar": { - "kind": 4, - "name": "bignumber", - "required": true, - "type": "BigNumber" - }, - "type": "BigNumber" - }, - { - "kind": 34, - "name": "optBignumber", - "scalar": { - "kind": 4, - "name": "optBignumber", - "type": "BigNumber" - }, - "type": "BigNumber" - }, - { - "kind": 34, - "name": "json", - "required": true, - "scalar": { - "kind": 4, - "name": "json", - "required": true, - "type": "JSON" - }, - "type": "JSON" - }, - { - "kind": 34, - "name": "optJson", - "scalar": { - "kind": 4, - "name": "optJson", - "type": "JSON" - }, - "type": "JSON" - }, - { - "kind": 34, - "name": "bytes", - "required": true, - "scalar": { - "kind": 4, - "name": "bytes", - "required": true, - "type": "Bytes" - }, - "type": "Bytes" - }, - { - "kind": 34, - "name": "optBytes", - "scalar": { - "kind": 4, - "name": "optBytes", - "type": "Bytes" - }, - "type": "Bytes" - }, - { - "kind": 34, - "name": "boolean", - "required": true, - "scalar": { - "kind": 4, - "name": "boolean", - "required": true, - "type": "Boolean" - }, - "type": "Boolean" - }, - { - "kind": 34, - "name": "optBoolean", - "scalar": { - "kind": 4, - "name": "optBoolean", - "type": "Boolean" - }, - "type": "Boolean" - }, - { - "array": { - "item": { - "kind": 4, - "name": "u_array", - "required": true, - "type": "UInt" - }, - "kind": 18, - "name": "u_array", - "required": true, - "scalar": { - "kind": 4, - "name": "u_array", - "required": true, - "type": "UInt" - }, - "type": "[UInt]" - }, - "kind": 34, - "name": "u_array", - "required": true, - "type": "[UInt]" - }, - { - "array": { - "item": { - "kind": 4, - "name": "uOpt_array", - "required": true, - "type": "UInt" - }, - "kind": 18, - "name": "uOpt_array", - "scalar": { - "kind": 4, - "name": "uOpt_array", - "required": true, - "type": "UInt" - }, - "type": "[UInt]" - }, - "kind": 34, - "name": "uOpt_array", - "type": "[UInt]" - }, - { - "array": { - "item": { - "kind": 4, - "name": "_opt_uOptArray", - "type": "UInt" - }, - "kind": 18, - "name": "_opt_uOptArray", - "scalar": { - "kind": 4, - "name": "_opt_uOptArray", - "type": "UInt" - }, - "type": "[UInt]" - }, - "kind": 34, - "name": "_opt_uOptArray", - "type": "[UInt]" - }, - { - "array": { - "item": { - "kind": 4, - "name": "optStrOptArray", - "type": "String" - }, - "kind": 18, - "name": "optStrOptArray", - "scalar": { - "kind": 4, - "name": "optStrOptArray", - "type": "String" - }, - "type": "[String]" - }, - "kind": 34, - "name": "optStrOptArray", - "type": "[String]" - }, - { - "array": { - "array": { - "item": { - "kind": 4, - "name": "uArrayArray", - "required": true, - "type": "UInt" - }, - "kind": 18, - "name": "uArrayArray", - "required": true, - "scalar": { - "kind": 4, - "name": "uArrayArray", - "required": true, - "type": "UInt" - }, - "type": "[UInt]" - }, - "item": { - "item": { - "kind": 4, - "name": "uArrayArray", - "required": true, - "type": "UInt" - }, - "kind": 18, - "name": "uArrayArray", - "required": true, - "scalar": { - "kind": 4, - "name": "uArrayArray", - "required": true, - "type": "UInt" - }, - "type": "[UInt]" - }, - "kind": 18, - "name": "uArrayArray", - "required": true, - "type": "[[UInt]]" - }, - "kind": 34, - "name": "uArrayArray", - "required": true, - "type": "[[UInt]]" - }, - { - "array": { - "array": { - "item": { - "kind": 4, - "name": "uOptArrayOptArray", - "type": "UInt32" - }, - "kind": 18, - "name": "uOptArrayOptArray", - "scalar": { - "kind": 4, - "name": "uOptArrayOptArray", - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "item": { - "item": { - "kind": 4, - "name": "uOptArrayOptArray", - "type": "UInt32" - }, - "kind": 18, - "name": "uOptArrayOptArray", - "scalar": { - "kind": 4, - "name": "uOptArrayOptArray", - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "kind": 18, - "name": "uOptArrayOptArray", - "required": true, - "type": "[[UInt32]]" - }, - "kind": 34, - "name": "uOptArrayOptArray", - "required": true, - "type": "[[UInt32]]" - }, - { - "array": { - "array": { - "array": { - "item": { - "kind": 4, - "name": "uArrayOptArrayArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "uArrayOptArrayArray", - "required": true, - "scalar": { - "kind": 4, - "name": "uArrayOptArrayArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "item": { - "item": { - "kind": 4, - "name": "uArrayOptArrayArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "uArrayOptArrayArray", - "required": true, - "scalar": { - "kind": 4, - "name": "uArrayOptArrayArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "kind": 18, - "name": "uArrayOptArrayArray", - "type": "[[UInt32]]" - }, - "item": { - "array": { - "item": { - "kind": 4, - "name": "uArrayOptArrayArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "uArrayOptArrayArray", - "required": true, - "scalar": { - "kind": 4, - "name": "uArrayOptArrayArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "item": { - "item": { - "kind": 4, - "name": "uArrayOptArrayArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "uArrayOptArrayArray", - "required": true, - "scalar": { - "kind": 4, - "name": "uArrayOptArrayArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "kind": 18, - "name": "uArrayOptArrayArray", - "type": "[[UInt32]]" - }, - "kind": 18, - "name": "uArrayOptArrayArray", - "required": true, - "type": "[[[UInt32]]]" - }, - "kind": 34, - "name": "uArrayOptArrayArray", - "required": true, - "type": "[[[UInt32]]]" - }, - { - "array": { - "array": { - "array": { - "array": { - "item": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "crazyArray", - "scalar": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "item": { - "item": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "crazyArray", - "scalar": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "kind": 18, - "name": "crazyArray", - "required": true, - "type": "[[UInt32]]" - }, - "item": { - "array": { - "item": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "crazyArray", - "scalar": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "item": { - "item": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "crazyArray", - "scalar": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "kind": 18, - "name": "crazyArray", - "required": true, - "type": "[[UInt32]]" - }, - "kind": 18, - "name": "crazyArray", - "type": "[[[UInt32]]]" - }, - "item": { - "array": { - "array": { - "item": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "crazyArray", - "scalar": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "item": { - "item": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "crazyArray", - "scalar": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "kind": 18, - "name": "crazyArray", - "required": true, - "type": "[[UInt32]]" - }, - "item": { - "array": { - "item": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "crazyArray", - "scalar": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "item": { - "item": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "kind": 18, - "name": "crazyArray", - "scalar": { - "kind": 4, - "name": "crazyArray", - "required": true, - "type": "UInt32" - }, - "type": "[UInt32]" - }, - "kind": 18, - "name": "crazyArray", - "required": true, - "type": "[[UInt32]]" - }, - "kind": 18, - "name": "crazyArray", - "type": "[[[UInt32]]]" - }, - "kind": 18, - "name": "crazyArray", - "type": "[[[[UInt32]]]]" - }, - "kind": 34, - "name": "crazyArray", - "type": "[[[[UInt32]]]]" - }, - { - "kind": 34, - "name": "object", - "object": { - "kind": 8192, - "name": "object", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "AnotherType" - }, - { - "kind": 34, - "name": "optObject", - "object": { - "kind": 8192, - "name": "optObject", - "type": "AnotherType" - }, - "type": "AnotherType" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "AnotherType" - }, - "kind": 18, - "name": "objectArray", - "object": { - "kind": 8192, - "name": "objectArray", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "[AnotherType]" - }, - "kind": 34, - "name": "objectArray", - "required": true, - "type": "[AnotherType]" - }, - { - "array": { - "item": { - "kind": 8192, - "name": "optObjectArray", - "type": "AnotherType" - }, - "kind": 18, - "name": "optObjectArray", - "object": { - "kind": 8192, - "name": "optObjectArray", - "type": "AnotherType" - }, - "type": "[AnotherType]" - }, - "kind": 34, - "name": "optObjectArray", - "type": "[AnotherType]" - }, - { - "enum": { - "kind": 16384, - "name": "en", - "required": true, - "type": "CustomEnum" - }, - "kind": 34, - "name": "en", - "required": true, - "type": "CustomEnum" - }, - { - "enum": { - "kind": 16384, - "name": "optEnum", - "type": "CustomEnum" - }, - "kind": 34, - "name": "optEnum", - "type": "CustomEnum" - }, - { - "array": { - "enum": { - "kind": 16384, - "name": "enumArray", - "required": true, - "type": "CustomEnum" - }, - "item": { - "kind": 16384, - "name": "enumArray", - "required": true, - "type": "CustomEnum" - }, - "kind": 18, - "name": "enumArray", - "required": true, - "type": "[CustomEnum]" - }, - "kind": 34, - "name": "enumArray", - "required": true, - "type": "[CustomEnum]" - }, - { - "array": { - "enum": { - "kind": 16384, - "name": "optEnumArray", - "type": "CustomEnum" - }, - "item": { - "kind": 16384, - "name": "optEnumArray", - "type": "CustomEnum" - }, - "kind": 18, - "name": "optEnumArray", - "type": "[CustomEnum]" - }, - "kind": 34, - "name": "optEnumArray", - "type": "[CustomEnum]" - }, - { - "kind": 34, - "map": { - "key": { - "kind": 4, - "name": "map", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "map", - "required": true, - "scalar": { - "kind": 4, - "name": "map", - "required": true, - "type": "Int" - }, - "type": "Map", - "value": { - "kind": 4, - "name": "map", - "required": true, - "type": "Int" - } - }, - "name": "map", - "required": true, - "type": "Map" - }, - { - "kind": 34, - "map": { - "array": { - "item": { - "kind": 4, - "name": "mapOfArr", - "required": true, - "type": "Int" - }, - "kind": 18, - "name": "mapOfArr", - "required": true, - "scalar": { - "kind": 4, - "name": "mapOfArr", - "required": true, - "type": "Int" - }, - "type": "[Int]" - }, - "key": { - "kind": 4, - "name": "mapOfArr", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "mapOfArr", - "required": true, - "type": "Map", - "value": { - "item": { - "kind": 4, - "name": "mapOfArr", - "required": true, - "type": "Int" - }, - "kind": 18, - "name": "mapOfArr", - "required": true, - "scalar": { - "kind": 4, - "name": "mapOfArr", - "required": true, - "type": "Int" - }, - "type": "[Int]" - } - }, - "name": "mapOfArr", - "required": true, - "type": "Map" - }, - { - "kind": 34, - "map": { - "key": { - "kind": 4, - "name": "mapOfObj", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "mapOfObj", - "object": { - "kind": 8192, - "name": "mapOfObj", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "Map", - "value": { - "kind": 8192, - "name": "mapOfObj", - "required": true, - "type": "AnotherType" - } - }, - "name": "mapOfObj", - "required": true, - "type": "Map" - }, - { - "kind": 34, - "map": { - "array": { - "item": { - "kind": 8192, - "name": "mapOfArrOfObj", - "required": true, - "type": "AnotherType" - }, - "kind": 18, - "name": "mapOfArrOfObj", - "object": { - "kind": 8192, - "name": "mapOfArrOfObj", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "[AnotherType]" - }, - "key": { - "kind": 4, - "name": "mapOfArrOfObj", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "mapOfArrOfObj", - "required": true, - "type": "Map", - "value": { - "item": { - "kind": 8192, - "name": "mapOfArrOfObj", - "required": true, - "type": "AnotherType" - }, - "kind": 18, - "name": "mapOfArrOfObj", - "object": { - "kind": 8192, - "name": "mapOfArrOfObj", - "required": true, - "type": "AnotherType" - }, - "required": true, - "type": "[AnotherType]" - } - }, - "name": "mapOfArrOfObj", - "required": true, - "type": "Map" - }, - { - "kind": 34, - "map": { - "key": { - "kind": 4, - "name": "mapCustomValue", - "required": true, - "type": "String" - }, - "kind": 262146, - "name": "mapCustomValue", - "object": { - "kind": 8192, - "name": "mapCustomValue", - "type": "CustomMapValue" - }, - "required": true, - "type": "Map", - "value": { - "kind": 8192, - "name": "mapCustomValue", - "type": "CustomMapValue" - } - }, - "name": "mapCustomValue", - "required": true, - "type": "Map" - } - ], - "type": "CustomType" - }, - { - "kind": 1, - "properties": [ - { - "kind": 34, - "name": "prop", - "scalar": { - "kind": 4, - "name": "prop", - "type": "String" - }, - "type": "String" - }, - { - "kind": 34, - "name": "circular", - "object": { - "kind": 8192, - "name": "circular", - "type": "CustomType" - }, - "type": "CustomType" - }, - { - "kind": 34, - "name": "const", - "scalar": { - "kind": 4, - "name": "const", - "type": "String" - }, - "type": "String" - } - ], - "type": "AnotherType" - }, - { - "kind": 1, - "properties": [ - { - "kind": 34, - "name": "foo", - "required": true, - "scalar": { - "kind": 4, - "name": "foo", - "required": true, - "type": "String" - }, - "type": "String" - } - ], - "type": "CustomMapValue" - }, - { - "kind": 1, - "properties": [ - { - "kind": 34, - "name": "else", - "required": true, - "scalar": { - "kind": 4, - "name": "else", - "required": true, - "type": "String" - }, - "type": "String" - } - ], - "type": "else" - } - ], - "version": "0.1" -} -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-as/AnotherType/index.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/AnotherType/index.ts deleted file mode 100644 index 7d2d0c8391..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-as/AnotherType/index.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { - Read, - Write, - Box, - BigInt, - BigNumber, - JSON -} from "@polywrap/wasm-as"; -import { - serializeAnotherType, - deserializeAnotherType, - writeAnotherType, - readAnotherType -} from "./serialization"; -import * as Types from ".."; - -export class AnotherType { - prop: string | null; - circular: Types.CustomType | null; - _const: string | null; - - static toBuffer(type: AnotherType): ArrayBuffer { - return serializeAnotherType(type); - } - - static fromBuffer(buffer: ArrayBuffer): AnotherType { - return deserializeAnotherType(buffer); - } - - static write(writer: Write, type: AnotherType): void { - writeAnotherType(writer, type); - } - - static read(reader: Read): AnotherType { - return readAnotherType(reader); - } -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-as/AnotherType/serialization.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/AnotherType/serialization.ts deleted file mode 100644 index 9ed99bc7a3..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-as/AnotherType/serialization.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { - Read, - ReadDecoder, - Write, - WriteSizer, - WriteEncoder, - Box, - BigInt, - BigNumber, - JSON, - Context -} from "@polywrap/wasm-as"; -import { AnotherType } from "./"; -import * as Types from ".."; - -export function serializeAnotherType(type: AnotherType): ArrayBuffer { - const sizerContext: Context = new Context("Serializing (sizing) object-type: AnotherType"); - const sizer = new WriteSizer(sizerContext); - writeAnotherType(sizer, type); - const buffer = new ArrayBuffer(sizer.length); - const encoderContext: Context = new Context("Serializing (encoding) object-type: AnotherType"); - const encoder = new WriteEncoder(buffer, sizer, encoderContext); - writeAnotherType(encoder, type); - return buffer; -} - -export function writeAnotherType(writer: Write, type: AnotherType): void { - writer.writeMapLength(3); - writer.context().push("prop", "string | null", "writing property"); - writer.writeString("prop"); - writer.writeOptionalString(type.prop); - writer.context().pop(); - writer.context().push("circular", "Types.CustomType | null", "writing property"); - writer.writeString("circular"); - if (type.circular) { - Types.CustomType.write(writer, type.circular as Types.CustomType); - } else { - writer.writeNil(); - } - writer.context().pop(); - writer.context().push("const", "string | null", "writing property"); - writer.writeString("const"); - writer.writeOptionalString(type._const); - writer.context().pop(); -} - -export function deserializeAnotherType(buffer: ArrayBuffer): AnotherType { - const context: Context = new Context("Deserializing object-type AnotherType"); - const reader = new ReadDecoder(buffer, context); - return readAnotherType(reader); -} - -export function readAnotherType(reader: Read): AnotherType { - let numFields = reader.readMapLength(); - - let _prop: string | null = null; - let _circular: Types.CustomType | null = null; - let _const: string | null = null; - - while (numFields > 0) { - numFields--; - const field = reader.readString(); - - reader.context().push(field, "unknown", "searching for property type"); - if (field == "prop") { - reader.context().push(field, "string | null", "type found, reading property"); - _prop = reader.readOptionalString(); - reader.context().pop(); - } - else if (field == "circular") { - reader.context().push(field, "Types.CustomType | null", "type found, reading property"); - let object: Types.CustomType | null = null; - if (!reader.isNextNil()) { - object = Types.CustomType.read(reader); - } - _circular = object; - reader.context().pop(); - } - else if (field == "const") { - reader.context().push(field, "string | null", "type found, reading property"); - _const = reader.readOptionalString(); - reader.context().pop(); - } - reader.context().pop(); - } - - - return { - prop: _prop, - circular: _circular, - _const: _const - }; -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-as/CustomEnum/index.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/CustomEnum/index.ts deleted file mode 100644 index 27c57a440b..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-as/CustomEnum/index.ts +++ /dev/null @@ -1,34 +0,0 @@ -export enum CustomEnum { - STRING, - BYTES, - _MAX_ -} - -export function sanitizeCustomEnumValue(value: i32): void { - const valid = value >= 0 && value < CustomEnum._MAX_; - if (!valid) { - throw new Error("Invalid value for enum 'CustomEnum': " + value.toString()); - } -} - -export function getCustomEnumValue(key: string): CustomEnum { - if (key == "STRING") { - return CustomEnum.STRING; - } - if (key == "BYTES") { - return CustomEnum.BYTES; - } - - throw new Error("Invalid key for enum 'CustomEnum': " + key); -} - -export function getCustomEnumKey(value: CustomEnum): string { - sanitizeCustomEnumValue(value); - - switch (value) { - case CustomEnum.STRING: return "STRING"; - case CustomEnum.BYTES: return "BYTES"; - default: - throw new Error("Invalid value for enum 'CustomEnum': " + value.toString()); - } -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-as/CustomMapValue/index.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/CustomMapValue/index.ts deleted file mode 100644 index 4162a95785..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-as/CustomMapValue/index.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { - Read, - Write, - Box, - BigInt, - BigNumber, - JSON -} from "@polywrap/wasm-as"; -import { - serializeCustomMapValue, - deserializeCustomMapValue, - writeCustomMapValue, - readCustomMapValue -} from "./serialization"; -import * as Types from ".."; - -export class CustomMapValue { - foo: string; - - static toBuffer(type: CustomMapValue): ArrayBuffer { - return serializeCustomMapValue(type); - } - - static fromBuffer(buffer: ArrayBuffer): CustomMapValue { - return deserializeCustomMapValue(buffer); - } - - static write(writer: Write, type: CustomMapValue): void { - writeCustomMapValue(writer, type); - } - - static read(reader: Read): CustomMapValue { - return readCustomMapValue(reader); - } -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-as/CustomMapValue/serialization.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/CustomMapValue/serialization.ts deleted file mode 100644 index d3f1ee9fb8..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-as/CustomMapValue/serialization.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { - Read, - ReadDecoder, - Write, - WriteSizer, - WriteEncoder, - Box, - BigInt, - BigNumber, - JSON, - Context -} from "@polywrap/wasm-as"; -import { CustomMapValue } from "./"; -import * as Types from ".."; - -export function serializeCustomMapValue(type: CustomMapValue): ArrayBuffer { - const sizerContext: Context = new Context("Serializing (sizing) object-type: CustomMapValue"); - const sizer = new WriteSizer(sizerContext); - writeCustomMapValue(sizer, type); - const buffer = new ArrayBuffer(sizer.length); - const encoderContext: Context = new Context("Serializing (encoding) object-type: CustomMapValue"); - const encoder = new WriteEncoder(buffer, sizer, encoderContext); - writeCustomMapValue(encoder, type); - return buffer; -} - -export function writeCustomMapValue(writer: Write, type: CustomMapValue): void { - writer.writeMapLength(1); - writer.context().push("foo", "string", "writing property"); - writer.writeString("foo"); - writer.writeString(type.foo); - writer.context().pop(); -} - -export function deserializeCustomMapValue(buffer: ArrayBuffer): CustomMapValue { - const context: Context = new Context("Deserializing object-type CustomMapValue"); - const reader = new ReadDecoder(buffer, context); - return readCustomMapValue(reader); -} - -export function readCustomMapValue(reader: Read): CustomMapValue { - let numFields = reader.readMapLength(); - - let _foo: string = ""; - let _fooSet: bool = false; - - while (numFields > 0) { - numFields--; - const field = reader.readString(); - - reader.context().push(field, "unknown", "searching for property type"); - if (field == "foo") { - reader.context().push(field, "string", "type found, reading property"); - _foo = reader.readString(); - _fooSet = true; - reader.context().pop(); - } - reader.context().pop(); - } - - if (!_fooSet) { - throw new Error(reader.context().printWithContext("Missing required property: 'foo: String'")); - } - - return { - foo: _foo - }; -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-as/CustomType/index.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/CustomType/index.ts deleted file mode 100644 index 3a0d39079e..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-as/CustomType/index.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { - Read, - Write, - Box, - BigInt, - BigNumber, - JSON -} from "@polywrap/wasm-as"; -import { - serializeCustomType, - deserializeCustomType, - writeCustomType, - readCustomType -} from "./serialization"; -import * as Types from ".."; - -export class CustomType { - str: string; - optStr: string | null; - u: u32; - optU: Box | null; - _u8: u8; - _u16: u16; - _u32: u32; - i: i32; - _i8: i8; - _i16: i16; - _i32: i32; - bigint: BigInt; - optBigint: BigInt | null; - bignumber: BigNumber; - optBignumber: BigNumber | null; - json: JSON.Value; - optJson: JSON.Value | null; - bytes: ArrayBuffer; - optBytes: ArrayBuffer | null; - _boolean: bool; - optBoolean: Box | null; - u_array: Array; - uOpt_array: Array | null; - _opt_uOptArray: Array | null> | null; - optStrOptArray: Array | null; - uArrayArray: Array>; - uOptArrayOptArray: Array | null> | null>; - uArrayOptArrayArray: Array> | null>; - crazyArray: Array | null>> | null> | null; - object: Types.AnotherType; - optObject: Types.AnotherType | null; - objectArray: Array; - optObjectArray: Array | null; - en: Types.CustomEnum; - optEnum: Box | null; - enumArray: Array; - optEnumArray: Array | null> | null; - map: Map; - mapOfArr: Map>; - mapOfObj: Map; - mapOfArrOfObj: Map>; - mapCustomValue: Map; - - static toBuffer(type: CustomType): ArrayBuffer { - return serializeCustomType(type); - } - - static fromBuffer(buffer: ArrayBuffer): CustomType { - return deserializeCustomType(buffer); - } - - static write(writer: Write, type: CustomType): void { - writeCustomType(writer, type); - } - - static read(reader: Read): CustomType { - return readCustomType(reader); - } -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-as/CustomType/serialization.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/CustomType/serialization.ts deleted file mode 100644 index fa047d5f7d..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-as/CustomType/serialization.ts +++ /dev/null @@ -1,845 +0,0 @@ -import { - Read, - ReadDecoder, - Write, - WriteSizer, - WriteEncoder, - Box, - BigInt, - BigNumber, - JSON, - Context -} from "@polywrap/wasm-as"; -import { CustomType } from "./"; -import * as Types from ".."; - -export function serializeCustomType(type: CustomType): ArrayBuffer { - const sizerContext: Context = new Context("Serializing (sizing) object-type: CustomType"); - const sizer = new WriteSizer(sizerContext); - writeCustomType(sizer, type); - const buffer = new ArrayBuffer(sizer.length); - const encoderContext: Context = new Context("Serializing (encoding) object-type: CustomType"); - const encoder = new WriteEncoder(buffer, sizer, encoderContext); - writeCustomType(encoder, type); - return buffer; -} - -export function writeCustomType(writer: Write, type: CustomType): void { - writer.writeMapLength(42); - writer.context().push("str", "string", "writing property"); - writer.writeString("str"); - writer.writeString(type.str); - writer.context().pop(); - writer.context().push("optStr", "string | null", "writing property"); - writer.writeString("optStr"); - writer.writeOptionalString(type.optStr); - writer.context().pop(); - writer.context().push("u", "u32", "writing property"); - writer.writeString("u"); - writer.writeUInt32(type.u); - writer.context().pop(); - writer.context().push("optU", "Box | null", "writing property"); - writer.writeString("optU"); - writer.writeOptionalUInt32(type.optU); - writer.context().pop(); - writer.context().push("u8", "u8", "writing property"); - writer.writeString("u8"); - writer.writeUInt8(type._u8); - writer.context().pop(); - writer.context().push("u16", "u16", "writing property"); - writer.writeString("u16"); - writer.writeUInt16(type._u16); - writer.context().pop(); - writer.context().push("u32", "u32", "writing property"); - writer.writeString("u32"); - writer.writeUInt32(type._u32); - writer.context().pop(); - writer.context().push("i", "i32", "writing property"); - writer.writeString("i"); - writer.writeInt32(type.i); - writer.context().pop(); - writer.context().push("i8", "i8", "writing property"); - writer.writeString("i8"); - writer.writeInt8(type._i8); - writer.context().pop(); - writer.context().push("i16", "i16", "writing property"); - writer.writeString("i16"); - writer.writeInt16(type._i16); - writer.context().pop(); - writer.context().push("i32", "i32", "writing property"); - writer.writeString("i32"); - writer.writeInt32(type._i32); - writer.context().pop(); - writer.context().push("bigint", "BigInt", "writing property"); - writer.writeString("bigint"); - writer.writeBigInt(type.bigint); - writer.context().pop(); - writer.context().push("optBigint", "BigInt | null", "writing property"); - writer.writeString("optBigint"); - writer.writeOptionalBigInt(type.optBigint); - writer.context().pop(); - writer.context().push("bignumber", "BigNumber", "writing property"); - writer.writeString("bignumber"); - writer.writeBigNumber(type.bignumber); - writer.context().pop(); - writer.context().push("optBignumber", "BigNumber | null", "writing property"); - writer.writeString("optBignumber"); - writer.writeOptionalBigNumber(type.optBignumber); - writer.context().pop(); - writer.context().push("json", "JSON.Value", "writing property"); - writer.writeString("json"); - writer.writeJSON(type.json); - writer.context().pop(); - writer.context().push("optJson", "JSON.Value | null", "writing property"); - writer.writeString("optJson"); - writer.writeOptionalJSON(type.optJson); - writer.context().pop(); - writer.context().push("bytes", "ArrayBuffer", "writing property"); - writer.writeString("bytes"); - writer.writeBytes(type.bytes); - writer.context().pop(); - writer.context().push("optBytes", "ArrayBuffer | null", "writing property"); - writer.writeString("optBytes"); - writer.writeOptionalBytes(type.optBytes); - writer.context().pop(); - writer.context().push("boolean", "bool", "writing property"); - writer.writeString("boolean"); - writer.writeBool(type._boolean); - writer.context().pop(); - writer.context().push("optBoolean", "Box | null", "writing property"); - writer.writeString("optBoolean"); - writer.writeOptionalBool(type.optBoolean); - writer.context().pop(); - writer.context().push("u_array", "Array", "writing property"); - writer.writeString("u_array"); - writer.writeArray(type.u_array, (writer: Write, item: u32): void => { - writer.writeUInt32(item); - }); - writer.context().pop(); - writer.context().push("uOpt_array", "Array | null", "writing property"); - writer.writeString("uOpt_array"); - writer.writeOptionalArray(type.uOpt_array, (writer: Write, item: u32): void => { - writer.writeUInt32(item); - }); - writer.context().pop(); - writer.context().push("_opt_uOptArray", "Array | null> | null", "writing property"); - writer.writeString("_opt_uOptArray"); - writer.writeOptionalArray(type._opt_uOptArray, (writer: Write, item: Box | null): void => { - writer.writeOptionalUInt32(item); - }); - writer.context().pop(); - writer.context().push("optStrOptArray", "Array | null", "writing property"); - writer.writeString("optStrOptArray"); - writer.writeOptionalArray(type.optStrOptArray, (writer: Write, item: string | null): void => { - writer.writeOptionalString(item); - }); - writer.context().pop(); - writer.context().push("uArrayArray", "Array>", "writing property"); - writer.writeString("uArrayArray"); - writer.writeArray(type.uArrayArray, (writer: Write, item: Array): void => { - writer.writeArray(item, (writer: Write, item: u32): void => { - writer.writeUInt32(item); - }); - }); - writer.context().pop(); - writer.context().push("uOptArrayOptArray", "Array | null> | null>", "writing property"); - writer.writeString("uOptArrayOptArray"); - writer.writeArray(type.uOptArrayOptArray, (writer: Write, item: Array | null> | null): void => { - writer.writeOptionalArray(item, (writer: Write, item: Box | null): void => { - writer.writeOptionalUInt32(item); - }); - }); - writer.context().pop(); - writer.context().push("uArrayOptArrayArray", "Array> | null>", "writing property"); - writer.writeString("uArrayOptArrayArray"); - writer.writeArray(type.uArrayOptArrayArray, (writer: Write, item: Array> | null): void => { - writer.writeOptionalArray(item, (writer: Write, item: Array): void => { - writer.writeArray(item, (writer: Write, item: u32): void => { - writer.writeUInt32(item); - }); - }); - }); - writer.context().pop(); - writer.context().push("crazyArray", "Array | null>> | null> | null", "writing property"); - writer.writeString("crazyArray"); - writer.writeOptionalArray(type.crazyArray, (writer: Write, item: Array | null>> | null): void => { - writer.writeOptionalArray(item, (writer: Write, item: Array | null>): void => { - writer.writeArray(item, (writer: Write, item: Array | null): void => { - writer.writeOptionalArray(item, (writer: Write, item: u32): void => { - writer.writeUInt32(item); - }); - }); - }); - }); - writer.context().pop(); - writer.context().push("object", "Types.AnotherType", "writing property"); - writer.writeString("object"); - Types.AnotherType.write(writer, type.object); - writer.context().pop(); - writer.context().push("optObject", "Types.AnotherType | null", "writing property"); - writer.writeString("optObject"); - if (type.optObject) { - Types.AnotherType.write(writer, type.optObject as Types.AnotherType); - } else { - writer.writeNil(); - } - writer.context().pop(); - writer.context().push("objectArray", "Array", "writing property"); - writer.writeString("objectArray"); - writer.writeArray(type.objectArray, (writer: Write, item: Types.AnotherType): void => { - Types.AnotherType.write(writer, item); - }); - writer.context().pop(); - writer.context().push("optObjectArray", "Array | null", "writing property"); - writer.writeString("optObjectArray"); - writer.writeOptionalArray(type.optObjectArray, (writer: Write, item: Types.AnotherType | null): void => { - if (item) { - Types.AnotherType.write(writer, item as Types.AnotherType); - } else { - writer.writeNil(); - } - }); - writer.context().pop(); - writer.context().push("en", "Types.CustomEnum", "writing property"); - writer.writeString("en"); - writer.writeInt32(type.en); - writer.context().pop(); - writer.context().push("optEnum", "Box | null", "writing property"); - writer.writeString("optEnum"); - writer.writeOptionalInt32(type.optEnum); - writer.context().pop(); - writer.context().push("enumArray", "Array", "writing property"); - writer.writeString("enumArray"); - writer.writeArray(type.enumArray, (writer: Write, item: Types.CustomEnum): void => { - writer.writeInt32(item); - }); - writer.context().pop(); - writer.context().push("optEnumArray", "Array | null> | null", "writing property"); - writer.writeString("optEnumArray"); - writer.writeOptionalArray(type.optEnumArray, (writer: Write, item: Box | null): void => { - writer.writeOptionalInt32(item); - }); - writer.context().pop(); - writer.context().push("map", "Map", "writing property"); - writer.writeString("map"); - writer.writeExtGenericMap(type.map, (writer: Write, key: string) => { - writer.writeString(key); - }, (writer: Write, value: i32): void => { - writer.writeInt32(value); - }); - writer.context().pop(); - writer.context().push("mapOfArr", "Map>", "writing property"); - writer.writeString("mapOfArr"); - writer.writeExtGenericMap(type.mapOfArr, (writer: Write, key: string) => { - writer.writeString(key); - }, (writer: Write, value: Array): void => { - writer.writeArray(value, (writer: Write, item: i32): void => { - writer.writeInt32(item); - }); - }); - writer.context().pop(); - writer.context().push("mapOfObj", "Map", "writing property"); - writer.writeString("mapOfObj"); - writer.writeExtGenericMap(type.mapOfObj, (writer: Write, key: string) => { - writer.writeString(key); - }, (writer: Write, value: Types.AnotherType): void => { - Types.AnotherType.write(writer, value); - }); - writer.context().pop(); - writer.context().push("mapOfArrOfObj", "Map>", "writing property"); - writer.writeString("mapOfArrOfObj"); - writer.writeExtGenericMap(type.mapOfArrOfObj, (writer: Write, key: string) => { - writer.writeString(key); - }, (writer: Write, value: Array): void => { - writer.writeArray(value, (writer: Write, item: Types.AnotherType): void => { - Types.AnotherType.write(writer, item); - }); - }); - writer.context().pop(); - writer.context().push("mapCustomValue", "Map", "writing property"); - writer.writeString("mapCustomValue"); - writer.writeExtGenericMap(type.mapCustomValue, (writer: Write, key: string) => { - writer.writeString(key); - }, (writer: Write, value: Types.CustomMapValue | null): void => { - if (value) { - Types.CustomMapValue.write(writer, value as Types.CustomMapValue); - } else { - writer.writeNil(); - } - }); - writer.context().pop(); -} - -export function deserializeCustomType(buffer: ArrayBuffer): CustomType { - const context: Context = new Context("Deserializing object-type CustomType"); - const reader = new ReadDecoder(buffer, context); - return readCustomType(reader); -} - -export function readCustomType(reader: Read): CustomType { - let numFields = reader.readMapLength(); - - let _str: string = ""; - let _strSet: bool = false; - let _optStr: string | null = null; - let _u: u32 = 0; - let _uSet: bool = false; - let _optU: Box | null = null; - let _u8: u8 = 0; - let _u8Set: bool = false; - let _u16: u16 = 0; - let _u16Set: bool = false; - let _u32: u32 = 0; - let _u32Set: bool = false; - let _i: i32 = 0; - let _iSet: bool = false; - let _i8: i8 = 0; - let _i8Set: bool = false; - let _i16: i16 = 0; - let _i16Set: bool = false; - let _i32: i32 = 0; - let _i32Set: bool = false; - let _bigint: BigInt = BigInt.fromUInt16(0); - let _bigintSet: bool = false; - let _optBigint: BigInt | null = null; - let _bignumber: BigNumber = new BigNumber(BigInt.fromUInt16(0), 0, 0); - let _bignumberSet: bool = false; - let _optBignumber: BigNumber | null = null; - let _json: JSON.Value = JSON.Value.Null(); - let _jsonSet: bool = false; - let _optJson: JSON.Value | null = null; - let _bytes: ArrayBuffer = new ArrayBuffer(0); - let _bytesSet: bool = false; - let _optBytes: ArrayBuffer | null = null; - let _boolean: bool = false; - let _booleanSet: bool = false; - let _optBoolean: Box | null = null; - let _u_array: Array = []; - let _u_arraySet: bool = false; - let _uOpt_array: Array | null = null; - let __opt_uOptArray: Array | null> | null = null; - let _optStrOptArray: Array | null = null; - let _uArrayArray: Array> = []; - let _uArrayArraySet: bool = false; - let _uOptArrayOptArray: Array | null> | null> = []; - let _uOptArrayOptArraySet: bool = false; - let _uArrayOptArrayArray: Array> | null> = []; - let _uArrayOptArrayArraySet: bool = false; - let _crazyArray: Array | null>> | null> | null = null; - let _object: Types.AnotherType | null = null; - let _objectSet: bool = false; - let _optObject: Types.AnotherType | null = null; - let _objectArray: Array = []; - let _objectArraySet: bool = false; - let _optObjectArray: Array | null = null; - let _en: Types.CustomEnum = 0; - let _enSet: bool = false; - let _optEnum: Box | null = null; - let _enumArray: Array = []; - let _enumArraySet: bool = false; - let _optEnumArray: Array | null> | null = null; - let _map: Map = new Map(); - let _mapSet: bool = false; - let _mapOfArr: Map> = new Map>(); - let _mapOfArrSet: bool = false; - let _mapOfObj: Map = new Map(); - let _mapOfObjSet: bool = false; - let _mapOfArrOfObj: Map> = new Map>(); - let _mapOfArrOfObjSet: bool = false; - let _mapCustomValue: Map = new Map(); - let _mapCustomValueSet: bool = false; - - while (numFields > 0) { - numFields--; - const field = reader.readString(); - - reader.context().push(field, "unknown", "searching for property type"); - if (field == "str") { - reader.context().push(field, "string", "type found, reading property"); - _str = reader.readString(); - _strSet = true; - reader.context().pop(); - } - else if (field == "optStr") { - reader.context().push(field, "string | null", "type found, reading property"); - _optStr = reader.readOptionalString(); - reader.context().pop(); - } - else if (field == "u") { - reader.context().push(field, "u32", "type found, reading property"); - _u = reader.readUInt32(); - _uSet = true; - reader.context().pop(); - } - else if (field == "optU") { - reader.context().push(field, "Box | null", "type found, reading property"); - _optU = reader.readOptionalUInt32(); - reader.context().pop(); - } - else if (field == "u8") { - reader.context().push(field, "u8", "type found, reading property"); - _u8 = reader.readUInt8(); - _u8Set = true; - reader.context().pop(); - } - else if (field == "u16") { - reader.context().push(field, "u16", "type found, reading property"); - _u16 = reader.readUInt16(); - _u16Set = true; - reader.context().pop(); - } - else if (field == "u32") { - reader.context().push(field, "u32", "type found, reading property"); - _u32 = reader.readUInt32(); - _u32Set = true; - reader.context().pop(); - } - else if (field == "i") { - reader.context().push(field, "i32", "type found, reading property"); - _i = reader.readInt32(); - _iSet = true; - reader.context().pop(); - } - else if (field == "i8") { - reader.context().push(field, "i8", "type found, reading property"); - _i8 = reader.readInt8(); - _i8Set = true; - reader.context().pop(); - } - else if (field == "i16") { - reader.context().push(field, "i16", "type found, reading property"); - _i16 = reader.readInt16(); - _i16Set = true; - reader.context().pop(); - } - else if (field == "i32") { - reader.context().push(field, "i32", "type found, reading property"); - _i32 = reader.readInt32(); - _i32Set = true; - reader.context().pop(); - } - else if (field == "bigint") { - reader.context().push(field, "BigInt", "type found, reading property"); - _bigint = reader.readBigInt(); - _bigintSet = true; - reader.context().pop(); - } - else if (field == "optBigint") { - reader.context().push(field, "BigInt | null", "type found, reading property"); - _optBigint = reader.readOptionalBigInt(); - reader.context().pop(); - } - else if (field == "bignumber") { - reader.context().push(field, "BigNumber", "type found, reading property"); - _bignumber = reader.readBigNumber(); - _bignumberSet = true; - reader.context().pop(); - } - else if (field == "optBignumber") { - reader.context().push(field, "BigNumber | null", "type found, reading property"); - _optBignumber = reader.readOptionalBigNumber(); - reader.context().pop(); - } - else if (field == "json") { - reader.context().push(field, "JSON.Value", "type found, reading property"); - _json = reader.readJSON(); - _jsonSet = true; - reader.context().pop(); - } - else if (field == "optJson") { - reader.context().push(field, "JSON.Value | null", "type found, reading property"); - _optJson = reader.readOptionalJSON(); - reader.context().pop(); - } - else if (field == "bytes") { - reader.context().push(field, "ArrayBuffer", "type found, reading property"); - _bytes = reader.readBytes(); - _bytesSet = true; - reader.context().pop(); - } - else if (field == "optBytes") { - reader.context().push(field, "ArrayBuffer | null", "type found, reading property"); - _optBytes = reader.readOptionalBytes(); - reader.context().pop(); - } - else if (field == "boolean") { - reader.context().push(field, "bool", "type found, reading property"); - _boolean = reader.readBool(); - _booleanSet = true; - reader.context().pop(); - } - else if (field == "optBoolean") { - reader.context().push(field, "Box | null", "type found, reading property"); - _optBoolean = reader.readOptionalBool(); - reader.context().pop(); - } - else if (field == "u_array") { - reader.context().push(field, "Array", "type found, reading property"); - _u_array = reader.readArray((reader: Read): u32 => { - return reader.readUInt32(); - }); - _u_arraySet = true; - reader.context().pop(); - } - else if (field == "uOpt_array") { - reader.context().push(field, "Array | null", "type found, reading property"); - _uOpt_array = reader.readOptionalArray((reader: Read): u32 => { - return reader.readUInt32(); - }); - reader.context().pop(); - } - else if (field == "_opt_uOptArray") { - reader.context().push(field, "Array | null> | null", "type found, reading property"); - __opt_uOptArray = reader.readOptionalArray((reader: Read): Box | null => { - return reader.readOptionalUInt32(); - }); - reader.context().pop(); - } - else if (field == "optStrOptArray") { - reader.context().push(field, "Array | null", "type found, reading property"); - _optStrOptArray = reader.readOptionalArray((reader: Read): string | null => { - return reader.readOptionalString(); - }); - reader.context().pop(); - } - else if (field == "uArrayArray") { - reader.context().push(field, "Array>", "type found, reading property"); - _uArrayArray = reader.readArray((reader: Read): Array => { - return reader.readArray((reader: Read): u32 => { - return reader.readUInt32(); - }); - }); - _uArrayArraySet = true; - reader.context().pop(); - } - else if (field == "uOptArrayOptArray") { - reader.context().push(field, "Array | null> | null>", "type found, reading property"); - _uOptArrayOptArray = reader.readArray((reader: Read): Array | null> | null => { - return reader.readOptionalArray((reader: Read): Box | null => { - return reader.readOptionalUInt32(); - }); - }); - _uOptArrayOptArraySet = true; - reader.context().pop(); - } - else if (field == "uArrayOptArrayArray") { - reader.context().push(field, "Array> | null>", "type found, reading property"); - _uArrayOptArrayArray = reader.readArray((reader: Read): Array> | null => { - return reader.readOptionalArray((reader: Read): Array => { - return reader.readArray((reader: Read): u32 => { - return reader.readUInt32(); - }); - }); - }); - _uArrayOptArrayArraySet = true; - reader.context().pop(); - } - else if (field == "crazyArray") { - reader.context().push(field, "Array | null>> | null> | null", "type found, reading property"); - _crazyArray = reader.readOptionalArray((reader: Read): Array | null>> | null => { - return reader.readOptionalArray((reader: Read): Array | null> => { - return reader.readArray((reader: Read): Array | null => { - return reader.readOptionalArray((reader: Read): u32 => { - return reader.readUInt32(); - }); - }); - }); - }); - reader.context().pop(); - } - else if (field == "object") { - reader.context().push(field, "Types.AnotherType", "type found, reading property"); - const object = Types.AnotherType.read(reader); - _object = object; - _objectSet = true; - reader.context().pop(); - } - else if (field == "optObject") { - reader.context().push(field, "Types.AnotherType | null", "type found, reading property"); - let object: Types.AnotherType | null = null; - if (!reader.isNextNil()) { - object = Types.AnotherType.read(reader); - } - _optObject = object; - reader.context().pop(); - } - else if (field == "objectArray") { - reader.context().push(field, "Array", "type found, reading property"); - _objectArray = reader.readArray((reader: Read): Types.AnotherType => { - const object = Types.AnotherType.read(reader); - return object; - }); - _objectArraySet = true; - reader.context().pop(); - } - else if (field == "optObjectArray") { - reader.context().push(field, "Array | null", "type found, reading property"); - _optObjectArray = reader.readOptionalArray((reader: Read): Types.AnotherType | null => { - let object: Types.AnotherType | null = null; - if (!reader.isNextNil()) { - object = Types.AnotherType.read(reader); - } - return object; - }); - reader.context().pop(); - } - else if (field == "en") { - reader.context().push(field, "Types.CustomEnum", "type found, reading property"); - let value: Types.CustomEnum; - if (reader.isNextString()) { - value = Types.getCustomEnumValue(reader.readString()); - } else { - value = reader.readInt32(); - Types.sanitizeCustomEnumValue(value); - } - _en = value; - _enSet = true; - reader.context().pop(); - } - else if (field == "optEnum") { - reader.context().push(field, "Box | null", "type found, reading property"); - let value: Box | null; - if (!reader.isNextNil()) { - if (reader.isNextString()) { - value = Box.from( - Types.getCustomEnumValue(reader.readString()) - ); - } else { - value = Box.from( - reader.readInt32() - ); - Types.sanitizeCustomEnumValue(value.unwrap()); - } - } else { - value = null; - } - _optEnum = value; - reader.context().pop(); - } - else if (field == "enumArray") { - reader.context().push(field, "Array", "type found, reading property"); - _enumArray = reader.readArray((reader: Read): Types.CustomEnum => { - let value: Types.CustomEnum; - if (reader.isNextString()) { - value = Types.getCustomEnumValue(reader.readString()); - } else { - value = reader.readInt32(); - Types.sanitizeCustomEnumValue(value); - } - return value; - }); - _enumArraySet = true; - reader.context().pop(); - } - else if (field == "optEnumArray") { - reader.context().push(field, "Array | null> | null", "type found, reading property"); - _optEnumArray = reader.readOptionalArray((reader: Read): Box | null => { - let value: Box | null; - if (!reader.isNextNil()) { - if (reader.isNextString()) { - value = Box.from( - Types.getCustomEnumValue(reader.readString()) - ); - } else { - value = Box.from( - reader.readInt32() - ); - Types.sanitizeCustomEnumValue(value.unwrap()); - } - } else { - value = null; - } - return value; - }); - reader.context().pop(); - } - else if (field == "map") { - reader.context().push(field, "Map", "type found, reading property"); - _map = reader.readExtGenericMap((reader: Read): string => { - return reader.readString(); - }, (reader: Read): i32 => { - return reader.readInt32(); - }); - _mapSet = true; - reader.context().pop(); - } - else if (field == "mapOfArr") { - reader.context().push(field, "Map>", "type found, reading property"); - _mapOfArr = reader.readExtGenericMap((reader: Read): string => { - return reader.readString(); - }, (reader: Read): Array => { - return reader.readArray((reader: Read): i32 => { - return reader.readInt32(); - }); - }); - _mapOfArrSet = true; - reader.context().pop(); - } - else if (field == "mapOfObj") { - reader.context().push(field, "Map", "type found, reading property"); - _mapOfObj = reader.readExtGenericMap((reader: Read): string => { - return reader.readString(); - }, (reader: Read): Types.AnotherType => { - const object = Types.AnotherType.read(reader); - return object; - }); - _mapOfObjSet = true; - reader.context().pop(); - } - else if (field == "mapOfArrOfObj") { - reader.context().push(field, "Map>", "type found, reading property"); - _mapOfArrOfObj = reader.readExtGenericMap((reader: Read): string => { - return reader.readString(); - }, (reader: Read): Array => { - return reader.readArray((reader: Read): Types.AnotherType => { - const object = Types.AnotherType.read(reader); - return object; - }); - }); - _mapOfArrOfObjSet = true; - reader.context().pop(); - } - else if (field == "mapCustomValue") { - reader.context().push(field, "Map", "type found, reading property"); - _mapCustomValue = reader.readExtGenericMap((reader: Read): string => { - return reader.readString(); - }, (reader: Read): Types.CustomMapValue | null => { - let object: Types.CustomMapValue | null = null; - if (!reader.isNextNil()) { - object = Types.CustomMapValue.read(reader); - } - return object; - }); - _mapCustomValueSet = true; - reader.context().pop(); - } - reader.context().pop(); - } - - if (!_strSet) { - throw new Error(reader.context().printWithContext("Missing required property: 'str: String'")); - } - if (!_uSet) { - throw new Error(reader.context().printWithContext("Missing required property: 'u: UInt'")); - } - if (!_u8Set) { - throw new Error(reader.context().printWithContext("Missing required property: 'u8: UInt8'")); - } - if (!_u16Set) { - throw new Error(reader.context().printWithContext("Missing required property: 'u16: UInt16'")); - } - if (!_u32Set) { - throw new Error(reader.context().printWithContext("Missing required property: 'u32: UInt32'")); - } - if (!_iSet) { - throw new Error(reader.context().printWithContext("Missing required property: 'i: Int'")); - } - if (!_i8Set) { - throw new Error(reader.context().printWithContext("Missing required property: 'i8: Int8'")); - } - if (!_i16Set) { - throw new Error(reader.context().printWithContext("Missing required property: 'i16: Int16'")); - } - if (!_i32Set) { - throw new Error(reader.context().printWithContext("Missing required property: 'i32: Int32'")); - } - if (!_bigintSet) { - throw new Error(reader.context().printWithContext("Missing required property: 'bigint: BigInt'")); - } - if (!_bignumberSet) { - throw new Error(reader.context().printWithContext("Missing required property: 'bignumber: BigNumber'")); - } - if (!_jsonSet) { - throw new Error(reader.context().printWithContext("Missing required property: 'json: JSON'")); - } - if (!_bytesSet) { - throw new Error(reader.context().printWithContext("Missing required property: 'bytes: Bytes'")); - } - if (!_booleanSet) { - throw new Error(reader.context().printWithContext("Missing required property: 'boolean: Boolean'")); - } - if (!_u_arraySet) { - throw new Error(reader.context().printWithContext("Missing required property: 'u_array: [UInt]'")); - } - if (!_uArrayArraySet) { - throw new Error(reader.context().printWithContext("Missing required property: 'uArrayArray: [[UInt]]'")); - } - if (!_uOptArrayOptArraySet) { - throw new Error(reader.context().printWithContext("Missing required property: 'uOptArrayOptArray: [[UInt32]]'")); - } - if (!_uArrayOptArrayArraySet) { - throw new Error(reader.context().printWithContext("Missing required property: 'uArrayOptArrayArray: [[[UInt32]]]'")); - } - if (!_object || !_objectSet) { - throw new Error(reader.context().printWithContext("Missing required property: 'object: AnotherType'")); - } - if (!_objectArraySet) { - throw new Error(reader.context().printWithContext("Missing required property: 'objectArray: [AnotherType]'")); - } - if (!_enSet) { - throw new Error(reader.context().printWithContext("Missing required property: 'en: CustomEnum'")); - } - if (!_enumArraySet) { - throw new Error(reader.context().printWithContext("Missing required property: 'enumArray: [CustomEnum]'")); - } - if (!_mapSet) { - throw new Error(reader.context().printWithContext("Missing required property: 'map: Map'")); - } - if (!_mapOfArrSet) { - throw new Error(reader.context().printWithContext("Missing required property: 'mapOfArr: Map'")); - } - if (!_mapOfObjSet) { - throw new Error(reader.context().printWithContext("Missing required property: 'mapOfObj: Map'")); - } - if (!_mapOfArrOfObjSet) { - throw new Error(reader.context().printWithContext("Missing required property: 'mapOfArrOfObj: Map'")); - } - if (!_mapCustomValueSet) { - throw new Error(reader.context().printWithContext("Missing required property: 'mapCustomValue: Map'")); - } - - return { - str: _str, - optStr: _optStr, - u: _u, - optU: _optU, - _u8: _u8, - _u16: _u16, - _u32: _u32, - i: _i, - _i8: _i8, - _i16: _i16, - _i32: _i32, - bigint: _bigint, - optBigint: _optBigint, - bignumber: _bignumber, - optBignumber: _optBignumber, - json: _json, - optJson: _optJson, - bytes: _bytes, - optBytes: _optBytes, - _boolean: _boolean, - optBoolean: _optBoolean, - u_array: _u_array, - uOpt_array: _uOpt_array, - _opt_uOptArray: __opt_uOptArray, - optStrOptArray: _optStrOptArray, - uArrayArray: _uArrayArray, - uOptArrayOptArray: _uOptArrayOptArray, - uArrayOptArrayArray: _uArrayOptArrayArray, - crazyArray: _crazyArray, - object: _object, - optObject: _optObject, - objectArray: _objectArray, - optObjectArray: _optObjectArray, - en: _en, - optEnum: _optEnum, - enumArray: _enumArray, - optEnumArray: _optEnumArray, - map: _map, - mapOfArr: _mapOfArr, - mapOfObj: _mapOfObj, - mapOfArrOfObj: _mapOfArrOfObj, - mapCustomValue: _mapCustomValue - }; -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-as/Env/index.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/Env/index.ts deleted file mode 100644 index 6e9417c587..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-as/Env/index.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { - Read, - Write, - Box, - BigInt, - BigNumber, - JSON -} from "@polywrap/wasm-as"; -import { - serializeEnv, - deserializeEnv, - writeEnv, - readEnv -} from "./serialization"; -import * as Types from ".."; - -export class Env { - prop: string; - optProp: string | null; - optMap: Map | null> | null; - - static toBuffer(type: Env): ArrayBuffer { - return serializeEnv(type); - } - - static fromBuffer(buffer: ArrayBuffer): Env { - return deserializeEnv(buffer); - } - - static write(writer: Write, type: Env): void { - writeEnv(writer, type); - } - - static read(reader: Read): Env { - return readEnv(reader); - } -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-as/Env/serialization.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/Env/serialization.ts deleted file mode 100644 index 84186a0ea1..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-as/Env/serialization.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { - Read, - ReadDecoder, - Write, - WriteSizer, - WriteEncoder, - Box, - BigInt, - BigNumber, - JSON, - Context -} from "@polywrap/wasm-as"; -import { Env } from "./"; -import * as Types from ".."; - -export function serializeEnv(type: Env): ArrayBuffer { - const sizerContext: Context = new Context("Serializing (sizing) env-type: Env"); - const sizer = new WriteSizer(sizerContext); - writeEnv(sizer, type); - const buffer = new ArrayBuffer(sizer.length); - const encoderContext: Context = new Context("Serializing (encoding) env-type: Env"); - const encoder = new WriteEncoder(buffer, sizer, encoderContext); - writeEnv(encoder, type); - return buffer; -} - -export function writeEnv(writer: Write, type: Env): void { - writer.writeMapLength(3); - writer.context().push("prop", "string", "writing property"); - writer.writeString("prop"); - writer.writeString(type.prop); - writer.context().pop(); - writer.context().push("optProp", "string | null", "writing property"); - writer.writeString("optProp"); - writer.writeOptionalString(type.optProp); - writer.context().pop(); - writer.context().push("optMap", "Map | null> | null", "writing property"); - writer.writeString("optMap"); - writer.writeOptionalExtGenericMap(type.optMap, (writer: Write, key: string) => { - writer.writeString(key); - }, (writer: Write, value: Box | null): void => { - writer.writeOptionalInt32(value); - }); - writer.context().pop(); -} - -export function deserializeEnv(buffer: ArrayBuffer): Env { - const context: Context = new Context("Deserializing env-type Env"); - const reader = new ReadDecoder(buffer, context); - return readEnv(reader); -} - -export function readEnv(reader: Read): Env { - let numFields = reader.readMapLength(); - - let _prop: string = ""; - let _propSet: bool = false; - let _optProp: string | null = null; - let _optMap: Map | null> | null = null; - - while (numFields > 0) { - numFields--; - const field = reader.readString(); - - reader.context().push(field, "unknown", "searching for property type"); - if (field == "prop") { - reader.context().push(field, "string", "type found, reading property"); - _prop = reader.readString(); - _propSet = true; - reader.context().pop(); - } - else if (field == "optProp") { - reader.context().push(field, "string | null", "type found, reading property"); - _optProp = reader.readOptionalString(); - reader.context().pop(); - } - else if (field == "optMap") { - reader.context().push(field, "Map | null> | null", "type found, reading property"); - _optMap = reader.readOptionalExtGenericMap((reader: Read): string => { - return reader.readString(); - }, (reader: Read): Box | null => { - return reader.readOptionalInt32(); - }); - reader.context().pop(); - } - reader.context().pop(); - } - - if (!_propSet) { - throw new Error(reader.context().printWithContext("Missing required property: 'prop: String'")); - } - - return { - prop: _prop, - optProp: _optProp, - optMap: _optMap - }; -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-as/Module/index.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/Module/index.ts deleted file mode 100644 index 2cd8b85ef7..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-as/Module/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { - Args_moduleMethod, - Args_objectMethod, - Args_optionalEnvMethod, - Args__if -} from "./serialization"; - -export { - Args_moduleMethod, - Args_objectMethod, - Args_optionalEnvMethod, - Args__if -}; -export { ModuleBase } from "./module"; diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-as/Module/module.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/Module/module.ts deleted file mode 100644 index 71295ecdb2..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-as/Module/module.ts +++ /dev/null @@ -1,28 +0,0 @@ -import * as Types from ".."; - -import { - BigInt, - BigNumber, - Box, - JSON, -} from "@polywrap/wasm-as"; - -export abstract class ModuleBase { - abstract moduleMethod( - args: Types.Args_moduleMethod - ): i32; - - abstract objectMethod( - args: Types.Args_objectMethod, - env: Types.Env - ): Types.AnotherType | null; - - abstract optionalEnvMethod( - args: Types.Args_optionalEnvMethod, - env: Types.Env | null - ): Types.AnotherType | null; - - abstract _if( - args: Types.Args__if - ): Types._else; -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-as/Module/serialization.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/Module/serialization.ts deleted file mode 100644 index 3cf8cc78d7..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-as/Module/serialization.ts +++ /dev/null @@ -1,770 +0,0 @@ -import { - Read, - ReadDecoder, - Write, - WriteSizer, - WriteEncoder, - Box, - BigInt, - BigNumber, - JSON, - Context -} from "@polywrap/wasm-as"; -import * as Types from ".."; - -export class Args_moduleMethod { - str: string; - optStr: string | null; - en: Types.CustomEnum; - optEnum: Box | null; - enumArray: Array; - optEnumArray: Array | null> | null; - map: Map; - mapOfArr: Map>; - mapOfMap: Map>; - mapOfObj: Map; - mapOfArrOfObj: Map>; -} - -export function deserializemoduleMethodArgs(argsBuf: ArrayBuffer): Args_moduleMethod { - const context: Context = new Context("Deserializing module-type: moduleMethod Args"); - const reader = new ReadDecoder(argsBuf, context); - let numFields = reader.readMapLength(); - - let _str: string = ""; - let _strSet: bool = false; - let _optStr: string | null = null; - let _en: Types.CustomEnum = 0; - let _enSet: bool = false; - let _optEnum: Box | null = null; - let _enumArray: Array = []; - let _enumArraySet: bool = false; - let _optEnumArray: Array | null> | null = null; - let _map: Map = new Map(); - let _mapSet: bool = false; - let _mapOfArr: Map> = new Map>(); - let _mapOfArrSet: bool = false; - let _mapOfMap: Map> = new Map>(); - let _mapOfMapSet: bool = false; - let _mapOfObj: Map = new Map(); - let _mapOfObjSet: bool = false; - let _mapOfArrOfObj: Map> = new Map>(); - let _mapOfArrOfObjSet: bool = false; - - while (numFields > 0) { - numFields--; - const field = reader.readString(); - - reader.context().push(field, "unknown", "searching for property type"); - if (field == "str") { - reader.context().push(field, "string", "type found, reading property"); - _str = reader.readString(); - _strSet = true; - reader.context().pop(); - } - else if (field == "optStr") { - reader.context().push(field, "string | null", "type found, reading property"); - _optStr = reader.readOptionalString(); - reader.context().pop(); - } - else if (field == "en") { - reader.context().push(field, "Types.CustomEnum", "type found, reading property"); - let value: Types.CustomEnum; - if (reader.isNextString()) { - value = Types.getCustomEnumValue(reader.readString()); - } else { - value = reader.readInt32(); - Types.sanitizeCustomEnumValue(value); - } - _en = value; - _enSet = true; - reader.context().pop(); - } - else if (field == "optEnum") { - reader.context().push(field, "Box | null", "type found, reading property"); - let value: Box | null; - if (!reader.isNextNil()) { - if (reader.isNextString()) { - value = Box.from( - Types.getCustomEnumValue(reader.readString()) - ); - } else { - value = Box.from( - reader.readInt32() - ); - Types.sanitizeCustomEnumValue(value.unwrap()); - } - } else { - value = null; - } - _optEnum = value; - reader.context().pop(); - } - else if (field == "enumArray") { - reader.context().push(field, "Array", "type found, reading property"); - _enumArray = reader.readArray((reader: Read): Types.CustomEnum => { - let value: Types.CustomEnum; - if (reader.isNextString()) { - value = Types.getCustomEnumValue(reader.readString()); - } else { - value = reader.readInt32(); - Types.sanitizeCustomEnumValue(value); - } - return value; - }); - _enumArraySet = true; - reader.context().pop(); - } - else if (field == "optEnumArray") { - reader.context().push(field, "Array | null> | null", "type found, reading property"); - _optEnumArray = reader.readOptionalArray((reader: Read): Box | null => { - let value: Box | null; - if (!reader.isNextNil()) { - if (reader.isNextString()) { - value = Box.from( - Types.getCustomEnumValue(reader.readString()) - ); - } else { - value = Box.from( - reader.readInt32() - ); - Types.sanitizeCustomEnumValue(value.unwrap()); - } - } else { - value = null; - } - return value; - }); - reader.context().pop(); - } - else if (field == "map") { - reader.context().push(field, "Map", "type found, reading property"); - _map = reader.readExtGenericMap((reader: Read): string => { - return reader.readString(); - }, (reader: Read): i32 => { - return reader.readInt32(); - }); - _mapSet = true; - reader.context().pop(); - } - else if (field == "mapOfArr") { - reader.context().push(field, "Map>", "type found, reading property"); - _mapOfArr = reader.readExtGenericMap((reader: Read): string => { - return reader.readString(); - }, (reader: Read): Array => { - return reader.readArray((reader: Read): i32 => { - return reader.readInt32(); - }); - }); - _mapOfArrSet = true; - reader.context().pop(); - } - else if (field == "mapOfMap") { - reader.context().push(field, "Map>", "type found, reading property"); - _mapOfMap = reader.readExtGenericMap((reader: Read): string => { - return reader.readString(); - }, (reader: Read): Map => { - return reader.readExtGenericMap((reader: Read): string => { - return reader.readString(); - }, (reader: Read): i32 => { - return reader.readInt32(); - }); - }); - _mapOfMapSet = true; - reader.context().pop(); - } - else if (field == "mapOfObj") { - reader.context().push(field, "Map", "type found, reading property"); - _mapOfObj = reader.readExtGenericMap((reader: Read): string => { - return reader.readString(); - }, (reader: Read): Types.AnotherType => { - const object = Types.AnotherType.read(reader); - return object; - }); - _mapOfObjSet = true; - reader.context().pop(); - } - else if (field == "mapOfArrOfObj") { - reader.context().push(field, "Map>", "type found, reading property"); - _mapOfArrOfObj = reader.readExtGenericMap((reader: Read): string => { - return reader.readString(); - }, (reader: Read): Array => { - return reader.readArray((reader: Read): Types.AnotherType => { - const object = Types.AnotherType.read(reader); - return object; - }); - }); - _mapOfArrOfObjSet = true; - reader.context().pop(); - } - reader.context().pop(); - } - - if (!_strSet) { - throw new Error(reader.context().printWithContext("Missing required argument: 'str: String'")); - } - if (!_enSet) { - throw new Error(reader.context().printWithContext("Missing required argument: 'en: CustomEnum'")); - } - if (!_enumArraySet) { - throw new Error(reader.context().printWithContext("Missing required argument: 'enumArray: [CustomEnum]'")); - } - if (!_mapSet) { - throw new Error(reader.context().printWithContext("Missing required argument: 'map: Map'")); - } - if (!_mapOfArrSet) { - throw new Error(reader.context().printWithContext("Missing required argument: 'mapOfArr: Map'")); - } - if (!_mapOfMapSet) { - throw new Error(reader.context().printWithContext("Missing required argument: 'mapOfMap: Map>'")); - } - if (!_mapOfObjSet) { - throw new Error(reader.context().printWithContext("Missing required argument: 'mapOfObj: Map'")); - } - if (!_mapOfArrOfObjSet) { - throw new Error(reader.context().printWithContext("Missing required argument: 'mapOfArrOfObj: Map'")); - } - - return { - str: _str, - optStr: _optStr, - en: _en, - optEnum: _optEnum, - enumArray: _enumArray, - optEnumArray: _optEnumArray, - map: _map, - mapOfArr: _mapOfArr, - mapOfMap: _mapOfMap, - mapOfObj: _mapOfObj, - mapOfArrOfObj: _mapOfArrOfObj - }; -} - -export function serializemoduleMethodArgs(args: Args_moduleMethod): ArrayBuffer { - const sizerContext: Context = new Context("Serializing (sizing) module-type: moduleMethod Args"); - const sizer = new WriteSizer(sizerContext); - writemoduleMethodArgs(sizer, args); - const buffer = new ArrayBuffer(sizer.length); - const encoderContext: Context = new Context("Serializing (encoding) module-type: moduleMethod Args"); - const encoder = new WriteEncoder(buffer, sizer, encoderContext); - writemoduleMethodArgs(encoder, args); - return buffer; -} - -export function writemoduleMethodArgs( - writer: Write, - args: Args_moduleMethod -): void { - writer.writeMapLength(11); - writer.context().push("str", "string", "writing property"); - writer.writeString("str"); - writer.writeString(args.str); - writer.context().pop(); - writer.context().push("optStr", "string | null", "writing property"); - writer.writeString("optStr"); - writer.writeOptionalString(args.optStr); - writer.context().pop(); - writer.context().push("en", "Types.CustomEnum", "writing property"); - writer.writeString("en"); - writer.writeInt32(args.en); - writer.context().pop(); - writer.context().push("optEnum", "Box | null", "writing property"); - writer.writeString("optEnum"); - writer.writeOptionalInt32(args.optEnum); - writer.context().pop(); - writer.context().push("enumArray", "Array", "writing property"); - writer.writeString("enumArray"); - writer.writeArray(args.enumArray, (writer: Write, item: Types.CustomEnum): void => { - writer.writeInt32(item); - }); - writer.context().pop(); - writer.context().push("optEnumArray", "Array | null> | null", "writing property"); - writer.writeString("optEnumArray"); - writer.writeOptionalArray(args.optEnumArray, (writer: Write, item: Box | null): void => { - writer.writeOptionalInt32(item); - }); - writer.context().pop(); - writer.context().push("map", "Map", "writing property"); - writer.writeString("map"); - writer.writeExtGenericMap(args.map, (writer: Write, key: string) => { - writer.writeString(key); - }, (writer: Write, value: i32): void => { - writer.writeInt32(value); - }); - writer.context().pop(); - writer.context().push("mapOfArr", "Map>", "writing property"); - writer.writeString("mapOfArr"); - writer.writeExtGenericMap(args.mapOfArr, (writer: Write, key: string) => { - writer.writeString(key); - }, (writer: Write, value: Array): void => { - writer.writeArray(value, (writer: Write, item: i32): void => { - writer.writeInt32(item); - }); - }); - writer.context().pop(); - writer.context().push("mapOfMap", "Map>", "writing property"); - writer.writeString("mapOfMap"); - writer.writeExtGenericMap(args.mapOfMap, (writer: Write, key: string) => { - writer.writeString(key); - }, (writer: Write, value: Map): void => { - writer.writeExtGenericMap(value, (writer: Write, key: string) => { - writer.writeString(key); - }, (writer: Write, value: i32): void => { - writer.writeInt32(value); - }); - }); - writer.context().pop(); - writer.context().push("mapOfObj", "Map", "writing property"); - writer.writeString("mapOfObj"); - writer.writeExtGenericMap(args.mapOfObj, (writer: Write, key: string) => { - writer.writeString(key); - }, (writer: Write, value: Types.AnotherType): void => { - Types.AnotherType.write(writer, value); - }); - writer.context().pop(); - writer.context().push("mapOfArrOfObj", "Map>", "writing property"); - writer.writeString("mapOfArrOfObj"); - writer.writeExtGenericMap(args.mapOfArrOfObj, (writer: Write, key: string) => { - writer.writeString(key); - }, (writer: Write, value: Array): void => { - writer.writeArray(value, (writer: Write, item: Types.AnotherType): void => { - Types.AnotherType.write(writer, item); - }); - }); - writer.context().pop(); -} - -export function serializemoduleMethodResult(result: i32): ArrayBuffer { - const sizerContext: Context = new Context("Serializing (sizing) module-type: moduleMethod Result"); - const sizer = new WriteSizer(sizerContext); - writemoduleMethodResult(sizer, result); - const buffer = new ArrayBuffer(sizer.length); - const encoderContext: Context = new Context("Serializing (encoding) module-type: moduleMethod Result"); - const encoder = new WriteEncoder(buffer, sizer, encoderContext); - writemoduleMethodResult(encoder, result); - return buffer; -} - -export function writemoduleMethodResult(writer: Write, result: i32): void { - writer.context().push("moduleMethod", "i32", "writing property"); - writer.writeInt32(result); - writer.context().pop(); -} - -export function deserializemoduleMethodResult(buffer: ArrayBuffer): i32 { - const context: Context = new Context("Deserializing module-type: moduleMethod Result"); - const reader = new ReadDecoder(buffer, context); - - reader.context().push("moduleMethod", "i32", "reading function output"); - const res: i32 = reader.readInt32(); - reader.context().pop(); - - return res; -} - -export class Args_objectMethod { - object: Types.AnotherType; - optObject: Types.AnotherType | null; - objectArray: Array; - optObjectArray: Array | null; -} - -export function deserializeobjectMethodArgs(argsBuf: ArrayBuffer): Args_objectMethod { - const context: Context = new Context("Deserializing module-type: objectMethod Args"); - const reader = new ReadDecoder(argsBuf, context); - let numFields = reader.readMapLength(); - - let _object: Types.AnotherType | null = null; - let _objectSet: bool = false; - let _optObject: Types.AnotherType | null = null; - let _objectArray: Array = []; - let _objectArraySet: bool = false; - let _optObjectArray: Array | null = null; - - while (numFields > 0) { - numFields--; - const field = reader.readString(); - - reader.context().push(field, "unknown", "searching for property type"); - if (field == "object") { - reader.context().push(field, "Types.AnotherType", "type found, reading property"); - const object = Types.AnotherType.read(reader); - _object = object; - _objectSet = true; - reader.context().pop(); - } - else if (field == "optObject") { - reader.context().push(field, "Types.AnotherType | null", "type found, reading property"); - let object: Types.AnotherType | null = null; - if (!reader.isNextNil()) { - object = Types.AnotherType.read(reader); - } - _optObject = object; - reader.context().pop(); - } - else if (field == "objectArray") { - reader.context().push(field, "Array", "type found, reading property"); - _objectArray = reader.readArray((reader: Read): Types.AnotherType => { - const object = Types.AnotherType.read(reader); - return object; - }); - _objectArraySet = true; - reader.context().pop(); - } - else if (field == "optObjectArray") { - reader.context().push(field, "Array | null", "type found, reading property"); - _optObjectArray = reader.readOptionalArray((reader: Read): Types.AnotherType | null => { - let object: Types.AnotherType | null = null; - if (!reader.isNextNil()) { - object = Types.AnotherType.read(reader); - } - return object; - }); - reader.context().pop(); - } - reader.context().pop(); - } - - if (!_object || !_objectSet) { - throw new Error(reader.context().printWithContext("Missing required argument: 'object: AnotherType'")); - } - if (!_objectArraySet) { - throw new Error(reader.context().printWithContext("Missing required argument: 'objectArray: [AnotherType]'")); - } - - return { - object: _object, - optObject: _optObject, - objectArray: _objectArray, - optObjectArray: _optObjectArray - }; -} - -export function serializeobjectMethodArgs(args: Args_objectMethod): ArrayBuffer { - const sizerContext: Context = new Context("Serializing (sizing) module-type: objectMethod Args"); - const sizer = new WriteSizer(sizerContext); - writeobjectMethodArgs(sizer, args); - const buffer = new ArrayBuffer(sizer.length); - const encoderContext: Context = new Context("Serializing (encoding) module-type: objectMethod Args"); - const encoder = new WriteEncoder(buffer, sizer, encoderContext); - writeobjectMethodArgs(encoder, args); - return buffer; -} - -export function writeobjectMethodArgs( - writer: Write, - args: Args_objectMethod -): void { - writer.writeMapLength(4); - writer.context().push("object", "Types.AnotherType", "writing property"); - writer.writeString("object"); - Types.AnotherType.write(writer, args.object); - writer.context().pop(); - writer.context().push("optObject", "Types.AnotherType | null", "writing property"); - writer.writeString("optObject"); - if (args.optObject) { - Types.AnotherType.write(writer, args.optObject as Types.AnotherType); - } else { - writer.writeNil(); - } - writer.context().pop(); - writer.context().push("objectArray", "Array", "writing property"); - writer.writeString("objectArray"); - writer.writeArray(args.objectArray, (writer: Write, item: Types.AnotherType): void => { - Types.AnotherType.write(writer, item); - }); - writer.context().pop(); - writer.context().push("optObjectArray", "Array | null", "writing property"); - writer.writeString("optObjectArray"); - writer.writeOptionalArray(args.optObjectArray, (writer: Write, item: Types.AnotherType | null): void => { - if (item) { - Types.AnotherType.write(writer, item as Types.AnotherType); - } else { - writer.writeNil(); - } - }); - writer.context().pop(); -} - -export function serializeobjectMethodResult(result: Types.AnotherType | null): ArrayBuffer { - const sizerContext: Context = new Context("Serializing (sizing) module-type: objectMethod Result"); - const sizer = new WriteSizer(sizerContext); - writeobjectMethodResult(sizer, result); - const buffer = new ArrayBuffer(sizer.length); - const encoderContext: Context = new Context("Serializing (encoding) module-type: objectMethod Result"); - const encoder = new WriteEncoder(buffer, sizer, encoderContext); - writeobjectMethodResult(encoder, result); - return buffer; -} - -export function writeobjectMethodResult(writer: Write, result: Types.AnotherType | null): void { - writer.context().push("objectMethod", "Types.AnotherType | null", "writing property"); - if (result) { - Types.AnotherType.write(writer, result as Types.AnotherType); - } else { - writer.writeNil(); - } - writer.context().pop(); -} - -export function deserializeobjectMethodResult(buffer: ArrayBuffer): Types.AnotherType | null { - const context: Context = new Context("Deserializing module-type: objectMethod Result"); - const reader = new ReadDecoder(buffer, context); - - reader.context().push("objectMethod", "Types.AnotherType | null", "reading function output"); - let object: Types.AnotherType | null = null; - if (!reader.isNextNil()) { - object = Types.AnotherType.read(reader); - } - const res: Types.AnotherType | null = object; - reader.context().pop(); - - return res; -} - -export class Args_optionalEnvMethod { - object: Types.AnotherType; - optObject: Types.AnotherType | null; - objectArray: Array; - optObjectArray: Array | null; -} - -export function deserializeoptionalEnvMethodArgs(argsBuf: ArrayBuffer): Args_optionalEnvMethod { - const context: Context = new Context("Deserializing module-type: optionalEnvMethod Args"); - const reader = new ReadDecoder(argsBuf, context); - let numFields = reader.readMapLength(); - - let _object: Types.AnotherType | null = null; - let _objectSet: bool = false; - let _optObject: Types.AnotherType | null = null; - let _objectArray: Array = []; - let _objectArraySet: bool = false; - let _optObjectArray: Array | null = null; - - while (numFields > 0) { - numFields--; - const field = reader.readString(); - - reader.context().push(field, "unknown", "searching for property type"); - if (field == "object") { - reader.context().push(field, "Types.AnotherType", "type found, reading property"); - const object = Types.AnotherType.read(reader); - _object = object; - _objectSet = true; - reader.context().pop(); - } - else if (field == "optObject") { - reader.context().push(field, "Types.AnotherType | null", "type found, reading property"); - let object: Types.AnotherType | null = null; - if (!reader.isNextNil()) { - object = Types.AnotherType.read(reader); - } - _optObject = object; - reader.context().pop(); - } - else if (field == "objectArray") { - reader.context().push(field, "Array", "type found, reading property"); - _objectArray = reader.readArray((reader: Read): Types.AnotherType => { - const object = Types.AnotherType.read(reader); - return object; - }); - _objectArraySet = true; - reader.context().pop(); - } - else if (field == "optObjectArray") { - reader.context().push(field, "Array | null", "type found, reading property"); - _optObjectArray = reader.readOptionalArray((reader: Read): Types.AnotherType | null => { - let object: Types.AnotherType | null = null; - if (!reader.isNextNil()) { - object = Types.AnotherType.read(reader); - } - return object; - }); - reader.context().pop(); - } - reader.context().pop(); - } - - if (!_object || !_objectSet) { - throw new Error(reader.context().printWithContext("Missing required argument: 'object: AnotherType'")); - } - if (!_objectArraySet) { - throw new Error(reader.context().printWithContext("Missing required argument: 'objectArray: [AnotherType]'")); - } - - return { - object: _object, - optObject: _optObject, - objectArray: _objectArray, - optObjectArray: _optObjectArray - }; -} - -export function serializeoptionalEnvMethodArgs(args: Args_optionalEnvMethod): ArrayBuffer { - const sizerContext: Context = new Context("Serializing (sizing) module-type: optionalEnvMethod Args"); - const sizer = new WriteSizer(sizerContext); - writeoptionalEnvMethodArgs(sizer, args); - const buffer = new ArrayBuffer(sizer.length); - const encoderContext: Context = new Context("Serializing (encoding) module-type: optionalEnvMethod Args"); - const encoder = new WriteEncoder(buffer, sizer, encoderContext); - writeoptionalEnvMethodArgs(encoder, args); - return buffer; -} - -export function writeoptionalEnvMethodArgs( - writer: Write, - args: Args_optionalEnvMethod -): void { - writer.writeMapLength(4); - writer.context().push("object", "Types.AnotherType", "writing property"); - writer.writeString("object"); - Types.AnotherType.write(writer, args.object); - writer.context().pop(); - writer.context().push("optObject", "Types.AnotherType | null", "writing property"); - writer.writeString("optObject"); - if (args.optObject) { - Types.AnotherType.write(writer, args.optObject as Types.AnotherType); - } else { - writer.writeNil(); - } - writer.context().pop(); - writer.context().push("objectArray", "Array", "writing property"); - writer.writeString("objectArray"); - writer.writeArray(args.objectArray, (writer: Write, item: Types.AnotherType): void => { - Types.AnotherType.write(writer, item); - }); - writer.context().pop(); - writer.context().push("optObjectArray", "Array | null", "writing property"); - writer.writeString("optObjectArray"); - writer.writeOptionalArray(args.optObjectArray, (writer: Write, item: Types.AnotherType | null): void => { - if (item) { - Types.AnotherType.write(writer, item as Types.AnotherType); - } else { - writer.writeNil(); - } - }); - writer.context().pop(); -} - -export function serializeoptionalEnvMethodResult(result: Types.AnotherType | null): ArrayBuffer { - const sizerContext: Context = new Context("Serializing (sizing) module-type: optionalEnvMethod Result"); - const sizer = new WriteSizer(sizerContext); - writeoptionalEnvMethodResult(sizer, result); - const buffer = new ArrayBuffer(sizer.length); - const encoderContext: Context = new Context("Serializing (encoding) module-type: optionalEnvMethod Result"); - const encoder = new WriteEncoder(buffer, sizer, encoderContext); - writeoptionalEnvMethodResult(encoder, result); - return buffer; -} - -export function writeoptionalEnvMethodResult(writer: Write, result: Types.AnotherType | null): void { - writer.context().push("optionalEnvMethod", "Types.AnotherType | null", "writing property"); - if (result) { - Types.AnotherType.write(writer, result as Types.AnotherType); - } else { - writer.writeNil(); - } - writer.context().pop(); -} - -export function deserializeoptionalEnvMethodResult(buffer: ArrayBuffer): Types.AnotherType | null { - const context: Context = new Context("Deserializing module-type: optionalEnvMethod Result"); - const reader = new ReadDecoder(buffer, context); - - reader.context().push("optionalEnvMethod", "Types.AnotherType | null", "reading function output"); - let object: Types.AnotherType | null = null; - if (!reader.isNextNil()) { - object = Types.AnotherType.read(reader); - } - const res: Types.AnotherType | null = object; - reader.context().pop(); - - return res; -} - -export class Args__if { - _if: Types._else; -} - -export function deserializeifArgs(argsBuf: ArrayBuffer): Args__if { - const context: Context = new Context("Deserializing module-type: if Args"); - const reader = new ReadDecoder(argsBuf, context); - let numFields = reader.readMapLength(); - - let _if: Types._else | null = null; - let _ifSet: bool = false; - - while (numFields > 0) { - numFields--; - const field = reader.readString(); - - reader.context().push(field, "unknown", "searching for property type"); - if (field == "if") { - reader.context().push(field, "Types._else", "type found, reading property"); - const object = Types._else.read(reader); - _if = object; - _ifSet = true; - reader.context().pop(); - } - reader.context().pop(); - } - - if (!_if || !_ifSet) { - throw new Error(reader.context().printWithContext("Missing required argument: 'if: else'")); - } - - return { - _if: _if - }; -} - -export function serializeifArgs(args: Args__if): ArrayBuffer { - const sizerContext: Context = new Context("Serializing (sizing) module-type: if Args"); - const sizer = new WriteSizer(sizerContext); - writeifArgs(sizer, args); - const buffer = new ArrayBuffer(sizer.length); - const encoderContext: Context = new Context("Serializing (encoding) module-type: if Args"); - const encoder = new WriteEncoder(buffer, sizer, encoderContext); - writeifArgs(encoder, args); - return buffer; -} - -export function writeifArgs( - writer: Write, - args: Args__if -): void { - writer.writeMapLength(1); - writer.context().push("if", "Types._else", "writing property"); - writer.writeString("if"); - Types._else.write(writer, args._if); - writer.context().pop(); -} - -export function serializeifResult(result: Types._else): ArrayBuffer { - const sizerContext: Context = new Context("Serializing (sizing) module-type: if Result"); - const sizer = new WriteSizer(sizerContext); - writeifResult(sizer, result); - const buffer = new ArrayBuffer(sizer.length); - const encoderContext: Context = new Context("Serializing (encoding) module-type: if Result"); - const encoder = new WriteEncoder(buffer, sizer, encoderContext); - writeifResult(encoder, result); - return buffer; -} - -export function writeifResult(writer: Write, result: Types._else): void { - writer.context().push("if", "Types._else", "writing property"); - Types._else.write(writer, result); - writer.context().pop(); -} - -export function deserializeifResult(buffer: ArrayBuffer): Types._else { - const context: Context = new Context("Deserializing module-type: if Result"); - const reader = new ReadDecoder(buffer, context); - - reader.context().push("if", "Types._else", "reading function output"); - const object = Types._else.read(reader); - const res: Types._else = object; - reader.context().pop(); - - return res; -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-as/Module/wrapped.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/Module/wrapped.ts deleted file mode 100644 index cd9ca3ba74..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-as/Module/wrapped.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { wrap_load_env } from "@polywrap/wasm-as"; -import { - deserializemoduleMethodArgs, - serializemoduleMethodResult, - deserializeobjectMethodArgs, - serializeobjectMethodResult, - deserializeoptionalEnvMethodArgs, - serializeoptionalEnvMethodResult, - deserializeifArgs, - serializeifResult -} from "./serialization"; -import { ModuleBase } from "./module"; -import * as Types from ".."; - -export function moduleMethodWrapped(module: ModuleBase, argsBuf: ArrayBuffer, env_size: u32): ArrayBuffer { - const args = deserializemoduleMethodArgs(argsBuf); - - const result = module.moduleMethod( - { - str: args.str, - optStr: args.optStr, - en: args.en, - optEnum: args.optEnum, - enumArray: args.enumArray, - optEnumArray: args.optEnumArray, - map: args.map, - mapOfArr: args.mapOfArr, - mapOfMap: args.mapOfMap, - mapOfObj: args.mapOfObj, - mapOfArrOfObj: args.mapOfArrOfObj - } - ); - return serializemoduleMethodResult(result); -} - -export function objectMethodWrapped(module: ModuleBase, argsBuf: ArrayBuffer, env_size: u32): ArrayBuffer { - if (env_size == 0) { - throw new Error("Environment is not set, and it is required by method 'objectMethod'") - } - - const envBuf = wrap_load_env(env_size); - const env = Types.Env.fromBuffer(envBuf); - const args = deserializeobjectMethodArgs(argsBuf); - - const result = module.objectMethod( - { - object: args.object, - optObject: args.optObject, - objectArray: args.objectArray, - optObjectArray: args.optObjectArray - }, - env - ); - return serializeobjectMethodResult(result); -} - -export function optionalEnvMethodWrapped(module: ModuleBase, argsBuf: ArrayBuffer, env_size: u32): ArrayBuffer { - let env: Types.Env | null = null; - if (env_size > 0) { - const envBuf = wrap_load_env(env_size); - env = Types.Env.fromBuffer(envBuf); - } - const args = deserializeoptionalEnvMethodArgs(argsBuf); - - const result = module.optionalEnvMethod( - { - object: args.object, - optObject: args.optObject, - objectArray: args.objectArray, - optObjectArray: args.optObjectArray - }, - env - ); - return serializeoptionalEnvMethodResult(result); -} - -export function ifWrapped(module: ModuleBase, argsBuf: ArrayBuffer, env_size: u32): ArrayBuffer { - const args = deserializeifArgs(argsBuf); - - const result = module._if( - { - _if: args._if - } - ); - return serializeifResult(result); -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-as/TestImport/index.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/TestImport/index.ts deleted file mode 100644 index 64521e8cd6..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-as/TestImport/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { - wrap_getImplementations -} from "@polywrap/wasm-as"; - -export class TestImport { - static uri: string = "testimport.uri.eth" - - public static getImplementations(): string[] { - return wrap_getImplementations(this.uri); - } -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-as/else/index.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/else/index.ts deleted file mode 100644 index 48f590f30b..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-as/else/index.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { - Read, - Write, - Box, - BigInt, - BigNumber, - JSON -} from "@polywrap/wasm-as"; -import { - serializeelse, - deserializeelse, - writeelse, - readelse -} from "./serialization"; -import * as Types from ".."; - -export class _else { - _else: string; - - static toBuffer(type: _else): ArrayBuffer { - return serializeelse(type); - } - - static fromBuffer(buffer: ArrayBuffer): _else { - return deserializeelse(buffer); - } - - static write(writer: Write, type: _else): void { - writeelse(writer, type); - } - - static read(reader: Read): _else { - return readelse(reader); - } -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-as/else/serialization.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/else/serialization.ts deleted file mode 100644 index 08a0df0df3..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-as/else/serialization.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { - Read, - ReadDecoder, - Write, - WriteSizer, - WriteEncoder, - Box, - BigInt, - BigNumber, - JSON, - Context -} from "@polywrap/wasm-as"; -import { _else } from "./"; -import * as Types from ".."; - -export function serializeelse(type: _else): ArrayBuffer { - const sizerContext: Context = new Context("Serializing (sizing) object-type: else"); - const sizer = new WriteSizer(sizerContext); - writeelse(sizer, type); - const buffer = new ArrayBuffer(sizer.length); - const encoderContext: Context = new Context("Serializing (encoding) object-type: else"); - const encoder = new WriteEncoder(buffer, sizer, encoderContext); - writeelse(encoder, type); - return buffer; -} - -export function writeelse(writer: Write, type: _else): void { - writer.writeMapLength(1); - writer.context().push("else", "string", "writing property"); - writer.writeString("else"); - writer.writeString(type._else); - writer.context().pop(); -} - -export function deserializeelse(buffer: ArrayBuffer): _else { - const context: Context = new Context("Deserializing object-type else"); - const reader = new ReadDecoder(buffer, context); - return readelse(reader); -} - -export function readelse(reader: Read): _else { - let numFields = reader.readMapLength(); - - let _else: string = ""; - let _elseSet: bool = false; - - while (numFields > 0) { - numFields--; - const field = reader.readString(); - - reader.context().push(field, "unknown", "searching for property type"); - if (field == "else") { - reader.context().push(field, "string", "type found, reading property"); - _else = reader.readString(); - _elseSet = true; - reader.context().pop(); - } - reader.context().pop(); - } - - if (!_elseSet) { - throw new Error(reader.context().printWithContext("Missing required property: 'else: String'")); - } - - return { - _else: _else - }; -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-as/entry.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/entry.ts deleted file mode 100644 index b68944d823..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-as/entry.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { - wrap_invoke_args, - wrap_invoke_result, - wrap_invoke_error, - wrap_abort, - InvokeArgs -} from "@polywrap/wasm-as"; - -import { - moduleMethodWrapped, - objectMethodWrapped, - optionalEnvMethodWrapped, - ifWrapped -} from "./Module/wrapped"; - -import { Module } from "../index"; - -export function _wrap_invoke(method_size: u32, args_size: u32, env_size: u32): bool { - const module = new Module(); - const args: InvokeArgs = wrap_invoke_args( - method_size, - args_size - ); - let result: ArrayBuffer; - if (args.method == "moduleMethod") { - result = moduleMethodWrapped(module, args.args, env_size); - } - else if (args.method == "objectMethod") { - result = objectMethodWrapped(module, args.args, env_size); - } - else if (args.method == "optionalEnvMethod") { - result = optionalEnvMethodWrapped(module, args.args, env_size); - } - else if (args.method == "if") { - result = ifWrapped(module, args.args, env_size); - } - else { - wrap_invoke_error( - `Could not find invoke function "${args.method}"` - ); - return false; - } - wrap_invoke_result(result); - return true; -} - -export function wrapAbort( - msg: string | null, - file: string | null, - line: u32, - column: u32 -): void { - wrap_abort( - msg ? msg : "", - file ? file : "", - line, - column - ); -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_AnotherObject/index.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_AnotherObject/index.ts deleted file mode 100644 index 54d80f554c..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_AnotherObject/index.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { - Read, - Write, - Box, - BigInt, - BigNumber, - JSON -} from "@polywrap/wasm-as"; -import { - serializeTestImport_AnotherObject, - deserializeTestImport_AnotherObject, - writeTestImport_AnotherObject, - readTestImport_AnotherObject -} from "./serialization"; -import * as Types from "../.."; - -export class TestImport_AnotherObject { - - public static uri: string = "testimport.uri.eth"; - - prop: string; - - static toBuffer(type: TestImport_AnotherObject): ArrayBuffer { - return serializeTestImport_AnotherObject(type); - } - - static fromBuffer(buffer: ArrayBuffer): TestImport_AnotherObject { - return deserializeTestImport_AnotherObject(buffer); - } - - static write(writer: Write, type: TestImport_AnotherObject): void { - writeTestImport_AnotherObject(writer, type); - } - - static read(reader: Read): TestImport_AnotherObject { - return readTestImport_AnotherObject(reader); - } -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_AnotherObject/serialization.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_AnotherObject/serialization.ts deleted file mode 100644 index 1835851b49..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_AnotherObject/serialization.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { - Read, - ReadDecoder, - Write, - WriteSizer, - WriteEncoder, - Box, - BigInt, - BigNumber, - JSON, - Context -} from "@polywrap/wasm-as"; -import { TestImport_AnotherObject } from "./"; -import * as Types from "../.."; - -export function serializeTestImport_AnotherObject(type: TestImport_AnotherObject): ArrayBuffer { - const sizerContext: Context = new Context("Serializing (sizing) imported object-type: TestImport_AnotherObject"); - const sizer = new WriteSizer(sizerContext); - writeTestImport_AnotherObject(sizer, type); - const buffer = new ArrayBuffer(sizer.length); - const encoderContext: Context = new Context("Serializing (encoding) import object-type: TestImport_AnotherObject"); - const encoder = new WriteEncoder(buffer, sizer, encoderContext); - writeTestImport_AnotherObject(encoder, type); - return buffer; -} - -export function writeTestImport_AnotherObject(writer: Write, type: TestImport_AnotherObject): void { - writer.writeMapLength(1); - writer.context().push("prop", "string", "writing property"); - writer.writeString("prop"); - writer.writeString(type.prop); - writer.context().pop(); -} - -export function deserializeTestImport_AnotherObject(buffer: ArrayBuffer): TestImport_AnotherObject { - const context: Context = new Context("Deserializing imported object-type TestImport_AnotherObject"); - const reader = new ReadDecoder(buffer, context); - return readTestImport_AnotherObject(reader); -} - -export function readTestImport_AnotherObject(reader: Read): TestImport_AnotherObject { - let numFields = reader.readMapLength(); - - let _prop: string = ""; - let _propSet: bool = false; - - while (numFields > 0) { - numFields--; - const field = reader.readString(); - - reader.context().push(field, "unknown", "searching for property type"); - if (field == "prop") { - reader.context().push(field, "string", "type found, reading property"); - _prop = reader.readString(); - _propSet = true; - reader.context().pop(); - } - reader.context().pop(); - } - - if (!_propSet) { - throw new Error(reader.context().printWithContext("Missing required property: 'prop: String'")); - } - - return { - prop: _prop - }; -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Enum/index.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Enum/index.ts deleted file mode 100644 index b06028d316..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Enum/index.ts +++ /dev/null @@ -1,34 +0,0 @@ -export enum TestImport_Enum { - STRING, - BYTES, - _MAX_ -} - -export function sanitizeTestImport_EnumValue(value: i32): void { - const valid = value >= 0 && value < TestImport_Enum._MAX_; - if (!valid) { - throw new Error("Invalid value for enum 'TestImport_Enum': " + value.toString()); - } -} - -export function getTestImport_EnumValue(key: string): TestImport_Enum { - if (key == "STRING") { - return TestImport_Enum.STRING; - } - if (key == "BYTES") { - return TestImport_Enum.BYTES; - } - - throw new Error("Invalid key for enum 'TestImport_Enum': " + key); -} - -export function getTestImport_EnumKey(value: TestImport_Enum): string { - sanitizeTestImport_EnumValue(value); - - switch (value) { - case TestImport_Enum.STRING: return "STRING"; - case TestImport_Enum.BYTES: return "BYTES"; - default: - throw new Error("Invalid value for enum 'TestImport_Enum': " + value.toString()); - } -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Enum_Return/index.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Enum_Return/index.ts deleted file mode 100644 index 6f9f65b1bd..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Enum_Return/index.ts +++ /dev/null @@ -1,34 +0,0 @@ -export enum TestImport_Enum_Return { - STRING, - BYTES, - _MAX_ -} - -export function sanitizeTestImport_Enum_ReturnValue(value: i32): void { - const valid = value >= 0 && value < TestImport_Enum_Return._MAX_; - if (!valid) { - throw new Error("Invalid value for enum 'TestImport_Enum_Return': " + value.toString()); - } -} - -export function getTestImport_Enum_ReturnValue(key: string): TestImport_Enum_Return { - if (key == "STRING") { - return TestImport_Enum_Return.STRING; - } - if (key == "BYTES") { - return TestImport_Enum_Return.BYTES; - } - - throw new Error("Invalid key for enum 'TestImport_Enum_Return': " + key); -} - -export function getTestImport_Enum_ReturnKey(value: TestImport_Enum_Return): string { - sanitizeTestImport_Enum_ReturnValue(value); - - switch (value) { - case TestImport_Enum_Return.STRING: return "STRING"; - case TestImport_Enum_Return.BYTES: return "BYTES"; - default: - throw new Error("Invalid value for enum 'TestImport_Enum_Return': " + value.toString()); - } -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Env/index.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Env/index.ts deleted file mode 100644 index 13da9f9059..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Env/index.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { - Read, - Write, - Box, - BigInt, - BigNumber, - JSON, -} from "@polywrap/wasm-as"; -import { - serializeTestImport_Env, - deserializeTestImport_Env, - writeTestImport_Env, - readTestImport_Env -} from "./serialization"; -import * as Types from "../.."; - -@serializable -export class TestImport_Env { - - public static uri: string = "testimport.uri.eth"; - - object: Types.TestImport_AnotherObject; - optObject: Types.TestImport_AnotherObject | null; - objectArray: Array; - optObjectArray: Array | null; - en: Types.TestImport_Enum; - optEnum: Box | null; - enumArray: Array; - optEnumArray: Array | null> | null; - - static toBuffer(type: TestImport_Env): ArrayBuffer { - return serializeTestImport_Env(type); - } - - static fromBuffer(buffer: ArrayBuffer): TestImport_Env { - return deserializeTestImport_Env(buffer); - } - - static write(writer: Write, type: TestImport_Env): void { - writeTestImport_Env(writer, type); - } - - static read(reader: Read): TestImport_Env { - return readTestImport_Env(reader); - } -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Env/serialization.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Env/serialization.ts deleted file mode 100644 index f86f58f15c..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Env/serialization.ts +++ /dev/null @@ -1,238 +0,0 @@ -import { - Read, - ReadDecoder, - Write, - WriteSizer, - WriteEncoder, - Box, - BigInt, - BigNumber, - JSON, - Context -} from "@polywrap/wasm-as"; -import { TestImport_Env } from "./"; -import * as Types from "../.."; - -export function serializeTestImport_Env(type: TestImport_Env): ArrayBuffer { - const sizerContext: Context = new Context("Serializing (sizing) imported env-type: TestImport_Env"); - const sizer = new WriteSizer(sizerContext); - writeTestImport_Env(sizer, type); - const buffer = new ArrayBuffer(sizer.length); - const encoderContext: Context = new Context("Serializing (encoding) imported env-type: TestImport_Env"); - const encoder = new WriteEncoder(buffer, sizer, encoderContext); - writeTestImport_Env(encoder, type); - return buffer; -} - -export function writeTestImport_Env(writer: Write, type: TestImport_Env): void { - writer.writeMapLength(8); - writer.context().push("object", "Types.TestImport_AnotherObject", "writing property"); - writer.writeString("object"); - Types.TestImport_AnotherObject.write(writer, type.object); - writer.context().pop(); - writer.context().push("optObject", "Types.TestImport_AnotherObject | null", "writing property"); - writer.writeString("optObject"); - if (type.optObject) { - Types.TestImport_AnotherObject.write(writer, type.optObject as Types.TestImport_AnotherObject); - } else { - writer.writeNil(); - } - writer.context().pop(); - writer.context().push("objectArray", "Array", "writing property"); - writer.writeString("objectArray"); - writer.writeArray(type.objectArray, (writer: Write, item: Types.TestImport_AnotherObject): void => { - Types.TestImport_AnotherObject.write(writer, item); - }); - writer.context().pop(); - writer.context().push("optObjectArray", "Array | null", "writing property"); - writer.writeString("optObjectArray"); - writer.writeOptionalArray(type.optObjectArray, (writer: Write, item: Types.TestImport_AnotherObject | null): void => { - if (item) { - Types.TestImport_AnotherObject.write(writer, item as Types.TestImport_AnotherObject); - } else { - writer.writeNil(); - } - }); - writer.context().pop(); - writer.context().push("en", "Types.TestImport_Enum", "writing property"); - writer.writeString("en"); - writer.writeInt32(type.en); - writer.context().pop(); - writer.context().push("optEnum", "Box | null", "writing property"); - writer.writeString("optEnum"); - writer.writeOptionalInt32(type.optEnum); - writer.context().pop(); - writer.context().push("enumArray", "Array", "writing property"); - writer.writeString("enumArray"); - writer.writeArray(type.enumArray, (writer: Write, item: Types.TestImport_Enum): void => { - writer.writeInt32(item); - }); - writer.context().pop(); - writer.context().push("optEnumArray", "Array | null> | null", "writing property"); - writer.writeString("optEnumArray"); - writer.writeOptionalArray(type.optEnumArray, (writer: Write, item: Box | null): void => { - writer.writeOptionalInt32(item); - }); - writer.context().pop(); -} - -export function deserializeTestImport_Env(buffer: ArrayBuffer): TestImport_Env { - const context: Context = new Context("Deserializing imported env-type TestImport_Env"); - const reader = new ReadDecoder(buffer, context); - return readTestImport_Env(reader); -} - -export function readTestImport_Env(reader: Read): TestImport_Env { - let numFields = reader.readMapLength(); - - let _object: Types.TestImport_AnotherObject | null = null; - let _objectSet: bool = false; - let _optObject: Types.TestImport_AnotherObject | null = null; - let _objectArray: Array = []; - let _objectArraySet: bool = false; - let _optObjectArray: Array | null = null; - let _en: Types.TestImport_Enum = 0; - let _enSet: bool = false; - let _optEnum: Box | null = null; - let _enumArray: Array = []; - let _enumArraySet: bool = false; - let _optEnumArray: Array | null> | null = null; - - while (numFields > 0) { - numFields--; - const field = reader.readString(); - - reader.context().push(field, "unknown", "searching for property type"); - if (field == "object") { - reader.context().push(field, "Types.TestImport_AnotherObject", "type found, reading property"); - const object = Types.TestImport_AnotherObject.read(reader); - _object = object; - _objectSet = true; - reader.context().pop(); - } - else if (field == "optObject") { - reader.context().push(field, "Types.TestImport_AnotherObject | null", "type found, reading property"); - let object: Types.TestImport_AnotherObject | null = null; - if (!reader.isNextNil()) { - object = Types.TestImport_AnotherObject.read(reader); - } - _optObject = object; - reader.context().pop(); - } - else if (field == "objectArray") { - reader.context().push(field, "Array", "type found, reading property"); - _objectArray = reader.readArray((reader: Read): Types.TestImport_AnotherObject => { - const object = Types.TestImport_AnotherObject.read(reader); - return object; - }); - _objectArraySet = true; - reader.context().pop(); - } - else if (field == "optObjectArray") { - reader.context().push(field, "Array | null", "type found, reading property"); - _optObjectArray = reader.readOptionalArray((reader: Read): Types.TestImport_AnotherObject | null => { - let object: Types.TestImport_AnotherObject | null = null; - if (!reader.isNextNil()) { - object = Types.TestImport_AnotherObject.read(reader); - } - return object; - }); - reader.context().pop(); - } - else if (field == "en") { - reader.context().push(field, "Types.TestImport_Enum", "type found, reading property"); - let value: Types.TestImport_Enum; - if (reader.isNextString()) { - value = Types.getTestImport_EnumValue(reader.readString()); - } else { - value = reader.readInt32(); - Types.sanitizeTestImport_EnumValue(value); - } - _en = value; - _enSet = true; - reader.context().pop(); - } - else if (field == "optEnum") { - reader.context().push(field, "Box | null", "type found, reading property"); - let value: Box | null; - if (!reader.isNextNil()) { - if (reader.isNextString()) { - value = Box.from( - Types.getTestImport_EnumValue(reader.readString()) - ); - } else { - value = Box.from( - reader.readInt32() - ); - Types.sanitizeTestImport_EnumValue(value.unwrap()); - } - } else { - value = null; - } - _optEnum = value; - reader.context().pop(); - } - else if (field == "enumArray") { - reader.context().push(field, "Array", "type found, reading property"); - _enumArray = reader.readArray((reader: Read): Types.TestImport_Enum => { - let value: Types.TestImport_Enum; - if (reader.isNextString()) { - value = Types.getTestImport_EnumValue(reader.readString()); - } else { - value = reader.readInt32(); - Types.sanitizeTestImport_EnumValue(value); - } - return value; - }); - _enumArraySet = true; - reader.context().pop(); - } - else if (field == "optEnumArray") { - reader.context().push(field, "Array | null> | null", "type found, reading property"); - _optEnumArray = reader.readOptionalArray((reader: Read): Box | null => { - let value: Box | null; - if (!reader.isNextNil()) { - if (reader.isNextString()) { - value = Box.from( - Types.getTestImport_EnumValue(reader.readString()) - ); - } else { - value = Box.from( - reader.readInt32() - ); - Types.sanitizeTestImport_EnumValue(value.unwrap()); - } - } else { - value = null; - } - return value; - }); - reader.context().pop(); - } - reader.context().pop(); - } - - if (!_object || !_objectSet) { - throw new Error(reader.context().printWithContext("Missing required property: 'object: TestImport_AnotherObject'")); - } - if (!_objectArraySet) { - throw new Error(reader.context().printWithContext("Missing required property: 'objectArray: [TestImport_AnotherObject]'")); - } - if (!_enSet) { - throw new Error(reader.context().printWithContext("Missing required property: 'en: TestImport_Enum'")); - } - if (!_enumArraySet) { - throw new Error(reader.context().printWithContext("Missing required property: 'enumArray: [TestImport_Enum]'")); - } - - return { - object: _object, - optObject: _optObject, - objectArray: _objectArray, - optObjectArray: _optObjectArray, - en: _en, - optEnum: _optEnum, - enumArray: _enumArray, - optEnumArray: _optEnumArray - }; -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Module/index.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Module/index.ts deleted file mode 100644 index f924a389c9..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Module/index.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { - wrap_subinvoke, - wrap_subinvokeImplementation, - Box, - BigInt, - BigNumber, - JSON, - Result -} from "@polywrap/wasm-as"; -import { - serializeimportedMethodArgs, - deserializeimportedMethodResult, - Args_importedMethod, - serializeanotherMethodArgs, - deserializeanotherMethodResult, - Args_anotherMethod, - serializereturnsArrayOfEnumsArgs, - deserializereturnsArrayOfEnumsResult, - Args_returnsArrayOfEnums -} from "./serialization"; -import * as Types from "../.."; - -export class TestImport_Module { - - public static interfaceUri: string = "testimport.uri.eth"; - - public uri: string; - - constructor(uri: string) { - this.uri = uri; - } - - public importedMethod( - args: Args_importedMethod - ): Result { - const argsBuf = serializeimportedMethodArgs(args); - const result = wrap_subinvokeImplementation( - "testimport.uri.eth", - this.uri, - "importedMethod", - argsBuf - ); - - if (result.isErr) { - return Result.Err( - result.unwrapErr() - ); - } - - return Result.Ok( - deserializeimportedMethodResult(result.unwrap()) - ); - } - - public anotherMethod( - args: Args_anotherMethod - ): Result { - const argsBuf = serializeanotherMethodArgs(args); - const result = wrap_subinvokeImplementation( - "testimport.uri.eth", - this.uri, - "anotherMethod", - argsBuf - ); - - if (result.isErr) { - return Result.Err( - result.unwrapErr() - ); - } - - return Result.Ok( - deserializeanotherMethodResult(result.unwrap()) - ); - } - - public returnsArrayOfEnums( - args: Args_returnsArrayOfEnums - ): Result | null>, string> { - const argsBuf = serializereturnsArrayOfEnumsArgs(args); - const result = wrap_subinvokeImplementation( - "testimport.uri.eth", - this.uri, - "returnsArrayOfEnums", - argsBuf - ); - - if (result.isErr) { - return Result.Err | null>, string>( - result.unwrapErr() - ); - } - - return Result.Ok | null>, string>( - deserializereturnsArrayOfEnumsResult(result.unwrap()) - ); - } -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Module/serialization.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Module/serialization.ts deleted file mode 100644 index ff0a51b0db..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Module/serialization.ts +++ /dev/null @@ -1,559 +0,0 @@ -import { - Read, - ReadDecoder, - Write, - WriteSizer, - WriteEncoder, - Box, - BigInt, - BigNumber, - JSON, - Context -} from "@polywrap/wasm-as"; -import * as Types from "../.."; - -export class Args_importedMethod { - str: string; - optStr: string | null; - u: u32; - optU: Box | null; - uArrayArray: Array | null> | null>; - object: Types.TestImport_Object; - optObject: Types.TestImport_Object | null; - objectArray: Array; - optObjectArray: Array | null; - en: Types.TestImport_Enum; - optEnum: Box | null; - enumArray: Array; - optEnumArray: Array | null> | null; -} - -export function deserializeimportedMethodArgs(argsBuf: ArrayBuffer): Args_importedMethod { - const context: Context = new Context("Deserializing imported module-type: importedMethod Args"); - const reader = new ReadDecoder(argsBuf, context); - let numFields = reader.readMapLength(); - - let _str: string = ""; - let _strSet: bool = false; - let _optStr: string | null = null; - let _u: u32 = 0; - let _uSet: bool = false; - let _optU: Box | null = null; - let _uArrayArray: Array | null> | null> = []; - let _uArrayArraySet: bool = false; - let _object: Types.TestImport_Object | null = null; - let _objectSet: bool = false; - let _optObject: Types.TestImport_Object | null = null; - let _objectArray: Array = []; - let _objectArraySet: bool = false; - let _optObjectArray: Array | null = null; - let _en: Types.TestImport_Enum = 0; - let _enSet: bool = false; - let _optEnum: Box | null = null; - let _enumArray: Array = []; - let _enumArraySet: bool = false; - let _optEnumArray: Array | null> | null = null; - - while (numFields > 0) { - numFields--; - const field = reader.readString(); - - reader.context().push(field, "unknown", "searching for property type"); - if (field == "str") { - reader.context().push(field, "string", "type found, reading property"); - _str = reader.readString(); - _strSet = true; - reader.context().pop(); - } - else if (field == "optStr") { - reader.context().push(field, "string | null", "type found, reading property"); - _optStr = reader.readOptionalString(); - reader.context().pop(); - } - else if (field == "u") { - reader.context().push(field, "u32", "type found, reading property"); - _u = reader.readUInt32(); - _uSet = true; - reader.context().pop(); - } - else if (field == "optU") { - reader.context().push(field, "Box | null", "type found, reading property"); - _optU = reader.readOptionalUInt32(); - reader.context().pop(); - } - else if (field == "uArrayArray") { - reader.context().push(field, "Array | null> | null>", "type found, reading property"); - _uArrayArray = reader.readArray((reader: Read): Array | null> | null => { - return reader.readOptionalArray((reader: Read): Box | null => { - return reader.readOptionalUInt32(); - }); - }); - _uArrayArraySet = true; - reader.context().pop(); - } - else if (field == "object") { - reader.context().push(field, "Types.TestImport_Object", "type found, reading property"); - const object = Types.TestImport_Object.read(reader); - _object = object; - _objectSet = true; - reader.context().pop(); - } - else if (field == "optObject") { - reader.context().push(field, "Types.TestImport_Object | null", "type found, reading property"); - let object: Types.TestImport_Object | null = null; - if (!reader.isNextNil()) { - object = Types.TestImport_Object.read(reader); - } - _optObject = object; - reader.context().pop(); - } - else if (field == "objectArray") { - reader.context().push(field, "Array", "type found, reading property"); - _objectArray = reader.readArray((reader: Read): Types.TestImport_Object => { - const object = Types.TestImport_Object.read(reader); - return object; - }); - _objectArraySet = true; - reader.context().pop(); - } - else if (field == "optObjectArray") { - reader.context().push(field, "Array | null", "type found, reading property"); - _optObjectArray = reader.readOptionalArray((reader: Read): Types.TestImport_Object | null => { - let object: Types.TestImport_Object | null = null; - if (!reader.isNextNil()) { - object = Types.TestImport_Object.read(reader); - } - return object; - }); - reader.context().pop(); - } - else if (field == "en") { - reader.context().push(field, "Types.TestImport_Enum", "type found, reading property"); - let value: Types.TestImport_Enum; - if (reader.isNextString()) { - value = Types.getTestImport_EnumValue(reader.readString()); - } else { - value = reader.readInt32(); - Types.sanitizeTestImport_EnumValue(value); - } - _en = value; - _enSet = true; - reader.context().pop(); - } - else if (field == "optEnum") { - reader.context().push(field, "Box | null", "type found, reading property"); - let value: Box | null; - if (!reader.isNextNil()) { - if (reader.isNextString()) { - value = Box.from( - Types.getTestImport_EnumValue(reader.readString()) - ); - } else { - value = Box.from( - reader.readInt32() - ); - Types.sanitizeTestImport_EnumValue(value.unwrap()); - } - } else { - value = null; - } - _optEnum = value; - reader.context().pop(); - } - else if (field == "enumArray") { - reader.context().push(field, "Array", "type found, reading property"); - _enumArray = reader.readArray((reader: Read): Types.TestImport_Enum => { - let value: Types.TestImport_Enum; - if (reader.isNextString()) { - value = Types.getTestImport_EnumValue(reader.readString()); - } else { - value = reader.readInt32(); - Types.sanitizeTestImport_EnumValue(value); - } - return value; - }); - _enumArraySet = true; - reader.context().pop(); - } - else if (field == "optEnumArray") { - reader.context().push(field, "Array | null> | null", "type found, reading property"); - _optEnumArray = reader.readOptionalArray((reader: Read): Box | null => { - let value: Box | null; - if (!reader.isNextNil()) { - if (reader.isNextString()) { - value = Box.from( - Types.getTestImport_EnumValue(reader.readString()) - ); - } else { - value = Box.from( - reader.readInt32() - ); - Types.sanitizeTestImport_EnumValue(value.unwrap()); - } - } else { - value = null; - } - return value; - }); - reader.context().pop(); - } - reader.context().pop(); - } - - if (!_strSet) { - throw new Error(reader.context().printWithContext("Missing required argument: 'str: String'")); - } - if (!_uSet) { - throw new Error(reader.context().printWithContext("Missing required argument: 'u: UInt'")); - } - if (!_uArrayArraySet) { - throw new Error(reader.context().printWithContext("Missing required argument: 'uArrayArray: [[UInt]]'")); - } - if (!_object || !_objectSet) { - throw new Error(reader.context().printWithContext("Missing required argument: 'object: TestImport_Object'")); - } - if (!_objectArraySet) { - throw new Error(reader.context().printWithContext("Missing required argument: 'objectArray: [TestImport_Object]'")); - } - if (!_enSet) { - throw new Error(reader.context().printWithContext("Missing required argument: 'en: TestImport_Enum'")); - } - if (!_enumArraySet) { - throw new Error(reader.context().printWithContext("Missing required argument: 'enumArray: [TestImport_Enum]'")); - } - - return { - str: _str, - optStr: _optStr, - u: _u, - optU: _optU, - uArrayArray: _uArrayArray, - object: _object, - optObject: _optObject, - objectArray: _objectArray, - optObjectArray: _optObjectArray, - en: _en, - optEnum: _optEnum, - enumArray: _enumArray, - optEnumArray: _optEnumArray - }; -} - -export function serializeimportedMethodArgs(args: Args_importedMethod): ArrayBuffer { - const sizerContext: Context = new Context("Serializing (sizing) imported module-type: importedMethod Args"); - const sizer = new WriteSizer(sizerContext); - writeimportedMethodArgs(sizer, args); - const buffer = new ArrayBuffer(sizer.length); - const encoderContext: Context = new Context("Serializing (encoding) imported module-type: importedMethod Args"); - const encoder = new WriteEncoder(buffer, sizer, encoderContext); - writeimportedMethodArgs(encoder, args); - return buffer; -} - -export function writeimportedMethodArgs( - writer: Write, - args: Args_importedMethod -): void { - writer.writeMapLength(13); - writer.context().push("str", "string", "writing property"); - writer.writeString("str"); - writer.writeString(args.str); - writer.context().pop(); - writer.context().push("optStr", "string | null", "writing property"); - writer.writeString("optStr"); - writer.writeOptionalString(args.optStr); - writer.context().pop(); - writer.context().push("u", "u32", "writing property"); - writer.writeString("u"); - writer.writeUInt32(args.u); - writer.context().pop(); - writer.context().push("optU", "Box | null", "writing property"); - writer.writeString("optU"); - writer.writeOptionalUInt32(args.optU); - writer.context().pop(); - writer.context().push("uArrayArray", "Array | null> | null>", "writing property"); - writer.writeString("uArrayArray"); - writer.writeArray(args.uArrayArray, (writer: Write, item: Array | null> | null): void => { - writer.writeOptionalArray(item, (writer: Write, item: Box | null): void => { - writer.writeOptionalUInt32(item); - }); - }); - writer.context().pop(); - writer.context().push("object", "Types.TestImport_Object", "writing property"); - writer.writeString("object"); - Types.TestImport_Object.write(writer, args.object); - writer.context().pop(); - writer.context().push("optObject", "Types.TestImport_Object | null", "writing property"); - writer.writeString("optObject"); - if (args.optObject) { - Types.TestImport_Object.write(writer, args.optObject as Types.TestImport_Object); - } else { - writer.writeNil(); - } - writer.context().pop(); - writer.context().push("objectArray", "Array", "writing property"); - writer.writeString("objectArray"); - writer.writeArray(args.objectArray, (writer: Write, item: Types.TestImport_Object): void => { - Types.TestImport_Object.write(writer, item); - }); - writer.context().pop(); - writer.context().push("optObjectArray", "Array | null", "writing property"); - writer.writeString("optObjectArray"); - writer.writeOptionalArray(args.optObjectArray, (writer: Write, item: Types.TestImport_Object | null): void => { - if (item) { - Types.TestImport_Object.write(writer, item as Types.TestImport_Object); - } else { - writer.writeNil(); - } - }); - writer.context().pop(); - writer.context().push("en", "Types.TestImport_Enum", "writing property"); - writer.writeString("en"); - writer.writeInt32(args.en); - writer.context().pop(); - writer.context().push("optEnum", "Box | null", "writing property"); - writer.writeString("optEnum"); - writer.writeOptionalInt32(args.optEnum); - writer.context().pop(); - writer.context().push("enumArray", "Array", "writing property"); - writer.writeString("enumArray"); - writer.writeArray(args.enumArray, (writer: Write, item: Types.TestImport_Enum): void => { - writer.writeInt32(item); - }); - writer.context().pop(); - writer.context().push("optEnumArray", "Array | null> | null", "writing property"); - writer.writeString("optEnumArray"); - writer.writeOptionalArray(args.optEnumArray, (writer: Write, item: Box | null): void => { - writer.writeOptionalInt32(item); - }); - writer.context().pop(); -} - -export function serializeimportedMethodResult(result: Types.TestImport_Object | null): ArrayBuffer { - const sizerContext: Context = new Context("Serializing (sizing) imported module-type: importedMethod Result"); - const sizer = new WriteSizer(sizerContext); - writeimportedMethodResult(sizer, result); - const buffer = new ArrayBuffer(sizer.length); - const encoderContext: Context = new Context("Serializing (encoding) imported module-type: importedMethod Result"); - const encoder = new WriteEncoder(buffer, sizer, encoderContext); - writeimportedMethodResult(encoder, result); - return buffer; -} - -export function writeimportedMethodResult(writer: Write, result: Types.TestImport_Object | null): void { - writer.context().push("importedMethod", "Types.TestImport_Object | null", "writing property"); - if (result) { - Types.TestImport_Object.write(writer, result as Types.TestImport_Object); - } else { - writer.writeNil(); - } - writer.context().pop(); -} - -export function deserializeimportedMethodResult(buffer: ArrayBuffer): Types.TestImport_Object | null { - const context: Context = new Context("Deserializing imported module-type: importedMethod Result"); - const reader = new ReadDecoder(buffer, context); - - reader.context().push("importedMethod", "Types.TestImport_Object | null", "reading function output"); - let object: Types.TestImport_Object | null = null; - if (!reader.isNextNil()) { - object = Types.TestImport_Object.read(reader); - } - const res: Types.TestImport_Object | null = object; - reader.context().pop(); - - return res; -} - -export class Args_anotherMethod { - arg: Array; -} - -export function deserializeanotherMethodArgs(argsBuf: ArrayBuffer): Args_anotherMethod { - const context: Context = new Context("Deserializing imported module-type: anotherMethod Args"); - const reader = new ReadDecoder(argsBuf, context); - let numFields = reader.readMapLength(); - - let _arg: Array = []; - let _argSet: bool = false; - - while (numFields > 0) { - numFields--; - const field = reader.readString(); - - reader.context().push(field, "unknown", "searching for property type"); - if (field == "arg") { - reader.context().push(field, "Array", "type found, reading property"); - _arg = reader.readArray((reader: Read): string => { - return reader.readString(); - }); - _argSet = true; - reader.context().pop(); - } - reader.context().pop(); - } - - if (!_argSet) { - throw new Error(reader.context().printWithContext("Missing required argument: 'arg: [String]'")); - } - - return { - arg: _arg - }; -} - -export function serializeanotherMethodArgs(args: Args_anotherMethod): ArrayBuffer { - const sizerContext: Context = new Context("Serializing (sizing) imported module-type: anotherMethod Args"); - const sizer = new WriteSizer(sizerContext); - writeanotherMethodArgs(sizer, args); - const buffer = new ArrayBuffer(sizer.length); - const encoderContext: Context = new Context("Serializing (encoding) imported module-type: anotherMethod Args"); - const encoder = new WriteEncoder(buffer, sizer, encoderContext); - writeanotherMethodArgs(encoder, args); - return buffer; -} - -export function writeanotherMethodArgs( - writer: Write, - args: Args_anotherMethod -): void { - writer.writeMapLength(1); - writer.context().push("arg", "Array", "writing property"); - writer.writeString("arg"); - writer.writeArray(args.arg, (writer: Write, item: string): void => { - writer.writeString(item); - }); - writer.context().pop(); -} - -export function serializeanotherMethodResult(result: i32): ArrayBuffer { - const sizerContext: Context = new Context("Serializing (sizing) imported module-type: anotherMethod Result"); - const sizer = new WriteSizer(sizerContext); - writeanotherMethodResult(sizer, result); - const buffer = new ArrayBuffer(sizer.length); - const encoderContext: Context = new Context("Serializing (encoding) imported module-type: anotherMethod Result"); - const encoder = new WriteEncoder(buffer, sizer, encoderContext); - writeanotherMethodResult(encoder, result); - return buffer; -} - -export function writeanotherMethodResult(writer: Write, result: i32): void { - writer.context().push("anotherMethod", "i32", "writing property"); - writer.writeInt32(result); - writer.context().pop(); -} - -export function deserializeanotherMethodResult(buffer: ArrayBuffer): i32 { - const context: Context = new Context("Deserializing imported module-type: anotherMethod Result"); - const reader = new ReadDecoder(buffer, context); - - reader.context().push("anotherMethod", "i32", "reading function output"); - const res: i32 = reader.readInt32(); - reader.context().pop(); - - return res; -} - -export class Args_returnsArrayOfEnums { - arg: string; -} - -export function deserializereturnsArrayOfEnumsArgs(argsBuf: ArrayBuffer): Args_returnsArrayOfEnums { - const context: Context = new Context("Deserializing imported module-type: returnsArrayOfEnums Args"); - const reader = new ReadDecoder(argsBuf, context); - let numFields = reader.readMapLength(); - - let _arg: string = ""; - let _argSet: bool = false; - - while (numFields > 0) { - numFields--; - const field = reader.readString(); - - reader.context().push(field, "unknown", "searching for property type"); - if (field == "arg") { - reader.context().push(field, "string", "type found, reading property"); - _arg = reader.readString(); - _argSet = true; - reader.context().pop(); - } - reader.context().pop(); - } - - if (!_argSet) { - throw new Error(reader.context().printWithContext("Missing required argument: 'arg: String'")); - } - - return { - arg: _arg - }; -} - -export function serializereturnsArrayOfEnumsArgs(args: Args_returnsArrayOfEnums): ArrayBuffer { - const sizerContext: Context = new Context("Serializing (sizing) imported module-type: returnsArrayOfEnums Args"); - const sizer = new WriteSizer(sizerContext); - writereturnsArrayOfEnumsArgs(sizer, args); - const buffer = new ArrayBuffer(sizer.length); - const encoderContext: Context = new Context("Serializing (encoding) imported module-type: returnsArrayOfEnums Args"); - const encoder = new WriteEncoder(buffer, sizer, encoderContext); - writereturnsArrayOfEnumsArgs(encoder, args); - return buffer; -} - -export function writereturnsArrayOfEnumsArgs( - writer: Write, - args: Args_returnsArrayOfEnums -): void { - writer.writeMapLength(1); - writer.context().push("arg", "string", "writing property"); - writer.writeString("arg"); - writer.writeString(args.arg); - writer.context().pop(); -} - -export function serializereturnsArrayOfEnumsResult(result: Array | null>): ArrayBuffer { - const sizerContext: Context = new Context("Serializing (sizing) imported module-type: returnsArrayOfEnums Result"); - const sizer = new WriteSizer(sizerContext); - writereturnsArrayOfEnumsResult(sizer, result); - const buffer = new ArrayBuffer(sizer.length); - const encoderContext: Context = new Context("Serializing (encoding) imported module-type: returnsArrayOfEnums Result"); - const encoder = new WriteEncoder(buffer, sizer, encoderContext); - writereturnsArrayOfEnumsResult(encoder, result); - return buffer; -} - -export function writereturnsArrayOfEnumsResult(writer: Write, result: Array | null>): void { - writer.context().push("returnsArrayOfEnums", "Array | null>", "writing property"); - writer.writeArray(result, (writer: Write, item: Box | null): void => { - writer.writeOptionalInt32(item); - }); - writer.context().pop(); -} - -export function deserializereturnsArrayOfEnumsResult(buffer: ArrayBuffer): Array | null> { - const context: Context = new Context("Deserializing imported module-type: returnsArrayOfEnums Result"); - const reader = new ReadDecoder(buffer, context); - - reader.context().push("returnsArrayOfEnums", "Array | null>", "reading function output"); - const res: Array | null> = reader.readArray((reader: Read): Box | null => { - let value: Box | null; - if (!reader.isNextNil()) { - if (reader.isNextString()) { - value = Box.from( - Types.getTestImport_Enum_ReturnValue(reader.readString()) - ); - } else { - value = Box.from( - reader.readInt32() - ); - Types.sanitizeTestImport_Enum_ReturnValue(value.unwrap()); - } - } else { - value = null; - } - return value; - }); - reader.context().pop(); - - return res; -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Object/index.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Object/index.ts deleted file mode 100644 index 984be2af32..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Object/index.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { - Read, - Write, - Box, - BigInt, - BigNumber, - JSON -} from "@polywrap/wasm-as"; -import { - serializeTestImport_Object, - deserializeTestImport_Object, - writeTestImport_Object, - readTestImport_Object -} from "./serialization"; -import * as Types from "../.."; - -export class TestImport_Object { - - public static uri: string = "testimport.uri.eth"; - - object: Types.TestImport_AnotherObject; - optObject: Types.TestImport_AnotherObject | null; - objectArray: Array; - optObjectArray: Array | null; - en: Types.TestImport_Enum; - optEnum: Box | null; - enumArray: Array; - optEnumArray: Array | null> | null; - - static toBuffer(type: TestImport_Object): ArrayBuffer { - return serializeTestImport_Object(type); - } - - static fromBuffer(buffer: ArrayBuffer): TestImport_Object { - return deserializeTestImport_Object(buffer); - } - - static write(writer: Write, type: TestImport_Object): void { - writeTestImport_Object(writer, type); - } - - static read(reader: Read): TestImport_Object { - return readTestImport_Object(reader); - } -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Object/serialization.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Object/serialization.ts deleted file mode 100644 index b243ba964a..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/TestImport_Object/serialization.ts +++ /dev/null @@ -1,238 +0,0 @@ -import { - Read, - ReadDecoder, - Write, - WriteSizer, - WriteEncoder, - Box, - BigInt, - BigNumber, - JSON, - Context -} from "@polywrap/wasm-as"; -import { TestImport_Object } from "./"; -import * as Types from "../.."; - -export function serializeTestImport_Object(type: TestImport_Object): ArrayBuffer { - const sizerContext: Context = new Context("Serializing (sizing) imported object-type: TestImport_Object"); - const sizer = new WriteSizer(sizerContext); - writeTestImport_Object(sizer, type); - const buffer = new ArrayBuffer(sizer.length); - const encoderContext: Context = new Context("Serializing (encoding) import object-type: TestImport_Object"); - const encoder = new WriteEncoder(buffer, sizer, encoderContext); - writeTestImport_Object(encoder, type); - return buffer; -} - -export function writeTestImport_Object(writer: Write, type: TestImport_Object): void { - writer.writeMapLength(8); - writer.context().push("object", "Types.TestImport_AnotherObject", "writing property"); - writer.writeString("object"); - Types.TestImport_AnotherObject.write(writer, type.object); - writer.context().pop(); - writer.context().push("optObject", "Types.TestImport_AnotherObject | null", "writing property"); - writer.writeString("optObject"); - if (type.optObject) { - Types.TestImport_AnotherObject.write(writer, type.optObject as Types.TestImport_AnotherObject); - } else { - writer.writeNil(); - } - writer.context().pop(); - writer.context().push("objectArray", "Array", "writing property"); - writer.writeString("objectArray"); - writer.writeArray(type.objectArray, (writer: Write, item: Types.TestImport_AnotherObject): void => { - Types.TestImport_AnotherObject.write(writer, item); - }); - writer.context().pop(); - writer.context().push("optObjectArray", "Array | null", "writing property"); - writer.writeString("optObjectArray"); - writer.writeOptionalArray(type.optObjectArray, (writer: Write, item: Types.TestImport_AnotherObject | null): void => { - if (item) { - Types.TestImport_AnotherObject.write(writer, item as Types.TestImport_AnotherObject); - } else { - writer.writeNil(); - } - }); - writer.context().pop(); - writer.context().push("en", "Types.TestImport_Enum", "writing property"); - writer.writeString("en"); - writer.writeInt32(type.en); - writer.context().pop(); - writer.context().push("optEnum", "Box | null", "writing property"); - writer.writeString("optEnum"); - writer.writeOptionalInt32(type.optEnum); - writer.context().pop(); - writer.context().push("enumArray", "Array", "writing property"); - writer.writeString("enumArray"); - writer.writeArray(type.enumArray, (writer: Write, item: Types.TestImport_Enum): void => { - writer.writeInt32(item); - }); - writer.context().pop(); - writer.context().push("optEnumArray", "Array | null> | null", "writing property"); - writer.writeString("optEnumArray"); - writer.writeOptionalArray(type.optEnumArray, (writer: Write, item: Box | null): void => { - writer.writeOptionalInt32(item); - }); - writer.context().pop(); -} - -export function deserializeTestImport_Object(buffer: ArrayBuffer): TestImport_Object { - const context: Context = new Context("Deserializing imported object-type TestImport_Object"); - const reader = new ReadDecoder(buffer, context); - return readTestImport_Object(reader); -} - -export function readTestImport_Object(reader: Read): TestImport_Object { - let numFields = reader.readMapLength(); - - let _object: Types.TestImport_AnotherObject | null = null; - let _objectSet: bool = false; - let _optObject: Types.TestImport_AnotherObject | null = null; - let _objectArray: Array = []; - let _objectArraySet: bool = false; - let _optObjectArray: Array | null = null; - let _en: Types.TestImport_Enum = 0; - let _enSet: bool = false; - let _optEnum: Box | null = null; - let _enumArray: Array = []; - let _enumArraySet: bool = false; - let _optEnumArray: Array | null> | null = null; - - while (numFields > 0) { - numFields--; - const field = reader.readString(); - - reader.context().push(field, "unknown", "searching for property type"); - if (field == "object") { - reader.context().push(field, "Types.TestImport_AnotherObject", "type found, reading property"); - const object = Types.TestImport_AnotherObject.read(reader); - _object = object; - _objectSet = true; - reader.context().pop(); - } - else if (field == "optObject") { - reader.context().push(field, "Types.TestImport_AnotherObject | null", "type found, reading property"); - let object: Types.TestImport_AnotherObject | null = null; - if (!reader.isNextNil()) { - object = Types.TestImport_AnotherObject.read(reader); - } - _optObject = object; - reader.context().pop(); - } - else if (field == "objectArray") { - reader.context().push(field, "Array", "type found, reading property"); - _objectArray = reader.readArray((reader: Read): Types.TestImport_AnotherObject => { - const object = Types.TestImport_AnotherObject.read(reader); - return object; - }); - _objectArraySet = true; - reader.context().pop(); - } - else if (field == "optObjectArray") { - reader.context().push(field, "Array | null", "type found, reading property"); - _optObjectArray = reader.readOptionalArray((reader: Read): Types.TestImport_AnotherObject | null => { - let object: Types.TestImport_AnotherObject | null = null; - if (!reader.isNextNil()) { - object = Types.TestImport_AnotherObject.read(reader); - } - return object; - }); - reader.context().pop(); - } - else if (field == "en") { - reader.context().push(field, "Types.TestImport_Enum", "type found, reading property"); - let value: Types.TestImport_Enum; - if (reader.isNextString()) { - value = Types.getTestImport_EnumValue(reader.readString()); - } else { - value = reader.readInt32(); - Types.sanitizeTestImport_EnumValue(value); - } - _en = value; - _enSet = true; - reader.context().pop(); - } - else if (field == "optEnum") { - reader.context().push(field, "Box | null", "type found, reading property"); - let value: Box | null; - if (!reader.isNextNil()) { - if (reader.isNextString()) { - value = Box.from( - Types.getTestImport_EnumValue(reader.readString()) - ); - } else { - value = Box.from( - reader.readInt32() - ); - Types.sanitizeTestImport_EnumValue(value.unwrap()); - } - } else { - value = null; - } - _optEnum = value; - reader.context().pop(); - } - else if (field == "enumArray") { - reader.context().push(field, "Array", "type found, reading property"); - _enumArray = reader.readArray((reader: Read): Types.TestImport_Enum => { - let value: Types.TestImport_Enum; - if (reader.isNextString()) { - value = Types.getTestImport_EnumValue(reader.readString()); - } else { - value = reader.readInt32(); - Types.sanitizeTestImport_EnumValue(value); - } - return value; - }); - _enumArraySet = true; - reader.context().pop(); - } - else if (field == "optEnumArray") { - reader.context().push(field, "Array | null> | null", "type found, reading property"); - _optEnumArray = reader.readOptionalArray((reader: Read): Box | null => { - let value: Box | null; - if (!reader.isNextNil()) { - if (reader.isNextString()) { - value = Box.from( - Types.getTestImport_EnumValue(reader.readString()) - ); - } else { - value = Box.from( - reader.readInt32() - ); - Types.sanitizeTestImport_EnumValue(value.unwrap()); - } - } else { - value = null; - } - return value; - }); - reader.context().pop(); - } - reader.context().pop(); - } - - if (!_object || !_objectSet) { - throw new Error(reader.context().printWithContext("Missing required property: 'object: TestImport_AnotherObject'")); - } - if (!_objectArraySet) { - throw new Error(reader.context().printWithContext("Missing required property: 'objectArray: [TestImport_AnotherObject]'")); - } - if (!_enSet) { - throw new Error(reader.context().printWithContext("Missing required property: 'en: TestImport_Enum'")); - } - if (!_enumArraySet) { - throw new Error(reader.context().printWithContext("Missing required property: 'enumArray: [TestImport_Enum]'")); - } - - return { - object: _object, - optObject: _optObject, - objectArray: _objectArray, - optObjectArray: _optObjectArray, - en: _en, - optEnum: _optEnum, - enumArray: _enumArray, - optEnumArray: _optEnumArray - }; -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/index.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/index.ts deleted file mode 100644 index f414d6c925..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-as/imported/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * from "./TestImport_Module"; -export * from "./TestImport_Object"; -export * from "./TestImport_AnotherObject"; -export * from "./TestImport_Enum"; -export * from "./TestImport_Enum_Return"; -export * from "./TestImport_Env"; diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-as/index.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/index.ts deleted file mode 100644 index a398b972b9..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-as/index.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { - Args_moduleMethod, - Args_objectMethod, - Args_optionalEnvMethod, - Args__if -} from "./Module"; -export { - Args_moduleMethod, - Args_objectMethod, - Args_optionalEnvMethod, - Args__if -}; -export { ModuleBase } from "./Module"; -export { CustomType } from "./CustomType"; -export { AnotherType } from "./AnotherType"; -export { CustomMapValue } from "./CustomMapValue"; -export { _else } from "./else"; -export { - CustomEnum, - getCustomEnumKey, - getCustomEnumValue, - sanitizeCustomEnumValue -} from "./CustomEnum"; -export { - _while, - getwhileKey, - getwhileValue, - sanitizewhileValue -} from "./while"; -export { TestImport_Module } from "./imported/TestImport_Module"; -export { TestImport_Object } from "./imported/TestImport_Object"; -export { TestImport_AnotherObject } from "./imported/TestImport_AnotherObject"; -export { TestImport_Env } from "./imported/TestImport_Env"; -export { - TestImport_Enum, - getTestImport_EnumKey, - getTestImport_EnumValue, - sanitizeTestImport_EnumValue -} from "./imported/TestImport_Enum"; -export { - TestImport_Enum_Return, - getTestImport_Enum_ReturnKey, - getTestImport_Enum_ReturnValue, - sanitizeTestImport_Enum_ReturnValue -} from "./imported/TestImport_Enum_Return"; -export { TestImport } from "./TestImport"; -export { Env } from "./Env"; diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-as/while/index.ts b/packages/test-cases/cases/bind/sanity/output/wrap-as/while/index.ts deleted file mode 100644 index d15bc02f7b..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-as/while/index.ts +++ /dev/null @@ -1,34 +0,0 @@ -export enum _while { - _for, - _in, - _MAX_ -} - -export function sanitizewhileValue(value: i32): void { - const valid = value >= 0 && value < _while._MAX_; - if (!valid) { - throw new Error("Invalid value for enum '_while': " + value.toString()); - } -} - -export function getwhileValue(key: string): _while { - if (key == "_for") { - return _while._for; - } - if (key == "_in") { - return _while._in; - } - - throw new Error("Invalid key for enum '_while': " + key); -} - -export function getwhileKey(value: _while): string { - sanitizewhileValue(value); - - switch (value) { - case _while._for: return "_for"; - case _while._in: return "_in"; - default: - throw new Error("Invalid value for enum '_while': " + value.toString()); - } -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/_else/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/_else/mod.rs deleted file mode 100644 index 1e13036df9..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/_else/mod.rs +++ /dev/null @@ -1,25 +0,0 @@ -use serde::{Serialize, Deserialize}; -use polywrap_msgpack_serde::{ - wrappers::polywrap_json::JSONString, - wrappers::polywrap_bigint::BigIntWrapper -}; -use polywrap_wasm_rs::{ - BigInt, - BigNumber, - Map, - JSON -}; - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct Else { - #[serde(rename = "else")] - pub _else: String, -} - -impl Else { - pub fn new() -> Else { - Else { - _else: String::new(), - } - } -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/_while/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/_while/mod.rs deleted file mode 100644 index 94f61f4505..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/_while/mod.rs +++ /dev/null @@ -1,53 +0,0 @@ -use polywrap_wasm_rs::{EnumTypeError}; -use serde::{Serialize, Deserialize}; -use std::convert::TryFrom; - -#[derive(Clone, Copy, Debug, Deserialize, Serialize)] -pub enum While { - #[serde(rename = "for")] - _for, - #[serde(rename = "in")] - _in, - _MAX_ -} - -pub fn sanitize_while_value(value: i32) -> Result<(), EnumTypeError> { - if value < 0 && value >= While::_MAX_ as i32 { - return Err(EnumTypeError::EnumProcessingError(format!("Invalid value for enum 'While': {}", value.to_string()))); - } - Ok(()) -} - -pub fn get_while_value(key: &str) -> Result { - match key { - "_for" => Ok(While::_for), - "_in" => Ok(While::_in), - "_MAX_" => Ok(While::_MAX_), - err => Err(EnumTypeError::EnumProcessingError(format!("Invalid key for enum 'While': {}", err))) - } -} - -pub fn get_while_key(value: While) -> Result { - if sanitize_while_value(value as i32).is_ok() { - match value { - While::_for => Ok("_for".to_string()), - While::_in => Ok("_in".to_string()), - While::_MAX_ => Ok("_MAX_".to_string()), - } - } else { - Err(EnumTypeError::EnumProcessingError(format!("Invalid value for enum 'While': {}", (value as i32).to_string()))) - } -} - -impl TryFrom for While { - type Error = EnumTypeError; - - fn try_from(v: i32) -> Result { - match v { - x if x == While::_for as i32 => Ok(While::_for), - x if x == While::_in as i32 => Ok(While::_in), - x if x == While::_MAX_ as i32 => Ok(While::_MAX_), - _ => Err(EnumTypeError::ParseEnumError(format!("Invalid value for enum 'While': {}", (v as i32).to_string()))), - } - } -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/another_type/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/another_type/mod.rs deleted file mode 100644 index 171fa6448a..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/another_type/mod.rs +++ /dev/null @@ -1,30 +0,0 @@ -use serde::{Serialize, Deserialize}; -use polywrap_msgpack_serde::{ - wrappers::polywrap_json::JSONString, - wrappers::polywrap_bigint::BigIntWrapper -}; -use polywrap_wasm_rs::{ - BigInt, - BigNumber, - Map, - JSON -}; -use crate::CustomType; - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct AnotherType { - pub prop: Option, - pub circular: Option, - #[serde(rename = "const")] - pub _const: Option, -} - -impl AnotherType { - pub fn new() -> AnotherType { - AnotherType { - prop: None, - circular: None, - _const: None, - } - } -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_enum/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_enum/mod.rs deleted file mode 100644 index 477827bda7..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_enum/mod.rs +++ /dev/null @@ -1,53 +0,0 @@ -use polywrap_wasm_rs::{EnumTypeError}; -use serde::{Serialize, Deserialize}; -use std::convert::TryFrom; - -#[derive(Clone, Copy, Debug, Deserialize, Serialize)] -pub enum CustomEnum { - #[serde(rename = "STRING")] - STRING, - #[serde(rename = "BYTES")] - BYTES, - _MAX_ -} - -pub fn sanitize_custom_enum_value(value: i32) -> Result<(), EnumTypeError> { - if value < 0 && value >= CustomEnum::_MAX_ as i32 { - return Err(EnumTypeError::EnumProcessingError(format!("Invalid value for enum 'CustomEnum': {}", value.to_string()))); - } - Ok(()) -} - -pub fn get_custom_enum_value(key: &str) -> Result { - match key { - "STRING" => Ok(CustomEnum::STRING), - "BYTES" => Ok(CustomEnum::BYTES), - "_MAX_" => Ok(CustomEnum::_MAX_), - err => Err(EnumTypeError::EnumProcessingError(format!("Invalid key for enum 'CustomEnum': {}", err))) - } -} - -pub fn get_custom_enum_key(value: CustomEnum) -> Result { - if sanitize_custom_enum_value(value as i32).is_ok() { - match value { - CustomEnum::STRING => Ok("STRING".to_string()), - CustomEnum::BYTES => Ok("BYTES".to_string()), - CustomEnum::_MAX_ => Ok("_MAX_".to_string()), - } - } else { - Err(EnumTypeError::EnumProcessingError(format!("Invalid value for enum 'CustomEnum': {}", (value as i32).to_string()))) - } -} - -impl TryFrom for CustomEnum { - type Error = EnumTypeError; - - fn try_from(v: i32) -> Result { - match v { - x if x == CustomEnum::STRING as i32 => Ok(CustomEnum::STRING), - x if x == CustomEnum::BYTES as i32 => Ok(CustomEnum::BYTES), - x if x == CustomEnum::_MAX_ as i32 => Ok(CustomEnum::_MAX_), - _ => Err(EnumTypeError::ParseEnumError(format!("Invalid value for enum 'CustomEnum': {}", (v as i32).to_string()))), - } - } -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_map_value/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_map_value/mod.rs deleted file mode 100644 index 29689350bb..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_map_value/mod.rs +++ /dev/null @@ -1,24 +0,0 @@ -use serde::{Serialize, Deserialize}; -use polywrap_msgpack_serde::{ - wrappers::polywrap_json::JSONString, - wrappers::polywrap_bigint::BigIntWrapper -}; -use polywrap_wasm_rs::{ - BigInt, - BigNumber, - Map, - JSON -}; - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct CustomMapValue { - pub foo: String, -} - -impl CustomMapValue { - pub fn new() -> CustomMapValue { - CustomMapValue { - foo: String::new(), - } - } -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_type/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_type/mod.rs deleted file mode 100644 index 2e53a74ff4..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/custom_type/mod.rs +++ /dev/null @@ -1,135 +0,0 @@ -use serde::{Serialize, Deserialize}; -use polywrap_msgpack_serde::{ - wrappers::polywrap_json::JSONString, - wrappers::polywrap_bigint::BigIntWrapper -}; -use polywrap_wasm_rs::{ - BigInt, - BigNumber, - Map, - JSON -}; -use crate::AnotherType; -use crate::CustomEnum; -use crate::CustomMapValue; - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct CustomType { - pub str: String, - #[serde(rename = "optStr")] - pub opt_str: Option, - pub u: u32, - #[serde(rename = "optU")] - pub opt_u: Option, - pub u8: u8, - pub u16: u16, - pub u32: u32, - pub i: i32, - pub i8: i8, - pub i16: i16, - pub i32: i32, - pub bigint: BigIntWrapper, - #[serde(rename = "optBigint")] - pub opt_bigint: Option, - pub bignumber: BigNumber, - #[serde(rename = "optBignumber")] - pub opt_bignumber: Option, - pub json: JSONString, - #[serde(rename = "optJson")] - pub opt_json: Option, - #[serde(with = "serde_bytes")] - pub bytes: Vec, - #[serde(with = "serde_bytes")] - #[serde(rename = "optBytes")] - pub opt_bytes: Option>, - pub boolean: bool, - #[serde(rename = "optBoolean")] - pub opt_boolean: Option, - pub u_array: Vec, - #[serde(rename = "uOpt_array")] - pub u_opt_array: Option>, - #[serde(rename = "_opt_uOptArray")] - pub _opt_u_opt_array: Option>>, - #[serde(rename = "optStrOptArray")] - pub opt_str_opt_array: Option>>, - #[serde(rename = "uArrayArray")] - pub u_array_array: Vec>, - #[serde(rename = "uOptArrayOptArray")] - pub u_opt_array_opt_array: Vec>>>, - #[serde(rename = "uArrayOptArrayArray")] - pub u_array_opt_array_array: Vec>>>, - #[serde(rename = "crazyArray")] - pub crazy_array: Option>>>>>>, - pub object: AnotherType, - #[serde(rename = "optObject")] - pub opt_object: Option, - #[serde(rename = "objectArray")] - pub object_array: Vec, - #[serde(rename = "optObjectArray")] - pub opt_object_array: Option>>, - pub en: CustomEnum, - #[serde(rename = "optEnum")] - pub opt_enum: Option, - #[serde(rename = "enumArray")] - pub enum_array: Vec, - #[serde(rename = "optEnumArray")] - pub opt_enum_array: Option>>, - pub map: Map, - #[serde(rename = "mapOfArr")] - pub map_of_arr: Map>, - #[serde(rename = "mapOfObj")] - pub map_of_obj: Map, - #[serde(rename = "mapOfArrOfObj")] - pub map_of_arr_of_obj: Map>, - #[serde(rename = "mapCustomValue")] - pub map_custom_value: Map>, -} - -impl CustomType { - pub fn new() -> CustomType { - CustomType { - str: String::new(), - opt_str: None, - u: 0, - opt_u: None, - u8: 0, - u16: 0, - u32: 0, - i: 0, - i8: 0, - i16: 0, - i32: 0, - bigint: BigIntWrapper(BigInt::default()), - opt_bigint: None, - bignumber: BigNumber::default(), - opt_bignumber: None, - json: JSONString::from(JSON::Value::Null), - opt_json: None, - bytes: vec![], - opt_bytes: None, - boolean: false, - opt_boolean: None, - u_array: vec![], - u_opt_array: None, - _opt_u_opt_array: None, - opt_str_opt_array: None, - u_array_array: vec![], - u_opt_array_opt_array: vec![], - u_array_opt_array_array: vec![], - crazy_array: None, - object: Option::new(), - opt_object: None, - object_array: vec![], - opt_object_array: None, - en: Option::_MAX_, - opt_enum: None, - enum_array: vec![], - opt_enum_array: None, - map: Map::::new(), - map_of_arr: Map::>::new(), - map_of_obj: Map::::new(), - map_of_arr_of_obj: Map::>::new(), - map_custom_value: Map::>::new(), - } - } -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/entry.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/entry.rs deleted file mode 100644 index 25d939ff06..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/entry.rs +++ /dev/null @@ -1,41 +0,0 @@ -use crate::{ - module_method_wrapped, - object_method_wrapped, - optional_env_method_wrapped, - if_wrapped -}; -use polywrap_wasm_rs::{ - abort, - invoke, - InvokeArgs, -}; - -#[no_mangle] -pub extern "C" fn _wrap_invoke(method_size: u32, args_size: u32, env_size: u32) -> bool { - // Ensure the abort handler is properly setup - abort::wrap_abort_setup(); - - let args: InvokeArgs = invoke::wrap_invoke_args(method_size, args_size); - let result: Vec; - - match args.method.as_str() { - "moduleMethod" => { - result = module_method_wrapped(args.args.as_slice(), env_size); - } - "objectMethod" => { - result = object_method_wrapped(args.args.as_slice(), env_size); - } - "optionalEnvMethod" => { - result = optional_env_method_wrapped(args.args.as_slice(), env_size); - } - "if" => { - result = if_wrapped(args.args.as_slice(), env_size); - } - _ => { - invoke::wrap_invoke_error(format!("Could not find invoke function {}", args.method)); - return false; - } - }; - invoke::wrap_invoke_result(result); - return true; -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/env/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/env/mod.rs deleted file mode 100644 index cc57defade..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/env/mod.rs +++ /dev/null @@ -1,30 +0,0 @@ -use serde::{Serialize, Deserialize}; -use polywrap_msgpack_serde::{ - wrappers::polywrap_json::JSONString, - wrappers::polywrap_bigint::BigIntWrapper -}; -use polywrap_wasm_rs::{ - BigInt, - BigNumber, - Map, - JSON -}; - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct Env { - pub prop: String, - #[serde(rename = "optProp")] - pub opt_prop: Option, - #[serde(rename = "optMap")] - pub opt_map: Option>>, -} - -impl Env { - pub fn new() -> Env { - Env { - prop: String::new(), - opt_prop: None, - opt_map: None, - } - } -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/mod.rs deleted file mode 100644 index 6d97b84f52..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/mod.rs +++ /dev/null @@ -1,12 +0,0 @@ -pub mod test_import_object; -pub use test_import_object::*; -pub mod test_import_another_object; -pub use test_import_another_object::*; -pub mod test_import_enum; -pub use test_import_enum::*; -pub mod test_import_enum_return; -pub use test_import_enum_return::*; -pub mod test_import_module; -pub use test_import_module::*; -pub mod test_import_env; -pub use test_import_env::*; diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_another_object/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_another_object/mod.rs deleted file mode 100644 index d5b29d8ab3..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_another_object/mod.rs +++ /dev/null @@ -1,26 +0,0 @@ -use serde::{Serialize, Deserialize}; -use polywrap_msgpack_serde::{ - wrappers::polywrap_json::JSONString, - wrappers::polywrap_bigint::BigIntWrapper -}; -use polywrap_wasm_rs::{ - BigInt, - BigNumber, - Map, - JSON -}; - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct TestImportAnotherObject { - pub prop: String, -} - -impl TestImportAnotherObject { - pub const URI: &'static str = "testimport.uri.eth"; - - pub fn new() -> TestImportAnotherObject { - TestImportAnotherObject { - prop: String::new(), - } - } -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_enum/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_enum/mod.rs deleted file mode 100644 index 4a22dd0029..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_enum/mod.rs +++ /dev/null @@ -1,53 +0,0 @@ -use polywrap_wasm_rs::EnumTypeError; -use serde::{Serialize, Deserialize}; -use std::convert::TryFrom; - -#[derive(Clone, Copy, Debug, Deserialize, Serialize)] -pub enum TestImportEnum { - #[serde(rename = "STRING")] - STRING, - #[serde(rename = "BYTES")] - BYTES, - _MAX_ -} - -pub fn sanitize_test_import_enum_value(value: i32) -> Result<(), EnumTypeError> { - if value < 0 && value >= TestImportEnum::_MAX_ as i32 { - return Err(EnumTypeError::EnumProcessingError(format!("Invalid value for enum 'TestImportEnum': {}", value.to_string()))); - } - Ok(()) -} - -pub fn get_test_import_enum_value(key: &str) -> Result { - match key { - "STRING" => Ok(TestImportEnum::STRING), - "BYTES" => Ok(TestImportEnum::BYTES), - "_MAX_" => Ok(TestImportEnum::_MAX_), - err => Err(EnumTypeError::EnumProcessingError(format!("Invalid key for enum 'TestImportEnum': {}", err))) - } -} - -pub fn get_test_import_enum_key(value: TestImportEnum) -> Result { - if sanitize_test_import_enum_value(value as i32).is_ok() { - match value { - TestImportEnum::STRING => Ok("STRING".to_string()), - TestImportEnum::BYTES => Ok("BYTES".to_string()), - TestImportEnum::_MAX_ => Ok("_MAX_".to_string()), - } - } else { - Err(EnumTypeError::EnumProcessingError(format!("Invalid value for enum 'TestImportEnum': {}", (value as i32).to_string()))) - } -} - -impl TryFrom for TestImportEnum { - type Error = EnumTypeError; - - fn try_from(v: i32) -> Result { - match v { - x if x == TestImportEnum::STRING as i32 => Ok(TestImportEnum::STRING), - x if x == TestImportEnum::BYTES as i32 => Ok(TestImportEnum::BYTES), - x if x == TestImportEnum::_MAX_ as i32 => Ok(TestImportEnum::_MAX_), - _ => Err(EnumTypeError::ParseEnumError(format!("Invalid value for enum 'TestImportEnum': {}", (v as i32).to_string()))), - } - } -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_enum_return/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_enum_return/mod.rs deleted file mode 100644 index 8d668d2910..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_enum_return/mod.rs +++ /dev/null @@ -1,53 +0,0 @@ -use polywrap_wasm_rs::EnumTypeError; -use serde::{Serialize, Deserialize}; -use std::convert::TryFrom; - -#[derive(Clone, Copy, Debug, Deserialize, Serialize)] -pub enum TestImportEnumReturn { - #[serde(rename = "STRING")] - STRING, - #[serde(rename = "BYTES")] - BYTES, - _MAX_ -} - -pub fn sanitize_test_import_enum_return_value(value: i32) -> Result<(), EnumTypeError> { - if value < 0 && value >= TestImportEnumReturn::_MAX_ as i32 { - return Err(EnumTypeError::EnumProcessingError(format!("Invalid value for enum 'TestImportEnumReturn': {}", value.to_string()))); - } - Ok(()) -} - -pub fn get_test_import_enum_return_value(key: &str) -> Result { - match key { - "STRING" => Ok(TestImportEnumReturn::STRING), - "BYTES" => Ok(TestImportEnumReturn::BYTES), - "_MAX_" => Ok(TestImportEnumReturn::_MAX_), - err => Err(EnumTypeError::EnumProcessingError(format!("Invalid key for enum 'TestImportEnumReturn': {}", err))) - } -} - -pub fn get_test_import_enum_return_key(value: TestImportEnumReturn) -> Result { - if sanitize_test_import_enum_return_value(value as i32).is_ok() { - match value { - TestImportEnumReturn::STRING => Ok("STRING".to_string()), - TestImportEnumReturn::BYTES => Ok("BYTES".to_string()), - TestImportEnumReturn::_MAX_ => Ok("_MAX_".to_string()), - } - } else { - Err(EnumTypeError::EnumProcessingError(format!("Invalid value for enum 'TestImportEnumReturn': {}", (value as i32).to_string()))) - } -} - -impl TryFrom for TestImportEnumReturn { - type Error = EnumTypeError; - - fn try_from(v: i32) -> Result { - match v { - x if x == TestImportEnumReturn::STRING as i32 => Ok(TestImportEnumReturn::STRING), - x if x == TestImportEnumReturn::BYTES as i32 => Ok(TestImportEnumReturn::BYTES), - x if x == TestImportEnumReturn::_MAX_ as i32 => Ok(TestImportEnumReturn::_MAX_), - _ => Err(EnumTypeError::ParseEnumError(format!("Invalid value for enum 'TestImportEnumReturn': {}", (v as i32).to_string()))), - } - } -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_env/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_env/mod.rs deleted file mode 100644 index ea2dfd1b40..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_env/mod.rs +++ /dev/null @@ -1,42 +0,0 @@ -use serde::{Serialize, Deserialize}; -use polywrap_msgpack_serde::{ - wrappers::polywrap_json::JSONString, - wrappers::polywrap_bigint::BigIntWrapper -}; -use polywrap_wasm_rs::{ - BigInt, - BigNumber, - Map, - JSON -}; -use crate::TestImportAnotherObject; -use crate::TestImportEnum; - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct TestImportEnv { - pub object: TestImportAnotherObject, - pub opt_object: Option, - pub object_array: Vec, - pub opt_object_array: Option>>, - pub en: TestImportEnum, - pub opt_enum: Option, - pub enum_array: Vec, - pub opt_enum_array: Option>>, -} - -impl TestImportEnv { - pub const URI: &'static str = "testimport.uri.eth"; - - pub fn new() -> TestImportEnv { - TestImportEnv { - object: Option::new(), - opt_object: None, - object_array: vec![], - opt_object_array: None, - en: Option::_MAX_, - opt_enum: None, - enum_array: vec![], - opt_enum_array: None, - } - } -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_module/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_module/mod.rs deleted file mode 100644 index 873e07c430..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_module/mod.rs +++ /dev/null @@ -1,99 +0,0 @@ -use serde::{Serialize, Deserialize}; -use polywrap_msgpack_serde::{ - from_slice, - to_vec, - wrappers::polywrap_json::JSONString, - wrappers::polywrap_bigint::BigIntWrapper -}; -use polywrap_wasm_rs::{ - BigInt, - BigNumber, - Map, - JSON, - subinvoke -}; -use crate::TestImportObject; -use crate::TestImportEnum; -use crate::TestImportEnumReturn; - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct ArgsImportedMethod { - pub str: String, - #[serde(rename = "optStr")] - pub opt_str: Option, - pub u: u32, - #[serde(rename = "optU")] - pub opt_u: Option, - #[serde(rename = "uArrayArray")] - pub u_array_array: Vec>>>, - pub object: TestImportObject, - #[serde(rename = "optObject")] - pub opt_object: Option, - #[serde(rename = "objectArray")] - pub object_array: Vec, - #[serde(rename = "optObjectArray")] - pub opt_object_array: Option>>, - pub en: TestImportEnum, - #[serde(rename = "optEnum")] - pub opt_enum: Option, - #[serde(rename = "enumArray")] - pub enum_array: Vec, - #[serde(rename = "optEnumArray")] - pub opt_enum_array: Option>>, -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct ArgsAnotherMethod { - pub arg: Vec, -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct ArgsReturnsArrayOfEnums { - pub arg: String, -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct TestImportModule { - uri: String -} - -impl TestImportModule { - pub const INTERFACE_URI: &'static str = "testimport.uri.eth"; - - pub fn new(uri: String) -> TestImportModule { - TestImportModule { uri } - } - - pub fn imported_method(&self, args: &ArgsImportedMethod) -> Result, String> { - let ref uri = self.uri; - let args = to_vec(args).map_err(|e| e.to_string())?; - let result = subinvoke::wrap_subinvoke( - uri.as_str(), - "importedMethod", - args, - )?; - from_slice(result.as_slice()).map_err(|e| e.to_string()) - } - - pub fn another_method(&self, args: &ArgsAnotherMethod) -> Result { - let ref uri = self.uri; - let args = to_vec(args).map_err(|e| e.to_string())?; - let result = subinvoke::wrap_subinvoke( - uri.as_str(), - "anotherMethod", - args, - )?; - from_slice(result.as_slice()).map_err(|e| e.to_string()) - } - - pub fn returns_array_of_enums(&self, args: &ArgsReturnsArrayOfEnums) -> Result>, String> { - let ref uri = self.uri; - let args = to_vec(args).map_err(|e| e.to_string())?; - let result = subinvoke::wrap_subinvoke( - uri.as_str(), - "returnsArrayOfEnums", - args, - )?; - from_slice(result.as_slice()).map_err(|e| e.to_string()) - } -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_object/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_object/mod.rs deleted file mode 100644 index b40e4db32d..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/imported/test_import_object/mod.rs +++ /dev/null @@ -1,48 +0,0 @@ -use serde::{Serialize, Deserialize}; -use polywrap_msgpack_serde::{ - wrappers::polywrap_json::JSONString, - wrappers::polywrap_bigint::BigIntWrapper -}; -use polywrap_wasm_rs::{ - BigInt, - BigNumber, - Map, - JSON -}; -use crate::TestImportAnotherObject; -use crate::TestImportEnum; - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct TestImportObject { - pub object: TestImportAnotherObject, - #[serde(rename = "optObject")] - pub opt_object: Option, - #[serde(rename = "objectArray")] - pub object_array: Vec, - #[serde(rename = "optObjectArray")] - pub opt_object_array: Option>>, - pub en: TestImportEnum, - #[serde(rename = "optEnum")] - pub opt_enum: Option, - #[serde(rename = "enumArray")] - pub enum_array: Vec, - #[serde(rename = "optEnumArray")] - pub opt_enum_array: Option>>, -} - -impl TestImportObject { - pub const URI: &'static str = "testimport.uri.eth"; - - pub fn new() -> TestImportObject { - TestImportObject { - object: Option::new(), - opt_object: None, - object_array: vec![], - opt_object_array: None, - en: Option::_MAX_, - opt_enum: None, - enum_array: vec![], - opt_enum_array: None, - } - } -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/mod.rs deleted file mode 100644 index 5fa8c40b25..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/mod.rs +++ /dev/null @@ -1,64 +0,0 @@ -pub mod entry; -pub mod custom_type; -pub use custom_type::CustomType; -pub mod another_type; -pub use another_type::AnotherType; -pub mod custom_map_value; -pub use custom_map_value::CustomMapValue; -pub mod _else; -pub use _else::Else; -pub mod custom_enum; -pub use custom_enum::{ - get_custom_enum_key, - get_custom_enum_value, - sanitize_custom_enum_value, - CustomEnum -}; -pub mod _while; -pub use _while::{ - get_while_key, - get_while_value, - sanitize_while_value, - While -}; -pub mod env; -pub use env::Env; -pub mod imported; - -pub use imported::test_import_object::TestImportObject; -pub use imported::test_import_another_object::TestImportAnotherObject; -pub use imported::test_import_enum::{ - get_test_import_enum_key, - get_test_import_enum_value, - sanitize_test_import_enum_value, - TestImportEnum -}; -pub use imported::test_import_enum_return::{ - get_test_import_enum_return_key, - get_test_import_enum_return_value, - sanitize_test_import_enum_return_value, - TestImportEnumReturn -}; -pub use imported::test_import_env::TestImportEnv; -pub use imported::test_import_module::TestImportModule; -pub mod test_import; -pub use test_import::TestImport; -pub mod module; -pub use module::{ - Module, - ModuleTrait, - module_method_wrapped, - ArgsModuleMethod, - object_method_wrapped, - ArgsObjectMethod, - optional_env_method_wrapped, - ArgsOptionalEnvMethod, - if_wrapped, - ArgsIf -}; - -// Override print!(...) & println!(...) macros -#[macro_export] -macro_rules! println { ($($args:tt)*) => { polywrap_wasm_rs::wrap_debug_log(format!($($args)*).as_str()); } } -#[macro_export] -macro_rules! print { ($($args:tt)*) => { polywrap_wasm_rs::wrap_debug_log(format!($($args)*).as_str()); } } diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/module/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/module/mod.rs deleted file mode 100644 index 1216287feb..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/module/mod.rs +++ /dev/null @@ -1,14 +0,0 @@ -pub mod wrapped; -pub use wrapped::{ - module_method_wrapped, - ArgsModuleMethod, - object_method_wrapped, - ArgsObjectMethod, - optional_env_method_wrapped, - ArgsOptionalEnvMethod, - if_wrapped, - ArgsIf -}; - -pub mod module; -pub use module::*; diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/module/module.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/module/module.rs deleted file mode 100644 index e5cf0918fb..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/module/module.rs +++ /dev/null @@ -1,32 +0,0 @@ -use polywrap_msgpack_serde::{ - wrappers::polywrap_json::JSONString, - wrappers::polywrap_bigint::BigIntWrapper -}; -use polywrap_wasm_rs::{ - BigInt, - BigNumber, - Map, - JSON -}; -use crate::{ - ArgsModuleMethod, - ArgsObjectMethod, - ArgsOptionalEnvMethod, - ArgsIf, -}; -use crate::CustomEnum; -use crate::AnotherType; -use crate::Else; -use crate::env::Env; - -pub struct Module; - -pub trait ModuleTrait { - fn module_method(args: ArgsModuleMethod) -> Result; - - fn object_method(args: ArgsObjectMethod, env: Env) -> Result, String>; - - fn optional_env_method(args: ArgsOptionalEnvMethod, env: Option) -> Result, String>; - - fn _if(args: ArgsIf) -> Result; -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/module/wrapped.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/module/wrapped.rs deleted file mode 100644 index 16da48c5ba..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/module/wrapped.rs +++ /dev/null @@ -1,183 +0,0 @@ -use serde::{Deserialize, Serialize}; -use polywrap_msgpack_serde::{ - from_slice, - to_vec, - wrappers::polywrap_json::JSONString, - wrappers::polywrap_bigint::BigIntWrapper -}; -use polywrap_wasm_rs::{ - BigInt, - BigNumber, - Map, - JSON, - wrap_load_env -}; -use crate::module::{ModuleTrait, Module}; -use crate::CustomEnum; -use crate::AnotherType; -use crate::Else; -use crate::Env; - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct ArgsModuleMethod { - pub str: String, - #[serde(rename = "optStr")] - pub opt_str: Option, - pub en: CustomEnum, - #[serde(rename = "optEnum")] - pub opt_enum: Option, - #[serde(rename = "enumArray")] - pub enum_array: Vec, - #[serde(rename = "optEnumArray")] - pub opt_enum_array: Option>>, - pub map: Map, - #[serde(rename = "mapOfArr")] - pub map_of_arr: Map>, - #[serde(rename = "mapOfMap")] - pub map_of_map: Map>, - #[serde(rename = "mapOfObj")] - pub map_of_obj: Map, - #[serde(rename = "mapOfArrOfObj")] - pub map_of_arr_of_obj: Map>, -} - -pub fn module_method_wrapped(args: &[u8], env_size: u32) -> Vec { - match from_slice::(args) { - Ok(args) => { - let result = Module::module_method(ArgsModuleMethod { - str: args.str, - opt_str: args.opt_str, - en: args.en, - opt_enum: args.opt_enum, - enum_array: args.enum_array, - opt_enum_array: args.opt_enum_array, - map: args.map, - map_of_arr: args.map_of_arr, - map_of_map: args.map_of_map, - map_of_obj: args.map_of_obj, - map_of_arr_of_obj: args.map_of_arr_of_obj, - }); - match result { - Ok(res) => { - to_vec(&res).unwrap() - } - Err(e) => { - panic!("{}", e.to_string()) - } - } - } - Err(e) => { - panic!("{}", e.to_string()) - } - } -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct ArgsObjectMethod { - pub object: AnotherType, - #[serde(rename = "optObject")] - pub opt_object: Option, - #[serde(rename = "objectArray")] - pub object_array: Vec, - #[serde(rename = "optObjectArray")] - pub opt_object_array: Option>>, -} - -pub fn object_method_wrapped(args: &[u8], env_size: u32) -> Vec { - if env_size == 0 { - panic!("Environment is not set, and it is required by method 'objectMethod'"); - } - - let env_buf = wrap_load_env(env_size); - let env = Env::from_buffer(&env_buf).unwrap(); - - match from_slice::(args) { - Ok(args) => { - let result = Module::object_method(ArgsObjectMethod { - object: args.object, - opt_object: args.opt_object, - object_array: args.object_array, - opt_object_array: args.opt_object_array, - }, env); - match result { - Ok(res) => { - to_vec(&res).unwrap() - } - Err(e) => { - panic!("{}", e.to_string()) - } - } - } - Err(e) => { - panic!("{}", e.to_string()) - } - } -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct ArgsOptionalEnvMethod { - pub object: AnotherType, - #[serde(rename = "optObject")] - pub opt_object: Option, - #[serde(rename = "objectArray")] - pub object_array: Vec, - #[serde(rename = "optObjectArray")] - pub opt_object_array: Option>>, -} - -pub fn optional_env_method_wrapped(args: &[u8], env_size: u32) -> Vec { - let mut env: Option = None; - if env_size > 0 { - let env_buf = wrap_load_env(env_size); - env = Some(Env::from_buffer(&env_buf).unwrap()); - } - - match from_slice::(args) { - Ok(args) => { - let result = Module::optional_env_method(ArgsOptionalEnvMethod { - object: args.object, - opt_object: args.opt_object, - object_array: args.object_array, - opt_object_array: args.opt_object_array, - }, env); - match result { - Ok(res) => { - to_vec(&res).unwrap() - } - Err(e) => { - panic!("{}", e.to_string()) - } - } - } - Err(e) => { - panic!("{}", e.to_string()) - } - } -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct ArgsIf { - #[serde(rename = "if")] - pub _if: Else, -} - -pub fn if_wrapped(args: &[u8], env_size: u32) -> Vec { - match from_slice::(args) { - Ok(args) => { - let result = Module::_if(ArgsIf { - _if: args._if, - }); - match result { - Ok(res) => { - to_vec(&res).unwrap() - } - Err(e) => { - panic!("{}", e.to_string()) - } - } - } - Err(e) => { - panic!("{}", e.to_string()) - } - } -} diff --git a/packages/test-cases/cases/bind/sanity/output/wrap-rs/test_import/mod.rs b/packages/test-cases/cases/bind/sanity/output/wrap-rs/test_import/mod.rs deleted file mode 100644 index e50df13ba6..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/wrap-rs/test_import/mod.rs +++ /dev/null @@ -1,11 +0,0 @@ -use polywrap_wasm_rs::wrap_get_implementations; - -pub struct TestImport {} - -impl TestImport { - const uri: &'static str = "testimport.uri.eth"; - - pub fn get_implementations() -> Vec { - wrap_get_implementations(Self::uri) - } -} From f0311cafce747a7aec042ccd54470b88394e8e8e Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Wed, 19 Jul 2023 11:38:31 +0800 Subject: [PATCH 165/181] fix: issues --- .../Env%type%Serialization-go.mustache | 4 +- .../Env%type%Serialization-go.mustache | 4 +- .../Object%type%Serialization-go.mustache | 4 +- .../Object%type%Serialization-go.mustache | 4 +- packages/templates/wasm/golang/build.py | 106 ------------------ packages/templates/wasm/golang/go.mod | 2 +- .../templates/wasm/golang/wasm-target.json | 27 ----- 7 files changed, 9 insertions(+), 142 deletions(-) delete mode 100644 packages/templates/wasm/golang/build.py delete mode 100644 packages/templates/wasm/golang/wasm-target.json diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache index 780c629ec4..d10f2f3c5f 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/env-type/Env%type%Serialization-go.mustache @@ -12,8 +12,8 @@ func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toU func write{{#toUpper}}{{type}}{{/toUpper}}(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { writer.WriteMapLength({{properties.length}}) {{#properties}} - writer.Context().Push("{{#toLower}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toLower}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") - writer.WriteString("{{#toLower}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toLower}}") + writer.Context().Push("{{#handleKeywords}}{{name}}{{/handleKeywords}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + writer.WriteString("{{#handleKeywords}}{{name}}{{/handleKeywords}}") {{#scalar}} {{> serialize_scalar}} {{/scalar}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache index 71bce7c036..e05528ffa5 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/env-type/Env%type%Serialization-go.mustache @@ -15,8 +15,8 @@ func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toU func write{{#toUpper}}{{type}}{{/toUpper}}(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { writer.WriteMapLength({{properties.length}}) {{#properties}} - writer.Context().Push("{{#toLower}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toLower}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") - writer.WriteString("{{#toLower}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toLower}}") + writer.Context().Push("{{#handleKeywords}}{{name}}{{/handleKeywords}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + writer.WriteString("{{#handleKeywords}}{{name}}{{/handleKeywords}}") {{#scalar}} {{> serialize_scalar}} {{/scalar}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache index 38f4eb8711..c467df492d 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/imported/object-type/Object%type%Serialization-go.mustache @@ -15,8 +15,8 @@ func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toU func write{{#toUpper}}{{type}}{{/toUpper}}(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { writer.WriteMapLength({{properties.length}}) {{#properties}} - writer.Context().Push("{{#toLower}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toLower}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") - writer.WriteString("{{#toLower}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toLower}}") + writer.Context().Push("{{#handleKeywords}}{{name}}{{/handleKeywords}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + writer.WriteString("{{#handleKeywords}}{{name}}{{/handleKeywords}}") {{#scalar}} {{> serialize_scalar}} {{/scalar}} diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache index fe97fbf0bd..0aef83eee1 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/object-type/Object%type%Serialization-go.mustache @@ -15,8 +15,8 @@ func serialize{{#toUpper}}{{type}}{{/toUpper}}(value *{{#toUpper}}{{type}}{{/toU func write{{#toUpper}}{{type}}{{/toUpper}}(writer msgpack.Write, value *{{#toUpper}}{{type}}{{/toUpper}}) { writer.WriteMapLength({{properties.length}}) {{#properties}} - writer.Context().Push("{{#toLower}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toLower}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") - writer.WriteString("{{#toLower}}{{#handleKeywords}}{{name}}{{/handleKeywords}}{{/toLower}}") + writer.Context().Push("{{#handleKeywords}}{{name}}{{/handleKeywords}}", "{{#toWasm}}{{toGraphQLType}}{{/toWasm}}", "writing property") + writer.WriteString("{{#handleKeywords}}{{name}}{{/handleKeywords}}") {{#scalar}} {{> serialize_scalar}} {{/scalar}} diff --git a/packages/templates/wasm/golang/build.py b/packages/templates/wasm/golang/build.py deleted file mode 100644 index 734db3603c..0000000000 --- a/packages/templates/wasm/golang/build.py +++ /dev/null @@ -1,106 +0,0 @@ -import os -import subprocess -import re - -ACCEPTED_IMPORTS = {'wrap', 'env'} - -def build_wam_module(): - # subprocess.run(["yarn", "build"]) # this fails - - # go mod tidy - subprocess.run(["go", "mod", "tidy"], check=True) - - # tinygo build -o main.wasm -target wasm-target ./module/wrap/main/main.go - subprocess.run(["tinygo", "build", "-o", "./build/wrap.wasm", "-target", "wasm-target.json", "./module/wrap/main/main.go"], check=True) - - return "./build/wrap.wasm" - -def convert_wasm_to_wat(wasm_file): - wat_file = wasm_file.replace('.wasm', '.wat') - subprocess.run(['wasm2wat', wasm_file, '-o', wat_file], check=True) - return wat_file - -def find_import_functions(wat_file): - import_functions = [] - - with open(wat_file, 'r') as f: - content = f.read() - - pattern = r'\(import\s+"([^"]+)"\s+"([^"]+)"' - matches = re.findall(pattern, content) - - for match in matches: - namespace = match[0] - if namespace == 'env' and match[1] != "memory": - import_functions.append(match[1]) - if namespace not in ACCEPTED_IMPORTS: - import_functions.append(match[1]) - - return import_functions - -def find_export_functions(wat_file): - export_functions = [] - - with open(wat_file, 'r') as f: - content = f.read() - - pattern = r'\(export\s+"([^"]+)"' - matches = re.findall(pattern, content) - - for match in matches: - export = match - if export.startswith('asyncify') or export.startswith('_wrap'): - continue - export_functions.append(export) - - return export_functions - -def snip_unwanted_imports(wasm_module_path , import_functions): - if len(import_functions) == 0: - return - subprocess.run(['wasm-snip', wasm_module_path, '-o', wasm_module_path, '-p', *import_functions], check=True) - -def snip_unwanted_exports(wasm_module_path, export_functions): - if len(export_functions) == 0: - return - subprocess.run(['wasm-snip', wasm_module_path, '-o', wasm_module_path, *export_functions], check=True) - -def optimize_wasm(wasm_module_path): - subprocess.run(['wasm-opt', "-Os", wasm_module_path, '-o', wasm_module_path], check=True) - -def main(): - print("Building wasm module...") - wasm_module_path = build_wam_module() - print("Wasm module built at: ", wasm_module_path) - - print("Converting wasm to wat...") - wat_file = convert_wasm_to_wat(wasm_module_path) - print("Wat file generated at: ", wat_file) - - print("Finding unwanted import functions...") - import_functions = find_import_functions(wat_file) - print("Found unwanted import functions: ", import_functions) - - print("Finding unwanted export functions...") - export_functions = find_export_functions(wat_file) - print("Found unwanted export functions: ", export_functions) - - print("Snipping unwanted import functions...") - snip_unwanted_imports(wasm_module_path, import_functions) - print("Snipped unwanted imports ", wasm_module_path) - - print("Snipping unwanted export functions...") - snip_unwanted_exports(wasm_module_path, export_functions) - print("Snipped unwanted exports: ", wasm_module_path) - - print("Optimizing wasm module...") - optimize_wasm(wasm_module_path) - print("Wasm module optimized: ", wasm_module_path) - - print("Removing wat file...") - os.remove(wat_file) - print("Wat file removed") - - -if __name__ == "__main__": - main() diff --git a/packages/templates/wasm/golang/go.mod b/packages/templates/wasm/golang/go.mod index 7eee740fd6..14661e7af5 100644 --- a/packages/templates/wasm/golang/go.mod +++ b/packages/templates/wasm/golang/go.mod @@ -2,6 +2,6 @@ module example.com/template-wasm-go go 1.18 -require github.com/polywrap/go-wrap v0.0.0-20230712212127-6895977d63c2 +require github.com/polywrap/wrap-0.1 require github.com/valyala/fastjson v1.6.3 // indirect diff --git a/packages/templates/wasm/golang/wasm-target.json b/packages/templates/wasm/golang/wasm-target.json deleted file mode 100644 index 2e45a55999..0000000000 --- a/packages/templates/wasm/golang/wasm-target.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "llvm-target": "wasm32-unknown-wasi", - "cpu": "generic", - "features": "+bulk-memory,+nontrapping-fptoint,+sign-ext", - "build-tags": ["tinygo.wasm", "wasi"], - "goos": "linux", - "goarch": "arm", - "linker": "wasm-ld", - "libc": "wasi-libc", - "scheduler": "asyncify", - "default-stack-size": 24576, - "cflags": [ - "-mbulk-memory", - "-mnontrapping-fptoint", - "-msign-ext" - ], - "ldflags": [ - "--stack-first", - "--no-demangle", - "--import-memory" - ], - "extra-files": [ - "src/runtime/asm_tinygowasm.S" - ], - "emulator": "wasmtime --mapdir=/tmp::{tmpDir} {}", - "wasm-abi": "generic" -} From 6e4065f61c17ae32e74b47e1225e4c5a23d2c5d5 Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Wed, 19 Jul 2023 18:44:05 +0800 Subject: [PATCH 166/181] fix: issues --- packages/templates/wasm/golang/go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/templates/wasm/golang/go.mod b/packages/templates/wasm/golang/go.mod index 14661e7af5..78573cf707 100644 --- a/packages/templates/wasm/golang/go.mod +++ b/packages/templates/wasm/golang/go.mod @@ -2,6 +2,6 @@ module example.com/template-wasm-go go 1.18 -require github.com/polywrap/wrap-0.1 +require github.com/polywrap/go-wrap wrap-0.1 require github.com/valyala/fastjson v1.6.3 // indirect From 59f990de531cea4ac951467feb6dd168ddf12f63 Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Wed, 19 Jul 2023 22:57:35 +0800 Subject: [PATCH 167/181] fix: issues --- .../lib/defaults/build-strategies/wasm/golang/local/local.sh | 2 ++ .../module-type/module_wrapped/%type%Wrapped-go.mustache | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh index c958a3389c..743e311e2d 100644 --- a/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/golang/local/local.sh @@ -23,6 +23,7 @@ EXTRA_EXPORTS=$( if [ -z "$EXTRA_EXPORTS" ] then echo "No extra exports to remove" + cp ./build-staging/module.wasm ./build-staging/module_exports.wasm else echo "Removing extra exports: $EXTRA_EXPORTS" # Remove these extra exports from the wasm module via wasm-snip @@ -43,6 +44,7 @@ EXTRA_IMPORTS=$( if [ -z "$EXTRA_IMPORTS" ] then echo "No extra imports to remove" + cp ./build-staging/module_exports.wasm ./build-staging/module_exports_imports.wasm else echo "Removing extra imports: $EXTRA_IMPORTS" # Remove these extra imports from the wasm module via wasm-snip diff --git a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache index c4822d1d06..9e19e28d88 100644 --- a/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache +++ b/packages/schema/bind/src/bindings/golang/wasm/templates/module-type/module_wrapped/%type%Wrapped-go.mustache @@ -1,6 +1,6 @@ package module_wrapped {{#makeImports}} - {{#methods}}{{#env}}github.com/polywrap/go-wrap/wrap,. {{goImport}}/module/wrap/types,{{/env}}{{^env}}{{#needsTypes}}. {{goImport}}/module/wrap/types,{{/needsTypes}}{{/env}}{{/methods}} + {{#methods}}{{#env}}github.com/polywrap/go-wrap/wrap,. {{goImport}}/module/wrap/types,{{/env}}{{/methods}} {{goImport}}/module as methods, {{/makeImports}} {{#methods}} From 4008d37129c1c14c54d5aebca2d4d168d6b46eec Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Wed, 26 Jul 2023 17:07:06 +0200 Subject: [PATCH 168/181] chore: let default config throw --- packages/cli/lang/en.json | 1 - packages/cli/lang/es.json | 1 - packages/cli/src/lib/option-parsers/client-config.ts | 7 +------ 3 files changed, 1 insertion(+), 8 deletions(-) diff --git a/packages/cli/lang/en.json b/packages/cli/lang/en.json index 4f1ebb374a..4ee0cedc6e 100644 --- a/packages/cli/lang/en.json +++ b/packages/cli/lang/en.json @@ -167,7 +167,6 @@ "commands_test_error_unsupportedOutputFileExt": "Unsupported outputFile extention: {outputFileExt}", "commands_test_error_cueDoesNotExist": "Require cue to run validator, checkout https://cuelang.org/ for more information", "commands_test_error_noWorkflowScriptFound": "Workflow script not found at path: {path}", - "commands_test_error_noTestEnvFound": "polywrap test-env not found, please run 'polywrap infra up --modules=eth-ens-ipfs'", "commands_polywrap_error_notACommand": "is not a command", "commands_polywrap_helpPrompt": "Type {command} to view common commands", "commands_manifest_description": "Inspect & Migrade Polywrap Manifests", diff --git a/packages/cli/lang/es.json b/packages/cli/lang/es.json index 4f1ebb374a..4ee0cedc6e 100644 --- a/packages/cli/lang/es.json +++ b/packages/cli/lang/es.json @@ -167,7 +167,6 @@ "commands_test_error_unsupportedOutputFileExt": "Unsupported outputFile extention: {outputFileExt}", "commands_test_error_cueDoesNotExist": "Require cue to run validator, checkout https://cuelang.org/ for more information", "commands_test_error_noWorkflowScriptFound": "Workflow script not found at path: {path}", - "commands_test_error_noTestEnvFound": "polywrap test-env not found, please run 'polywrap infra up --modules=eth-ens-ipfs'", "commands_polywrap_error_notACommand": "is not a command", "commands_polywrap_helpPrompt": "Type {command} to view common commands", "commands_manifest_description": "Inspect & Migrade Polywrap Manifests", diff --git a/packages/cli/src/lib/option-parsers/client-config.ts b/packages/cli/src/lib/option-parsers/client-config.ts index 4a7b0f9064..3cec63fc1e 100644 --- a/packages/cli/src/lib/option-parsers/client-config.ts +++ b/packages/cli/src/lib/option-parsers/client-config.ts @@ -11,12 +11,7 @@ export async function parseClientConfigOption( ): Promise { const builder = new PolywrapClientConfigBuilder().addDefaults(); - try { - builder.add(getTestEnvClientConfig()); - } catch (e) { - console.error(intlMsg.commands_test_error_noTestEnvFound()); - process.exit(1); - } + builder.add(getTestEnvClientConfig()); if (clientConfig) { let configModule; From bee8a229ad39b6da97f92c2b4810799fb7254f4a Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Wed, 26 Jul 2023 22:06:02 +0200 Subject: [PATCH 169/181] chore: upgrade to 0.12 client --- packages/cli/package.json | 22 +- packages/js/validation/package.json | 2 +- packages/schema/bind/package.json | 4 +- packages/schema/compose/package.json | 2 +- packages/schema/parse/package.json | 2 +- .../templates/app/typescript/package.json | 2 +- .../templates/plugin/typescript/package.json | 6 +- yarn.lock | 593 ++++++++---------- 8 files changed, 278 insertions(+), 355 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 6c79da5bf6..6c3fc17377 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -43,24 +43,24 @@ "@ethersproject/providers": "5.6.8", "@ethersproject/wallet": "5.6.2", "@formatjs/intl": "1.8.2", - "@polywrap/asyncify-js": "0.12.0-pre.1", - "@polywrap/client-config-builder-js": "0.12.0-pre.1", - "@polywrap/client-js": "0.12.0-pre.1", - "@polywrap/core-js": "0.12.0-pre.1", + "@polywrap/asyncify-js": "0.12.0", + "@polywrap/client-config-builder-js": "0.12.0", + "@polywrap/client-js": "0.12.0", + "@polywrap/core-js": "0.12.0", "@polywrap/ethereum-provider-js": "0.3.1", "@polywrap/logging-js": "0.11.0-pre.4", "@polywrap/os-js": "0.11.0-pre.4", "@polywrap/polywrap-manifest-types-js": "0.11.0-pre.4", - "@polywrap/result": "0.12.0-pre.1", + "@polywrap/result": "0.12.0", "@polywrap/schema-bind": "0.11.0-pre.4", "@polywrap/schema-compose": "0.11.0-pre.4", "@polywrap/schema-parse": "0.11.0-pre.4", - "@polywrap/sys-config-bundle-js": "0.12.0-pre.1", - "@polywrap/uri-resolver-extensions-js": "0.12.0-pre.1", - "@polywrap/uri-resolvers-js": "0.12.0-pre.1", - "@polywrap/wasm-js": "0.12.0-pre.1", - "@polywrap/web3-config-bundle-js": "0.12.0-pre.1", - "@polywrap/wrap-manifest-types-js": "0.12.0-pre.1", + "@polywrap/sys-config-bundle-js": "0.12.0", + "@polywrap/uri-resolver-extensions-js": "0.12.0", + "@polywrap/uri-resolvers-js": "0.12.0", + "@polywrap/wasm-js": "0.12.0", + "@polywrap/web3-config-bundle-js": "0.12.0", + "@polywrap/wrap-manifest-types-js": "0.12.0", "axios": "0.21.2", "chalk": "4.1.0", "chokidar": "3.5.1", diff --git a/packages/js/validation/package.json b/packages/js/validation/package.json index 14f3b4182b..fda60ccde7 100644 --- a/packages/js/validation/package.json +++ b/packages/js/validation/package.json @@ -19,7 +19,7 @@ }, "dependencies": { "@polywrap/schema-compose": "0.11.0-pre.4", - "@polywrap/wrap-manifest-types-js": "0.12.0-pre.1" + "@polywrap/wrap-manifest-types-js": "0.12.0" }, "devDependencies": { "@polywrap/msgpack-js": "0.10.0", diff --git a/packages/schema/bind/package.json b/packages/schema/bind/package.json index 4ca365879b..cb329f605f 100644 --- a/packages/schema/bind/package.json +++ b/packages/schema/bind/package.json @@ -19,10 +19,10 @@ "copy:templates": "copyfiles -u 1 src/**/*.mustache build/" }, "dependencies": { - "@polywrap/client-js": "0.12.0-pre.1", + "@polywrap/client-js": "0.12.0", "@polywrap/os-js": "0.11.0-pre.4", "@polywrap/schema-parse": "0.11.0-pre.4", - "@polywrap/wrap-manifest-types-js": "0.12.0-pre.1", + "@polywrap/wrap-manifest-types-js": "0.12.0", "mustache": "4.0.1" }, "devDependencies": { diff --git a/packages/schema/compose/package.json b/packages/schema/compose/package.json index d2bccfcb0d..7f1b396426 100644 --- a/packages/schema/compose/package.json +++ b/packages/schema/compose/package.json @@ -19,7 +19,7 @@ }, "dependencies": { "@polywrap/schema-parse": "0.11.0-pre.4", - "@polywrap/wrap-manifest-types-js": "0.12.0-pre.1", + "@polywrap/wrap-manifest-types-js": "0.12.0", "graphql": "15.5.0", "mustache": "4.0.1" }, diff --git a/packages/schema/parse/package.json b/packages/schema/parse/package.json index 3f2480a104..2163c7a216 100644 --- a/packages/schema/parse/package.json +++ b/packages/schema/parse/package.json @@ -19,7 +19,7 @@ }, "dependencies": { "@dorgjelli/graphql-schema-cycles": "1.1.4", - "@polywrap/wrap-manifest-types-js": "0.12.0-pre.1", + "@polywrap/wrap-manifest-types-js": "0.12.0", "graphql": "15.5.0" }, "devDependencies": { diff --git a/packages/templates/app/typescript/package.json b/packages/templates/app/typescript/package.json index 2ff7666a05..c01d697629 100644 --- a/packages/templates/app/typescript/package.json +++ b/packages/templates/app/typescript/package.json @@ -8,7 +8,7 @@ "test": "ts-node ./src/index.ts" }, "dependencies": { - "@polywrap/client-js": "~0.12.0-pre.1" + "@polywrap/client-js": "~0.12.0" }, "devDependencies": { "@types/node": "18.15.0", diff --git a/packages/templates/plugin/typescript/package.json b/packages/templates/plugin/typescript/package.json index a85e27eea3..677140fe6c 100644 --- a/packages/templates/plugin/typescript/package.json +++ b/packages/templates/plugin/typescript/package.json @@ -11,15 +11,15 @@ "test:watch": "yarn test -- --watch" }, "dependencies": { - "@polywrap/core-js": "~0.12.0-pre.1", - "@polywrap/plugin-js": "~0.12.0-pre.1" + "@polywrap/core-js": "~0.12.0", + "@polywrap/plugin-js": "~0.12.0" }, "peerDependencies": { "@polywrap/core-js": "0.12.x", "@polywrap/plugin-js": "0.12.x" }, "devDependencies": { - "@polywrap/client-js": "~0.12.0-pre.1", + "@polywrap/client-js": "~0.12.0", "@types/jest": "26.0.8", "@types/prettier": "2.6.0", "jest": "26.6.3", diff --git a/yarn.lock b/yarn.lock index 2415cf732f..e0e6b4ae73 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2141,67 +2141,67 @@ resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.6.0.tgz#ed410c9eb0070491cff9fe914246ce41f88d6f74" integrity sha512-aPfcBeLErM/PPiAuAbNFLN5sNbZLc3KZlar27uohllN8Zs6jJbHyJU1y7cMA6W/zuq+thkaG8mujiS+3iD/FWQ== -"@polywrap/asyncify-js@0.12.0-pre.1": - version "0.12.0-pre.1" - resolved "https://registry.yarnpkg.com/@polywrap/asyncify-js/-/asyncify-js-0.12.0-pre.1.tgz#a09d3a1346315737790c36d8aa00e2d31fd849c5" - integrity sha512-E6OfxaOUrtHgp+3pbr5uJPLeoE9UJU7VXeL37n8ETel7LLjPfSfV7xn2x7iqdhvpJd5S+1daczC/g7espLzfLw== - -"@polywrap/client-config-builder-js@0.12.0-pre.1": - version "0.12.0-pre.1" - resolved "https://registry.yarnpkg.com/@polywrap/client-config-builder-js/-/client-config-builder-js-0.12.0-pre.1.tgz#5fca0bfc216de2978b95bea1fd09b54cf6e40afa" - integrity sha512-fQ+i3VTyGWBM8eKamD2uLBK1l0/nV5C06GiaMpIGhU6yWL3ZcQBffl8OOU/uM0tdgpaNxdNMR/XcNzHjkVySjQ== - dependencies: - "@polywrap/config-bundle-types-js" "0.12.0-pre.1" - "@polywrap/core-js" "0.12.0-pre.1" - "@polywrap/plugin-js" "0.12.0-pre.1" - "@polywrap/sys-config-bundle-js" "0.12.0-pre.1" - "@polywrap/uri-resolver-extensions-js" "0.12.0-pre.1" - "@polywrap/uri-resolvers-js" "0.12.0-pre.1" - "@polywrap/wasm-js" "0.12.0-pre.1" - "@polywrap/web3-config-bundle-js" "0.12.0-pre.1" - -"@polywrap/client-js@0.12.0-pre.1", "@polywrap/client-js@~0.12.0-pre.1": - version "0.12.0-pre.1" - resolved "https://registry.yarnpkg.com/@polywrap/client-js/-/client-js-0.12.0-pre.1.tgz#1df47c4eef946dc74ed4025e4726377c89b3b70c" - integrity sha512-BlmDn+wJqDsvpr26959vbO0XobPQ8XTb+qaK9bt2Zgqfb6st10KS9H099WFhGXOAGXsUQFi9SqQPjvUjeMoU1A== - dependencies: - "@polywrap/client-config-builder-js" "0.12.0-pre.1" - "@polywrap/core-client-js" "0.12.0-pre.1" - "@polywrap/core-js" "0.12.0-pre.1" - "@polywrap/msgpack-js" "0.12.0-pre.1" - "@polywrap/plugin-js" "0.12.0-pre.1" - "@polywrap/result" "0.12.0-pre.1" - "@polywrap/tracing-js" "0.12.0-pre.1" - "@polywrap/uri-resolver-extensions-js" "0.12.0-pre.1" - "@polywrap/uri-resolvers-js" "0.12.0-pre.1" - "@polywrap/wrap-manifest-types-js" "0.12.0-pre.1" - -"@polywrap/concurrent-plugin-js@~0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@polywrap/concurrent-plugin-js/-/concurrent-plugin-js-0.10.0.tgz#662e49976f75f30632b302d515bd22c7643afc44" - integrity sha512-sc11ffs34ScBHPB9uHFZuTmF8yPtZT81sBpBj7f4MlmrRDxtJS56Y7k/qL6L1xuwsnmeFipi5JGau1CcBaYmJQ== - dependencies: - "@polywrap/core-js" "0.10.0" - "@polywrap/msgpack-js" "0.10.0" - "@polywrap/plugin-js" "0.10.0" +"@polywrap/asyncify-js@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@polywrap/asyncify-js/-/asyncify-js-0.12.0.tgz#8a7425f021b23e7301cd42955950b1d99673e3a7" + integrity sha512-gIom6pyz6MkE42BvFIAJH+DmCyv3oG8mZXpAx4H0oi34CLW4itzluN0uvkUmNZ744P1c5wMiQOMaCnXqTBZS2A== -"@polywrap/config-bundle-types-js@0.12.0-pre.1": - version "0.12.0-pre.1" - resolved "https://registry.yarnpkg.com/@polywrap/config-bundle-types-js/-/config-bundle-types-js-0.12.0-pre.1.tgz#72a389da3f309d9cfef555a1cbd828ecec0dac8d" - integrity sha512-zef/QxM2AmgEWPc3LuKCJwfn2QK0S9uQ83K+MgTiNHp9hoMmdG9ij4MUZDXpnJTyMn0dgREBpDqCHPfTsCbDLw== +"@polywrap/client-config-builder-js@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@polywrap/client-config-builder-js/-/client-config-builder-js-0.12.0.tgz#24dae5e133442a80de84f02d71e171bd5d5389bd" + integrity sha512-hWs8G0sTBckumvDjsxDymxrE5ggxmYE6kSYoMBtPvPY5Va5y9ElEJAdTtBTlELIugs6/f/3EHLzPyIdwaYaB/Q== + dependencies: + "@polywrap/config-bundle-types-js" "0.12.0" + "@polywrap/core-js" "0.12.0" + "@polywrap/plugin-js" "0.12.0" + "@polywrap/sys-config-bundle-js" "0.12.0" + "@polywrap/uri-resolver-extensions-js" "0.12.0" + "@polywrap/uri-resolvers-js" "0.12.0" + "@polywrap/wasm-js" "0.12.0" + "@polywrap/web3-config-bundle-js" "0.12.0" + +"@polywrap/client-js@0.12.0", "@polywrap/client-js@~0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@polywrap/client-js/-/client-js-0.12.0.tgz#c57348f5a760311fcd682b663be4a2a6edfe860b" + integrity sha512-ACdjwA+l3udCgpbDZlRiTzvQftajmb0OFLDZ0KzD/iLFqbNksMp1rFb4Cju3wKKVww6WB48pusgnBWFTdXP2Pw== + dependencies: + "@polywrap/client-config-builder-js" "0.12.0" + "@polywrap/core-client-js" "0.12.0" + "@polywrap/core-js" "0.12.0" + "@polywrap/msgpack-js" "0.12.0" + "@polywrap/plugin-js" "0.12.0" + "@polywrap/result" "0.12.0" + "@polywrap/tracing-js" "0.12.0" + "@polywrap/uri-resolver-extensions-js" "0.12.0" + "@polywrap/uri-resolvers-js" "0.12.0" + "@polywrap/wrap-manifest-types-js" "0.12.0" + +"@polywrap/concurrent-plugin-js@~0.12.0-pre.0": + version "0.12.0-pre.0" + resolved "https://registry.yarnpkg.com/@polywrap/concurrent-plugin-js/-/concurrent-plugin-js-0.12.0-pre.0.tgz#0cd41ff41c2be2f555432bd514392ed8e8448889" + integrity sha512-0+DJ9KO0oX+JxIC5UxNWmaXS6IH6mNUOh1bpMM34jaL+QUXjehZVtwnNpifFsaKd71Xf5DkozAkn3mSDscUgFw== + dependencies: + "@polywrap/core-js" "~0.12.0-pre.0" + "@polywrap/msgpack-js" "~0.12.0-pre.0" + "@polywrap/plugin-js" "~0.12.0-pre.0" + +"@polywrap/config-bundle-types-js@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@polywrap/config-bundle-types-js/-/config-bundle-types-js-0.12.0.tgz#fa8d023d470c1d793526339514e4bd59a2e3c518" + integrity sha512-JDihS10m+ncE42QZSP7ujuz4S9ZsSQsUPOZbyhqCZ6sw5LCmCxuR5ogVX6uF9Visd5L92ylQsoxFQk/jLoo0iQ== dependencies: - "@polywrap/core-js" "0.12.0-pre.1" + "@polywrap/core-js" "0.12.0" -"@polywrap/core-client-js@0.12.0-pre.1": - version "0.12.0-pre.1" - resolved "https://registry.yarnpkg.com/@polywrap/core-client-js/-/core-client-js-0.12.0-pre.1.tgz#9d4962e660ea467a98f4ff000ca1e00245dc305f" - integrity sha512-KQd/NLtdyksBGbnM8tLn+C+lugWaJT9q41nd+XNzbvH+CoDC4mdvZxAzzTusYRzNiHXvxz4/5hb/RfJRT5R2wA== +"@polywrap/core-client-js@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@polywrap/core-client-js/-/core-client-js-0.12.0.tgz#8e032bd11dc9608b1b14d371222a53041a4643dc" + integrity sha512-jHDVlBPGujhBbhJ5IjZwc+W4UfdMRc3xZ9RqOkJxp0MG7QFjiBoHhY/UHNNDMahXg7mWxpU1nZyCzcIx+/hO8w== dependencies: - "@polywrap/core-js" "0.12.0-pre.1" - "@polywrap/msgpack-js" "0.12.0-pre.1" - "@polywrap/result" "0.12.0-pre.1" - "@polywrap/tracing-js" "0.12.0-pre.1" - "@polywrap/wrap-manifest-types-js" "0.12.0-pre.1" + "@polywrap/core-js" "0.12.0" + "@polywrap/msgpack-js" "0.12.0" + "@polywrap/result" "0.12.0" + "@polywrap/tracing-js" "0.12.0" + "@polywrap/wrap-manifest-types-js" "0.12.0" "@polywrap/core-js@0.10.0": version "0.10.0" @@ -2212,53 +2212,24 @@ "@polywrap/tracing-js" "0.10.0" "@polywrap/wrap-manifest-types-js" "0.10.0" -"@polywrap/core-js@0.10.0-pre.10": - version "0.10.0-pre.10" - resolved "https://registry.yarnpkg.com/@polywrap/core-js/-/core-js-0.10.0-pre.10.tgz#3209dbcd097d3533574f1231c10ef633c2466d5c" - integrity sha512-a/1JtfrHafRh2y0XgK5dNc82gVzjCbXSdKof7ojDghCSRSHUxTw/cJ+pcLrPJhrsTi7VfTM0BFjw3/wC5RutuA== - dependencies: - "@polywrap/result" "0.10.0-pre.10" - "@polywrap/tracing-js" "0.10.0-pre.10" - "@polywrap/wrap-manifest-types-js" "0.10.0-pre.10" - -"@polywrap/core-js@0.10.1", "@polywrap/core-js@~0.10.1": - version "0.10.1" - resolved "https://registry.yarnpkg.com/@polywrap/core-js/-/core-js-0.10.1.tgz#09405c745f591d5f7ec243db95a61540a05296cb" - integrity sha512-BJpWDikfd/6h64Lf7FKy0g5O3a5OKaL915boni1pHP54wF4xBWdHkKixLGD8w4BZWRiW9v42PpYBhWqYZwSNGg== - dependencies: - "@polywrap/result" "0.10.1" - "@polywrap/tracing-js" "0.10.1" - "@polywrap/wrap-manifest-types-js" "0.10.1" - -"@polywrap/core-js@0.12.0-pre.1", "@polywrap/core-js@~0.12.0-pre.1": - version "0.12.0-pre.1" - resolved "https://registry.yarnpkg.com/@polywrap/core-js/-/core-js-0.12.0-pre.1.tgz#b376db87e0e60bd5940941b80c8cd064c44dc142" - integrity sha512-BMxp5nEJGGIerFsRR7x+CMSthIF0BjFFTTmWmpy3s5aTizKUfTtw5XIMnSeUAswA7+4beo8GSkS2u6L+T+u7YA== - dependencies: - "@polywrap/result" "0.12.0-pre.1" - "@polywrap/tracing-js" "0.12.0-pre.1" - "@polywrap/wrap-manifest-types-js" "0.12.0-pre.1" - -"@polywrap/datetime-plugin-js@~0.10.0": - version "0.10.1" - resolved "https://registry.yarnpkg.com/@polywrap/datetime-plugin-js/-/datetime-plugin-js-0.10.1.tgz#8042673034c09155f3d0972eef87d87cb53b1914" - integrity sha512-eB6osYgISVQjnz6SDJ+02Z5HIC3Qg82hU6m1b02fTCsAsJqIDTSoe5AUugd0KqQ3C+MHv03TlGuFn6ekjyutGg== +"@polywrap/core-js@0.12.0", "@polywrap/core-js@~0.12.0", "@polywrap/core-js@~0.12.0-pre.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@polywrap/core-js/-/core-js-0.12.0.tgz#ec68d6d6489df55bfa7a6bc0d5910a5ff9eb157a" + integrity sha512-wWQQ/pb+A4bM3U9bF6pVvwlKWLjF1nkbO3pJ5AKoHIe/5glFYAM/zCq/CTZlTsFzpNsczcru0mbQY5C8wK8aOw== dependencies: - "@polywrap/core-js" "~0.10.1" - "@polywrap/plugin-js" "~0.10.1" + "@polywrap/result" "0.12.0" + "@polywrap/tracing-js" "0.12.0" + "@polywrap/wrap-manifest-types-js" "0.12.0" -"@polywrap/ethereum-provider-js-v1@npm:@polywrap/ethereum-provider-js@~0.2.4": - version "0.2.4" - resolved "https://registry.yarnpkg.com/@polywrap/ethereum-provider-js/-/ethereum-provider-js-0.2.4.tgz#3df1a6548da191618bb5cae7928c7427e69e0030" - integrity sha512-64xRnniboxxHNZ4/gD6SS4T+QmJPUMbIYZ2hyLODb2QgH3qDBiU+i4gdiQ/BL3T8Sn/0iOxvTIgZalVDJRh2iw== +"@polywrap/datetime-plugin-js@~0.12.0-pre.0": + version "0.12.0-pre.0" + resolved "https://registry.yarnpkg.com/@polywrap/datetime-plugin-js/-/datetime-plugin-js-0.12.0-pre.0.tgz#72fa082e6485e1fc259c48fe89a351d69272ae0b" + integrity sha512-BKE5gZlL8LlVl9WSodkdFnIBSkKM4QSxYdTR5JhpMOPiStHFLqsZWQPCpgtRtTy+pyK/rdXxfKihoL5P9ee6oQ== dependencies: - "@ethersproject/address" "5.7.0" - "@ethersproject/providers" "5.7.0" - "@polywrap/core-js" "0.10.0-pre.10" - "@polywrap/plugin-js" "0.10.0-pre.10" - ethers "5.7.0" + "@polywrap/core-js" "~0.12.0-pre.0" + "@polywrap/plugin-js" "~0.12.0-pre.0" -"@polywrap/ethereum-provider-js@0.3.1", "@polywrap/ethereum-provider-js@npm:@polywrap/ethereum-provider-js@~0.3.1": +"@polywrap/ethereum-provider-js@0.3.1": version "0.3.1" resolved "https://registry.yarnpkg.com/@polywrap/ethereum-provider-js/-/ethereum-provider-js-0.3.1.tgz#ffdb9425c819ee76d3e3d5ade7d1b044077037e0" integrity sha512-El2d3gE2CFdGNzKQhO+IPP79lhyQmkAGlpQadaW/EDyFDjERLckYDLPrwUCXG0agUcQZcNY1nHn2hknumw/yWg== @@ -2269,31 +2240,42 @@ "@polywrap/plugin-js" "0.10.0" ethers "5.7.0" -"@polywrap/file-system-plugin-js@~0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@polywrap/file-system-plugin-js/-/file-system-plugin-js-0.10.0.tgz#7814e0b1c0bb170ab85500f67aca6af4c17ec19f" - integrity sha512-QWDpeVBACeK8PqZUwby/zlozG/07fpvJN5kQtw5e7ha4K5blX1j1i6ixgLKlYyQsaaTBxS6aAF3C0ryt4BsJcQ== +"@polywrap/ethereum-wallet-js@~0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@polywrap/ethereum-wallet-js/-/ethereum-wallet-js-0.1.0.tgz#1af5800aab3c4cedfcd1e4e5e305d5d5ef733bea" + integrity sha512-GTg4X0gyFHXNAHSDxe6QfiWJv8z/pwobnVyKw4rcmBLw7tqcTiYXk4kU0QfWV3JLV/8rvzESl+FtXPC68dUMIA== dependencies: - "@polywrap/core-js" "0.10.0" - "@polywrap/plugin-js" "0.10.0" + "@ethersproject/address" "5.7.0" + "@ethersproject/providers" "5.7.0" + "@polywrap/core-js" "~0.12.0-pre.0" + "@polywrap/plugin-js" "~0.12.0-pre.0" + ethers "5.7.0" -"@polywrap/http-plugin-js@~0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@polywrap/http-plugin-js/-/http-plugin-js-0.10.0.tgz#930ec9dbaa762b71d8905ad02a77d5d574707642" - integrity sha512-t/yvoOAGUwsuS37ZQkkBZOogNbeJadtHwitMMA6XGs1jDANP1Xim/xWXWBYC3W1YJ8pbUeO8bHZHTBaJ7SC0cA== +"@polywrap/file-system-plugin-js@~0.12.0-pre.0": + version "0.12.0-pre.0" + resolved "https://registry.yarnpkg.com/@polywrap/file-system-plugin-js/-/file-system-plugin-js-0.12.0-pre.0.tgz#ca6395d36c65b9a185f63233ce31c82578b9dc81" + integrity sha512-qu1lLoZQhf8tSz9844tjI6d1ndyjrXpQ+P4ZPIKGtPFVnUOLwtVJCfE9eQtY4MAMz/yRBJ9saWEuaoZHI7zUXg== dependencies: - "@polywrap/core-js" "0.10.0" - "@polywrap/plugin-js" "0.10.0" + "@polywrap/core-js" "~0.12.0-pre.0" + "@polywrap/plugin-js" "~0.12.0-pre.0" + +"@polywrap/http-plugin-js@~0.12.0-pre.0": + version "0.12.0-pre.0" + resolved "https://registry.yarnpkg.com/@polywrap/http-plugin-js/-/http-plugin-js-0.12.0-pre.0.tgz#7e276c5ffd62500b0736444bd95862b133e809b9" + integrity sha512-kB6gwMliDjaoKMIWSetLBusV8QXiAwFbw6dDhiTKhIBkVFSWRdRWLbA2VY3apnSeXkrbwfTX6iIgxS9D8LoOrw== + dependencies: + "@polywrap/core-js" "~0.12.0-pre.0" + "@polywrap/plugin-js" "~0.12.0-pre.0" axios "0.21.4" form-data "4.0.0" -"@polywrap/logger-plugin-js@~0.10.0": - version "0.10.1" - resolved "https://registry.yarnpkg.com/@polywrap/logger-plugin-js/-/logger-plugin-js-0.10.1.tgz#220cc248cb1381aa46c1f773ed8ce77da420280c" - integrity sha512-ipqS7A6Mc0Fp0e/qg8RyGIulfk6mGS9acKii3kQoJ59/Zf/Yy4Eg3HWDtnlgBIdIgwyZKD8amiF42VKRO6R3Ig== +"@polywrap/logger-plugin-js@~0.12.0-pre.0": + version "0.12.0-pre.0" + resolved "https://registry.yarnpkg.com/@polywrap/logger-plugin-js/-/logger-plugin-js-0.12.0-pre.0.tgz#ebc6f6f7a80bcbe8f24608303e1c4d63e9f157cf" + integrity sha512-aY3R07nK2svxiBxkJstHHfDak/Gin/23iCDFce4qWISEvsMPA0krte7Ll2VAsAAEBuwX1y1fACQ/xk01xLxmGg== dependencies: - "@polywrap/core-js" "0.10.0" - "@polywrap/plugin-js" "0.10.0" + "@polywrap/core-js" "~0.12.0-pre.0" + "@polywrap/plugin-js" "~0.12.0-pre.0" "@polywrap/msgpack-js@0.10.0": version "0.10.0" @@ -2302,24 +2284,10 @@ dependencies: "@msgpack/msgpack" "2.7.2" -"@polywrap/msgpack-js@0.10.0-pre.10": - version "0.10.0-pre.10" - resolved "https://registry.yarnpkg.com/@polywrap/msgpack-js/-/msgpack-js-0.10.0-pre.10.tgz#ac15d960dba2912f7ed657634f873e3c22c71843" - integrity sha512-z+lMVYKIYRyDrRDW5jFxt8Q6rVXBfMohI48Ht79X9DU1g6FdJInxhgXwVnUUQfrgtVoSgDLChdFlqnpi2JkEaQ== - dependencies: - "@msgpack/msgpack" "2.7.2" - -"@polywrap/msgpack-js@0.10.1": - version "0.10.1" - resolved "https://registry.yarnpkg.com/@polywrap/msgpack-js/-/msgpack-js-0.10.1.tgz#c3552eb51373164a78abfa80b52d9b02798ffd95" - integrity sha512-EI4Vak4Yi6NqM71eChWc3APe2svoR6BEeCVsxGAGI6p6x04r27J6+C3o1ptwHxiwyy8+J7B5W+ynaVo8qn5Zrw== - dependencies: - "@msgpack/msgpack" "2.7.2" - -"@polywrap/msgpack-js@0.12.0-pre.1": - version "0.12.0-pre.1" - resolved "https://registry.yarnpkg.com/@polywrap/msgpack-js/-/msgpack-js-0.12.0-pre.1.tgz#e87f6951a5a1ba98c07dc534bec695f46880a38e" - integrity sha512-/ea7M1hUC3+SJIdcvrfmrM/w8DVnRScok1Xdkkv20CTUDP/sDElSssB+DTtzAv/UCjhpiHzi4MRlA/AcjR1ODw== +"@polywrap/msgpack-js@0.12.0", "@polywrap/msgpack-js@~0.12.0-pre.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@polywrap/msgpack-js/-/msgpack-js-0.12.0.tgz#87dc9fc83c1e8cbe889cca2f6c992141f6324c8f" + integrity sha512-7XVT5jqPkdgiN9Ql1quvkXf6lWxMPWeyEAaMPhrxRb45l5z9E8wFgarvUSRQ3htG1WpAvG5FdXY3/STqvCKXuw== dependencies: "@msgpack/msgpack" "2.7.2" @@ -2334,71 +2302,39 @@ "@polywrap/tracing-js" "0.10.0" "@polywrap/wrap-manifest-types-js" "0.10.0" -"@polywrap/plugin-js@0.10.0-pre.10": - version "0.10.0-pre.10" - resolved "https://registry.yarnpkg.com/@polywrap/plugin-js/-/plugin-js-0.10.0-pre.10.tgz#090c1963f40ab862a09deda8c18e6d522fd2e3f2" - integrity sha512-J/OEGEdalP83MnO4bBTeqC7eX+NBMQq6TxmUf68iNIydl8fgN7MNB7+koOTKdkTtNzrwXOnhavHecdSRZxuhDA== - dependencies: - "@polywrap/core-js" "0.10.0-pre.10" - "@polywrap/msgpack-js" "0.10.0-pre.10" - "@polywrap/result" "0.10.0-pre.10" - "@polywrap/tracing-js" "0.10.0-pre.10" - "@polywrap/wrap-manifest-types-js" "0.10.0-pre.10" - -"@polywrap/plugin-js@0.12.0-pre.1", "@polywrap/plugin-js@~0.12.0-pre.1": - version "0.12.0-pre.1" - resolved "https://registry.yarnpkg.com/@polywrap/plugin-js/-/plugin-js-0.12.0-pre.1.tgz#86865f63545086b47ebfbd546ed18ab0ce146752" - integrity sha512-juHMEUsuoY/ZpbsVWZ9puMkX83PcCeT/hKKWxVl+CfmoWpmFiatorgdS3kMgr/O19+o/b6eyd/sqKyWSxmVdQw== - dependencies: - "@polywrap/core-js" "0.12.0-pre.1" - "@polywrap/msgpack-js" "0.12.0-pre.1" - "@polywrap/result" "0.12.0-pre.1" - "@polywrap/tracing-js" "0.12.0-pre.1" - "@polywrap/wrap-manifest-types-js" "0.12.0-pre.1" - -"@polywrap/plugin-js@~0.10.1": - version "0.10.1" - resolved "https://registry.yarnpkg.com/@polywrap/plugin-js/-/plugin-js-0.10.1.tgz#e11ce19dde01245750c297a62f2f75fd58ef9ced" - integrity sha512-WBk4ZUrI5m6FG4bIocLHo7XS+QMeNa23odli6Ss6onUyo7mPIo1wlceEgw7Cu4gd/3bmuc6VGoCKRA1/glBT3g== - dependencies: - "@polywrap/core-js" "0.10.1" - "@polywrap/msgpack-js" "0.10.1" - "@polywrap/result" "0.10.1" - "@polywrap/tracing-js" "0.10.1" - "@polywrap/wrap-manifest-types-js" "0.10.1" +"@polywrap/plugin-js@0.12.0", "@polywrap/plugin-js@~0.12.0", "@polywrap/plugin-js@~0.12.0-pre.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@polywrap/plugin-js/-/plugin-js-0.12.0.tgz#90482acaaec4547aaaea6f9acc3d18adf69751ac" + integrity sha512-ly8bvdJGgQVAXuGuHRJPzdtmUVRpjK1amVwZvzcD4Oaz6mr65l9VtYN79DQK9UXhIZ7hYpxtSBeLFKXZ4hmbOg== + dependencies: + "@polywrap/core-js" "0.12.0" + "@polywrap/msgpack-js" "0.12.0" + "@polywrap/result" "0.12.0" + "@polywrap/tracing-js" "0.12.0" + "@polywrap/wrap-manifest-types-js" "0.12.0" "@polywrap/result@0.10.0": version "0.10.0" resolved "https://registry.yarnpkg.com/@polywrap/result/-/result-0.10.0.tgz#712339223fba524dfabfb0bf868411f357d52e34" integrity sha512-IxTBfGP89/OPNlUPMkjOrdYt/hwyvgI7TsYap6S35MHo4pXkR9mskzrHJ/AGE5DyGqP81CIIJNSYfooF97KY3A== -"@polywrap/result@0.10.0-pre.10": - version "0.10.0-pre.10" - resolved "https://registry.yarnpkg.com/@polywrap/result/-/result-0.10.0-pre.10.tgz#6e88ac447d92d8a10c7e7892a6371af29a072240" - integrity sha512-SqNnEbXky4dFXgps2B2juFShq1024do0f1HLUbuj3MlIPp5aW9g9sfBslsy3YTnpg2QW7LFVT15crrJMgbowIQ== - -"@polywrap/result@0.10.1": - version "0.10.1" - resolved "https://registry.yarnpkg.com/@polywrap/result/-/result-0.10.1.tgz#e60122396521fc07edda6951915ada4aaa5f6694" - integrity sha512-9EoS/JUgKFwRk396lQ+3tDAGbZExsOf26SUG4l41HJv4FZLLLOL5ksppJK8StvjtbpQOIgFls23c83CXzS1hBQ== - -"@polywrap/result@0.12.0-pre.1": - version "0.12.0-pre.1" - resolved "https://registry.yarnpkg.com/@polywrap/result/-/result-0.12.0-pre.1.tgz#5b5ea8b4e3b0be65ee27e66050acd3f0fb6096c0" - integrity sha512-OgBmuuwCcQ8zCX+FbG01RQ402xfnwarHR7zoc9+7EXhd+jd0BdbUCg026bK43VjRZT5cQPbh0XWh5YzK1ozkGA== - -"@polywrap/sys-config-bundle-js@0.12.0-pre.1": - version "0.12.0-pre.1" - resolved "https://registry.yarnpkg.com/@polywrap/sys-config-bundle-js/-/sys-config-bundle-js-0.12.0-pre.1.tgz#7487c5e5d181aa4140ab8d7015fcb0779a4af9f8" - integrity sha512-upyi2kwIr4/sL6bPL/ECqJpisaSFtIm5wwwl8PoUE5Ib+T/O2WUZxc4A3JNczV0Y1UnqPh6cTbfDH8qXqviAdQ== - dependencies: - "@polywrap/concurrent-plugin-js" "~0.10.0" - "@polywrap/config-bundle-types-js" "0.12.0-pre.1" - "@polywrap/datetime-plugin-js" "~0.10.0" - "@polywrap/file-system-plugin-js" "~0.10.0" - "@polywrap/http-plugin-js" "~0.10.0" - "@polywrap/logger-plugin-js" "~0.10.0" - "@polywrap/uri-resolver-extensions-js" "0.12.0-pre.1" +"@polywrap/result@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@polywrap/result/-/result-0.12.0.tgz#8cd72fa989098848b56316dfd7ed428831c5b540" + integrity sha512-CdZa21Pa+D9HdxoPwaUoLSlxbBppGiaoldnH4GfbeE/iWOCHQ2qnsVecV+jcQdM9Ih/o+Hpl7cqT5VzV9LEzsA== + +"@polywrap/sys-config-bundle-js@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@polywrap/sys-config-bundle-js/-/sys-config-bundle-js-0.12.0.tgz#e65efc5b3a080b7e01ed0131882456dbb3439d24" + integrity sha512-6qsH3rgXyfBDE/1xFK1bKwwnqjz3CJvlpr3SHLCm+Y+wS9hVtr0L/t/XdCrlS+gWblU8/GpkpI100RUJJRpPlQ== + dependencies: + "@polywrap/concurrent-plugin-js" "~0.12.0-pre.0" + "@polywrap/config-bundle-types-js" "0.12.0" + "@polywrap/datetime-plugin-js" "~0.12.0-pre.0" + "@polywrap/file-system-plugin-js" "~0.12.0-pre.0" + "@polywrap/http-plugin-js" "~0.12.0-pre.0" + "@polywrap/logger-plugin-js" "~0.12.0-pre.0" + "@polywrap/uri-resolver-extensions-js" "0.12.0" base64-to-uint8array "1.0.0" "@polywrap/tracing-js@0.10.0": @@ -2413,10 +2349,10 @@ "@opentelemetry/sdk-trace-base" "1.6.0" "@opentelemetry/sdk-trace-web" "1.6.0" -"@polywrap/tracing-js@0.10.0-pre.10": - version "0.10.0-pre.10" - resolved "https://registry.yarnpkg.com/@polywrap/tracing-js/-/tracing-js-0.10.0-pre.10.tgz#f50fb01883dcba4217a1711718aa53f3dd61cb1c" - integrity sha512-6wFw/zANVPG0tWMTSxwDzIpABVSSR9wO4/XxhCnKKgXwW6YANhtLj86uSRMTWqXeX2rpHwpMoWh4MDgYeAf+ng== +"@polywrap/tracing-js@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@polywrap/tracing-js/-/tracing-js-0.12.0.tgz#750238d92f6f29a4e8fc7e1b08cb27c7150c3279" + integrity sha512-wtvhBisczaMf4SAqIpmQlWjkaZmy+psZtRyVf3EDNmnn6gVfXEEqz/+Ewo+HfmBjDhLg7QC/x9XDo/eRgwHrcA== dependencies: "@fetsorn/opentelemetry-console-exporter" "0.0.3" "@opentelemetry/api" "1.2.0" @@ -2425,73 +2361,48 @@ "@opentelemetry/sdk-trace-base" "1.6.0" "@opentelemetry/sdk-trace-web" "1.6.0" -"@polywrap/tracing-js@0.10.1": - version "0.10.1" - resolved "https://registry.yarnpkg.com/@polywrap/tracing-js/-/tracing-js-0.10.1.tgz#488dd505f3c5232cb292e848de7a182c83a4405a" - integrity sha512-4ZjPgNBFbX4DIzqRbzyMq64FvYv51JLuFIxL0EweI5paEbR69a1m4iN4BLxJc+jBjDYpWgy399+tYGnc94aM6A== +"@polywrap/uri-resolver-extensions-js@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@polywrap/uri-resolver-extensions-js/-/uri-resolver-extensions-js-0.12.0.tgz#5819a447ae780e4f1092e613bc709741ef9c25e4" + integrity sha512-EE/JaVAH5Zt521kuCMGMRgdrHUlFqTk6f85e0UJo+DX6PcerJVj/KrfHQUKt/rM9SVD4mQaQA53k7/3DJhFnaw== dependencies: - "@fetsorn/opentelemetry-console-exporter" "0.0.3" - "@opentelemetry/api" "1.2.0" - "@opentelemetry/exporter-trace-otlp-http" "0.32.0" - "@opentelemetry/resources" "1.6.0" - "@opentelemetry/sdk-trace-base" "1.6.0" - "@opentelemetry/sdk-trace-web" "1.6.0" + "@polywrap/core-js" "0.12.0" + "@polywrap/result" "0.12.0" + "@polywrap/uri-resolvers-js" "0.12.0" + "@polywrap/wasm-js" "0.12.0" + "@polywrap/wrap-manifest-types-js" "0.12.0" -"@polywrap/tracing-js@0.12.0-pre.1": - version "0.12.0-pre.1" - resolved "https://registry.yarnpkg.com/@polywrap/tracing-js/-/tracing-js-0.12.0-pre.1.tgz#53794c111a42fca5921e3ac1bade7acbe025140d" - integrity sha512-TbLJisZujA9XbSPAvBrC0iTsJiqC1DDF3BKIP1m9d6Bs4KX4zS2UhZzQAJZFKaAo/acoUW9NgXd6O8PtixZmGw== +"@polywrap/uri-resolvers-js@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@polywrap/uri-resolvers-js/-/uri-resolvers-js-0.12.0.tgz#2a62a3af134cc091d69c4344f5e151830377b275" + integrity sha512-s1FoSjpmPpycmHYEYFQeZPE/JPh2cvq4ALHmMw/CBgd/6ornmzYc2XQE28zeF1sNBglmZIhB10MEkT7A0J8PDw== dependencies: - "@fetsorn/opentelemetry-console-exporter" "0.0.3" - "@opentelemetry/api" "1.2.0" - "@opentelemetry/exporter-trace-otlp-http" "0.32.0" - "@opentelemetry/resources" "1.6.0" - "@opentelemetry/sdk-trace-base" "1.6.0" - "@opentelemetry/sdk-trace-web" "1.6.0" + "@polywrap/core-js" "0.12.0" + "@polywrap/result" "0.12.0" + "@polywrap/wrap-manifest-types-js" "0.12.0" -"@polywrap/uri-resolver-extensions-js@0.12.0-pre.1": - version "0.12.0-pre.1" - resolved "https://registry.yarnpkg.com/@polywrap/uri-resolver-extensions-js/-/uri-resolver-extensions-js-0.12.0-pre.1.tgz#d62ab34b859a74924a139e94a22b30a6b09759af" - integrity sha512-sRT7I7RYkijQpuD+0+gDsUTJsVSL9M9caowfFOPkDhHuTcoIct/Fte/hAD5ncDChSUc84MZgHZPWcQxOz12zzg== - dependencies: - "@polywrap/core-js" "0.12.0-pre.1" - "@polywrap/result" "0.12.0-pre.1" - "@polywrap/uri-resolvers-js" "0.12.0-pre.1" - "@polywrap/wasm-js" "0.12.0-pre.1" - "@polywrap/wrap-manifest-types-js" "0.12.0-pre.1" - -"@polywrap/uri-resolvers-js@0.12.0-pre.1": - version "0.12.0-pre.1" - resolved "https://registry.yarnpkg.com/@polywrap/uri-resolvers-js/-/uri-resolvers-js-0.12.0-pre.1.tgz#58b6238cde9380dbb302e3a0c00f7a493a679765" - integrity sha512-tVqTWRS4rtlq3JKQHyOPqE2lql/qCWT+cy7IYT/VN/jaD6nHLMI+tWwp9spDlibotOn/6Bwtk+v6HOPS6SkiOg== - dependencies: - "@polywrap/core-js" "0.12.0-pre.1" - "@polywrap/result" "0.12.0-pre.1" - "@polywrap/wrap-manifest-types-js" "0.12.0-pre.1" - -"@polywrap/wasm-js@0.12.0-pre.1": - version "0.12.0-pre.1" - resolved "https://registry.yarnpkg.com/@polywrap/wasm-js/-/wasm-js-0.12.0-pre.1.tgz#d1641b12692f7d90dc16c8687b6a8e2f70153124" - integrity sha512-ItIJnvz9DuCifaiYy+ZQiTXU5gotUUcSA/BmO+joe1b96c5b1n7gbiU3eqaYWPDpzNxo417/Utwr8RHtZ4248Q== - dependencies: - "@polywrap/asyncify-js" "0.12.0-pre.1" - "@polywrap/core-js" "0.12.0-pre.1" - "@polywrap/msgpack-js" "0.12.0-pre.1" - "@polywrap/result" "0.12.0-pre.1" - "@polywrap/tracing-js" "0.12.0-pre.1" - "@polywrap/wrap-manifest-types-js" "0.12.0-pre.1" - -"@polywrap/web3-config-bundle-js@0.12.0-pre.1": - version "0.12.0-pre.1" - resolved "https://registry.yarnpkg.com/@polywrap/web3-config-bundle-js/-/web3-config-bundle-js-0.12.0-pre.1.tgz#477a64fa4912f5ac5edb94037315e0f6cdaa92d7" - integrity sha512-L+yZBfooyGgOLdoNcMiEHexpNf+3OnxzVpFlHtR9JdHJmOv4VxqI0LFuVoBDCBwv6m/zxzSYw9C/v8LzIPQLgA== - dependencies: - "@polywrap/config-bundle-types-js" "0.12.0-pre.1" - "@polywrap/ethereum-provider-js" "npm:@polywrap/ethereum-provider-js@~0.3.1" - "@polywrap/ethereum-provider-js-v1" "npm:@polywrap/ethereum-provider-js@~0.2.4" - "@polywrap/sys-config-bundle-js" "0.12.0-pre.1" - "@polywrap/uri-resolver-extensions-js" "0.12.0-pre.1" - "@polywrap/wasm-js" "0.12.0-pre.1" +"@polywrap/wasm-js@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@polywrap/wasm-js/-/wasm-js-0.12.0.tgz#e65320428976fb21eca16f0a499afb3fb12d86f6" + integrity sha512-NLu8AGewxSOq3Wv8eLgWn6y0TMho4nn3E5WFbE1ePgoPm6pm3FalVOrBJi04mUv1INm2Ty/VJTfQrzNVjIKJdQ== + dependencies: + "@polywrap/asyncify-js" "0.12.0" + "@polywrap/core-js" "0.12.0" + "@polywrap/msgpack-js" "0.12.0" + "@polywrap/result" "0.12.0" + "@polywrap/tracing-js" "0.12.0" + "@polywrap/wrap-manifest-types-js" "0.12.0" + +"@polywrap/web3-config-bundle-js@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@polywrap/web3-config-bundle-js/-/web3-config-bundle-js-0.12.0.tgz#e9e2002ca05c913b8ed8a8b1750057b9bc478ec1" + integrity sha512-srhHT+xG4+2EbKmER26RNNJJmoy4LNsYbFRtUOXbjkG9rXRFxNA5gWs2p9ZMozyBGac0X+RQySU6DR5PvqnsGg== + dependencies: + "@polywrap/config-bundle-types-js" "0.12.0" + "@polywrap/ethereum-wallet-js" "~0.1.0" + "@polywrap/sys-config-bundle-js" "0.12.0" + "@polywrap/uri-resolver-extensions-js" "0.12.0" + "@polywrap/wasm-js" "0.12.0" base64-to-uint8array "1.0.0" "@polywrap/wrap-manifest-types-js@0.10.0": @@ -2503,31 +2414,12 @@ jsonschema "1.4.0" semver "7.4.0" -"@polywrap/wrap-manifest-types-js@0.10.0-pre.10": - version "0.10.0-pre.10" - resolved "https://registry.yarnpkg.com/@polywrap/wrap-manifest-types-js/-/wrap-manifest-types-js-0.10.0-pre.10.tgz#81b339f073c48880b34f06f151aa41373f442f88" - integrity sha512-Hgsa6nJIh0cCqKO14ufjAsN0WEKuLuvFBfBycjoRLfkwD3fcxP/xrvWgE2NRSvwQ77aV6PGMbhlSMDGI5jahrw== - dependencies: - "@apidevtools/json-schema-ref-parser" "9.0.9" - jsonschema "1.4.0" - semver "7.3.8" - -"@polywrap/wrap-manifest-types-js@0.10.1": - version "0.10.1" - resolved "https://registry.yarnpkg.com/@polywrap/wrap-manifest-types-js/-/wrap-manifest-types-js-0.10.1.tgz#df7099357af2ccdbb61a6fb42ebaa047c6d97d70" - integrity sha512-0UxTZY6AcQpEkeL9HMMZvHv5a0OXXSRr4clPVyyo7BAmUjwJRE0veKY2hy0bR0Je7rZjxlwR5uS9+CToqYAd9g== - dependencies: - "@apidevtools/json-schema-ref-parser" "9.0.9" - "@polywrap/msgpack-js" "0.10.1" - jsonschema "1.4.0" - semver "7.5.0" - -"@polywrap/wrap-manifest-types-js@0.12.0-pre.1": - version "0.12.0-pre.1" - resolved "https://registry.yarnpkg.com/@polywrap/wrap-manifest-types-js/-/wrap-manifest-types-js-0.12.0-pre.1.tgz#81ea326c2ccebf3761425a44fda26b171fad4409" - integrity sha512-BdM1QrSb2gEbFqeMyh1UPa1zUdilwkNyMr5A8Pfw1nYv93W9/UK8O2IYXeh1WUWAnsPSgjNbtM0bbdXMqqDyHQ== +"@polywrap/wrap-manifest-types-js@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@polywrap/wrap-manifest-types-js/-/wrap-manifest-types-js-0.12.0.tgz#5ca209cdcad2f35e2064aa6b8174c2fbbc9fbcbc" + integrity sha512-s5CZ/UNihiQ+zgC8tuJgBBiiAg/5iAE8vjnqq8993nSJ8XtoO9t6NO93ANXUFirPxNtrCK2qQzbrt/HygtdCuA== dependencies: - "@polywrap/msgpack-js" "0.12.0-pre.1" + "@polywrap/msgpack-js" "0.12.0" ajv "8.12.0" semver "7.5.0" @@ -2735,9 +2627,9 @@ integrity sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw== "@types/lodash@^4.14.182": - version "4.14.195" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.195.tgz#bafc975b252eb6cea78882ce8a7b6bf22a6de632" - integrity sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg== + version "4.14.196" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.196.tgz#a7c3d6fc52d8d71328b764e28e080b4169ec7a95" + integrity sha512-22y3o88f4a94mKljsZcanlNWPzO0uBsBdzLAngf2tp533LzZcQzb6+eZPJ+vCTt+bqF2XnvT9gejTLsAcJAJyQ== "@types/minimatch@*", "@types/minimatch@^5.1.2": version "5.1.2" @@ -3232,6 +3124,18 @@ array.prototype.reduce@^1.0.5: es-array-method-boxes-properly "^1.0.0" is-string "^1.0.7" +arraybuffer.prototype.slice@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz#9b5ea3868a6eebc30273da577eb888381c0044bb" + integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" + arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -3661,9 +3565,9 @@ camelcase@^6.0.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001503: - version "1.0.30001515" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001515.tgz#418aefeed9d024cd3129bfae0ccc782d4cb8f12b" - integrity sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA== + version "1.0.30001517" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz#90fabae294215c3495807eb24fc809e11dc2f0a8" + integrity sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA== capture-exit@^2.0.0: version "2.0.0" @@ -4438,9 +4342,9 @@ ecc-jsbn@~0.1.1: safer-buffer "^2.1.0" electron-to-chromium@^1.4.431: - version "1.4.460" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.460.tgz#f360a5059c039c4a5fb4dfa99680ad8129dd9f84" - integrity sha512-kKiHnbrHME7z8E6AYaw0ehyxY5+hdaRmeUbjBO22LZMdqTYCO29EvF0T1cQ3pJ1RN5fyMcHl1Lmcsdt9WWJpJQ== + version "1.4.471" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.471.tgz#14cb056d0ce4bfa99df57946d57fe46c2330dac3" + integrity sha512-GpmGRC1vTl60w/k6YpQ18pSiqnmr0j3un//5TV1idPi6aheNfkT1Ye71tMEabWyNDO6sBMgAR+95Eb0eUUr1tA== elliptic@6.5.4: version "6.5.4" @@ -4485,11 +4389,12 @@ end-of-stream@^1.1.0: once "^1.4.0" enquirer@^2.3.5: - version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + version "2.4.0" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.0.tgz#4f36f6c644137cc4fd2891da407ede2b1fea904a" + integrity sha512-ehu97t6FTYK2I3ZYtnp0BZ9vt0mvEL/cnHBds7Ct6jo9VX1VIkiFhOvVRWh6eblQqd7KOoICIQV+syZ3neXO/Q== dependencies: ansi-colors "^4.1.1" + strip-ansi "^6.0.1" env-paths@^2.2.0: version "2.2.1" @@ -4514,11 +4419,12 @@ error-ex@^1.2.0, error-ex@^1.3.1: is-arrayish "^0.2.1" es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: - version "1.21.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.3.tgz#8aaa0ffc080e8a6fef6ace72631dc1ec5d47bf94" - integrity sha512-ZU4miiY1j3sGPFLJ34VJXEqhpmL+HGByCinGHv4HC+Fxl2fI2Z4yR6tl0mORnDr6PA8eihWo4LmSWDbvhALckg== + version "1.22.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" + integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== dependencies: array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.1" available-typed-arrays "^1.0.5" call-bind "^1.0.2" es-set-tostringtag "^2.0.1" @@ -4545,10 +4451,13 @@ es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: object-keys "^1.1.1" object.assign "^4.1.4" regexp.prototype.flags "^1.5.0" + safe-array-concat "^1.0.0" safe-regex-test "^1.0.0" string.prototype.trim "^1.2.7" string.prototype.trimend "^1.0.6" string.prototype.trimstart "^1.0.6" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" typed-array-byte-offset "^1.0.0" typed-array-length "^1.0.4" unbox-primitive "^1.0.2" @@ -5034,9 +4943,9 @@ fast-diff@^1.1.2: integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== fast-glob@^3.2.5, fast-glob@^3.2.9: - version "3.3.0" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.0.tgz#7c40cb491e1e2ed5664749e87bfb516dbe8727c0" - integrity sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA== + version "3.3.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -6158,15 +6067,11 @@ is-text-path@^1.0.1: text-extensions "^1.0.0" is-typed-array@^1.1.10, is-typed-array@^1.1.9: - version "1.1.10" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" - integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" + which-typed-array "^1.1.11" is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" @@ -6263,12 +6168,12 @@ istanbul-lib-instrument@^5.0.4: semver "^6.3.0" istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== dependencies: istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" + make-dir "^4.0.0" supports-color "^7.1.0" istanbul-lib-source-maps@^4.0.0: @@ -6281,9 +6186,9 @@ istanbul-lib-source-maps@^4.0.0: source-map "^0.6.1" istanbul-reports@^3.0.2: - version "3.1.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" - integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== + version "3.1.6" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a" + integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" @@ -7103,6 +7008,13 @@ make-dir@^3.0.0: dependencies: semver "^6.0.0" +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + make-error@1.x, make-error@^1.1.1: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" @@ -8867,13 +8779,6 @@ scrypt-js@3.0.1: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@7.3.8: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.0" - semver@7.4.0: version "7.4.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.4.0.tgz#8481c92feffc531ab1e012a8ffc15bdd3a0f4318" @@ -8895,7 +8800,7 @@ semver@7.5.3: dependencies: lru-cache "^6.0.0" -semver@7.x, semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: +semver@7.x, semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.5.3: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== @@ -9662,9 +9567,9 @@ tslib@^1.8.1, tslib@^1.9.0: integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.1.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.0.tgz#b295854684dbda164e181d259a22cd779dcd7bc3" - integrity sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA== + version "2.6.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.1.tgz#fd8c9a0ff42590b25703c0acb3de3d3f4ede0410" + integrity sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig== tsutils@^3.17.1: version "3.21.0" @@ -9732,6 +9637,25 @@ type@^2.7.2: resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + typed-array-byte-offset@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" @@ -10091,17 +10015,16 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.10: - version "1.1.10" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.10.tgz#74baa2789991905c2076abb317103b866c64e69e" - integrity sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA== +which-typed-array@^1.1.10, which-typed-array@^1.1.11: + version "1.1.11" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" + integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== dependencies: available-typed-arrays "^1.0.5" call-bind "^1.0.2" for-each "^0.3.3" gopd "^1.0.1" has-tostringtag "^1.0.0" - is-typed-array "^1.1.10" which@^1.2.9, which@^1.3.1: version "1.3.1" From bd98bbd7a02df787de93a2633153508c86b26f2e Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Wed, 26 Jul 2023 22:12:03 +0200 Subject: [PATCH 170/181] chore: remove ethereum-provider --- packages/cli/package.json | 2 +- .../ens-recursive-name-register/index.ts | 8 +-- .../lib/defaults/deploy-modules/ens/index.ts | 8 +-- .../cli/src/lib/test-env/client-config.ts | 6 +- scripts/patch-peer-deps.ts | 3 +- yarn.lock | 64 ------------------- 6 files changed, 13 insertions(+), 78 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 6c3fc17377..1015854d74 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -47,7 +47,7 @@ "@polywrap/client-config-builder-js": "0.12.0", "@polywrap/client-js": "0.12.0", "@polywrap/core-js": "0.12.0", - "@polywrap/ethereum-provider-js": "0.3.1", + "@polywrap/ethereum-wallet-js": "~0.1.0", "@polywrap/logging-js": "0.11.0-pre.4", "@polywrap/os-js": "0.11.0-pre.4", "@polywrap/polywrap-manifest-types-js": "0.11.0-pre.4", diff --git a/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/index.ts b/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/index.ts index 666bf4088f..5fe609c689 100644 --- a/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/index.ts +++ b/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/index.ts @@ -14,8 +14,8 @@ import * as Web3 from "@polywrap/web3-config-bundle-js"; import { Connection, Connections, - ethereumProviderPlugin, -} from "@polywrap/ethereum-provider-js"; + ethereumWalletPlugin, +} from "@polywrap/ethereum-wallet-js"; class ENSRecursiveNameRegisterPublisher implements DeployModule { async execute( @@ -68,8 +68,8 @@ class ENSRecursiveNameRegisterPublisher implements DeployModule { const clientConfig = new PolywrapClientConfigBuilder() .addDefaults() .setPackage( - Web3.bundle.ethereumProviderV2.uri, - ethereumProviderPlugin({ + Web3.bundle.ethereumWallet.uri, + ethereumWalletPlugin({ connections: connections, }) as IWrapPackage ) diff --git a/packages/cli/src/lib/defaults/deploy-modules/ens/index.ts b/packages/cli/src/lib/defaults/deploy-modules/ens/index.ts index 9090b31cbf..1e8cc7416c 100644 --- a/packages/cli/src/lib/defaults/deploy-modules/ens/index.ts +++ b/packages/cli/src/lib/defaults/deploy-modules/ens/index.ts @@ -14,8 +14,8 @@ import * as Web3 from "@polywrap/web3-config-bundle-js"; import { Connection, Connections, - ethereumProviderPlugin, -} from "@polywrap/ethereum-provider-js"; + ethereumWalletPlugin, +} from "@polywrap/ethereum-wallet-js"; const contentHash = require("content-hash"); @@ -65,8 +65,8 @@ class ENSPublisher implements DeployModule { const clientConfig = new PolywrapClientConfigBuilder() .addDefaults() .setPackage( - Web3.bundle.ethereumProviderV2.uri, - ethereumProviderPlugin({ + Web3.bundle.ethereumWallet.uri, + ethereumWalletPlugin({ connections: connections, }) as IWrapPackage ) diff --git a/packages/cli/src/lib/test-env/client-config.ts b/packages/cli/src/lib/test-env/client-config.ts index 47ea1ad141..a6fe391beb 100644 --- a/packages/cli/src/lib/test-env/client-config.ts +++ b/packages/cli/src/lib/test-env/client-config.ts @@ -9,10 +9,10 @@ import * as Web3 from "@polywrap/web3-config-bundle-js"; import * as Sys from "@polywrap/sys-config-bundle-js"; import { ExtendableUriResolver } from "@polywrap/uri-resolver-extensions-js"; import { - ethereumProviderPlugin, + ethereumWalletPlugin, Connections, Connection, -} from "@polywrap/ethereum-provider-js"; +} from "@polywrap/ethereum-wallet-js"; import { IWrapPackage } from "@polywrap/core-js"; export function getTestEnvClientConfig(): Partial { @@ -44,7 +44,7 @@ export function getTestEnvClientConfig(): Partial { "ens/wraps.eth:ens-uri-resolver-ext@1.0.1", }) .setPackages({ - [Web3.bundle.ethereumProviderV2.uri]: ethereumProviderPlugin({ + [Web3.bundle.ethereumWallet.uri]: ethereumWalletPlugin({ connections: new Connections({ networks: { testnet: new Connection({ diff --git a/scripts/patch-peer-deps.ts b/scripts/patch-peer-deps.ts index 7e8538c8b1..b9d386e7bf 100644 --- a/scripts/patch-peer-deps.ts +++ b/scripts/patch-peer-deps.ts @@ -3,8 +3,7 @@ import path from "path"; const packagesToPatch = [ "@polywrap/concurrent-plugin-js", - "@polywrap/ethereum-provider-js-v1", - "@polywrap/ethereum-provider-js", + "@polywrap/ethereum-wallet-js", "@polywrap/file-system-plugin-js", "@polywrap/http-plugin-js", "@polywrap/logger-plugin-js", diff --git a/yarn.lock b/yarn.lock index e0e6b4ae73..7031e9235a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2203,15 +2203,6 @@ "@polywrap/tracing-js" "0.12.0" "@polywrap/wrap-manifest-types-js" "0.12.0" -"@polywrap/core-js@0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@polywrap/core-js/-/core-js-0.10.0.tgz#5ddc31ff47019342659a2208eec05299b072b216" - integrity sha512-fx9LqRFnxAxLOhDK4M+ymrxMnXQbwuNPMLjCk5Ve5CPa9RFms0/Fzvj5ayMLidZSPSt/dLISkbDgW44vfv6wwA== - dependencies: - "@polywrap/result" "0.10.0" - "@polywrap/tracing-js" "0.10.0" - "@polywrap/wrap-manifest-types-js" "0.10.0" - "@polywrap/core-js@0.12.0", "@polywrap/core-js@~0.12.0", "@polywrap/core-js@~0.12.0-pre.0": version "0.12.0" resolved "https://registry.yarnpkg.com/@polywrap/core-js/-/core-js-0.12.0.tgz#ec68d6d6489df55bfa7a6bc0d5910a5ff9eb157a" @@ -2229,17 +2220,6 @@ "@polywrap/core-js" "~0.12.0-pre.0" "@polywrap/plugin-js" "~0.12.0-pre.0" -"@polywrap/ethereum-provider-js@0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@polywrap/ethereum-provider-js/-/ethereum-provider-js-0.3.1.tgz#ffdb9425c819ee76d3e3d5ade7d1b044077037e0" - integrity sha512-El2d3gE2CFdGNzKQhO+IPP79lhyQmkAGlpQadaW/EDyFDjERLckYDLPrwUCXG0agUcQZcNY1nHn2hknumw/yWg== - dependencies: - "@ethersproject/address" "5.7.0" - "@ethersproject/providers" "5.7.0" - "@polywrap/core-js" "0.10.0" - "@polywrap/plugin-js" "0.10.0" - ethers "5.7.0" - "@polywrap/ethereum-wallet-js@~0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@polywrap/ethereum-wallet-js/-/ethereum-wallet-js-0.1.0.tgz#1af5800aab3c4cedfcd1e4e5e305d5d5ef733bea" @@ -2291,17 +2271,6 @@ dependencies: "@msgpack/msgpack" "2.7.2" -"@polywrap/plugin-js@0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@polywrap/plugin-js/-/plugin-js-0.10.0.tgz#e3bc81bf7832df9c84a4a319515228b159a05ba5" - integrity sha512-f0bjAKnveSu7u68NzWznYLWlzWo4MT8D6fudAF/wlV6S6R1euNJtIb8CTpAzfs6N173f81fzM/4OLS0pSYWdgQ== - dependencies: - "@polywrap/core-js" "0.10.0" - "@polywrap/msgpack-js" "0.10.0" - "@polywrap/result" "0.10.0" - "@polywrap/tracing-js" "0.10.0" - "@polywrap/wrap-manifest-types-js" "0.10.0" - "@polywrap/plugin-js@0.12.0", "@polywrap/plugin-js@~0.12.0", "@polywrap/plugin-js@~0.12.0-pre.0": version "0.12.0" resolved "https://registry.yarnpkg.com/@polywrap/plugin-js/-/plugin-js-0.12.0.tgz#90482acaaec4547aaaea6f9acc3d18adf69751ac" @@ -2313,11 +2282,6 @@ "@polywrap/tracing-js" "0.12.0" "@polywrap/wrap-manifest-types-js" "0.12.0" -"@polywrap/result@0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@polywrap/result/-/result-0.10.0.tgz#712339223fba524dfabfb0bf868411f357d52e34" - integrity sha512-IxTBfGP89/OPNlUPMkjOrdYt/hwyvgI7TsYap6S35MHo4pXkR9mskzrHJ/AGE5DyGqP81CIIJNSYfooF97KY3A== - "@polywrap/result@0.12.0": version "0.12.0" resolved "https://registry.yarnpkg.com/@polywrap/result/-/result-0.12.0.tgz#8cd72fa989098848b56316dfd7ed428831c5b540" @@ -2337,18 +2301,6 @@ "@polywrap/uri-resolver-extensions-js" "0.12.0" base64-to-uint8array "1.0.0" -"@polywrap/tracing-js@0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@polywrap/tracing-js/-/tracing-js-0.10.0.tgz#31d7ca9cc73a1dbd877fc684000652aa2c22acdc" - integrity sha512-077oN9VfbCNsYMRjX9NA6D1vFV+Y3TH92LjZATKQ2W2fRx/IGRARamAjhNfR4qRKstrOCd9D4E2DmaqFax3QIg== - dependencies: - "@fetsorn/opentelemetry-console-exporter" "0.0.3" - "@opentelemetry/api" "1.2.0" - "@opentelemetry/exporter-trace-otlp-http" "0.32.0" - "@opentelemetry/resources" "1.6.0" - "@opentelemetry/sdk-trace-base" "1.6.0" - "@opentelemetry/sdk-trace-web" "1.6.0" - "@polywrap/tracing-js@0.12.0": version "0.12.0" resolved "https://registry.yarnpkg.com/@polywrap/tracing-js/-/tracing-js-0.12.0.tgz#750238d92f6f29a4e8fc7e1b08cb27c7150c3279" @@ -2405,15 +2357,6 @@ "@polywrap/wasm-js" "0.12.0" base64-to-uint8array "1.0.0" -"@polywrap/wrap-manifest-types-js@0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@polywrap/wrap-manifest-types-js/-/wrap-manifest-types-js-0.10.0.tgz#f009a69d1591ee770dd13d67989d88f51e345d36" - integrity sha512-T3G/7NvNTuS1XyguRggTF4k7/h7yZCOcCbbUOTVoyVNfiNUY31hlrNZaFL4iriNqQ9sBDl9x6oRdOuFB7L9mlw== - dependencies: - "@apidevtools/json-schema-ref-parser" "9.0.9" - jsonschema "1.4.0" - semver "7.4.0" - "@polywrap/wrap-manifest-types-js@0.12.0": version "0.12.0" resolved "https://registry.yarnpkg.com/@polywrap/wrap-manifest-types-js/-/wrap-manifest-types-js-0.12.0.tgz#5ca209cdcad2f35e2064aa6b8174c2fbbc9fbcbc" @@ -8779,13 +8722,6 @@ scrypt-js@3.0.1: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@7.4.0: - version "7.4.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.4.0.tgz#8481c92feffc531ab1e012a8ffc15bdd3a0f4318" - integrity sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw== - dependencies: - lru-cache "^6.0.0" - semver@7.5.0: version "7.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.0.tgz#ed8c5dc8efb6c629c88b23d41dc9bf40c1d96cd0" From 9540953737eb1d971f8c8b1ce8f3baf45b65a1df Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Wed, 26 Jul 2023 22:52:20 +0200 Subject: [PATCH 171/181] chore: fix ens deploy test --- package.json | 1 + .../deploy-modules/ens-recursive-name-register/index.ts | 4 ++-- packages/cli/src/lib/defaults/deploy-modules/ens/index.ts | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index e2bca69c73..05017b5635 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "test:core": "lerna run test --no-private --ignore polywrap* --concurrency 1", "test:cli": "yarn test:cli:unit && yarn test:cli:e2e", "test:cli:unit": "lerna run test:unit --no-private --scope polywrap --concurrency 1", + "test:cli:e2e": "yarn test:cli:e2e:p1 && yarn test:cli:e2e:p2", "test:cli:e2e:p1": "lerna run test:e2e:p1 --no-private --scope polywrap --concurrency 1", "test:cli:e2e:p2": "lerna run test:e2e:p2 --no-private --scope polywrap --concurrency 1", "version:apply": "lerna version $(cat VERSION) --exact --no-git-tag-version --yes", diff --git a/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/index.ts b/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/index.ts index 5fe609c689..41c451aa24 100644 --- a/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/index.ts +++ b/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/index.ts @@ -83,7 +83,7 @@ class ENSRecursiveNameRegisterPublisher implements DeployModule { const signerAddress = await client.invoke({ method: "getSignerAddress", - uri: "ens/ethers.wraps.eth:0.1.0", + uri: "wrapscan.io/polywrap/ethers@1.0", args: { connection: { networkNameOrChainId: network, @@ -126,7 +126,7 @@ class ENSRecursiveNameRegisterPublisher implements DeployModule { client, { method: "awaitTransaction", - uri: Uri.from("ens/ethers.wraps.eth:0.1.0"), + uri: Uri.from("wrapscan.io/polywrap/ethers@1.0"), args: { txHash: registerData.value[0].tx.hash, connection: { diff --git a/packages/cli/src/lib/defaults/deploy-modules/ens/index.ts b/packages/cli/src/lib/defaults/deploy-modules/ens/index.ts index 1e8cc7416c..e7297d81a3 100644 --- a/packages/cli/src/lib/defaults/deploy-modules/ens/index.ts +++ b/packages/cli/src/lib/defaults/deploy-modules/ens/index.ts @@ -125,7 +125,7 @@ class ENSPublisher implements DeployModule { client, { method: "awaitTransaction", - uri: Uri.from("ens/ethers.wraps.eth:0.1.0"), + uri: Uri.from("wrapscan.io/polywrap/ethers@1.0"), args: { txHash: setContenthashData.value.hash, connection: { From a029f7d136ac42c839158537e90884ca8330c4b4 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Thu, 27 Jul 2023 04:02:02 +0200 Subject: [PATCH 172/181] chore: update testing order --- .github/workflows/ci-javascript.yaml | 72 +++++++++++++++---- package.json | 12 ++-- .../cli/src/__tests__/e2e/p1/deploy.spec.ts | 13 ++-- 3 files changed, 75 insertions(+), 22 deletions(-) diff --git a/.github/workflows/ci-javascript.yaml b/.github/workflows/ci-javascript.yaml index 2fba40ed31..e7cd22da9a 100644 --- a/.github/workflows/ci-javascript.yaml +++ b/.github/workflows/ci-javascript.yaml @@ -83,9 +83,8 @@ jobs: CI-WRAP-Test-Harness: uses: ./.github/workflows/ci-wrap-test-harness.yaml - Test-Core: + Test-Templates: runs-on: ubuntu-latest - needs: CI-WRAP-Test-Harness timeout-minutes: 60 if: ${{ always() }} steps: @@ -139,18 +138,63 @@ jobs: - name: Build run: yarn build - - name: Get updated wrappers - if: ${{ needs.CI-WRAP-Test-Harness.outputs.rebuild_required == 'true' }} - uses: actions/download-artifact@v3 - id: get-wrappers + - name: Test + run: yarn test:templates + + Test-Core: + runs-on: ubuntu-latest + timeout-minutes: 60 + if: ${{ always() }} + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Read .nvmrc + run: echo ::set-output name=NVMRC::$(cat .nvmrc) + id: nvm + + - name: Setup Node.js + uses: actions/setup-node@master with: - name: rebuilt-wrappers - path: ./wrappers + node-version: '${{ steps.nvm.outputs.NVMRC }}' - - if: ${{ needs.CI-WRAP-Test-Harness.outputs.rebuild_required == 'true' }} - run: | - rm -rf packages/test-cases/cases/wrappers - mv wrappers packages/test-cases/cases + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: '3.10' + + - name: Setup Poetry + uses: abatilo/actions-poetry@v2 + with: + poetry-version: '1.4.2' + + - name: Setup Go + uses: actions/setup-go@v3 + with: + go-version: '^1.13.1' + + - name: Install cue lang + run: go install cuelang.org/go/cmd/cue@latest + + - name: Check if cue is installed + run: cue version + + - name: Get yarn cache directory path + id: yarn-cache-dir-path + run: echo "::set-output name=dir::$(yarn cache dir)" + + - uses: actions/cache@v2 + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-yarn- + + - name: Install dependencies + run: yarn install --nonInteractive --frozen-lockfile --prefer-offline + + - name: Build + run: yarn build - name: Test run: yarn test:core @@ -224,3 +268,7 @@ jobs: - name: Test cli:e2e:p2 run: yarn test:e2e:p2 working-directory: ./packages/cli + + - name: Test CLI JS + run: yarn test + working-directory: ./packages/js/cli diff --git a/package.json b/package.json index 05017b5635..cba5f7b4a3 100644 --- a/package.json +++ b/package.json @@ -31,12 +31,14 @@ "lint:fix": "lerna run lint -- --fix", "lint:ci": "yarn lint", "test": "lerna run test --no-private --concurrency 1", - "test:core": "lerna run test --no-private --ignore polywrap* --concurrency 1", - "test:cli": "yarn test:cli:unit && yarn test:cli:e2e", - "test:cli:unit": "lerna run test:unit --no-private --scope polywrap --concurrency 1", + "test:core": "lerna run test --no-private --ignore polywrap* --ignore @polywrap/cli-js --ignore @polywrap/templates --concurrency 1", + "test:cli": "yarn test:cli:unit && yarn test:cli:e2e && yarn test:cli:js", + "test:cli:unit": "lerna run test:unit --scope polywrap --concurrency 1", "test:cli:e2e": "yarn test:cli:e2e:p1 && yarn test:cli:e2e:p2", - "test:cli:e2e:p1": "lerna run test:e2e:p1 --no-private --scope polywrap --concurrency 1", - "test:cli:e2e:p2": "lerna run test:e2e:p2 --no-private --scope polywrap --concurrency 1", + "test:cli:e2e:p1": "lerna run test:e2e:p1 --scope polywrap --concurrency 1", + "test:cli:e2e:p2": "lerna run test:e2e:p2 --scope polywrap --concurrency 1", + "test:cli:js": "lerna run test --scope @polywrap/cli-js --concurrency 1", + "test:templates": "lerna run test --no-private --scope @polywrap/templates --concurrency 1", "version:apply": "lerna version $(cat VERSION) --exact --no-git-tag-version --yes", "postversion:apply": "git add . && git commit -m \"build(release): migrate to `cat ./VERSION`\"", "publish:npm": "lerna exec --no-private --concurrency 1 -- yarn publish --access public --non-interactive --verbose", diff --git a/packages/cli/src/__tests__/e2e/p1/deploy.spec.ts b/packages/cli/src/__tests__/e2e/p1/deploy.spec.ts index cbce429c9b..468afdde43 100644 --- a/packages/cli/src/__tests__/e2e/p1/deploy.spec.ts +++ b/packages/cli/src/__tests__/e2e/p1/deploy.spec.ts @@ -77,8 +77,8 @@ describe("e2e tests for deploy command", () => { expect(clearStyle(output)).toEqual(HELP); }); - it("Should deploy the project successfully", async () => { - const { exitCode: code, stdout: output } = await Commands.deploy({}, { + it.skip("Should deploy the project successfully", async () => { + const { exitCode: code, stdout: output, stderr } = await Commands.deploy({}, { cwd: getTestCaseDir(0), cli: polywrapCli, env: process.env as Record @@ -86,6 +86,9 @@ describe("e2e tests for deploy command", () => { const sanitizedOutput = clearStyle(output); + console.log(output) + console.error(stderr); + expect(code).toEqual(0); expect(sanitizedOutput).toContain( "Successfully executed step 'ipfs_deploy'" @@ -107,7 +110,7 @@ describe("e2e tests for deploy command", () => { ); }); - it("Should output the deployment uri to URI.txt", async () => { + it.skip("Should output the deployment uri to URI.txt", async () => { const deploymentFilePath = path.join(getTestCaseDir(0), "URI.txt"); if (fs.existsSync(deploymentFilePath)) { fs.unlinkSync(deploymentFilePath); @@ -133,7 +136,7 @@ describe("e2e tests for deploy command", () => { ); }); - it("Should record successful deployments in the deployment log", async () => { + it.skip("Should record successful deployments in the deployment log", async () => { const deploymentFilePath = path.join(getTestCaseDir(0), "URI.txt"); const deployLogFilePath = path.join(getTestCaseDir(0), "/.polywrap/deploy/deploy.log"); @@ -159,7 +162,7 @@ describe("e2e tests for deploy command", () => { expect(lastLogEntry).toContain(deploymentUri); }); - it("Should output the results to a file if -o is passed", async () => { + it.skip("Should output the results to a file if -o is passed", async () => { const yamlRes = await Commands.deploy({ outputFile: "./output.yaml", }, { From 0fba350863204bd3be7ef4bad49956faaccf8569 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Thu, 27 Jul 2023 04:20:06 +0200 Subject: [PATCH 173/181] chore: enable deploy tests --- packages/cli/src/__tests__/e2e/p1/deploy.spec.ts | 8 ++++---- .../unit/option-parsers/option-parsers.spec.ts | 10 +++++----- .../unit/option-parsers/samples/wrapper-envs.json | 12 +++++------- .../unit/option-parsers/samples/wrapper-envs.yaml | 10 +++++----- packages/cli/src/lib/test-env/client-config.ts | 9 +++++---- 5 files changed, 24 insertions(+), 25 deletions(-) diff --git a/packages/cli/src/__tests__/e2e/p1/deploy.spec.ts b/packages/cli/src/__tests__/e2e/p1/deploy.spec.ts index 468afdde43..cf656e185c 100644 --- a/packages/cli/src/__tests__/e2e/p1/deploy.spec.ts +++ b/packages/cli/src/__tests__/e2e/p1/deploy.spec.ts @@ -77,7 +77,7 @@ describe("e2e tests for deploy command", () => { expect(clearStyle(output)).toEqual(HELP); }); - it.skip("Should deploy the project successfully", async () => { + it("Should deploy the project successfully", async () => { const { exitCode: code, stdout: output, stderr } = await Commands.deploy({}, { cwd: getTestCaseDir(0), cli: polywrapCli, @@ -110,7 +110,7 @@ describe("e2e tests for deploy command", () => { ); }); - it.skip("Should output the deployment uri to URI.txt", async () => { + it("Should output the deployment uri to URI.txt", async () => { const deploymentFilePath = path.join(getTestCaseDir(0), "URI.txt"); if (fs.existsSync(deploymentFilePath)) { fs.unlinkSync(deploymentFilePath); @@ -136,7 +136,7 @@ describe("e2e tests for deploy command", () => { ); }); - it.skip("Should record successful deployments in the deployment log", async () => { + it("Should record successful deployments in the deployment log", async () => { const deploymentFilePath = path.join(getTestCaseDir(0), "URI.txt"); const deployLogFilePath = path.join(getTestCaseDir(0), "/.polywrap/deploy/deploy.log"); @@ -162,7 +162,7 @@ describe("e2e tests for deploy command", () => { expect(lastLogEntry).toContain(deploymentUri); }); - it.skip("Should output the results to a file if -o is passed", async () => { + it("Should output the results to a file if -o is passed", async () => { const yamlRes = await Commands.deploy({ outputFile: "./output.yaml", }, { diff --git a/packages/cli/src/__tests__/unit/option-parsers/option-parsers.spec.ts b/packages/cli/src/__tests__/unit/option-parsers/option-parsers.spec.ts index 6307f00310..eba9f4a74e 100644 --- a/packages/cli/src/__tests__/unit/option-parsers/option-parsers.spec.ts +++ b/packages/cli/src/__tests__/unit/option-parsers/option-parsers.spec.ts @@ -4,13 +4,13 @@ import { parseWrapperEnvsOption } from "../../../lib"; describe("unit tests for option-parsers", () => { describe("wrapper-envs", () => { const sampleFileEnvs = { - "wrap://ens/wraps.eth:ethereum@1.0.0": { - connection: { - networkNameOrChainId: "mainnet", - node: "https://mainnet.infura.io/v3/some_api_key", + "wrap://authority/wrap": { + prop: { + value: "bar", + value2: 2, }, }, - "wrap://ens/hello-world.polywrap.eth": { foo: "bar" }, + "wrap://authority/some-wrap": { foo: "bar" }, }; it("Should return undefined when undefined is provided for wrapperEnvsPath", async () => { diff --git a/packages/cli/src/__tests__/unit/option-parsers/samples/wrapper-envs.json b/packages/cli/src/__tests__/unit/option-parsers/samples/wrapper-envs.json index 9e7ae61386..63792dfc71 100644 --- a/packages/cli/src/__tests__/unit/option-parsers/samples/wrapper-envs.json +++ b/packages/cli/src/__tests__/unit/option-parsers/samples/wrapper-envs.json @@ -1,11 +1,9 @@ { - "ens/hello-world.polywrap.eth": { - "foo": "bar" - }, - "ens/wraps.eth:ethereum@1.0.0": { - "connection": { - "node": "https://mainnet.infura.io/v3/some_api_key", - "networkNameOrChainId": "mainnet" + "authority/some-wrap": { "foo": "bar" }, + "authority/wrap": { + "prop": { + "value": "bar", + "value2": 2 } } } diff --git a/packages/cli/src/__tests__/unit/option-parsers/samples/wrapper-envs.yaml b/packages/cli/src/__tests__/unit/option-parsers/samples/wrapper-envs.yaml index dcaa2a8649..2a6f6fa121 100644 --- a/packages/cli/src/__tests__/unit/option-parsers/samples/wrapper-envs.yaml +++ b/packages/cli/src/__tests__/unit/option-parsers/samples/wrapper-envs.yaml @@ -1,6 +1,6 @@ -ens/hello-world.polywrap.eth: +authority/some-wrap: foo: bar -ens/wraps.eth:ethereum@1.0.0: - connection: - node: https://mainnet.infura.io/v3/some_api_key - networkNameOrChainId: mainnet +authority/wrap: + prop: + value: bar + value2: 2 diff --git a/packages/cli/src/lib/test-env/client-config.ts b/packages/cli/src/lib/test-env/client-config.ts index a6fe391beb..a969c05e8c 100644 --- a/packages/cli/src/lib/test-env/client-config.ts +++ b/packages/cli/src/lib/test-env/client-config.ts @@ -27,6 +27,7 @@ export function getTestEnvClientConfig(): Partial { } const ensAddress = ETH_ENS_IPFS_MODULE_CONSTANTS.ensAddresses.ensAddress; + const testnetEnsResolverUri = "proxy/testnet-ens-contenthash-uri-resolver"; const builder = new PolywrapClientConfigBuilder() .addDefaults() @@ -35,13 +36,13 @@ export function getTestEnvClientConfig(): Partial { provider: ipfsProvider, retries: { tryResolveUri: 1, getFile: 1 }, }, - "proxy/testnet-ens-uri-resolver-ext": { + [testnetEnsResolverUri]: { registryAddress: ensAddress, }, }) .setRedirects({ - "proxy/testnet-ens-uri-resolver-ext": - "ens/wraps.eth:ens-uri-resolver-ext@1.0.1", + [testnetEnsResolverUri]: + Web3.bundle.ensContenthashResolver.uri }) .setPackages({ [Web3.bundle.ethereumWallet.uri]: ethereumWalletPlugin({ @@ -70,7 +71,7 @@ export function getTestEnvClientConfig(): Partial { builder.addInterfaceImplementations( ExtendableUriResolver.defaultExtInterfaceUris[0].uri, - ["proxy/testnet-ens-uri-resolver-ext", ...resolverExtensions] + [testnetEnsResolverUri, ...resolverExtensions] ); return builder.config; From 3fdaaf322c8c8e736adab3e6a9556a87432af025 Mon Sep 17 00:00:00 2001 From: Pileks Date: Thu, 27 Jul 2023 18:54:43 +0200 Subject: [PATCH 174/181] Remove ens-related deployers, adjust deploy tests --- .../cli/src/__tests__/e2e/p1/deploy.spec.ts | 90 ++--------- .../ens-recursive-name-register/index.ts | 145 ------------------ .../invokeWithTimeout.ts | 56 ------- .../polywrap.deploy.ext.json | 27 ---- .../lib/defaults/deploy-modules/ens/index.ts | 143 ----------------- .../deploy-modules/ens/invokeWithTimeout.ts | 56 ------- .../ens/polywrap.deploy.ext.json | 23 --- .../deploy/001-sanity/polywrap.deploy.yaml | 36 +---- .../deploy/002-no-ext/polywrap.deploy.yaml | 2 +- .../003-invalid-config/polywrap.deploy.yaml | 9 +- .../004-fail-between/polywrap.deploy.yaml | 31 ++-- .../polywrap.deploy.yaml | 9 +- yarn.lock | 6 +- 13 files changed, 32 insertions(+), 601 deletions(-) delete mode 100644 packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/index.ts delete mode 100644 packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/invokeWithTimeout.ts delete mode 100644 packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/polywrap.deploy.ext.json delete mode 100644 packages/cli/src/lib/defaults/deploy-modules/ens/index.ts delete mode 100644 packages/cli/src/lib/defaults/deploy-modules/ens/invokeWithTimeout.ts delete mode 100644 packages/cli/src/lib/defaults/deploy-modules/ens/polywrap.deploy.ext.json diff --git a/packages/cli/src/__tests__/e2e/p1/deploy.spec.ts b/packages/cli/src/__tests__/e2e/p1/deploy.spec.ts index cf656e185c..98d69ba1c6 100644 --- a/packages/cli/src/__tests__/e2e/p1/deploy.spec.ts +++ b/packages/cli/src/__tests__/e2e/p1/deploy.spec.ts @@ -44,10 +44,6 @@ const setup = async () => { process.env = { ...process.env, IPFS_GATEWAY_URI: ETH_ENS_IPFS_MODULE_CONSTANTS.ipfsProvider, - DOMAIN_NAME: "test1.eth", - ENS_REG_ADDR: ETH_ENS_IPFS_MODULE_CONSTANTS.ensAddresses.ensAddress, - ENS_REGISTRAR_ADDR: ETH_ENS_IPFS_MODULE_CONSTANTS.ensAddresses.registrarAddress, - ENS_RESOLVER_ADDR: ETH_ENS_IPFS_MODULE_CONSTANTS.ensAddresses.resolverAddress, }; } @@ -78,36 +74,20 @@ describe("e2e tests for deploy command", () => { }); it("Should deploy the project successfully", async () => { - const { exitCode: code, stdout: output, stderr } = await Commands.deploy({}, { + const { exitCode: code, stdout: output, stderr: error } = await Commands.deploy({}, { cwd: getTestCaseDir(0), cli: polywrapCli, env: process.env as Record }); const sanitizedOutput = clearStyle(output); - - console.log(output) - console.error(stderr); + const sanitizedError = clearStyle(error); expect(code).toEqual(0); + expect(sanitizedError).toBeFalsy(); expect(sanitizedOutput).toContain( "Successfully executed step 'ipfs_deploy'" ); - expect(sanitizedOutput).toContain( - "Successfully executed step 'from_deploy'" - ); - expect(sanitizedOutput).toContain( - "Successfully executed step 'from_deploy2'" - ); - expect(sanitizedOutput).toContain( - "Successfully executed 'fs_to_ens' deployment job" - ); - expect(sanitizedOutput).toContain( - "Successfully executed step 'from_uri'" - ); - expect(sanitizedOutput).toContain( - "Successfully executed 'ipfs_to_ens' deployment job" - ); }); it("Should output the deployment uri to URI.txt", async () => { @@ -131,7 +111,7 @@ describe("e2e tests for deploy command", () => { const sanitizedOutput = clearStyle(output); expect(sanitizedOutput).toContain( - `The URI result from job fs_to_ens has been written to ${deploymentFilePath}. ` + + `The URI result from job fs_to_ipfs has been written to ${deploymentFilePath}. ` + "It is recommended to store this file at the root of your wrap package and commit it to your repository.", ); }); @@ -207,57 +187,16 @@ describe("e2e tests for deploy command", () => { expect(yamlOutputFileContents).toMatchObject(jsonOutputFileContents); expect(jsonOutputFileContents).toMatchObject([ { - "name": "fs_to_ens", + "name": "fs_to_ipfs", "steps": [ - { - "name": "ens_register", - "id": "fs_to_ens.ens_register", - "input": "wrap://ens/test1.eth", - "result": "wrap://ens/testnet/test1.eth", - }, - { - "name": "ens_register2", - "id": "fs_to_ens.ens_register2", - "input": "wrap://ens/test2.eth", - "result": "wrap://ens/testnet/test2.eth", - }, { "name": "ipfs_deploy", - "id": "fs_to_ens.ipfs_deploy", + "id": "fs_to_ipfs.ipfs_deploy", "input": "wrap://fs/../wrapper", "result": "wrap://ipfs/QmcZJ1NudpTdF96NEJZiKnDDXhydqanTusw7DXGj7PfbxH", }, - { - "name": "from_deploy", - "id": "fs_to_ens.from_deploy", - "input": "wrap://ipfs/QmcZJ1NudpTdF96NEJZiKnDDXhydqanTusw7DXGj7PfbxH", - "result": "wrap://ens/testnet/test1.eth", - }, - { - "name": "from_deploy2", - "id": "fs_to_ens.from_deploy2", - "input": "wrap://ipfs/QmcZJ1NudpTdF96NEJZiKnDDXhydqanTusw7DXGj7PfbxH", - "result": "wrap://ens/testnet/test2.eth", - } ] }, - { - "name": "ipfs_to_ens", - "steps": [ - { - "name": "ens_register", - "id": "ipfs_to_ens.ens_register", - "input": "wrap://ens/test3.eth", - "result": "wrap://ens/testnet/test3.eth", - }, - { - "name": "from_uri", - "id": "ipfs_to_ens.from_uri", - "input": "wrap://ipfs/QmVdDR6QtigTt38Xwpj2Ki73X1AyZn5WRCreBCJq1CEtpF", - "result": "wrap://ens/testnet/test3.eth", - } - ] - } ]) }); @@ -286,7 +225,7 @@ describe("e2e tests for deploy command", () => { const sanitizedErr = clearStyle(stderr); expect(code).toEqual(1); - expect(sanitizedErr).toContain("domainName is not of a type(s) string") + expect(sanitizedErr).toContain("gatewayUri is not of a type(s) string") }); it("Should throw and stop chain if error is found", async () => { @@ -298,18 +237,17 @@ describe("e2e tests for deploy command", () => { const sanitizedOutput = clearStyle(output); const sanitizedErr = clearStyle(stderr); - - expect(code).toEqual(1); + expect(sanitizedOutput).toContain( - "Successfully executed step 'ipfs_deploy'" + "Successfully executed step 'ipfs_deploy_1'" ); expect(sanitizedOutput).not.toContain( - "Successfully executed step 'from_deploy2'" + "Successfully executed step 'from_deploy_3'" ); - - expect(sanitizedErr).toContain( - "Failed to execute step 'from_deploy'" + expect(sanitizedErr.replace("\n", "")).toContain( + "Failed to execute step 'ipfs_deploy_2'" ); + expect(code).toEqual(1); }); it("Should throw if environment variable is not loaded but defined in manifest", async () => { @@ -319,7 +257,7 @@ describe("e2e tests for deploy command", () => { env: process.env as Record }); const sanitizedErr = clearStyle(stderr); - expect(code).toEqual(1); expect(sanitizedErr).toContain("Environment variable not found: `NON_LOADED_VAR`"); + expect(code).toEqual(1); }); }); diff --git a/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/index.ts b/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/index.ts deleted file mode 100644 index 41c451aa24..0000000000 --- a/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/index.ts +++ /dev/null @@ -1,145 +0,0 @@ -/* eslint-disable @typescript-eslint/no-require-imports */ -/* eslint-disable @typescript-eslint/no-var-requires */ -import { DeployModule } from "../../../deploy"; -import { invokeWithTimeout } from "./invokeWithTimeout"; - -import { Wallet } from "@ethersproject/wallet"; -import { JsonRpcProvider } from "@ethersproject/providers"; -import { IWrapPackage, Uri } from "@polywrap/core-js"; -import { - PolywrapClientConfigBuilder, - PolywrapClient, -} from "@polywrap/client-js"; -import * as Web3 from "@polywrap/web3-config-bundle-js"; -import { - Connection, - Connections, - ethereumWalletPlugin, -} from "@polywrap/ethereum-wallet-js"; - -class ENSRecursiveNameRegisterPublisher implements DeployModule { - async execute( - uri: Uri, - config: { - provider: string; - privateKey?: string; - ensRegistryAddress: string; - ensRegistrarAddress: string; - ensResolverAddress: string; - } - ): Promise { - if (uri.authority !== "ens") { - throw new Error( - `ENS Recursive Name Register Deployer: argument URI needs to be an ENS URI. Example: wrap://ens/foo.bar.eth` - ); - } - - let ensDomain = uri.path; - - const connectionProvider = new JsonRpcProvider(config.provider); - const { - chainId: chainIdNum, - name: networkName, - } = await connectionProvider.getNetwork(); - - const network = chainIdNum === 1337 ? "testnet" : networkName; - - if (ensDomain.startsWith(network)) { - ensDomain = ensDomain.split("/")[1]; - } - - const signer = config.privateKey - ? new Wallet(config.privateKey).connect(connectionProvider) - : undefined; - - // Default connections - const connections = new Connections({ - networks: { - [network]: new Connection({ - provider: config.provider, - signer, - }), - }, - defaultNetwork: network, - }); - - const ensUri = "wrap://redirect/ens"; - - const clientConfig = new PolywrapClientConfigBuilder() - .addDefaults() - .setPackage( - Web3.bundle.ethereumWallet.uri, - ethereumWalletPlugin({ - connections: connections, - }) as IWrapPackage - ) - .setRedirect( - ensUri, - "wrap://ipfs/QmQS8cr21euKYW7hWAhiSYXgvdcAtbPbynKqRW2CzAJPYe" - ) - .build(); - - const client = new PolywrapClient(clientConfig); - - const signerAddress = await client.invoke({ - method: "getSignerAddress", - uri: "wrapscan.io/polywrap/ethers@1.0", - args: { - connection: { - networkNameOrChainId: network, - }, - }, - }); - - if (!signerAddress.ok) { - throw new Error("Could not get signer. " + signerAddress.error); - } - - const registerData = await client.invoke< - { tx: { hash: string }; didRegister: boolean }[] - >({ - method: "registerDomainAndSubdomainsRecursively", - uri: ensUri, - args: { - domain: ensDomain, - owner: signerAddress.value, - resolverAddress: config.ensResolverAddress, - ttl: "0", - registrarAddress: config.ensRegistrarAddress, - registryAddress: config.ensRegistryAddress, - connection: { - networkNameOrChainId: network, - }, - }, - }); - - if (!registerData.ok) { - throw new Error( - `Could not register domain '${ensDomain}'` + - (registerData.error ? `\nError: ${registerData.error.message}` : "") - ); - } - - // didRegister can be false if the ens domain is already registered, in which case there is no transaction - if (registerData.value[0].didRegister) { - await invokeWithTimeout( - client, - { - method: "awaitTransaction", - uri: Uri.from("wrapscan.io/polywrap/ethers@1.0"), - args: { - txHash: registerData.value[0].tx.hash, - connection: { - networkNameOrChainId: network, - }, - }, - }, - 15000 - ); - } - - return new Uri(`ens/${network}/${ensDomain}`); - } -} - -export default new ENSRecursiveNameRegisterPublisher(); diff --git a/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/invokeWithTimeout.ts b/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/invokeWithTimeout.ts deleted file mode 100644 index bd8523c65b..0000000000 --- a/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/invokeWithTimeout.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { - Invoker, - InvokeResult, - InvokerOptions, - WrapError, - WrapErrorCode, -} from "@polywrap/core-js"; -import { ResultErr } from "@polywrap/result"; - -/** - * Invoke a wrapper; abort the invocation if a timeout expires. - * - * @param client - a Polywrap Invoker (e.g. CoreClient) - * @param options - invocation options - * @param timeout - a timeout period (in ms) - * */ -export async function invokeWithTimeout( - client: Invoker, - options: InvokerOptions, - timeout: number -): Promise> { - const controller = new AbortController(); - - const timer = setTimeout(() => { - controller.abort(); - }, timeout); - - return await new Promise>((resolve, reject) => { - controller.signal.addEventListener("abort", () => { - const wrapError = new WrapError("Timeout has been reached", { - code: WrapErrorCode.WRAPPER_INVOKE_ABORTED, - uri: options.uri.uri, - method: options.method, - args: JSON.stringify(options.args, null, 2), - }); - reject(wrapError); - }); - client - .invoke(options) - .then((result) => resolve(result)) - .catch((error) => { - // the client threw an error (this should never happen) - const wrapError = new WrapError(error.message, { - code: WrapErrorCode.WRAPPER_INVOKE_FAIL, - uri: options.uri.uri, - method: options.method, - args: JSON.stringify(options.args, null, 2), - }); - resolve(ResultErr(wrapError)); - }); - }) - .catch((error) => { - return ResultErr(error as WrapError); - }) - .finally(() => timer && clearTimeout(timer)); -} diff --git a/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/polywrap.deploy.ext.json b/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/polywrap.deploy.ext.json deleted file mode 100644 index 31ef9b84aa..0000000000 --- a/packages/cli/src/lib/defaults/deploy-modules/ens-recursive-name-register/polywrap.deploy.ext.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "id": "DeployManifest_ENSRecursiveNameRegister_WasmAsExt", - "type": "object", - "required": [ - "provider", - "ensRegistryAddress", - "ensRegistrarAddress", - "ensResolverAddress" - ], - "properties": { - "provider": { - "type": "string" - }, - "privateKey": { - "type": "string" - }, - "ensRegistryAddress": { - "type": "string" - }, - "ensRegistrarAddress": { - "type": "string" - }, - "ensResolverAddress": { - "type": "string" - } - } -} \ No newline at end of file diff --git a/packages/cli/src/lib/defaults/deploy-modules/ens/index.ts b/packages/cli/src/lib/defaults/deploy-modules/ens/index.ts deleted file mode 100644 index e7297d81a3..0000000000 --- a/packages/cli/src/lib/defaults/deploy-modules/ens/index.ts +++ /dev/null @@ -1,143 +0,0 @@ -/* eslint-disable @typescript-eslint/no-require-imports */ -/* eslint-disable @typescript-eslint/no-var-requires */ -import { DeployModule } from "../../../deploy"; -import { invokeWithTimeout } from "./invokeWithTimeout"; - -import { Wallet } from "@ethersproject/wallet"; -import { JsonRpcProvider } from "@ethersproject/providers"; -import { IWrapPackage, Uri } from "@polywrap/core-js"; -import { - PolywrapClientConfigBuilder, - PolywrapClient, -} from "@polywrap/client-js"; -import * as Web3 from "@polywrap/web3-config-bundle-js"; -import { - Connection, - Connections, - ethereumWalletPlugin, -} from "@polywrap/ethereum-wallet-js"; - -const contentHash = require("content-hash"); - -class ENSPublisher implements DeployModule { - async execute( - uri: Uri, - config: { - domainName: string; - provider: string; - privateKey?: string; - ensRegistryAddress: string; - } - ): Promise { - if (uri.authority !== "ipfs") { - throw new Error( - `ENS Deployer: resolved URI from ${uri} does not represent an IPFS contentHash` - ); - } - - const cid = uri.path; - - const connectionProvider = new JsonRpcProvider(config.provider); - const { - chainId: chainIdNum, - name: networkName, - } = await connectionProvider.getNetwork(); - - const network = chainIdNum === 1337 ? "testnet" : networkName; - - const signer = config.privateKey - ? new Wallet(config.privateKey).connect(connectionProvider) - : undefined; - - // Default connections - const connections = new Connections({ - networks: { - [network]: new Connection({ - provider: config.provider, - signer, - }), - }, - defaultNetwork: network, - }); - - const ensUri = "wrap://redirect/ens"; - - const clientConfig = new PolywrapClientConfigBuilder() - .addDefaults() - .setPackage( - Web3.bundle.ethereumWallet.uri, - ethereumWalletPlugin({ - connections: connections, - }) as IWrapPackage - ) - .setRedirect( - ensUri, - "wrap://ipfs/QmQS8cr21euKYW7hWAhiSYXgvdcAtbPbynKqRW2CzAJPYe" - ) - .build(); - - const client = new PolywrapClient(clientConfig); - - const resolver = await client.invoke({ - method: "getResolver", - uri: ensUri, - args: { - registryAddress: config.ensRegistryAddress, - domain: config.domainName, - connection: { - networkNameOrChainId: network, - }, - }, - }); - - if (!resolver.ok) { - throw new Error( - `Could not get resolver for '${config.domainName}'. ${resolver.error}` - ); - } - - if (resolver.value === "0x0000000000000000000000000000000000000000") { - throw new Error(`Resolver not set for '${config.domainName}'`); - } - - const hash = "0x" + contentHash.fromIpfs(cid); - - const setContenthashData = await client.invoke<{ hash: string }>({ - method: "setContentHash", - uri: ensUri, - args: { - domain: config.domainName, - cid: hash, - resolverAddress: resolver.value, - connection: { - networkNameOrChainId: network, - }, - }, - }); - - if (!setContenthashData.ok) { - throw new Error( - `Could not set contentHash for '${config.domainName}'. ${setContenthashData.error}` - ); - } - - await invokeWithTimeout( - client, - { - method: "awaitTransaction", - uri: Uri.from("wrapscan.io/polywrap/ethers@1.0"), - args: { - txHash: setContenthashData.value.hash, - connection: { - networkNameOrChainId: network, - }, - }, - }, - 15000 - ); - - return new Uri(`ens/${network}/${config.domainName}`); - } -} - -export default new ENSPublisher(); diff --git a/packages/cli/src/lib/defaults/deploy-modules/ens/invokeWithTimeout.ts b/packages/cli/src/lib/defaults/deploy-modules/ens/invokeWithTimeout.ts deleted file mode 100644 index bd8523c65b..0000000000 --- a/packages/cli/src/lib/defaults/deploy-modules/ens/invokeWithTimeout.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { - Invoker, - InvokeResult, - InvokerOptions, - WrapError, - WrapErrorCode, -} from "@polywrap/core-js"; -import { ResultErr } from "@polywrap/result"; - -/** - * Invoke a wrapper; abort the invocation if a timeout expires. - * - * @param client - a Polywrap Invoker (e.g. CoreClient) - * @param options - invocation options - * @param timeout - a timeout period (in ms) - * */ -export async function invokeWithTimeout( - client: Invoker, - options: InvokerOptions, - timeout: number -): Promise> { - const controller = new AbortController(); - - const timer = setTimeout(() => { - controller.abort(); - }, timeout); - - return await new Promise>((resolve, reject) => { - controller.signal.addEventListener("abort", () => { - const wrapError = new WrapError("Timeout has been reached", { - code: WrapErrorCode.WRAPPER_INVOKE_ABORTED, - uri: options.uri.uri, - method: options.method, - args: JSON.stringify(options.args, null, 2), - }); - reject(wrapError); - }); - client - .invoke(options) - .then((result) => resolve(result)) - .catch((error) => { - // the client threw an error (this should never happen) - const wrapError = new WrapError(error.message, { - code: WrapErrorCode.WRAPPER_INVOKE_FAIL, - uri: options.uri.uri, - method: options.method, - args: JSON.stringify(options.args, null, 2), - }); - resolve(ResultErr(wrapError)); - }); - }) - .catch((error) => { - return ResultErr(error as WrapError); - }) - .finally(() => timer && clearTimeout(timer)); -} diff --git a/packages/cli/src/lib/defaults/deploy-modules/ens/polywrap.deploy.ext.json b/packages/cli/src/lib/defaults/deploy-modules/ens/polywrap.deploy.ext.json deleted file mode 100644 index 180605c257..0000000000 --- a/packages/cli/src/lib/defaults/deploy-modules/ens/polywrap.deploy.ext.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "id": "DeployManifest_ENS_WasmAsExt", - "type": "object", - "required": [ - "domainName", - "provider", - "ensRegistryAddress" - ], - "properties": { - "domainName": { - "type": "string" - }, - "provider": { - "type": "string" - }, - "privateKey": { - "type": "string" - }, - "ensRegistryAddress": { - "type": "string" - } - } -} \ No newline at end of file diff --git a/packages/test-cases/cases/cli/deploy/001-sanity/polywrap.deploy.yaml b/packages/test-cases/cases/cli/deploy/001-sanity/polywrap.deploy.yaml index c065da6950..99f69b156c 100644 --- a/packages/test-cases/cases/cli/deploy/001-sanity/polywrap.deploy.yaml +++ b/packages/test-cases/cases/cli/deploy/001-sanity/polywrap.deploy.yaml @@ -1,44 +1,10 @@ format: 0.4.0 jobs: - fs_to_ens: + fs_to_ipfs: config: provider: http://localhost:8545 - ensRegistryAddress: $ENS_REG_ADDR - ensRegistrarAddress: $ENS_REGISTRAR_ADDR - ensResolverAddress: $ENS_RESOLVER_ADDR gatewayUri: $IPFS_GATEWAY_URI steps: - - name: ens_register - package: ens-recursive-name-register - uri: wrap://ens/test1.eth - - name: ens_register2 - package: ens-recursive-name-register - uri: wrap://ens/test2.eth - name: ipfs_deploy package: ipfs uri: wrap://fs/../wrapper - - name: from_deploy - package: ens - uri: $$ipfs_deploy - config: - domainName: test1.eth - - name: from_deploy2 - package: ens - uri: $$ipfs_deploy - config: - domainName: test2.eth - ipfs_to_ens: - config: - provider: http://localhost:8545 - ensRegistryAddress: $ENS_REG_ADDR - ensRegistrarAddress: $ENS_REGISTRAR_ADDR - ensResolverAddress: $ENS_RESOLVER_ADDR - steps: - - name: ens_register - package: ens-recursive-name-register - uri: wrap://ens/test3.eth - - name: from_uri - package: ens - uri: wrap://ipfs/QmVdDR6QtigTt38Xwpj2Ki73X1AyZn5WRCreBCJq1CEtpF - config: - domainName: test3.eth diff --git a/packages/test-cases/cases/cli/deploy/002-no-ext/polywrap.deploy.yaml b/packages/test-cases/cases/cli/deploy/002-no-ext/polywrap.deploy.yaml index 739aab7812..62af12305a 100644 --- a/packages/test-cases/cases/cli/deploy/002-no-ext/polywrap.deploy.yaml +++ b/packages/test-cases/cases/cli/deploy/002-no-ext/polywrap.deploy.yaml @@ -1,4 +1,4 @@ -format: "0.3.0" +format: 0.4.0 jobs: test: steps: diff --git a/packages/test-cases/cases/cli/deploy/003-invalid-config/polywrap.deploy.yaml b/packages/test-cases/cases/cli/deploy/003-invalid-config/polywrap.deploy.yaml index d7a079a1d4..17b948d8d8 100644 --- a/packages/test-cases/cases/cli/deploy/003-invalid-config/polywrap.deploy.yaml +++ b/packages/test-cases/cases/cli/deploy/003-invalid-config/polywrap.deploy.yaml @@ -1,4 +1,4 @@ -format: "0.3.0" +format: 0.4.0 jobs: test: config: @@ -7,10 +7,5 @@ jobs: - name: ipfs_deploy package: ipfs uri: wrap://fs/../wrapper - - name: from_deploy - package: ens - uri: $$ipfs_deploy config: - domainName: true - ports: - ethereum: 8545 \ No newline at end of file + gatewayUri: false diff --git a/packages/test-cases/cases/cli/deploy/004-fail-between/polywrap.deploy.yaml b/packages/test-cases/cases/cli/deploy/004-fail-between/polywrap.deploy.yaml index 7eb0672b5b..6798f7599f 100644 --- a/packages/test-cases/cases/cli/deploy/004-fail-between/polywrap.deploy.yaml +++ b/packages/test-cases/cases/cli/deploy/004-fail-between/polywrap.deploy.yaml @@ -1,30 +1,17 @@ -format: "0.3.0" +format: 0.4.0 jobs: test: config: - provider: 'http://localhost:8545' gatewayUri: $IPFS_GATEWAY_URI - ensRegistryAddress: $ENS_REG_ADDR - ensRegistrarAddress: $ENS_REGISTRAR_ADDR - ensResolverAddress: $ENS_RESOLVER_ADDR steps: - - name: ipfs_deploy + - name: ipfs_deploy_1 + package: ipfs + uri: fs/../wrapper + - name: ipfs_deploy_2 package: ipfs uri: fs/../wrapper - - name: from_deploy - package: ens - uri: $$ipfs_deploy - config: - domainName: foo - ports: - ethereum: 8545 - - name: ens_register - package: ens-recursive-name-register - uri: wrap://ens/test2.eth - - name: from_deploy2 - package: ens - uri: $$ipfs_deploy config: - domainName: test2.eth - ports: - ethereum: 8545 \ No newline at end of file + gatewayUri: "this_should_throw" + - name: ipfs_deploy_3 + package: ipfs + uri: fs/../wrapper diff --git a/packages/test-cases/cases/cli/deploy/005-non-loaded-env-var/polywrap.deploy.yaml b/packages/test-cases/cases/cli/deploy/005-non-loaded-env-var/polywrap.deploy.yaml index 93d1f271b5..ca75f64d3a 100644 --- a/packages/test-cases/cases/cli/deploy/005-non-loaded-env-var/polywrap.deploy.yaml +++ b/packages/test-cases/cases/cli/deploy/005-non-loaded-env-var/polywrap.deploy.yaml @@ -1,4 +1,4 @@ -format: "0.3.0" +format: 0.4.0 jobs: test: config: @@ -7,10 +7,5 @@ jobs: - name: ipfs_deploy package: ipfs uri: fs/../wrapper - - name: from_deploy - package: ens - uri: $$ipfs_deploy config: - domainName: $NON_LOADED_VAR - provider: 'http://localhost:8545' - ensRegistryAddress: '0x9b1f7F645351AF3631a656421eD2e40f2802E6c0' + gatewayUri: $NON_LOADED_VAR diff --git a/yarn.lock b/yarn.lock index 7031e9235a..f98aed85d0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4285,9 +4285,9 @@ ecc-jsbn@~0.1.1: safer-buffer "^2.1.0" electron-to-chromium@^1.4.431: - version "1.4.471" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.471.tgz#14cb056d0ce4bfa99df57946d57fe46c2330dac3" - integrity sha512-GpmGRC1vTl60w/k6YpQ18pSiqnmr0j3un//5TV1idPi6aheNfkT1Ye71tMEabWyNDO6sBMgAR+95Eb0eUUr1tA== + version "1.4.473" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.473.tgz#4853de13a335c70fe1f9df8d4029be54068767d1" + integrity sha512-aVfC8+440vGfl06l8HKKn8/PD5jRfSnLkTTD65EFvU46igbpQRri1gxSzW9/+TeUlwYzrXk1sw867T96zlyECA== elliptic@6.5.4: version "6.5.4" From eb6f0e4734825fd7bb7dc5cd23a91996c5a36a56 Mon Sep 17 00:00:00 2001 From: Pileks Date: Thu, 27 Jul 2023 18:58:05 +0200 Subject: [PATCH 175/181] chore: lint --- packages/cli/src/lib/test-env/client-config.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/cli/src/lib/test-env/client-config.ts b/packages/cli/src/lib/test-env/client-config.ts index a969c05e8c..7b5f67312d 100644 --- a/packages/cli/src/lib/test-env/client-config.ts +++ b/packages/cli/src/lib/test-env/client-config.ts @@ -41,8 +41,7 @@ export function getTestEnvClientConfig(): Partial { }, }) .setRedirects({ - [testnetEnsResolverUri]: - Web3.bundle.ensContenthashResolver.uri + [testnetEnsResolverUri]: Web3.bundle.ensContenthashResolver.uri, }) .setPackages({ [Web3.bundle.ethereumWallet.uri]: ethereumWalletPlugin({ From fa6cad4cfd22de93596315b566aa9519471fe6d6 Mon Sep 17 00:00:00 2001 From: Pileks Date: Fri, 28 Jul 2023 18:34:18 +0200 Subject: [PATCH 176/181] fix help text test for build command --- packages/cli/src/__tests__/e2e/p2/build.wasm.spec.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/cli/src/__tests__/e2e/p2/build.wasm.spec.ts b/packages/cli/src/__tests__/e2e/p2/build.wasm.spec.ts index d794da5702..43d64f6526 100644 --- a/packages/cli/src/__tests__/e2e/p2/build.wasm.spec.ts +++ b/packages/cli/src/__tests__/e2e/p2/build.wasm.spec.ts @@ -17,6 +17,10 @@ Options: (default: polywrap.yaml | polywrap.yml) -o, --output-dir Output directory for build results (default: ./build) + -b, --bindgen Uri for custom bindgen wrap (must + implement wrap-abi-bindgen interface; + see + https://github.com/polywrap/wrap-abi-bindgen) -c, --client-config Add custom configuration to the PolywrapClient -n, --no-codegen Skip code generation before build From b8e67262138a81e2ffc33fb9df3854e7fc2b0593 Mon Sep 17 00:00:00 2001 From: Cesar Date: Fri, 28 Jul 2023 19:13:54 +0200 Subject: [PATCH 177/181] feat(cli): support swift plugin bindings --- packages/cli/src/lib/project/manifests/plugin/languages.ts | 3 +++ packages/schema/bind/src/bindings/index.ts | 4 ++++ packages/schema/bind/src/types.ts | 1 + 3 files changed, 8 insertions(+) diff --git a/packages/cli/src/lib/project/manifests/plugin/languages.ts b/packages/cli/src/lib/project/manifests/plugin/languages.ts index a18745db6b..36218b5bb7 100644 --- a/packages/cli/src/lib/project/manifests/plugin/languages.ts +++ b/packages/cli/src/lib/project/manifests/plugin/languages.ts @@ -7,6 +7,7 @@ export const pluginManifestLanguages = { "plugin/rust": "plugin/rust", "plugin/python": "plugin/python", "plugin/kotlin": "plugin/kotlin", + "plugin/swift": "plugin/swift", }; export type PluginManifestLanguages = typeof pluginManifestLanguages; @@ -31,6 +32,8 @@ export function pluginManifestLanguageToBindLanguage( return "plugin-py"; case "plugin/kotlin": return "plugin-kt"; + case "plugin/swift": + return "plugin-swift"; default: throw Error( intlMsg.lib_language_unsupportedManifestLanguage({ diff --git a/packages/schema/bind/src/bindings/index.ts b/packages/schema/bind/src/bindings/index.ts index 0f21b912ca..3a4a71f746 100644 --- a/packages/schema/bind/src/bindings/index.ts +++ b/packages/schema/bind/src/bindings/index.ts @@ -36,6 +36,10 @@ export function getGenerateBindingFn( return WrapBindgen.getGenerateBindingFn( "https://github.com/polywrap/wrap-abi-bindgen/tree/wrap-0.1/implementations/plugin-kotlin" ); + case "plugin-swift": + return WrapBindgen.getGenerateBindingFn( + "https://github.com/polywrap/wrap-abi-bindgen/tree/wrap-0.1/implementations/plugin-swift" + ); case "app-ts": return WrapBindgen.getGenerateBindingFn( "https://github.com/polywrap/wrap-abi-bindgen/tree/wrap-0.1/implementations/app-typescript" diff --git a/packages/schema/bind/src/types.ts b/packages/schema/bind/src/types.ts index cb92c63d1f..cd1ee10bf3 100644 --- a/packages/schema/bind/src/types.ts +++ b/packages/schema/bind/src/types.ts @@ -9,6 +9,7 @@ export type BindLanguage = | "plugin-rs" | "plugin-py" | "plugin-kt" + | "plugin-swift" | "app-ts"; export interface BindOutput { From efe2af4dda29c46f8fbeaeeb4593da1b77e52fb1 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Sat, 29 Jul 2023 22:03:05 +0200 Subject: [PATCH 178/181] chore: remove plugin-rs bind test case --- .../bind/sanity/output/plugin-rs/module.rs | 82 ----- .../bind/sanity/output/plugin-rs/types.rs | 305 ------------------ 2 files changed, 387 deletions(-) delete mode 100644 packages/test-cases/cases/bind/sanity/output/plugin-rs/module.rs delete mode 100644 packages/test-cases/cases/bind/sanity/output/plugin-rs/types.rs diff --git a/packages/test-cases/cases/bind/sanity/output/plugin-rs/module.rs b/packages/test-cases/cases/bind/sanity/output/plugin-rs/module.rs deleted file mode 100644 index fc34f4f43a..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/plugin-rs/module.rs +++ /dev/null @@ -1,82 +0,0 @@ -/// NOTE: This is an auto-generated file. -/// All modifications will be overwritten. - -use std::sync::Arc; -use polywrap_core::invoker::Invoker; -use polywrap_plugin::{error::PluginError, module::PluginModule}; -use polywrap_msgpack_serde::{ - to_vec, - from_slice, - BigInt, - BigNumber, - JSON, - bytes, - wrappers::{ - polywrap_bigint as bigint, - polywrap_json as json - } -}; -use std::collections::BTreeMap; -use serde::{Serialize, Deserialize}; -use super::types::*; - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct ArgsModuleMethod { - pub str: String, - #[serde(rename = "optStr")] - pub opt_str: Option, - pub en: CustomEnum, - #[serde(rename = "optEnum")] - pub opt_enum: Option, - #[serde(rename = "enumArray")] - pub enum_array: Vec, - #[serde(rename = "optEnumArray")] - pub opt_enum_array: Option>>, - pub map: BTreeMap, - #[serde(rename = "mapOfArr")] - pub map_of_arr: BTreeMap>, - #[serde(rename = "mapOfMap")] - pub map_of_map: BTreeMap>, - #[serde(rename = "mapOfObj")] - pub map_of_obj: BTreeMap, - #[serde(rename = "mapOfArrOfObj")] - pub map_of_arr_of_obj: BTreeMap>, -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct ArgsObjectMethod { - pub object: AnotherType, - #[serde(rename = "optObject")] - pub opt_object: Option, - #[serde(rename = "objectArray")] - pub object_array: Vec, - #[serde(rename = "optObjectArray")] - pub opt_object_array: Option>>, -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct ArgsOptionalEnvMethod { - pub object: AnotherType, - #[serde(rename = "optObject")] - pub opt_object: Option, - #[serde(rename = "objectArray")] - pub object_array: Vec, - #[serde(rename = "optObjectArray")] - pub opt_object_array: Option>>, -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct ArgsIf { - #[serde(rename = "if")] - pub _if: Else, -} - -pub trait Module: PluginModule { - fn module_method(&mut self, args: &ArgsModuleMethod, invoker: Arc) -> Result; - - fn object_method(&mut self, args: &ArgsObjectMethod, invoker: Arc, env: Env) -> Result, PluginError>; - - fn optional_env_method(&mut self, args: &ArgsOptionalEnvMethod, invoker: Arc, env: Option) -> Result, PluginError>; - - fn _if(&mut self, args: &ArgsIf, invoker: Arc) -> Result; -} diff --git a/packages/test-cases/cases/bind/sanity/output/plugin-rs/types.rs b/packages/test-cases/cases/bind/sanity/output/plugin-rs/types.rs deleted file mode 100644 index a673af6952..0000000000 --- a/packages/test-cases/cases/bind/sanity/output/plugin-rs/types.rs +++ /dev/null @@ -1,305 +0,0 @@ -#![allow(unused_imports)] -#![allow(non_camel_case_types)] - -// NOTE: This is an auto-generated file. -// All modifications will be overwritten. -use polywrap_core::{invoker::Invoker, uri::Uri}; -use polywrap_plugin::error::PluginError; -use polywrap_msgpack_serde::{ - to_vec, - from_slice, - BigInt, - BigNumber, - JSON, - bytes, - wrappers::{ - polywrap_bigint as bigint, - polywrap_json as json - } -}; -use std::collections::BTreeMap; -use serde::{Serialize, Deserialize}; -use std::sync::Arc; - -// Env START // - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct Env { - pub prop: String, - #[serde(rename = "optProp")] - pub opt_prop: Option, - #[serde(rename = "optMap")] - pub opt_map: Option>>, -} -// Env END // - -// Objects START // - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct CustomType { - pub str: String, - #[serde(rename = "optStr")] - pub opt_str: Option, - pub u: u32, - #[serde(rename = "optU")] - pub opt_u: Option, - pub u8: u8, - pub u16: u16, - pub u32: u32, - pub i: i32, - pub i8: i8, - pub i16: i16, - pub i32: i32, - #[serde(with = "bigint")] - pub bigint: BigInt, - #[serde(with = "bigint")] - #[serde(rename = "optBigint")] - pub opt_bigint: Option, - pub bignumber: BigNumber, - #[serde(rename = "optBignumber")] - pub opt_bignumber: Option, - #[serde(with = "json")] - pub json: JSON::Value, - #[serde(with = "json")] - #[serde(rename = "optJson")] - pub opt_json: Option, - #[serde(with = "bytes")] - pub bytes: Vec, - #[serde(with = "bytes")] - #[serde(rename = "optBytes")] - pub opt_bytes: Option>, - pub boolean: bool, - #[serde(rename = "optBoolean")] - pub opt_boolean: Option, - pub u_array: Vec, - #[serde(rename = "uOpt_array")] - pub u_opt_array: Option>, - #[serde(rename = "_opt_uOptArray")] - pub _opt_u_opt_array: Option>>, - #[serde(rename = "optStrOptArray")] - pub opt_str_opt_array: Option>>, - #[serde(rename = "uArrayArray")] - pub u_array_array: Vec>, - #[serde(rename = "uOptArrayOptArray")] - pub u_opt_array_opt_array: Vec>>>, - #[serde(rename = "uArrayOptArrayArray")] - pub u_array_opt_array_array: Vec>>>, - #[serde(rename = "crazyArray")] - pub crazy_array: Option>>>>>>, - pub object: AnotherType, - #[serde(rename = "optObject")] - pub opt_object: Option, - #[serde(rename = "objectArray")] - pub object_array: Vec, - #[serde(rename = "optObjectArray")] - pub opt_object_array: Option>>, - pub en: CustomEnum, - #[serde(rename = "optEnum")] - pub opt_enum: Option, - #[serde(rename = "enumArray")] - pub enum_array: Vec, - #[serde(rename = "optEnumArray")] - pub opt_enum_array: Option>>, - pub map: BTreeMap, - #[serde(rename = "mapOfArr")] - pub map_of_arr: BTreeMap>, - #[serde(rename = "mapOfObj")] - pub map_of_obj: BTreeMap, - #[serde(rename = "mapOfArrOfObj")] - pub map_of_arr_of_obj: BTreeMap>, - #[serde(rename = "mapCustomValue")] - pub map_custom_value: BTreeMap>, -} -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct AnotherType { - pub prop: Option, - pub circular: Option, - #[serde(rename = "const")] - pub _const: Option, -} -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct CustomMapValue { - pub foo: String, -} -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct Else { - #[serde(rename = "else")] - pub _else: String, -} -// Objects END // - -// Enums START // - -#[derive(Clone, Copy, Debug, Deserialize, Serialize)] -pub enum CustomEnum { - STRING, - BYTES, - _MAX_ -} -#[derive(Clone, Copy, Debug, Deserialize, Serialize)] -pub enum While { - _for, - _in, - _MAX_ -} -// Enums END // - -// Imported objects START // - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct TestImportObject { - pub object: TestImportAnotherObject, - #[serde(rename = "optObject")] - pub opt_object: Option, - #[serde(rename = "objectArray")] - pub object_array: Vec, - #[serde(rename = "optObjectArray")] - pub opt_object_array: Option>>, - pub en: TestImportEnum, - #[serde(rename = "optEnum")] - pub opt_enum: Option, - #[serde(rename = "enumArray")] - pub enum_array: Vec, - #[serde(rename = "optEnumArray")] - pub opt_enum_array: Option>>, -} -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct TestImportAnotherObject { - pub prop: String, -} -// Imported objects END // - -// Imported envs START // - -// Imported envs END // - -// Imported enums START // - -#[derive(Clone, Copy, Debug, Deserialize, Serialize)] -pub enum TestImportEnum { - STRING, - BYTES, - _MAX_ -} -#[derive(Clone, Copy, Debug, Deserialize, Serialize)] -pub enum TestImportEnumReturn { - STRING, - BYTES, - _MAX_ -} -// Imported enums END // - -// Imported Modules START // - -// URI: "testimport.uri.eth" // -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct TestImportModuleArgsImportedMethod { - pub str: String, - #[serde(rename = "optStr")] - pub opt_str: Option, - pub u: u32, - #[serde(rename = "optU")] - pub opt_u: Option, - #[serde(rename = "uArrayArray")] - pub u_array_array: Vec>>>, - pub object: TestImportObject, - #[serde(rename = "optObject")] - pub opt_object: Option, - #[serde(rename = "objectArray")] - pub object_array: Vec, - #[serde(rename = "optObjectArray")] - pub opt_object_array: Option>>, - pub en: TestImportEnum, - #[serde(rename = "optEnum")] - pub opt_enum: Option, - #[serde(rename = "enumArray")] - pub enum_array: Vec, - #[serde(rename = "optEnumArray")] - pub opt_enum_array: Option>>, -} - -// URI: "testimport.uri.eth" // -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct TestImportModuleArgsAnotherMethod { - pub arg: Vec, -} - -// URI: "testimport.uri.eth" // -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct TestImportModuleArgsReturnsArrayOfEnums { - pub arg: String, -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct TestImportModule<'a> { - uri: &'a str -} - -impl<'a> TestImportModule<'a> { - pub const INTERFACE_URI: &'static str = "testimport.uri.eth"; - - pub fn new(uri: &'a str) -> TestImportModule<'a> { - TestImportModule { uri: uri } - } - - pub fn imported_method(&self, args: &TestImportModuleArgsImportedMethod) -> Result, PluginError> { - let uri = self.uri; - let serialized_args = to_vec(args.clone()).unwrap(); - let result = invoker.invoke_raw( - uri, - "importedMethod", - serialized_args, - None, - None - ) - .map_err(|e| PluginError::SubinvocationError { - uri: uri.to_string(), - method: "importedMethod".to_string(), - args: JSON::to_string(&args).unwrap(), - exception: e.to_string(), - })?; - - Ok(Some(from_slice(result.as_slice())?)) - } - - pub fn another_method(&self, args: &TestImportModuleArgsAnotherMethod) -> Result { - let uri = self.uri; - let serialized_args = to_vec(args.clone()).unwrap(); - let result = invoker.invoke_raw( - uri, - "anotherMethod", - serialized_args, - None, - None - ) - .map_err(|e| PluginError::SubinvocationError { - uri: uri.to_string(), - method: "anotherMethod".to_string(), - args: JSON::to_string(&args).unwrap(), - exception: e.to_string(), - })?; - - Ok(from_slice(result.as_slice())?) - } - - pub fn returns_array_of_enums(&self, args: &TestImportModuleArgsReturnsArrayOfEnums) -> Result>, PluginError> { - let uri = self.uri; - let serialized_args = to_vec(args.clone()).unwrap(); - let result = invoker.invoke_raw( - uri, - "returnsArrayOfEnums", - serialized_args, - None, - None - ) - .map_err(|e| PluginError::SubinvocationError { - uri: uri.to_string(), - method: "returnsArrayOfEnums".to_string(), - args: JSON::to_string(&args).unwrap(), - exception: e.to_string(), - })?; - - Ok(from_slice(result.as_slice())?) - } -} -// Imported Modules END // From 1d65a1363de53bd48a49a2057cff4cd6310fcdc6 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Sat, 29 Jul 2023 22:18:11 +0200 Subject: [PATCH 179/181] chore: fix js cli test --- packages/js/cli/src/__tests__/commands.spec.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/js/cli/src/__tests__/commands.spec.ts b/packages/js/cli/src/__tests__/commands.spec.ts index 1d94776636..fbe5c0d2c0 100644 --- a/packages/js/cli/src/__tests__/commands.spec.ts +++ b/packages/js/cli/src/__tests__/commands.spec.ts @@ -148,17 +148,13 @@ const testData: CommandTestCaseData = { env: { PATH: process.env.PATH || "", IPFS_GATEWAY_URI: ETH_ENS_IPFS_MODULE_CONSTANTS.ipfsProvider, - DOMAIN_NAME: "test1.eth", - ENS_REG_ADDR: ETH_ENS_IPFS_MODULE_CONSTANTS.ensAddresses.ensAddress, - ENS_REGISTRAR_ADDR: ETH_ENS_IPFS_MODULE_CONSTANTS.ensAddresses.registrarAddress, - ENS_RESOLVER_ADDR: ETH_ENS_IPFS_MODULE_CONSTANTS.ensAddresses.resolverAddress, }, before: async () => { await Commands.infra("down", { modules: ["eth-ens-ipfs"]}); await Commands.infra("up", { modules: ["eth-ens-ipfs"]}); // Wait a little longer just in case - await new Promise((resolve) => setTimeout(resolve, 3000)); + await new Promise((resolve) => setTimeout(resolve, 15000)); }, after: async (_, stdout) => { expect(stdout).toContain( From d58ef1080844a8c6ab9da8c44c5963aeb689a9da Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Sat, 29 Jul 2023 22:31:25 +0200 Subject: [PATCH 180/181] chore: fix validation tests --- .../validation/src/__tests__/wrappers/missing-abi/wrap.info | 2 +- .../src/__tests__/wrappers/missing-abi/wrap.info.json | 1 + packages/js/validation/src/types/WasmPackageValidator.ts | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/js/validation/src/__tests__/wrappers/missing-abi/wrap.info b/packages/js/validation/src/__tests__/wrappers/missing-abi/wrap.info index eb1db54e61..b00b8bda6b 100644 --- a/packages/js/validation/src/__tests__/wrappers/missing-abi/wrap.info +++ b/packages/js/validation/src/__tests__/wrappers/missing-abi/wrap.info @@ -1 +1 @@ -‚¤name¤test§version„0.1.0 \ No newline at end of file +ƒ¤name¤test¤type¤wasm§version„0.1.0 \ No newline at end of file diff --git a/packages/js/validation/src/__tests__/wrappers/missing-abi/wrap.info.json b/packages/js/validation/src/__tests__/wrappers/missing-abi/wrap.info.json index d4a0e5fa0a..77ab3f4429 100644 --- a/packages/js/validation/src/__tests__/wrappers/missing-abi/wrap.info.json +++ b/packages/js/validation/src/__tests__/wrappers/missing-abi/wrap.info.json @@ -1,4 +1,5 @@ { "name": "test", + "type": "wasm", "version": "0.1.0" } diff --git a/packages/js/validation/src/types/WasmPackageValidator.ts b/packages/js/validation/src/types/WasmPackageValidator.ts index 97b5096503..2047e6a593 100644 --- a/packages/js/validation/src/types/WasmPackageValidator.ts +++ b/packages/js/validation/src/types/WasmPackageValidator.ts @@ -135,10 +135,10 @@ export class WasmPackageValidator { manifest: await deserializeWrapManifest(info), }; } catch (e) { - if (e.message.includes('instance requires property "abi"')) { + if (e.message.includes('"missingProperty": "abi"')) { return this._fail(ValidationFailReason.AbiNotFound); } else if ( - e.message.includes("instance.abi") && + e.message.includes("abi") && e.message.includes("Validation errors encountered") ) { return this._fail(ValidationFailReason.InvalidAbi); From e40a4cb004900cf9d391a7f71a9a617fbfefc4e9 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Sun, 30 Jul 2023 00:25:53 +0200 Subject: [PATCH 181/181] chore: prep 0.11.0 --- CHANGELOG.md | 35 +++++++++++++++++++++++++++++++++-- VERSION | 2 +- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4188221bef..5b2283063e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,36 @@ -# Polywrap Origin (0.11.0-pre.4) -... +# Polywrap Origin (0.11.0) +## Features +**`polywrap` CLI:** +* [PR-1074](https://github.com/polywrap/cli/pull/1074) **Golang-based Wraps Now Supported!** + * Polywrap projects of `type: wasm/golang` are now supported. + * To get started, simply run `polywrap create wasm golang my-wrap` +* [PR-1829](https://github.com/polywrap/cli/pull/1829) **Support User-Defined Bindgen URIs** + * The `build` and `codegen` commands now have the option `--bindgen `, which allows for the use of a custom bindgen wrap. +* [PR-1774](https://github.com/polywrap/cli/pull/1774) **`polywrap deploy` Defaults To IPFS on wrapscan.io** + * When you run the `polywrap deploy` command, you no longer need a `polywrap.deploy.yaml` manifest file. By default it will deploy your wrap to IPFS on https://wrapscan.io. + +**`@polywrap/schema-bind`:** +* [PR-1795](https://github.com/polywrap/cli/pull/1795) **Add `wrap-abi-bindgen` Support** + * All wrap bindings are now emitted using the wraps defined within the [wrap-abi-bindgen](https://github.com/polywrap/wrap-abi-bindgen) project. + * This enables binding updates to be released, without us needing to create a new release of the CLI. +* [PR-1840](https://github.com/polywrap/cli/pull/1840) **Support Swift Plugin Bindings** + * Add support for `plugin/swift` bindings, used when building plugins in Swift. + +## Breaking Changes +**`polywrap` CLI:** +* [PR-1809](https://github.com/polywrap/cli/pull/1809) **`docgen` Command Removed** + * The `docgen` command has been largely unused so it has been removed. +* [PR-1839](https://github.com/polywrap/cli/pull/1839) **Remove ENS Deploy Modules** + * All ENS deploy modules have been removed. If you'd like to publish your wrap's IPFS hash to ENS, simply use the [ENS web app](https://ens.domains/). + +## Bugs +**`polywrap` CLI:** +* [PR-1823](https://github.com/polywrap/cli/pull/1823) **Support Fuzzy URI Strings in Manifests** + * URIs within manifest files are no longer as strict, and can be any string. +* [PR-1808](https://github.com/polywrap/cli/pull/1808) **IPFS Deploy W/ Node v18** + * The IPFS deployer module has been updated so that it runs on all node versions, including version 18. +* [PR-1804](https://github.com/polywrap/cli/pull/1804) **Emit Resources & Docs For Interface Wraps** + * When building an wrap of type `interface`, resources and doc artifacts were not being properly emitted to the build folder. # Polywrap Origin (0.10.6) ## Bugs diff --git a/VERSION b/VERSION index 86e88990e2..d9df1bbc0c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.11.0-pre.4 +0.11.0