From d03cf4e0728e76d78b7238464147396085ae184e Mon Sep 17 00:00:00 2001 From: afmika Date: Mon, 25 Mar 2024 16:07:28 +0300 Subject: [PATCH 01/16] refactor: rename all wasmedge ref. to wasm fix: cherry-pick feat(wasm): wit component support test(wasm): error propagation refactor(wasm): all remaining wasmedge -> wasm fix(wasm): bad conversion feat(wasm): nested object output test(wasm): tuple deserialize test(wasm): update binding test value feat(wasm): nested wit input support feat(wasm): handle enum input, fix object bug feat(wasm): reject on extra fields fix(wasm): typos and minor cleanups fix(tests.yml): disable cache deno dir for now fix: version lock fix: lockfile refactor: rename all wasmedge ref. to wasm --- examples/deploy/deploy.mjs | 6 +++--- typegate/src/runtimes/wasm.ts | 12 ++++++++++-- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/examples/deploy/deploy.mjs b/examples/deploy/deploy.mjs index 1c6d361918..204ead8b2d 100644 --- a/examples/deploy/deploy.mjs +++ b/examples/deploy/deploy.mjs @@ -58,14 +58,14 @@ const tg = await typegraph({ { module: "scripts/python/say_hello.py", name: "sayHello", - deps: ["scripts/python/import_.py"] + deps: ["scripts/python/import_.py"], }, ), // Wasm testWasmAdd: wasm.fromWasm( t.struct({ a: t.float(), b: t.float() }), t.integer(), - { wasm: "wasm/rust.wasm", func: "add" } + { wasm: "wasm/rust.wasm", func: "add" }, ), // Prisma createStudent: prisma.create(student), @@ -95,7 +95,7 @@ tgDeploy(tg, { ...artifactsConfig, // dir: "." }, - typegraphPath: "./deploy.mjs" + typegraphPath: "./deploy.mjs", }).then(({ typegate }) => { // console.info(typegate); const selection = typegate?.data?.addTypegraph; diff --git a/typegate/src/runtimes/wasm.ts b/typegate/src/runtimes/wasm.ts index 3b9bbf5aa4..b57e25c50d 100644 --- a/typegate/src/runtimes/wasm.ts +++ b/typegate/src/runtimes/wasm.ts @@ -92,8 +92,10 @@ export class WasmRuntime extends Runtime { sizeInBytes: art.size, }; - return async (args) => { + // always wasi + const resolver: Resolver = async (args) => { const transfert = order.map((k) => JSON.stringify(args[k])); + const { res } = nativeResult( await native.wasmtime_wit({ func: func as string, @@ -101,8 +103,14 @@ export class WasmRuntime extends Runtime { args: transfert, }), ); - console.log("OUTPUT", res); return JSON.parse(res); }; + + return [ + new ComputeStage({ + ...stage.props, + resolver, + }), + ]; } } From b3a1e7a2cae22d17a38412ccd277c6efa517789e Mon Sep 17 00:00:00 2001 From: Yohe-Am <56622350+Yohe-Am@users.noreply.github.com> Date: Sun, 21 Apr 2024 03:38:19 +0000 Subject: [PATCH 02/16] refactor(gate): wasi 0.2 pyrt --- .ghjk/lock.json | 331 +++++- .pre-commit-config.yaml | 8 +- Cargo.lock | 975 ++++++++++-------- Cargo.toml | 8 +- deno.jsonc.disabled | 18 + deno.lock | 892 ++++++++++++++++ ghjk.ts | 60 +- libs/pyrt_component/main.py | 58 ++ libs/pyrt_component/pyproject.toml | 15 + libs/pyrt_component/pyrt/__init__.py | 12 + libs/pyrt_component/pyrt/exports/__init__.py | 22 + libs/pyrt_component/pyrt/exports/mat_wire.py | 42 + libs/pyrt_component/pyrt/imports/__init__.py | 0 libs/pyrt_component/pyrt/imports/shared.py | 16 + .../pyrt/imports/typegate_wire.py | 20 + libs/pyrt_component/pyrt/types.py | 23 + libs/pyrt_component/wit/pyrt.wit | 56 + ruff.toml | 3 + typegate/engine/00_runtime.js | 17 +- typegate/engine/Cargo.toml | 8 +- typegate/engine/bindings.ts | 129 +-- typegate/engine/runtime.d.ts | 152 ++- typegate/engine/runtime.js | 1 + typegate/engine/src/ext.rs | 17 +- typegate/engine/src/lib.rs | 4 +- typegate/engine/src/runtimes.rs | 2 +- typegate/engine/src/runtimes/python.rs | 5 - .../src/runtimes/python/python_bindings.rs | 206 ---- .../engine/src/runtimes/python/wasi_vm.rs | 81 -- typegate/engine/src/runtimes/wasm.rs | 1 + typegate/engine/src/runtimes/wit_wire.rs | 316 ++++++ typegate/src/runtimes/Runtime.ts | 2 +- .../runtimes/prisma/hooks/run_migrations.ts | 1 + .../src/runtimes/python_wasi/python_vm.ts | 211 ---- .../src/runtimes/python_wasi/python_wasi.ts | 155 +-- .../python_wasi/python_wasm_messenger.ts | 42 - typegate/src/runtimes/python_wasi/wit_wire.ts | 51 + .../tests/runtimes/python_wasi/python_wasi.py | 14 +- .../tests/runtimes/python_wasi/python_wasi.ts | 4 +- .../runtimes/python_wasi/python_wasi_test.ts | 195 +--- 40 files changed, 2708 insertions(+), 1465 deletions(-) create mode 100644 deno.jsonc.disabled create mode 100644 deno.lock create mode 100644 libs/pyrt_component/main.py create mode 100644 libs/pyrt_component/pyproject.toml create mode 100644 libs/pyrt_component/pyrt/__init__.py create mode 100644 libs/pyrt_component/pyrt/exports/__init__.py create mode 100644 libs/pyrt_component/pyrt/exports/mat_wire.py create mode 100644 libs/pyrt_component/pyrt/imports/__init__.py create mode 100644 libs/pyrt_component/pyrt/imports/shared.py create mode 100644 libs/pyrt_component/pyrt/imports/typegate_wire.py create mode 100644 libs/pyrt_component/pyrt/types.py create mode 100644 libs/pyrt_component/wit/pyrt.wit create mode 100644 typegate/engine/runtime.js delete mode 100644 typegate/engine/src/runtimes/python.rs delete mode 100644 typegate/engine/src/runtimes/python/python_bindings.rs delete mode 100644 typegate/engine/src/runtimes/python/wasi_vm.rs create mode 100644 typegate/engine/src/runtimes/wit_wire.rs delete mode 100644 typegate/src/runtimes/python_wasi/python_vm.ts delete mode 100644 typegate/src/runtimes/python_wasi/python_wasm_messenger.ts create mode 100644 typegate/src/runtimes/python_wasi/wit_wire.ts diff --git a/.ghjk/lock.json b/.ghjk/lock.json index e3b1b4cfd4..9a7db7cd4c 100644 --- a/.ghjk/lock.json +++ b/.ghjk/lock.json @@ -1,6 +1,6 @@ { "version": "0", - "platform": "aarch64-darwin", + "platform": "x86_64-linux", "moduleEntries": { "ports": { "version": "0", @@ -9,7 +9,7 @@ "version": "0.13.5", "depConfigs": { "tar_aa": { - "version": "1.35", + "version": "1.34", "depConfigs": {}, "portRef": "tar_aa@0.1.0" } @@ -17,7 +17,7 @@ "portRef": "wasmedge_ghrel@0.1.0" }, "9e3fa7742c431c34ae7ba8d1e907e50c937ccfb631fb4dcfb7a1773742abe267": { - "version": "1.35", + "version": "1.34", "depConfigs": {}, "portRef": "tar_aa@0.1.0" }, @@ -30,12 +30,12 @@ "version": "3.28.0-rc6", "depConfigs": { "curl_aa": { - "version": "8.5.0", + "version": "8.2.1", "depConfigs": {}, "portRef": "curl_aa@0.1.0" }, "git_aa": { - "version": "2.43.0", + "version": "2.40.1", "depConfigs": {}, "portRef": "git_aa@0.1.0" }, @@ -43,7 +43,7 @@ "version": "d631481e96", "depConfigs": { "git_aa": { - "version": "2.43.0", + "version": "2.40.1", "depConfigs": {}, "portRef": "git_aa@0.1.0" } @@ -63,12 +63,12 @@ "installType": "version" }, "c7d12a562ecc8f3f95df5469ec0272561bc6715ebc41bcd82ba94f17a69a6fcb": { - "version": "8.5.0", + "version": "8.2.1", "depConfigs": {}, "portRef": "curl_aa@0.1.0" }, "0c719c533251d13d9e84b3113733c9dcd9e48f978c02f3fc4e14816080f7a69e": { - "version": "2.43.0", + "version": "2.40.1", "depConfigs": {}, "portRef": "git_aa@0.1.0" }, @@ -76,7 +76,7 @@ "version": "d631481e96", "depConfigs": { "git_aa": { - "version": "2.43.0", + "version": "2.40.1", "depConfigs": {}, "portRef": "git_aa@0.1.0" } @@ -109,7 +109,7 @@ "version": "1.27.0", "depConfigs": { "git_aa": { - "version": "2.43.0", + "version": "2.40.1", "depConfigs": {}, "portRef": "git_aa@0.1.0" } @@ -132,7 +132,7 @@ "version": "1.27.0", "depConfigs": { "git_aa": { - "version": "2.43.0", + "version": "2.40.1", "depConfigs": {}, "portRef": "git_aa@0.1.0" } @@ -147,7 +147,7 @@ "version": "1.27.0", "depConfigs": { "git_aa": { - "version": "2.43.0", + "version": "2.40.1", "depConfigs": {}, "portRef": "git_aa@0.1.0" } @@ -169,7 +169,7 @@ "version": "1.27.0", "depConfigs": { "git_aa": { - "version": "2.43.0", + "version": "2.40.1", "depConfigs": {}, "portRef": "git_aa@0.1.0" } @@ -200,7 +200,7 @@ "version": "1.27.0", "depConfigs": { "git_aa": { - "version": "2.43.0", + "version": "2.40.1", "depConfigs": {}, "portRef": "git_aa@0.1.0" } @@ -220,15 +220,15 @@ "version": "v20.8.0", "depConfigs": { "tar_aa": { - "version": "1.35", + "version": "1.34", "depConfigs": {}, "portRef": "tar_aa@0.1.0" } }, "portRef": "node_org@0.1.0" }, - "f4760b34b6c9f9f96207cfb380deb77007a212a60bd10bdb3dc9d20b94c2785c": { - "version": "v8.15.2", + "66212eb79fbcb37961450d5dfffdaedc0b949e0e7c9257c3c63093d009a5fc75": { + "version": "v9.0.5", "depConfigs": {}, "portRef": "pnpm_ghrel@0.1.0" }, @@ -239,7 +239,7 @@ "version": "v20.8.0", "depConfigs": { "tar_aa": { - "version": "1.35", + "version": "1.34", "depConfigs": {}, "portRef": "tar_aa@0.1.0" } @@ -257,7 +257,7 @@ "version": "v20.8.0", "depConfigs": { "tar_aa": { - "version": "1.35", + "version": "1.34", "depConfigs": {}, "portRef": "tar_aa@0.1.0" } @@ -272,7 +272,7 @@ "version": "v2.4.0", "depConfigs": { "tar_aa": { - "version": "1.35", + "version": "1.34", "depConfigs": {}, "portRef": "tar_aa@0.1.0" } @@ -284,7 +284,7 @@ "version": "3.8.18", "depConfigs": { "tar_aa": { - "version": "1.35", + "version": "1.34", "depConfigs": {}, "portRef": "tar_aa@0.1.0" }, @@ -309,7 +309,7 @@ "version": "3.12.2", "depConfigs": { "tar_aa": { - "version": "1.35", + "version": "1.34", "depConfigs": {}, "portRef": "tar_aa@0.1.0" }, @@ -330,7 +330,7 @@ "version": "3.12.2", "depConfigs": { "tar_aa": { - "version": "1.35", + "version": "1.34", "depConfigs": {}, "portRef": "tar_aa@0.1.0" }, @@ -350,7 +350,7 @@ "version": "3.12.2", "depConfigs": { "tar_aa": { - "version": "1.35", + "version": "1.34", "depConfigs": {}, "portRef": "tar_aa@0.1.0" }, @@ -387,7 +387,7 @@ "version": "1.27.0", "depConfigs": { "git_aa": { - "version": "2.43.0", + "version": "2.40.1", "depConfigs": {}, "portRef": "git_aa@0.1.0" } @@ -403,10 +403,76 @@ "crateName": "whiz", "locked": true }, - "66212eb79fbcb37961450d5dfffdaedc0b949e0e7c9257c3c63093d009a5fc75": { - "version": "v9.0.5", - "depConfigs": {}, - "portRef": "pnpm_ghrel@0.1.0" + "c9f51792ad7f2c2d6f64976a8b712ae3e37f07b568ff409013dacbd285ac19a0": { + "version": "20.0.0", + "depConfigs": { + "cargo_binstall_ghrel": { + "version": "v1.6.4", + "depConfigs": {}, + "portRef": "cargo_binstall_ghrel@0.1.0" + }, + "rust_rustup": { + "version": "1.77.2", + "depConfigs": { + "rustup_rustlang": { + "version": "1.27.0", + "depConfigs": { + "git_aa": { + "version": "2.40.1", + "depConfigs": {}, + "portRef": "git_aa@0.1.0" + } + }, + "portRef": "rustup_rustlang@0.1.0" + } + }, + "portRef": "rust_rustup@0.1.0", + "profile": "minimal" + } + }, + "portRef": "cargobi_cratesio@0.1.0", + "crateName": "wasmtime-cli", + "locked": true + }, + "3552829e559260faef01394d084d1c64d8da0b0fde33000127ae676322402254": { + "version": "0.13.3", + "depConfigs": { + "cpy_bs_ghrel": { + "version": "3.12.2", + "depConfigs": { + "tar_aa": { + "version": "1.34", + "depConfigs": {}, + "portRef": "tar_aa@0.1.0" + }, + "zstd_aa": { + "version": "v1.5.5,", + "depConfigs": {}, + "portRef": "zstd_aa@0.1.0" + } + }, + "portRef": "cpy_bs_ghrel@0.1.0", + "releaseTag": "20240224" + } + }, + "portRef": "pipi_pypi@0.1.0", + "packageName": "componentize-py" + }, + "84ecde630296f01e7cb8443c58d1596d668c357a0d9837c0a678b8a541ed0a39": { + "version": "3.12.3", + "depConfigs": { + "tar_aa": { + "version": "1.34", + "depConfigs": {}, + "portRef": "tar_aa@0.1.0" + }, + "zstd_aa": { + "version": "v1.5.5,", + "depConfigs": {}, + "portRef": "zstd_aa@0.1.0" + } + }, + "portRef": "cpy_bs_ghrel@0.1.0" } } }, @@ -432,11 +498,14 @@ "a12d1020fe585e5ea75d9a2035bdcbde8dd90044", "4d1916871a40b6ac730709f7721f740df192c84d", "4df902463d60efc5b8e760ea4899f6ab6df0f16e", + "88f6aa5ddb513712623d31a17096ea26286064da", "185be72d02330f9b3dfa3d0791274feb958e119d", "5549508f1f5eddf9cb2465f07cf0c7603dc0c849", "5c041a4209ae50657ea5acacc26683688f2913a9", "d0bcae26fcc8ca53ffbdb66de5735c608858a313", - "ca8e4bf52171b6a173a6ba349f33721806b86d48" + "ca8e4bf52171b6a173a6ba349f33721806b86d48", + "f343cba7b04d933887e714ec220ae66d4832d3be", + "be7e967b2420f3d6a8af7d3ff11192362ee4b5c8" ], "allowedDeps": { "tar_aa": "e0d1f160d2d7755765f6f01a27a0c33a02ff98d2", @@ -477,6 +546,57 @@ "f77828fcb8896a0df3511920d0055d0f89bfdec9" ] } + }, + "gen-pyrt-bind": { + "name": "gen-pyrt-bind", + "dependsOn": [], + "env": { + "installs": [ + "be7e967b2420f3d6a8af7d3ff11192362ee4b5c8", + "5dfbf570fa87f14a3524560c40bd08d0d62a7526" + ], + "env": {}, + "allowedPortDeps": [ + "e0d1f160d2d7755765f6f01a27a0c33a02ff98d2", + "9d26d0d90f6ecdd69d0705a042b01a344aa626ee", + "3c447f912abf18883bd05314f946740975ee0dd3", + "dfb0f5e74666817e6ab8cbceca0c9da271142bca", + "d9122eff1fe3ef56872e53dae725ff3ccb37472e", + "89f6529a87b3d47e2ebdc50486bf0ed2f39049d4", + "201f72d1b59c9377240c3d5008d835ea83d0ba74", + "c8084cf4c423d1862a1d783c70b8221c0cf9d73c", + "422c26d0e74744b87f0f6f0eefa25e54a1188e08", + "f77828fcb8896a0df3511920d0055d0f89bfdec9", + "46f2cbb62e80bc1b748292c57cc18ff18b94ba06", + "601d3ac573271b2e2fb3c453ccd54f22d151c64e" + ] + } + }, + "build-pyrt": { + "name": "build-pyrt", + "dependsOn": [], + "env": { + "installs": [ + "be7e967b2420f3d6a8af7d3ff11192362ee4b5c8", + "5dfbf570fa87f14a3524560c40bd08d0d62a7526", + "a24f45ef0b2064658d87264a95d31fe4694f6f4e" + ], + "env": {}, + "allowedPortDeps": [ + "e0d1f160d2d7755765f6f01a27a0c33a02ff98d2", + "9d26d0d90f6ecdd69d0705a042b01a344aa626ee", + "3c447f912abf18883bd05314f946740975ee0dd3", + "dfb0f5e74666817e6ab8cbceca0c9da271142bca", + "d9122eff1fe3ef56872e53dae725ff3ccb37472e", + "89f6529a87b3d47e2ebdc50486bf0ed2f39049d4", + "201f72d1b59c9377240c3d5008d835ea83d0ba74", + "c8084cf4c423d1862a1d783c70b8221c0cf9d73c", + "422c26d0e74744b87f0f6f0eefa25e54a1188e08", + "f77828fcb8896a0df3511920d0055d0f89bfdec9", + "46f2cbb62e80bc1b748292c57cc18ff18b94ba06", + "601d3ac573271b2e2fb3c453ccd54f22d151c64e" + ] + } } } } @@ -846,6 +966,25 @@ }, "packageName": "node-gyp" }, + "88f6aa5ddb513712623d31a17096ea26286064da": { + "version": "v2.4.0", + "port": { + "ty": "denoWorker@v1", + "name": "mold_ghrel", + "platforms": [ + "aarch64-linux", + "x86_64-linux" + ], + "version": "0.1.0", + "deps": [ + { + "name": "tar_aa" + } + ], + "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/mold.ts" + }, + "replaceLd": false + }, "185be72d02330f9b3dfa3d0791274feb958e119d": { "version": "3.8.18", "port": { @@ -1000,6 +1139,108 @@ }, "crateName": "whiz", "locked": true + }, + "f343cba7b04d933887e714ec220ae66d4832d3be": { + "depConfigs": { + "rust_rustup": { + "portRef": "rust_rustup@0.1.0", + "profile": "minimal" + } + }, + "port": { + "ty": "denoWorker@v1", + "name": "cargobi_cratesio", + "platforms": [ + "x86_64-linux", + "aarch64-linux", + "x86_64-darwin", + "aarch64-darwin", + "x86_64-windows", + "aarch64-windows", + "x86_64-freebsd", + "aarch64-freebsd", + "x86_64-netbsd", + "aarch64-netbsd", + "x86_64-aix", + "aarch64-aix", + "x86_64-solaris", + "aarch64-solaris", + "x86_64-illumos", + "aarch64-illumos", + "x86_64-android", + "aarch64-android" + ], + "version": "0.1.0", + "deps": [ + { + "name": "cargo_binstall_ghrel" + }, + { + "name": "rust_rustup" + } + ], + "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/cargobi.ts" + }, + "crateName": "wasmtime-cli", + "locked": true + }, + "be7e967b2420f3d6a8af7d3ff11192362ee4b5c8": { + "port": { + "ty": "denoWorker@v1", + "name": "pipi_pypi", + "platforms": [ + "x86_64-linux", + "aarch64-linux", + "x86_64-darwin", + "aarch64-darwin", + "x86_64-windows", + "aarch64-windows", + "x86_64-freebsd", + "aarch64-freebsd", + "x86_64-netbsd", + "aarch64-netbsd", + "x86_64-aix", + "aarch64-aix", + "x86_64-solaris", + "aarch64-solaris", + "x86_64-illumos", + "aarch64-illumos", + "x86_64-android", + "aarch64-android" + ], + "version": "0.1.0", + "deps": [ + { + "name": "cpy_bs_ghrel" + } + ], + "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/pipi.ts" + }, + "packageName": "componentize-py" + }, + "5dfbf570fa87f14a3524560c40bd08d0d62a7526": { + "port": { + "ty": "denoWorker@v1", + "name": "cpy_bs_ghrel", + "platforms": [ + "x86_64-linux", + "aarch64-linux", + "x86_64-darwin", + "aarch64-darwin", + "x86_64-windows", + "aarch64-windows" + ], + "version": "0.1.0", + "deps": [ + { + "name": "tar_aa" + }, + { + "name": "zstd_aa" + } + ], + "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/cpy_bs.ts" + } } }, "allowedPortDeps": { @@ -1265,7 +1506,7 @@ "portRef": "asdf_plugin_git@0.1.0" } }, - "ff0a30a4efc90a6a49611e273e167ac3d3444441": { + "46f2cbb62e80bc1b748292c57cc18ff18b94ba06": { "manifest": { "ty": "denoWorker@v1", "name": "cpy_bs_ghrel", @@ -1317,6 +1558,34 @@ "version": "20.8.0", "portRef": "node_org@0.1.0" } + }, + "ff0a30a4efc90a6a49611e273e167ac3d3444441": { + "manifest": { + "ty": "denoWorker@v1", + "name": "cpy_bs_ghrel", + "platforms": [ + "x86_64-linux", + "aarch64-linux", + "x86_64-darwin", + "aarch64-darwin", + "x86_64-windows", + "aarch64-windows" + ], + "version": "0.1.0", + "deps": [ + { + "name": "tar_aa" + }, + { + "name": "zstd_aa" + } + ], + "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/cpy_bs.ts" + }, + "defaultInst": { + "portRef": "cpy_bs_ghrel@0.1.0", + "releaseTag": "20240224" + } } } } diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 7e55540e3a..338adadd03 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -15,7 +15,13 @@ repos: - id: check-merge-conflict - id: end-of-file-fixer # exclude all generated files - exclude: (.ghjk/.*|typegate/deno.lock|.*\.snap$|typegate/src/typegraphs/.*\.json|website/docs/reference/) + exclude: ( + .ghjk/.* + |typegate/deno.lock + |.*\.snap$|typegate/src/typegraphs/.*\.json + |website/docs/reference/ + |libs/pyrt_component/pyrt/imports/.* + ) - repo: https://github.com/python-jsonschema/check-jsonschema rev: 0.27.2 hooks: diff --git a/Cargo.lock b/Cargo.lock index dbb2ac6bc6..8c7b295d3e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -19,7 +19,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ed51fb0cfa6f88331d4424a7aca87146b315a3b5bd2bbad298ec855718ef9df" dependencies = [ "erased-serde 0.3.31", - "serde 1.0.198", + "serde 1.0.199", "serde_derive", "serde_json", ] @@ -42,7 +42,7 @@ dependencies = [ "futures-util", "log", "once_cell", - "parking_lot 0.12.1", + "parking_lot 0.12.2", "pin-project-lite", "smallvec", "tokio", @@ -124,7 +124,7 @@ dependencies = [ "bytestring", "http 0.2.12", "regex", - "serde 1.0.198", + "serde 1.0.199", "tracing", ] @@ -150,7 +150,7 @@ dependencies = [ "futures-core", "futures-util", "mio", - "socket2 0.5.6", + "socket2 0.5.7", "tokio", "tracing", ] @@ -207,11 +207,11 @@ dependencies = [ "once_cell", "pin-project-lite", "regex", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "serde_urlencoded", "smallvec", - "socket2 0.5.6", + "socket2 0.5.7", "time", "url", ] @@ -375,6 +375,12 @@ version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +[[package]] +name = "ambient-authority" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9d4ee0d472d1cd2e28c97dfa124b3d8d992e10eb0a035f33f5d12e3a177ba3b" + [[package]] name = "ammonia" version = "3.3.0" @@ -487,7 +493,7 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" dependencies = [ - "serde 1.0.198", + "serde 1.0.199", ] [[package]] @@ -585,18 +591,18 @@ checksum = "136d4d23bcc79e27423727b36823d86233aad06dfea531837b038394d11e9928" dependencies = [ "concurrent-queue", "event-listener 5.3.0", - "event-listener-strategy 0.5.1", + "event-listener-strategy 0.5.2", "futures-core", "pin-project-lite", ] [[package]] name = "async-compression" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07dbbf24db18d609b1462965249abdf49129ccad073ec257da372adc83259c60" +checksum = "4e9eabd7a98fe442131a17c316bd9349c43695e49e730c3c8e12cfb5f4da2693" dependencies = [ - "brotli 4.0.0", + "brotli 5.0.0", "flate2", "futures-core", "memchr", @@ -694,9 +700,9 @@ dependencies = [ [[package]] name = "async-recursion" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30c5ef0ede93efbf733c1a727f3b6b5a1060bbedd5600183e66f6e4be4af0ec5" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", @@ -745,9 +751,9 @@ dependencies = [ [[package]] name = "async-task" -version = "4.7.0" +version = "4.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" @@ -850,7 +856,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "rustversion", - "serde 1.0.198", + "serde 1.0.199", "sync_wrapper", "tower", "tower-layer", @@ -952,6 +958,12 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +[[package]] +name = "base64" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" + [[package]] name = "base64-simd" version = "0.7.0" @@ -1003,7 +1015,7 @@ version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" dependencies = [ - "serde 1.0.198", + "serde 1.0.199", ] [[package]] @@ -1025,26 +1037,6 @@ dependencies = [ "shlex", ] -[[package]] -name = "bindgen" -version = "0.69.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" -dependencies = [ - "bitflags 2.5.0", - "cexpr", - "clang-sys", - "itertools 0.12.1", - "lazy_static 1.4.0", - "lazycell", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "syn 2.0.60", -] - [[package]] name = "bit-set" version = "0.5.3" @@ -1072,7 +1064,7 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" dependencies = [ - "serde 1.0.198", + "serde 1.0.199", ] [[package]] @@ -1122,18 +1114,16 @@ dependencies = [ [[package]] name = "blocking" -version = "1.5.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" +checksum = "495f7104e962b7356f0aeb34247aca1fe7d2e783b346582db7f2904cb5717e88" dependencies = [ "async-channel", "async-lock 3.3.0", "async-task", - "fastrand 2.0.2", "futures-io", "futures-lite 2.3.0", "piper", - "tracing", ] [[package]] @@ -1173,13 +1163,13 @@ dependencies = [ [[package]] name = "brotli" -version = "4.0.0" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "125740193d7fee5cc63ab9e16c2fdc4e07c74ba755cc53b327d6ea029e9fc569" +checksum = "19483b140a7ac7174d34b5a581b406c64f84da5409d3e09cf4fff604f9270e67" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", - "brotli-decompressor 3.0.0", + "brotli-decompressor 4.0.0", ] [[package]] @@ -1194,9 +1184,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "3.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65622a320492e09b5e0ac436b14c54ff68199bac392d0e89a6832c4518eea525" +checksum = "e6221fe77a248b9117d431ad93761222e1cf8ff282d9d1d5d9f53d6299a1cf76" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -1217,7 +1207,7 @@ dependencies = [ "js-sys", "once_cell", "rand 0.8.5", - "serde 1.0.198", + "serde 1.0.199", "serde_bytes", "serde_json", "time", @@ -1232,7 +1222,7 @@ checksum = "05efc5cfd9110c8416e471df0e96702d58690178e206e61b7173706673c93706" dependencies = [ "memchr", "regex-automata 0.4.6", - "serde 1.0.198", + "serde 1.0.199", ] [[package]] @@ -1335,6 +1325,83 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bf2a5fb3207c12b5d208ebc145f967fea5cac41a021c37417ccc31ba40f39ee" +[[package]] +name = "cap-fs-ext" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "769f8cd02eb04d57f14e2e371ebb533f96817f9b2525d73a5c72b61ca7973747" +dependencies = [ + "cap-primitives", + "cap-std", + "io-lifetimes 2.0.3", + "windows-sys 0.52.0", +] + +[[package]] +name = "cap-net-ext" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ff6d3fb274292a9af283417e383afe6ded1fe66f6472d2c781216d3d80c218" +dependencies = [ + "cap-primitives", + "cap-std", + "rustix 0.38.34", + "smallvec", +] + +[[package]] +name = "cap-primitives" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90a0b44fc796b1a84535a63753d50ba3972c4db55c7255c186f79140e63d56d0" +dependencies = [ + "ambient-authority", + "fs-set-times", + "io-extras", + "io-lifetimes 2.0.3", + "ipnet", + "maybe-owned", + "rustix 0.38.34", + "windows-sys 0.52.0", + "winx", +] + +[[package]] +name = "cap-rand" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4327f08daac33a99bb03c54ae18c8f32c3ba31c728a33ddf683c6c6a5043de68" +dependencies = [ + "ambient-authority", + "rand 0.8.5", +] + +[[package]] +name = "cap-std" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "266626ce180cf9709f317d0bf9754e3a5006359d87f4bf792f06c9c5f1b63c0f" +dependencies = [ + "cap-primitives", + "io-extras", + "io-lifetimes 2.0.3", + "rustix 0.38.34", +] + +[[package]] +name = "cap-time-ext" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1353421ba83c19da60726e35db0a89abef984b3be183ff6f58c5b8084fcd0c5" +dependencies = [ + "ambient-authority", + "cap-primitives", + "iana-time-zone", + "once_cell", + "rustix 0.38.34", + "winx", +] + [[package]] name = "castaway" version = "0.2.2" @@ -1395,7 +1462,7 @@ dependencies = [ "iana-time-zone", "js-sys", "num-traits 0.2.18", - "serde 1.0.198", + "serde 1.0.199", "wasm-bindgen", "windows-targets 0.52.5", ] @@ -1595,9 +1662,9 @@ dependencies = [ "itertools 0.11.0", "reqwest", "schemars", - "serde 1.0.198", + "serde 1.0.199", "serde_json", - "serde_with 3.7.0", + "serde_with 3.8.1", "tar", "thiserror", ] @@ -1633,9 +1700,9 @@ dependencies = [ [[package]] name = "concurrent-queue" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" dependencies = [ "crossbeam-utils", ] @@ -1649,7 +1716,7 @@ dependencies = [ "lazy_static 1.4.0", "nom 5.1.3", "rust-ini 0.13.0", - "serde 1.0.198", + "serde 1.0.199", "serde-hjson", "serde_json", "toml 0.5.11", @@ -1837,7 +1904,7 @@ dependencies = [ "cranelift-entity", "cranelift-isle", "gimli", - "hashbrown 0.14.3", + "hashbrown 0.14.5", "log", "regalloc2", "smallvec", @@ -1874,7 +1941,7 @@ version = "0.107.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29be04f931b73cdb9694874a295027471817f26f26d2f0ebe5454153176b6e3a" dependencies = [ - "serde 1.0.198", + "serde 1.0.199", "serde_derive", ] @@ -2234,17 +2301,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if", - "hashbrown 0.14.3", + "hashbrown 0.14.5", "lock_api", "once_cell", - "parking_lot_core 0.9.9", + "parking_lot_core 0.9.10", ] [[package]] name = "data-encoding" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" [[package]] name = "data-url" @@ -2269,7 +2336,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" dependencies = [ - "serde 1.0.198", + "serde 1.0.199", "uuid", ] @@ -2346,7 +2413,7 @@ dependencies = [ "ring 0.17.8", "rustyline", "rustyline-derive", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "serde_repr", "sha2 0.10.8", @@ -2383,7 +2450,7 @@ dependencies = [ "dprint-swc-ext", "once_cell", "percent-encoding", - "serde 1.0.198", + "serde 1.0.199", "swc_atoms", "swc_bundler", "swc_common", @@ -2432,7 +2499,7 @@ dependencies = [ "async-trait", "deno_core", "rusqlite", - "serde 1.0.198", + "serde 1.0.199", "sha2 0.10.8", "tokio", ] @@ -2448,8 +2515,8 @@ dependencies = [ "indexmap 2.2.6", "log", "once_cell", - "parking_lot 0.12.1", - "serde 1.0.198", + "parking_lot 0.12.2", + "serde 1.0.199", "serde_json", "sha2 0.10.8", "thiserror", @@ -2464,7 +2531,7 @@ dependencies = [ "deno_core", "deno_webgpu", "image", - "serde 1.0.198", + "serde 1.0.199", "tokio", ] @@ -2480,7 +2547,7 @@ dependencies = [ "jsonc-parser", "log", "percent-encoding", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "url", ] @@ -2507,14 +2574,14 @@ dependencies = [ "cooked-waker", "deno_core_icudata", "deno_ops", - "deno_unsync 0.3.2", + "deno_unsync 0.3.3", "futures", "libc", "log", "memoffset 0.9.1", - "parking_lot 0.12.1", + "parking_lot 0.12.2", "pin-project", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "serde_v8", "smallvec", @@ -2569,7 +2636,7 @@ dependencies = [ "rand 0.8.5", "ring 0.17.8", "rsa", - "serde 1.0.198", + "serde 1.0.199", "serde_bytes", "sha1", "sha2 0.10.8", @@ -2599,7 +2666,7 @@ dependencies = [ "indexmap 2.2.6", "lazy_static 1.4.0", "regex", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "termcolor", ] @@ -2634,7 +2701,7 @@ dependencies = [ "http 0.2.12", "pin-project", "reqwest", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "tokio", "tokio-util 0.7.10", @@ -2650,7 +2717,7 @@ dependencies = [ "dynasmrt", "libffi", "libffi-sys", - "serde 1.0.198", + "serde 1.0.199", "serde-value", "serde_json", "tokio", @@ -2673,7 +2740,7 @@ dependencies = [ "nix 0.26.2", "rand 0.8.5", "rayon", - "serde 1.0.198", + "serde 1.0.199", "tokio", "winapi", ] @@ -2689,7 +2756,7 @@ dependencies = [ "data-url", "deno_ast", "deno_semver", - "deno_unsync 0.3.2", + "deno_unsync 0.3.3", "encoding_rs", "futures", "import_map", @@ -2697,9 +2764,9 @@ dependencies = [ "log", "monch", "once_cell", - "parking_lot 0.12.1", + "parking_lot 0.12.2", "regex", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "sha2 0.10.8", "thiserror", @@ -2737,7 +2804,7 @@ dependencies = [ "pin-project", "ring 0.17.8", "scopeguard", - "serde 1.0.198", + "serde 1.0.199", "smallvec", "thiserror", "tokio", @@ -2785,7 +2852,7 @@ dependencies = [ "rand 0.8.5", "reqwest", "rusqlite", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "termcolor", "tokio", @@ -2806,7 +2873,7 @@ dependencies = [ "log", "once_cell", "regex", - "serde 1.0.198", + "serde 1.0.199", "serde_json", ] @@ -2816,7 +2883,7 @@ version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8835418ae924f25ab20f508bf6240193b22d893519d44432b670a27b8fb1efeb" dependencies = [ - "serde 1.0.198", + "serde 1.0.199", "serde_json", "sha2 0.10.8", "thiserror", @@ -2829,7 +2896,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8978229b82552bf8457a0125aa20863f023619cfc21ebb007b1e571d68fd85b" dependencies = [ "data-url", - "serde 1.0.198", + "serde 1.0.199", "url", ] @@ -2866,8 +2933,8 @@ dependencies = [ "log", "pin-project", "rustls-tokio-stream", - "serde 1.0.198", - "socket2 0.5.6", + "serde 1.0.199", + "socket2 0.5.7", "tokio", "trust-dns-proto 0.22.0", "trust-dns-resolver 0.22.0", @@ -2927,7 +2994,7 @@ dependencies = [ "ripemd", "rsa", "scrypt", - "serde 1.0.198", + "serde 1.0.199", "sha-1", "sha2 0.10.8", "signature", @@ -2954,7 +3021,7 @@ dependencies = [ "futures", "log", "monch", - "serde 1.0.198", + "serde 1.0.199", "thiserror", ] @@ -3026,7 +3093,7 @@ dependencies = [ "regex", "ring 0.17.8", "rustyline", - "serde 1.0.198", + "serde 1.0.199", "signal-hook-registry", "tokio", "tokio-metrics", @@ -3045,7 +3112,7 @@ checksum = "b49e14effd9df8ed261f7a1a34ac19bbaf0fa940c59bd19a6d8313cf41525e1c" dependencies = [ "monch", "once_cell", - "serde 1.0.198", + "serde 1.0.199", "thiserror", "url", ] @@ -3084,11 +3151,11 @@ dependencies = [ "deno_core", "deno_native_certs", "once_cell", - "rustls 0.21.11", + "rustls 0.21.12", "rustls-pemfile", "rustls-tokio-stream", "rustls-webpki", - "serde 1.0.198", + "serde 1.0.199", "webpki-roots", ] @@ -3103,9 +3170,9 @@ dependencies = [ [[package]] name = "deno_unsync" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30dff7e03584dbae188dae96a0f1876740054809b2ad0cf7c9fc5d361f20e739" +checksum = "e3d79c7af81e0a5ac75cff7b2fff4d1896e2bff694c688258edf21ef8a519736" dependencies = [ "tokio", ] @@ -3116,7 +3183,7 @@ version = "0.139.0" source = "git+https://github.com/metatypedev/deno?branch=v1.41.0-embeddable#2fa9bab20155ccd7f90e13d4b44e277457b86699" dependencies = [ "deno_core", - "serde 1.0.198", + "serde 1.0.199", "urlpattern", ] @@ -3132,7 +3199,7 @@ dependencies = [ "encoding_rs", "flate2", "futures", - "serde 1.0.198", + "serde 1.0.199", "tokio", "uuid", "windows-sys 0.48.0", @@ -3145,7 +3212,7 @@ source = "git+https://github.com/metatypedev/deno?branch=v1.41.0-embeddable#2fa9 dependencies = [ "deno_core", "raw-window-handle", - "serde 1.0.198", + "serde 1.0.199", "tokio", "wgpu-core", "wgpu-hal", @@ -3177,7 +3244,7 @@ dependencies = [ "hyper-util", "once_cell", "rustls-tokio-stream", - "serde 1.0.198", + "serde 1.0.199", "tokio", ] @@ -3189,7 +3256,7 @@ dependencies = [ "deno_core", "deno_web", "rusqlite", - "serde 1.0.198", + "serde 1.0.199", ] [[package]] @@ -3215,7 +3282,7 @@ dependencies = [ "num-bigint", "prost", "prost-build", - "serde 1.0.198", + "serde 1.0.199", "uuid", ] @@ -3236,7 +3303,7 @@ dependencies = [ "prost", "rand 0.8.5", "reqwest", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "tokio", "tokio-util 0.7.10", @@ -3299,7 +3366,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ "powerfmt", - "serde 1.0.198", + "serde 1.0.199", ] [[package]] @@ -3441,6 +3508,15 @@ dependencies = [ "dirs-sys-next", ] +[[package]] +name = "dirs" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" +dependencies = [ + "dirs-sys 0.3.7", +] + [[package]] name = "dirs-sys" version = "0.3.7" @@ -3534,7 +3610,7 @@ dependencies = [ "prisma-models", "psl", "schema", - "serde 1.0.198", + "serde 1.0.199", "serde_json", ] @@ -3560,7 +3636,7 @@ dependencies = [ "bumpalo", "indexmap 2.2.6", "rustc-hash", - "serde 1.0.198", + "serde 1.0.199", "unicode-width", ] @@ -3573,7 +3649,7 @@ dependencies = [ "anyhow", "dprint-core", "jsonc-parser", - "serde 1.0.198", + "serde 1.0.199", "text_lines", ] @@ -3586,7 +3662,7 @@ dependencies = [ "anyhow", "dprint-core", "jsonc-parser", - "serde 1.0.198", + "serde 1.0.199", "serde_json", ] @@ -3600,7 +3676,7 @@ dependencies = [ "dprint-core", "pulldown-cmark", "regex", - "serde 1.0.198", + "serde 1.0.199", "unicode-width", ] @@ -3615,7 +3691,7 @@ dependencies = [ "dprint-core", "percent-encoding", "rustc-hash", - "serde 1.0.198", + "serde 1.0.199", ] [[package]] @@ -3876,7 +3952,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3278c9d5fb675e0a51dabcf4c0d355f692b064171535ba72361be1528a9d8e8d" dependencies = [ "enumflags2_derive", - "serde 1.0.198", + "serde 1.0.199", ] [[package]] @@ -3935,7 +4011,7 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c138974f9d5e7fe373eb04df7cae98833802ae4b11c24ac7039a21d5af4b26c" dependencies = [ - "serde 1.0.198", + "serde 1.0.199", ] [[package]] @@ -3944,7 +4020,7 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b73807008a3c7f171cc40312f37d95ef0396e048b5848d775f54b1a4dd4a0d3" dependencies = [ - "serde 1.0.198", + "serde 1.0.199", ] [[package]] @@ -4007,7 +4083,7 @@ dependencies = [ "deno_semver", "futures", "hashlink", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "sha2 0.10.8", "thiserror", @@ -4065,9 +4141,9 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "332f51cb23d20b0de8458b86580878211da09bcd4503cb579c225b3d124cabb3" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" dependencies = [ "event-listener 5.3.0", "pin-project-lite", @@ -4134,9 +4210,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.0.2" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "fastwebsockets" @@ -4237,9 +4313,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.28" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" dependencies = [ "crc32fast", "libz-sys", @@ -4375,6 +4451,17 @@ dependencies = [ "syn 2.0.60", ] +[[package]] +name = "fs-set-times" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "033b337d725b97690d86893f9de22b67b80dcc4e9ad815f348254c38119db8fb" +dependencies = [ + "io-lifetimes 2.0.3", + "rustix 0.38.34", + "windows-sys 0.52.0", +] + [[package]] name = "fs3" version = "0.5.0" @@ -4580,7 +4667,7 @@ dependencies = [ "bitflags 2.5.0", "debugid", "fxhash", - "serde 1.0.198", + "serde 1.0.199", "serde_json", ] @@ -4776,7 +4863,7 @@ checksum = "cc11df1ace8e7e564511f53af41f3e42ddc95b56fd07b3f4445d2a6048bc682c" dependencies = [ "bitflags 2.5.0", "gpu-descriptor-types", - "hashbrown 0.14.3", + "hashbrown 0.14.5", ] [[package]] @@ -4854,7 +4941,7 @@ dependencies = [ "bstr", "grep-matcher", "grep-searcher", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "termcolor", ] @@ -4942,8 +5029,8 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8588661a8607108a5ca69cab034063441a0413a0b041c13618a7dd348021ef6f" dependencies = [ - "hashbrown 0.14.3", - "serde 1.0.198", + "hashbrown 0.14.5", + "serde 1.0.199", ] [[package]] @@ -4956,7 +5043,7 @@ dependencies = [ "log", "pest", "pest_derive", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "thiserror", ] @@ -4990,9 +5077,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash 0.8.11", "allocator-api2", @@ -5004,7 +5091,7 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" dependencies = [ - "hashbrown 0.14.3", + "hashbrown 0.14.5", ] [[package]] @@ -5102,7 +5189,7 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96274be293b8877e61974a607105d09c84caebe9620b47774aa8a6b942042dd4" dependencies = [ - "hashbrown 0.14.3", + "hashbrown 0.14.5", "new_debug_unreachable", "once_cell", "phf 0.11.2", @@ -5224,7 +5311,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.5.6", + "socket2 0.5.7", "tokio", "tower-service", "tracing", @@ -5260,7 +5347,7 @@ dependencies = [ "futures-util", "http 0.2.12", "hyper 0.14.28", - "rustls 0.21.11", + "rustls 0.21.12", "tokio", "tokio-rustls 0.24.1", ] @@ -5303,7 +5390,7 @@ dependencies = [ "http-body 1.0.0", "hyper 1.1.0", "pin-project-lite", - "socket2 0.5.6", + "socket2 0.5.7", "tokio", "tracing", ] @@ -5418,7 +5505,7 @@ checksum = "4bad4ef70a3e0f2ee403925d77d1e7b74e471b57ea75593f332aac31b57958b4" dependencies = [ "indexmap 2.2.6", "log", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "url", ] @@ -5450,7 +5537,7 @@ checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown 0.12.3", - "serde 1.0.198", + "serde 1.0.199", ] [[package]] @@ -5460,8 +5547,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", - "hashbrown 0.14.3", - "serde 1.0.198", + "hashbrown 0.14.5", + "serde 1.0.199", ] [[package]] @@ -5542,6 +5629,16 @@ version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f958d3d68f4167080a18141e10381e7634563984a537f2a49a30fd8e53ac5767" +[[package]] +name = "io-extras" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9f046b9af244f13b3bd939f55d16830ac3a201e8a9ba9661bfcb03e2be72b9b" +dependencies = [ + "io-lifetimes 2.0.3", + "windows-sys 0.52.0", +] + [[package]] name = "io-lifetimes" version = "1.0.11" @@ -5553,13 +5650,19 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "io-lifetimes" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a611371471e98973dbcab4e0ec66c31a10bc356eeb4d54a0e05eac8158fe38c" + [[package]] name = "ipconfig" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" dependencies = [ - "socket2 0.5.6", + "socket2 0.5.7", "widestring", "windows-sys 0.48.0", "winreg", @@ -5697,7 +5800,7 @@ source = "git+https://github.com/prisma/prisma-engines?tag=5.5.2#aebc046ce8b88eb dependencies = [ "backtrace", "heck 0.3.3", - "serde 1.0.198", + "serde 1.0.199", "toml 0.5.11", ] @@ -5720,7 +5823,7 @@ dependencies = [ "futures-executor", "futures-util", "log", - "serde 1.0.198", + "serde 1.0.199", "serde_derive", "serde_json", ] @@ -5812,7 +5915,7 @@ dependencies = [ "once_cell", "regex", "rust-ini 0.19.0", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "serde_yaml", "tempfile", @@ -6107,9 +6210,9 @@ dependencies = [ [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -6121,7 +6224,7 @@ version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" dependencies = [ - "serde 1.0.198", + "serde 1.0.199", ] [[package]] @@ -6158,7 +6261,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2368312c59425dd133cb9a327afee65be0a633a8ce471d248e2202a48f8f68ae" dependencies = [ "bitflags 1.3.2", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "serde_repr", "url", @@ -6171,7 +6274,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c66bfd44a06ae10647fe3f8214762e9369fd4248df1350924b4ef9e770a85ea1" dependencies = [ "bitflags 1.3.2", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "serde_repr", "url", @@ -6257,6 +6360,12 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" +[[package]] +name = "maybe-owned" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4facc753ae494aeb6e3c22f839b158aebd4f9270f55cd3c79906c45476c47ab4" + [[package]] name = "md-5" version = "0.10.6" @@ -6390,7 +6499,7 @@ dependencies = [ "reqwest", "self_update", "semver 1.0.22", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "serde_yaml", "shadow-rs", @@ -6416,7 +6525,7 @@ dependencies = [ "once_cell", "regex", "reqwest", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "tempfile", "tokio", @@ -6427,7 +6536,7 @@ name = "metagen_mdk_rust_static" version = "0.0.1" dependencies = [ "anyhow", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "wit-bindgen 0.22.0", ] @@ -6628,9 +6737,9 @@ dependencies = [ "percent-encoding", "rand 0.8.5", "rustc_version_runtime", - "rustls 0.21.11", + "rustls 0.21.12", "rustls-pemfile", - "serde 1.0.198", + "serde 1.0.199", "serde_bytes", "serde_with 1.14.0", "sha-1", @@ -6684,7 +6793,7 @@ dependencies = [ "query-engine-metrics", "rand 0.7.3", "regex", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "thiserror", "tokio", @@ -6724,7 +6833,7 @@ source = "git+https://github.com/prisma/prisma-engines?tag=5.5.2#aebc046ce8b88eb dependencies = [ "futures", "mongodb", - "serde 1.0.198", + "serde 1.0.199", ] [[package]] @@ -6765,7 +6874,7 @@ dependencies = [ "pin-project", "priority-queue", "regex", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "socket2 0.4.10", "thiserror", @@ -6784,7 +6893,7 @@ checksum = "9006c95034ccf7b903d955f210469119f6c3477fc9c9e7a7845ce38a3e665c2a" dependencies = [ "base64 0.13.1", "bigdecimal", - "bindgen 0.59.2", + "bindgen", "bitflags 1.3.2", "bitvec", "byteorder", @@ -6802,7 +6911,7 @@ dependencies = [ "regex", "rust_decimal", "saturating", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "sha1", "sha2 0.10.8", @@ -6827,7 +6936,7 @@ dependencies = [ "log", "num-traits 0.2.18", "rustc-hash", - "serde 1.0.198", + "serde 1.0.199", "spirv", "termcolor", "thiserror", @@ -6850,7 +6959,7 @@ source = "git+https://github.com/metatypedev/deno?branch=v1.41.0-embeddable#2fa9 dependencies = [ "proc-macro2", "quote", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "syn 2.0.60", ] @@ -7055,7 +7164,7 @@ dependencies = [ "num-integer", "num-traits 0.2.18", "rand 0.8.5", - "serde 1.0.198", + "serde 1.0.199", ] [[package]] @@ -7071,7 +7180,7 @@ dependencies = [ "num-iter", "num-traits 0.2.18", "rand 0.8.5", - "serde 1.0.198", + "serde 1.0.199", "smallvec", "zeroize", ] @@ -7091,17 +7200,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" -[[package]] -name = "num-derive" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "num-derive" version = "0.4.2" @@ -7224,7 +7322,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8dd6c0cdf9429bce006e1362bfce61fa1bfd8c898a643ed8d2b471934701d3d" dependencies = [ "crc32fast", - "hashbrown 0.14.3", + "hashbrown 0.14.5", "indexmap 2.2.6", "memchr", ] @@ -7331,7 +7429,7 @@ dependencies = [ "percent-encoding", "pin-project", "rand 0.8.5", - "serde 1.0.198", + "serde 1.0.199", "thiserror", "tokio", "tokio-stream", @@ -7444,7 +7542,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae99c7fa6dd38c7cafe1ec085e804f8f555a2f8659b0dbe03f1f9963a9b51092" dependencies = [ "log", - "serde 1.0.198", + "serde 1.0.199", "windows-sys 0.52.0", ] @@ -7545,12 +7643,12 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" dependencies = [ "lock_api", - "parking_lot_core 0.9.9", + "parking_lot_core 0.9.10", ] [[package]] @@ -7569,15 +7667,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.4.1", + "redox_syscall 0.5.1", "smallvec", - "windows-targets 0.48.5", + "windows-targets 0.52.5", ] [[package]] @@ -7864,7 +7962,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" dependencies = [ "atomic-waker", - "fastrand 2.0.2", + "fastrand 2.1.0", "futures-io", ] @@ -8012,7 +8110,7 @@ dependencies = [ "chrono", "fallible-iterator 0.2.0", "postgres-protocol", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "uuid", ] @@ -8129,7 +8227,7 @@ dependencies = [ "chrono", "once_cell", "regex", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "uuid", ] @@ -8274,7 +8372,7 @@ dependencies = [ "chrono", "inventory", "prost", - "serde 1.0.198", + "serde 1.0.199", "serde_derive", "serde_json", "typetag", @@ -8306,7 +8404,7 @@ dependencies = [ "prost-wkt", "prost-wkt-build", "regex", - "serde 1.0.198", + "serde 1.0.199", "serde_derive", "serde_json", ] @@ -8337,7 +8435,7 @@ dependencies = [ "prisma-value", "regex", "schema-ast", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "url", ] @@ -8382,7 +8480,7 @@ dependencies = [ "config", "directories 4.0.1", "petgraph 0.6.4", - "serde 1.0.198", + "serde 1.0.199", "serde-value", "tint", ] @@ -8466,7 +8564,7 @@ dependencies = [ "itertools 0.10.5", "prisma-models", "prisma-value", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "thiserror", "user-facing-errors", @@ -8497,7 +8595,7 @@ dependencies = [ "query-connector", "query-engine-metrics", "schema", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "thiserror", "tokio", @@ -8518,8 +8616,8 @@ dependencies = [ "metrics-exporter-prometheus", "metrics-util 0.12.1", "once_cell", - "parking_lot 0.12.1", - "serde 1.0.198", + "parking_lot 0.12.2", + "serde 1.0.199", "serde_json", "tracing", "tracing-futures", @@ -8731,6 +8829,15 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "redox_syscall" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" +dependencies = [ + "bitflags 2.5.0", +] + [[package]] name = "redox_users" version = "0.4.5" @@ -8852,7 +8959,7 @@ dependencies = [ "psl", "quaint", "query-core", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "sql-query-connector", "thiserror", @@ -8887,9 +8994,9 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls 0.21.11", + "rustls 0.21.12", "rustls-pemfile", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "serde_urlencoded", "tokio", @@ -9003,7 +9110,7 @@ checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" dependencies = [ "base64 0.21.7", "bitflags 2.5.0", - "serde 1.0.198", + "serde 1.0.199", "serde_derive", ] @@ -9070,7 +9177,7 @@ dependencies = [ "num-traits 0.2.18", "rand 0.8.5", "rkyv", - "serde 1.0.198", + "serde 1.0.199", "serde_json", ] @@ -9131,7 +9238,7 @@ checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" dependencies = [ "bitflags 1.3.2", "errno 0.3.8", - "io-lifetimes", + "io-lifetimes 1.0.11", "libc", "linux-raw-sys 0.3.8", "windows-sys 0.48.0", @@ -9145,8 +9252,10 @@ checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ "bitflags 2.5.0", "errno 0.3.8", + "itoa", "libc", "linux-raw-sys 0.4.13", + "once_cell", "windows-sys 0.52.0", ] @@ -9164,9 +9273,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.11" +version = "0.21.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fecbfb7b1444f477b345853b1fce097a2c6fb637b2bfb87e6bc5db0f043fae4" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "log", "ring 0.17.8", @@ -9202,8 +9311,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded7a36e8ac05b8ada77a84c5ceec95361942ee9dedb60a82f93f788a791aae8" dependencies = [ "futures", - "rustls 0.21.11", - "socket2 0.5.6", + "rustls 0.21.12", + "socket2 0.5.7", "tokio", ] @@ -9341,7 +9450,7 @@ dependencies = [ "enumflags2", "psl", "quaint", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "sha2 0.9.9", "tracing", @@ -9362,7 +9471,7 @@ dependencies = [ "mongodb-schema-connector", "psl", "schema-connector", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "sql-schema-connector", "tokio", @@ -9375,28 +9484,28 @@ dependencies = [ [[package]] name = "schemars" -version = "0.8.16" +version = "0.8.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45a28f4c49489add4ce10783f7911893516f15afe45d015608d41faca6bc4d29" +checksum = "7f55c82c700538496bdc329bb4918a81f87cc8888811bd123cf325a0f2f8d309" dependencies = [ "dyn-clone", "indexmap 1.9.3", "indexmap 2.2.6", "schemars_derive", - "serde 1.0.198", + "serde 1.0.199", "serde_json", ] [[package]] name = "schemars_derive" -version = "0.8.16" +version = "0.8.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c767fd6fa65d9ccf9cf026122c1b555f2ef9a4f0cea69da4d7dbc3e258d30967" +checksum = "83263746fe5e32097f06356968a077f96089739c927a61450efa069905eec108" dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 1.0.109", + "syn 2.0.60", ] [[package]] @@ -9597,7 +9706,7 @@ dependencies = [ "once_cell", "rand 0.8.5", "sentry-types", - "serde 1.0.198", + "serde 1.0.199", "serde_json", ] @@ -9643,7 +9752,7 @@ dependencies = [ "debugid", "hex", "rand 0.8.5", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "thiserror", "time", @@ -9659,9 +9768,9 @@ checksum = "9dad3f759919b92c3068c696c15c3d17238234498bbdcc80f2c469606f948ac8" [[package]] name = "serde" -version = "1.0.198" +version = "1.0.199" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc" +checksum = "0c9f6e76df036c77cd94996771fb40db98187f096dd0b9af39c6c6e452ba966a" dependencies = [ "serde_derive", ] @@ -9685,7 +9794,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" dependencies = [ "ordered-float 2.10.1", - "serde 1.0.198", + "serde 1.0.199", ] [[package]] @@ -9694,14 +9803,14 @@ version = "0.11.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734" dependencies = [ - "serde 1.0.198", + "serde 1.0.199", ] [[package]] name = "serde_derive" -version = "1.0.198" +version = "1.0.199" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9" +checksum = "11bd257a6541e141e42ca6d24ae26f7714887b47e89aa739099104c7e4d3b7fc" dependencies = [ "proc-macro2", "quote", @@ -9710,13 +9819,13 @@ dependencies = [ [[package]] name = "serde_derive_internals" -version = "0.26.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" +checksum = "330f01ce65a3a5fe59a60c82f3c9a024b573b8a6e875bd233fe5f934e71d54e3" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.60", ] [[package]] @@ -9728,7 +9837,7 @@ dependencies = [ "indexmap 2.2.6", "itoa", "ryu", - "serde 1.0.198", + "serde 1.0.199", ] [[package]] @@ -9748,7 +9857,7 @@ version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" dependencies = [ - "serde 1.0.198", + "serde 1.0.199", ] [[package]] @@ -9760,7 +9869,7 @@ dependencies = [ "form_urlencoded", "itoa", "ryu", - "serde 1.0.198", + "serde 1.0.199", ] [[package]] @@ -9772,7 +9881,7 @@ dependencies = [ "bytes", "derive_more", "num-bigint", - "serde 1.0.198", + "serde 1.0.199", "smallvec", "thiserror", "v8", @@ -9784,25 +9893,25 @@ version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff" dependencies = [ - "serde 1.0.198", + "serde 1.0.199", "serde_with_macros 1.5.2", ] [[package]] name = "serde_with" -version = "3.7.0" +version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee80b0e361bbf88fd2f6e242ccd19cfda072cb0faa6ae694ecee08199938569a" +checksum = "0ad483d2ab0149d5a5ebcd9972a3852711e0153d863bf5a5d0391d28883c4a20" dependencies = [ - "base64 0.21.7", + "base64 0.22.0", "chrono", "hex", "indexmap 1.9.3", "indexmap 2.2.6", - "serde 1.0.198", + "serde 1.0.199", "serde_derive", "serde_json", - "serde_with_macros 3.7.0", + "serde_with_macros 3.8.1", "time", ] @@ -9820,9 +9929,9 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.7.0" +version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6561dc161a9224638a31d876ccdfefbc1df91d3f3a8342eddb35f055d48c7655" +checksum = "65569b702f41443e8bc8bbb1c5779bd0450bbe723b56198980e80ec45780bce2" dependencies = [ "darling 0.20.8", "proc-macro2", @@ -9839,19 +9948,10 @@ dependencies = [ "indexmap 2.2.6", "itoa", "ryu", - "serde 1.0.198", + "serde 1.0.199", "unsafe-libyaml", ] -[[package]] -name = "setjmp" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a4a1d465f5de0833aed8a7c76b1c01606bc8160c5a7d2c0108867dfffdfef3" -dependencies = [ - "libc", -] - [[package]] name = "sha-1" version = "0.10.0" @@ -9898,19 +9998,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "sha256" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18278f6a914fa3070aa316493f7d2ddfb9ac86ebc06fa3b83bffda487e9065b0" -dependencies = [ - "async-trait", - "bytes", - "hex", - "sha2 0.10.8", - "tokio", -] - [[package]] name = "sha3" version = "0.10.8" @@ -9955,6 +10042,15 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" +[[package]] +name = "shellexpand" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ccc8076840c4da029af4f87e4e8daeb0fca6b87bbb02e10cb60b791450e11e4" +dependencies = [ + "dirs", +] + [[package]] name = "shlex" version = "1.3.0" @@ -10005,7 +10101,7 @@ dependencies = [ "halfbrown", "lexical-core 0.8.5", "ref-cast", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "simdutf8", "value-trait", @@ -10104,9 +10200,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", "windows-sys 0.52.0", @@ -10122,7 +10218,7 @@ dependencies = [ "debugid", "if_chain", "rustc_version 0.2.3", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "unicode-id", "url", @@ -10139,7 +10235,7 @@ dependencies = [ "debugid", "if_chain", "rustc_version 0.2.3", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "unicode-id-start", "url", @@ -10217,7 +10313,7 @@ dependencies = [ "quaint", "query-connector", "rand 0.7.3", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "thiserror", "tokio", @@ -10245,7 +10341,7 @@ dependencies = [ "quaint", "regex", "schema-connector", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "sql-ddl", "sql-schema-describer", @@ -10275,7 +10371,7 @@ dependencies = [ "psl", "quaint", "regex", - "serde 1.0.198", + "serde 1.0.199", "tracing", "tracing-error", "tracing-futures", @@ -10334,10 +10430,10 @@ checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" dependencies = [ "new_debug_unreachable", "once_cell", - "parking_lot 0.12.1", + "parking_lot 0.12.2", "phf_shared 0.10.0", "precomputed-hash", - "serde 1.0.198", + "serde 1.0.199", ] [[package]] @@ -10437,7 +10533,7 @@ dependencies = [ "hstr", "once_cell", "rustc-hash", - "serde 1.0.198", + "serde 1.0.199", ] [[package]] @@ -10451,7 +10547,7 @@ dependencies = [ "indexmap 2.2.6", "is-macro", "once_cell", - "parking_lot 0.12.1", + "parking_lot 0.12.2", "petgraph 0.6.4", "radix_fmt", "relative-path", @@ -10481,7 +10577,7 @@ dependencies = [ "dashmap", "once_cell", "regex", - "serde 1.0.198", + "serde 1.0.199", ] [[package]] @@ -10500,7 +10596,7 @@ dependencies = [ "num-bigint", "once_cell", "rustc-hash", - "serde 1.0.198", + "serde 1.0.199", "siphasher", "sourcemap 6.4.1", "swc_atoms", @@ -10520,7 +10616,7 @@ checksum = "ce837c5eae1cb200a310940de989fd9b3d12ed62d7752bc69b39ef8aa775ec04" dependencies = [ "anyhow", "indexmap 2.2.6", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "swc_cached", "swc_config_macro", @@ -10566,7 +10662,7 @@ dependencies = [ "num-bigint", "phf 0.11.2", "scoped-tls", - "serde 1.0.198", + "serde 1.0.199", "string_enum", "swc_atoms", "swc_common", @@ -10583,7 +10679,7 @@ dependencies = [ "num-bigint", "once_cell", "rustc-hash", - "serde 1.0.198", + "serde 1.0.199", "sourcemap 6.4.1", "swc_atoms", "swc_common", @@ -10602,7 +10698,7 @@ dependencies = [ "num-bigint", "once_cell", "rustc-hash", - "serde 1.0.198", + "serde 1.0.199", "sourcemap 6.4.1", "swc_atoms", "swc_common", @@ -10631,7 +10727,7 @@ checksum = "7c16051bce5421992a1b49350735bf4d110f761fd68ae7098af17a64ad639b8d" dependencies = [ "anyhow", "pathdiff", - "serde 1.0.198", + "serde 1.0.199", "swc_atoms", "swc_common", "tracing", @@ -10648,7 +10744,7 @@ dependencies = [ "num-bigint", "num-traits 0.2.18", "phf 0.11.2", - "serde 1.0.198", + "serde 1.0.199", "smallvec", "smartstring", "stacker", @@ -10670,7 +10766,7 @@ dependencies = [ "num-bigint", "num-traits 0.2.18", "phf 0.11.2", - "serde 1.0.198", + "serde 1.0.199", "smallvec", "smartstring", "stacker", @@ -10693,7 +10789,7 @@ dependencies = [ "once_cell", "phf 0.11.2", "rustc-hash", - "serde 1.0.198", + "serde 1.0.199", "smallvec", "swc_atoms", "swc_common", @@ -10716,7 +10812,7 @@ dependencies = [ "once_cell", "phf 0.11.2", "rustc-hash", - "serde 1.0.198", + "serde 1.0.199", "smallvec", "swc_atoms", "swc_common", @@ -10785,7 +10881,7 @@ checksum = "39920f44aa30ab997dd7cfdc364addd54e4a5fcc3807ae69a6fe283f306bc5a5" dependencies = [ "either", "rustc-hash", - "serde 1.0.198", + "serde 1.0.199", "smallvec", "swc_atoms", "swc_common", @@ -10807,7 +10903,7 @@ dependencies = [ "dashmap", "indexmap 2.2.6", "once_cell", - "serde 1.0.198", + "serde 1.0.199", "sha-1", "string_enum", "swc_atoms", @@ -10831,7 +10927,7 @@ dependencies = [ "dashmap", "indexmap 2.2.6", "once_cell", - "serde 1.0.198", + "serde 1.0.199", "sha-1", "string_enum", "swc_atoms", @@ -10852,7 +10948,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e4263372cc7cd1a3b4570ccf7438f3c1e1575f134fd05cdf074edb322480a5b" dependencies = [ "ryu-js", - "serde 1.0.198", + "serde 1.0.199", "swc_atoms", "swc_common", "swc_ecma_ast 0.110.17", @@ -10869,7 +10965,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "432cf63b05d3ec435199bfbf7ba50793c6cb777bfcd8ad9f055f501aa9048d9c" dependencies = [ "ryu-js", - "serde 1.0.198", + "serde 1.0.199", "swc_atoms", "swc_common", "swc_ecma_ast 0.112.2", @@ -11066,6 +11162,22 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "system-interface" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b858526d22750088a9b3cf2e3c2aacebd5377f13adeec02860c30d09113010a6" +dependencies = [ + "bitflags 2.5.0", + "cap-fs-ext", + "cap-std", + "fd-lock", + "io-lifetimes 2.0.3", + "rustix 0.38.34", + "windows-sys 0.52.0", + "winx", +] + [[package]] name = "take_mut" version = "0.2.2" @@ -11102,7 +11214,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" dependencies = [ "cfg-if", - "fastrand 2.0.2", + "fastrand 2.1.0", "rustix 0.38.34", "windows-sys 0.52.0", ] @@ -11122,7 +11234,7 @@ dependencies = [ "http 0.2.12", "once_cell", "opentelemetry 0.18.0", - "parking_lot 0.12.1", + "parking_lot 0.12.2", "prost-types", "temporal-sdk-core-protos", "thiserror", @@ -11146,7 +11258,7 @@ dependencies = [ "prost-wkt", "prost-wkt-build", "prost-wkt-types", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "thiserror", "tonic", @@ -11191,7 +11303,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fd5828de7deaa782e1dd713006ae96b3bee32d3279b79eb67ecf8072c059bcf" dependencies = [ - "serde 1.0.198", + "serde 1.0.199", ] [[package]] @@ -11279,7 +11391,7 @@ dependencies = [ "num-conv", "num_threads", "powerfmt", - "serde 1.0.198", + "serde 1.0.199", "time-core", "time-macros", ] @@ -11356,10 +11468,10 @@ dependencies = [ "libc", "mio", "num_cpus", - "parking_lot 0.12.1", + "parking_lot 0.12.2", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.6", + "socket2 0.5.7", "tokio-macros", "windows-sys 0.48.0", ] @@ -11419,13 +11531,13 @@ dependencies = [ "futures-channel", "futures-util", "log", - "parking_lot 0.12.1", + "parking_lot 0.12.2", "percent-encoding", "phf 0.11.2", "pin-project-lite", "postgres-protocol", "postgres-types", - "socket2 0.5.6", + "socket2 0.5.7", "tokio", "tokio-util 0.7.10", ] @@ -11447,7 +11559,7 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls 0.21.11", + "rustls 0.21.12", "tokio", ] @@ -11510,7 +11622,7 @@ version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ - "serde 1.0.198", + "serde 1.0.199", ] [[package]] @@ -11519,7 +11631,7 @@ version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" dependencies = [ - "serde 1.0.198", + "serde 1.0.199", "serde_spanned", "toml_datetime", "toml_edit 0.22.12", @@ -11531,7 +11643,7 @@ version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" dependencies = [ - "serde 1.0.198", + "serde 1.0.199", ] [[package]] @@ -11552,10 +11664,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3328d4f68a705b2a4498da1d580585d39a6510f98318a2cec3018a7ec61ddef" dependencies = [ "indexmap 2.2.6", - "serde 1.0.198", + "serde 1.0.199", "serde_spanned", "toml_datetime", - "winnow 0.6.6", + "winnow 0.6.7", ] [[package]] @@ -11646,7 +11758,7 @@ dependencies = [ "httparse", "lsp-types 0.94.1", "memchr", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "tokio", "tokio-util 0.7.10", @@ -11785,7 +11897,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "859eb650cfee7434994602c3a68b25d77ad9e68c8a6cd491616ef86661382eb3" dependencies = [ - "serde 1.0.198", + "serde 1.0.199", "stable_deref_trait", ] @@ -11831,7 +11943,7 @@ dependencies = [ "ipnet", "lazy_static 1.4.0", "rand 0.8.5", - "serde 1.0.198", + "serde 1.0.199", "smallvec", "thiserror", "tinyvec", @@ -11852,7 +11964,7 @@ dependencies = [ "lazy_static 1.4.0", "log", "lru-cache", - "parking_lot 0.12.1", + "parking_lot 0.12.2", "resolv-conf", "smallvec", "thiserror", @@ -11871,9 +11983,9 @@ dependencies = [ "ipconfig", "lazy_static 1.4.0", "lru-cache", - "parking_lot 0.12.1", + "parking_lot 0.12.2", "resolv-conf", - "serde 1.0.198", + "serde 1.0.199", "smallvec", "thiserror", "tokio", @@ -11933,6 +12045,7 @@ name = "typegate_engine" version = "0.3.7-0" dependencies = [ "anyhow", + "async-trait", "base64 0.21.7", "common", "connection-string", @@ -11943,7 +12056,7 @@ dependencies = [ "futures", "log", "mt_deno", - "num-derive 0.4.2", + "num-derive", "num-traits 0.2.18", "once_cell", "prisma-models", @@ -11955,7 +12068,7 @@ dependencies = [ "request-handlers", "schema-connector", "schema-core", - "serde 1.0.198", + "serde 1.0.199", "shadow-rs", "tap", "tempfile", @@ -11965,10 +12078,8 @@ dependencies = [ "tokio", "typescript", "user-facing-errors", - "wasmedge-sdk", - "wasmedge-sys", - "wasmedge-types", "wasmtime", + "wasmtime-wasi", ] [[package]] @@ -11988,7 +12099,7 @@ dependencies = [ "ptree", "regex", "seahash", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "sha2 0.10.8", "wit-bindgen 0.24.0", @@ -12025,7 +12136,7 @@ dependencies = [ "erased-serde 0.4.4", "inventory", "once_cell", - "serde 1.0.198", + "serde 1.0.199", "typetag-impl", ] @@ -12192,9 +12303,9 @@ checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" [[package]] name = "unicode-width" -version = "0.1.11" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" +checksum = "68f5e5f3158ecfd4b8ff6fe086db7c8467a2dfdac97fe420f2b7c4aa97af66d6" [[package]] name = "unicode-xid" @@ -12247,11 +12358,11 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "ureq" -version = "2.9.6" +version = "2.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11f214ce18d8b2cbe84ed3aa6486ed3f5b285cf8d8fbdbce9f3f767a724adc35" +checksum = "d11a831e3c0b56e438a28308e7c810799e3c118417f342d30ecec080105395cd" dependencies = [ - "base64 0.21.7", + "base64 0.22.0", "log", "native-tls", "once_cell", @@ -12267,7 +12378,7 @@ dependencies = [ "form_urlencoded", "idna 0.5.0", "percent-encoding", - "serde 1.0.198", + "serde 1.0.199", ] [[package]] @@ -12284,7 +12395,7 @@ checksum = "f9bd5ff03aea02fa45b13a7980151fe45009af1980ba69f651ec367121a31609" dependencies = [ "derive_more", "regex", - "serde 1.0.198", + "serde 1.0.199", "unic-ucd-ident", "url", ] @@ -12308,7 +12419,7 @@ dependencies = [ "indoc", "itertools 0.10.5", "quaint", - "serde 1.0.198", + "serde 1.0.199", "serde_json", "tracing", "user-facing-error-macros", @@ -12339,7 +12450,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" dependencies = [ "getrandom 0.2.14", - "serde 1.0.198", + "serde 1.0.199", ] [[package]] @@ -12562,9 +12673,9 @@ dependencies = [ [[package]] name = "wasm-encoder" -version = "0.205.0" +version = "0.206.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90e95b3563d164f33c1cfb0a7efbd5940c37710019be10cd09f800fdec8b0e5c" +checksum = "d759312e1137f199096d80a70be685899cd7d3d09c572836bb2e9b69b4dc3b1e" dependencies = [ "leb128", ] @@ -12577,7 +12688,7 @@ checksum = "0fd83062c17b9f4985d438603cde0a5e8c5c8198201a6937f778b607924c7da2" dependencies = [ "anyhow", "indexmap 2.2.6", - "serde 1.0.198", + "serde 1.0.199", "serde_derive", "serde_json", "spdx", @@ -12593,7 +12704,7 @@ checksum = "094aea3cb90e09f16ee25a4c0e324b3e8c934e7fd838bfa039aef5352f44a917" dependencies = [ "anyhow", "indexmap 2.2.6", - "serde 1.0.198", + "serde 1.0.199", "serde_derive", "serde_json", "spdx", @@ -12614,70 +12725,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "wasmedge-macro" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbe80d95a88e9ac87b6aaf7bc9acd1fdfcd92045db2bf41a2262f623e2406a92" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.60", -] - -[[package]] -name = "wasmedge-sdk" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f477f3b515760c6f7fa734dae5b97c030ee443969f1c30ed12d3a09bea783a2" -dependencies = [ - "anyhow", - "cfg-if", - "num-derive 0.3.3", - "num-traits 0.2.18", - "thiserror", - "wasmedge-macro", - "wasmedge-sys", - "wasmedge-types", -] - -[[package]] -name = "wasmedge-sys" -version = "0.17.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32d8e2276d63bb6f0c36871218643d193d2da6da3db36c1c1227547da465ed58" -dependencies = [ - "bindgen 0.69.4", - "cfg-if", - "cmake", - "flate2", - "lazy_static 1.4.0", - "libc", - "parking_lot 0.12.1", - "paste", - "phf 0.11.2", - "rand 0.8.5", - "reqwest", - "scoped-tls", - "setjmp", - "sha256", - "tar", - "thiserror", - "wasmedge-macro", - "wasmedge-types", - "wat", -] - -[[package]] -name = "wasmedge-types" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d4e7c8aebe2c513bb389beebc148253eb6f5904a6f9327179bbf2014c0efd52" -dependencies = [ - "thiserror", - "wat", -] - [[package]] name = "wasmparser" version = "0.201.0" @@ -12735,7 +12782,7 @@ dependencies = [ "rayon", "rustix 0.38.34", "semver 1.0.22", - "serde 1.0.198", + "serde 1.0.199", "serde_derive", "serde_json", "target-lexicon", @@ -12777,7 +12824,7 @@ dependencies = [ "directories-next", "log", "rustix 0.38.34", - "serde 1.0.198", + "serde 1.0.199", "serde_derive", "sha2 0.10.8", "toml 0.8.12", @@ -12845,7 +12892,7 @@ dependencies = [ "log", "object 0.33.0", "rustc-demangle", - "serde 1.0.198", + "serde 1.0.199", "serde_derive", "target-lexicon", "thiserror", @@ -12937,7 +12984,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b98cf64a242b0b9257604181ca28b28a5fcaa4c9ea1d396f76d1d2d1c5b40eef" dependencies = [ "cranelift-entity", - "serde 1.0.198", + "serde 1.0.199", "serde_derive", "thiserror", "wasmparser 0.202.0", @@ -12954,6 +13001,37 @@ dependencies = [ "syn 2.0.60", ] +[[package]] +name = "wasmtime-wasi" +version = "20.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34e1f53a9d4688a138282580fa7a46cbf1a41524f0e50c7e402e1407246f0155" +dependencies = [ + "anyhow", + "async-trait", + "bitflags 2.5.0", + "bytes", + "cap-fs-ext", + "cap-net-ext", + "cap-rand", + "cap-std", + "cap-time-ext", + "fs-set-times", + "futures", + "io-extras", + "io-lifetimes 2.0.3", + "once_cell", + "rustix 0.38.34", + "system-interface", + "thiserror", + "tokio", + "tracing", + "url", + "wasmtime", + "wiggle", + "windows-sys 0.52.0", +] + [[package]] name = "wasmtime-winch" version = "20.0.0" @@ -12985,24 +13063,33 @@ dependencies = [ [[package]] name = "wast" -version = "205.0.0" +version = "35.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ef140f1b49946586078353a453a1d28ba90adfc54dde75710bc1931de204d68" +dependencies = [ + "leb128", +] + +[[package]] +name = "wast" +version = "206.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "441a6a195b3b5245e26d450bbcc91366c6b652382a22f63cbe3c73240e13b2bb" +checksum = "68586953ee4960b1f5d84ebf26df3b628b17e6173bc088e0acfbce431469795a" dependencies = [ "bumpalo", "leb128", "memchr", "unicode-width", - "wasm-encoder 0.205.0", + "wasm-encoder 0.206.0", ] [[package]] name = "wat" -version = "1.205.0" +version = "1.206.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19832624d606e7c6bf3cd4caa73578ecec5eac30c768269256d19c79900beb18" +checksum = "da4c6f2606276c6e991aebf441b2fc92c517807393f039992a3e0ad873efe4ad" dependencies = [ - "wast", + "wast 206.0.0", ] [[package]] @@ -13043,12 +13130,12 @@ dependencies = [ "codespan-reporting", "log", "naga", - "parking_lot 0.12.1", + "parking_lot 0.12.2", "profiling", "raw-window-handle", "ron", "rustc-hash", - "serde 1.0.198", + "serde 1.0.199", "smallvec", "thiserror", "web-sys", @@ -13084,7 +13171,7 @@ dependencies = [ "naga", "objc", "once_cell", - "parking_lot 0.12.1", + "parking_lot 0.12.2", "profiling", "range-alloc", "raw-window-handle", @@ -13105,7 +13192,7 @@ checksum = "0d5ed5f0edf0de351fe311c53304986315ce866f394a2e6df0c4b3c70774bcdd" dependencies = [ "bitflags 2.5.0", "js-sys", - "serde 1.0.198", + "serde 1.0.199", "web-sys", ] @@ -13151,6 +13238,48 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" +[[package]] +name = "wiggle" +version = "20.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b6552dda951239e219c329e5a768393664e8d120c5e0818487ac2633f173b1f" +dependencies = [ + "anyhow", + "async-trait", + "bitflags 2.5.0", + "thiserror", + "tracing", + "wasmtime", + "wiggle-macro", +] + +[[package]] +name = "wiggle-generate" +version = "20.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da64cb31e0bfe8b1d2d13956ef9fd5c77545756a1a6ef0e6cfd44e8f1f207aed" +dependencies = [ + "anyhow", + "heck 0.4.1", + "proc-macro2", + "quote", + "shellexpand", + "syn 2.0.60", + "witx", +] + +[[package]] +name = "wiggle-macro" +version = "20.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900b2416ef2ff2903ded6cf55d4a941fed601bf56a8c4874856d7a77c1891994" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", + "wiggle-generate", +] + [[package]] name = "winapi" version = "0.3.9" @@ -13169,9 +13298,9 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134306a13c5647ad6453e8deaec55d3a44d6021970129e6188735e74bf546697" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" dependencies = [ "windows-sys 0.52.0", ] @@ -13390,9 +13519,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.6" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c976aaaa0e1f90dbb21e9587cdaf1d9679a1cde8875c0d6bd83ab96a208352" +checksum = "14b9415ee827af173ebb3f15f9083df5a122eb93572ec28741fb153356ea2578" dependencies = [ "memchr", ] @@ -13416,6 +13545,16 @@ dependencies = [ "toml 0.5.11", ] +[[package]] +name = "winx" +version = "0.36.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9643b83820c0cd246ecabe5fa454dd04ba4fa67996369466d0747472d337346" +dependencies = [ + "bitflags 2.5.0", + "windows-sys 0.52.0", +] + [[package]] name = "wit-bindgen" version = "0.22.0" @@ -13538,7 +13677,7 @@ dependencies = [ "bitflags 2.5.0", "indexmap 2.2.6", "log", - "serde 1.0.198", + "serde 1.0.199", "serde_derive", "serde_json", "wasm-encoder 0.201.0", @@ -13557,7 +13696,7 @@ dependencies = [ "bitflags 2.5.0", "indexmap 2.2.6", "log", - "serde 1.0.198", + "serde 1.0.199", "serde_derive", "serde_json", "wasm-encoder 0.202.0", @@ -13577,7 +13716,7 @@ dependencies = [ "indexmap 2.2.6", "log", "semver 1.0.22", - "serde 1.0.198", + "serde 1.0.199", "serde_derive", "serde_json", "unicode-xid", @@ -13595,13 +13734,25 @@ dependencies = [ "indexmap 2.2.6", "log", "semver 1.0.22", - "serde 1.0.198", + "serde 1.0.199", "serde_derive", "serde_json", "unicode-xid", "wasmparser 0.202.0", ] +[[package]] +name = "witx" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e366f27a5cabcddb2706a78296a40b8fcc451e1a6aba2fc1d94b4a01bdaaef4b" +dependencies = [ + "anyhow", + "log", + "thiserror", + "wast 35.0.2", +] + [[package]] name = "wyz" version = "0.5.1" @@ -13619,7 +13770,7 @@ checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" dependencies = [ "curve25519-dalek", "rand_core 0.6.4", - "serde 1.0.198", + "serde 1.0.199", "zeroize", ] @@ -13741,7 +13892,7 @@ dependencies = [ "log", "num-traits 0.2.18", "once_cell", - "parking_lot 0.12.1", + "parking_lot 0.12.2", "rand 0.8.5", "regex", "thiserror", diff --git a/Cargo.toml b/Cargo.toml index c4bd64d212..ec02452a84 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,8 @@ members = [ "typegraph/core", ] exclude = [ - "typegate/tests/runtimes/wasm/rust" + "typegate/tests/runtimes/wasm/rust", + "libs/pyrt_component" ] [workspace.package] @@ -33,10 +34,7 @@ env_logger = "=0.10.0" clap = "=4.4.17" clap_complete = "=4.4.7" reqwest = "0.11.20" -# https://github.com/WasmEdge/wasmedge-rust-sdk -wasmedge-sdk = { version = "=0.13.2", features = ["standalone"] } -wasmedge-sys = "=0.17.5" -wasmedge-types = "=0.4.4" + # https://github.com/denoland/deno_ast/blob/main/Cargo.toml swc_atoms = "=0.6.5" swc_common = "=0.33.17" diff --git a/deno.jsonc.disabled b/deno.jsonc.disabled new file mode 100644 index 0000000000..df441ceacf --- /dev/null +++ b/deno.jsonc.disabled @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "allowJs": false, + "strict": true, + "experimentalDecorators": true, + "types": [ + "./engine/runtime.d.ts" + ], + "lib": [ + "deno.ns", + "deno.unstable", + "deno.worker" + ] + }, + "nodeModulesDir": false, + "lock": "deno.lock", + "importMap": "./typegate/import_map.json" +} diff --git a/deno.lock b/deno.lock new file mode 100644 index 0000000000..af7dc769eb --- /dev/null +++ b/deno.lock @@ -0,0 +1,892 @@ +{ + "version": "3", + "packages": { + "specifiers": { + "npm:@sentry/node@7.70.0": "npm:@sentry/node@7.70.0", + "npm:chance@1.1.11": "npm:chance@1.1.11", + "npm:graphql@16.8.1": "npm:graphql@16.8.1", + "npm:lodash": "npm:lodash@4.17.21", + "npm:validator": "npm:validator@13.11.0" + }, + "npm": { + "@sentry-internal/tracing@7.70.0": { + "integrity": "sha512-SpbE6wZhs6QwG2ORWCt8r28o1T949qkWx/KeRTCdK4Ub95PQ3Y3DgnqD8Wz//3q50Wt6EZDEibmz4t067g6PPg==", + "dependencies": { + "@sentry/core": "@sentry/core@7.70.0", + "@sentry/types": "@sentry/types@7.70.0", + "@sentry/utils": "@sentry/utils@7.70.0", + "tslib": "tslib@2.6.2" + } + }, + "@sentry/core@7.70.0": { + "integrity": "sha512-voUsGVM+jwRp99AQYFnRvr7sVd2tUhIMj1L6F42LtD3vp7t5ZnKp3NpXagtFW2vWzXESfyJUBhM0qI/bFvn7ZA==", + "dependencies": { + "@sentry/types": "@sentry/types@7.70.0", + "@sentry/utils": "@sentry/utils@7.70.0", + "tslib": "tslib@2.6.2" + } + }, + "@sentry/node@7.70.0": { + "integrity": "sha512-GeGlnu3QnJX0GN2FvZ3E31e48ZhRzEpREyC0Wa4BRvYHnyiGvsQjo/0RKeq6vvlggRhVnuoMg/jESyUmdntrAA==", + "dependencies": { + "@sentry-internal/tracing": "@sentry-internal/tracing@7.70.0", + "@sentry/core": "@sentry/core@7.70.0", + "@sentry/types": "@sentry/types@7.70.0", + "@sentry/utils": "@sentry/utils@7.70.0", + "cookie": "cookie@0.5.0", + "https-proxy-agent": "https-proxy-agent@5.0.1", + "lru_map": "lru_map@0.3.3", + "tslib": "tslib@2.6.2" + } + }, + "@sentry/types@7.70.0": { + "integrity": "sha512-rY4DqpiDBtXSk4MDNBH3dwWqfPbNBI/9GA7Y5WJSIcObBtfBKp0fzYliHJZD0pgM7d4DPFrDn42K9Iiumgymkw==", + "dependencies": {} + }, + "@sentry/utils@7.70.0": { + "integrity": "sha512-0cChMH0lsGp+5I3D4wOHWwjFN19HVrGUs7iWTLTO5St3EaVbdeLbI1vFXHxMxvopbwgpeZafbreHw/loIdZKpw==", + "dependencies": { + "@sentry/types": "@sentry/types@7.70.0", + "tslib": "tslib@2.6.2" + } + }, + "agent-base@6.0.2": { + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "debug@4.3.4" + } + }, + "chance@1.1.11": { + "integrity": "sha512-kqTg3WWywappJPqtgrdvbA380VoXO2eu9VCV895JgbyHsaErXdyHK9LOZ911OvAk6L0obK7kDk9CGs8+oBawVA==", + "dependencies": {} + }, + "cookie@0.5.0": { + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dependencies": {} + }, + "debug@4.3.4": { + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "ms@2.1.2" + } + }, + "graphql@16.8.1": { + "integrity": "sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==", + "dependencies": {} + }, + "https-proxy-agent@5.0.1": { + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "agent-base@6.0.2", + "debug": "debug@4.3.4" + } + }, + "lodash@4.17.21": { + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dependencies": {} + }, + "lru_map@0.3.3": { + "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", + "dependencies": {} + }, + "ms@2.1.2": { + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dependencies": {} + }, + "tslib@2.6.2": { + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dependencies": {} + }, + "validator@13.11.0": { + "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", + "dependencies": {} + } + } + }, + "redirects": { + "https://github.com/levibostian/deno-udd/raw/ignore-prerelease/mod.ts": "https://raw.githubusercontent.com/levibostian/deno-udd/ignore-prerelease/mod.ts" + }, + "remote": { + "https://deno.land/std@0.129.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74", + "https://deno.land/std@0.129.0/_util/os.ts": "49b92edea1e82ba295ec946de8ffd956ed123e2948d9bd1d3e901b04e4307617", + "https://deno.land/std@0.129.0/archive/tar.ts": "35ea1baddec7988cc4034765a2cee7613bc8074bd40940d3f5e98f63070a716a", + "https://deno.land/std@0.129.0/async/abortable.ts": "a896ac6b0d4237bd2d2d248217cfa1f0d85ccda93cb25ebda55e33850e526be6", + "https://deno.land/std@0.129.0/async/deadline.ts": "48ac998d7564969f3e6ec6b6f9bf0217ebd00239b1b2292feba61272d5dd58d0", + "https://deno.land/std@0.129.0/async/debounce.ts": "564273ef242bcfcda19a439132f940db8694173abffc159ea34f07d18fc42620", + "https://deno.land/std@0.129.0/async/deferred.ts": "bc18e28108252c9f67dfca2bbc4587c3cbf3aeb6e155f8c864ca8ecff992b98a", + "https://deno.land/std@0.129.0/async/delay.ts": "cbbdf1c87d1aed8edc7bae13592fb3e27e3106e0748f089c263390d4f49e5f6c", + "https://deno.land/std@0.129.0/async/mod.ts": "2240c6841157738414331f47dee09bb8c0482c5b1980b6e3234dd03515c8132f", + "https://deno.land/std@0.129.0/async/mux_async_iterator.ts": "f4d1d259b0c694d381770ddaaa4b799a94843eba80c17f4a2ec2949168e52d1e", + "https://deno.land/std@0.129.0/async/pool.ts": "97b0dd27c69544e374df857a40902e74e39532f226005543eabacb551e277082", + "https://deno.land/std@0.129.0/async/tee.ts": "1341feb1f5b1a96f8628d0f8fc07d8c43d3813423f18a63bf1b4785568d21b1f", + "https://deno.land/std@0.129.0/bytes/bytes_list.ts": "67eb118e0b7891d2f389dad4add35856f4ad5faab46318ff99653456c23b025d", + "https://deno.land/std@0.129.0/bytes/equals.ts": "fc16dff2090cced02497f16483de123dfa91e591029f985029193dfaa9d894c9", + "https://deno.land/std@0.129.0/bytes/mod.ts": "d3b455c0dbd4804644159d1e25946ade5ee385d2359894de49e2c6101b18b7a9", + "https://deno.land/std@0.129.0/encoding/base64.ts": "c8c16b4adaa60d7a8eee047c73ece26844435e8f7f1328d74593dbb2dd58ea4f", + "https://deno.land/std@0.129.0/encoding/base64url.ts": "55f9d13df02efac10c6f96169daa3e702606a64e8aa27c0295f645f198c27130", + "https://deno.land/std@0.129.0/fmt/colors.ts": "30455035d6d728394781c10755351742dd731e3db6771b1843f9b9e490104d37", + "https://deno.land/std@0.129.0/fmt/printf.ts": "e2c0f72146aed1efecf0c39ab928b26ae493a2278f670a871a0fbdcf36ff3379", + "https://deno.land/std@0.129.0/fs/_util.ts": "0fb24eb4bfebc2c194fb1afdb42b9c3dda12e368f43e8f2321f84fc77d42cb0f", + "https://deno.land/std@0.129.0/fs/ensure_dir.ts": "9dc109c27df4098b9fc12d949612ae5c9c7169507660dcf9ad90631833209d9d", + "https://deno.land/std@0.129.0/fs/ensure_file.ts": "7d353e64fee3d4d1e7c6b6726a2a5e987ba402c15fb49566309042887349c545", + "https://deno.land/std@0.129.0/io/buffer.ts": "bd0c4bf53db4b4be916ca5963e454bddfd3fcd45039041ea161dbf826817822b", + "https://deno.land/std@0.129.0/io/files.ts": "d199ef64e918a256320ba8d8d44ae91de87c9077df8f8d6cca013f1b9fbbe285", + "https://deno.land/std@0.129.0/io/readers.ts": "679471f3b9929b54393c9cd75b6bd178b4bc6d9aab5c0f1f9538f862cf4746fe", + "https://deno.land/std@0.129.0/io/util.ts": "078da53bba767bec0d45f7da44411f6dbf269e51ef7fcfea5e3714e04681c674", + "https://deno.land/std@0.129.0/node/_buffer.mjs": "f4a7df481d4eed06dc0151b833177d8ef74fc3a96dd4d2b073e690b6ced9474d", + "https://deno.land/std@0.129.0/node/_core.ts": "568d277be2e086af996cbdd599fec569f5280e9a494335ca23ad392b130d7bb9", + "https://deno.land/std@0.129.0/node/_events.mjs": "c0e3e0e290a8b81fee9d2973a529c8dcd5ebb4406782d1f91085274e2cb8490f", + "https://deno.land/std@0.129.0/node/_fixed_queue.ts": "455b3c484de48e810b13bdf95cd1658ecb1ba6bcb8b9315ffe994efcde3ba5f5", + "https://deno.land/std@0.129.0/node/_next_tick.ts": "64c361f6bca21df2a72dd77b84bd49d80d97a694dd3080703bc78f52146351d1", + "https://deno.land/std@0.129.0/node/_process/exiting.ts": "bc9694769139ffc596f962087155a8bfef10101d03423b9dcbc51ce6e1f88fce", + "https://deno.land/std@0.129.0/node/_util/_util_callbackify.ts": "79928ad80df3e469f7dcdb198118a7436d18a9f6c08bd7a4382332ad25a718cf", + "https://deno.land/std@0.129.0/node/_utils.ts": "c2c352e83c4c96f5ff994b1c8246bff2abcb21bfc3f1c06162cb3af1d201e615", + "https://deno.land/std@0.129.0/node/buffer.ts": "fbecbf3f237fa49bec96e97ecf56a7b92d48037b3d11219288e68943cc921600", + "https://deno.land/std@0.129.0/node/events.ts": "a1d40fc0dbccc944379ef968b80ea08f9fce579e88b5057fdb64e4f0812476dd", + "https://deno.land/std@0.129.0/node/internal/buffer.mjs": "6662fe7fe517329453545be34cea27a24f8ccd6d09afd4f609f11ade2b6dfca7", + "https://deno.land/std@0.129.0/node/internal/crypto/keys.ts": "16ce7b15a9fc5e4e3dee8fde75dae12f3d722558d5a1a6e65a9b4f86d64a21e9", + "https://deno.land/std@0.129.0/node/internal/crypto/util.mjs": "1de55a47fdbed6721b467a77ba48fdd1550c10b5eee77bbdb602eaffee365a5e", + "https://deno.land/std@0.129.0/node/internal/error_codes.ts": "ac03c4eae33de3a69d6c98e8678003207eecf75a6900eb847e3fea3c8c9e6d8f", + "https://deno.land/std@0.129.0/node/internal/errors.ts": "0d3a1eb03b654beb29b8354759a6902f45a840d4f957e9a3c632a24ce4c32632", + "https://deno.land/std@0.129.0/node/internal/hide_stack_frames.ts": "a91962ec84610bc7ec86022c4593cdf688156a5910c07b5bcd71994225c13a03", + "https://deno.land/std@0.129.0/node/internal/normalize_encoding.mjs": "3779ec8a7adf5d963b0224f9b85d1bc974a2ec2db0e858396b5d3c2c92138a0a", + "https://deno.land/std@0.129.0/node/internal/util.mjs": "684653b962fae84fd2bc08997291b1a50bed09b95dcfa7d35e3c4143163e879a", + "https://deno.land/std@0.129.0/node/internal/util/comparisons.ts": "680b55fe8bdf1613633bc469fa0440f43162c76dbe36af9aa2966310e1bb9f6e", + "https://deno.land/std@0.129.0/node/internal/util/debuglog.ts": "99e91bdf26f6c67861031f684817e1705a5bc300e81346585b396f413387edfb", + "https://deno.land/std@0.129.0/node/internal/util/inspect.mjs": "d1c2569c66a3dab45eec03208f22ad4351482527859c0011a28a6c797288a0aa", + "https://deno.land/std@0.129.0/node/internal/util/types.ts": "b2dacb8f1f5d28a51c4da5c5b75172b7fcf694073ce95ca141323657e18b0c60", + "https://deno.land/std@0.129.0/node/internal/validators.mjs": "a7e82eafb7deb85c332d5f8d9ffef052f46a42d4a121eada4a54232451acc49a", + "https://deno.land/std@0.129.0/node/internal_binding/_libuv_winerror.ts": "801e05c2742ae6cd42a5f0fd555a255a7308a65732551e962e5345f55eedc519", + "https://deno.land/std@0.129.0/node/internal_binding/_node.ts": "e4075ba8a37aef4eb5b592c8e3807c39cb49ca8653faf8e01a43421938076c1b", + "https://deno.land/std@0.129.0/node/internal_binding/_utils.ts": "1c50883b5751a9ea1b38951e62ed63bacfdc9d69ea665292edfa28e1b1c5bd94", + "https://deno.land/std@0.129.0/node/internal_binding/_winerror.ts": "8811d4be66f918c165370b619259c1f35e8c3e458b8539db64c704fbde0a7cd2", + "https://deno.land/std@0.129.0/node/internal_binding/buffer.ts": "722c62b85f966e0777b2d98c021b60e75d7f2c2dabc43413ef37d60dbd13a5d9", + "https://deno.land/std@0.129.0/node/internal_binding/constants.ts": "aff06aac49eda4234bd3a2b0b8e1fbfc67824e281c532ff9960831ab503014cc", + "https://deno.land/std@0.129.0/node/internal_binding/string_decoder.ts": "5cb1863763d1e9b458bc21d6f976f16d9c18b3b3f57eaf0ade120aee38fba227", + "https://deno.land/std@0.129.0/node/internal_binding/types.ts": "4c26fb74ba2e45de553c15014c916df6789529a93171e450d5afb016b4c765e7", + "https://deno.land/std@0.129.0/node/internal_binding/util.ts": "90364292e2bd598ab5d105b48ca49817b6708f2d1d9cbaf08b2b3ab5ca4c90a7", + "https://deno.land/std@0.129.0/node/internal_binding/uv.ts": "3821bc5e676d6955d68f581988c961d77dd28190aba5a9c59f16001a4deb34ba", + "https://deno.land/std@0.129.0/node/util.ts": "7fd6933b37af89a8e64d73dc6ee1732455a59e7e6d0965311fbd73cd634ea630", + "https://deno.land/std@0.129.0/node/util/types.mjs": "f9288198cacd374b41bae7e92a23179d3160f4c0eaf14e19be3a4e7057219a60", + "https://deno.land/std@0.129.0/path/_constants.ts": "df1db3ffa6dd6d1252cc9617e5d72165cd2483df90e93833e13580687b6083c3", + "https://deno.land/std@0.129.0/path/_interface.ts": "ee3b431a336b80cf445441109d089b70d87d5e248f4f90ff906820889ecf8d09", + "https://deno.land/std@0.129.0/path/_util.ts": "c1e9686d0164e29f7d880b2158971d805b6e0efc3110d0b3e24e4b8af2190d2b", + "https://deno.land/std@0.129.0/path/common.ts": "bee563630abd2d97f99d83c96c2fa0cca7cee103e8cb4e7699ec4d5db7bd2633", + "https://deno.land/std@0.129.0/path/glob.ts": "cb5255638de1048973c3e69e420c77dc04f75755524cb3b2e160fe9277d939ee", + "https://deno.land/std@0.129.0/path/mod.ts": "4275129bb766f0e475ecc5246aa35689eeade419d72a48355203f31802640be7", + "https://deno.land/std@0.129.0/path/posix.ts": "663e4a6fe30a145f56aa41a22d95114c4c5582d8b57d2d7c9ed27ad2c47636bb", + "https://deno.land/std@0.129.0/path/separator.ts": "fe1816cb765a8068afb3e8f13ad272351c85cbc739af56dacfc7d93d710fe0f9", + "https://deno.land/std@0.129.0/path/win32.ts": "e7bdf63e8d9982b4d8a01ef5689425c93310ece950e517476e22af10f41a136e", + "https://deno.land/std@0.129.0/streams/conversion.ts": "712585bfa0172a97fb68dd46e784ae8ad59d11b88079d6a4ab098ff42e697d21", + "https://deno.land/std@0.129.0/testing/_diff.ts": "9d849cd6877694152e01775b2d93f9d6b7aef7e24bfe3bfafc4d7a1ac8e9f392", + "https://deno.land/std@0.129.0/testing/asserts.ts": "0a95d9e8076dd3e7f0eeb605a67c148078b4b11f4abcd5eef115b0361b0736a2", + "https://deno.land/std@0.140.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74", + "https://deno.land/std@0.140.0/_util/os.ts": "3b4c6e27febd119d36a416d7a97bd3b0251b77c88942c8f16ee5953ea13e2e49", + "https://deno.land/std@0.140.0/bytes/bytes_list.ts": "67eb118e0b7891d2f389dad4add35856f4ad5faab46318ff99653456c23b025d", + "https://deno.land/std@0.140.0/bytes/equals.ts": "fc16dff2090cced02497f16483de123dfa91e591029f985029193dfaa9d894c9", + "https://deno.land/std@0.140.0/bytes/mod.ts": "763f97d33051cc3f28af1a688dfe2830841192a9fea0cbaa55f927b49d49d0bf", + "https://deno.land/std@0.140.0/encoding/base64.ts": "c8c16b4adaa60d7a8eee047c73ece26844435e8f7f1328d74593dbb2dd58ea4f", + "https://deno.land/std@0.140.0/encoding/base64url.ts": "55f9d13df02efac10c6f96169daa3e702606a64e8aa27c0295f645f198c27130", + "https://deno.land/std@0.140.0/fmt/colors.ts": "30455035d6d728394781c10755351742dd731e3db6771b1843f9b9e490104d37", + "https://deno.land/std@0.140.0/fs/_util.ts": "0fb24eb4bfebc2c194fb1afdb42b9c3dda12e368f43e8f2321f84fc77d42cb0f", + "https://deno.land/std@0.140.0/fs/ensure_dir.ts": "9dc109c27df4098b9fc12d949612ae5c9c7169507660dcf9ad90631833209d9d", + "https://deno.land/std@0.140.0/io/buffer.ts": "bd0c4bf53db4b4be916ca5963e454bddfd3fcd45039041ea161dbf826817822b", + "https://deno.land/std@0.140.0/path/_constants.ts": "df1db3ffa6dd6d1252cc9617e5d72165cd2483df90e93833e13580687b6083c3", + "https://deno.land/std@0.140.0/path/_interface.ts": "ee3b431a336b80cf445441109d089b70d87d5e248f4f90ff906820889ecf8d09", + "https://deno.land/std@0.140.0/path/_util.ts": "c1e9686d0164e29f7d880b2158971d805b6e0efc3110d0b3e24e4b8af2190d2b", + "https://deno.land/std@0.140.0/path/common.ts": "bee563630abd2d97f99d83c96c2fa0cca7cee103e8cb4e7699ec4d5db7bd2633", + "https://deno.land/std@0.140.0/path/glob.ts": "cb5255638de1048973c3e69e420c77dc04f75755524cb3b2e160fe9277d939ee", + "https://deno.land/std@0.140.0/path/mod.ts": "d3e68d0abb393fb0bf94a6d07c46ec31dc755b544b13144dee931d8d5f06a52d", + "https://deno.land/std@0.140.0/path/posix.ts": "293cdaec3ecccec0a9cc2b534302dfe308adb6f10861fa183275d6695faace44", + "https://deno.land/std@0.140.0/path/separator.ts": "fe1816cb765a8068afb3e8f13ad272351c85cbc739af56dacfc7d93d710fe0f9", + "https://deno.land/std@0.140.0/path/win32.ts": "31811536855e19ba37a999cd8d1b62078235548d67902ece4aa6b814596dd757", + "https://deno.land/std@0.140.0/streams/conversion.ts": "712585bfa0172a97fb68dd46e784ae8ad59d11b88079d6a4ab098ff42e697d21", + "https://deno.land/std@0.150.0/media_types/_util.ts": "ce9b4fc4ba1c447dafab619055e20fd88236ca6bdd7834a21f98bd193c3fbfa1", + "https://deno.land/std@0.150.0/media_types/mod.ts": "2d4b6f32a087029272dc59e0a55ae3cc4d1b27b794ccf528e94b1925795b3118", + "https://deno.land/std@0.150.0/media_types/vendor/mime-db.v1.52.0.ts": "724cee25fa40f1a52d3937d6b4fbbfdd7791ff55e1b7ac08d9319d5632c7f5af", + "https://deno.land/std@0.161.0/encoding/base64.ts": "c57868ca7fa2fbe919f57f88a623ad34e3d970d675bdc1ff3a9d02bba7409db2", + "https://deno.land/std@0.166.0/_util/asserts.ts": "d0844e9b62510f89ce1f9878b046f6a57bf88f208a10304aab50efcb48365272", + "https://deno.land/std@0.166.0/_util/os.ts": "8a33345f74990e627b9dfe2de9b040004b08ea5146c7c9e8fe9a29070d193934", + "https://deno.land/std@0.166.0/flags/mod.ts": "3b459daf581e047819b6b799c92b96c81b4eecbd5ea025643d54dc0abc6ac923", + "https://deno.land/std@0.166.0/fmt/colors.ts": "9e36a716611dcd2e4865adea9c4bec916b5c60caad4cdcdc630d4974e6bb8bd4", + "https://deno.land/std@0.166.0/fs/_util.ts": "fdc156f897197f261a1c096dcf8ff9267ed0ff42bd5b31f55053a4763a4bae3b", + "https://deno.land/std@0.166.0/fs/copy.ts": "37ad2d3390a672a34baf7d16a8623238906a1ee9b2c5fffc8efaa97810f4e6a9", + "https://deno.land/std@0.166.0/fs/empty_dir.ts": "c15a0aaaf40f8c21cca902aa1e01a789ad0c2fd1b7e2eecf4957053c5dbf707f", + "https://deno.land/std@0.166.0/fs/ensure_dir.ts": "76395fc1c989ca8d2de3aedfa8240eb8f5225cde20f926de957995b063135b80", + "https://deno.land/std@0.166.0/fs/ensure_file.ts": "b8e32ea63aa21221d0219760ba3f741f682d7f7d68d0d24a3ec067c338568152", + "https://deno.land/std@0.166.0/fs/ensure_link.ts": "5cc1c04f18487d7d1edf4c5469705f30b61390ffd24ad7db6df85e7209b32bb2", + "https://deno.land/std@0.166.0/fs/ensure_symlink.ts": "5273557b8c50be69477aa9cb003b54ff2240a336db52a40851c97abce76b96ab", + "https://deno.land/std@0.166.0/fs/eol.ts": "65b1e27320c3eec6fb653b27e20056ee3d015d3e91db388cfefa41616ebc7cb3", + "https://deno.land/std@0.166.0/fs/exists.ts": "6a447912e49eb79cc640adacfbf4b0baf8e17ede6d5bed057062ce33c4fa0d68", + "https://deno.land/std@0.166.0/fs/expand_glob.ts": "d08678afa768881b055bdfb5cebe4f089f8db4513a4d2b0bbe748f5870d77ce3", + "https://deno.land/std@0.166.0/fs/mod.ts": "354a6f972ef4e00c4dd1f1339a8828ef0764c1c23d3c0010af3fcc025d8655b0", + "https://deno.land/std@0.166.0/fs/move.ts": "6d7fa9da60dbc7a32dd7fdbc2ff812b745861213c8e92ba96dace0669b0c378c", + "https://deno.land/std@0.166.0/fs/walk.ts": "0a754cc4696a15bdb175380a4b7deff3eb65be9768cb11d91a4138beee35c2d7", + "https://deno.land/std@0.166.0/path/_constants.ts": "df1db3ffa6dd6d1252cc9617e5d72165cd2483df90e93833e13580687b6083c3", + "https://deno.land/std@0.166.0/path/_interface.ts": "ee3b431a336b80cf445441109d089b70d87d5e248f4f90ff906820889ecf8d09", + "https://deno.land/std@0.166.0/path/_util.ts": "d16be2a16e1204b65f9d0dfc54a9bc472cafe5f4a190b3c8471ec2016ccd1677", + "https://deno.land/std@0.166.0/path/common.ts": "bee563630abd2d97f99d83c96c2fa0cca7cee103e8cb4e7699ec4d5db7bd2633", + "https://deno.land/std@0.166.0/path/glob.ts": "cb5255638de1048973c3e69e420c77dc04f75755524cb3b2e160fe9277d939ee", + "https://deno.land/std@0.166.0/path/mod.ts": "56fec03ad0ebd61b6ab39ddb9b0ddb4c4a5c9f2f4f632e09dd37ec9ebfd722ac", + "https://deno.land/std@0.166.0/path/posix.ts": "6b63de7097e68c8663c84ccedc0fd977656eb134432d818ecd3a4e122638ac24", + "https://deno.land/std@0.166.0/path/separator.ts": "fe1816cb765a8068afb3e8f13ad272351c85cbc739af56dacfc7d93d710fe0f9", + "https://deno.land/std@0.166.0/path/win32.ts": "7cebd2bda6657371adc00061a1d23fdd87bcdf64b4843bb148b0b24c11b40f69", + "https://deno.land/std@0.181.0/_util/asserts.ts": "178dfc49a464aee693a7e285567b3d0b555dc805ff490505a8aae34f9cfb1462", + "https://deno.land/std@0.181.0/_util/os.ts": "d932f56d41e4f6a6093d56044e29ce637f8dcc43c5a90af43504a889cf1775e3", + "https://deno.land/std@0.181.0/fs/_util.ts": "65381f341af1ff7f40198cee15c20f59951ac26e51ddc651c5293e24f9ce6f32", + "https://deno.land/std@0.181.0/fs/ensure_dir.ts": "dc64c4c75c64721d4e3fb681f1382f803ff3d2868f08563ff923fdd20d071c40", + "https://deno.land/std@0.181.0/fs/expand_glob.ts": "e4f56259a0a70fe23f05215b00de3ac5e6ba46646ab2a06ebbe9b010f81c972a", + "https://deno.land/std@0.181.0/fs/walk.ts": "ea95ffa6500c1eda6b365be488c056edc7c883a1db41ef46ec3bf057b1c0fe32", + "https://deno.land/std@0.181.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0", + "https://deno.land/std@0.181.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b", + "https://deno.land/std@0.181.0/path/_util.ts": "d7abb1e0dea065f427b89156e28cdeb32b045870acdf865833ba808a73b576d0", + "https://deno.land/std@0.181.0/path/common.ts": "ee7505ab01fd22de3963b64e46cff31f40de34f9f8de1fff6a1bd2fe79380000", + "https://deno.land/std@0.181.0/path/glob.ts": "d479e0a695621c94d3fd7fe7abd4f9499caf32a8de13f25073451c6ef420a4e1", + "https://deno.land/std@0.181.0/path/mod.ts": "bf718f19a4fdd545aee1b06409ca0805bd1b68ecf876605ce632e932fe54510c", + "https://deno.land/std@0.181.0/path/posix.ts": "8b7c67ac338714b30c816079303d0285dd24af6b284f7ad63da5b27372a2c94d", + "https://deno.land/std@0.181.0/path/separator.ts": "0fb679739d0d1d7bf45b68dacfb4ec7563597a902edbaf3c59b50d5bcadd93b1", + "https://deno.land/std@0.181.0/path/win32.ts": "d186344e5583bcbf8b18af416d13d82b35a317116e6460a5a3953508c3de5bba", + "https://deno.land/std@0.182.0/_util/asserts.ts": "178dfc49a464aee693a7e285567b3d0b555dc805ff490505a8aae34f9cfb1462", + "https://deno.land/std@0.182.0/_util/os.ts": "d932f56d41e4f6a6093d56044e29ce637f8dcc43c5a90af43504a889cf1775e3", + "https://deno.land/std@0.182.0/fmt/colors.ts": "d67e3cd9f472535241a8e410d33423980bec45047e343577554d3356e1f0ef4e", + "https://deno.land/std@0.182.0/fs/_util.ts": "65381f341af1ff7f40198cee15c20f59951ac26e51ddc651c5293e24f9ce6f32", + "https://deno.land/std@0.182.0/fs/empty_dir.ts": "c3d2da4c7352fab1cf144a1ecfef58090769e8af633678e0f3fabaef98594688", + "https://deno.land/std@0.182.0/fs/expand_glob.ts": "e4f56259a0a70fe23f05215b00de3ac5e6ba46646ab2a06ebbe9b010f81c972a", + "https://deno.land/std@0.182.0/fs/walk.ts": "920be35a7376db6c0b5b1caf1486fb962925e38c9825f90367f8f26b5e5d0897", + "https://deno.land/std@0.182.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0", + "https://deno.land/std@0.182.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b", + "https://deno.land/std@0.182.0/path/_util.ts": "d7abb1e0dea065f427b89156e28cdeb32b045870acdf865833ba808a73b576d0", + "https://deno.land/std@0.182.0/path/common.ts": "ee7505ab01fd22de3963b64e46cff31f40de34f9f8de1fff6a1bd2fe79380000", + "https://deno.land/std@0.182.0/path/glob.ts": "d479e0a695621c94d3fd7fe7abd4f9499caf32a8de13f25073451c6ef420a4e1", + "https://deno.land/std@0.182.0/path/mod.ts": "bf718f19a4fdd545aee1b06409ca0805bd1b68ecf876605ce632e932fe54510c", + "https://deno.land/std@0.182.0/path/posix.ts": "8b7c67ac338714b30c816079303d0285dd24af6b284f7ad63da5b27372a2c94d", + "https://deno.land/std@0.182.0/path/separator.ts": "0fb679739d0d1d7bf45b68dacfb4ec7563597a902edbaf3c59b50d5bcadd93b1", + "https://deno.land/std@0.182.0/path/win32.ts": "d186344e5583bcbf8b18af416d13d82b35a317116e6460a5a3953508c3de5bba", + "https://deno.land/std@0.185.0/semver/mod.ts": "200f50cf6872212667df532fb09f0b1a33d3427a5201f75fad30a0d0c6dbcce3", + "https://deno.land/std@0.202.0/archive/_common.ts": "a25e3f8089ac3fddd968f73693be9d56bd5fbfa1d4b483828dbce829bb518bd2", + "https://deno.land/std@0.202.0/archive/untar.ts": "c3a0100fb005d66c5e42ef55dd268c368b894954fa27c9fb3ecafd73af22e877", + "https://deno.land/std@0.202.0/assert/assert.ts": "9a97dad6d98c238938e7540736b826440ad8c1c1e54430ca4c4e623e585607ee", + "https://deno.land/std@0.202.0/assert/assertion_error.ts": "4d0bde9b374dfbcbe8ac23f54f567b77024fb67dbb1906a852d67fe050d42f56", + "https://deno.land/std@0.202.0/assert/equal.ts": "9f1a46d5993966d2596c44e5858eec821859b45f783a5ee2f7a695dfc12d8ece", + "https://deno.land/std@0.202.0/async/deferred.ts": "42790112f36a75a57db4a96d33974a936deb7b04d25c6084a9fa8a49f135def8", + "https://deno.land/std@0.202.0/bytes/concat.ts": "d26d6f3d7922e6d663dacfcd357563b7bf4a380ce5b9c2bbe0c8586662f25ce2", + "https://deno.land/std@0.202.0/bytes/copy.ts": "939d89e302a9761dcf1d9c937c7711174ed74c59eef40a1e4569a05c9de88219", + "https://deno.land/std@0.202.0/collections/_utils.ts": "5114abc026ddef71207a79609b984614e66a63a4bda17d819d56b0e72c51527e", + "https://deno.land/std@0.202.0/collections/deep_merge.ts": "9db788ba56cb05b65c77166b789e58e125dff159b7f41bf4d19dc1cba19ecb8b", + "https://deno.land/std@0.202.0/collections/distinct.ts": "01595bd8e608a5e2de8a8631055587e6f01d68861e463eef34f8e295713500b8", + "https://deno.land/std@0.202.0/collections/distinct_by.ts": "3afe11d81eafb30c7c9dbf568d94357f3d88153292c00671b72cd695deae6602", + "https://deno.land/std@0.202.0/collections/filter_values.ts": "16e1fc456a7969e770ec5b89edf5ac97b295ca534b47c1a83f061b409aad7814", + "https://deno.land/std@0.202.0/collections/map_keys.ts": "3dd2cf3a940f1432628cb0252b919d268e8bb38fe8bcd78153a440909173ae98", + "https://deno.land/std@0.202.0/collections/map_values.ts": "c88f306b2b3ec84043e16ab4e1b062055ab32cf4d68bb1d7447afaafa0a1b3bf", + "https://deno.land/std@0.202.0/crypto/_fnv/fnv32.ts": "e4649dfdefc5c987ed53c3c25db62db771a06d9d1b9c36d2b5cf0853b8e82153", + "https://deno.land/std@0.202.0/crypto/_fnv/fnv64.ts": "bfa0e4702061fdb490a14e6bf5f9168a22fb022b307c5723499469bfefca555e", + "https://deno.land/std@0.202.0/crypto/_fnv/mod.ts": "f956a95f58910f223e420340b7404702ecd429603acd4491fa77af84f746040c", + "https://deno.land/std@0.202.0/crypto/_fnv/util.ts": "accba12bfd80a352e32a872f87df2a195e75561f1b1304a4cb4f5a4648d288f9", + "https://deno.land/std@0.202.0/crypto/_wasm/lib/deno_std_wasm_crypto.generated.mjs": "85b50eee2e511584698c04f1d84155e57452ea963106fee64987c326e9e5d25d", + "https://deno.land/std@0.202.0/crypto/_wasm/mod.ts": "973058e70052c98292b567d1c8396dffc28d6dfc6a44f0763032f6fbdf5222f5", + "https://deno.land/std@0.202.0/crypto/crypto.ts": "c1fac13f11e5150e7690a4d6f09bc09b39d0a13fc5cf129f13617656fea7379e", + "https://deno.land/std@0.202.0/crypto/keystack.ts": "cec9ddf60e0c0c9970360e66c9402afb3c0c68bcd50ef19c68daf63f94e40863", + "https://deno.land/std@0.202.0/crypto/mod.ts": "ae384519e85eca9aeff4e7111ed153df8f3dbda7b35b70850ed4b3e9c8cec4d5", + "https://deno.land/std@0.202.0/crypto/timing_safe_equal.ts": "f6edc08d702f660b1ab3505b74d53a9d499e34a1351f6ab70f5ce8653fee8fb7", + "https://deno.land/std@0.202.0/crypto/to_hash_string.ts": "c78050f72a9d4a690d85e83a85a43c2951d23a04d5b2a4537b2ebc00854421be", + "https://deno.land/std@0.202.0/crypto/unstable/keystack.ts": "624c2f2d8fa6711d44fcb8fbca346e7fb56afa7aa3fcf2d8e6db32978e9fbac2", + "https://deno.land/std@0.202.0/encoding/base64.ts": "144ae6234c1fbe5b68666c711dc15b1e9ee2aef6d42b3b4345bf9a6c91d70d0d", + "https://deno.land/std@0.202.0/encoding/base64url.ts": "2ed4ba122b20fedf226c5d337cf22ee2024fa73a8f85d915d442af7e9ce1fae1", + "https://deno.land/std@0.202.0/encoding/hex.ts": "b4e346619c0535a5db48d6bdb6e057c8d1179c64a2b0ba8d3b0b8a79ae361a90", + "https://deno.land/std@0.202.0/flags/mod.ts": "0948466fc437f017f00c0b972a422b3dc3317a790bcf326429d23182977eaf9f", + "https://deno.land/std@0.202.0/fmt/colors.ts": "c51c4642678eb690dcf5ffee5918b675bf01a33fba82acf303701ae1a4f8c8d9", + "https://deno.land/std@0.202.0/fs/_util.ts": "fbf57dcdc9f7bc8128d60301eece608246971a7836a3bb1e78da75314f08b978", + "https://deno.land/std@0.202.0/fs/copy.ts": "23cc1c465babe5ca4d69778821e2f8addc44593e30a5ca0b902b3784eed75bb6", + "https://deno.land/std@0.202.0/fs/empty_dir.ts": "2e52cd4674d18e2e007175c80449fc3d263786a1361e858d9dfa9360a6581b47", + "https://deno.land/std@0.202.0/fs/ensure_dir.ts": "dc64c4c75c64721d4e3fb681f1382f803ff3d2868f08563ff923fdd20d071c40", + "https://deno.land/std@0.202.0/fs/ensure_file.ts": "39ac83cc283a20ec2735e956adf5de3e8a3334e0b6820547b5772f71c49ae083", + "https://deno.land/std@0.202.0/fs/ensure_link.ts": "c15e69c48556d78aae31b83e0c0ece04b7b8bc0951412f5b759aceb6fde7f0ac", + "https://deno.land/std@0.202.0/fs/ensure_symlink.ts": "b389c8568f0656d145ac7ece472afe710815cccbb2ebfd19da7978379ae143fe", + "https://deno.land/std@0.202.0/fs/eol.ts": "f1f2eb348a750c34500741987b21d65607f352cf7205f48f4319d417fff42842", + "https://deno.land/std@0.202.0/fs/exists.ts": "cb59a853d84871d87acab0e7936a4dac11282957f8e195102c5a7acb42546bb8", + "https://deno.land/std@0.202.0/fs/expand_glob.ts": "52b8b6f5b1fa585c348250da1c80ce5d820746cb4a75d874b3599646f677d3a7", + "https://deno.land/std@0.202.0/fs/mod.ts": "bc3d0acd488cc7b42627044caf47d72019846d459279544e1934418955ba4898", + "https://deno.land/std@0.202.0/fs/move.ts": "b4f8f46730b40c32ea3c0bc8eb0fd0e8139249a698883c7b3756424cf19785c9", + "https://deno.land/std@0.202.0/fs/walk.ts": "a16146724a6aaf9efdb92023a74e9805195c3469900744ce5de4113b07b29779", + "https://deno.land/std@0.202.0/http/cookie.ts": "c6079019fc15c781c302574f40fa2ac71c26b251e8f74eb236ea43e0424edcd7", + "https://deno.land/std@0.202.0/io/buf_reader.ts": "0bd8ad26255945b5f418940db23db03bee0c160dbb5ae4627e2c0be3b361df6a", + "https://deno.land/std@0.202.0/io/buf_writer.ts": "48c33c8f00b61dcbc7958706741cec8e59810bd307bc6a326cbd474fe8346dfd", + "https://deno.land/std@0.202.0/io/buffer.ts": "4d6883daeb2e698579c4064170515683d69f40f3de019bfe46c5cf31e74ae793", + "https://deno.land/std@0.202.0/log/handlers.ts": "3a0883f65567f59a9a88e44c972b24b924621bc28ead91af11d7a6da93c4a64c", + "https://deno.land/std@0.202.0/log/levels.ts": "6309147664e9e008cd6671610f2505c4c95f181f6bae4816a84b33e0aec66859", + "https://deno.land/std@0.202.0/log/logger.ts": "180c50a07c43a556dc5794e913c82946399e89d683201d01c8f0091e1e4ae3fc", + "https://deno.land/std@0.202.0/log/mod.ts": "a274d2129c8d08d4c96e0fb165a595e6c730b5130b437a9ce04364156bfe955a", + "https://deno.land/std@0.202.0/path/_basename.ts": "057d420c9049821f983f784fd87fa73ac471901fb628920b67972b0f44319343", + "https://deno.land/std@0.202.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0", + "https://deno.land/std@0.202.0/path/_dirname.ts": "355e297236b2218600aee7a5301b937204c62e12da9db4b0b044993d9e658395", + "https://deno.land/std@0.202.0/path/_extname.ts": "eaaa5aae1acf1f03254d681bd6a8ce42a9cb5b7ff2213a9d4740e8ab31283664", + "https://deno.land/std@0.202.0/path/_format.ts": "4a99270d6810f082e614309164fad75d6f1a483b68eed97c830a506cc589f8b4", + "https://deno.land/std@0.202.0/path/_from_file_url.ts": "6eadfae2e6f63ad9ee46b26db4a1b16583055c0392acedfb50ed2fc694b6f581", + "https://deno.land/std@0.202.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b", + "https://deno.land/std@0.202.0/path/_is_absolute.ts": "05dac10b5e93c63198b92e3687baa2be178df5321c527dc555266c0f4f51558c", + "https://deno.land/std@0.202.0/path/_join.ts": "815f5e85b042285175b1492dd5781240ce126c23bd97bad6b8211fe7129c538e", + "https://deno.land/std@0.202.0/path/_normalize.ts": "a19ec8706b2707f9dd974662a5cd89fad438e62ab1857e08b314a8eb49a34d81", + "https://deno.land/std@0.202.0/path/_os.ts": "30b0c2875f360c9296dbe6b7f2d528f0f9c741cecad2e97f803f5219e91b40a2", + "https://deno.land/std@0.202.0/path/_parse.ts": "0f9b0ff43682dd9964eb1c4398610c4e165d8db9d3ac9d594220217adf480cfa", + "https://deno.land/std@0.202.0/path/_relative.ts": "27bdeffb5311a47d85be26d37ad1969979359f7636c5cd9fcf05dcd0d5099dc5", + "https://deno.land/std@0.202.0/path/_resolve.ts": "7a3616f1093735ed327e758313b79c3c04ea921808ca5f19ddf240cb68d0adf6", + "https://deno.land/std@0.202.0/path/_to_file_url.ts": "a141e4a525303e1a3a0c0571fd024552b5f3553a2af7d75d1ff3a503dcbb66d8", + "https://deno.land/std@0.202.0/path/_to_namespaced_path.ts": "0d5f4caa2ed98ef7a8786286df6af804b50e38859ae897b5b5b4c8c5930a75c8", + "https://deno.land/std@0.202.0/path/_util.ts": "4e191b1bac6b3bf0c31aab42e5ca2e01a86ab5a0d2e08b75acf8585047a86221", + "https://deno.land/std@0.202.0/path/basename.ts": "bdfa5a624c6a45564dc6758ef2077f2822978a6dbe77b0a3514f7d1f81362930", + "https://deno.land/std@0.202.0/path/common.ts": "ee7505ab01fd22de3963b64e46cff31f40de34f9f8de1fff6a1bd2fe79380000", + "https://deno.land/std@0.202.0/path/dirname.ts": "b6533f4ee4174a526dec50c279534df5345836dfdc15318400b08c62a62a39dd", + "https://deno.land/std@0.202.0/path/extname.ts": "62c4b376300795342fe1e4746c0de518b4dc9c4b0b4617bfee62a2973a9555cf", + "https://deno.land/std@0.202.0/path/format.ts": "110270b238514dd68455a4c54956215a1aff7e37e22e4427b7771cefe1920aa5", + "https://deno.land/std@0.202.0/path/from_file_url.ts": "9f5cb58d58be14c775ec2e57fc70029ac8b17ed3bd7fe93e475b07280adde0ac", + "https://deno.land/std@0.202.0/path/glob.ts": "593e2c3573883225c25c5a21aaa8e9382a696b8e175ea20a3b6a1471ad17aaed", + "https://deno.land/std@0.202.0/path/is_absolute.ts": "0b92eb35a0a8780e9f16f16bb23655b67dace6a8e0d92d42039e518ee38103c1", + "https://deno.land/std@0.202.0/path/join.ts": "31c5419f23d91655b08ec7aec403f4e4cd1a63d39e28f6e42642ea207c2734f8", + "https://deno.land/std@0.202.0/path/mod.ts": "6e1efb0b13121463aedb53ea51dabf5639a3172ab58c89900bbb72b486872532", + "https://deno.land/std@0.202.0/path/normalize.ts": "6ea523e0040979dd7ae2f1be5bf2083941881a252554c0f32566a18b03021955", + "https://deno.land/std@0.202.0/path/parse.ts": "be8de342bb9e1924d78dc4d93c45215c152db7bf738ec32475560424b119b394", + "https://deno.land/std@0.202.0/path/posix.ts": "0a1c1952d132323a88736d03e92bd236f3ed5f9f079e5823fae07c8d978ee61b", + "https://deno.land/std@0.202.0/path/relative.ts": "8bedac226afd360afc45d451a6c29fabceaf32978526bcb38e0c852661f66c61", + "https://deno.land/std@0.202.0/path/resolve.ts": "133161e4949fc97f9ca67988d51376b0f5eef8968a6372325ab84d39d30b80dc", + "https://deno.land/std@0.202.0/path/separator.ts": "40a3e9a4ad10bef23bc2cd6c610291b6c502a06237c2c4cd034a15ca78dedc1f", + "https://deno.land/std@0.202.0/path/to_file_url.ts": "00e6322373dd51ad109956b775e4e72e5f9fa68ce2c6b04e4af2a6eed3825d31", + "https://deno.land/std@0.202.0/path/to_namespaced_path.ts": "1b1db3055c343ab389901adfbda34e82b7386bcd1c744d54f9c1496ee0fd0c3d", + "https://deno.land/std@0.202.0/path/win32.ts": "8b3f80ef7a462511d5e8020ff490edcaa0a0d118f1b1e9da50e2916bdd73f9dd", + "https://deno.land/std@0.202.0/semver/_shared.ts": "8547ccf91b36c30fb2a8a17d7081df13f4ae694c4aa44c39799eba69ad0dcb23", + "https://deno.land/std@0.202.0/semver/cmp.ts": "12c30b5888afd9e414defef64f881a478ff9ab11bd329ed6c5844b74eea5c971", + "https://deno.land/std@0.202.0/semver/comparator_format.ts": "329e05d914c064590ded4801fc601bf1c5d0f461c5524b1578e10f180551ef6f", + "https://deno.land/std@0.202.0/semver/comparator_intersects.ts": "61920121a6c1600306dbcf8944c4cc55e45c3a1bdbefe41b79a0884bf02d9e1b", + "https://deno.land/std@0.202.0/semver/comparator_max.ts": "f4cc5f528abd8aab68c66bbead732e3c59102b13a318cd8e4f8a47aa3debec76", + "https://deno.land/std@0.202.0/semver/comparator_min.ts": "eea382428ebf0c50168f780898df8519c88da5a10d1f8babbfebdc89fb75942e", + "https://deno.land/std@0.202.0/semver/compare.ts": "782e03b5107648bebaaebf0e33a9a7d6a0481eb88d2f7be8e857e4abbfdf42c0", + "https://deno.land/std@0.202.0/semver/compare_build.ts": "5d6ebc0106f1ed46e391d6c234e071934ba30938fa818c9cc3da67c7c7494c02", + "https://deno.land/std@0.202.0/semver/constants.ts": "bb0c7652c433c7ec1dad5bf18c7e7e1557efe9ddfd5e70aa6305153e76dc318c", + "https://deno.land/std@0.202.0/semver/difference.ts": "966ef286f0bfde53ebfb74a727c607b05a7fdce623a678794d088166b9b9afdf", + "https://deno.land/std@0.202.0/semver/eq.ts": "6ddb84ce8c95f18e9b7a46d8a63b1e6ca5f0c0f651f1f46f20db6543b390c3f3", + "https://deno.land/std@0.202.0/semver/format.ts": "236cc8b5d2e8031258dcff3ca89e14ba926434d5b789730e2c781db172e76bd9", + "https://deno.land/std@0.202.0/semver/gt.ts": "8529cf2ae1bca95c22801cf38f93620dc802c5dcbc02f863437571b970de3705", + "https://deno.land/std@0.202.0/semver/gte.ts": "b54f7855ac37ff076d6df9a294e944356754171f94f5cb974af782480a9f1fd0", + "https://deno.land/std@0.202.0/semver/gtr.ts": "d2ec1f02ce6a566b7df76a188af7315d802c6069892d460d631a3b0d9e2b1a45", + "https://deno.land/std@0.202.0/semver/increment.ts": "a6e5ac018887244731a4b936743ae14476cc432ac874f1c9848711b4000c5991", + "https://deno.land/std@0.202.0/semver/is_semver.ts": "666f4e1d8e41994150d4326d515046bc5fc72e59cbbd6e756a0b60548dcd00b5", + "https://deno.land/std@0.202.0/semver/is_semver_comparator.ts": "035aa894415ad1c8f50a6b6f52ea49c62d6f3af62b5d6fca9c1f4cb84f1896fd", + "https://deno.land/std@0.202.0/semver/is_semver_range.ts": "6f9b4f1c937a202750cae9444900d8abe4a68cc3bf5bb90f0d49c08cf85308cb", + "https://deno.land/std@0.202.0/semver/lt.ts": "081614b5adbc5bc944649e09af946a90a4b4bdb3d65a67c005183994504f04c2", + "https://deno.land/std@0.202.0/semver/lte.ts": "f8605c17d620bfb3aa57775643e3c560c04f7c20f2e431f64ca5b2ea39e36217", + "https://deno.land/std@0.202.0/semver/ltr.ts": "975e672b5ca8aa67336660653f8c76e1db829c628fb08ea3e815a9a12fa7eb9c", + "https://deno.land/std@0.202.0/semver/max_satisfying.ts": "75406901818cd1127a6332e007e96285474e833d0e40dbbfddc01b08ee6e51f2", + "https://deno.land/std@0.202.0/semver/min_satisfying.ts": "58bd48033a00e63bea0709f78c33c66ea58bce2dbebda0d54d3fdc6db7d0d298", + "https://deno.land/std@0.202.0/semver/mod.ts": "442702e8a57cbf02e68868c46ffe66ecf6efbde58d72cfdfbdaa51ad0c4af513", + "https://deno.land/std@0.202.0/semver/neq.ts": "e91b699681c3b406fc3d661d4eac7aa36cd1cc8bf188f8e3c7b53cc340775b87", + "https://deno.land/std@0.202.0/semver/outside.ts": "1d225fdb42172d946c382e144ce97c402812741741bbe299561aa164cc956ec4", + "https://deno.land/std@0.202.0/semver/parse.ts": "0e62409c25accf9756cb3eb288d5b5bc15fc2385d2344c912625bc1939136882", + "https://deno.land/std@0.202.0/semver/parse_comparator.ts": "f07f9be8322b1f61a36b94c3c65a0dc4124958ee54cf744c92ca4028bf156d5e", + "https://deno.land/std@0.202.0/semver/parse_range.ts": "39a18608a8026004b218ef383e7ae624a9e663b82327948c1810f16d875113c2", + "https://deno.land/std@0.202.0/semver/range_format.ts": "3de31fd0b74dd565e052840e73a8e9ee1d9d289ca60b85749167710b978cc078", + "https://deno.land/std@0.202.0/semver/range_intersects.ts": "8672e603df1bb68a02452b634021c4913395f4d16d75c21b578d6f4175a2b2c1", + "https://deno.land/std@0.202.0/semver/range_max.ts": "9c10c65bbc7796347ce6f765a77865cead88870d17481ac78259400a2378af2e", + "https://deno.land/std@0.202.0/semver/range_min.ts": "b7849e70e0b0677b382eddaa822b6690521449a659c5b8ec84cbd438f6e6ca59", + "https://deno.land/std@0.202.0/semver/rcompare.ts": "b8b9f5108d40c64cf50ffe455199aba7ad64995829a17110301ae3f8290374ee", + "https://deno.land/std@0.202.0/semver/rsort.ts": "a9139a1fc37570f9d8b6517032d152cf69143cec89d4342f19174e48f06d8543", + "https://deno.land/std@0.202.0/semver/sort.ts": "c058a5b2c8e866fa8e6ef25c9d228133357caf4c140f129bfc368334fcd0813b", + "https://deno.land/std@0.202.0/semver/test_comparator.ts": "eff5394cb82d133ed18f96fe547de7e7264bf0d25d16cbc6126664aa06ef8f37", + "https://deno.land/std@0.202.0/semver/test_range.ts": "b236c276268e92bbbc65e7c4b4b6b685ea6b4534a71b2525b53093d094f631c6", + "https://deno.land/std@0.202.0/semver/types.ts": "d44f442c2f27dd89bd6695b369e310b80549746f03c38f241fe28a83b33dd429", + "https://deno.land/std@0.202.0/streams/_common.ts": "3b2c1f0287ce2ad51fff4091a7d0f48375c85b0ec341468e76d5ac13bb0014dd", + "https://deno.land/std@0.202.0/streams/buffer.ts": "6cd773d22cf21bb988a98cc551b5abfc4c3b03516f93eaa3fb6f2f6e16032deb", + "https://deno.land/std@0.202.0/streams/byte_slice_stream.ts": "c46d7c74836fc8c1a9acd9fe211cbe1bbaaee1b36087c834fb03af4991135c3a", + "https://deno.land/std@0.202.0/streams/copy.ts": "bbd406bd9a71034a412c05bb0fd8b7964cc7f2e2ad0f0a1cc0463cdc816d540b", + "https://deno.land/std@0.202.0/streams/delimiter_stream.ts": "ea793d21bfaae27163f0b50d26298a2ad543803283aeaff082df50dd9c08614f", + "https://deno.land/std@0.202.0/streams/early_zip_readable_streams.ts": "4005fa74162b943f79899e5d7cb96adcbc0a6b867f9144974ed12d30e0a556e1", + "https://deno.land/std@0.202.0/streams/iterate_reader.ts": "3b42d3056c8ccade561f1c7ac22d5e671e745933d9f9168fd3b5913588d911c3", + "https://deno.land/std@0.202.0/streams/limited_bytes_transform_stream.ts": "05dc592ffaab83257494d22dd53917e56243c26e5e3129b3f13ddbbbc4785048", + "https://deno.land/std@0.202.0/streams/limited_transform_stream.ts": "d69ab790232c1b86f53621ad41ef03c235f2abb4b7a1cd51960ad6e12ee55e38", + "https://deno.land/std@0.202.0/streams/merge_readable_streams.ts": "dc2db0cbf1b14d999aa2aa2a2a1ba24ce58953878f29845ed9319321d0a01fab", + "https://deno.land/std@0.202.0/streams/mod.ts": "e133c271474f1e9dc19f5c4959406f5c2101540c56a3e7d7abc6bdb7bcef807e", + "https://deno.land/std@0.202.0/streams/read_all.ts": "3b20a50af87d1bfebefa9c2dbda49e2b214d8ab0382ffdcc8ce858af80a912be", + "https://deno.land/std@0.202.0/streams/readable_stream_from_reader.ts": "c4078b6fd4832748f979cb211facf483c82a840f3c0d88752f46d4dcddb3110a", + "https://deno.land/std@0.202.0/streams/reader_from_iterable.ts": "91d578a6c75e443654a75580a67cf3af1eeb4b186fa0b309f35b49c9c53be2b7", + "https://deno.land/std@0.202.0/streams/reader_from_stream_reader.ts": "53dfdb6c608005eb9e0610a9f9cbc51c66f34a519363f1abd4e8a09ab4ad8f9e", + "https://deno.land/std@0.202.0/streams/text_delimiter_stream.ts": "f0dc8ff953a8a77f0d1fa8db1fee62de817f36e20d79b00b1362847e30fbdd90", + "https://deno.land/std@0.202.0/streams/text_line_stream.ts": "0f2c4b33a5fdb2476f2e060974cba1347cefe99a4af33c28a57524b1a34750fa", + "https://deno.land/std@0.202.0/streams/to_array_buffer.ts": "de5803ef98cf2bfd8eeaaa17ae4f4d0364377bd6f6e425110e7010c1cb48196b", + "https://deno.land/std@0.202.0/streams/to_blob.ts": "4cf929b3ffe5d4dbe445d572246159ee2eebf69e998a0ba867b9048fb6e92797", + "https://deno.land/std@0.202.0/streams/to_json.ts": "10635fac9826392bb8e70bc8354d3beb1058fa1676aa9b6f98257a0d5575f520", + "https://deno.land/std@0.202.0/streams/to_text.ts": "4018b5f7a0e7ab28d6957c239e401f8b534ef326b7ebd282ca76b3cd55380aab", + "https://deno.land/std@0.202.0/streams/to_transform_stream.ts": "50af06140c414090df8c3879f46bed4043a5d73caa60352c0c9682a88ec7a8c9", + "https://deno.land/std@0.202.0/streams/writable_stream_from_writer.ts": "b5ee3ef4d5be0b3214cddf0f87e804a6a31b9a5632c96277912e7543eaec9f40", + "https://deno.land/std@0.202.0/streams/write_all.ts": "4cdd36256f892fe7aead46338054f6ea813a63765e87bda4c60e8c5a57d1c5c1", + "https://deno.land/std@0.202.0/streams/writer_from_stream_writer.ts": "7188ce589d6179693b488b478c05137d4d15b93735ca26ec01e6e44aed8cb0c6", + "https://deno.land/std@0.202.0/streams/zip_readable_streams.ts": "5639c8fea8c21d7dab6f34edcf3d08218b7e548a197f7fd79a3a995305a81e9f", + "https://deno.land/std@0.202.0/url/_strip.ts": "86f852d266b86e5867f50ac5d453bedea7b7e7a1919669df93d66a0b59b00e5b", + "https://deno.land/std@0.202.0/url/basename.ts": "232e7570ee75fdaafe205e6216a8c0c4a6236db32a1fe81ac3d5a1adbb8365fa", + "https://deno.land/std@0.202.0/url/dirname.ts": "d87f87b80aa76027b43c46db7274a5c877021a02e1ca723a603b58b63c7db8e9", + "https://deno.land/std@0.202.0/url/extname.ts": "1e1980999f422f42e4bded4b746fa380a1a6cd79ff85ce3cf5107d28d9f131dd", + "https://deno.land/std@0.202.0/url/join.ts": "157be552aec2d325b07c2fd9fa4643153659c044071cff8ffd62f80b4cbb792c", + "https://deno.land/std@0.202.0/url/mod.ts": "d4e4db2f85a4a1613d824367b750f36bbd1c0ff791daae2eb74795d292c722bb", + "https://deno.land/std@0.202.0/url/normalize.ts": "1214f4590119491e891e89cef22f5fa2825ecd51781b0e985952c460b218cba1", + "https://deno.land/std@0.202.0/uuid/_common.ts": "cb1441f4df460571fc0919e1c5c217f3e7006189b703caf946604b3f791ae34d", + "https://deno.land/std@0.202.0/uuid/constants.ts": "0d0e95561343da44adb4a4edbc1f04cef48b0d75288c4d1704f58743f4a50d88", + "https://deno.land/std@0.202.0/uuid/mod.ts": "5c7ca252dddba1ddf0bca2dc1124328245272650c98251d71996bb9cd8f5a386", + "https://deno.land/std@0.202.0/uuid/v1.ts": "fe36009afce7ced96e1b5928565e12c5a8eb0df1a2b5063c0a72bda6b75c0de5", + "https://deno.land/std@0.202.0/uuid/v3.ts": "49bd2a5cd19f043c88777a8daeaa453f96cc586129af78863aa34dadf27d5fd0", + "https://deno.land/std@0.202.0/uuid/v4.ts": "0f081880c156fd59b9e44e2f84ea0f94a3627e89c224eaf6cc982b53d849f37e", + "https://deno.land/std@0.202.0/uuid/v5.ts": "a102f716fc8d31b7e7e4376b1e7d6a255c39858bda6e5f672a4bb3cbd67405d0", + "https://deno.land/std@0.211.0/assert/assert.ts": "bec068b2fccdd434c138a555b19a2c2393b71dfaada02b7d568a01541e67cdc5", + "https://deno.land/std@0.211.0/assert/assertion_error.ts": "9f689a101ee586c4ce92f52fa7ddd362e86434ffdf1f848e45987dc7689976b8", + "https://deno.land/std@0.211.0/async/delay.ts": "eab3187eee39ccc8cc76d411fb21fb1801250ddb1090e486d5aec2ace5403391", + "https://deno.land/std@0.211.0/bytes/concat.ts": "9cac3b4376afbef98ff03588eb3cf948e0d1eb6c27cfe81a7651ab6dd3adc54a", + "https://deno.land/std@0.211.0/bytes/copy.ts": "f29c03168853720dfe82eaa57793d0b9e3543ebfe5306684182f0f1e3bfd422a", + "https://deno.land/std@0.211.0/io/buf_reader.ts": "3ee2cf0d6570ec1ede46efd5d0b0701719dc573f103a123d2cf9f4bfbc36af31", + "https://deno.land/std@0.211.0/io/buf_writer.ts": "214134bd77bc46e4478cf74b771dfb614b9e23b313df513a34c54aa88df81584", + "https://deno.land/std@0.219.0/assert/assert.ts": "bec068b2fccdd434c138a555b19a2c2393b71dfaada02b7d568a01541e67cdc5", + "https://deno.land/std@0.219.0/assert/assert_exists.ts": "24a7bf965e634f909242cd09fbaf38bde6b791128ece08e33ab08586a7cc55c9", + "https://deno.land/std@0.219.0/assert/assertion_error.ts": "9f689a101ee586c4ce92f52fa7ddd362e86434ffdf1f848e45987dc7689976b8", + "https://deno.land/std@0.219.0/bytes/concat.ts": "9cac3b4376afbef98ff03588eb3cf948e0d1eb6c27cfe81a7651ab6dd3adc54a", + "https://deno.land/std@0.219.0/bytes/copy.ts": "f29c03168853720dfe82eaa57793d0b9e3543ebfe5306684182f0f1e3bfd422a", + "https://deno.land/std@0.219.0/flags/mod.ts": "9f13f3a49c54618277ac49195af934f1c7d235731bcf80fd33b8b234e6839ce9", + "https://deno.land/std@0.219.0/fmt/colors.ts": "d239d84620b921ea520125d778947881f62c50e78deef2657073840b8af9559a", + "https://deno.land/std@0.219.0/fmt/duration.ts": "606f8c2bbbadd7f7a122868a478c9ad31f2e66b1e19e0a9769655585414fced6", + "https://deno.land/std@0.219.0/fs/_create_walk_entry.ts": "5d9d2aaec05bcf09a06748b1684224d33eba7a4de24cf4cf5599991ca6b5b412", + "https://deno.land/std@0.219.0/fs/_get_file_info_type.ts": "da7bec18a7661dba360a1db475b826b18977582ce6fc9b25f3d4ee0403fe8cbd", + "https://deno.land/std@0.219.0/fs/_is_same_path.ts": "709c95868345fea051c58b9e96af95cff94e6ae98dfcff2b66dee0c212c4221f", + "https://deno.land/std@0.219.0/fs/_is_subdir.ts": "c68b309d46cc8568ed83c000f608a61bbdba0943b7524e7a30f9e450cf67eecd", + "https://deno.land/std@0.219.0/fs/_to_path_string.ts": "29bfc9c6c112254961d75cbf6ba814d6de5349767818eb93090cecfa9665591e", + "https://deno.land/std@0.219.0/fs/copy.ts": "dc0f68c4b6c3b090bfdb909387e309f6169b746bd713927c9507c9ef545d71f6", + "https://deno.land/std@0.219.0/fs/empty_dir.ts": "4f01e6d56e2aa8d90ad60f20bc25601f516b00f6c3044cdf6863a058791d91aa", + "https://deno.land/std@0.219.0/fs/ensure_dir.ts": "dffff68de0d10799b5aa9e39dec4e327e12bbd29e762292193684542648c4aeb", + "https://deno.land/std@0.219.0/fs/ensure_file.ts": "ac5cfde94786b0284d2c8e9f7f9425269bea1b2140612b4aea1f20b508870f59", + "https://deno.land/std@0.219.0/fs/ensure_link.ts": "d42af2edefeaa9817873ec6e46dc5d209ac4d744f8c69c5ecc2dffade78465b6", + "https://deno.land/std@0.219.0/fs/ensure_symlink.ts": "1f64d7bdd191f7d9b71264e191902fcae5cec86305d54659897944caea70f814", + "https://deno.land/std@0.219.0/fs/eol.ts": "c9807291f78361d49fd986a9be04654610c615c5e2ec63d748976197d30ff206", + "https://deno.land/std@0.219.0/fs/exists.ts": "d2757ef764eaf5c6c5af7228e8447db2de42ab084a2dae540097f905723d83f5", + "https://deno.land/std@0.219.0/fs/expand_glob.ts": "a1ce02b05ed7b96985b0665067c9f1018f3f2ade7ee0fb0d629231050260b158", + "https://deno.land/std@0.219.0/fs/mod.ts": "107f5afa4424c2d3ce2f7e9266173198da30302c69af662c720115fe504dc5ee", + "https://deno.land/std@0.219.0/fs/move.ts": "39e0d7ccb88a566d20b949712020e766b15ef1ec19159573d11f949bd677909c", + "https://deno.land/std@0.219.0/fs/walk.ts": "78e1d01a9f75715614bf8d6e58bd77d9fafb1222c41194e607cd3849d7a0e771", + "https://deno.land/std@0.219.0/io/_common.ts": "36705cdb4dfcd338d6131bca1b16e48a4d5bf0d1dada6ce397268e88c17a5835", + "https://deno.land/std@0.219.0/io/_constants.ts": "3c7ad4695832e6e4a32e35f218c70376b62bc78621ef069a4a0a3d55739f8856", + "https://deno.land/std@0.219.0/io/buffer.ts": "4d1f805f350433e418002accec798bc6c33ce18f614afa65f987c202d7b2234e", + "https://deno.land/std@0.219.0/io/iterate_reader.ts": "1e5e4fea22d8965afb7df4ee9ab9adda0a0fc581adbea31bc2f2d25453f8a6e9", + "https://deno.land/std@0.219.0/io/reader_from_stream_reader.ts": "a75bbc93f39df8b0e372cc1fbdc416a7cbf2a39fc4c09ddb057f1241100191c5", + "https://deno.land/std@0.219.0/io/to_readable_stream.ts": "ed03a44a1ec1cc55a85a857acf6cac472035298f6f3b6207ea209f93b4aefb39", + "https://deno.land/std@0.219.0/io/to_writable_stream.ts": "ef422e0425963c8a1e0481674e66c3023da50f0acbe5ef51ec9789efc3c1e2ed", + "https://deno.land/std@0.219.0/io/write_all.ts": "24aac2312bb21096ae3ae0b102b22c26164d3249dff96dbac130958aa736f038", + "https://deno.land/std@0.219.0/path/_common/assert_path.ts": "dbdd757a465b690b2cc72fc5fb7698c51507dec6bfafce4ca500c46b76ff7bd8", + "https://deno.land/std@0.219.0/path/_common/basename.ts": "569744855bc8445f3a56087fd2aed56bdad39da971a8d92b138c9913aecc5fa2", + "https://deno.land/std@0.219.0/path/_common/common.ts": "ef73c2860694775fe8ffcbcdd387f9f97c7a656febf0daa8c73b56f4d8a7bd4c", + "https://deno.land/std@0.219.0/path/_common/constants.ts": "dc5f8057159f4b48cd304eb3027e42f1148cf4df1fb4240774d3492b5d12ac0c", + "https://deno.land/std@0.219.0/path/_common/dirname.ts": "684df4aa71a04bbcc346c692c8485594fc8a90b9408dfbc26ff32cf3e0c98cc8", + "https://deno.land/std@0.219.0/path/_common/format.ts": "92500e91ea5de21c97f5fe91e178bae62af524b72d5fcd246d6d60ae4bcada8b", + "https://deno.land/std@0.219.0/path/_common/from_file_url.ts": "d672bdeebc11bf80e99bf266f886c70963107bdd31134c4e249eef51133ceccf", + "https://deno.land/std@0.219.0/path/_common/glob_to_reg_exp.ts": "6cac16d5c2dc23af7d66348a7ce430e5de4e70b0eede074bdbcf4903f4374d8d", + "https://deno.land/std@0.219.0/path/_common/normalize.ts": "684df4aa71a04bbcc346c692c8485594fc8a90b9408dfbc26ff32cf3e0c98cc8", + "https://deno.land/std@0.219.0/path/_common/normalize_string.ts": "dfdf657a1b1a7db7999f7c575ee7e6b0551d9c20f19486c6c3f5ff428384c965", + "https://deno.land/std@0.219.0/path/_common/relative.ts": "faa2753d9b32320ed4ada0733261e3357c186e5705678d9dd08b97527deae607", + "https://deno.land/std@0.219.0/path/_common/strip_trailing_separators.ts": "7024a93447efcdcfeaa9339a98fa63ef9d53de363f1fbe9858970f1bba02655a", + "https://deno.land/std@0.219.0/path/_common/to_file_url.ts": "7f76adbc83ece1bba173e6e98a27c647712cab773d3f8cbe0398b74afc817883", + "https://deno.land/std@0.219.0/path/_interface.ts": "a1419fcf45c0ceb8acdccc94394e3e94f99e18cfd32d509aab514c8841799600", + "https://deno.land/std@0.219.0/path/_os.ts": "8fb9b90fb6b753bd8c77cfd8a33c2ff6c5f5bc185f50de8ca4ac6a05710b2c15", + "https://deno.land/std@0.219.0/path/basename.ts": "5d341aadb7ada266e2280561692c165771d071c98746fcb66da928870cd47668", + "https://deno.land/std@0.219.0/path/common.ts": "03e52e22882402c986fe97ca3b5bb4263c2aa811c515ce84584b23bac4cc2643", + "https://deno.land/std@0.219.0/path/constants.ts": "0c206169ca104938ede9da48ac952de288f23343304a1c3cb6ec7625e7325f36", + "https://deno.land/std@0.219.0/path/dirname.ts": "85bd955bf31d62c9aafdd7ff561c4b5fb587d11a9a5a45e2b01aedffa4238a7c", + "https://deno.land/std@0.219.0/path/extname.ts": "593303db8ae8c865cbd9ceec6e55d4b9ac5410c1e276bfd3131916591b954441", + "https://deno.land/std@0.219.0/path/format.ts": "42a2f3201343df77061207e6aaf78c95bafce7f711dcb7fe1e5840311c505778", + "https://deno.land/std@0.219.0/path/from_file_url.ts": "911833ae4fd10a1c84f6271f36151ab785955849117dc48c6e43b929504ee069", + "https://deno.land/std@0.219.0/path/glob_to_regexp.ts": "7f30f0a21439cadfdae1be1bf370880b415e676097fda584a63ce319053b5972", + "https://deno.land/std@0.219.0/path/is_absolute.ts": "4791afc8bfd0c87f0526eaa616b0d16e7b3ab6a65b62942e50eac68de4ef67d7", + "https://deno.land/std@0.219.0/path/is_glob.ts": "a65f6195d3058c3050ab905705891b412ff942a292bcbaa1a807a74439a14141", + "https://deno.land/std@0.219.0/path/join.ts": "ae2ec5ca44c7e84a235fd532e4a0116bfb1f2368b394db1c4fb75e3c0f26a33a", + "https://deno.land/std@0.219.0/path/join_globs.ts": "5b3bf248b93247194f94fa6947b612ab9d3abd571ca8386cf7789038545e54a0", + "https://deno.land/std@0.219.0/path/mod.ts": "2821a1bb3a4148a0ffe79c92aa41aa9319fef73c6d6f5178f52b2c720d3eb02d", + "https://deno.land/std@0.219.0/path/normalize.ts": "4155743ccceeed319b350c1e62e931600272fad8ad00c417b91df093867a8352", + "https://deno.land/std@0.219.0/path/normalize_glob.ts": "cc89a77a7d3b1d01053b9dcd59462b75482b11e9068ae6c754b5cf5d794b374f", + "https://deno.land/std@0.219.0/path/parse.ts": "65e8e285f1a63b714e19ef24b68f56e76934c3df0b6e65fd440d3991f4f8aefb", + "https://deno.land/std@0.219.0/path/posix/_util.ts": "1e3937da30f080bfc99fe45d7ed23c47dd8585c5e473b2d771380d3a6937cf9d", + "https://deno.land/std@0.219.0/path/posix/basename.ts": "39ee27a29f1f35935d3603ccf01d53f3d6e0c5d4d0f84421e65bd1afeff42843", + "https://deno.land/std@0.219.0/path/posix/common.ts": "26f60ccc8b2cac3e1613000c23ac5a7d392715d479e5be413473a37903a2b5d4", + "https://deno.land/std@0.219.0/path/posix/constants.ts": "93481efb98cdffa4c719c22a0182b994e5a6aed3047e1962f6c2c75b7592bef1", + "https://deno.land/std@0.219.0/path/posix/dirname.ts": "6535d2bdd566118963537b9dda8867ba9e2a361015540dc91f5afbb65c0cce8b", + "https://deno.land/std@0.219.0/path/posix/extname.ts": "8d36ae0082063c5e1191639699e6f77d3acf501600a3d87b74943f0ae5327427", + "https://deno.land/std@0.219.0/path/posix/format.ts": "185e9ee2091a42dd39e2a3b8e4925370ee8407572cee1ae52838aed96310c5c1", + "https://deno.land/std@0.219.0/path/posix/from_file_url.ts": "951aee3a2c46fd0ed488899d024c6352b59154c70552e90885ed0c2ab699bc40", + "https://deno.land/std@0.219.0/path/posix/glob_to_regexp.ts": "76f012fcdb22c04b633f536c0b9644d100861bea36e9da56a94b9c589a742e8f", + "https://deno.land/std@0.219.0/path/posix/is_absolute.ts": "cebe561ad0ae294f0ce0365a1879dcfca8abd872821519b4fcc8d8967f888ede", + "https://deno.land/std@0.219.0/path/posix/is_glob.ts": "8a8b08c08bf731acf2c1232218f1f45a11131bc01de81e5f803450a5914434b9", + "https://deno.land/std@0.219.0/path/posix/join.ts": "744fadcbee7047688696455c7cbb368a9625ffde67fc3058a61c98948fcd04de", + "https://deno.land/std@0.219.0/path/posix/join_globs.ts": "a9475b44645feddceb484ee0498e456f4add112e181cb94042cdc6d47d1cdd25", + "https://deno.land/std@0.219.0/path/posix/mod.ts": "2301fc1c54a28b349e20656f68a85f75befa0ee9b6cd75bfac3da5aca9c3f604", + "https://deno.land/std@0.219.0/path/posix/normalize.ts": "baeb49816a8299f90a0237d214cef46f00ba3e95c0d2ceb74205a6a584b58a91", + "https://deno.land/std@0.219.0/path/posix/normalize_glob.ts": "9c87a829b6c0f445d03b3ecadc14492e2864c3ebb966f4cea41e98326e4435c6", + "https://deno.land/std@0.219.0/path/posix/parse.ts": "0b1fc4cb890dbb699ec1d2c232d274843b4a7142e1ad976b69fe51c954eb6080", + "https://deno.land/std@0.219.0/path/posix/relative.ts": "3907d6eda41f0ff723d336125a1ad4349112cd4d48f693859980314d5b9da31c", + "https://deno.land/std@0.219.0/path/posix/resolve.ts": "08b699cfeee10cb6857ccab38fa4b2ec703b0ea33e8e69964f29d02a2d5257cf", + "https://deno.land/std@0.219.0/path/posix/to_file_url.ts": "7aa752ba66a35049e0e4a4be5a0a31ac6b645257d2e031142abb1854de250aaf", + "https://deno.land/std@0.219.0/path/posix/to_namespaced_path.ts": "28b216b3c76f892a4dca9734ff1cc0045d135532bfd9c435ae4858bfa5a2ebf0", + "https://deno.land/std@0.219.0/path/relative.ts": "ab739d727180ed8727e34ed71d976912461d98e2b76de3d3de834c1066667add", + "https://deno.land/std@0.219.0/path/resolve.ts": "a6f977bdb4272e79d8d0ed4333e3d71367cc3926acf15ac271f1d059c8494d8d", + "https://deno.land/std@0.219.0/path/to_file_url.ts": "88f049b769bce411e2d2db5bd9e6fd9a185a5fbd6b9f5ad8f52bef517c4ece1b", + "https://deno.land/std@0.219.0/path/to_namespaced_path.ts": "b706a4103b104cfadc09600a5f838c2ba94dbcdb642344557122dda444526e40", + "https://deno.land/std@0.219.0/path/windows/_util.ts": "d5f47363e5293fced22c984550d5e70e98e266cc3f31769e1710511803d04808", + "https://deno.land/std@0.219.0/path/windows/basename.ts": "e2dbf31d1d6385bfab1ce38c333aa290b6d7ae9e0ecb8234a654e583cf22f8fe", + "https://deno.land/std@0.219.0/path/windows/common.ts": "26f60ccc8b2cac3e1613000c23ac5a7d392715d479e5be413473a37903a2b5d4", + "https://deno.land/std@0.219.0/path/windows/constants.ts": "5afaac0a1f67b68b0a380a4ef391bf59feb55856aa8c60dfc01bd3b6abb813f5", + "https://deno.land/std@0.219.0/path/windows/dirname.ts": "33e421be5a5558a1346a48e74c330b8e560be7424ed7684ea03c12c21b627bc9", + "https://deno.land/std@0.219.0/path/windows/extname.ts": "165a61b00d781257fda1e9606a48c78b06815385e7d703232548dbfc95346bef", + "https://deno.land/std@0.219.0/path/windows/format.ts": "bbb5ecf379305b472b1082cd2fdc010e44a0020030414974d6029be9ad52aeb6", + "https://deno.land/std@0.219.0/path/windows/from_file_url.ts": "ced2d587b6dff18f963f269d745c4a599cf82b0c4007356bd957cb4cb52efc01", + "https://deno.land/std@0.219.0/path/windows/glob_to_regexp.ts": "e45f1f89bf3fc36f94ab7b3b9d0026729829fabc486c77f414caebef3b7304f8", + "https://deno.land/std@0.219.0/path/windows/is_absolute.ts": "4a8f6853f8598cf91a835f41abed42112cebab09478b072e4beb00ec81f8ca8a", + "https://deno.land/std@0.219.0/path/windows/is_glob.ts": "8a8b08c08bf731acf2c1232218f1f45a11131bc01de81e5f803450a5914434b9", + "https://deno.land/std@0.219.0/path/windows/join.ts": "8d03530ab89195185103b7da9dfc6327af13eabdcd44c7c63e42e27808f50ecf", + "https://deno.land/std@0.219.0/path/windows/join_globs.ts": "a9475b44645feddceb484ee0498e456f4add112e181cb94042cdc6d47d1cdd25", + "https://deno.land/std@0.219.0/path/windows/mod.ts": "2301fc1c54a28b349e20656f68a85f75befa0ee9b6cd75bfac3da5aca9c3f604", + "https://deno.land/std@0.219.0/path/windows/normalize.ts": "78126170ab917f0ca355a9af9e65ad6bfa5be14d574c5fb09bb1920f52577780", + "https://deno.land/std@0.219.0/path/windows/normalize_glob.ts": "9c87a829b6c0f445d03b3ecadc14492e2864c3ebb966f4cea41e98326e4435c6", + "https://deno.land/std@0.219.0/path/windows/parse.ts": "dbdfe2bc6db482d755b5f63f7207cd019240fcac02ad2efa582adf67ff10553a", + "https://deno.land/std@0.219.0/path/windows/relative.ts": "3e1abc7977ee6cc0db2730d1f9cb38be87b0ce4806759d271a70e4997fc638d7", + "https://deno.land/std@0.219.0/path/windows/resolve.ts": "8dae1dadfed9d46ff46cc337c9525c0c7d959fb400a6308f34595c45bdca1972", + "https://deno.land/std@0.219.0/path/windows/to_file_url.ts": "40e560ee4854fe5a3d4d12976cef2f4e8914125c81b11f1108e127934ced502e", + "https://deno.land/std@0.219.0/path/windows/to_namespaced_path.ts": "4ffa4fb6fae321448d5fe810b3ca741d84df4d7897e61ee29be961a6aac89a4c", + "https://deno.land/std@0.219.0/semver/_constants.ts": "5ef89c5f33e6095546ae3e57920592feefcb8372d4cc05542f6bf15a1977e3c9", + "https://deno.land/std@0.219.0/semver/_shared.ts": "5c53a675225cba9ad74ae2e17c124e333728fc2b551a13e8a32b99433b90c1c2", + "https://deno.land/std@0.219.0/semver/can_parse.ts": "d4a26f74be078f3ab10293b07bf022021a2f362b3e21b58422c214e7268110b2", + "https://deno.land/std@0.219.0/semver/compare.ts": "e8871844a35cc8fe16e883c16e5237e06a93aa4830ae10d06501abe63586fc57", + "https://deno.land/std@0.219.0/semver/constants.ts": "a0daa58502949654af044928f86288d8b27bd1880218e9faba7733ec0bde63ab", + "https://deno.land/std@0.219.0/semver/difference.ts": "be4f01b7745406408a16b708185a48c1c652cc87e0244b12a5ca75c5585db668", + "https://deno.land/std@0.219.0/semver/equals.ts": "8b9b18260c9a55feee9d3f9250fba345be922380f2e8f8009e455c394ce5e81d", + "https://deno.land/std@0.219.0/semver/format.ts": "26d3a357ac5abd73dee0fe7dbbac6107fbdce0a844370c7b1bcb673c92e46bf6", + "https://deno.land/std@0.219.0/semver/format_range.ts": "6ad2d0c27aac63dfb7efca6286a6ab7742accfb986cc53662047740f17dacfe5", + "https://deno.land/std@0.219.0/semver/greater_or_equal.ts": "89c26f68070896944676eb9704cbb617febc6ed693720282741d6859c3d1fe80", + "https://deno.land/std@0.219.0/semver/greater_than.ts": "d8c4a227cd28ea80a1de9c80215d7f3f95786fe1b196f0cb5ec91d6567adad27", + "https://deno.land/std@0.219.0/semver/increment.ts": "427a043be71d6481e45c1a3939b955e800924d70779cb297b872d9cbf9f0e46d", + "https://deno.land/std@0.219.0/semver/is_range.ts": "15dd9a8d6a8dee56dea6799d8c8210e06c0a38cc1a9aa6152aeea39ce45e2111", + "https://deno.land/std@0.219.0/semver/is_semver.ts": "57914027d6141e593eb04418aaabbfd6f4562a1c53c6c33a1743fa50ada8d849", + "https://deno.land/std@0.219.0/semver/less_or_equal.ts": "7dbf8190f37f3281048c30cf11e072a7af18685534ae88d295baa170b485bd90", + "https://deno.land/std@0.219.0/semver/less_than.ts": "b0c7902c54cecadcc7c1c80afc2f6a0f1bf0b3f53c8d2bfd11f01a3a414cccfe", + "https://deno.land/std@0.219.0/semver/max_satisfying.ts": "03e5182a7424c308ddbb410e4b927da0dabc4e07d4b5a72f7e9b26fb18a02152", + "https://deno.land/std@0.219.0/semver/min_satisfying.ts": "b6fadc9af17278289481c416e1eb135614f88063f4fc2b7b72b43eb3baa2f08f", + "https://deno.land/std@0.219.0/semver/mod.ts": "6e1f8854cec50c027037a597d3dd54af72e063f763ec0cbc4ea1e534a627ffae", + "https://deno.land/std@0.219.0/semver/not_equals.ts": "17147a6f68b9d14f4643c1e2150378ccf6954710309f9618f75b411752a8e13d", + "https://deno.land/std@0.219.0/semver/parse.ts": "b64052ff8ce0b0bba9ed97b835a224c828fc7ad227585c3e8c2bac72a07bf572", + "https://deno.land/std@0.219.0/semver/parse_range.ts": "5190afffc90cc14410ce2478fb81ed83b55d7e96b6fbbd69fc715c457082ec94", + "https://deno.land/std@0.219.0/semver/range_intersects.ts": "2c358f7c27b51960a9889be5462ec1cac44feeb5e40041a5c5a03700c0ddc017", + "https://deno.land/std@0.219.0/semver/range_max.ts": "4c43d018841ba67d018e515f0aef32658dab611a39fdc74e31b1e48709be281c", + "https://deno.land/std@0.219.0/semver/range_min.ts": "37c5e3dac7bd63812ae249add9ea815a351826f510d2baf391c225d1d8272d17", + "https://deno.land/std@0.219.0/semver/test_range.ts": "72ba2af827e4ad94db9a29e22e86cbec9b3f8519fc36fd6ce0d4308717536c70", + "https://deno.land/std@0.219.0/semver/try_parse.ts": "7e2a3594212445d9d6f6154f02288d66a0c0b79ce3e859c41f3d47e29dfa439a", + "https://deno.land/std@0.219.0/semver/try_parse_range.ts": "4f211f0ff4f5fdaa85622ab96c360123bbcf0e5a91a57eb7a8258af6b7a3c704", + "https://deno.land/std@0.219.0/semver/types.ts": "13e1e0c64a4ac76f0add74afee6240c92a7dba184e63e0bd4cb456afed8c7291", + "https://deno.land/std@0.219.0/streams/_common.ts": "948735ef6d140cd6916dca861197b88fc57db52c2f923c392b7a14033d8fed4b", + "https://deno.land/std@0.219.0/streams/buffer.ts": "e012de72a53ad17c56512488e9afb6f4b6ed046b32fc1415ae7a4e6fc0efce38", + "https://deno.land/std@0.219.0/streams/byte_slice_stream.ts": "5bbdcadb118390affa9b3d0a0f73ef8e83754f59bb89df349add669dd9369713", + "https://deno.land/std@0.219.0/streams/delimiter_stream.ts": "4e4050740ff27a8824defa6c96126229ef9d794c4ace4ef9cabb10b5ad4a5d14", + "https://deno.land/std@0.219.0/streams/early_zip_readable_streams.ts": "21f5cf6dd36381c6a50c31a7727b5bd219f6382bbb7a413418595c3e466c4d14", + "https://deno.land/std@0.219.0/streams/iterate_reader.ts": "a50bed95514736c3c554e4c69ea2d8d2699252e4e74507769999d22c3886c777", + "https://deno.land/std@0.219.0/streams/limited_bytes_transform_stream.ts": "b22a45a337374e863c4eb1867ec6b8ad3e68620a6c52fe837746060ea610e6f1", + "https://deno.land/std@0.219.0/streams/limited_transform_stream.ts": "4c47da5ca38a30fa9f33b0f1a61d4548e7f52a9a58c294b0f430f680e44cc543", + "https://deno.land/std@0.219.0/streams/merge_readable_streams.ts": "73eed8ff54c9111b8b974b11a5a11c1ed0b7800e0157c39277ccac3ed14721e2", + "https://deno.land/std@0.219.0/streams/mod.ts": "d56624832b9649b680c74ab9c77e746e8be81ae1a24756cc04623e25a0d43ce9", + "https://deno.land/std@0.219.0/streams/readable_stream_from_reader.ts": "4289a63836f73901441c1879f2be76eea2a983920f4b10a4a9b8a6d8c29ece56", + "https://deno.land/std@0.219.0/streams/reader_from_iterable.ts": "82f1ecef32ec70c7841ca2a54b09c73167d940f0578bec91e874bb8cd42ba8f3", + "https://deno.land/std@0.219.0/streams/reader_from_stream_reader.ts": "dda702bd365a133be8bdbc5a1ba96c67b350c3504410632f3a833895bfc7bae3", + "https://deno.land/std@0.219.0/streams/text_delimiter_stream.ts": "94dfc900204e306496c1b58c80473db57b6097afdcb8ea9eaff453a193a659f1", + "https://deno.land/std@0.219.0/streams/text_line_stream.ts": "21f33d3922e019ec1a1676474beb543929cb564ec99b69cd2654e029e0f45bd5", + "https://deno.land/std@0.219.0/streams/to_array_buffer.ts": "1a9c07c4a396ce557ab205c44415815ab13b614fed94a12f62b80f8e650c726d", + "https://deno.land/std@0.219.0/streams/to_blob.ts": "bf5daaae50fa8f57e0c8bfd7474ebac16ac09e130e3d01ef2947ae5153912b4a", + "https://deno.land/std@0.219.0/streams/to_json.ts": "b6a908d0da7cd30956e5fbbfa7460747e50b8f307d1041282ed6fe9070d579ee", + "https://deno.land/std@0.219.0/streams/to_text.ts": "6f93593bdfc2cea5cca39755ea5caf0d4092580c0a713dfe04a1e85c60df331f", + "https://deno.land/std@0.219.0/streams/to_transform_stream.ts": "4c4836455ef89bab9ece55975ee3a819f07d3d8b0e43101ec7f4ed033c8a2b61", + "https://deno.land/std@0.219.0/streams/writable_stream_from_writer.ts": "62f2712d3a7bebd981fca8bd5140192c37450f9c4aa94283f7ca833e46bc7485", + "https://deno.land/std@0.219.0/streams/writer_from_stream_writer.ts": "b0e39ef607dfdc5abdfb627edf61a9672809463e2bb022afcbaf0cd006c40feb", + "https://deno.land/std@0.219.0/streams/zip_readable_streams.ts": "53eb10d7557539b489bd858907aab6dd28247f074b3446573801de3150cb932e", + "https://deno.land/std@0.219.0/yaml/_dumper/dumper.ts": "5a7b9b18e5b3f5e88b84d040c530b1f8e814c3565dfff7b7a5d16279bdf15ca4", + "https://deno.land/std@0.219.0/yaml/_dumper/dumper_state.ts": "ea262b459dc891c4828a0f814841abfe12d160d319c4b57eb11ed0c768cfcb6b", + "https://deno.land/std@0.219.0/yaml/_error.ts": "f38cdebdb69cde16903d9aa2f3b8a3dd9d13e5f7f3570bf662bfaca69fef669e", + "https://deno.land/std@0.219.0/yaml/_loader/loader.ts": "959c2ab7bbf5fb565bc3f3344f5e92b2712d39ea77a1e57039591696335c6d29", + "https://deno.land/std@0.219.0/yaml/_loader/loader_state.ts": "ee216de6040551940b85473c3185fdb7a6f3030b77153f87a6b7f63f82e489ea", + "https://deno.land/std@0.219.0/yaml/_mark.ts": "1d9d071f8c62d19f284ca4a5aae41680e67653a06a2a4b0eccf931fc5719afa1", + "https://deno.land/std@0.219.0/yaml/_state.ts": "f3b1c1fd11860302f1f33e35e9ce089bf069d4943e8d67516cd6bedbba058c13", + "https://deno.land/std@0.219.0/yaml/_type/binary.ts": "26216e8f306e62401ba00e306e93cdd5fb88da361cdaa567e63ee216dc3ebf93", + "https://deno.land/std@0.219.0/yaml/_type/bool.ts": "121743b23ba82a27ad6a3ec6298c7f5b0908f90e52707f8644a91f7ad51ed2ef", + "https://deno.land/std@0.219.0/yaml/_type/float.ts": "73295b7d8cc24edadfea5041e2255a6332e3491715e884e3bb7d03b563a90a81", + "https://deno.land/std@0.219.0/yaml/_type/function.ts": "bbf705058942bf3370604b37eb77a10aadd72f986c237c9f69b43378a42202c1", + "https://deno.land/std@0.219.0/yaml/_type/int.ts": "c2dc88438a60fccc8d2226042bd18b9967753adaf6bd145feb8b99d567e432ce", + "https://deno.land/std@0.219.0/yaml/_type/map.ts": "ae2acb1cb837fb8e96c75c98611cfd45af847d0114ab5336333c318e7d4b12f4", + "https://deno.land/std@0.219.0/yaml/_type/merge.ts": "ad0d971f91d2fb9f4ab3eba0c837eae357b1804d6b798adc99dc917bc5306b11", + "https://deno.land/std@0.219.0/yaml/_type/mod.ts": "e8929d7b1c969a74f76338d4eb380ef8c4a26cd6441117d521f076b766e9c265", + "https://deno.land/std@0.219.0/yaml/_type/nil.ts": "cbe4387d02d5933322c21b25d8955c5e6228c492e391a6fb82dcf4f498cc421c", + "https://deno.land/std@0.219.0/yaml/_type/omap.ts": "cda915105ab22ba9e1d6317adacee8eec2d8ddaf864cc2f814e3e476946e72c6", + "https://deno.land/std@0.219.0/yaml/_type/pairs.ts": "f97d7dc2b3fa18e246763f44147f6df0d6036c7e122af3e7b6692e4a6b0e289f", + "https://deno.land/std@0.219.0/yaml/_type/regexp.ts": "e49eb9e1c9356fd142bc15f7f323820d411fcc537b5ba3896df9a8b812d270a4", + "https://deno.land/std@0.219.0/yaml/_type/seq.ts": "2deffc7f970869bc01a1541b4961d076329a1c2b30b95e07918f3132db7c3fe2", + "https://deno.land/std@0.219.0/yaml/_type/set.ts": "be8a9e7237a7ffc92dfbe7f5e552d84b7eeba60f3f73cc77fc3c59d3506c74ea", + "https://deno.land/std@0.219.0/yaml/_type/str.ts": "88f0a1ba12295520cd57e96cd78d53aa0787d53c7a1c506155f418c496c2f550", + "https://deno.land/std@0.219.0/yaml/_type/timestamp.ts": "57a6bb4a0f0bd5eab85a1f0ee5ac8820fd3125ea939dc8a037de997a2b6ad05d", + "https://deno.land/std@0.219.0/yaml/_type/undefined.ts": "9d215953c65740f1764e0bdca021007573473f0c49e087f00d9ff02817ecfc97", + "https://deno.land/std@0.219.0/yaml/_utils.ts": "91bbe28b5e7000b9594e40ff5353f8fe7a7ba914eec917e1202cbaf5ac931c58", + "https://deno.land/std@0.219.0/yaml/mod.ts": "54e9bfad77c8cd58f49b65f4d568045ff08989ed36318a2ca733a43cb6f1bc00", + "https://deno.land/std@0.219.0/yaml/parse.ts": "f45278d9ebccb789af4eceeffa5c291e194bcf1fa9aab1b34ff52c2bd4a9d886", + "https://deno.land/std@0.219.0/yaml/schema.ts": "dae089ffa1ac4a2b031176aa019e126be6f7230a3011de38463ead8639b14739", + "https://deno.land/std@0.219.0/yaml/schema/core.ts": "1222f9401e2a0c1d38e63d753da98be333e61a6032335e9c46a68bd45ecce85a", + "https://deno.land/std@0.219.0/yaml/schema/default.ts": "b77c71cfd453951dd828e5f2f02f9f37335c9c0a49c8051d1a9653fa82357740", + "https://deno.land/std@0.219.0/yaml/schema/extended.ts": "996da59626409047b5c1a2d68bdbeead43914cedede47c5923e80ae4febe7d24", + "https://deno.land/std@0.219.0/yaml/schema/failsafe.ts": "24b2b630cef6fcce7de6d29db651523b0f49e5691d690931c42ecf4823837fdb", + "https://deno.land/std@0.219.0/yaml/schema/json.ts": "0fb9268282d266c24d963e75ef77f51accbbb74f40713a99e83ad621a81bc9ae", + "https://deno.land/std@0.219.0/yaml/schema/mod.ts": "9bf7ff80c2a246f781bdcab979211d0389760831a974cf5883bf2016567e3507", + "https://deno.land/std@0.219.0/yaml/stringify.ts": "580f8b2fa56e3233424520d8242f4fc0edf41ac54a6a6d2f6f8e0b6e99cd63c0", + "https://deno.land/std@0.219.0/yaml/type.ts": "708dde5f20b01cc1096489b7155b6af79a217d585afb841128e78c3c2391eb5c", + "https://deno.land/x/code_block_writer@12.0.0/mod.ts": "2c3448060e47c9d08604c8f40dee34343f553f33edcdfebbf648442be33205e5", + "https://deno.land/x/code_block_writer@12.0.0/utils/string_utils.ts": "60cb4ec8bd335bf241ef785ccec51e809d576ff8e8d29da43d2273b69ce2a6ff", + "https://deno.land/x/compress@v0.4.5/deps.ts": "096395daebc7ed8a18f0484e4ffcc3a7f70e50946735f7df9611a7fcfd8272cc", + "https://deno.land/x/compress@v0.4.5/gzip/gzip.ts": "4bf22e9cd3368332928324dd9443ef72cabd05e9234e5a37dd7b3517d50e945e", + "https://deno.land/x/compress@v0.4.5/gzip/gzip_file.ts": "b044ec0df4266c084baa033a4ab5394882e44a86d09d5616636467dcb39c671d", + "https://deno.land/x/compress@v0.4.5/gzip/gzip_stream.ts": "6781cf0e47648e3e5631cba4cc2cd018a24935ce09fdaa86e0cabcf78b5012df", + "https://deno.land/x/compress@v0.4.5/gzip/mod.ts": "4ade8edbe01b54a84f289351e137ebdfc040a74cd616636770cf1724fbf522d1", + "https://deno.land/x/compress@v0.4.5/gzip/writer_gunzip.ts": "5aba34394820b835c414048ac2e15f52d443f1f773ebe61fd2517c938572d616", + "https://deno.land/x/compress@v0.4.5/gzip/writer_gzip.ts": "c7aad0c51ab4f5952c068088186339cfc79a2ee1e057d6e16731b1175f342645", + "https://deno.land/x/compress@v0.4.5/interface.ts": "fc5f87bd208ab8a03a1f65972b11781967c3d21c3d756fe9ae99ca98e10e5780", + "https://deno.land/x/compress@v0.4.5/mod.ts": "ae8b15826334021583a5bd1978c63840f85156ea3635f5941bfc6733aad247e5", + "https://deno.land/x/compress@v0.4.5/tar/mod.ts": "6d9073005e678479908047cbe9e4716e484f80d1f2a1e15d3d6ac92213ffaeba", + "https://deno.land/x/compress@v0.4.5/tgz/mod.ts": "2fd4e99f26b57b0055d4d2f87721682304541ed1ca41bbb49c034d121f936f00", + "https://deno.land/x/compress@v0.4.5/utils/uint8.ts": "9c82e09c065f1f4bc648e3b14df441b43a7960fc7bdb29e9fb8d3a69c7e9d425", + "https://deno.land/x/compress@v0.4.5/zlib/deflate.ts": "e1e3b406dcc3e20021e53cde427b4b9ced752b72df820de73fec17c6e5ba999e", + "https://deno.land/x/compress@v0.4.5/zlib/inflate.ts": "618cc3dd25d202bf6b89d92f3ab2865e7495884cafce950638c77cbc1537aeb1", + "https://deno.land/x/compress@v0.4.5/zlib/mod.ts": "4dca9c1e934b7ab27f31c318abd7bfd39b09be96fd76ba27bd46f3a4e73b4ad0", + "https://deno.land/x/compress@v0.4.5/zlib/zlib/adler32.ts": "e34c7596d63a655755c4b0a44a40d4f9c1d1c4d3b891e5c1f3f840f8939e1940", + "https://deno.land/x/compress@v0.4.5/zlib/zlib/crc32.ts": "b9bc4adaf327d32585205d1176bd52f6453c06dd1040544611d4c869e638119c", + "https://deno.land/x/compress@v0.4.5/zlib/zlib/deflate.ts": "8d1dd88630279313e50deed4fe5feefe8128307cc48fa560e659b5234ab09d83", + "https://deno.land/x/compress@v0.4.5/zlib/zlib/gzheader.ts": "11e6da7383447aae9791308dc2350a809fa341a876a2da396b03a2a31408c20c", + "https://deno.land/x/compress@v0.4.5/zlib/zlib/inffast.ts": "282daf5ea16bb876d26e342f3c24fe1a8ec84640e713a970b02232955a853f86", + "https://deno.land/x/compress@v0.4.5/zlib/zlib/inflate.ts": "76751c1a5b18d70a929fa31ce4959db0bde1b9097bfa1b5ea3b4d1fba2ab92fa", + "https://deno.land/x/compress@v0.4.5/zlib/zlib/inftrees.ts": "8a6d765a5c42bf3b6990060cabbe52e88493f8ce6d082e6e35d97756914cfb8e", + "https://deno.land/x/compress@v0.4.5/zlib/zlib/messages.ts": "c82229bd67ccc3b6162f3aca1c5e7f936e546aa91ac9a9ac4fcfefc3a9dc5ac8", + "https://deno.land/x/compress@v0.4.5/zlib/zlib/status.ts": "5987864d2d43d59bbbfa2e6ef4d5a07284c1d10489cc5843ddf41ac547957ac3", + "https://deno.land/x/compress@v0.4.5/zlib/zlib/trees.ts": "6b65a767646e031e87e7b725ffad0c511fe701f393a01652e1e7ee8884f60fee", + "https://deno.land/x/compress@v0.4.5/zlib/zlib/zstream.ts": "c110fd5919235e317d64933852e24a1bba0126202be592e90e58f7b19315ad93", + "https://deno.land/x/convert_bytes@v2.1.1/mod.ts": "036bd2d9519c8ad44bd5a15d4e42123dc16843f793b3c81ca1fca905b21dd7df", + "https://deno.land/x/convert_bytes@v2.1.1/src/utility.ts": "a94b4c50286910a23a90c0a0510e8191fa3311dec44d062a6d4fe3d5b7ff8176", + "https://deno.land/x/crc32@v0.2.0/mod.ts": "de7a3fa2d4ef24b96fc21e1cc4d2d65d1d2b1dcea92f63960e3e11bfa82df0fa", + "https://deno.land/x/deno_cache@0.5.2/auth_tokens.ts": "5d1d56474c54a9d152e44d43ea17c2e6a398dd1e9682c69811a313567c01ee1e", + "https://deno.land/x/deno_cache@0.5.2/cache.ts": "92ce8511e1e5c00fdf53a41619aa77d632ea8e0fc711324322e4d5ebf8133911", + "https://deno.land/x/deno_cache@0.5.2/deno_dir.ts": "1ea355b8ba11c630d076b222b197cfc937dd81e5a4a260938997da99e8ff93a0", + "https://deno.land/x/deno_cache@0.5.2/deps.ts": "26a75905652510b76e54b6d5ef3cf824d1062031e00782efcd768978419224e7", + "https://deno.land/x/deno_cache@0.5.2/dirs.ts": "009c6f54e0b610914d6ce9f72f6f6ccfffd2d47a79a19061e0a9eb4253836069", + "https://deno.land/x/deno_cache@0.5.2/disk_cache.ts": "66a1e604a8d564b6dd0500326cac33d08b561d331036bf7272def80f2f7952aa", + "https://deno.land/x/deno_cache@0.5.2/file_fetcher.ts": "89616c50b6df73fb04e73d0b7cd99e5f2ed7967386913d65b9e8baa4238501f7", + "https://deno.land/x/deno_cache@0.5.2/http_cache.ts": "407135eaf2802809ed373c230d57da7ef8dff923c4abf205410b9b99886491fd", + "https://deno.land/x/deno_cache@0.5.2/lib/deno_cache_dir.generated.js": "18b6526d0c50791a73dd0eb894e99de1ac05ee79dcbd53298ff5b5b6b0757fe6", + "https://deno.land/x/deno_cache@0.5.2/lib/snippets/deno_cache_dir-77bed54ace8005e0/fs.js": "cbe3a976ed63c72c7cb34ef845c27013033a3b11f9d8d3e2c4aa5dda2c0c7af6", + "https://deno.land/x/deno_cache@0.5.2/mod.ts": "0b4d071ad095128bdc2b1bc6e5d2095222dcbae08287261690ee9757e6300db6", + "https://deno.land/x/deno_cache@0.5.2/util.ts": "f3f5a0cfc60051f09162942fb0ee87a0e27b11a12aec4c22076e3006be4cc1e2", + "https://deno.land/x/dir@1.5.1/data_local_dir/mod.ts": "91eb1c4bfadfbeda30171007bac6d85aadacd43224a5ed721bbe56bc64e9eb66", + "https://deno.land/x/djwt@v2.7/algorithm.ts": "ba9941961c46838f35a507414407e48aa9a4eca69c679b04fbbede55fe276a09", + "https://deno.land/x/djwt@v2.7/deps.ts": "a5d7952aaf7fad421717c9a2db0b2e736b409632cb70f3f7f9e68f8e96e04f45", + "https://deno.land/x/djwt@v2.7/mod.ts": "08cb2c745c9bc33883c2d027fc4af5c157f0a30564c3ba503a56fe0ab6959c8e", + "https://deno.land/x/djwt@v2.7/signature.ts": "f79b4e521cd6a6dff28cd2779b1d9f2059f9e0822fb99c9f747ff34ae26532e4", + "https://deno.land/x/dnt@0.38.1/lib/compiler.ts": "209ad2e1b294f93f87ec02ade9a0821f942d2e524104552d0aa8ff87021050a5", + "https://deno.land/x/dnt@0.38.1/lib/compiler_transforms.ts": "f21aba052f5dcf0b0595c734450842855c7f572e96165d3d34f8fed2fc1f7ba1", + "https://deno.land/x/dnt@0.38.1/lib/mod.deps.ts": "30367fc68bcd2acf3b7020cf5cdd26f817f7ac9ac35c4bfb6c4551475f91bc3e", + "https://deno.land/x/dnt@0.38.1/lib/npm_ignore.ts": "57fbb7e7b935417d225eec586c6aa240288905eb095847d3f6a88e290209df4e", + "https://deno.land/x/dnt@0.38.1/lib/package_json.ts": "61f35b06e374ed39ca776d29d67df4be7ee809d0bca29a8239687556c6d027c2", + "https://deno.land/x/dnt@0.38.1/lib/pkg/dnt_wasm.generated.js": "cfb352ae839865f5698c9b35099d4c783510195a1e3c9f9b04d94fac86394ed9", + "https://deno.land/x/dnt@0.38.1/lib/pkg/snippets/dnt-wasm-a15ef721fa5290c5/helpers.js": "45f74f00472b3a399bc16e5dc056966b55dcdd8fa2bd61505c6dfd2f5d33b9f4", + "https://deno.land/x/dnt@0.38.1/lib/shims.ts": "df1bd4d9a196dca4b2d512b1564fff64ac6c945189a273d706391f87f210d7e6", + "https://deno.land/x/dnt@0.38.1/lib/test_runner/get_test_runner_code.ts": "4dc7a73a13b027341c0688df2b29a4ef102f287c126f134c33f69f0339b46968", + "https://deno.land/x/dnt@0.38.1/lib/test_runner/test_runner.ts": "4d0da0500ec427d5f390d9a8d42fb882fbeccc92c92d66b6f2e758606dbd40e6", + "https://deno.land/x/dnt@0.38.1/lib/transform.deps.ts": "e42f2bdef46d098453bdba19261a67cf90b583f5d868f7fe83113c1380d9b85c", + "https://deno.land/x/dnt@0.38.1/lib/types.ts": "b8e228b2fac44c2ae902fbb73b1689f6ab889915bd66486c8a85c0c24255f5fb", + "https://deno.land/x/dnt@0.38.1/lib/utils.ts": "878b7ac7003a10c16e6061aa49dbef9b42bd43174853ebffc9b67ea47eeb11d8", + "https://deno.land/x/dnt@0.38.1/mod.ts": "b13349fe77847cf58e26b40bcd58797a8cec5d71b31a1ca567071329c8489de1", + "https://deno.land/x/dnt@0.38.1/transform.ts": "f68743a14cf9bf53bfc9c81073871d69d447a7f9e3453e0447ca2fb78926bb1d", + "https://deno.land/x/fuse@v6.4.1/dist/fuse.esm.min.js": "02034c3e0a1d7f4d207ecd104c9cde1bab116d474dc60c2a019e9d4353455ff4", + "https://deno.land/x/levenshtein@v1.0.1/mod.ts": "6b632d4a9bb11ba6d5d02a770c7fc9b0a4125f30bd9c668632ff85e7f05ff4f6", + "https://deno.land/x/monads@v0.5.10/either/either.ts": "89f539c7d50bd0ee8d9b902f37ef16687c19b62cc9dd23454029c97fbfc15cc6", + "https://deno.land/x/monads@v0.5.10/index.ts": "f0e90b8c1dd767efca137d682ac1a19b2dbae4d1990b8a79a40b4e054c69b3d6", + "https://deno.land/x/monads@v0.5.10/mod.ts": "f1b16a34d47e58fdf9f1f54c49d2fe6df67b3d2e077e21638f25fbe080eee6cf", + "https://deno.land/x/monads@v0.5.10/option/option.ts": "76ef03c3370207112759f932f39aab04999cdd1a5c5a954769b3868602faf883", + "https://deno.land/x/monads@v0.5.10/result/result.ts": "bb482b7b90949d3a67e78b4b0dd949774eccaa808df39ac83f6a585526edeb37", + "https://deno.land/x/oauth2_client@v1.0.2/mod.ts": "ea54c0a894d3303a80552ca65835b5b104d16415343b24e191f08e7f5db90ff7", + "https://deno.land/x/oauth2_client@v1.0.2/src/authorization_code_grant.ts": "36953750b75fb0a14fbf4e0e4bcc1d5ae0209d216d7b32f93a134b035ecf3d25", + "https://deno.land/x/oauth2_client@v1.0.2/src/client_credentials_grant.ts": "5bb9869925c5f5d11e8d66a86da37e2353107d57f57ec3a1480e197462e79be5", + "https://deno.land/x/oauth2_client@v1.0.2/src/errors.ts": "7603479b80386b5cc7e384c2af5f5262ed7c2123e4e297d9f21e95515f8a803a", + "https://deno.land/x/oauth2_client@v1.0.2/src/grant_base.ts": "86ae9eb3495f2304a634498fbb83741c5dc0e1357e02c40e12e212de5e9750f7", + "https://deno.land/x/oauth2_client@v1.0.2/src/implicit_grant.ts": "d5359aebbdaaff039c0d078890aa4ffa2869da19c521e535e15caf09c069e6b8", + "https://deno.land/x/oauth2_client@v1.0.2/src/oauth2_client.ts": "4e5ec26676661a3f69544826a4c27b30cc07dfcfc77f86981c324aaa53291a11", + "https://deno.land/x/oauth2_client@v1.0.2/src/pkce.ts": "d286a087cc8ef985b71a2bf391e9e9d86a78ac6d93e30c46e73006171aed0986", + "https://deno.land/x/oauth2_client@v1.0.2/src/refresh_token_grant.ts": "22cb1598e48fb037b4111a446573f7b48a3b361b58de58af17ba097221b12b54", + "https://deno.land/x/oauth2_client@v1.0.2/src/resource_owner_password_credentials.ts": "bd3df99d32eeebffb411c4a2d3c3d057395515fb41690a8d91460dd74b9bf466", + "https://deno.land/x/oauth2_client@v1.0.2/src/types.ts": "3327c2e81bc483e91843fb103595dd304393c3ac2a530d1c89200b6a5cf75e13", + "https://deno.land/x/redis@v0.32.1/backoff.ts": "33e4a6e245f8743fbae0ce583993a671a3ac2ecee433a3e7f0bd77b5dd541d84", + "https://deno.land/x/redis@v0.32.1/command.ts": "aa2312d4093ec7c72d61d32a71d3d13a33cc6302ca78c8f026e1994e76541e6e", + "https://deno.land/x/redis@v0.32.1/connection.ts": "45a3328ca49c021c9192c48510dba9808b29de4d8e65e424d7a6a1e2d782fd74", + "https://deno.land/x/redis@v0.32.1/errors.ts": "4c47b278c8a87e0f49c0f7a96c74c5bee09e4d5ea19f892923b0281707112d04", + "https://deno.land/x/redis@v0.32.1/executor.ts": "5ac4c1f7bec44d12ebc0f3702bf074bd3ba6c1aae74953582f6358d2948718e7", + "https://deno.land/x/redis@v0.32.1/internal/encoding.ts": "0525f7f444a96b92cd36423abdfe221f8d8de4a018dc5cb6750a428a5fc897c2", + "https://deno.land/x/redis@v0.32.1/internal/symbols.ts": "e36097bab1da1c9fe84a3bb9cb0ed1ec10c3dc7dd0b557769c5c54e15d110dd2", + "https://deno.land/x/redis@v0.32.1/mod.ts": "a2a2318e67db704c799a13cc840114b9f344a82cf682c933a293e90b1a02b3fa", + "https://deno.land/x/redis@v0.32.1/pipeline.ts": "f0ec80f58a88e9b9b157155882c2bb3568890e6b4d67ad99760a6fc2c51b47ba", + "https://deno.land/x/redis@v0.32.1/protocol/deno_streams/command.ts": "8e1e84f6d94637d8814abfac91de0916e97c6ea7d2ccab9ea9e3c9f2de283602", + "https://deno.land/x/redis@v0.32.1/protocol/deno_streams/mod.ts": "346d473bd4e834e397ca25bbbf1021f44e577adda8d6391a41bd03b7bc8c72f4", + "https://deno.land/x/redis@v0.32.1/protocol/deno_streams/reply.ts": "2707e9fe18608c1a9a49b4f0094397c7400141b8208170c7bcb128ceb5ddd790", + "https://deno.land/x/redis@v0.32.1/protocol/shared/command.ts": "71639adc162dac95fa41d701a7112bcd5d5cf3fd22c1307c8840f983628540be", + "https://deno.land/x/redis@v0.32.1/protocol/shared/protocol.ts": "5b9284ee28ec74dfc723c7c7f07dca8d5f9d303414f36689503622dfdde12551", + "https://deno.land/x/redis@v0.32.1/protocol/shared/reply.ts": "3311ff66357bacbd60785cb43b97539c341d8a7d963bc5e80cb864ac81909ea5", + "https://deno.land/x/redis@v0.32.1/protocol/shared/types.ts": "3d1ff5983abc1e4e56c751aaf4672042c87334cd004ce2fc0493575432151e1f", + "https://deno.land/x/redis@v0.32.1/pubsub.ts": "a36892455b0a4a50af169332a165b0985cc90d84486087f036e507e3137b2afb", + "https://deno.land/x/redis@v0.32.1/redis.ts": "6ec7be95f64174078279518afff0535d04d7f96d90da36f2e9a9ab9f388cbaa1", + "https://deno.land/x/redis@v0.32.1/stream.ts": "73b286174d4a02006720c9e2d193754d10e041e8e1450188e32f203a188bbecb", + "https://deno.land/x/redis@v0.32.1/vendor/https/deno.land/std/async/delay.ts": "7315c16b92e21d527d1acc7cced18c09d081c8a1efa2a993f7c039cf21ad1d54", + "https://deno.land/x/redis@v0.32.1/vendor/https/deno.land/std/bytes/concat.ts": "de0d17d9c07f9f87c353ce9df27ef5d7409d0ededf0885f50646336788920dbd", + "https://deno.land/x/redis@v0.32.1/vendor/https/deno.land/std/io/buf_reader.ts": "6529a1668e0054cb788e8a01d8c704c01e013698c6cd5bb141a35a2971cc9fe1", + "https://deno.land/x/redis@v0.32.1/vendor/https/deno.land/std/io/buf_writer.ts": "0dbd95b759fe47e53f99a4945e66673af581ebccfebd2ab4c764c3b09d10ea51", + "https://deno.land/x/ts_morph@18.0.0/bootstrap/mod.ts": "b53aad517f106c4079971fcd4a81ab79fadc40b50061a3ab2b741a09119d51e9", + "https://deno.land/x/ts_morph@18.0.0/bootstrap/ts_morph_bootstrap.js": "6645ac03c5e6687dfa8c78109dc5df0250b811ecb3aea2d97c504c35e8401c06", + "https://deno.land/x/ts_morph@18.0.0/common/DenoRuntime.ts": "6a7180f0c6e90dcf23ccffc86aa8271c20b1c4f34c570588d08a45880b7e172d", + "https://deno.land/x/ts_morph@18.0.0/common/mod.ts": "01985d2ee7da8d1caee318a9d07664774fbee4e31602bc2bb6bb62c3489555ed", + "https://deno.land/x/ts_morph@18.0.0/common/ts_morph_common.js": "845671ca951073400ce142f8acefa2d39ea9a51e29ca80928642f3f8cf2b7700", + "https://deno.land/x/ts_morph@18.0.0/common/typescript.js": "d5c598b6a2db2202d0428fca5fd79fc9a301a71880831a805d778797d2413c59", + "https://deno.land/x/wasmbuild@0.15.0/cache.ts": "89eea5f3ce6035a1164b3e655c95f21300498920575ade23161421f5b01967f4", + "https://deno.land/x/wasmbuild@0.15.0/loader.ts": "d98d195a715f823151cbc8baa3f32127337628379a02d9eb2a3c5902dbccfc02", + "https://deno.land/x/xhr@0.3.0/mod.ts": "094aacd627fd9635cd942053bf8032b5223b909858fa9dc8ffa583752ff63b20", + "https://deno.land/x/zod@v3.22.2/ZodError.ts": "4de18ff525e75a0315f2c12066b77b5c2ae18c7c15ef7df7e165d63536fdf2ea", + "https://deno.land/x/zod@v3.22.2/errors.ts": "5285922d2be9700cc0c70c95e4858952b07ae193aa0224be3cbd5cd5567eabef", + "https://deno.land/x/zod@v3.22.2/external.ts": "a6cfbd61e9e097d5f42f8a7ed6f92f93f51ff927d29c9fbaec04f03cbce130fe", + "https://deno.land/x/zod@v3.22.2/helpers/enumUtil.ts": "54efc393cc9860e687d8b81ff52e980def00fa67377ad0bf8b3104f8a5bf698c", + "https://deno.land/x/zod@v3.22.2/helpers/errorUtil.ts": "7a77328240be7b847af6de9189963bd9f79cab32bbc61502a9db4fe6683e2ea7", + "https://deno.land/x/zod@v3.22.2/helpers/parseUtil.ts": "f791e6e65a0340d85ad37d26cd7a3ba67126cd9957eac2b7163162155283abb1", + "https://deno.land/x/zod@v3.22.2/helpers/partialUtil.ts": "998c2fe79795257d4d1cf10361e74492f3b7d852f61057c7c08ac0a46488b7e7", + "https://deno.land/x/zod@v3.22.2/helpers/typeAliases.ts": "0fda31a063c6736fc3cf9090dd94865c811dfff4f3cb8707b932bf937c6f2c3e", + "https://deno.land/x/zod@v3.22.2/helpers/util.ts": "8baf19b19b2fca8424380367b90364b32503b6b71780269a6e3e67700bb02774", + "https://deno.land/x/zod@v3.22.2/index.ts": "d27aabd973613985574bc31f39e45cb5d856aa122ef094a9f38a463b8ef1a268", + "https://deno.land/x/zod@v3.22.2/locales/en.ts": "a7a25cd23563ccb5e0eed214d9b31846305ddbcdb9c5c8f508b108943366ab4c", + "https://deno.land/x/zod@v3.22.2/mod.ts": "64e55237cb4410e17d968cd08975566059f27638ebb0b86048031b987ba251c4", + "https://deno.land/x/zod@v3.22.2/types.ts": "18cbe3d895f42977c43fa9411da214b06d0d682cf2f4c9dd26cc8c3737740d40", + "https://esm.sh/@aws-sdk/client-s3@3.335.0?pin=v131": "0633878ddbd4e8d10cb685fedd109df3480c2536e72702c62f7e3b010ab912fc", + "https://esm.sh/@aws-sdk/s3-request-presigner@3.335.0?pin=v131": "f32c826ef4de3839aca3e48ed856426019a2f16cc787e1c09d2214d24dd448cb", + "https://esm.sh/v131/@aws-crypto/crc32@3.0.0/denonext/crc32.mjs": "a7b2905678c9acb4294fedf6f75c0d01c2a7c4a031acea1c816fd22b1372ad4a", + "https://esm.sh/v131/@aws-crypto/crc32c@3.0.0/denonext/crc32c.mjs": "b5b36bedb1a00f79183720f5d4c54cb672e8f9877ca820550bb333f778ce912e", + "https://esm.sh/v131/@aws-crypto/ie11-detection@3.0.0/denonext/ie11-detection.mjs": "7cbccafb093d6c2c1a5b9f3e8535533220cc612dfb2bf228ea793e69376f8a0f", + "https://esm.sh/v131/@aws-crypto/sha1-browser@3.0.0/denonext/sha1-browser.mjs": "8d00cbfad40fad9737dde1e190e26bd6c0f7925c1aff7c2c1685b825d817e57c", + "https://esm.sh/v131/@aws-crypto/sha256-browser@3.0.0/denonext/sha256-browser.mjs": "55e8c7cf121d71c0001a16e8c6eae414c626f37bc894c4f43cd5796c084caf00", + "https://esm.sh/v131/@aws-crypto/sha256-js@3.0.0/denonext/sha256-js.mjs": "ba78960638c2969e03f6f69175ab51e0aa1167196a32f4baa2d9a3be54c7be2a", + "https://esm.sh/v131/@aws-crypto/supports-web-crypto@3.0.0/denonext/supports-web-crypto.mjs": "361a53acba49a257feed671c9636779f9884723d590a22db56d7a00731dc435c", + "https://esm.sh/v131/@aws-crypto/util@3.0.0/denonext/util.mjs": "2f9527b5030c246599f883288161258583d6edb7eec6567119a9e48b0166b460", + "https://esm.sh/v131/@aws-sdk/chunked-blob-reader@3.310.0/denonext/chunked-blob-reader.mjs": "4401b1a6c954c398db355225a6d937e9403192f9e79310be7ff22c2a33e05f14", + "https://esm.sh/v131/@aws-sdk/client-s3@3.335.0/denonext/client-s3.mjs": "2990cd07204aac8c6c4046f19d5b33c71d37e36a9335ef7346025e8b2f0e1d9c", + "https://esm.sh/v131/@aws-sdk/config-resolver@3.329.0/denonext/config-resolver.mjs": "00b134417c639e27b2107d74ebf91ed93c603b91733f1c4ada4cd8cf3da3527b", + "https://esm.sh/v131/@aws-sdk/eventstream-codec@3.329.0/denonext/eventstream-codec.mjs": "2671176e614b701e53f3982689898875862be983427d78c69be6aab4b4a4ad53", + "https://esm.sh/v131/@aws-sdk/eventstream-serde-browser@3.329.0/denonext/eventstream-serde-browser.mjs": "40d2cdd4cd67f08266b299b36e5d1741c0a258897c565a9eecd63d3ca1d03c91", + "https://esm.sh/v131/@aws-sdk/eventstream-serde-config-resolver@3.329.0/denonext/eventstream-serde-config-resolver.mjs": "18ade7f876637f79053957e80bb0775c0bc78c357007cfa26a27a86931fc70a6", + "https://esm.sh/v131/@aws-sdk/eventstream-serde-universal@3.329.0/denonext/eventstream-serde-universal.mjs": "6a8fc6bc7d5f0801300340f8ab85ed4b7fbee303359767702791e51ea68e3457", + "https://esm.sh/v131/@aws-sdk/fetch-http-handler@3.329.0/denonext/fetch-http-handler.mjs": "d6d30c1712ac8e300af4fb082e6093a07aa607c50d0db61a7b25126bbff3a794", + "https://esm.sh/v131/@aws-sdk/hash-blob-browser@3.329.0/denonext/hash-blob-browser.mjs": "b34c3fd7f2faf2f60e99834a354d35067602f6a8d479f1a29f2196f0986ae65b", + "https://esm.sh/v131/@aws-sdk/invalid-dependency@3.329.0/denonext/invalid-dependency.mjs": "a2f92f8a138d476805c719a2c03f069460c3b6c7842ca86dc93edcedaa0206cd", + "https://esm.sh/v131/@aws-sdk/is-array-buffer@3.310.0/denonext/is-array-buffer.mjs": "6e439346764944fba7c50cc310a0d7d2242e87aaaf4fc342095422ff766bb9ee", + "https://esm.sh/v131/@aws-sdk/md5-js@3.329.0/denonext/md5-js.mjs": "b835157ac7a0bfe2c88a83a2b098fe92b6dfddcc8776b4a315ca238175394a62", + "https://esm.sh/v131/@aws-sdk/middleware-content-length@3.329.0/denonext/middleware-content-length.mjs": "0f170830741c27fbd2c274deb09d5d16545ee899c1be4ab7254a43b103b96bf0", + "https://esm.sh/v131/@aws-sdk/middleware-endpoint@3.329.0/denonext/middleware-endpoint.mjs": "aa77d6acf58e7fb12585b8d0b9d42a6cd188b6046b50dd2fe9002c52abd7014b", + "https://esm.sh/v131/@aws-sdk/middleware-expect-continue@3.329.0/denonext/middleware-expect-continue.mjs": "c8eb9ae0fbb9bd182eb84d0ceb68e8142c951cc6a6e35b2b6d6e27a21048fc80", + "https://esm.sh/v131/@aws-sdk/middleware-flexible-checksums@3.331.0/denonext/middleware-flexible-checksums.mjs": "999978cc064148fe7081eaccadd3bc8ac9b063fb550620a981cf81597d1f01a7", + "https://esm.sh/v131/@aws-sdk/middleware-host-header@3.329.0/denonext/middleware-host-header.mjs": "c0e33ae2c1dd2ad52ce753f5d9035e244fd7780dd15d499422ab2e4c7234e085", + "https://esm.sh/v131/@aws-sdk/middleware-location-constraint@3.329.0/denonext/middleware-location-constraint.mjs": "d58ff62eb0db60c6f3811ddc4f7a0ac48df1f76d2ba430a89fec2b829cd15cf0", + "https://esm.sh/v131/@aws-sdk/middleware-logger@3.329.0/denonext/middleware-logger.mjs": "3edceb18bf204dbc9a0fc4e9801f8aea23b5652dbb920fd05d3a70b37ff83d09", + "https://esm.sh/v131/@aws-sdk/middleware-recursion-detection@3.329.0/denonext/middleware-recursion-detection.mjs": "1998b36c65ed29e70cafc9b7dbad528a345ff7078d3e73e7ae9b6b838af942a5", + "https://esm.sh/v131/@aws-sdk/middleware-retry@3.329.0/denonext/middleware-retry.mjs": "2f7e543d69c95305999b2aa7b079c23a02d870b18d85d6d44ffbab001ded7e81", + "https://esm.sh/v131/@aws-sdk/middleware-sdk-s3@3.329.0/denonext/middleware-sdk-s3.mjs": "8084087a54dba109fd3e29782f25da7996d4f1f4bae5517c9d2fbaf3b36d8d2a", + "https://esm.sh/v131/@aws-sdk/middleware-serde@3.329.0/denonext/middleware-serde.mjs": "6cc2658658bbed61570b1aa86022af3c009ade420c5689a060c741a411f07306", + "https://esm.sh/v131/@aws-sdk/middleware-signing@3.329.0/denonext/middleware-signing.mjs": "caa4a5eeaac855c555cec5f51b8780ea77aa72ac7759a535d1e3a27b79e2c51c", + "https://esm.sh/v131/@aws-sdk/middleware-ssec@3.329.0/denonext/middleware-ssec.mjs": "893e62fa5b5981e8801273220f8af582974bc7ec19a75ae7be34da5fe55acfd6", + "https://esm.sh/v131/@aws-sdk/middleware-stack@3.329.0/denonext/middleware-stack.mjs": "fb99b7b75f28f75710d7c4335eed550049b5fb3a88bb803c9144dc94027126e4", + "https://esm.sh/v131/@aws-sdk/middleware-user-agent@3.332.0/denonext/middleware-user-agent.mjs": "59435f9dd7f0fb160500eada671164fb0f4d518213f8b474a91b54106d5b54b1", + "https://esm.sh/v131/@aws-sdk/property-provider@3.329.0/denonext/property-provider.mjs": "bc96051e0fae3b0a01d011b1b8e247ebf89caa52fbd3522fab77728f4f639345", + "https://esm.sh/v131/@aws-sdk/protocol-http@3.329.0/denonext/protocol-http.mjs": "4256a8110ed08f52124aac742d8df429d84b0b55b29147ebfa5b5db44b2990f6", + "https://esm.sh/v131/@aws-sdk/querystring-builder@3.329.0/denonext/querystring-builder.mjs": "cf0776b4fcc30f0b4911011e5184eb0d996c6e1c045d63c7c0ac8f75507982f0", + "https://esm.sh/v131/@aws-sdk/querystring-parser@3.329.0/denonext/querystring-parser.mjs": "40ff8f84d555f74f8996757645b31276755755412865833e1c2b73cb3c099233", + "https://esm.sh/v131/@aws-sdk/s3-request-presigner@3.335.0/denonext/s3-request-presigner.mjs": "41551ded4796e73be68e20a9be5af919979e9f15ef47808cd677e77577c69050", + "https://esm.sh/v131/@aws-sdk/service-error-classification@3.329.0/denonext/service-error-classification.mjs": "8d188836f247e51643e694518958375d6c24f38f8115438052e95a6fe11e790c", + "https://esm.sh/v131/@aws-sdk/signature-v4-crt@3.391.0/denonext/signature-v4-crt.mjs": "6791fe556546ffea4a106d0a30fa54d351a57c1a8a7ad2de071e1d194e94b683", + "https://esm.sh/v131/@aws-sdk/signature-v4-multi-region@3.329.0/denonext/signature-v4-multi-region.mjs": "c85bd24f342d6d35e4bb63beb8b5b059c557955200dcea37ab29360305b4c748", + "https://esm.sh/v131/@aws-sdk/signature-v4@3.329.0/denonext/signature-v4.mjs": "d6643233bc5e5a566b52e805a649a3eb01b7e1c87af221ccf03337a34fff1807", + "https://esm.sh/v131/@aws-sdk/smithy-client@3.329.0/denonext/smithy-client.mjs": "da930042fd268a64eeb89bf7d5d83aaedcf97ab1abd0739ed2cc493ea56992e2", + "https://esm.sh/v131/@aws-sdk/types@3.329.0/denonext/types.mjs": "f687ff69c53e1af2cc7af841af00691674fbb22889d12a2ae8cb1517600ee67c", + "https://esm.sh/v131/@aws-sdk/url-parser@3.329.0/denonext/url-parser.mjs": "d5963d8f1e62a1f73b4af00ff2e8bed11dc69a39156251b44ce5e9d59add55c1", + "https://esm.sh/v131/@aws-sdk/util-arn-parser@3.310.0/denonext/util-arn-parser.mjs": "da6927c63827861d70a20f1581d399fd5510ebb311f6ba23bb4f41ee6cb13ee4", + "https://esm.sh/v131/@aws-sdk/util-base64@3.310.0/denonext/util-base64.mjs": "dfaecb0f8ce33d1b670861e3eb420e12990dbb71b42574c32064ae86d17d8df0", + "https://esm.sh/v131/@aws-sdk/util-body-length-browser@3.310.0/denonext/util-body-length-browser.mjs": "606de31e860d9a8ef454bde44a42b77311340567e9246b72c42b2c2c604dbd56", + "https://esm.sh/v131/@aws-sdk/util-config-provider@3.310.0/denonext/util-config-provider.mjs": "9c3b6a127cce262b43e339c7f26d8d5444fc887ccda27cc4ca5483e050dfb2cf", + "https://esm.sh/v131/@aws-sdk/util-defaults-mode-browser@3.329.0/denonext/util-defaults-mode-browser.mjs": "acc59887a35a66d5fdcaa2101ac0dcf71141d332b243dc6808534c6ed5212f77", + "https://esm.sh/v131/@aws-sdk/util-endpoints@3.332.0/denonext/util-endpoints.mjs": "02da62ce90e11394aa5428b17b48fdfa74ff81003a689a53b522541101a9608b", + "https://esm.sh/v131/@aws-sdk/util-format-url@3.329.0/denonext/util-format-url.mjs": "6dedc088febc86ddbb24ed628f818ae6caf13ccdedb7d369c1ecc7884e1d0e2b", + "https://esm.sh/v131/@aws-sdk/util-hex-encoding@3.310.0/denonext/util-hex-encoding.mjs": "a0eefaaeb52f512fda170d4ba78b87df41f2588efabc96bc998d12fe7af83c9e", + "https://esm.sh/v131/@aws-sdk/util-locate-window@3.310.0/denonext/util-locate-window.mjs": "894879f284b5a41fc830b8fe40e2a7038b124d5f5b7a3fde841c3314366c56c5", + "https://esm.sh/v131/@aws-sdk/util-middleware@3.329.0/denonext/util-middleware.mjs": "c9e423e7b96aa3eb038defc3b70a7db2e20260e504ec846cff5bd233f34fe09d", + "https://esm.sh/v131/@aws-sdk/util-retry@3.329.0/denonext/util-retry.mjs": "ed702a959997b4820d93bf89503decc8d5a9734729bdbe5bd247f2db693e680b", + "https://esm.sh/v131/@aws-sdk/util-stream-browser@3.329.0/denonext/util-stream-browser.mjs": "7cf71ee2a0a20b67ea57e6834e23bd5076ad74674418d65e8d924f33cc378a06", + "https://esm.sh/v131/@aws-sdk/util-uri-escape@3.310.0/denonext/util-uri-escape.mjs": "c0888b31da1e24f84ce208869244230c4f67caacddcdacdea70b3ae01c0c30bd", + "https://esm.sh/v131/@aws-sdk/util-user-agent-browser@3.329.0/denonext/util-user-agent-browser.mjs": "3fae0af61dd1d0a5764275b34f497ac9511e87529a0fa9f5a30ccfb2a2683856", + "https://esm.sh/v131/@aws-sdk/util-utf8-browser@3.259.0/denonext/util-utf8-browser.mjs": "79fc8ce5cd61204fe274363d637902a5d49ea40688e8d40cbd5b6ecf56f782b7", + "https://esm.sh/v131/@aws-sdk/util-utf8@3.310.0/denonext/util-utf8.mjs": "b988a756b1d6e53db92e105d52a25c298e6fdbd749d24e9ac70a688c96565dc8", + "https://esm.sh/v131/@aws-sdk/util-waiter@3.329.0/denonext/util-waiter.mjs": "756743c076c5ef4d9b842f239bfde5e28903641b2475c4bdbb411e01b445782f", + "https://esm.sh/v131/@aws-sdk/xml-builder@3.310.0/denonext/xml-builder.mjs": "66aa1e7ed650d5da4a99f3ca05f5026fa6efcff293f720221b6cd63102f33dad", + "https://esm.sh/v131/@httptoolkit/websocket-stream@6.0.1/denonext/websocket-stream.mjs": "c5819a529fab01eaa27ec17550cc7b9dae4d0e3e5552f81c0ecb37c746c025c2", + "https://esm.sh/v131/@smithy/eventstream-codec@2.0.2/denonext/eventstream-codec.mjs": "af08552ab22199c7071e6449046a87d5461cbb92ece49c565c11a3d01e3106bb", + "https://esm.sh/v131/@smithy/is-array-buffer@2.0.0/denonext/is-array-buffer.mjs": "8fcbe490a3730ac1eac71766b5e1cb41ccba2f2abf646badb0e50a95340b3623", + "https://esm.sh/v131/@smithy/protocol-http@1.2.0/denonext/protocol-http.mjs": "29f698026fbe2c9c139d356a8ca5f7e197fe34d4f5d9fb364da0a4340729aa12", + "https://esm.sh/v131/@smithy/querystring-parser@2.0.3/denonext/querystring-parser.mjs": "2f656d24d351a2f741fbe5dbeae352f51bf73d80258a0e2d39893c69786843c8", + "https://esm.sh/v131/@smithy/signature-v4@2.0.1/denonext/signature-v4.mjs": "01efbf6f929d92a7d01edc68f5e4d6488684d462c22383955cbf1a7ca5f2ac8e", + "https://esm.sh/v131/@smithy/types@1.2.0/denonext/types.mjs": "e7310b4830d09404b64c0e5512232b86d6374023aaf950049615b99caaed51ec", + "https://esm.sh/v131/@smithy/util-hex-encoding@2.0.0/denonext/util-hex-encoding.mjs": "48b73551d6dc8f87fff840debe36f207f56b04a36c3c21fe2099613457c9d22d", + "https://esm.sh/v131/@smithy/util-middleware@2.0.0/denonext/util-middleware.mjs": "89a29c46c58825db0566b99d517476aa973d4cc09fcd5e82413f018599db8f26", + "https://esm.sh/v131/@smithy/util-uri-escape@2.0.0/denonext/util-uri-escape.mjs": "1e46ae4ab088b9dfcb5dd73715de2a2530747e920cf5b405012aed7d944e2976", + "https://esm.sh/v131/@smithy/util-utf8@2.0.0/denonext/util-utf8.mjs": "c50f8d6d64a39a8717e88184dee0fec145cb2d17a0d0a456e007eae02062bae5", + "https://esm.sh/v131/aws-crt@1.15.16/denonext/aws-crt.mjs": "382aad6bd02cf4f568160bb79b01a47d0332aa4021e1451eaed0b74498d7de9c", + "https://esm.sh/v131/axios@0.24.0/denonext/axios.mjs": "895bb627711160f383d2674e7cae963f8e2734ed90b1972918a35f81d6139675", + "https://esm.sh/v131/bl@4.1.0/denonext/bl.mjs": "77f87a325a0e68eb01e3a3b40856d42a037d0c111a6e3949a82ce6b50c24181a", + "https://esm.sh/v131/bowser@2.11.0/denonext/bowser.mjs": "3fd0c5d68c4bb8b3243c1b0ac76442fa90f5e20ee12773ce2b2f476c2e7a3615", + "https://esm.sh/v131/bufferutil@4.0.7/denonext/bufferutil.mjs": "abe42a54dfdc6365872850cd4395be09f2198b84a1d46022b88c98a6196f6e1f", + "https://esm.sh/v131/core-util-is@1.0.3/denonext/core-util-is.mjs": "f19dfe63f62278ae0c5a25bd85ffeac5bbdb099b22f005d01bbb62673505deec", + "https://esm.sh/v131/crypto-js@4.1.1/denonext/crypto-js.mjs": "b25d264259764a5c95fe9dfe04820d3aa6b22e063776db1dd1d0e7ac2e106eb3", + "https://esm.sh/v131/debug@4.3.4/denonext/debug.mjs": "892826bb4505deb6337df2f0f72b1e355e5377e702dd739b78774539d7482f5c", + "https://esm.sh/v131/duplexify@3.7.1/denonext/duplexify.mjs": "ac16b0738f66a2009a5f40e52f69e534df9577e694da65d1ba709c47081ff6e8", + "https://esm.sh/v131/duplexify@4.1.2/denonext/duplexify.mjs": "8e183775cd15c5752a4ba69439c3efbbfaa47b20c504b97a5ff4c3ef13c9f944", + "https://esm.sh/v131/end-of-stream@1.4.4/denonext/end-of-stream.mjs": "77a90d627b92ff8a6b577d3ce46e7f26ba55808557d1cfca70c540b76bd96af2", + "https://esm.sh/v131/fast-xml-parser@4.1.2/denonext/fast-xml-parser.mjs": "909a019fba61593212441bfc4db1e0e8652c28f108dda2db1435a2f6203bea19", + "https://esm.sh/v131/inherits@2.0.4/denonext/inherits.mjs": "8095f3d6aea060c904fb24ae50f2882779c0acbe5d56814514c8b5153f3b4b3b", + "https://esm.sh/v131/isarray@1.0.0/denonext/isarray.mjs": "6368a41cf02c83843453ac571deb4c393c14e6f5e1d9ca6bbe43a4623f3856c8", + "https://esm.sh/v131/isomorphic-ws@5.0.0/denonext/isomorphic-ws.mjs": "6ebc8e183811a7b10ff098e9e76f2ceaf14682a045e199b4885a47d211e61aac", + "https://esm.sh/v131/js-sdsl@4.3.0/denonext/js-sdsl.mjs": "b9d39574526cc0ea4021040025ad9c6184efc8ba32ced483fd5c785afffa49f1", + "https://esm.sh/v131/lru-cache@6.0.0/denonext/lru-cache.mjs": "24583c5c6a66ad0c20393bb59f45bb5bf77a4bff6545d2f22c4718f48d943840", + "https://esm.sh/v131/mqtt-packet@6.10.0/denonext/mqtt-packet.mjs": "cbab199254918314ec410ff47ed4c2c0753a872b3749c999aad1054155570278", + "https://esm.sh/v131/mqtt@4.3.7/denonext/mqtt.mjs": "c5c3a58d1f400e1c34b985c76ed2bfe7d271488a31af8bb3d515c3995bb2ab3b", + "https://esm.sh/v131/ms@2.1.2/denonext/ms.mjs": "aa4dc45ba72554c5011168f8910cc646c37af53cfff1a15a4decced838b8eb14", + "https://esm.sh/v131/node-gyp-build@4.6.0/denonext/node-gyp-build.mjs": "58fc8e41b3ffd2f8a6b2a1694292976e6e12768d6e3895b9c8c13239562ffe64", + "https://esm.sh/v131/number-allocator@1.0.14/denonext/number-allocator.mjs": "31973164cee3564b8bc660006622bb89fde09ac1aff800ec27b4afd01bbdc74a", + "https://esm.sh/v131/once@1.4.0/denonext/once.mjs": "b4eb5beddf7f0f8ab4db5e56987d53e5f0fd77961eac5dd554ab75aa79ef0202", + "https://esm.sh/v131/process-nextick-args@2.0.1/denonext/process-nextick-args.mjs": "a57885eb600374afb2521e1d47e92df4d292d49c90c31496da5d0dde2f0d0b5f", + "https://esm.sh/v131/readable-stream@2.3.8/denonext/readable-stream.mjs": "9c2952f308e93db73ce18182be01e4e820866fdf35042a60ef29c317a4ffa72b", + "https://esm.sh/v131/readable-stream@3.6.2/denonext/readable-stream.mjs": "6d839ff306020b3a33ba1c9e46ee4f6c73a6edf453fe5c706db14a2e6ab3d987", + "https://esm.sh/v131/reinterval@1.1.0/denonext/reinterval.mjs": "6697cf544429f073376f5b8fcc5696097917bbedab45792b74d3f785e7747b58", + "https://esm.sh/v131/rfdc@1.3.0/denonext/default.js": "14b787ae4011ae4dfd0507974a9b6c11741367a1c31de2fcb3e13c92d8c4f91c", + "https://esm.sh/v131/safe-buffer@5.1.2/denonext/safe-buffer.mjs": "bf91200afdaf8be92e5c7d4c79e4dc9b5c534f76e104f1b37e5891d6f81eaca2", + "https://esm.sh/v131/safe-buffer@5.2.1/denonext/safe-buffer.mjs": "facbcb4f4622e13062978522fa12c42cae4e12f55b0e1d3fa1c4bc751bd827c7", + "https://esm.sh/v131/stream-shift@1.0.1/denonext/stream-shift.mjs": "1ec867cd3a4f89303a28e3f50e56a1d60c200b9204e9678e1a7f908f91ccccd9", + "https://esm.sh/v131/strnum@1.0.5/denonext/strnum.mjs": "1ffef4adec2f74139e36a2bfed8381880541396fe1c315779fb22e081b17468b", + "https://esm.sh/v131/tslib@1.14.1/denonext/tslib.mjs": "5e49e8960f064d11fb709e3338f5437e2ede57e7df873a09d7834c2a0bf533f7", + "https://esm.sh/v131/utf-8-validate@6.0.3/denonext/utf-8-validate.mjs": "6197c86d1731c0c56002eac5d14d7dc6a23d7f8de06623eeef5587aa63aa968b", + "https://esm.sh/v131/util-deprecate@1.0.2/denonext/util-deprecate.mjs": "f69f67cf655c38428b0934e0f7c865c055834a87cc3866b629d6b2beb21005e9", + "https://esm.sh/v131/uuid@8.3.2/denonext/uuid.mjs": "2cea289bbecc01fab6f701b719513f6ac8a3c21a5e52aa3f8682cf61d70a5dc5", + "https://esm.sh/v131/wrappy@1.0.2/denonext/wrappy.mjs": "3c31e4782e0307cf56b319fcec6110f925dafe6cb47a8fa23350d480f5fa8b06", + "https://esm.sh/v131/ws@7.5.9/denonext/ws.mjs": "bb14a389271bb68778d59f498428caee8048221eea59cc7522898b44aad66d88", + "https://esm.sh/v131/ws@8.13.0/denonext/ws.mjs": "ed9425cc1b9c9b9987590c15646b9adcd8e7d4c4cfff745fdc273a46cbc2b7cc", + "https://esm.sh/v131/xtend@4.0.2/denonext/xtend.mjs": "503056f181793967e90c0566a737612694366fa7191172f4a106099b5c2a80d2", + "https://esm.sh/v131/yallist@4.0.0/denonext/yallist.mjs": "61f180d807dda50bac17028eda05d5722a3fecef6e98a9064e2353ea6864fd82", + "https://raw.githubusercontent.com/levibostian/deno-udd/ignore-prerelease/deps.ts": "2b20d8c142749898e0ad5e4adfdc554dbe1411e8e5ef093687767650a1073ff8", + "https://raw.githubusercontent.com/levibostian/deno-udd/ignore-prerelease/mod.ts": "3ef8bb10b88541586bae7d92c32f469627d3a6a799fa8a897ac819b2f7dd95e8", + "https://raw.githubusercontent.com/levibostian/deno-udd/ignore-prerelease/progress.ts": "bb8eb122f5ac32efc073e05e2c13cceea61458b0e49ac05bddc3a49124dc39e3", + "https://raw.githubusercontent.com/levibostian/deno-udd/ignore-prerelease/registry.ts": "fd8e1b05f14cb988fee7a72a51e68131a920f7d4b72f949d9b86794b3c699671", + "https://raw.githubusercontent.com/levibostian/deno-udd/ignore-prerelease/search.ts": "52f9a539ca76893c47d01f8c6d401487ea286d54d1305b079b8727598e4c847a", + "https://raw.githubusercontent.com/levibostian/deno-udd/ignore-prerelease/semver.ts": "c051a906405dd72b55434eb0f390f678881379d57847abe4ec60d8a02af4f6f2" + } +} diff --git a/ghjk.ts b/ghjk.ts index 63ad6c92c3..7cb03d6c08 100644 --- a/ghjk.ts +++ b/ghjk.ts @@ -22,8 +22,27 @@ const installs = { python: ports.cpy_bs({ version: PYTHON_VERSION, releaseTag: "20240224" }), python_latest: ports.cpy_bs({ releaseTag: "20240224" }), node: ports.node({ version: NODE_VERSION }), + comp_py: ports.pipi({ packageName: "componentize-py" }), + wasm_opt: ports.cargobi({ + crateName: "wasm-opt", + version: WASM_OPT_VERSION, + locked: true, + }), }; +const allowedPortDeps = [ + ...ghjk.stdDeps(), + ...[installs.python_latest, installs.node].map((fat) => ({ + manifest: fat.port, + defaultInst: thinInstallConfig(fat), + })), +]; +export const secureConfig = ghjk.secureConfig({ allowedPortDeps }); + +const inCi = () => !!Deno.env.get("CI"); +const inOci = () => !!Deno.env.get("OCI"); +const inDev = () => !inCi() && !inOci(); + ghjk.install( ports.wasmedge({ version: WASMEDGE_VERSION }), ports.protoc({ version: PROTOC_VERSION }), @@ -36,14 +55,10 @@ ghjk.install( ports.temporal_cli({ version: TEMPORAL_VERSION }), ); -if (!Deno.env.has("OCI")) { +if (!inOci()) { ghjk.install( // FIXME: use cargobi when avail - ports.cargobi({ - crateName: "wasm-opt", - version: WASM_OPT_VERSION, - locked: true, - }), + installs.wasm_opt, ports.cargobi({ crateName: "wasm-tools", version: WASM_TOOLS_VERSION, @@ -83,17 +98,19 @@ if (!Deno.env.has("NO_PYTHON")) { version: POETRY_VERSION, })[0], ); - if (!Deno.env.has("OCI")) { + if (inDev()) { ghjk.install( ports.pipi({ packageName: "pre-commit" })[0], ); } } -if (!Deno.env.has("CI") && !Deno.env.has("OCI")) { +if (inDev()) { ghjk.install( ports.act({}), ports.cargobi({ crateName: "whiz", locked: true }), + ports.cargobi({ crateName: "wasmtime-cli", locked: true }), + installs.comp_py[0], ); } @@ -113,12 +130,23 @@ ghjk.task("clean-deno-lock", { }, }); -export const secureConfig = ghjk.secureConfig({ - allowedPortDeps: [ - ...ghjk.stdDeps(), - ...[installs.python_latest, installs.node].map((fat) => ({ - manifest: fat.port, - defaultInst: thinInstallConfig(fat), - })), - ], +ghjk.task("gen-pyrt-bind", { + installs: installs.comp_py, + allowedPortDeps, + async fn({ $ }) { + await $.removeIfExists("./libs/pyrt_component/pyrt"); + await $`componentize-py -d wit/ bindings .`.cwd("./libs/pyrt_component"); + }, +}); + +ghjk.task("build-pyrt", { + installs: [...installs.comp_py, installs.wasm_opt], + allowedPortDeps, + async fn({ $ }) { + await $`componentize-py -d wit/ componentize -o ../../target/pyrt.wasm main` + .cwd("./libs/pyrt_component"); + // TODO: explicitly install wasmtime + await $`wasmtime compile -W component-model ./target/pyrt.wasm -o ./target/pyrt.cwasm`; + // await $`wasm-opt -Oz ./target/pyrt.wasm -o ./target/pyrt.wasm2`; + }, }); diff --git a/libs/pyrt_component/main.py b/libs/pyrt_component/main.py new file mode 100644 index 0000000000..db842fce62 --- /dev/null +++ b/libs/pyrt_component/main.py @@ -0,0 +1,58 @@ +import pyrt.exports + +# NOTE: all imports must be toplevel as constrained by `componentize-py` +from pyrt.imports.shared import Req, Ok, Err + +# from pyrt.imports.typegate_wire import hostcall +from pyrt.exports.mat_wire import ( + InitArgs, + InitResponse, + InitError_UnexpectedMat, + MatInfo, +) + +import json +import types +from typing import Callable, Any + +handlers = {} + + +class MatWire(pyrt.exports.MatWire): + def init(self, args: InitArgs): + for op in args.expected_ops: + handlers[op.op_name] = op_to_handler(op) + return InitResponse(ok=True) + + def handle(self, req: Req): + handler = handlers.get(req.op_name) + if handler is None: + return Err(json.dumps({"ty": "handler_404", "op_name": req.op_name})) + try: + return handler.handle(req) + except Exception as err: + return Err(json.dumps({"ty": "handler_500", "message": str(err)})) + + +class ErasedHandler: + def __init__(self, handler_fn: Callable[[Any], Any]) -> None: + self.handler_fn = handler_fn + + def handle(self, req: Req): + in_parsed = json.loads(req.in_json) + out = self.handler_fn(in_parsed) + return Ok(json.dumps(out)) + + +def op_to_handler(op: MatInfo) -> ErasedHandler: + data_parsed = json.loads(op.mat_data_json) + if data_parsed["ty"] == "def": + module = types.ModuleType(op.op_name) + exec(data_parsed["source"], module.__dict__) + fn = module.__dict__[data_parsed["func_name"]] + return ErasedHandler(handler_fn=lambda inp: fn(inp)) + elif data_parsed["ty"] == "lambda": + fn = eval(data_parsed["source"]) + return ErasedHandler(handler_fn=lambda inp: fn(inp)) + else: + raise Err(InitError_UnexpectedMat(op)) diff --git a/libs/pyrt_component/pyproject.toml b/libs/pyrt_component/pyproject.toml new file mode 100644 index 0000000000..423b82d987 --- /dev/null +++ b/libs/pyrt_component/pyproject.toml @@ -0,0 +1,15 @@ +[tool.poetry] +name = "pyrt-component" +version = "0.3.7-0" +description = "Wasm component implementing the PythonRuntime vm." +authors = ["Your Name "] +license = "Elastic-2.0" +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.8" + + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/libs/pyrt_component/pyrt/__init__.py b/libs/pyrt_component/pyrt/__init__.py new file mode 100644 index 0000000000..5efd3e883d --- /dev/null +++ b/libs/pyrt_component/pyrt/__init__.py @@ -0,0 +1,12 @@ +from typing import TypeVar, Generic, Union, Optional, Protocol, Tuple, List, Any, Self +from enum import Flag, Enum, auto +from dataclasses import dataclass +from abc import abstractmethod +import weakref + +from .types import Result, Ok, Err, Some + + + +class Pyrt(Protocol): + pass diff --git a/libs/pyrt_component/pyrt/exports/__init__.py b/libs/pyrt_component/pyrt/exports/__init__.py new file mode 100644 index 0000000000..dd8ed8459b --- /dev/null +++ b/libs/pyrt_component/pyrt/exports/__init__.py @@ -0,0 +1,22 @@ +from typing import TypeVar, Generic, Union, Optional, Protocol, Tuple, List, Any, Self +from enum import Flag, Enum, auto +from dataclasses import dataclass +from abc import abstractmethod +import weakref + +from ..types import Result, Ok, Err, Some +from ..exports import mat_wire +from ..imports import shared + +class MatWire(Protocol): + + @abstractmethod + def init(self, args: mat_wire.InitArgs) -> mat_wire.InitResponse: + """ + Raises: `pyrt.types.Err(pyrt.imports.mat_wire.InitError)` + """ + raise NotImplementedError + + @abstractmethod + def handle(self, req: shared.Req) -> Result[str, str]: + raise NotImplementedError diff --git a/libs/pyrt_component/pyrt/exports/mat_wire.py b/libs/pyrt_component/pyrt/exports/mat_wire.py new file mode 100644 index 0000000000..bc46c148d7 --- /dev/null +++ b/libs/pyrt_component/pyrt/exports/mat_wire.py @@ -0,0 +1,42 @@ +from typing import TypeVar, Generic, Union, Optional, Protocol, Tuple, List, Any, Self +from enum import Flag, Enum, auto +from dataclasses import dataclass +from abc import abstractmethod +import weakref + +from ..types import Result, Ok, Err, Some + + +@dataclass +class MatInfo: + op_name: str + mat_title: str + mat_hash: str + mat_data_json: str + +@dataclass +class InitArgs: + metatype_version: str + expected_ops: List[MatInfo] + +@dataclass +class InitResponse: + ok: int + + +@dataclass +class InitError_VersionMismatch: + value: str + + +@dataclass +class InitError_UnexpectedMat: + value: MatInfo + + +@dataclass +class InitError_Other: + value: str + + +InitError = Union[InitError_VersionMismatch, InitError_UnexpectedMat, InitError_Other] diff --git a/libs/pyrt_component/pyrt/imports/__init__.py b/libs/pyrt_component/pyrt/imports/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libs/pyrt_component/pyrt/imports/shared.py b/libs/pyrt_component/pyrt/imports/shared.py new file mode 100644 index 0000000000..be927825ff --- /dev/null +++ b/libs/pyrt_component/pyrt/imports/shared.py @@ -0,0 +1,16 @@ +""" +use metatype:typegraph/runtimes; +""" +from typing import TypeVar, Generic, Union, Optional, Protocol, Tuple, List, Any, Self +from enum import Flag, Enum, auto +from dataclasses import dataclass +from abc import abstractmethod +import weakref + +from ..types import Result, Ok, Err, Some + + +@dataclass +class Req: + op_name: str + in_json: str diff --git a/libs/pyrt_component/pyrt/imports/typegate_wire.py b/libs/pyrt_component/pyrt/imports/typegate_wire.py new file mode 100644 index 0000000000..21661750c1 --- /dev/null +++ b/libs/pyrt_component/pyrt/imports/typegate_wire.py @@ -0,0 +1,20 @@ +from typing import TypeVar, Generic, Union, Optional, Protocol, Tuple, List, Any, Self +from enum import Flag, Enum, auto +from dataclasses import dataclass +from abc import abstractmethod +import weakref + +from ..types import Result, Ok, Err, Some + + +@dataclass +class Req: + op_name: str + in_json: str + + +def hostcall(req: Req) -> str: + """ + Raises: `pyrt.types.Err(pyrt.imports.str)` + """ + raise NotImplementedError diff --git a/libs/pyrt_component/pyrt/types.py b/libs/pyrt_component/pyrt/types.py new file mode 100644 index 0000000000..77ad379069 --- /dev/null +++ b/libs/pyrt_component/pyrt/types.py @@ -0,0 +1,23 @@ +from typing import TypeVar, Generic, Union, Optional, Protocol, Tuple, List, Any, Self +from enum import Flag, Enum, auto +from dataclasses import dataclass +from abc import abstractmethod +import weakref + + +S = TypeVar('S') +@dataclass +class Some(Generic[S]): + value: S + +T = TypeVar('T') +@dataclass +class Ok(Generic[T]): + value: T + +E = TypeVar('E') +@dataclass(frozen=True) +class Err(Generic[E], Exception): + value: E + +Result = Union[Ok[T], Err[E]] diff --git a/libs/pyrt_component/wit/pyrt.wit b/libs/pyrt_component/wit/pyrt.wit new file mode 100644 index 0000000000..de1bbfbd77 --- /dev/null +++ b/libs/pyrt_component/wit/pyrt.wit @@ -0,0 +1,56 @@ +package metatype:pyrt; + +// use metatype:typegraph/runtimes; + +interface shared { + record req { + op-name: string, + in-json: string, + } + + type res = result; +} + +interface typegate-wire { + record req { + op-name: string, + in-json: string, + } + type res = result; + + hostcall: func(req: req) -> res; +} + +interface mat-wire { + use shared.{req, res}; + + record mat-info { + op-name: string, + mat-title: string, + mat-hash: string, + mat-data-json: string, + } + + record init-args { + metatype-version: string, + expected-ops: list + } + + record init-response { + ok: bool + } + + variant init-error { + version-mismatch(string), + unexpected-mat(mat-info), + other(string) + } + + init: func(args: init-args) -> result; + handle: func(req: req) -> res; +} + +world pyrt { + import typegate-wire; + export mat-wire; +} diff --git a/ruff.toml b/ruff.toml index f419fc5d89..ae5b7cf437 100644 --- a/ruff.toml +++ b/ruff.toml @@ -1 +1,4 @@ ignore = ["E501"] +exclude = [ + "libs/pyrt_component/pyrt" +] diff --git a/typegate/engine/00_runtime.js b/typegate/engine/00_runtime.js index eff3931230..bdf651fbdb 100644 --- a/typegate/engine/00_runtime.js +++ b/typegate/engine/00_runtime.js @@ -42,18 +42,6 @@ globalThis.Meta = { workflowQuery: getOp("op_temporal_workflow_query"), workflowDescribe: getOp("op_temporal_workflow_describe"), }, - python: { - registerVm: getOp("op_register_virtual_machine"), - unregisterVm: getOp("op_unregister_virtual_machine"), - registerLambda: getOp("op_register_lambda"), - unregisterLambda: getOp("op_unregister_lambda"), - applyLambda: getOp("op_apply_lambda"), - registerDef: getOp("op_register_def"), - unregisterDef: getOp("op_unregister_def"), - applyDef: getOp("op_apply_def"), - registerModule: getOp("op_register_module"), - unregisterModule: getOp("op_unregister_module"), - }, deno: { transformTypescript: getOp("op_deno_transform_typescript"), }, @@ -62,4 +50,9 @@ globalThis.Meta = { typegraphValidate: getOp("op_typegraph_validate"), validatePrismaRuntimeData: getOp("op_validate_prisma_runtime_data"), wasmtimeWit: getOp("op_wasmtime_wit"), + wit_wire: { + init: getOp("op_wit_wire_init"), + destroy: getOp("op_wit_wire_destroy"), + handle: getOp("op_wit_wire_handle"), + }, }; diff --git a/typegate/engine/Cargo.toml b/typegate/engine/Cargo.toml index b529770f20..ecf33b90f5 100644 --- a/typegate/engine/Cargo.toml +++ b/typegate/engine/Cargo.toml @@ -34,17 +34,15 @@ mt_deno.workspace = true common.workspace = true typescript.workspace = true -# remove wasmedge once python runtime has been migrated -wasmedge-sdk.workspace = true -wasmedge-sys.workspace = true -wasmedge-types.workspace = true - wasmtime = { version = "20.0.0", features = ["component-model"] } +wasmtime-wasi = { version = "20.0.0" } shadow-rs.workspace = true serde.workspace = true regex = "1.10.2" +async-trait = "0.1" + [dev-dependencies] env_logger.workspace = true diff --git a/typegate/engine/bindings.ts b/typegate/engine/bindings.ts index 3cb2e8233f..33517a0f2e 100644 --- a/typegate/engine/bindings.ts +++ b/typegate/engine/bindings.ts @@ -1,6 +1,21 @@ // Copyright Metatype OÜ, licensed under the Elastic License 2.0. // SPDX-License-Identifier: Elastic-2.0 -/// + +import type { + ParsedDiff, + PrismaApplyOut, + PrismaCreateOut, + PrismaDeployOut, + PrismaQueryInp, + PrismaRegisterEngineInp, + TemporalRegisterInput, + TemporalWorkflowDescribeInput, + TemporalWorkflowDescribeOutput, + TemporalWorkflowQueryInput, + TemporalWorkflowSignalInput, + TemporalWorkflowStartInput, + WasmInput, +} from "./runtime.js"; export function get_version() { return Meta.version(); @@ -239,118 +254,6 @@ export async function temporal_workflow_query( } } -export type WasiVmInitConfig = { - vm_name: string; - pylib_path: string; - wasi_mod_path: string; - preopens: Array; -}; - -export type WasiVmSetupOut = - | "Ok" - | { - Err: { - message: string; - }; - }; -export type WasiVmUnregisterInp = { - vm_name: string; -}; -export function register_virtual_machine(a0: WasiVmInitConfig): WasiVmSetupOut { - try { - Meta.python.registerVm(a0); - return "Ok"; - } catch (err) { - return { Err: { message: err.toString() } }; - } -} - -export function unregister_virtual_machine( - a0: WasiVmUnregisterInp, -): WasiVmSetupOut { - try { - Meta.python.unregisterVm(a0.vm_name); - return "Ok"; - } catch (err) { - return { Err: { message: err.toString() } }; - } -} - -export type WasiReactorOut = - | { - Ok: { - res: string; - }; - } - | { - Err: { - message: string; - }; - }; -export function register_lambda(a0: PythonRegisterInp): WasiReactorOut { - try { - const res = Meta.python.registerLambda(a0); - return { Ok: { res } }; - } catch (err) { - return { Err: { message: err.toString() } }; - } -} -export function apply_lambda(a0: PythonApplyInp): WasiReactorOut { - try { - const res = Meta.python.applyLambda(a0); - return { Ok: { res } }; - } catch (err) { - return { Err: { message: err.toString() } }; - } -} -export function unregister_lambda(a0: PythonUnregisterInp): WasiReactorOut { - try { - const res = Meta.python.unregisterLambda(a0); - return { Ok: { res } }; - } catch (err) { - return { Err: { message: err.toString() } }; - } -} -export function apply_def(a0: PythonApplyInp): WasiReactorOut { - try { - const res = Meta.python.applyDef(a0); - return { Ok: { res } }; - } catch (err) { - return { Err: { message: err.toString() } }; - } -} -export function register_def(a0: PythonRegisterInp): WasiReactorOut { - try { - const res = Meta.python.registerDef(a0); - return { Ok: { res } }; - } catch (err) { - return { Err: { message: err.toString() } }; - } -} -export function unregister_def(a0: PythonUnregisterInp): WasiReactorOut { - try { - const res = Meta.python.unregisterDef(a0); - return { Ok: { res } }; - } catch (err) { - return { Err: { message: err.toString() } }; - } -} -export function register_module(a0: PythonRegisterInp): WasiReactorOut { - try { - const res = Meta.python.registerModule(a0); - return { Ok: { res } }; - } catch (err) { - return { Err: { message: err.toString() } }; - } -} -export function unregister_module(a0: PythonUnregisterInp): WasiReactorOut { - try { - const res = Meta.python.unregisterModule(a0); - return { Ok: { res } }; - } catch (err) { - return { Err: { message: err.toString() } }; - } -} export type PrismaRegisterEngineOut = | "Ok" | { diff --git a/typegate/engine/runtime.d.ts b/typegate/engine/runtime.d.ts index 53b61e1dcb..9101937f60 100644 --- a/typegate/engine/runtime.d.ts +++ b/typegate/engine/runtime.d.ts @@ -1,6 +1,71 @@ // Copyright Metatype OÜ, licensed under the Elastic License 2.0. // SPDX-License-Identifier: Elastic-2.0 +declare global { + const Meta: MetaNS; +} + +type MetaNS = { + version: () => string; + typescriptFormatCode: (source: string) => string; + typegraphValidate: (json: string) => string; + validatePrismaRuntimeData: (obj: any) => void; + wasmtimeWit: (inp: WasmInput) => string; + + prisma: { + registerEngine: ( + inp: PrismaRegisterEngineInp, + ) => Promise; + unregisterEngine: (engine_name: string) => Promise; + query: (inp: PrismaQueryInp) => Promise; + diff: ( + inp: PrismaDiffInp, + ) => Promise<[string, ParsedDiff[]] | undefined | null>; + apply: (inp: PrismaDevInp) => Promise; + deploy: (inp: PrismaDeployInp) => Promise; + create: (inp: PrismaCreateInp) => Promise; + reset: (datasource: string) => Promise; + unpack: (inp: UnpackInp) => void; + archive: (path: string) => string | undefined | null; + }; + + temporal: { + clientRegister: (inp: TemporalRegisterInput) => Promise; + clientUnregister: (client_id: string) => void; + workflowStart: ( + inp: TemporalWorkflowStartInput, + ) => Promise; + workflowSignal: ( + inp: TemporalWorkflowSignalInput, + ) => Promise; + workflowQuery: ( + inp: TemporalWorkflowQueryInput, + ) => Promise>; + workflowDescribe: ( + inp: TemporalWorkflowDescribeInput, + ) => Promise; + }; + + deno: { + transformTypescript: (inp: string) => string; + }; + + wit_wire: { + init: ( + componentPath: string, + instanceId: string, + args: WitWireInitArgs, + ) => Promise; + destroy: ( + instanceId: string, + ) => Promise; + handle: ( + instanceId: string, + args: WitWireReq, + ) => Promise; + }; +}; + interface WasmInput { func: string; wasm: string; @@ -142,63 +207,46 @@ interface ParsedDiff { table: string; diff: TableDiff[]; } -declare namespace Meta { - function version(): string; - function typescriptFormatCode(source: string): string; - function typegraphValidate(json: string): string; - function validatePrismaRuntimeData(obj: any): void; - function wasmtimeWit(inp: WasmInput): string; - namespace prisma { - function registerEngine( - inp: PrismaRegisterEngineInp, - ): Promise; - function unregisterEngine(engine_name: string): Promise; - function query(inp: PrismaQueryInp): Promise; - function diff( - inp: PrismaDiffInp, - ): Promise<[string, ParsedDiff[]] | undefined | null>; - function apply(inp: PrismaDevInp): Promise; - function deploy(inp: PrismaDeployInp): Promise; - function create(inp: PrismaCreateInp): Promise; - function reset(datasource: string): Promise; - function unpack(inp: UnpackInp): void; - function archive(path: string): string | undefined | null; - } +export type WitWireReq = { + op_name: string; + in_json: string; +}; - namespace temporal { - function clientRegister(inp: TemporalRegisterInput): Promise; - function clientUnregister(client_id: string): void; - function workflowStart( - inp: TemporalWorkflowStartInput, - ): Promise; - function workflowSignal( - inp: TemporalWorkflowSignalInput, - ): Promise; - function workflowQuery( - inp: TemporalWorkflowQueryInput, - ): Promise>; - function workflowDescribe( - inp: TemporalWorkflowDescribeInput, - ): Promise; +export type WitWireHandleError = + | { + InstanceNotFound: string; + } + | { + ModuleErr: string; } - namespace python { - function registerVm(inp: WasiVmInitConfig): void; - function unregisterVm(vm_name: string): void; + | { + MatErr: string; + }; - function registerLambda(inp: PythonRegisterInp): string; - function unregisterLambda(inp: PythonUnregisterInp): string; - function applyLambda(inp: PythonApplyInp): string; +export type WitWireMatInfo = { + op_name: string; + mat_title: string; + mat_hash: string; + mat_data_json: string; +}; - function registerDef(inp: PythonRegisterInp): string; - function unregisterDef(inp: PythonUnregisterInp): string; - function applyDef(inp: PythonApplyInp): string; +export type WitWireInitArgs = { + metatype_version: string; + expected_ops: WitWireMatInfo[]; +}; - function registerModule(inp: PythonRegisterInp): string; - function unregisterModule(inp: PythonUnregisterInp): string; +export type WitWireInitResponse = object; +export type WitWireInitError = + | { + VersionMismatch: string; } - - namespace deno { - function transformTypescript(inp: string): string; + | { + UnexpectedMat: string; } -} + | { + ModuleErr: string; + } + | { + Other: string; + }; diff --git a/typegate/engine/runtime.js b/typegate/engine/runtime.js new file mode 100644 index 0000000000..5f107cad96 --- /dev/null +++ b/typegate/engine/runtime.js @@ -0,0 +1 @@ +/// diff --git a/typegate/engine/src/ext.rs b/typegate/engine/src/ext.rs index 34d82a4fc3..270c736c3f 100644 --- a/typegate/engine/src/ext.rs +++ b/typegate/engine/src/ext.rs @@ -3,7 +3,7 @@ use crate::interlude::*; use crate::{ - runtimes::{deno_rt, prisma, python::python_bindings, temporal, wasm}, + runtimes::{deno_rt, prisma, temporal, wasm, wit_wire}, typegraph, typescript, }; @@ -30,16 +30,6 @@ deno_core::extension!( temporal::op_temporal_workflow_query, temporal::op_temporal_workflow_signal, temporal::op_temporal_workflow_describe, - python_bindings::op_register_virtual_machine, - python_bindings::op_unregister_virtual_machine, - python_bindings::op_register_lambda, - python_bindings::op_unregister_lambda, - python_bindings::op_apply_lambda, - python_bindings::op_register_def, - python_bindings::op_unregister_def, - python_bindings::op_apply_def, - python_bindings::op_register_module, - python_bindings::op_unregister_module, prisma::op_prisma_register_engine, prisma::op_prisma_unregister_engine, prisma::op_prisma_query, @@ -50,7 +40,10 @@ deno_core::extension!( prisma::op_prisma_reset, prisma::op_unpack, prisma::op_archive, - deno_rt::op_deno_transform_typescript + deno_rt::op_deno_transform_typescript, + wit_wire::op_wit_wire_init, + wit_wire::op_wit_wire_handle, + wit_wire::op_wit_wire_destroy, ], // esm_entry_point = "ext:tg_metatype_ext/00_runtime.js", // esm = ["00_runtime.js"], diff --git a/typegate/engine/src/lib.rs b/typegate/engine/src/lib.rs index 0b31cafe0c..1f411205a6 100644 --- a/typegate/engine/src/lib.rs +++ b/typegate/engine/src/lib.rs @@ -74,7 +74,9 @@ impl OpDepInjector { #[cfg(test)] state.put(ext::tests::TestCtx { val: 10 }); state.put(runtimes::temporal::Ctx::default()); - state.put(runtimes::python::python_bindings::Ctx::default()); + let engine = wasmtime::Engine::new(wasmtime::Config::new().async_support(true)) + .expect("invalid wasmtime engine config"); + state.put(runtimes::wit_wire::Ctx::new(engine)); state.put(runtimes::prisma::Ctx::new(self.tmp_dir.unwrap())); } } diff --git a/typegate/engine/src/runtimes.rs b/typegate/engine/src/runtimes.rs index bd263c7929..1003e9e6c4 100644 --- a/typegate/engine/src/runtimes.rs +++ b/typegate/engine/src/runtimes.rs @@ -3,6 +3,6 @@ pub mod deno_rt; pub mod prisma; -pub mod python; pub mod temporal; pub mod wasm; +pub mod wit_wire; diff --git a/typegate/engine/src/runtimes/python.rs b/typegate/engine/src/runtimes/python.rs deleted file mode 100644 index 8d4c3a7df9..0000000000 --- a/typegate/engine/src/runtimes/python.rs +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright Metatype OÜ, licensed under the Elastic License 2.0. -// SPDX-License-Identifier: Elastic-2.0 - -pub mod python_bindings; -pub mod wasi_vm; diff --git a/typegate/engine/src/runtimes/python/python_bindings.rs b/typegate/engine/src/runtimes/python/python_bindings.rs deleted file mode 100644 index 335d529771..0000000000 --- a/typegate/engine/src/runtimes/python/python_bindings.rs +++ /dev/null @@ -1,206 +0,0 @@ -// Copyright Metatype OÜ, licensed under the Elastic License 2.0. -// SPDX-License-Identifier: Elastic-2.0 - -use crate::interlude::*; - -use dashmap::{mapref::one::Ref, DashMap}; -#[rustfmt::skip] -use deno_core as deno_core; // necessary for re-exported macros to work - -use std::path::PathBuf; -use wasmedge_sdk::dock::{Param, VmDock}; -use wasmedge_sdk::{params, Vm}; - -use super::wasi_vm; - -#[derive(Default)] -pub struct Ctx { - vms: DashMap, -} - -impl Ctx { - fn get_virtual_machine(&self, name: String) -> Result> { - match self.vms.get(&name) { - Some(vm) => Ok(vm), - None => Err(anyhow::format_err!("vm not initialized")), - } - } -} - -#[derive(Deserialize)] -#[serde(crate = "serde")] -pub struct WasiVmInitConfig { - vm_name: String, - pylib_path: String, - wasi_mod_path: String, - preopens: Vec, -} - -#[deno_core::op2] -pub fn op_register_virtual_machine( - #[state] ctx: &mut Ctx, - #[serde] config: WasiVmInitConfig, -) -> Result<()> { - if ctx.vms.get(&config.vm_name).is_none() { - let vm = wasi_vm::init_reactor_vm( - config.preopens, - PathBuf::from(config.pylib_path), - PathBuf::from(config.wasi_mod_path), - )?; - - vm.run_func(None, "init_python", params!())?; - - ctx.vms.insert(config.vm_name, vm); - } - Ok(()) -} - -#[deno_core::op2(fast)] -pub fn op_unregister_virtual_machine( - #[state] ctx: &mut Ctx, - #[string] vm_name: &str, -) -> Result<()> { - match ctx.vms.remove(vm_name) { - Some(_) => Ok(()), - None => anyhow::bail!( - "Could not remove virtual machine {:?}: entry not found", - vm_name - ), - } -} - -#[derive(Deserialize, Debug)] -#[serde(crate = "serde")] -pub struct PythonRegisterInp { - vm: String, - name: String, - code: String, -} - -#[derive(Deserialize, Debug)] -#[serde(crate = "serde")] -pub struct PythonUnregisterInp { - vm: String, - name: String, -} - -#[derive(Deserialize, Debug)] -#[serde(crate = "serde")] -pub struct PythonApplyInp { - vm: String, - id: i32, - name: String, - /// stringified json array - args: String, -} - -fn run_wasi_func(vm: &Vm, fn_name: String, args: Vec) -> Result { - let vm_dock = VmDock::new(vm.to_owned()); - match vm_dock.run_func(fn_name, args) { - Ok(ret) => { - let ret = ret.unwrap().pop().unwrap().downcast::().unwrap(); - Ok(ret.as_ref().to_owned()) - } - Err(e) => anyhow::bail!(e), - } -} - -fn register_entity(ctx: &Ctx, wasi_fn_callee: String, entity: PythonRegisterInp) -> Result { - let vm = ctx.get_virtual_machine(entity.vm)?; - let args = vec![Param::String(&entity.name), Param::String(&entity.code)]; - run_wasi_func(&vm, wasi_fn_callee, args) -} - -fn unregister_entity( - ctx: &Ctx, - wasi_fn_callee: String, - entity: PythonUnregisterInp, -) -> Result { - let vm = ctx.get_virtual_machine(entity.vm)?; - let args = vec![Param::String(&entity.name)]; - run_wasi_func(&vm, wasi_fn_callee, args) -} - -fn apply_entity(ctx: &Ctx, wasi_fn_callee: String, entity: PythonApplyInp) -> Result { - let vm = ctx.get_virtual_machine(entity.vm)?; - let args = vec![ - Param::I32(entity.id), - Param::String(&entity.name), - Param::String(&entity.args), - ]; - run_wasi_func(&vm, wasi_fn_callee, args) -} - -// deno bindings - -// lambda - -#[deno_core::op2] -#[string] -pub fn op_register_lambda( - #[state] ctx: &mut Ctx, - #[serde] entity: PythonRegisterInp, -) -> Result { - register_entity(ctx, "register_lambda".to_string(), entity) -} - -#[deno_core::op2] -#[string] -pub fn op_unregister_lambda( - #[state] ctx: &mut Ctx, - #[serde] entity: PythonUnregisterInp, -) -> Result { - unregister_entity(ctx, "unregister_lambda".to_string(), entity) -} - -#[deno_core::op2] -#[string] -pub fn op_apply_lambda(#[state] ctx: &mut Ctx, #[serde] entity: PythonApplyInp) -> Result { - apply_entity(ctx, "apply_lambda".to_string(), entity) -} - -// defun - -#[deno_core::op2] -#[string] -pub fn op_register_def( - #[state] ctx: &mut Ctx, - #[serde] entity: PythonRegisterInp, -) -> Result { - register_entity(ctx, "register_def".to_string(), entity) -} - -#[deno_core::op2] -#[string] -pub fn op_unregister_def( - #[state] ctx: &mut Ctx, - #[serde] entity: PythonUnregisterInp, -) -> Result { - unregister_entity(ctx, "unregister_def".to_string(), entity) -} - -#[deno_core::op2] -#[string] -pub fn op_apply_def(#[state] ctx: &mut Ctx, #[serde] entity: PythonApplyInp) -> Result { - apply_entity(ctx, "apply_def".to_string(), entity) -} - -// module - -#[deno_core::op2] -#[string] -pub fn op_register_module( - #[state] ctx: &mut Ctx, - #[serde] entity: PythonRegisterInp, -) -> Result { - register_entity(ctx, "register_module".to_string(), entity) -} - -#[deno_core::op2] -#[string] -pub fn op_unregister_module( - #[state] ctx: &mut Ctx, - #[serde] entity: PythonUnregisterInp, -) -> Result { - unregister_entity(ctx, "unregister_module".to_string(), entity) -} diff --git a/typegate/engine/src/runtimes/python/wasi_vm.rs b/typegate/engine/src/runtimes/python/wasi_vm.rs deleted file mode 100644 index 245ea613a6..0000000000 --- a/typegate/engine/src/runtimes/python/wasi_vm.rs +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright Metatype OÜ, licensed under the Elastic License 2.0. -// SPDX-License-Identifier: Elastic-2.0 - -use anyhow::bail; -use once_cell::sync::OnceCell; -use std::path::PathBuf; -use wasmedge_sdk::{ - config::{CommonConfigOptions, ConfigBuilder, HostRegistrationConfigOptions}, - error::HostFuncError, - host_function, params, Caller, ImportObject, ImportObjectBuilder, Module, NeverType, Vm, - VmBuilder, WasmValue, -}; - -#[host_function] -pub fn callback(_caller: Caller, _args: Vec) -> Result, HostFuncError> { - // println!("[host] callback"); - Ok(vec![]) -} - -static IMPORTS: OnceCell> = OnceCell::new(); - -pub fn get_or_init_imports() -> anyhow::Result<&'static ImportObject> { - let import = ImportObjectBuilder::new() - .with_func::<(i32, i32), (), NeverType>("callback", callback, None)? - .build::("host", None)?; - Ok(IMPORTS.get_or_init(|| import)) -} - -pub fn init_reactor_vm( - inp_preopens: Vec, - pythonlib_path: PathBuf, - wasi_mod_path: PathBuf, -) -> anyhow::Result { - // start config - let common_options = CommonConfigOptions::default().threads(true); - let host_options = HostRegistrationConfigOptions::default().wasi(true); - let config = ConfigBuilder::new(common_options) - .with_host_registration_config(host_options) - .build()?; - // end config - - // [!] module order matters - let mut vm = VmBuilder::new().with_config(config).build()?; - - // FIXME: - // https://github.com/WasmEdge/WasmEdge/issues/3085 - // locally scoped import ref that uses the host function - // makes some bindings call segfault with exit code 11 - // Note: in version 0.8.1, register_import_module - // only required my_import vs &my_import (current) - - // Current solution: make a global ref - vm.register_import_module(get_or_init_imports()?)?; - - // load wasm module - let module = Module::from_file(None, wasi_mod_path)?; - let mut vm = vm.register_module(None, module)?; - - let wasi_module = vm.wasi_module_mut().unwrap(); - - // prepare preopens - let mut preopens = vec![format!( - "/usr/local/lib:{}:readonly", - pythonlib_path.display() - )]; - preopens.extend(inp_preopens); - let preopens = preopens.iter().map(|s| s.as_ref()).collect(); - wasi_module.initialize(None, None, Some(preopens)); - - let exit_code = wasi_module.exit_code(); - if exit_code != 0 { - bail!( - "wasi_module.initialize failed and returned exit code: {:?}", - exit_code - ) - } - - // if wasi-vfs is not used, initialize the reactor as not done automatically - let _init = vm.run_func(None, "_initialize", params!())?; - Ok(vm) -} diff --git a/typegate/engine/src/runtimes/wasm.rs b/typegate/engine/src/runtimes/wasm.rs index a9be67ad2d..6da88b34c7 100644 --- a/typegate/engine/src/runtimes/wasm.rs +++ b/typegate/engine/src/runtimes/wasm.rs @@ -35,6 +35,7 @@ pub fn op_wasmtime_wit(#[serde] input: WasmInput) -> Result { .map(|v| serde_json::from_str::(v).unwrap()) .collect(); + // TODO: share with wit_wire let engine = wasmtime::Engine::default(); let mut store = wasmtime::Store::new(&engine, ()); diff --git a/typegate/engine/src/runtimes/wit_wire.rs b/typegate/engine/src/runtimes/wit_wire.rs new file mode 100644 index 0000000000..0f2236a7d1 --- /dev/null +++ b/typegate/engine/src/runtimes/wit_wire.rs @@ -0,0 +1,316 @@ +// Copyright Metatype OÜ, licensed under the Elastic License 2.0. +// SPDX-License-Identifier: Elastic-2.0 + +use crate::interlude::*; +use dashmap::DashMap; +#[rustfmt::skip] +use deno_core as deno_core; // necessary for re-exported macros to work +use deno_core::OpState; + +mod wit { + wasmtime::component::bindgen!({ + path: "../../libs/pyrt_component/wit", + async: true, + }); +} +use wasmtime::component::{Component, Linker}; +use wit::exports::metatype::pyrt::mat_wire::{InitArgs, InitError, MatInfo, Req as MatReq}; +use wit::metatype::pyrt::typegate_wire::{Host, Req as HostReq, Res as HostRes}; + +#[derive(Clone)] +pub struct Ctx { + engine: wasmtime::Engine, + instances: Arc>, + components: Arc>, +} + +#[derive(Clone)] +struct LinkedComponent(Component, Arc>); + +/* static WASI_CTX: once_cell::sync::Lazy = once_cell::sync::Lazy::new(|| { + wasmtime_wasi::WasiCtxBuilder::new() + .allow_ip_name_lookup(true) + .build() +}); */ + +impl Ctx { + pub fn new(engine: wasmtime::Engine) -> Self { + Self { + instances: Default::default(), + components: Default::default(), + engine, + } + } + + async fn get_component(&self, wasm_relative_path: PathBuf) -> Result { + let wasm_absolute_path = match std::env::current_dir() { + Ok(cwd) => cwd.join(wasm_relative_path), + Err(err) => return Err(format!("error trying to find cwd: {err}")), + }; + + let comp = if let Some(comp) = self.components.get(&wasm_absolute_path) { + comp.clone() + } else { + let engine = self.engine.clone(); + let path_clone = wasm_absolute_path.clone(); + let comp = if wasm_absolute_path + .extension() + .map(|ext| ext == "cwasm") + .unwrap_or_default() + { + // TODO: self manage precompilation cache + tokio::task::spawn_blocking(move || unsafe { + Component::deserialize_file(&engine, &path_clone) + }) + .await + .map_err(|err| format!("tokio error loading serialized component: {err}"))? + .map_err(|err| format!("error loading serialized component: {err}"))? + } else { + tokio::task::spawn_blocking(move || Component::from_file(&engine, &path_clone)) + .await + .map_err(|err| format!("tokio error loading component: {err}"))? + .map_err(|err| format!("error loading component: {err}"))? + }; + + let mut linker = Linker::::new(&self.engine); + + for res in [ + wasmtime_wasi::bindings::Imports::add_to_linker(&mut linker, |host| host), + wit::Pyrt::add_to_linker(&mut linker, |host| host), + ] { + res.map_err(|err| format!("erorr trying to link component: {err}"))?; + } + self.components + .entry(wasm_absolute_path) + .insert_entry(LinkedComponent(comp, linker.into())) + .get() + .clone() + }; + Ok(comp) + } +} + +struct Instance { + bindings: wit::Pyrt, + _instance: wasmtime::component::Instance, + store: wasmtime::Store, +} + +struct TypegateHost { + table: wasmtime_wasi::ResourceTable, + ctx: wasmtime_wasi::WasiCtx, +} + +impl TypegateHost { + fn new() -> Self { + Self { + ctx: wasmtime_wasi::WasiCtxBuilder::new() + .allow_ip_name_lookup(true) + // TODO: stream stdio to debug log + .inherit_stdio() + .build(), + table: Default::default(), + } + } +} + +#[async_trait::async_trait] +impl Host for TypegateHost { + async fn hostcall(&mut self, _req: HostReq) -> wasmtime::Result { + todo!() + } +} + +impl wit::metatype::pyrt::shared::Host for TypegateHost {} + +impl wasmtime_wasi::WasiView for TypegateHost { + fn table(&mut self) -> &mut wasmtime_wasi::ResourceTable { + &mut self.table + } + + fn ctx(&mut self) -> &mut wasmtime_wasi::WasiCtx { + &mut self.ctx + } +} +#[derive(Deserialize)] +#[serde(crate = "serde")] +pub struct WitWireInitArgs { + metatype_version: String, + expected_ops: Vec, +} + +impl From for InitArgs { + fn from(value: WitWireInitArgs) -> Self { + InitArgs { + metatype_version: value.metatype_version, + expected_ops: value.expected_ops.into_iter().map(Into::into).collect(), + } + } +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(crate = "serde")] +pub struct WitWireMatInfo { + op_name: String, + mat_title: String, + mat_hash: String, + mat_data_json: String, +} + +impl From for WitWireMatInfo { + fn from(value: MatInfo) -> Self { + WitWireMatInfo { + op_name: value.op_name, + mat_title: value.mat_title, + mat_hash: value.mat_hash, + mat_data_json: value.mat_data_json, + } + } +} + +impl From for MatInfo { + fn from(value: WitWireMatInfo) -> Self { + MatInfo { + op_name: value.op_name, + mat_title: value.mat_title, + mat_hash: value.mat_hash, + mat_data_json: value.mat_data_json, + } + } +} + +#[derive(Serialize)] +#[serde(crate = "serde")] +pub struct WitWireInitResponse {} + +#[derive(Serialize, Debug, thiserror::Error)] +#[serde(crate = "serde")] +pub enum WitWireInitError { + #[error("metatype version mismatch: {0:?}")] + VersionMismatch(String), + #[error("unexpected mat info: {0:?}")] + UnexpectedMat(WitWireMatInfo), + #[error("unexpected error: {0:?}")] + Other(String), + #[error("wasm module error: {0:?}")] + ModuleErr(String), +} + +impl From for WitWireInitError { + fn from(value: InitError) -> Self { + match value { + InitError::VersionMismatch(ver) => Self::VersionMismatch(ver), + InitError::UnexpectedMat(info) => Self::UnexpectedMat(info.into()), + InitError::Other(msg) => Self::Other(msg), + } + } +} + +#[deno_core::op2(async)] +#[serde] +pub async fn op_wit_wire_init( + state: Rc>, + #[string] component_path: String, + #[string] instance_id: String, + #[serde] input: WitWireInitArgs, +) -> Result { + let ctx = { + let state = state.borrow(); + let ctx = state.borrow::(); + ctx.clone() + }; + + let LinkedComponent(ref component, ref linker) = ctx + .get_component(PathBuf::from(component_path)) + .await + .map_err(WitWireInitError::ModuleErr)?; + + let mut store = wasmtime::Store::new(&ctx.engine, TypegateHost::new()); + let (bindings, instance) = wit::Pyrt::instantiate_async(&mut store, component, linker) + .await + .map_err(|err| { + WitWireInitError::ModuleErr(format!("error tring to make component instance: {err}")) + })?; + let guest = bindings.metatype_pyrt_mat_wire(); + let args = input.into(); + let res = guest.call_init(&mut store, &args).await.map_err(|err| { + WitWireInitError::ModuleErr(format!("module error calling init: {err}")) + })??; + assert!(res.ok); + ctx.instances.insert( + instance_id, + Instance { + _instance: instance, + bindings, + store, + }, + ); + Ok(WitWireInitResponse {}) +} + +#[deno_core::op2(async)] +pub async fn op_wit_wire_destroy(state: Rc>, #[string] instance_id: String) { + let ctx = { + let state = state.borrow(); + let ctx = state.borrow::(); + ctx.clone() + }; + + ctx.instances.remove(&instance_id); +} + +#[derive(Deserialize)] +#[serde(crate = "serde")] +pub struct WitWireReq { + op_name: String, + in_json: String, +} + +impl From for MatReq { + fn from(value: WitWireReq) -> Self { + Self { + op_name: value.op_name, + in_json: value.in_json, + } + } +} + +#[derive(Serialize, Debug, thiserror::Error)] +#[serde(crate = "serde")] +pub enum WitWireHandleError { + #[error("instance not found under id {id}")] + InstanceNotFound { id: String }, + #[error("mat error: {0:?}")] + MatErr(String), + #[error("wasm module error: {0:?}")] + ModuleErr(String), +} + +#[deno_core::op2(async)] +#[string] +pub async fn op_wit_wire_handle( + state: Rc>, + #[string] instance_id: String, + #[serde] input: WitWireReq, +) -> Result { + let ctx = { + let state = state.borrow(); + let ctx = state.borrow::(); + ctx.clone() + }; + + let mut instance = ctx + .instances + .get_mut(&instance_id) + .ok_or(WitWireHandleError::InstanceNotFound { id: instance_id })?; + // reborrow https://bevy-cheatbook.github.io/pitfalls/split-borrows.html + let instance = &mut *instance; + let guest = instance.bindings.metatype_pyrt_mat_wire(); + let res = guest + .call_handle(&mut instance.store, &input.into()) + .await + .map_err(|err| { + WitWireHandleError::ModuleErr(format!("module error calling handle: {err}")) + })?; + res.map_err(WitWireHandleError::MatErr) +} diff --git a/typegate/src/runtimes/Runtime.ts b/typegate/src/runtimes/Runtime.ts index 43abb2f7c6..92c4cc8344 100644 --- a/typegate/src/runtimes/Runtime.ts +++ b/typegate/src/runtimes/Runtime.ts @@ -8,7 +8,7 @@ import { Resolver } from "../types.ts"; export abstract class Runtime { readonly id: string; - constructor(public typegraphName: string, uuid = crypto.randomUUID()) { + constructor(typegraphName: string, uuid = crypto.randomUUID() as string) { this.id = `${typegraphName}_${this.constructor.name}_${uuid}`; } diff --git a/typegate/src/runtimes/prisma/hooks/run_migrations.ts b/typegate/src/runtimes/prisma/hooks/run_migrations.ts index 5c28edb378..1b35001f2f 100644 --- a/typegate/src/runtimes/prisma/hooks/run_migrations.ts +++ b/typegate/src/runtimes/prisma/hooks/run_migrations.ts @@ -12,6 +12,7 @@ import * as native from "native"; import { nativeResult, pluralSuffix } from "../../../utils.ts"; import { MigrationOptions } from "../../../typegraph/types.ts"; import { SecretManager } from "../../../typegraph/mod.ts"; +import type { ParsedDiff } from "../../../../engine/runtime.js"; export class MigrationFailure extends Error { errors: PushFailure[] = []; diff --git a/typegate/src/runtimes/python_wasi/python_vm.ts b/typegate/src/runtimes/python_wasi/python_vm.ts deleted file mode 100644 index 2c62e5eecd..0000000000 --- a/typegate/src/runtimes/python_wasi/python_vm.ts +++ /dev/null @@ -1,211 +0,0 @@ -// Copyright Metatype OÜ, licensed under the Elastic License 2.0. -// SPDX-License-Identifier: Elastic-2.0 - -import { - apply_def, - apply_lambda, - register_def, - register_lambda, - register_module, - register_virtual_machine, - unregister_virtual_machine, - WasiVmInitConfig, - WasiVmSetupOut, -} from "native"; - -import { getLogger } from "../../log.ts"; -const logger = getLogger(import.meta); - -import config from "../../config.ts"; -import { gunzip, tar } from "compress/mod.ts"; -import { join } from "std/path/mod.ts"; -import { exists } from "std/fs/exists.ts"; - -type Tag = "ok" | "err"; -type NativeWasiOutput = { Ok: { res?: string } } | { Err: { message: string } }; -type PythonOutput = { - value: string; // json string - tag: Tag; -}; - -function nativePythonResult( - res: NativeWasiOutput | WasiVmSetupOut, -) { - if (res == "Ok") { - return null; - } - if ("Err" in res) { - throw new Error(res.Err.message); - } - const ret = res.Ok?.res; - if (ret) { - const py = JSON.parse(ret) as PythonOutput; - if (py.tag == "err") { - throw new Error(py.value); - } - return py.value; - } - return null; -} - -function promisify(fn: CallableFunction): Promise { - return new Promise((resolve, reject) => { - try { - resolve(fn()); - } catch (e) { - reject(e); - } - }); -} - -const pythonWasiReactorUrl = - "https://github.com/metatypedev/python-wasi-reactor/releases/download/v0.2.0/python3.11.1-wasi-reactor.wasm.tar.gz"; -const cachePathReactor = join(config.tmp_dir, "python3.11.1-wasi-reactor.wasm"); - -const libPythonUrl = - "https://github.com/vmware-labs/webassembly-language-runtimes/releases/download/python%2F3.11.4%2B20230714-11be424/libpython-3.11.4-wasi-sdk-20.0.tar.gz"; -const cachePathLibPython = join(config.tmp_dir, "libpython"); - -async function download(url: string, innerDir?: string) { - const res = await fetch(url); - const archivePath = await Deno.makeTempFile({ - dir: config.tmp_dir, - }); - const buffer = await res.arrayBuffer(); - const archive = gunzip(new Uint8Array(buffer)); - await Deno.writeFile(archivePath, archive); - - const destDir = innerDir ? join(config.tmp_dir, innerDir) : config.tmp_dir; - await tar.uncompress(archivePath, destDir); -} - -export class PythonVirtualMachine { - #config: WasiVmInitConfig; - #lambdas: Set; - - constructor() { - this.#config = { - vm_name: "defaultName", - preopens: [], - pylib_path: join(config.tmp_dir, "libpython/usr/local/lib"), - wasi_mod_path: join(config.tmp_dir, "python3.11.1-wasi-reactor.wasm"), - }; - this.#lambdas = new Set(); - } - - async setup(vmName: string, appDirectoryPath?: string) { - if (!await exists(cachePathReactor)) { - logger.info(`downloading ${pythonWasiReactorUrl}`); - await download(pythonWasiReactorUrl); - } - if (!await exists(cachePathLibPython)) { - logger.info(`downloading ${libPythonUrl}`); - await download(libPythonUrl, "libpython"); - } - - const preopens = []; - if (appDirectoryPath) { - preopens.push(`/app:${appDirectoryPath}:readonly`); - } - this.#config = { - ...this.#config, - preopens, - vm_name: vmName, - }; - nativePythonResult( - await promisify(() => register_virtual_machine(this.#config)), - ); - } - - async destroy() { - nativePythonResult( - await promisify(() => - unregister_virtual_machine({ - vm_name: this.getVmName(), - }) - ), - ); - this.#lambdas.clear(); - } - - getVmName() { - return this.#config.vm_name; - } - - async registerLambda(name: string, code: string) { - nativePythonResult( - await promisify(() => - register_lambda({ - name, - code, - vm: this.getVmName(), - }) - ), - ); - this.#lambdas.add(name); - } - - async registerDef(name: string, code: string) { - nativePythonResult( - await promisify(() => - register_def({ - name, - code, - vm: this.getVmName(), - }) - ), - ); - } - - async registerModule(name: string, code: string) { - nativePythonResult( - await promisify(() => - register_module({ - name, - code, - vm: this.getVmName(), - }) - ), - ); - } - - async applyLambda(id: number, name: string, args: unknown[]) { - const pyRet = nativePythonResult( - await promisify(() => - apply_lambda({ - id, - name, - args: JSON.stringify(args), - vm: this.getVmName(), - }) - ), - ); - return JSON.parse(pyRet ?? "null"); - } - - async applyDef(id: number, name: string, args: unknown[]) { - const pyRet = nativePythonResult( - await promisify(() => - apply_def({ - id, - name, - args: JSON.stringify(args), - vm: this.getVmName(), - }) - ), - ); - return JSON.parse(pyRet ?? "null"); - } - - async apply(id: number, name: string, args: unknown[]) { - // Notes: - // 1. if #[deno_bindgen], apply* runs on main thread => blocking - // 2. if #[deno], apply* runs on main separate thread? => still blocking - // alternative solution: - // timeout at wasm level - if (this.#lambdas.has(name)) { - return await this.applyLambda(id, name, args); - } - return await this.applyDef(id, name, args); - } -} diff --git a/typegate/src/runtimes/python_wasi/python_wasi.ts b/typegate/src/runtimes/python_wasi/python_wasi.ts index 03327ab04e..3061bb69a7 100644 --- a/typegate/src/runtimes/python_wasi/python_wasi.ts +++ b/typegate/src/runtimes/python_wasi/python_wasi.ts @@ -3,132 +3,74 @@ import { getLogger } from "../../log.ts"; import { Runtime } from "../Runtime.ts"; -import { basename } from "std/path/mod.ts"; -import { Resolver, RuntimeInitParams } from "../../types.ts"; +import type { Resolver, RuntimeInitParams } from "../../types.ts"; import { ComputeStage } from "../../engine/query_engine.ts"; -import { PythonWasmMessenger } from "./python_wasm_messenger.ts"; -import { path } from "compress/deps.ts"; -import { PythonVirtualMachine } from "./python_vm.ts"; -import { Artifact, Materializer } from "../../typegraph/types.ts"; +import { Materializer } from "../../typegraph/types.ts"; import * as ast from "graphql/ast"; +import { WitWireMessenger } from "./wit_wire.ts"; +import { WitWireMatInfo } from "../../../engine/runtime.js"; -const logger = getLogger(import.meta); - -function generateVmIdentifier(mat: Materializer, uuid: string) { - const { mod } = mat.data ?? {}; - let identifier = ""; - if (mod !== undefined) { - identifier = `pymod_${mod}`; - } else { - identifier = `default`; - } - identifier = `${identifier}_${uuid}`; - return identifier; -} +const _logger = getLogger(import.meta); export class PythonWasiRuntime extends Runtime { private constructor( typegraphName: string, uuid: string, - private w: PythonWasmMessenger, + private wire: WitWireMessenger, ) { super(typegraphName, uuid); - this.uuid = uuid; } - uuid: string; static async init(params: RuntimeInitParams): Promise { - const { materializers, typegraph, typegraphName, typegate } = params; - const w = await PythonWasmMessenger.init(); - - logger.info(`initializing default vm: ${typegraphName}`); - - // add default vm for lambda/def - const uuid = crypto.randomUUID(); - const defaultVm = new PythonVirtualMachine(); - await defaultVm.setup(`default_${uuid}`); - w.vmMap.set(`default_${uuid}`, defaultVm); - - for (const m of materializers) { - switch (m.name) { - case "lambda": { - logger.info(`registering lambda: ${m.data.name}`); - await defaultVm.registerLambda( - m.data.name as string, - m.data.fn as string, - ); - break; - } - case "def": { - logger.info(`registering def: ${m.data.name}`); - await defaultVm.registerDef( - m.data.name as string, - m.data.fn as string, - ); + const { materializers, typegraphName } = params; + + const wireMatInfos = materializers.map((mat) => { + let matData: object; + switch (mat.name) { + case "lambda": + matData = { + ty: "lambda", + source: mat.data.fn as string, + effect: mat.effect, + }; break; - } - case "import_function": { - const pyModMat = typegraph.materializers[m.data.mod as number]; - - // resolve the python module artifacts/files - const { pythonArtifact, depsMeta: depArtifacts } = pyModMat.data; - - const deps = depArtifacts as Artifact[]; - - const vmId = generateVmIdentifier(m, uuid); - - const artifact = pythonArtifact as Artifact; - const modName = path.parse(basename(artifact.path)).name; - - // TODO: move this logic to postprocess or python runtime - m.data.name = `${modName}.${m.data.name as string}`; - logger.info(`setup vm "${vmId}" for module ${modName}`); - const vm = new PythonVirtualMachine(); - - // for python modules, imports must be inside a folder above or same directory - const artifactMeta = { - typegraphName: typegraphName, - relativePath: artifact.path, - hash: artifact.hash, - sizeInBytes: artifact.size, + case "def": + matData = { + ty: "def", + source: mat.data.fn as string, + func_name: mat.data.name as string, + effect: mat.effect, }; - const depMetas = deps.map((dep) => { - return { - typegraphName: typegraphName, - relativePath: dep.path, - hash: dep.hash, - sizeInBytes: dep.size, - }; - }); - - const entryPointFullPath = await typegate.artifactStore.getLocalPath( - artifactMeta, - depMetas, - ); - const sourceCode = Deno.readTextFileSync(entryPointFullPath); - - // prepare vm - await vm.setup(vmId, path.parse(entryPointFullPath).dir); - w.vmMap.set(vmId, vm); - await vm.registerModule(modName, sourceCode); - - logger.info( - `register module "${modName}" to vm "${vmId}" located at "${entryPointFullPath}"`, - ); break; + case "import_function": { } + default: + throw new Error(`unsupported materializer type: ${mat.name}`); } - } + const out: WitWireMatInfo = { + op_name: mat.data.name as string, + // TODO: hashing + mat_hash: mat.data.name as string, + // TODO: title of materializer type? + mat_title: mat.data.name as string, + mat_data_json: JSON.stringify(matData), + }; + return out; + }); - return new PythonWasiRuntime(typegraphName, uuid, w); + // add default vm for lambda/def + const uuid = crypto.randomUUID(); + const wire = await WitWireMessenger.init( + "./target/pyrt.cwasm", + uuid, + wireMatInfos, + ); + + return new PythonWasiRuntime(typegraphName, uuid, wire); } async deinit(): Promise { - for (const vm of this.w.vmMap.values()) { - logger.info(`unregister vm: ${vm.getVmName()}`); - await vm.destroy(); - } - await this.w.terminate(); + await using _drop = this.wire; } materialize( @@ -176,8 +118,7 @@ export class PythonWasiRuntime extends Runtime { } delegate(mat: Materializer): Resolver { - const { name } = mat.data ?? {}; - const vmId = generateVmIdentifier(mat, this.uuid); - return (args: unknown) => this.w.execute(name as string, { vmId, args }); + const { name } = mat.data; + return (args) => this.wire.handle(name as string, args); } } diff --git a/typegate/src/runtimes/python_wasi/python_wasm_messenger.ts b/typegate/src/runtimes/python_wasi/python_wasm_messenger.ts deleted file mode 100644 index 1887f990ad..0000000000 --- a/typegate/src/runtimes/python_wasi/python_wasm_messenger.ts +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright Metatype OÜ, licensed under the Elastic License 2.0. -// SPDX-License-Identifier: Elastic-2.0 - -import { AsyncMessenger } from "../patterns/messenger/async_messenger.ts"; -import { PythonVirtualMachine } from "./python_vm.ts"; - -export class PythonWasmMessenger extends AsyncMessenger< - Map, - unknown, - unknown -> { - vmMap: Map; - - private constructor() { - const vmMap = new Map(); - super( - () => vmMap, - (vmMap, { id, op, data }) => { - const { vmId, args } = data as any; - const vm = vmMap.get(vmId); - if (!vm) { - this.receive({ id, error: `vm "${vmId}" does not exist` }); - } else { - vm.apply(id, op as string, [args]) - .then((res) => { - this.receive({ id, data: res }); - }) - .catch((err) => { - this.receive({ id, error: err }); - }); - } - }, - () => {}, - ); - - this.vmMap = vmMap; - } - - static init(): PythonWasmMessenger { - return new PythonWasmMessenger(); - } -} diff --git a/typegate/src/runtimes/python_wasi/wit_wire.ts b/typegate/src/runtimes/python_wasi/wit_wire.ts new file mode 100644 index 0000000000..d6b4929f02 --- /dev/null +++ b/typegate/src/runtimes/python_wasi/wit_wire.ts @@ -0,0 +1,51 @@ +// Copyright Metatype OÜ, licensed under the Elastic License 2.0. +// SPDX-License-Identifier: Elastic-2.0 + +import type { WitWireMatInfo } from "../../../engine/runtime.js"; +import { ResolverArgs } from "../../types.ts"; + +export class WitWireMessenger { + static async init(componentPath: string, id: string, ops: WitWireMatInfo[]) { + try { + const _res = await Meta.wit_wire.init(componentPath, id, { + expected_ops: ops, + metatype_version: "TODO", + }); + return new WitWireMessenger(id); + } catch (err) { + throw new Error(`error on init for component at path: ${componentPath}`, { + cause: { + componentPath, + ops, + err, + }, + }); + } + } + + constructor(public id: string) { + } + + async [Symbol.asyncDispose]() { + await Meta.wit_wire.destroy(this.id); + } + + async handle(opName: string, args: ResolverArgs) { + const { _, ...inJson } = args; + try { + const res = await Meta.wit_wire.handle(this.id, { + op_name: opName, + in_json: JSON.stringify(inJson), + }); + return JSON.parse(res); + } catch (err) { + throw new Error(`error handling request for op ${opName}`, { + cause: { + opName, + args, + err, + }, + }); + } + } +} diff --git a/typegate/tests/runtimes/python_wasi/python_wasi.py b/typegate/tests/runtimes/python_wasi/python_wasi.py index 026f734e89..8412e7e4e9 100644 --- a/typegate/tests/runtimes/python_wasi/python_wasi.py +++ b/typegate/tests/runtimes/python_wasi/python_wasi.py @@ -61,13 +61,13 @@ def python_wasi(g: Graph): t.string(), test, ).with_policy(public), - testMod=python.import_( - t.struct({"name": t.string()}), - t.string(), - module="py/hello.py", - deps=["py/nested/dep.py"], - name="sayHello", - ).with_policy(public), + # testMod=python.import_( + # t.struct({"name": t.string()}), + # t.string(), + # module="py/hello.py", + # deps=["py/nested/dep.py"], + # name="sayHello", + # ).with_policy(public), identity=python.from_def( t.struct({"input": tpe}), tpe, diff --git a/typegate/tests/runtimes/python_wasi/python_wasi.ts b/typegate/tests/runtimes/python_wasi/python_wasi.ts index 4077555cfa..0292e6ec4d 100644 --- a/typegate/tests/runtimes/python_wasi/python_wasi.ts +++ b/typegate/tests/runtimes/python_wasi/python_wasi.ts @@ -30,7 +30,7 @@ export const tg = await typegraph("python_wasi", (g: any) => { `, }, ).withPolicy(pub), - identityMod: python.import( + /* identityMod: python.import( t.struct({ input: tpe }), tpe, { @@ -38,6 +38,6 @@ export const tg = await typegraph("python_wasi", (g: any) => { module: "py/hello.py", deps: ["py/nested/dep.py"], }, - ).withPolicy(pub), + ).withPolicy(pub), */ }); }); diff --git a/typegate/tests/runtimes/python_wasi/python_wasi_test.ts b/typegate/tests/runtimes/python_wasi/python_wasi_test.ts index 95f92792cc..b42d3b127b 100644 --- a/typegate/tests/runtimes/python_wasi/python_wasi_test.ts +++ b/typegate/tests/runtimes/python_wasi/python_wasi_test.ts @@ -3,7 +3,8 @@ import { assert, assertEquals } from "std/assert/mod.ts"; import { gql, Meta } from "../../utils/mod.ts"; -import { PythonVirtualMachine } from "../../../src/runtimes/python_wasi/python_vm.ts"; +import { WitWireMessenger } from "../../../src/runtimes/python_wasi/wit_wire.ts"; +import type { ResolverArgs } from "../../../src/types.ts"; import { testDir } from "test-utils/dir.ts"; import { tg } from "./python_wasi.ts"; import * as path from "std/path/mod.ts"; @@ -29,13 +30,29 @@ const reusableTgOutput = { }; Meta.test("Python WASI VM performance", async (t) => { - const vm = new PythonVirtualMachine(); - await vm.setup("myVm"); - await t.should("work with low latency for lambdas", async () => { - await vm.registerLambda("test", "lambda x: x['a']"); - const samples = [...Array(100).keys()].map((i) => - vm.applyLambda(i, "test", [{ a: "test" }]) + await using wire = await WitWireMessenger.init( + "./target/pyrt.cwasm", + crypto.randomUUID(), + [ + { + op_name: "test_lambda", + mat_hash: "test_lambda", + mat_title: "test_lambda", + mat_data_json: JSON.stringify({ + ty: "lambda", + source: "lambda x: x['a']", + }), + }, + ], + ); + const samples = await Promise.all( + [...Array(100).keys()].map((_i) => + wire.handle( + "test_lambda", + { a: "test", _: {} } as unknown as ResolverArgs, + ) + ), ); const start = performance.now(); const items = await Promise.all(samples); @@ -51,9 +68,27 @@ Meta.test("Python WASI VM performance", async (t) => { }); await t.should("work with low latency for defs", async () => { - await vm.registerDef("test", "def test(x):\n\treturn x['a']"); - const samples = [...Array(100).keys()].map((i) => - vm.applyDef(i, "test", [{ a: "test" }]) + await using wire = await WitWireMessenger.init( + "./target/pyrt.cwasm", + crypto.randomUUID(), + [ + { + op_name: "test_def", + mat_hash: "test_def", + mat_title: "test_def", + mat_data_json: JSON.stringify({ + ty: "def", + func_name: "test_def", + source: "def test_def(x):\n\treturn x['a']", + }), + }, + ], + ); + const samples = [...Array(100).keys()].map((_i) => + wire.handle( + "test_def", + { a: "test", _: {} } as unknown as ResolverArgs, + ) ); const start = performance.now(); const items = await Promise.all(samples); @@ -67,8 +102,6 @@ Meta.test("Python WASI VM performance", async (t) => { `virtual machine execution was too slow: ${duration}ms`, ); }); - - await vm.destroy(); }); Meta.test( @@ -237,129 +270,7 @@ Meta.test( }, ); -Meta.test( - { - name: "Python WASI: infinite loop or similar", - port: true, - systemTypegraphs: true, - }, - async (t) => { - const e = await t.engineFromTgDeployPython( - "runtimes/python_wasi/python_wasi.py", - cwd, - ); - - await t.should("safely fail upon stackoverflow", async () => { - await gql` - query { - stackOverflow(enable: true) - } - ` - .expectErrorContains("maximum recursion depth exceeded") - .on(e); - }); - - // let tic = 0; - // setTimeout(() => console.log("hearbeat", tic++), 100); - - // FIXME: blocks main deno thread - // current approach on deno_bindgen apply/applyDef needs to run on - // separate threads - // #[deno] works for applys but still manages to block the current thread - // await t.should("safely fail upon infinite loop", async () => { - // await gql` - // query { - // infiniteLoop(enable: true) - // } - // ` - // .expectErrorContains("timeout exceeded") - // .on(e); - // }); - }, -); - -Meta.test( - { - name: "Python WASI: reloading typegate", - port: true, - systemTypegraphs: true, - }, - async (metaTest) => { - const port = metaTest.port; - const gate = `http://localhost:${port}`; - - const load = async () => { - const { serialized, typegate: _gateResponseAdd } = await tgDeploy( - reusableTgOutput, - { - baseUrl: gate, - auth, - artifactsConfig: { - prismaMigration: { - globalAction: { - create: true, - reset: false, - }, - migrationDir: "prisma-migrations", - }, - dir: cwd, - }, - typegraphPath: path.join(cwd, "wasm.ts"), - secrets: {}, - }, - ); - - return await metaTest.engineFromDeployed(serialized); - }; - - const runPythonOnPythonWasi = async (currentEngine: QueryEngine) => { - await gql` - query { - identityDef(input: { a: "hello", b: [1, 2, "three"] }) { - a - b - } - identityLambda(input: { a: "hello", b: [1, 2, "three"] }) { - a - b - } - identityMod(input: { a: "hello", b: [1, 2, "three"] }) { - a - b - } - } - ` - .expectData({ - identityDef: { - a: "hello", - b: [1, 2, "three"], - }, - identityLambda: { - a: "hello", - b: [1, 2, "three"], - }, - identityMod: { - a: "hello", - b: [1, 2, "three"], - }, - }) - .on(currentEngine); - }; - const engine = await load(); - await metaTest.should("work before typegate is reloaded", async () => { - await runPythonOnPythonWasi(engine); - }); - - // reload - const reloadedEngine = await load(); - - await metaTest.should("work after typegate is reloaded", async () => { - await runPythonOnPythonWasi(reloadedEngine); - }); - }, -); - -Meta.test( +/* Meta.test( { name: "Python WASI: upload artifacts with deps", port: true, @@ -409,7 +320,7 @@ Meta.test( .on(engine); }); }, -); +); */ Meta.test( { @@ -498,10 +409,10 @@ Meta.test( a b } - identityMod(input: { a: "hello", b: [1, 2, "three"] }) { - a - b - } + # identityMod(input: { a: "hello", b: [1, 2, "three"] }) { + # a + # b + # } } ` .expectData({ @@ -513,10 +424,10 @@ Meta.test( a: "hello", b: [1, 2, "three"], }, - identityMod: { + /* identityMod: { a: "hello", b: [1, 2, "three"], - }, + }, */ }) .on(currentEngine); }; From 7fc6413efcc89d743b2d641f8527a07f691f2ac7 Mon Sep 17 00:00:00 2001 From: Yohe-Am <56622350+Yohe-Am@users.noreply.github.com> Date: Sun, 21 Apr 2024 04:52:40 +0000 Subject: [PATCH 03/16] refactor: rename to `pyrt_wit_wire` --- .ghjk/.gitignore | 2 +- .ghjk/lock.json | 121 ++++++++++++------ .pre-commit-config.yaml | 3 +- Cargo.toml | 2 +- dev/Dockerfile | 7 +- dev/cross.Dockerfile | 2 - dev/lock.yml | 7 +- ghjk.ts | 18 +-- installer.sh | 19 --- .../{pyrt_component => pyrt_wit_wire}/main.py | 1 + .../pyproject.toml | 6 +- .../pyrt/__init__.py | 0 .../pyrt/exports/__init__.py | 4 +- .../pyrt/exports/mat_wire.py | 2 + .../pyrt/imports/__init__.py | 0 .../pyrt/imports/shared.py | 2 + .../pyrt/imports/typegate_wire.py | 1 + .../pyrt/types.py | 0 .../wit/pyrt.wit | 0 ruff.toml | 2 +- typegate/engine/src/runtimes/wit_wire.rs | 2 +- typegate/src/typegraphs/introspection.json | 2 +- typegate/src/typegraphs/prisma_migration.json | 2 +- typegate/src/typegraphs/typegate.json | 2 +- typegraph/python/pyproject.toml | 2 +- .../docs/reference/runtimes/deno/index.mdx | 2 +- .../docs/reference/runtimes/python/index.mdx | 2 - website/docs/reference/runtimes/s3/index.mdx | 2 +- website/docs/reference/typegate/index.mdx | 1 - .../typegate/synchronization/index.mdx | 1 - .../types/parameter-transformations.mdx | 1 - website/docs/reference/types/reducers.mdx | 1 + whiz.yaml | 2 - 33 files changed, 119 insertions(+), 102 deletions(-) rename libs/{pyrt_component => pyrt_wit_wire}/main.py (96%) rename libs/{pyrt_component => pyrt_wit_wire}/pyproject.toml (60%) rename libs/{pyrt_component => pyrt_wit_wire}/pyrt/__init__.py (100%) rename libs/{pyrt_component => pyrt_wit_wire}/pyrt/exports/__init__.py (99%) rename libs/{pyrt_component => pyrt_wit_wire}/pyrt/exports/mat_wire.py (99%) rename libs/{pyrt_component => pyrt_wit_wire}/pyrt/imports/__init__.py (100%) rename libs/{pyrt_component => pyrt_wit_wire}/pyrt/imports/shared.py (99%) rename libs/{pyrt_component => pyrt_wit_wire}/pyrt/imports/typegate_wire.py (99%) rename libs/{pyrt_component => pyrt_wit_wire}/pyrt/types.py (100%) rename libs/{pyrt_component => pyrt_wit_wire}/wit/pyrt.wit (100%) create mode 100644 website/docs/reference/types/reducers.mdx diff --git a/.ghjk/.gitignore b/.ghjk/.gitignore index abf95c1618..996b9f8c22 100644 --- a/.ghjk/.gitignore +++ b/.ghjk/.gitignore @@ -1,2 +1,2 @@ envs -hash.json \ No newline at end of file +hash.json diff --git a/.ghjk/lock.json b/.ghjk/lock.json index 9a7db7cd4c..907323d24b 100644 --- a/.ghjk/lock.json +++ b/.ghjk/lock.json @@ -5,22 +5,6 @@ "ports": { "version": "0", "configResolutions": { - "9aaf6a4fddacb5a219afcb3a46e1fd21049cbbeb5808c49be95ea371e3928fc0": { - "version": "0.13.5", - "depConfigs": { - "tar_aa": { - "version": "1.34", - "depConfigs": {}, - "portRef": "tar_aa@0.1.0" - } - }, - "portRef": "wasmedge_ghrel@0.1.0" - }, - "9e3fa7742c431c34ae7ba8d1e907e50c937ccfb631fb4dcfb7a1773742abe267": { - "version": "1.34", - "depConfigs": {}, - "portRef": "tar_aa@0.1.0" - }, "5155b24a1a756a5b91108ba34188d8bc4f5d6744f5ac29454450d6275663df86": { "version": "v24.1", "depConfigs": {}, @@ -227,6 +211,11 @@ }, "portRef": "node_org@0.1.0" }, + "9e3fa7742c431c34ae7ba8d1e907e50c937ccfb631fb4dcfb7a1773742abe267": { + "version": "1.34", + "depConfigs": {}, + "portRef": "tar_aa@0.1.0" + }, "66212eb79fbcb37961450d5dfffdaedc0b949e0e7c9257c3c63093d009a5fc75": { "version": "v9.0.5", "depConfigs": {}, @@ -473,6 +462,37 @@ } }, "portRef": "cpy_bs_ghrel@0.1.0" + }, + "f1552d80bc05967757fc8f6530cfb4a0f875a6e6d46167eedc2530b533abac26": { + "version": "19.0.2", + "depConfigs": { + "cargo_binstall_ghrel": { + "version": "v1.6.4", + "depConfigs": {}, + "portRef": "cargo_binstall_ghrel@0.1.0" + }, + "rust_rustup": { + "version": "1.77.2", + "depConfigs": { + "rustup_rustlang": { + "version": "1.27.0", + "depConfigs": { + "git_aa": { + "version": "2.40.1", + "depConfigs": {}, + "portRef": "git_aa@0.1.0" + } + }, + "portRef": "rustup_rustlang@0.1.0" + } + }, + "portRef": "rust_rustup@0.1.0", + "profile": "minimal" + } + }, + "portRef": "cargobi_cratesio@0.1.0", + "crateName": "wasmtime-cli", + "locked": true } } }, @@ -486,7 +506,6 @@ "id": "ports", "config": { "installs": [ - "269266fdca40e20f9361848270d3e0f8ca6d4616", "db5b506ba0936c6713a2efef3ee82df7ea271b06", "651e1043d59561e4e71e5fb0775daf746467a028", "e7b2f3414caa4c4441240c02dcb8f7c781fd01ee", @@ -579,7 +598,8 @@ "installs": [ "be7e967b2420f3d6a8af7d3ff11192362ee4b5c8", "5dfbf570fa87f14a3524560c40bd08d0d62a7526", - "a24f45ef0b2064658d87264a95d31fe4694f6f4e" + "a24f45ef0b2064658d87264a95d31fe4694f6f4e", + "a4de04b77193fd53fed574b61e8568dc63a53544" ], "env": {}, "allowedPortDeps": [ @@ -604,26 +624,6 @@ ], "globalEnv": { "installs": { - "269266fdca40e20f9361848270d3e0f8ca6d4616": { - "version": "0.13.5", - "port": { - "ty": "denoWorker@v1", - "name": "wasmedge_ghrel", - "platforms": [ - "aarch64-linux", - "x86_64-linux", - "aarch64-darwin", - "x86_64-darwin" - ], - "version": "0.1.0", - "deps": [ - { - "name": "tar_aa" - } - ], - "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/wasmedge.ts" - } - }, "db5b506ba0936c6713a2efef3ee82df7ea271b06": { "version": "v24.1", "port": { @@ -1241,6 +1241,51 @@ ], "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/cpy_bs.ts" } + }, + "a4de04b77193fd53fed574b61e8568dc63a53544": { + "version": "19.0.2", + "depConfigs": { + "rust_rustup": { + "portRef": "rust_rustup@0.1.0", + "profile": "minimal" + } + }, + "port": { + "ty": "denoWorker@v1", + "name": "cargobi_cratesio", + "platforms": [ + "x86_64-linux", + "aarch64-linux", + "x86_64-darwin", + "aarch64-darwin", + "x86_64-windows", + "aarch64-windows", + "x86_64-freebsd", + "aarch64-freebsd", + "x86_64-netbsd", + "aarch64-netbsd", + "x86_64-aix", + "aarch64-aix", + "x86_64-solaris", + "aarch64-solaris", + "x86_64-illumos", + "aarch64-illumos", + "x86_64-android", + "aarch64-android" + ], + "version": "0.1.0", + "deps": [ + { + "name": "cargo_binstall_ghrel" + }, + { + "name": "rust_rustup" + } + ], + "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/cargobi.ts" + }, + "crateName": "wasmtime-cli", + "locked": true } }, "allowedPortDeps": { diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 338adadd03..e580165ae6 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -20,8 +20,7 @@ repos: |typegate/deno.lock |.*\.snap$|typegate/src/typegraphs/.*\.json |website/docs/reference/ - |libs/pyrt_component/pyrt/imports/.* - ) + |libs/pyrt_wit_wire/pyrt) - repo: https://github.com/python-jsonschema/check-jsonschema rev: 0.27.2 hooks: diff --git a/Cargo.toml b/Cargo.toml index ec02452a84..82b4ba05a3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ members = [ exclude = [ "typegate/tests/runtimes/wasm/rust", - "libs/pyrt_component" + "libs/pyrt_wit_wire" ] [workspace.package] diff --git a/dev/Dockerfile b/dev/Dockerfile index e710694d22..5fc416ecd8 100644 --- a/dev/Dockerfile +++ b/dev/Dockerfile @@ -39,8 +39,6 @@ RUN set -eux; \ automake \ # wasm-opt deps \ clang \ - ## wasmedge-sys \ - libclang-dev \ ## openssl deps \ pkg-config \ libssl-dev \ @@ -101,8 +99,7 @@ RUN . $GHJK_ENV \ && chmod +x /tini \ && mkdir -p /lib/sym \ && ln -s /lib/aarch64-linux-gnu /lib/sym/arm64 \ - && ln -s /lib/x86_64-linux-gnu /lib/sym/amd64 \ - && cp $(dirname $(realpath $(which wasmedge)))/.. /.wasmedge -r + && ln -s /lib/x86_64-linux-gnu /lib/sym/amd64 # FROM gcr.io/distroless/cc-debian11:${DISTROLESS_TAG} as prd @@ -113,13 +110,11 @@ ARG TARGETARCH ENV NO_COLOR true ENV DENO_DIR /deno-dir/ -ENV LD_LIBRARY_PATH "${LD_LIBRARY_PATH}:/.wasmedge/lib64" WORKDIR /app COPY --from=runtime-bin /tini /tini COPY --from=runtime-bin /lib/sym /lib/sym -COPY --from=runtime-bin /.wasmedge /.wasmedge COPY --from=builder /lib/*-linux-gnu/libz.so* /lib/sym/${TARGETARCH} COPY --from=builder /app/target/release/typegate /bin/typegate diff --git a/dev/cross.Dockerfile b/dev/cross.Dockerfile index a7685de9f1..abac290569 100644 --- a/dev/cross.Dockerfile +++ b/dev/cross.Dockerfile @@ -21,8 +21,6 @@ RUN set -eux \ automake \ # protoc\ libprotoc-dev:$ARCH \ - # wasmedge-sys crate build dep\ - libclang-dev \ # openssl crate build deps \ pkg-config \ libssl-dev:$ARCH \ diff --git a/dev/lock.yml b/dev/lock.yml index 2ab82dd3e7..de091b9efa 100644 --- a/dev/lock.yml +++ b/dev/lock.yml @@ -5,8 +5,6 @@ dev: - typegraph/node/LICENSE.md - typegraph/node/sdk/LICENSE.md lines: - installer.sh: - (WASMEDGE_VERSION=").+("): WASMEDGE_VERSION rust-toolchain.toml: (channel = ").+("): RUST_VERSION ghjk.ts: @@ -17,12 +15,12 @@ dev: (const\s+PNPM_VERSION\s*=\s*").*(";): PNPM_VERSION (const\s+WASM_TOOLS_VERSION = ").*(";): WASM_TOOLS_VERSION (const\s+JCO_VERSION =\s*").*(";): JCO_VERSION - (const\s+WASMEDGE_VERSION\s*=\s*").*(";): WASMEDGE_VERSION (const\s+WASM_OPT_VERSION\s*=\s*").*(";): WASM_OPT_VERSION (const\s+MOLD_VERSION\s*=\s*").*(";): MOLD_VERSION (const\s+CMAKE_VERSION\s*=\s*").*(";): CMAKE_VERSION (const\s+CARGO_INSTA_VERSION\s*=\s*").*(";): CARGO_INSTA_VERSION (const\s+TEMPORAL_VERSION\s*=\s*").*(";): TEMPORAL_VERSION + (const\s+WASMTIME_VERSION\s*=\s*").*(";): WASMTIME_VERSION (const\s+METATYPE_VERSION\s*=\s*").*(";): METATYPE_VERSION .github/*/*.yml: '( GHJK_VERSION: ").+(")': GHJK_VERSION @@ -95,8 +93,7 @@ dev: CARGO_INSTA_VERSION: 1.33.0 WASM_TOOLS_VERSION: 1.0.53 JCO_VERSION: 1.0.0 - WASMTIME_VERSION: 18.0.2 - WASMEDGE_VERSION: 0.13.5 + WASMTIME_VERSION: 19.0.2 TYPEGRAPH_VERSION: 0.0.3 PRISMA_VERSION: 5.5.2 METATYPE_VERSION: 0.3.7-0 diff --git a/ghjk.ts b/ghjk.ts index 7cb03d6c08..120364d34b 100644 --- a/ghjk.ts +++ b/ghjk.ts @@ -9,7 +9,7 @@ const PYTHON_VERSION = "3.8.18"; const PNPM_VERSION = "v9.0.5"; const WASM_TOOLS_VERSION = "1.0.53"; const JCO_VERSION = "1.0.0"; -const WASMEDGE_VERSION = "0.13.5"; +const WASMTIME_VERSION = "19.0.2"; const WASM_OPT_VERSION = "0.116.0"; const MOLD_VERSION = "v2.4.0"; const CMAKE_VERSION = "3.28.0-rc6"; @@ -28,6 +28,11 @@ const installs = { version: WASM_OPT_VERSION, locked: true, }), + wasmtime: ports.cargobi({ + crateName: "wasmtime-cli", + version: WASMTIME_VERSION, + locked: true, + }), }; const allowedPortDeps = [ @@ -44,7 +49,6 @@ const inOci = () => !!Deno.env.get("OCI"); const inDev = () => !inCi() && !inOci(); ghjk.install( - ports.wasmedge({ version: WASMEDGE_VERSION }), ports.protoc({ version: PROTOC_VERSION }), ports.asdf({ pluginRepo: "https://github.com/asdf-community/asdf-cmake", @@ -134,18 +138,16 @@ ghjk.task("gen-pyrt-bind", { installs: installs.comp_py, allowedPortDeps, async fn({ $ }) { - await $.removeIfExists("./libs/pyrt_component/pyrt"); - await $`componentize-py -d wit/ bindings .`.cwd("./libs/pyrt_component"); + await $.removeIfExists("./libs/pyrt_wit_wire/pyrt"); + await $`componentize-py -d wit/ bindings .`.cwd("./libs/pyrt_wit_wire"); }, }); ghjk.task("build-pyrt", { - installs: [...installs.comp_py, installs.wasm_opt], + installs: [...installs.comp_py, installs.wasm_opt, installs.wasmtime], allowedPortDeps, async fn({ $ }) { - await $`componentize-py -d wit/ componentize -o ../../target/pyrt.wasm main` - .cwd("./libs/pyrt_component"); - // TODO: explicitly install wasmtime + await $`componentize-py -d ./libs/pyrt_wit_wire/wit/ componentize -o ./target/pyrt.wasm libs.pyrt_wit_wire.main`; await $`wasmtime compile -W component-model ./target/pyrt.wasm -o ./target/pyrt.cwasm`; // await $`wasm-opt -Oz ./target/pyrt.wasm -o ./target/pyrt.wasm2`; }, diff --git a/installer.sh b/installer.sh index 877dbb65f3..8f8ccffc4f 100755 --- a/installer.sh +++ b/installer.sh @@ -123,22 +123,3 @@ Or moving the executable to another directory in your PATH: $ sudo mv $EXE /usr/local/bin EOF fi - -WASMEDGE_VERSION="0.13.5" - -cat <"] +description = "Wasm component implementing the PythonRuntime host using wit_wire protocol." license = "Elastic-2.0" readme = "README.md" [tool.poetry.dependencies] python = "^3.8" - [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" diff --git a/libs/pyrt_component/pyrt/__init__.py b/libs/pyrt_wit_wire/pyrt/__init__.py similarity index 100% rename from libs/pyrt_component/pyrt/__init__.py rename to libs/pyrt_wit_wire/pyrt/__init__.py diff --git a/libs/pyrt_component/pyrt/exports/__init__.py b/libs/pyrt_wit_wire/pyrt/exports/__init__.py similarity index 99% rename from libs/pyrt_component/pyrt/exports/__init__.py rename to libs/pyrt_wit_wire/pyrt/exports/__init__.py index dd8ed8459b..0b44f2c981 100644 --- a/libs/pyrt_component/pyrt/exports/__init__.py +++ b/libs/pyrt_wit_wire/pyrt/exports/__init__.py @@ -5,8 +5,8 @@ import weakref from ..types import Result, Ok, Err, Some -from ..exports import mat_wire from ..imports import shared +from ..exports import mat_wire class MatWire(Protocol): @@ -20,3 +20,5 @@ def init(self, args: mat_wire.InitArgs) -> mat_wire.InitResponse: @abstractmethod def handle(self, req: shared.Req) -> Result[str, str]: raise NotImplementedError + + diff --git a/libs/pyrt_component/pyrt/exports/mat_wire.py b/libs/pyrt_wit_wire/pyrt/exports/mat_wire.py similarity index 99% rename from libs/pyrt_component/pyrt/exports/mat_wire.py rename to libs/pyrt_wit_wire/pyrt/exports/mat_wire.py index bc46c148d7..6b2b368537 100644 --- a/libs/pyrt_component/pyrt/exports/mat_wire.py +++ b/libs/pyrt_wit_wire/pyrt/exports/mat_wire.py @@ -40,3 +40,5 @@ class InitError_Other: InitError = Union[InitError_VersionMismatch, InitError_UnexpectedMat, InitError_Other] + + diff --git a/libs/pyrt_component/pyrt/imports/__init__.py b/libs/pyrt_wit_wire/pyrt/imports/__init__.py similarity index 100% rename from libs/pyrt_component/pyrt/imports/__init__.py rename to libs/pyrt_wit_wire/pyrt/imports/__init__.py diff --git a/libs/pyrt_component/pyrt/imports/shared.py b/libs/pyrt_wit_wire/pyrt/imports/shared.py similarity index 99% rename from libs/pyrt_component/pyrt/imports/shared.py rename to libs/pyrt_wit_wire/pyrt/imports/shared.py index be927825ff..7d9cb8c370 100644 --- a/libs/pyrt_component/pyrt/imports/shared.py +++ b/libs/pyrt_wit_wire/pyrt/imports/shared.py @@ -14,3 +14,5 @@ class Req: op_name: str in_json: str + + diff --git a/libs/pyrt_component/pyrt/imports/typegate_wire.py b/libs/pyrt_wit_wire/pyrt/imports/typegate_wire.py similarity index 99% rename from libs/pyrt_component/pyrt/imports/typegate_wire.py rename to libs/pyrt_wit_wire/pyrt/imports/typegate_wire.py index 21661750c1..75b7b2134c 100644 --- a/libs/pyrt_component/pyrt/imports/typegate_wire.py +++ b/libs/pyrt_wit_wire/pyrt/imports/typegate_wire.py @@ -18,3 +18,4 @@ def hostcall(req: Req) -> str: Raises: `pyrt.types.Err(pyrt.imports.str)` """ raise NotImplementedError + diff --git a/libs/pyrt_component/pyrt/types.py b/libs/pyrt_wit_wire/pyrt/types.py similarity index 100% rename from libs/pyrt_component/pyrt/types.py rename to libs/pyrt_wit_wire/pyrt/types.py diff --git a/libs/pyrt_component/wit/pyrt.wit b/libs/pyrt_wit_wire/wit/pyrt.wit similarity index 100% rename from libs/pyrt_component/wit/pyrt.wit rename to libs/pyrt_wit_wire/wit/pyrt.wit diff --git a/ruff.toml b/ruff.toml index ae5b7cf437..d2c3f01ff8 100644 --- a/ruff.toml +++ b/ruff.toml @@ -1,4 +1,4 @@ ignore = ["E501"] exclude = [ - "libs/pyrt_component/pyrt" + "libs/pyrt_wit_wire/pyrt" ] diff --git a/typegate/engine/src/runtimes/wit_wire.rs b/typegate/engine/src/runtimes/wit_wire.rs index 0f2236a7d1..c8a6cda6f8 100644 --- a/typegate/engine/src/runtimes/wit_wire.rs +++ b/typegate/engine/src/runtimes/wit_wire.rs @@ -9,7 +9,7 @@ use deno_core::OpState; mod wit { wasmtime::component::bindgen!({ - path: "../../libs/pyrt_component/wit", + path: "../../libs/pyrt_wit_wire/wit", async: true, }); } diff --git a/typegate/src/typegraphs/introspection.json b/typegate/src/typegraphs/introspection.json index 5bc6ffcf29..dc1508ebfe 100644 --- a/typegate/src/typegraphs/introspection.json +++ b/typegate/src/typegraphs/introspection.json @@ -601,4 +601,4 @@ "randomSeed": null, "artifacts": {} } -} \ No newline at end of file +} diff --git a/typegate/src/typegraphs/prisma_migration.json b/typegate/src/typegraphs/prisma_migration.json index a65d823e77..7bfda1f3a5 100644 --- a/typegate/src/typegraphs/prisma_migration.json +++ b/typegate/src/typegraphs/prisma_migration.json @@ -383,4 +383,4 @@ "randomSeed": null, "artifacts": {} } -} \ No newline at end of file +} diff --git a/typegate/src/typegraphs/typegate.json b/typegate/src/typegraphs/typegate.json index a838b99d82..d56f46cc2f 100644 --- a/typegate/src/typegraphs/typegate.json +++ b/typegate/src/typegraphs/typegate.json @@ -1084,4 +1084,4 @@ "randomSeed": null, "artifacts": {} } -} \ No newline at end of file +} diff --git a/typegraph/python/pyproject.toml b/typegraph/python/pyproject.toml index 5e10142fcc..a604aa825a 100644 --- a/typegraph/python/pyproject.toml +++ b/typegraph/python/pyproject.toml @@ -15,7 +15,7 @@ classifiers = [ [tool.poetry.dependencies] python = ">=3.8,<4.0" -wasmtime = "^18.0.2" +wasmtime = "^19.0.2" typing-extensions = "^4.8.0" python-box = "^7.1.1" astunparse = "^1.6.3" diff --git a/website/docs/reference/runtimes/deno/index.mdx b/website/docs/reference/runtimes/deno/index.mdx index fcc49ef51d..26cfb67ee8 100644 --- a/website/docs/reference/runtimes/deno/index.mdx +++ b/website/docs/reference/runtimes/deno/index.mdx @@ -53,4 +53,4 @@ export function doAddition({ a, b }: AddInput) { return a + b; } -``` \ No newline at end of file +``` diff --git a/website/docs/reference/runtimes/python/index.mdx b/website/docs/reference/runtimes/python/index.mdx index 253fa00dae..b43c278d40 100644 --- a/website/docs/reference/runtimes/python/index.mdx +++ b/website/docs/reference/runtimes/python/index.mdx @@ -38,5 +38,3 @@ def example_python(g: Graph): def say_hello(x: any): return f"Hello {x["name"]}" ``` - - \ No newline at end of file diff --git a/website/docs/reference/runtimes/s3/index.mdx b/website/docs/reference/runtimes/s3/index.mdx index e7aaf1e80a..89286a4e4d 100644 --- a/website/docs/reference/runtimes/s3/index.mdx +++ b/website/docs/reference/runtimes/s3/index.mdx @@ -4,4 +4,4 @@ import S3Intro from "@site/shared/s3/index.mdx"; ## S3 runtime - \ No newline at end of file + diff --git a/website/docs/reference/typegate/index.mdx b/website/docs/reference/typegate/index.mdx index 5c344e2d1d..8cf11337e9 100644 --- a/website/docs/reference/typegate/index.mdx +++ b/website/docs/reference/typegate/index.mdx @@ -81,4 +81,3 @@ The following environment variables can be used to configure the typegate. `SYNC | SYNC_S3_SECRET_KEY | Access key secret for the S3 store credentials. | | | SYNC_S3_PATH_STYLE | `true` or `false`, force path style if `true`. | | | SYNC_S3_BUCKET | The bucket to be used for the system (dedicated). | | - diff --git a/website/docs/reference/typegate/synchronization/index.mdx b/website/docs/reference/typegate/synchronization/index.mdx index d207ad063f..1b92715ee6 100644 --- a/website/docs/reference/typegate/synchronization/index.mdx +++ b/website/docs/reference/typegate/synchronization/index.mdx @@ -80,4 +80,3 @@ and some required `SYNC_*` variable is missing. - Sharing typegraphs accross multiple typegate instances - History (WIP) - diff --git a/website/docs/reference/types/parameter-transformations.mdx b/website/docs/reference/types/parameter-transformations.mdx index 46cfd32bac..11da9aeff3 100644 --- a/website/docs/reference/types/parameter-transformations.mdx +++ b/website/docs/reference/types/parameter-transformations.mdx @@ -278,4 +278,3 @@ Apply expression | Source `g.from_context(path)` | The node will have the value of the context field accessible by the path `path`. `g.from_secret(key)` | The node will have the value of the secret named `key` on the current typegraph. `g.set(literal_value)` | The passed `literal_value` will be used. - diff --git a/website/docs/reference/types/reducers.mdx b/website/docs/reference/types/reducers.mdx new file mode 100644 index 0000000000..840b86d476 --- /dev/null +++ b/website/docs/reference/types/reducers.mdx @@ -0,0 +1 @@ +# Reducers diff --git a/whiz.yaml b/whiz.yaml index 12123ec394..49d25f3d0d 100644 --- a/whiz.yaml +++ b/whiz.yaml @@ -97,8 +97,6 @@ codegen: watch: - "libs/xtask/src/**/*.rs" env: - DYLD_LIBRARY_PATH: "$HOME/.wasmedge/lib:$DYLD_LIBRARY_PATH" # macOS - LD_LIBRARY_PATH: "$HOME/.wasmedge/lib:$LD_LIBRARY_PATH" # linux TG_JSONSCHEMA_OUT: website/static/specs/$TYPEGRAPH_VERSION.json TG_TYPESCRIPT_OUT: typegate/src/typegraph/types.ts command: "cargo x codegen" From efcaebf52852295f54f046de9a890e230f14afb8 Mon Sep 17 00:00:00 2001 From: Yohe-Am <56622350+Yohe-Am@users.noreply.github.com> Date: Mon, 22 Apr 2024 07:05:27 +0000 Subject: [PATCH 04/16] fix: pre-commit issue --- .ghjk/lock.json | 45 - .pre-commit-config.yaml | 4 +- deno.jsonc.disabled | 18 - deno.lock | 892 ------------------ ghjk.ts | 1 - libs/pyrt_wit_wire/main.py | 3 + typegate/engine/runtime.js | 8 + .../src/runtimes/python_wasi/python_wasi.ts | 13 +- 8 files changed, 23 insertions(+), 961 deletions(-) delete mode 100644 deno.jsonc.disabled delete mode 100644 deno.lock diff --git a/.ghjk/lock.json b/.ghjk/lock.json index 907323d24b..6c9a65a607 100644 --- a/.ghjk/lock.json +++ b/.ghjk/lock.json @@ -523,7 +523,6 @@ "5c041a4209ae50657ea5acacc26683688f2913a9", "d0bcae26fcc8ca53ffbdb66de5735c608858a313", "ca8e4bf52171b6a173a6ba349f33721806b86d48", - "f343cba7b04d933887e714ec220ae66d4832d3be", "be7e967b2420f3d6a8af7d3ff11192362ee4b5c8" ], "allowedDeps": { @@ -1140,50 +1139,6 @@ "crateName": "whiz", "locked": true }, - "f343cba7b04d933887e714ec220ae66d4832d3be": { - "depConfigs": { - "rust_rustup": { - "portRef": "rust_rustup@0.1.0", - "profile": "minimal" - } - }, - "port": { - "ty": "denoWorker@v1", - "name": "cargobi_cratesio", - "platforms": [ - "x86_64-linux", - "aarch64-linux", - "x86_64-darwin", - "aarch64-darwin", - "x86_64-windows", - "aarch64-windows", - "x86_64-freebsd", - "aarch64-freebsd", - "x86_64-netbsd", - "aarch64-netbsd", - "x86_64-aix", - "aarch64-aix", - "x86_64-solaris", - "aarch64-solaris", - "x86_64-illumos", - "aarch64-illumos", - "x86_64-android", - "aarch64-android" - ], - "version": "0.1.0", - "deps": [ - { - "name": "cargo_binstall_ghrel" - }, - { - "name": "rust_rustup" - } - ], - "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/cargobi.ts" - }, - "crateName": "wasmtime-cli", - "locked": true - }, "be7e967b2420f3d6a8af7d3ff11192362ee4b5c8": { "port": { "ty": "denoWorker@v1", diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e580165ae6..5fd7d3c2a2 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -15,9 +15,9 @@ repos: - id: check-merge-conflict - id: end-of-file-fixer # exclude all generated files - exclude: ( + exclude: (?x)( .ghjk/.* - |typegate/deno.lock + |.*deno.lock |.*\.snap$|typegate/src/typegraphs/.*\.json |website/docs/reference/ |libs/pyrt_wit_wire/pyrt) diff --git a/deno.jsonc.disabled b/deno.jsonc.disabled deleted file mode 100644 index df441ceacf..0000000000 --- a/deno.jsonc.disabled +++ /dev/null @@ -1,18 +0,0 @@ -{ - "compilerOptions": { - "allowJs": false, - "strict": true, - "experimentalDecorators": true, - "types": [ - "./engine/runtime.d.ts" - ], - "lib": [ - "deno.ns", - "deno.unstable", - "deno.worker" - ] - }, - "nodeModulesDir": false, - "lock": "deno.lock", - "importMap": "./typegate/import_map.json" -} diff --git a/deno.lock b/deno.lock deleted file mode 100644 index af7dc769eb..0000000000 --- a/deno.lock +++ /dev/null @@ -1,892 +0,0 @@ -{ - "version": "3", - "packages": { - "specifiers": { - "npm:@sentry/node@7.70.0": "npm:@sentry/node@7.70.0", - "npm:chance@1.1.11": "npm:chance@1.1.11", - "npm:graphql@16.8.1": "npm:graphql@16.8.1", - "npm:lodash": "npm:lodash@4.17.21", - "npm:validator": "npm:validator@13.11.0" - }, - "npm": { - "@sentry-internal/tracing@7.70.0": { - "integrity": "sha512-SpbE6wZhs6QwG2ORWCt8r28o1T949qkWx/KeRTCdK4Ub95PQ3Y3DgnqD8Wz//3q50Wt6EZDEibmz4t067g6PPg==", - "dependencies": { - "@sentry/core": "@sentry/core@7.70.0", - "@sentry/types": "@sentry/types@7.70.0", - "@sentry/utils": "@sentry/utils@7.70.0", - "tslib": "tslib@2.6.2" - } - }, - "@sentry/core@7.70.0": { - "integrity": "sha512-voUsGVM+jwRp99AQYFnRvr7sVd2tUhIMj1L6F42LtD3vp7t5ZnKp3NpXagtFW2vWzXESfyJUBhM0qI/bFvn7ZA==", - "dependencies": { - "@sentry/types": "@sentry/types@7.70.0", - "@sentry/utils": "@sentry/utils@7.70.0", - "tslib": "tslib@2.6.2" - } - }, - "@sentry/node@7.70.0": { - "integrity": "sha512-GeGlnu3QnJX0GN2FvZ3E31e48ZhRzEpREyC0Wa4BRvYHnyiGvsQjo/0RKeq6vvlggRhVnuoMg/jESyUmdntrAA==", - "dependencies": { - "@sentry-internal/tracing": "@sentry-internal/tracing@7.70.0", - "@sentry/core": "@sentry/core@7.70.0", - "@sentry/types": "@sentry/types@7.70.0", - "@sentry/utils": "@sentry/utils@7.70.0", - "cookie": "cookie@0.5.0", - "https-proxy-agent": "https-proxy-agent@5.0.1", - "lru_map": "lru_map@0.3.3", - "tslib": "tslib@2.6.2" - } - }, - "@sentry/types@7.70.0": { - "integrity": "sha512-rY4DqpiDBtXSk4MDNBH3dwWqfPbNBI/9GA7Y5WJSIcObBtfBKp0fzYliHJZD0pgM7d4DPFrDn42K9Iiumgymkw==", - "dependencies": {} - }, - "@sentry/utils@7.70.0": { - "integrity": "sha512-0cChMH0lsGp+5I3D4wOHWwjFN19HVrGUs7iWTLTO5St3EaVbdeLbI1vFXHxMxvopbwgpeZafbreHw/loIdZKpw==", - "dependencies": { - "@sentry/types": "@sentry/types@7.70.0", - "tslib": "tslib@2.6.2" - } - }, - "agent-base@6.0.2": { - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "debug@4.3.4" - } - }, - "chance@1.1.11": { - "integrity": "sha512-kqTg3WWywappJPqtgrdvbA380VoXO2eu9VCV895JgbyHsaErXdyHK9LOZ911OvAk6L0obK7kDk9CGs8+oBawVA==", - "dependencies": {} - }, - "cookie@0.5.0": { - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dependencies": {} - }, - "debug@4.3.4": { - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "ms@2.1.2" - } - }, - "graphql@16.8.1": { - "integrity": "sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==", - "dependencies": {} - }, - "https-proxy-agent@5.0.1": { - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dependencies": { - "agent-base": "agent-base@6.0.2", - "debug": "debug@4.3.4" - } - }, - "lodash@4.17.21": { - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dependencies": {} - }, - "lru_map@0.3.3": { - "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", - "dependencies": {} - }, - "ms@2.1.2": { - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dependencies": {} - }, - "tslib@2.6.2": { - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dependencies": {} - }, - "validator@13.11.0": { - "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", - "dependencies": {} - } - } - }, - "redirects": { - "https://github.com/levibostian/deno-udd/raw/ignore-prerelease/mod.ts": "https://raw.githubusercontent.com/levibostian/deno-udd/ignore-prerelease/mod.ts" - }, - "remote": { - "https://deno.land/std@0.129.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74", - "https://deno.land/std@0.129.0/_util/os.ts": "49b92edea1e82ba295ec946de8ffd956ed123e2948d9bd1d3e901b04e4307617", - "https://deno.land/std@0.129.0/archive/tar.ts": "35ea1baddec7988cc4034765a2cee7613bc8074bd40940d3f5e98f63070a716a", - "https://deno.land/std@0.129.0/async/abortable.ts": "a896ac6b0d4237bd2d2d248217cfa1f0d85ccda93cb25ebda55e33850e526be6", - "https://deno.land/std@0.129.0/async/deadline.ts": "48ac998d7564969f3e6ec6b6f9bf0217ebd00239b1b2292feba61272d5dd58d0", - "https://deno.land/std@0.129.0/async/debounce.ts": "564273ef242bcfcda19a439132f940db8694173abffc159ea34f07d18fc42620", - "https://deno.land/std@0.129.0/async/deferred.ts": "bc18e28108252c9f67dfca2bbc4587c3cbf3aeb6e155f8c864ca8ecff992b98a", - "https://deno.land/std@0.129.0/async/delay.ts": "cbbdf1c87d1aed8edc7bae13592fb3e27e3106e0748f089c263390d4f49e5f6c", - "https://deno.land/std@0.129.0/async/mod.ts": "2240c6841157738414331f47dee09bb8c0482c5b1980b6e3234dd03515c8132f", - "https://deno.land/std@0.129.0/async/mux_async_iterator.ts": "f4d1d259b0c694d381770ddaaa4b799a94843eba80c17f4a2ec2949168e52d1e", - "https://deno.land/std@0.129.0/async/pool.ts": "97b0dd27c69544e374df857a40902e74e39532f226005543eabacb551e277082", - "https://deno.land/std@0.129.0/async/tee.ts": "1341feb1f5b1a96f8628d0f8fc07d8c43d3813423f18a63bf1b4785568d21b1f", - "https://deno.land/std@0.129.0/bytes/bytes_list.ts": "67eb118e0b7891d2f389dad4add35856f4ad5faab46318ff99653456c23b025d", - "https://deno.land/std@0.129.0/bytes/equals.ts": "fc16dff2090cced02497f16483de123dfa91e591029f985029193dfaa9d894c9", - "https://deno.land/std@0.129.0/bytes/mod.ts": "d3b455c0dbd4804644159d1e25946ade5ee385d2359894de49e2c6101b18b7a9", - "https://deno.land/std@0.129.0/encoding/base64.ts": "c8c16b4adaa60d7a8eee047c73ece26844435e8f7f1328d74593dbb2dd58ea4f", - "https://deno.land/std@0.129.0/encoding/base64url.ts": "55f9d13df02efac10c6f96169daa3e702606a64e8aa27c0295f645f198c27130", - "https://deno.land/std@0.129.0/fmt/colors.ts": "30455035d6d728394781c10755351742dd731e3db6771b1843f9b9e490104d37", - "https://deno.land/std@0.129.0/fmt/printf.ts": "e2c0f72146aed1efecf0c39ab928b26ae493a2278f670a871a0fbdcf36ff3379", - "https://deno.land/std@0.129.0/fs/_util.ts": "0fb24eb4bfebc2c194fb1afdb42b9c3dda12e368f43e8f2321f84fc77d42cb0f", - "https://deno.land/std@0.129.0/fs/ensure_dir.ts": "9dc109c27df4098b9fc12d949612ae5c9c7169507660dcf9ad90631833209d9d", - "https://deno.land/std@0.129.0/fs/ensure_file.ts": "7d353e64fee3d4d1e7c6b6726a2a5e987ba402c15fb49566309042887349c545", - "https://deno.land/std@0.129.0/io/buffer.ts": "bd0c4bf53db4b4be916ca5963e454bddfd3fcd45039041ea161dbf826817822b", - "https://deno.land/std@0.129.0/io/files.ts": "d199ef64e918a256320ba8d8d44ae91de87c9077df8f8d6cca013f1b9fbbe285", - "https://deno.land/std@0.129.0/io/readers.ts": "679471f3b9929b54393c9cd75b6bd178b4bc6d9aab5c0f1f9538f862cf4746fe", - "https://deno.land/std@0.129.0/io/util.ts": "078da53bba767bec0d45f7da44411f6dbf269e51ef7fcfea5e3714e04681c674", - "https://deno.land/std@0.129.0/node/_buffer.mjs": "f4a7df481d4eed06dc0151b833177d8ef74fc3a96dd4d2b073e690b6ced9474d", - "https://deno.land/std@0.129.0/node/_core.ts": "568d277be2e086af996cbdd599fec569f5280e9a494335ca23ad392b130d7bb9", - "https://deno.land/std@0.129.0/node/_events.mjs": "c0e3e0e290a8b81fee9d2973a529c8dcd5ebb4406782d1f91085274e2cb8490f", - "https://deno.land/std@0.129.0/node/_fixed_queue.ts": "455b3c484de48e810b13bdf95cd1658ecb1ba6bcb8b9315ffe994efcde3ba5f5", - "https://deno.land/std@0.129.0/node/_next_tick.ts": "64c361f6bca21df2a72dd77b84bd49d80d97a694dd3080703bc78f52146351d1", - "https://deno.land/std@0.129.0/node/_process/exiting.ts": "bc9694769139ffc596f962087155a8bfef10101d03423b9dcbc51ce6e1f88fce", - "https://deno.land/std@0.129.0/node/_util/_util_callbackify.ts": "79928ad80df3e469f7dcdb198118a7436d18a9f6c08bd7a4382332ad25a718cf", - "https://deno.land/std@0.129.0/node/_utils.ts": "c2c352e83c4c96f5ff994b1c8246bff2abcb21bfc3f1c06162cb3af1d201e615", - "https://deno.land/std@0.129.0/node/buffer.ts": "fbecbf3f237fa49bec96e97ecf56a7b92d48037b3d11219288e68943cc921600", - "https://deno.land/std@0.129.0/node/events.ts": "a1d40fc0dbccc944379ef968b80ea08f9fce579e88b5057fdb64e4f0812476dd", - "https://deno.land/std@0.129.0/node/internal/buffer.mjs": "6662fe7fe517329453545be34cea27a24f8ccd6d09afd4f609f11ade2b6dfca7", - "https://deno.land/std@0.129.0/node/internal/crypto/keys.ts": "16ce7b15a9fc5e4e3dee8fde75dae12f3d722558d5a1a6e65a9b4f86d64a21e9", - "https://deno.land/std@0.129.0/node/internal/crypto/util.mjs": "1de55a47fdbed6721b467a77ba48fdd1550c10b5eee77bbdb602eaffee365a5e", - "https://deno.land/std@0.129.0/node/internal/error_codes.ts": "ac03c4eae33de3a69d6c98e8678003207eecf75a6900eb847e3fea3c8c9e6d8f", - "https://deno.land/std@0.129.0/node/internal/errors.ts": "0d3a1eb03b654beb29b8354759a6902f45a840d4f957e9a3c632a24ce4c32632", - "https://deno.land/std@0.129.0/node/internal/hide_stack_frames.ts": "a91962ec84610bc7ec86022c4593cdf688156a5910c07b5bcd71994225c13a03", - "https://deno.land/std@0.129.0/node/internal/normalize_encoding.mjs": "3779ec8a7adf5d963b0224f9b85d1bc974a2ec2db0e858396b5d3c2c92138a0a", - "https://deno.land/std@0.129.0/node/internal/util.mjs": "684653b962fae84fd2bc08997291b1a50bed09b95dcfa7d35e3c4143163e879a", - "https://deno.land/std@0.129.0/node/internal/util/comparisons.ts": "680b55fe8bdf1613633bc469fa0440f43162c76dbe36af9aa2966310e1bb9f6e", - "https://deno.land/std@0.129.0/node/internal/util/debuglog.ts": "99e91bdf26f6c67861031f684817e1705a5bc300e81346585b396f413387edfb", - "https://deno.land/std@0.129.0/node/internal/util/inspect.mjs": "d1c2569c66a3dab45eec03208f22ad4351482527859c0011a28a6c797288a0aa", - "https://deno.land/std@0.129.0/node/internal/util/types.ts": "b2dacb8f1f5d28a51c4da5c5b75172b7fcf694073ce95ca141323657e18b0c60", - "https://deno.land/std@0.129.0/node/internal/validators.mjs": "a7e82eafb7deb85c332d5f8d9ffef052f46a42d4a121eada4a54232451acc49a", - "https://deno.land/std@0.129.0/node/internal_binding/_libuv_winerror.ts": "801e05c2742ae6cd42a5f0fd555a255a7308a65732551e962e5345f55eedc519", - "https://deno.land/std@0.129.0/node/internal_binding/_node.ts": "e4075ba8a37aef4eb5b592c8e3807c39cb49ca8653faf8e01a43421938076c1b", - "https://deno.land/std@0.129.0/node/internal_binding/_utils.ts": "1c50883b5751a9ea1b38951e62ed63bacfdc9d69ea665292edfa28e1b1c5bd94", - "https://deno.land/std@0.129.0/node/internal_binding/_winerror.ts": "8811d4be66f918c165370b619259c1f35e8c3e458b8539db64c704fbde0a7cd2", - "https://deno.land/std@0.129.0/node/internal_binding/buffer.ts": "722c62b85f966e0777b2d98c021b60e75d7f2c2dabc43413ef37d60dbd13a5d9", - "https://deno.land/std@0.129.0/node/internal_binding/constants.ts": "aff06aac49eda4234bd3a2b0b8e1fbfc67824e281c532ff9960831ab503014cc", - "https://deno.land/std@0.129.0/node/internal_binding/string_decoder.ts": "5cb1863763d1e9b458bc21d6f976f16d9c18b3b3f57eaf0ade120aee38fba227", - "https://deno.land/std@0.129.0/node/internal_binding/types.ts": "4c26fb74ba2e45de553c15014c916df6789529a93171e450d5afb016b4c765e7", - "https://deno.land/std@0.129.0/node/internal_binding/util.ts": "90364292e2bd598ab5d105b48ca49817b6708f2d1d9cbaf08b2b3ab5ca4c90a7", - "https://deno.land/std@0.129.0/node/internal_binding/uv.ts": "3821bc5e676d6955d68f581988c961d77dd28190aba5a9c59f16001a4deb34ba", - "https://deno.land/std@0.129.0/node/util.ts": "7fd6933b37af89a8e64d73dc6ee1732455a59e7e6d0965311fbd73cd634ea630", - "https://deno.land/std@0.129.0/node/util/types.mjs": "f9288198cacd374b41bae7e92a23179d3160f4c0eaf14e19be3a4e7057219a60", - "https://deno.land/std@0.129.0/path/_constants.ts": "df1db3ffa6dd6d1252cc9617e5d72165cd2483df90e93833e13580687b6083c3", - "https://deno.land/std@0.129.0/path/_interface.ts": "ee3b431a336b80cf445441109d089b70d87d5e248f4f90ff906820889ecf8d09", - "https://deno.land/std@0.129.0/path/_util.ts": "c1e9686d0164e29f7d880b2158971d805b6e0efc3110d0b3e24e4b8af2190d2b", - "https://deno.land/std@0.129.0/path/common.ts": "bee563630abd2d97f99d83c96c2fa0cca7cee103e8cb4e7699ec4d5db7bd2633", - "https://deno.land/std@0.129.0/path/glob.ts": "cb5255638de1048973c3e69e420c77dc04f75755524cb3b2e160fe9277d939ee", - "https://deno.land/std@0.129.0/path/mod.ts": "4275129bb766f0e475ecc5246aa35689eeade419d72a48355203f31802640be7", - "https://deno.land/std@0.129.0/path/posix.ts": "663e4a6fe30a145f56aa41a22d95114c4c5582d8b57d2d7c9ed27ad2c47636bb", - "https://deno.land/std@0.129.0/path/separator.ts": "fe1816cb765a8068afb3e8f13ad272351c85cbc739af56dacfc7d93d710fe0f9", - "https://deno.land/std@0.129.0/path/win32.ts": "e7bdf63e8d9982b4d8a01ef5689425c93310ece950e517476e22af10f41a136e", - "https://deno.land/std@0.129.0/streams/conversion.ts": "712585bfa0172a97fb68dd46e784ae8ad59d11b88079d6a4ab098ff42e697d21", - "https://deno.land/std@0.129.0/testing/_diff.ts": "9d849cd6877694152e01775b2d93f9d6b7aef7e24bfe3bfafc4d7a1ac8e9f392", - "https://deno.land/std@0.129.0/testing/asserts.ts": "0a95d9e8076dd3e7f0eeb605a67c148078b4b11f4abcd5eef115b0361b0736a2", - "https://deno.land/std@0.140.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74", - "https://deno.land/std@0.140.0/_util/os.ts": "3b4c6e27febd119d36a416d7a97bd3b0251b77c88942c8f16ee5953ea13e2e49", - "https://deno.land/std@0.140.0/bytes/bytes_list.ts": "67eb118e0b7891d2f389dad4add35856f4ad5faab46318ff99653456c23b025d", - "https://deno.land/std@0.140.0/bytes/equals.ts": "fc16dff2090cced02497f16483de123dfa91e591029f985029193dfaa9d894c9", - "https://deno.land/std@0.140.0/bytes/mod.ts": "763f97d33051cc3f28af1a688dfe2830841192a9fea0cbaa55f927b49d49d0bf", - "https://deno.land/std@0.140.0/encoding/base64.ts": "c8c16b4adaa60d7a8eee047c73ece26844435e8f7f1328d74593dbb2dd58ea4f", - "https://deno.land/std@0.140.0/encoding/base64url.ts": "55f9d13df02efac10c6f96169daa3e702606a64e8aa27c0295f645f198c27130", - "https://deno.land/std@0.140.0/fmt/colors.ts": "30455035d6d728394781c10755351742dd731e3db6771b1843f9b9e490104d37", - "https://deno.land/std@0.140.0/fs/_util.ts": "0fb24eb4bfebc2c194fb1afdb42b9c3dda12e368f43e8f2321f84fc77d42cb0f", - "https://deno.land/std@0.140.0/fs/ensure_dir.ts": "9dc109c27df4098b9fc12d949612ae5c9c7169507660dcf9ad90631833209d9d", - "https://deno.land/std@0.140.0/io/buffer.ts": "bd0c4bf53db4b4be916ca5963e454bddfd3fcd45039041ea161dbf826817822b", - "https://deno.land/std@0.140.0/path/_constants.ts": "df1db3ffa6dd6d1252cc9617e5d72165cd2483df90e93833e13580687b6083c3", - "https://deno.land/std@0.140.0/path/_interface.ts": "ee3b431a336b80cf445441109d089b70d87d5e248f4f90ff906820889ecf8d09", - "https://deno.land/std@0.140.0/path/_util.ts": "c1e9686d0164e29f7d880b2158971d805b6e0efc3110d0b3e24e4b8af2190d2b", - "https://deno.land/std@0.140.0/path/common.ts": "bee563630abd2d97f99d83c96c2fa0cca7cee103e8cb4e7699ec4d5db7bd2633", - "https://deno.land/std@0.140.0/path/glob.ts": "cb5255638de1048973c3e69e420c77dc04f75755524cb3b2e160fe9277d939ee", - "https://deno.land/std@0.140.0/path/mod.ts": "d3e68d0abb393fb0bf94a6d07c46ec31dc755b544b13144dee931d8d5f06a52d", - "https://deno.land/std@0.140.0/path/posix.ts": "293cdaec3ecccec0a9cc2b534302dfe308adb6f10861fa183275d6695faace44", - "https://deno.land/std@0.140.0/path/separator.ts": "fe1816cb765a8068afb3e8f13ad272351c85cbc739af56dacfc7d93d710fe0f9", - "https://deno.land/std@0.140.0/path/win32.ts": "31811536855e19ba37a999cd8d1b62078235548d67902ece4aa6b814596dd757", - "https://deno.land/std@0.140.0/streams/conversion.ts": "712585bfa0172a97fb68dd46e784ae8ad59d11b88079d6a4ab098ff42e697d21", - "https://deno.land/std@0.150.0/media_types/_util.ts": "ce9b4fc4ba1c447dafab619055e20fd88236ca6bdd7834a21f98bd193c3fbfa1", - "https://deno.land/std@0.150.0/media_types/mod.ts": "2d4b6f32a087029272dc59e0a55ae3cc4d1b27b794ccf528e94b1925795b3118", - "https://deno.land/std@0.150.0/media_types/vendor/mime-db.v1.52.0.ts": "724cee25fa40f1a52d3937d6b4fbbfdd7791ff55e1b7ac08d9319d5632c7f5af", - "https://deno.land/std@0.161.0/encoding/base64.ts": "c57868ca7fa2fbe919f57f88a623ad34e3d970d675bdc1ff3a9d02bba7409db2", - "https://deno.land/std@0.166.0/_util/asserts.ts": "d0844e9b62510f89ce1f9878b046f6a57bf88f208a10304aab50efcb48365272", - "https://deno.land/std@0.166.0/_util/os.ts": "8a33345f74990e627b9dfe2de9b040004b08ea5146c7c9e8fe9a29070d193934", - "https://deno.land/std@0.166.0/flags/mod.ts": "3b459daf581e047819b6b799c92b96c81b4eecbd5ea025643d54dc0abc6ac923", - "https://deno.land/std@0.166.0/fmt/colors.ts": "9e36a716611dcd2e4865adea9c4bec916b5c60caad4cdcdc630d4974e6bb8bd4", - "https://deno.land/std@0.166.0/fs/_util.ts": "fdc156f897197f261a1c096dcf8ff9267ed0ff42bd5b31f55053a4763a4bae3b", - "https://deno.land/std@0.166.0/fs/copy.ts": "37ad2d3390a672a34baf7d16a8623238906a1ee9b2c5fffc8efaa97810f4e6a9", - "https://deno.land/std@0.166.0/fs/empty_dir.ts": "c15a0aaaf40f8c21cca902aa1e01a789ad0c2fd1b7e2eecf4957053c5dbf707f", - "https://deno.land/std@0.166.0/fs/ensure_dir.ts": "76395fc1c989ca8d2de3aedfa8240eb8f5225cde20f926de957995b063135b80", - "https://deno.land/std@0.166.0/fs/ensure_file.ts": "b8e32ea63aa21221d0219760ba3f741f682d7f7d68d0d24a3ec067c338568152", - "https://deno.land/std@0.166.0/fs/ensure_link.ts": "5cc1c04f18487d7d1edf4c5469705f30b61390ffd24ad7db6df85e7209b32bb2", - "https://deno.land/std@0.166.0/fs/ensure_symlink.ts": "5273557b8c50be69477aa9cb003b54ff2240a336db52a40851c97abce76b96ab", - "https://deno.land/std@0.166.0/fs/eol.ts": "65b1e27320c3eec6fb653b27e20056ee3d015d3e91db388cfefa41616ebc7cb3", - "https://deno.land/std@0.166.0/fs/exists.ts": "6a447912e49eb79cc640adacfbf4b0baf8e17ede6d5bed057062ce33c4fa0d68", - "https://deno.land/std@0.166.0/fs/expand_glob.ts": "d08678afa768881b055bdfb5cebe4f089f8db4513a4d2b0bbe748f5870d77ce3", - "https://deno.land/std@0.166.0/fs/mod.ts": "354a6f972ef4e00c4dd1f1339a8828ef0764c1c23d3c0010af3fcc025d8655b0", - "https://deno.land/std@0.166.0/fs/move.ts": "6d7fa9da60dbc7a32dd7fdbc2ff812b745861213c8e92ba96dace0669b0c378c", - "https://deno.land/std@0.166.0/fs/walk.ts": "0a754cc4696a15bdb175380a4b7deff3eb65be9768cb11d91a4138beee35c2d7", - "https://deno.land/std@0.166.0/path/_constants.ts": "df1db3ffa6dd6d1252cc9617e5d72165cd2483df90e93833e13580687b6083c3", - "https://deno.land/std@0.166.0/path/_interface.ts": "ee3b431a336b80cf445441109d089b70d87d5e248f4f90ff906820889ecf8d09", - "https://deno.land/std@0.166.0/path/_util.ts": "d16be2a16e1204b65f9d0dfc54a9bc472cafe5f4a190b3c8471ec2016ccd1677", - "https://deno.land/std@0.166.0/path/common.ts": "bee563630abd2d97f99d83c96c2fa0cca7cee103e8cb4e7699ec4d5db7bd2633", - "https://deno.land/std@0.166.0/path/glob.ts": "cb5255638de1048973c3e69e420c77dc04f75755524cb3b2e160fe9277d939ee", - "https://deno.land/std@0.166.0/path/mod.ts": "56fec03ad0ebd61b6ab39ddb9b0ddb4c4a5c9f2f4f632e09dd37ec9ebfd722ac", - "https://deno.land/std@0.166.0/path/posix.ts": "6b63de7097e68c8663c84ccedc0fd977656eb134432d818ecd3a4e122638ac24", - "https://deno.land/std@0.166.0/path/separator.ts": "fe1816cb765a8068afb3e8f13ad272351c85cbc739af56dacfc7d93d710fe0f9", - "https://deno.land/std@0.166.0/path/win32.ts": "7cebd2bda6657371adc00061a1d23fdd87bcdf64b4843bb148b0b24c11b40f69", - "https://deno.land/std@0.181.0/_util/asserts.ts": "178dfc49a464aee693a7e285567b3d0b555dc805ff490505a8aae34f9cfb1462", - "https://deno.land/std@0.181.0/_util/os.ts": "d932f56d41e4f6a6093d56044e29ce637f8dcc43c5a90af43504a889cf1775e3", - "https://deno.land/std@0.181.0/fs/_util.ts": "65381f341af1ff7f40198cee15c20f59951ac26e51ddc651c5293e24f9ce6f32", - "https://deno.land/std@0.181.0/fs/ensure_dir.ts": "dc64c4c75c64721d4e3fb681f1382f803ff3d2868f08563ff923fdd20d071c40", - "https://deno.land/std@0.181.0/fs/expand_glob.ts": "e4f56259a0a70fe23f05215b00de3ac5e6ba46646ab2a06ebbe9b010f81c972a", - "https://deno.land/std@0.181.0/fs/walk.ts": "ea95ffa6500c1eda6b365be488c056edc7c883a1db41ef46ec3bf057b1c0fe32", - "https://deno.land/std@0.181.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0", - "https://deno.land/std@0.181.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b", - "https://deno.land/std@0.181.0/path/_util.ts": "d7abb1e0dea065f427b89156e28cdeb32b045870acdf865833ba808a73b576d0", - "https://deno.land/std@0.181.0/path/common.ts": "ee7505ab01fd22de3963b64e46cff31f40de34f9f8de1fff6a1bd2fe79380000", - "https://deno.land/std@0.181.0/path/glob.ts": "d479e0a695621c94d3fd7fe7abd4f9499caf32a8de13f25073451c6ef420a4e1", - "https://deno.land/std@0.181.0/path/mod.ts": "bf718f19a4fdd545aee1b06409ca0805bd1b68ecf876605ce632e932fe54510c", - "https://deno.land/std@0.181.0/path/posix.ts": "8b7c67ac338714b30c816079303d0285dd24af6b284f7ad63da5b27372a2c94d", - "https://deno.land/std@0.181.0/path/separator.ts": "0fb679739d0d1d7bf45b68dacfb4ec7563597a902edbaf3c59b50d5bcadd93b1", - "https://deno.land/std@0.181.0/path/win32.ts": "d186344e5583bcbf8b18af416d13d82b35a317116e6460a5a3953508c3de5bba", - "https://deno.land/std@0.182.0/_util/asserts.ts": "178dfc49a464aee693a7e285567b3d0b555dc805ff490505a8aae34f9cfb1462", - "https://deno.land/std@0.182.0/_util/os.ts": "d932f56d41e4f6a6093d56044e29ce637f8dcc43c5a90af43504a889cf1775e3", - "https://deno.land/std@0.182.0/fmt/colors.ts": "d67e3cd9f472535241a8e410d33423980bec45047e343577554d3356e1f0ef4e", - "https://deno.land/std@0.182.0/fs/_util.ts": "65381f341af1ff7f40198cee15c20f59951ac26e51ddc651c5293e24f9ce6f32", - "https://deno.land/std@0.182.0/fs/empty_dir.ts": "c3d2da4c7352fab1cf144a1ecfef58090769e8af633678e0f3fabaef98594688", - "https://deno.land/std@0.182.0/fs/expand_glob.ts": "e4f56259a0a70fe23f05215b00de3ac5e6ba46646ab2a06ebbe9b010f81c972a", - "https://deno.land/std@0.182.0/fs/walk.ts": "920be35a7376db6c0b5b1caf1486fb962925e38c9825f90367f8f26b5e5d0897", - "https://deno.land/std@0.182.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0", - "https://deno.land/std@0.182.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b", - "https://deno.land/std@0.182.0/path/_util.ts": "d7abb1e0dea065f427b89156e28cdeb32b045870acdf865833ba808a73b576d0", - "https://deno.land/std@0.182.0/path/common.ts": "ee7505ab01fd22de3963b64e46cff31f40de34f9f8de1fff6a1bd2fe79380000", - "https://deno.land/std@0.182.0/path/glob.ts": "d479e0a695621c94d3fd7fe7abd4f9499caf32a8de13f25073451c6ef420a4e1", - "https://deno.land/std@0.182.0/path/mod.ts": "bf718f19a4fdd545aee1b06409ca0805bd1b68ecf876605ce632e932fe54510c", - "https://deno.land/std@0.182.0/path/posix.ts": "8b7c67ac338714b30c816079303d0285dd24af6b284f7ad63da5b27372a2c94d", - "https://deno.land/std@0.182.0/path/separator.ts": "0fb679739d0d1d7bf45b68dacfb4ec7563597a902edbaf3c59b50d5bcadd93b1", - "https://deno.land/std@0.182.0/path/win32.ts": "d186344e5583bcbf8b18af416d13d82b35a317116e6460a5a3953508c3de5bba", - "https://deno.land/std@0.185.0/semver/mod.ts": "200f50cf6872212667df532fb09f0b1a33d3427a5201f75fad30a0d0c6dbcce3", - "https://deno.land/std@0.202.0/archive/_common.ts": "a25e3f8089ac3fddd968f73693be9d56bd5fbfa1d4b483828dbce829bb518bd2", - "https://deno.land/std@0.202.0/archive/untar.ts": "c3a0100fb005d66c5e42ef55dd268c368b894954fa27c9fb3ecafd73af22e877", - "https://deno.land/std@0.202.0/assert/assert.ts": "9a97dad6d98c238938e7540736b826440ad8c1c1e54430ca4c4e623e585607ee", - "https://deno.land/std@0.202.0/assert/assertion_error.ts": "4d0bde9b374dfbcbe8ac23f54f567b77024fb67dbb1906a852d67fe050d42f56", - "https://deno.land/std@0.202.0/assert/equal.ts": "9f1a46d5993966d2596c44e5858eec821859b45f783a5ee2f7a695dfc12d8ece", - "https://deno.land/std@0.202.0/async/deferred.ts": "42790112f36a75a57db4a96d33974a936deb7b04d25c6084a9fa8a49f135def8", - "https://deno.land/std@0.202.0/bytes/concat.ts": "d26d6f3d7922e6d663dacfcd357563b7bf4a380ce5b9c2bbe0c8586662f25ce2", - "https://deno.land/std@0.202.0/bytes/copy.ts": "939d89e302a9761dcf1d9c937c7711174ed74c59eef40a1e4569a05c9de88219", - "https://deno.land/std@0.202.0/collections/_utils.ts": "5114abc026ddef71207a79609b984614e66a63a4bda17d819d56b0e72c51527e", - "https://deno.land/std@0.202.0/collections/deep_merge.ts": "9db788ba56cb05b65c77166b789e58e125dff159b7f41bf4d19dc1cba19ecb8b", - "https://deno.land/std@0.202.0/collections/distinct.ts": "01595bd8e608a5e2de8a8631055587e6f01d68861e463eef34f8e295713500b8", - "https://deno.land/std@0.202.0/collections/distinct_by.ts": "3afe11d81eafb30c7c9dbf568d94357f3d88153292c00671b72cd695deae6602", - "https://deno.land/std@0.202.0/collections/filter_values.ts": "16e1fc456a7969e770ec5b89edf5ac97b295ca534b47c1a83f061b409aad7814", - "https://deno.land/std@0.202.0/collections/map_keys.ts": "3dd2cf3a940f1432628cb0252b919d268e8bb38fe8bcd78153a440909173ae98", - "https://deno.land/std@0.202.0/collections/map_values.ts": "c88f306b2b3ec84043e16ab4e1b062055ab32cf4d68bb1d7447afaafa0a1b3bf", - "https://deno.land/std@0.202.0/crypto/_fnv/fnv32.ts": "e4649dfdefc5c987ed53c3c25db62db771a06d9d1b9c36d2b5cf0853b8e82153", - "https://deno.land/std@0.202.0/crypto/_fnv/fnv64.ts": "bfa0e4702061fdb490a14e6bf5f9168a22fb022b307c5723499469bfefca555e", - "https://deno.land/std@0.202.0/crypto/_fnv/mod.ts": "f956a95f58910f223e420340b7404702ecd429603acd4491fa77af84f746040c", - "https://deno.land/std@0.202.0/crypto/_fnv/util.ts": "accba12bfd80a352e32a872f87df2a195e75561f1b1304a4cb4f5a4648d288f9", - "https://deno.land/std@0.202.0/crypto/_wasm/lib/deno_std_wasm_crypto.generated.mjs": "85b50eee2e511584698c04f1d84155e57452ea963106fee64987c326e9e5d25d", - "https://deno.land/std@0.202.0/crypto/_wasm/mod.ts": "973058e70052c98292b567d1c8396dffc28d6dfc6a44f0763032f6fbdf5222f5", - "https://deno.land/std@0.202.0/crypto/crypto.ts": "c1fac13f11e5150e7690a4d6f09bc09b39d0a13fc5cf129f13617656fea7379e", - "https://deno.land/std@0.202.0/crypto/keystack.ts": "cec9ddf60e0c0c9970360e66c9402afb3c0c68bcd50ef19c68daf63f94e40863", - "https://deno.land/std@0.202.0/crypto/mod.ts": "ae384519e85eca9aeff4e7111ed153df8f3dbda7b35b70850ed4b3e9c8cec4d5", - "https://deno.land/std@0.202.0/crypto/timing_safe_equal.ts": "f6edc08d702f660b1ab3505b74d53a9d499e34a1351f6ab70f5ce8653fee8fb7", - "https://deno.land/std@0.202.0/crypto/to_hash_string.ts": "c78050f72a9d4a690d85e83a85a43c2951d23a04d5b2a4537b2ebc00854421be", - "https://deno.land/std@0.202.0/crypto/unstable/keystack.ts": "624c2f2d8fa6711d44fcb8fbca346e7fb56afa7aa3fcf2d8e6db32978e9fbac2", - "https://deno.land/std@0.202.0/encoding/base64.ts": "144ae6234c1fbe5b68666c711dc15b1e9ee2aef6d42b3b4345bf9a6c91d70d0d", - "https://deno.land/std@0.202.0/encoding/base64url.ts": "2ed4ba122b20fedf226c5d337cf22ee2024fa73a8f85d915d442af7e9ce1fae1", - "https://deno.land/std@0.202.0/encoding/hex.ts": "b4e346619c0535a5db48d6bdb6e057c8d1179c64a2b0ba8d3b0b8a79ae361a90", - "https://deno.land/std@0.202.0/flags/mod.ts": "0948466fc437f017f00c0b972a422b3dc3317a790bcf326429d23182977eaf9f", - "https://deno.land/std@0.202.0/fmt/colors.ts": "c51c4642678eb690dcf5ffee5918b675bf01a33fba82acf303701ae1a4f8c8d9", - "https://deno.land/std@0.202.0/fs/_util.ts": "fbf57dcdc9f7bc8128d60301eece608246971a7836a3bb1e78da75314f08b978", - "https://deno.land/std@0.202.0/fs/copy.ts": "23cc1c465babe5ca4d69778821e2f8addc44593e30a5ca0b902b3784eed75bb6", - "https://deno.land/std@0.202.0/fs/empty_dir.ts": "2e52cd4674d18e2e007175c80449fc3d263786a1361e858d9dfa9360a6581b47", - "https://deno.land/std@0.202.0/fs/ensure_dir.ts": "dc64c4c75c64721d4e3fb681f1382f803ff3d2868f08563ff923fdd20d071c40", - "https://deno.land/std@0.202.0/fs/ensure_file.ts": "39ac83cc283a20ec2735e956adf5de3e8a3334e0b6820547b5772f71c49ae083", - "https://deno.land/std@0.202.0/fs/ensure_link.ts": "c15e69c48556d78aae31b83e0c0ece04b7b8bc0951412f5b759aceb6fde7f0ac", - "https://deno.land/std@0.202.0/fs/ensure_symlink.ts": "b389c8568f0656d145ac7ece472afe710815cccbb2ebfd19da7978379ae143fe", - "https://deno.land/std@0.202.0/fs/eol.ts": "f1f2eb348a750c34500741987b21d65607f352cf7205f48f4319d417fff42842", - "https://deno.land/std@0.202.0/fs/exists.ts": "cb59a853d84871d87acab0e7936a4dac11282957f8e195102c5a7acb42546bb8", - "https://deno.land/std@0.202.0/fs/expand_glob.ts": "52b8b6f5b1fa585c348250da1c80ce5d820746cb4a75d874b3599646f677d3a7", - "https://deno.land/std@0.202.0/fs/mod.ts": "bc3d0acd488cc7b42627044caf47d72019846d459279544e1934418955ba4898", - "https://deno.land/std@0.202.0/fs/move.ts": "b4f8f46730b40c32ea3c0bc8eb0fd0e8139249a698883c7b3756424cf19785c9", - "https://deno.land/std@0.202.0/fs/walk.ts": "a16146724a6aaf9efdb92023a74e9805195c3469900744ce5de4113b07b29779", - "https://deno.land/std@0.202.0/http/cookie.ts": "c6079019fc15c781c302574f40fa2ac71c26b251e8f74eb236ea43e0424edcd7", - "https://deno.land/std@0.202.0/io/buf_reader.ts": "0bd8ad26255945b5f418940db23db03bee0c160dbb5ae4627e2c0be3b361df6a", - "https://deno.land/std@0.202.0/io/buf_writer.ts": "48c33c8f00b61dcbc7958706741cec8e59810bd307bc6a326cbd474fe8346dfd", - "https://deno.land/std@0.202.0/io/buffer.ts": "4d6883daeb2e698579c4064170515683d69f40f3de019bfe46c5cf31e74ae793", - "https://deno.land/std@0.202.0/log/handlers.ts": "3a0883f65567f59a9a88e44c972b24b924621bc28ead91af11d7a6da93c4a64c", - "https://deno.land/std@0.202.0/log/levels.ts": "6309147664e9e008cd6671610f2505c4c95f181f6bae4816a84b33e0aec66859", - "https://deno.land/std@0.202.0/log/logger.ts": "180c50a07c43a556dc5794e913c82946399e89d683201d01c8f0091e1e4ae3fc", - "https://deno.land/std@0.202.0/log/mod.ts": "a274d2129c8d08d4c96e0fb165a595e6c730b5130b437a9ce04364156bfe955a", - "https://deno.land/std@0.202.0/path/_basename.ts": "057d420c9049821f983f784fd87fa73ac471901fb628920b67972b0f44319343", - "https://deno.land/std@0.202.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0", - "https://deno.land/std@0.202.0/path/_dirname.ts": "355e297236b2218600aee7a5301b937204c62e12da9db4b0b044993d9e658395", - "https://deno.land/std@0.202.0/path/_extname.ts": "eaaa5aae1acf1f03254d681bd6a8ce42a9cb5b7ff2213a9d4740e8ab31283664", - "https://deno.land/std@0.202.0/path/_format.ts": "4a99270d6810f082e614309164fad75d6f1a483b68eed97c830a506cc589f8b4", - "https://deno.land/std@0.202.0/path/_from_file_url.ts": "6eadfae2e6f63ad9ee46b26db4a1b16583055c0392acedfb50ed2fc694b6f581", - "https://deno.land/std@0.202.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b", - "https://deno.land/std@0.202.0/path/_is_absolute.ts": "05dac10b5e93c63198b92e3687baa2be178df5321c527dc555266c0f4f51558c", - "https://deno.land/std@0.202.0/path/_join.ts": "815f5e85b042285175b1492dd5781240ce126c23bd97bad6b8211fe7129c538e", - "https://deno.land/std@0.202.0/path/_normalize.ts": "a19ec8706b2707f9dd974662a5cd89fad438e62ab1857e08b314a8eb49a34d81", - "https://deno.land/std@0.202.0/path/_os.ts": "30b0c2875f360c9296dbe6b7f2d528f0f9c741cecad2e97f803f5219e91b40a2", - "https://deno.land/std@0.202.0/path/_parse.ts": "0f9b0ff43682dd9964eb1c4398610c4e165d8db9d3ac9d594220217adf480cfa", - "https://deno.land/std@0.202.0/path/_relative.ts": "27bdeffb5311a47d85be26d37ad1969979359f7636c5cd9fcf05dcd0d5099dc5", - "https://deno.land/std@0.202.0/path/_resolve.ts": "7a3616f1093735ed327e758313b79c3c04ea921808ca5f19ddf240cb68d0adf6", - "https://deno.land/std@0.202.0/path/_to_file_url.ts": "a141e4a525303e1a3a0c0571fd024552b5f3553a2af7d75d1ff3a503dcbb66d8", - "https://deno.land/std@0.202.0/path/_to_namespaced_path.ts": "0d5f4caa2ed98ef7a8786286df6af804b50e38859ae897b5b5b4c8c5930a75c8", - "https://deno.land/std@0.202.0/path/_util.ts": "4e191b1bac6b3bf0c31aab42e5ca2e01a86ab5a0d2e08b75acf8585047a86221", - "https://deno.land/std@0.202.0/path/basename.ts": "bdfa5a624c6a45564dc6758ef2077f2822978a6dbe77b0a3514f7d1f81362930", - "https://deno.land/std@0.202.0/path/common.ts": "ee7505ab01fd22de3963b64e46cff31f40de34f9f8de1fff6a1bd2fe79380000", - "https://deno.land/std@0.202.0/path/dirname.ts": "b6533f4ee4174a526dec50c279534df5345836dfdc15318400b08c62a62a39dd", - "https://deno.land/std@0.202.0/path/extname.ts": "62c4b376300795342fe1e4746c0de518b4dc9c4b0b4617bfee62a2973a9555cf", - "https://deno.land/std@0.202.0/path/format.ts": "110270b238514dd68455a4c54956215a1aff7e37e22e4427b7771cefe1920aa5", - "https://deno.land/std@0.202.0/path/from_file_url.ts": "9f5cb58d58be14c775ec2e57fc70029ac8b17ed3bd7fe93e475b07280adde0ac", - "https://deno.land/std@0.202.0/path/glob.ts": "593e2c3573883225c25c5a21aaa8e9382a696b8e175ea20a3b6a1471ad17aaed", - "https://deno.land/std@0.202.0/path/is_absolute.ts": "0b92eb35a0a8780e9f16f16bb23655b67dace6a8e0d92d42039e518ee38103c1", - "https://deno.land/std@0.202.0/path/join.ts": "31c5419f23d91655b08ec7aec403f4e4cd1a63d39e28f6e42642ea207c2734f8", - "https://deno.land/std@0.202.0/path/mod.ts": "6e1efb0b13121463aedb53ea51dabf5639a3172ab58c89900bbb72b486872532", - "https://deno.land/std@0.202.0/path/normalize.ts": "6ea523e0040979dd7ae2f1be5bf2083941881a252554c0f32566a18b03021955", - "https://deno.land/std@0.202.0/path/parse.ts": "be8de342bb9e1924d78dc4d93c45215c152db7bf738ec32475560424b119b394", - "https://deno.land/std@0.202.0/path/posix.ts": "0a1c1952d132323a88736d03e92bd236f3ed5f9f079e5823fae07c8d978ee61b", - "https://deno.land/std@0.202.0/path/relative.ts": "8bedac226afd360afc45d451a6c29fabceaf32978526bcb38e0c852661f66c61", - "https://deno.land/std@0.202.0/path/resolve.ts": "133161e4949fc97f9ca67988d51376b0f5eef8968a6372325ab84d39d30b80dc", - "https://deno.land/std@0.202.0/path/separator.ts": "40a3e9a4ad10bef23bc2cd6c610291b6c502a06237c2c4cd034a15ca78dedc1f", - "https://deno.land/std@0.202.0/path/to_file_url.ts": "00e6322373dd51ad109956b775e4e72e5f9fa68ce2c6b04e4af2a6eed3825d31", - "https://deno.land/std@0.202.0/path/to_namespaced_path.ts": "1b1db3055c343ab389901adfbda34e82b7386bcd1c744d54f9c1496ee0fd0c3d", - "https://deno.land/std@0.202.0/path/win32.ts": "8b3f80ef7a462511d5e8020ff490edcaa0a0d118f1b1e9da50e2916bdd73f9dd", - "https://deno.land/std@0.202.0/semver/_shared.ts": "8547ccf91b36c30fb2a8a17d7081df13f4ae694c4aa44c39799eba69ad0dcb23", - "https://deno.land/std@0.202.0/semver/cmp.ts": "12c30b5888afd9e414defef64f881a478ff9ab11bd329ed6c5844b74eea5c971", - "https://deno.land/std@0.202.0/semver/comparator_format.ts": "329e05d914c064590ded4801fc601bf1c5d0f461c5524b1578e10f180551ef6f", - "https://deno.land/std@0.202.0/semver/comparator_intersects.ts": "61920121a6c1600306dbcf8944c4cc55e45c3a1bdbefe41b79a0884bf02d9e1b", - "https://deno.land/std@0.202.0/semver/comparator_max.ts": "f4cc5f528abd8aab68c66bbead732e3c59102b13a318cd8e4f8a47aa3debec76", - "https://deno.land/std@0.202.0/semver/comparator_min.ts": "eea382428ebf0c50168f780898df8519c88da5a10d1f8babbfebdc89fb75942e", - "https://deno.land/std@0.202.0/semver/compare.ts": "782e03b5107648bebaaebf0e33a9a7d6a0481eb88d2f7be8e857e4abbfdf42c0", - "https://deno.land/std@0.202.0/semver/compare_build.ts": "5d6ebc0106f1ed46e391d6c234e071934ba30938fa818c9cc3da67c7c7494c02", - "https://deno.land/std@0.202.0/semver/constants.ts": "bb0c7652c433c7ec1dad5bf18c7e7e1557efe9ddfd5e70aa6305153e76dc318c", - "https://deno.land/std@0.202.0/semver/difference.ts": "966ef286f0bfde53ebfb74a727c607b05a7fdce623a678794d088166b9b9afdf", - "https://deno.land/std@0.202.0/semver/eq.ts": "6ddb84ce8c95f18e9b7a46d8a63b1e6ca5f0c0f651f1f46f20db6543b390c3f3", - "https://deno.land/std@0.202.0/semver/format.ts": "236cc8b5d2e8031258dcff3ca89e14ba926434d5b789730e2c781db172e76bd9", - "https://deno.land/std@0.202.0/semver/gt.ts": "8529cf2ae1bca95c22801cf38f93620dc802c5dcbc02f863437571b970de3705", - "https://deno.land/std@0.202.0/semver/gte.ts": "b54f7855ac37ff076d6df9a294e944356754171f94f5cb974af782480a9f1fd0", - "https://deno.land/std@0.202.0/semver/gtr.ts": "d2ec1f02ce6a566b7df76a188af7315d802c6069892d460d631a3b0d9e2b1a45", - "https://deno.land/std@0.202.0/semver/increment.ts": "a6e5ac018887244731a4b936743ae14476cc432ac874f1c9848711b4000c5991", - "https://deno.land/std@0.202.0/semver/is_semver.ts": "666f4e1d8e41994150d4326d515046bc5fc72e59cbbd6e756a0b60548dcd00b5", - "https://deno.land/std@0.202.0/semver/is_semver_comparator.ts": "035aa894415ad1c8f50a6b6f52ea49c62d6f3af62b5d6fca9c1f4cb84f1896fd", - "https://deno.land/std@0.202.0/semver/is_semver_range.ts": "6f9b4f1c937a202750cae9444900d8abe4a68cc3bf5bb90f0d49c08cf85308cb", - "https://deno.land/std@0.202.0/semver/lt.ts": "081614b5adbc5bc944649e09af946a90a4b4bdb3d65a67c005183994504f04c2", - "https://deno.land/std@0.202.0/semver/lte.ts": "f8605c17d620bfb3aa57775643e3c560c04f7c20f2e431f64ca5b2ea39e36217", - "https://deno.land/std@0.202.0/semver/ltr.ts": "975e672b5ca8aa67336660653f8c76e1db829c628fb08ea3e815a9a12fa7eb9c", - "https://deno.land/std@0.202.0/semver/max_satisfying.ts": "75406901818cd1127a6332e007e96285474e833d0e40dbbfddc01b08ee6e51f2", - "https://deno.land/std@0.202.0/semver/min_satisfying.ts": "58bd48033a00e63bea0709f78c33c66ea58bce2dbebda0d54d3fdc6db7d0d298", - "https://deno.land/std@0.202.0/semver/mod.ts": "442702e8a57cbf02e68868c46ffe66ecf6efbde58d72cfdfbdaa51ad0c4af513", - "https://deno.land/std@0.202.0/semver/neq.ts": "e91b699681c3b406fc3d661d4eac7aa36cd1cc8bf188f8e3c7b53cc340775b87", - "https://deno.land/std@0.202.0/semver/outside.ts": "1d225fdb42172d946c382e144ce97c402812741741bbe299561aa164cc956ec4", - "https://deno.land/std@0.202.0/semver/parse.ts": "0e62409c25accf9756cb3eb288d5b5bc15fc2385d2344c912625bc1939136882", - "https://deno.land/std@0.202.0/semver/parse_comparator.ts": "f07f9be8322b1f61a36b94c3c65a0dc4124958ee54cf744c92ca4028bf156d5e", - "https://deno.land/std@0.202.0/semver/parse_range.ts": "39a18608a8026004b218ef383e7ae624a9e663b82327948c1810f16d875113c2", - "https://deno.land/std@0.202.0/semver/range_format.ts": "3de31fd0b74dd565e052840e73a8e9ee1d9d289ca60b85749167710b978cc078", - "https://deno.land/std@0.202.0/semver/range_intersects.ts": "8672e603df1bb68a02452b634021c4913395f4d16d75c21b578d6f4175a2b2c1", - "https://deno.land/std@0.202.0/semver/range_max.ts": "9c10c65bbc7796347ce6f765a77865cead88870d17481ac78259400a2378af2e", - "https://deno.land/std@0.202.0/semver/range_min.ts": "b7849e70e0b0677b382eddaa822b6690521449a659c5b8ec84cbd438f6e6ca59", - "https://deno.land/std@0.202.0/semver/rcompare.ts": "b8b9f5108d40c64cf50ffe455199aba7ad64995829a17110301ae3f8290374ee", - "https://deno.land/std@0.202.0/semver/rsort.ts": "a9139a1fc37570f9d8b6517032d152cf69143cec89d4342f19174e48f06d8543", - "https://deno.land/std@0.202.0/semver/sort.ts": "c058a5b2c8e866fa8e6ef25c9d228133357caf4c140f129bfc368334fcd0813b", - "https://deno.land/std@0.202.0/semver/test_comparator.ts": "eff5394cb82d133ed18f96fe547de7e7264bf0d25d16cbc6126664aa06ef8f37", - "https://deno.land/std@0.202.0/semver/test_range.ts": "b236c276268e92bbbc65e7c4b4b6b685ea6b4534a71b2525b53093d094f631c6", - "https://deno.land/std@0.202.0/semver/types.ts": "d44f442c2f27dd89bd6695b369e310b80549746f03c38f241fe28a83b33dd429", - "https://deno.land/std@0.202.0/streams/_common.ts": "3b2c1f0287ce2ad51fff4091a7d0f48375c85b0ec341468e76d5ac13bb0014dd", - "https://deno.land/std@0.202.0/streams/buffer.ts": "6cd773d22cf21bb988a98cc551b5abfc4c3b03516f93eaa3fb6f2f6e16032deb", - "https://deno.land/std@0.202.0/streams/byte_slice_stream.ts": "c46d7c74836fc8c1a9acd9fe211cbe1bbaaee1b36087c834fb03af4991135c3a", - "https://deno.land/std@0.202.0/streams/copy.ts": "bbd406bd9a71034a412c05bb0fd8b7964cc7f2e2ad0f0a1cc0463cdc816d540b", - "https://deno.land/std@0.202.0/streams/delimiter_stream.ts": "ea793d21bfaae27163f0b50d26298a2ad543803283aeaff082df50dd9c08614f", - "https://deno.land/std@0.202.0/streams/early_zip_readable_streams.ts": "4005fa74162b943f79899e5d7cb96adcbc0a6b867f9144974ed12d30e0a556e1", - "https://deno.land/std@0.202.0/streams/iterate_reader.ts": "3b42d3056c8ccade561f1c7ac22d5e671e745933d9f9168fd3b5913588d911c3", - "https://deno.land/std@0.202.0/streams/limited_bytes_transform_stream.ts": "05dc592ffaab83257494d22dd53917e56243c26e5e3129b3f13ddbbbc4785048", - "https://deno.land/std@0.202.0/streams/limited_transform_stream.ts": "d69ab790232c1b86f53621ad41ef03c235f2abb4b7a1cd51960ad6e12ee55e38", - "https://deno.land/std@0.202.0/streams/merge_readable_streams.ts": "dc2db0cbf1b14d999aa2aa2a2a1ba24ce58953878f29845ed9319321d0a01fab", - "https://deno.land/std@0.202.0/streams/mod.ts": "e133c271474f1e9dc19f5c4959406f5c2101540c56a3e7d7abc6bdb7bcef807e", - "https://deno.land/std@0.202.0/streams/read_all.ts": "3b20a50af87d1bfebefa9c2dbda49e2b214d8ab0382ffdcc8ce858af80a912be", - "https://deno.land/std@0.202.0/streams/readable_stream_from_reader.ts": "c4078b6fd4832748f979cb211facf483c82a840f3c0d88752f46d4dcddb3110a", - "https://deno.land/std@0.202.0/streams/reader_from_iterable.ts": "91d578a6c75e443654a75580a67cf3af1eeb4b186fa0b309f35b49c9c53be2b7", - "https://deno.land/std@0.202.0/streams/reader_from_stream_reader.ts": "53dfdb6c608005eb9e0610a9f9cbc51c66f34a519363f1abd4e8a09ab4ad8f9e", - "https://deno.land/std@0.202.0/streams/text_delimiter_stream.ts": "f0dc8ff953a8a77f0d1fa8db1fee62de817f36e20d79b00b1362847e30fbdd90", - "https://deno.land/std@0.202.0/streams/text_line_stream.ts": "0f2c4b33a5fdb2476f2e060974cba1347cefe99a4af33c28a57524b1a34750fa", - "https://deno.land/std@0.202.0/streams/to_array_buffer.ts": "de5803ef98cf2bfd8eeaaa17ae4f4d0364377bd6f6e425110e7010c1cb48196b", - "https://deno.land/std@0.202.0/streams/to_blob.ts": "4cf929b3ffe5d4dbe445d572246159ee2eebf69e998a0ba867b9048fb6e92797", - "https://deno.land/std@0.202.0/streams/to_json.ts": "10635fac9826392bb8e70bc8354d3beb1058fa1676aa9b6f98257a0d5575f520", - "https://deno.land/std@0.202.0/streams/to_text.ts": "4018b5f7a0e7ab28d6957c239e401f8b534ef326b7ebd282ca76b3cd55380aab", - "https://deno.land/std@0.202.0/streams/to_transform_stream.ts": "50af06140c414090df8c3879f46bed4043a5d73caa60352c0c9682a88ec7a8c9", - "https://deno.land/std@0.202.0/streams/writable_stream_from_writer.ts": "b5ee3ef4d5be0b3214cddf0f87e804a6a31b9a5632c96277912e7543eaec9f40", - "https://deno.land/std@0.202.0/streams/write_all.ts": "4cdd36256f892fe7aead46338054f6ea813a63765e87bda4c60e8c5a57d1c5c1", - "https://deno.land/std@0.202.0/streams/writer_from_stream_writer.ts": "7188ce589d6179693b488b478c05137d4d15b93735ca26ec01e6e44aed8cb0c6", - "https://deno.land/std@0.202.0/streams/zip_readable_streams.ts": "5639c8fea8c21d7dab6f34edcf3d08218b7e548a197f7fd79a3a995305a81e9f", - "https://deno.land/std@0.202.0/url/_strip.ts": "86f852d266b86e5867f50ac5d453bedea7b7e7a1919669df93d66a0b59b00e5b", - "https://deno.land/std@0.202.0/url/basename.ts": "232e7570ee75fdaafe205e6216a8c0c4a6236db32a1fe81ac3d5a1adbb8365fa", - "https://deno.land/std@0.202.0/url/dirname.ts": "d87f87b80aa76027b43c46db7274a5c877021a02e1ca723a603b58b63c7db8e9", - "https://deno.land/std@0.202.0/url/extname.ts": "1e1980999f422f42e4bded4b746fa380a1a6cd79ff85ce3cf5107d28d9f131dd", - "https://deno.land/std@0.202.0/url/join.ts": "157be552aec2d325b07c2fd9fa4643153659c044071cff8ffd62f80b4cbb792c", - "https://deno.land/std@0.202.0/url/mod.ts": "d4e4db2f85a4a1613d824367b750f36bbd1c0ff791daae2eb74795d292c722bb", - "https://deno.land/std@0.202.0/url/normalize.ts": "1214f4590119491e891e89cef22f5fa2825ecd51781b0e985952c460b218cba1", - "https://deno.land/std@0.202.0/uuid/_common.ts": "cb1441f4df460571fc0919e1c5c217f3e7006189b703caf946604b3f791ae34d", - "https://deno.land/std@0.202.0/uuid/constants.ts": "0d0e95561343da44adb4a4edbc1f04cef48b0d75288c4d1704f58743f4a50d88", - "https://deno.land/std@0.202.0/uuid/mod.ts": "5c7ca252dddba1ddf0bca2dc1124328245272650c98251d71996bb9cd8f5a386", - "https://deno.land/std@0.202.0/uuid/v1.ts": "fe36009afce7ced96e1b5928565e12c5a8eb0df1a2b5063c0a72bda6b75c0de5", - "https://deno.land/std@0.202.0/uuid/v3.ts": "49bd2a5cd19f043c88777a8daeaa453f96cc586129af78863aa34dadf27d5fd0", - "https://deno.land/std@0.202.0/uuid/v4.ts": "0f081880c156fd59b9e44e2f84ea0f94a3627e89c224eaf6cc982b53d849f37e", - "https://deno.land/std@0.202.0/uuid/v5.ts": "a102f716fc8d31b7e7e4376b1e7d6a255c39858bda6e5f672a4bb3cbd67405d0", - "https://deno.land/std@0.211.0/assert/assert.ts": "bec068b2fccdd434c138a555b19a2c2393b71dfaada02b7d568a01541e67cdc5", - "https://deno.land/std@0.211.0/assert/assertion_error.ts": "9f689a101ee586c4ce92f52fa7ddd362e86434ffdf1f848e45987dc7689976b8", - "https://deno.land/std@0.211.0/async/delay.ts": "eab3187eee39ccc8cc76d411fb21fb1801250ddb1090e486d5aec2ace5403391", - "https://deno.land/std@0.211.0/bytes/concat.ts": "9cac3b4376afbef98ff03588eb3cf948e0d1eb6c27cfe81a7651ab6dd3adc54a", - "https://deno.land/std@0.211.0/bytes/copy.ts": "f29c03168853720dfe82eaa57793d0b9e3543ebfe5306684182f0f1e3bfd422a", - "https://deno.land/std@0.211.0/io/buf_reader.ts": "3ee2cf0d6570ec1ede46efd5d0b0701719dc573f103a123d2cf9f4bfbc36af31", - "https://deno.land/std@0.211.0/io/buf_writer.ts": "214134bd77bc46e4478cf74b771dfb614b9e23b313df513a34c54aa88df81584", - "https://deno.land/std@0.219.0/assert/assert.ts": "bec068b2fccdd434c138a555b19a2c2393b71dfaada02b7d568a01541e67cdc5", - "https://deno.land/std@0.219.0/assert/assert_exists.ts": "24a7bf965e634f909242cd09fbaf38bde6b791128ece08e33ab08586a7cc55c9", - "https://deno.land/std@0.219.0/assert/assertion_error.ts": "9f689a101ee586c4ce92f52fa7ddd362e86434ffdf1f848e45987dc7689976b8", - "https://deno.land/std@0.219.0/bytes/concat.ts": "9cac3b4376afbef98ff03588eb3cf948e0d1eb6c27cfe81a7651ab6dd3adc54a", - "https://deno.land/std@0.219.0/bytes/copy.ts": "f29c03168853720dfe82eaa57793d0b9e3543ebfe5306684182f0f1e3bfd422a", - "https://deno.land/std@0.219.0/flags/mod.ts": "9f13f3a49c54618277ac49195af934f1c7d235731bcf80fd33b8b234e6839ce9", - "https://deno.land/std@0.219.0/fmt/colors.ts": "d239d84620b921ea520125d778947881f62c50e78deef2657073840b8af9559a", - "https://deno.land/std@0.219.0/fmt/duration.ts": "606f8c2bbbadd7f7a122868a478c9ad31f2e66b1e19e0a9769655585414fced6", - "https://deno.land/std@0.219.0/fs/_create_walk_entry.ts": "5d9d2aaec05bcf09a06748b1684224d33eba7a4de24cf4cf5599991ca6b5b412", - "https://deno.land/std@0.219.0/fs/_get_file_info_type.ts": "da7bec18a7661dba360a1db475b826b18977582ce6fc9b25f3d4ee0403fe8cbd", - "https://deno.land/std@0.219.0/fs/_is_same_path.ts": "709c95868345fea051c58b9e96af95cff94e6ae98dfcff2b66dee0c212c4221f", - "https://deno.land/std@0.219.0/fs/_is_subdir.ts": "c68b309d46cc8568ed83c000f608a61bbdba0943b7524e7a30f9e450cf67eecd", - "https://deno.land/std@0.219.0/fs/_to_path_string.ts": "29bfc9c6c112254961d75cbf6ba814d6de5349767818eb93090cecfa9665591e", - "https://deno.land/std@0.219.0/fs/copy.ts": "dc0f68c4b6c3b090bfdb909387e309f6169b746bd713927c9507c9ef545d71f6", - "https://deno.land/std@0.219.0/fs/empty_dir.ts": "4f01e6d56e2aa8d90ad60f20bc25601f516b00f6c3044cdf6863a058791d91aa", - "https://deno.land/std@0.219.0/fs/ensure_dir.ts": "dffff68de0d10799b5aa9e39dec4e327e12bbd29e762292193684542648c4aeb", - "https://deno.land/std@0.219.0/fs/ensure_file.ts": "ac5cfde94786b0284d2c8e9f7f9425269bea1b2140612b4aea1f20b508870f59", - "https://deno.land/std@0.219.0/fs/ensure_link.ts": "d42af2edefeaa9817873ec6e46dc5d209ac4d744f8c69c5ecc2dffade78465b6", - "https://deno.land/std@0.219.0/fs/ensure_symlink.ts": "1f64d7bdd191f7d9b71264e191902fcae5cec86305d54659897944caea70f814", - "https://deno.land/std@0.219.0/fs/eol.ts": "c9807291f78361d49fd986a9be04654610c615c5e2ec63d748976197d30ff206", - "https://deno.land/std@0.219.0/fs/exists.ts": "d2757ef764eaf5c6c5af7228e8447db2de42ab084a2dae540097f905723d83f5", - "https://deno.land/std@0.219.0/fs/expand_glob.ts": "a1ce02b05ed7b96985b0665067c9f1018f3f2ade7ee0fb0d629231050260b158", - "https://deno.land/std@0.219.0/fs/mod.ts": "107f5afa4424c2d3ce2f7e9266173198da30302c69af662c720115fe504dc5ee", - "https://deno.land/std@0.219.0/fs/move.ts": "39e0d7ccb88a566d20b949712020e766b15ef1ec19159573d11f949bd677909c", - "https://deno.land/std@0.219.0/fs/walk.ts": "78e1d01a9f75715614bf8d6e58bd77d9fafb1222c41194e607cd3849d7a0e771", - "https://deno.land/std@0.219.0/io/_common.ts": "36705cdb4dfcd338d6131bca1b16e48a4d5bf0d1dada6ce397268e88c17a5835", - "https://deno.land/std@0.219.0/io/_constants.ts": "3c7ad4695832e6e4a32e35f218c70376b62bc78621ef069a4a0a3d55739f8856", - "https://deno.land/std@0.219.0/io/buffer.ts": "4d1f805f350433e418002accec798bc6c33ce18f614afa65f987c202d7b2234e", - "https://deno.land/std@0.219.0/io/iterate_reader.ts": "1e5e4fea22d8965afb7df4ee9ab9adda0a0fc581adbea31bc2f2d25453f8a6e9", - "https://deno.land/std@0.219.0/io/reader_from_stream_reader.ts": "a75bbc93f39df8b0e372cc1fbdc416a7cbf2a39fc4c09ddb057f1241100191c5", - "https://deno.land/std@0.219.0/io/to_readable_stream.ts": "ed03a44a1ec1cc55a85a857acf6cac472035298f6f3b6207ea209f93b4aefb39", - "https://deno.land/std@0.219.0/io/to_writable_stream.ts": "ef422e0425963c8a1e0481674e66c3023da50f0acbe5ef51ec9789efc3c1e2ed", - "https://deno.land/std@0.219.0/io/write_all.ts": "24aac2312bb21096ae3ae0b102b22c26164d3249dff96dbac130958aa736f038", - "https://deno.land/std@0.219.0/path/_common/assert_path.ts": "dbdd757a465b690b2cc72fc5fb7698c51507dec6bfafce4ca500c46b76ff7bd8", - "https://deno.land/std@0.219.0/path/_common/basename.ts": "569744855bc8445f3a56087fd2aed56bdad39da971a8d92b138c9913aecc5fa2", - "https://deno.land/std@0.219.0/path/_common/common.ts": "ef73c2860694775fe8ffcbcdd387f9f97c7a656febf0daa8c73b56f4d8a7bd4c", - "https://deno.land/std@0.219.0/path/_common/constants.ts": "dc5f8057159f4b48cd304eb3027e42f1148cf4df1fb4240774d3492b5d12ac0c", - "https://deno.land/std@0.219.0/path/_common/dirname.ts": "684df4aa71a04bbcc346c692c8485594fc8a90b9408dfbc26ff32cf3e0c98cc8", - "https://deno.land/std@0.219.0/path/_common/format.ts": "92500e91ea5de21c97f5fe91e178bae62af524b72d5fcd246d6d60ae4bcada8b", - "https://deno.land/std@0.219.0/path/_common/from_file_url.ts": "d672bdeebc11bf80e99bf266f886c70963107bdd31134c4e249eef51133ceccf", - "https://deno.land/std@0.219.0/path/_common/glob_to_reg_exp.ts": "6cac16d5c2dc23af7d66348a7ce430e5de4e70b0eede074bdbcf4903f4374d8d", - "https://deno.land/std@0.219.0/path/_common/normalize.ts": "684df4aa71a04bbcc346c692c8485594fc8a90b9408dfbc26ff32cf3e0c98cc8", - "https://deno.land/std@0.219.0/path/_common/normalize_string.ts": "dfdf657a1b1a7db7999f7c575ee7e6b0551d9c20f19486c6c3f5ff428384c965", - "https://deno.land/std@0.219.0/path/_common/relative.ts": "faa2753d9b32320ed4ada0733261e3357c186e5705678d9dd08b97527deae607", - "https://deno.land/std@0.219.0/path/_common/strip_trailing_separators.ts": "7024a93447efcdcfeaa9339a98fa63ef9d53de363f1fbe9858970f1bba02655a", - "https://deno.land/std@0.219.0/path/_common/to_file_url.ts": "7f76adbc83ece1bba173e6e98a27c647712cab773d3f8cbe0398b74afc817883", - "https://deno.land/std@0.219.0/path/_interface.ts": "a1419fcf45c0ceb8acdccc94394e3e94f99e18cfd32d509aab514c8841799600", - "https://deno.land/std@0.219.0/path/_os.ts": "8fb9b90fb6b753bd8c77cfd8a33c2ff6c5f5bc185f50de8ca4ac6a05710b2c15", - "https://deno.land/std@0.219.0/path/basename.ts": "5d341aadb7ada266e2280561692c165771d071c98746fcb66da928870cd47668", - "https://deno.land/std@0.219.0/path/common.ts": "03e52e22882402c986fe97ca3b5bb4263c2aa811c515ce84584b23bac4cc2643", - "https://deno.land/std@0.219.0/path/constants.ts": "0c206169ca104938ede9da48ac952de288f23343304a1c3cb6ec7625e7325f36", - "https://deno.land/std@0.219.0/path/dirname.ts": "85bd955bf31d62c9aafdd7ff561c4b5fb587d11a9a5a45e2b01aedffa4238a7c", - "https://deno.land/std@0.219.0/path/extname.ts": "593303db8ae8c865cbd9ceec6e55d4b9ac5410c1e276bfd3131916591b954441", - "https://deno.land/std@0.219.0/path/format.ts": "42a2f3201343df77061207e6aaf78c95bafce7f711dcb7fe1e5840311c505778", - "https://deno.land/std@0.219.0/path/from_file_url.ts": "911833ae4fd10a1c84f6271f36151ab785955849117dc48c6e43b929504ee069", - "https://deno.land/std@0.219.0/path/glob_to_regexp.ts": "7f30f0a21439cadfdae1be1bf370880b415e676097fda584a63ce319053b5972", - "https://deno.land/std@0.219.0/path/is_absolute.ts": "4791afc8bfd0c87f0526eaa616b0d16e7b3ab6a65b62942e50eac68de4ef67d7", - "https://deno.land/std@0.219.0/path/is_glob.ts": "a65f6195d3058c3050ab905705891b412ff942a292bcbaa1a807a74439a14141", - "https://deno.land/std@0.219.0/path/join.ts": "ae2ec5ca44c7e84a235fd532e4a0116bfb1f2368b394db1c4fb75e3c0f26a33a", - "https://deno.land/std@0.219.0/path/join_globs.ts": "5b3bf248b93247194f94fa6947b612ab9d3abd571ca8386cf7789038545e54a0", - "https://deno.land/std@0.219.0/path/mod.ts": "2821a1bb3a4148a0ffe79c92aa41aa9319fef73c6d6f5178f52b2c720d3eb02d", - "https://deno.land/std@0.219.0/path/normalize.ts": "4155743ccceeed319b350c1e62e931600272fad8ad00c417b91df093867a8352", - "https://deno.land/std@0.219.0/path/normalize_glob.ts": "cc89a77a7d3b1d01053b9dcd59462b75482b11e9068ae6c754b5cf5d794b374f", - "https://deno.land/std@0.219.0/path/parse.ts": "65e8e285f1a63b714e19ef24b68f56e76934c3df0b6e65fd440d3991f4f8aefb", - "https://deno.land/std@0.219.0/path/posix/_util.ts": "1e3937da30f080bfc99fe45d7ed23c47dd8585c5e473b2d771380d3a6937cf9d", - "https://deno.land/std@0.219.0/path/posix/basename.ts": "39ee27a29f1f35935d3603ccf01d53f3d6e0c5d4d0f84421e65bd1afeff42843", - "https://deno.land/std@0.219.0/path/posix/common.ts": "26f60ccc8b2cac3e1613000c23ac5a7d392715d479e5be413473a37903a2b5d4", - "https://deno.land/std@0.219.0/path/posix/constants.ts": "93481efb98cdffa4c719c22a0182b994e5a6aed3047e1962f6c2c75b7592bef1", - "https://deno.land/std@0.219.0/path/posix/dirname.ts": "6535d2bdd566118963537b9dda8867ba9e2a361015540dc91f5afbb65c0cce8b", - "https://deno.land/std@0.219.0/path/posix/extname.ts": "8d36ae0082063c5e1191639699e6f77d3acf501600a3d87b74943f0ae5327427", - "https://deno.land/std@0.219.0/path/posix/format.ts": "185e9ee2091a42dd39e2a3b8e4925370ee8407572cee1ae52838aed96310c5c1", - "https://deno.land/std@0.219.0/path/posix/from_file_url.ts": "951aee3a2c46fd0ed488899d024c6352b59154c70552e90885ed0c2ab699bc40", - "https://deno.land/std@0.219.0/path/posix/glob_to_regexp.ts": "76f012fcdb22c04b633f536c0b9644d100861bea36e9da56a94b9c589a742e8f", - "https://deno.land/std@0.219.0/path/posix/is_absolute.ts": "cebe561ad0ae294f0ce0365a1879dcfca8abd872821519b4fcc8d8967f888ede", - "https://deno.land/std@0.219.0/path/posix/is_glob.ts": "8a8b08c08bf731acf2c1232218f1f45a11131bc01de81e5f803450a5914434b9", - "https://deno.land/std@0.219.0/path/posix/join.ts": "744fadcbee7047688696455c7cbb368a9625ffde67fc3058a61c98948fcd04de", - "https://deno.land/std@0.219.0/path/posix/join_globs.ts": "a9475b44645feddceb484ee0498e456f4add112e181cb94042cdc6d47d1cdd25", - "https://deno.land/std@0.219.0/path/posix/mod.ts": "2301fc1c54a28b349e20656f68a85f75befa0ee9b6cd75bfac3da5aca9c3f604", - "https://deno.land/std@0.219.0/path/posix/normalize.ts": "baeb49816a8299f90a0237d214cef46f00ba3e95c0d2ceb74205a6a584b58a91", - "https://deno.land/std@0.219.0/path/posix/normalize_glob.ts": "9c87a829b6c0f445d03b3ecadc14492e2864c3ebb966f4cea41e98326e4435c6", - "https://deno.land/std@0.219.0/path/posix/parse.ts": "0b1fc4cb890dbb699ec1d2c232d274843b4a7142e1ad976b69fe51c954eb6080", - "https://deno.land/std@0.219.0/path/posix/relative.ts": "3907d6eda41f0ff723d336125a1ad4349112cd4d48f693859980314d5b9da31c", - "https://deno.land/std@0.219.0/path/posix/resolve.ts": "08b699cfeee10cb6857ccab38fa4b2ec703b0ea33e8e69964f29d02a2d5257cf", - "https://deno.land/std@0.219.0/path/posix/to_file_url.ts": "7aa752ba66a35049e0e4a4be5a0a31ac6b645257d2e031142abb1854de250aaf", - "https://deno.land/std@0.219.0/path/posix/to_namespaced_path.ts": "28b216b3c76f892a4dca9734ff1cc0045d135532bfd9c435ae4858bfa5a2ebf0", - "https://deno.land/std@0.219.0/path/relative.ts": "ab739d727180ed8727e34ed71d976912461d98e2b76de3d3de834c1066667add", - "https://deno.land/std@0.219.0/path/resolve.ts": "a6f977bdb4272e79d8d0ed4333e3d71367cc3926acf15ac271f1d059c8494d8d", - "https://deno.land/std@0.219.0/path/to_file_url.ts": "88f049b769bce411e2d2db5bd9e6fd9a185a5fbd6b9f5ad8f52bef517c4ece1b", - "https://deno.land/std@0.219.0/path/to_namespaced_path.ts": "b706a4103b104cfadc09600a5f838c2ba94dbcdb642344557122dda444526e40", - "https://deno.land/std@0.219.0/path/windows/_util.ts": "d5f47363e5293fced22c984550d5e70e98e266cc3f31769e1710511803d04808", - "https://deno.land/std@0.219.0/path/windows/basename.ts": "e2dbf31d1d6385bfab1ce38c333aa290b6d7ae9e0ecb8234a654e583cf22f8fe", - "https://deno.land/std@0.219.0/path/windows/common.ts": "26f60ccc8b2cac3e1613000c23ac5a7d392715d479e5be413473a37903a2b5d4", - "https://deno.land/std@0.219.0/path/windows/constants.ts": "5afaac0a1f67b68b0a380a4ef391bf59feb55856aa8c60dfc01bd3b6abb813f5", - "https://deno.land/std@0.219.0/path/windows/dirname.ts": "33e421be5a5558a1346a48e74c330b8e560be7424ed7684ea03c12c21b627bc9", - "https://deno.land/std@0.219.0/path/windows/extname.ts": "165a61b00d781257fda1e9606a48c78b06815385e7d703232548dbfc95346bef", - "https://deno.land/std@0.219.0/path/windows/format.ts": "bbb5ecf379305b472b1082cd2fdc010e44a0020030414974d6029be9ad52aeb6", - "https://deno.land/std@0.219.0/path/windows/from_file_url.ts": "ced2d587b6dff18f963f269d745c4a599cf82b0c4007356bd957cb4cb52efc01", - "https://deno.land/std@0.219.0/path/windows/glob_to_regexp.ts": "e45f1f89bf3fc36f94ab7b3b9d0026729829fabc486c77f414caebef3b7304f8", - "https://deno.land/std@0.219.0/path/windows/is_absolute.ts": "4a8f6853f8598cf91a835f41abed42112cebab09478b072e4beb00ec81f8ca8a", - "https://deno.land/std@0.219.0/path/windows/is_glob.ts": "8a8b08c08bf731acf2c1232218f1f45a11131bc01de81e5f803450a5914434b9", - "https://deno.land/std@0.219.0/path/windows/join.ts": "8d03530ab89195185103b7da9dfc6327af13eabdcd44c7c63e42e27808f50ecf", - "https://deno.land/std@0.219.0/path/windows/join_globs.ts": "a9475b44645feddceb484ee0498e456f4add112e181cb94042cdc6d47d1cdd25", - "https://deno.land/std@0.219.0/path/windows/mod.ts": "2301fc1c54a28b349e20656f68a85f75befa0ee9b6cd75bfac3da5aca9c3f604", - "https://deno.land/std@0.219.0/path/windows/normalize.ts": "78126170ab917f0ca355a9af9e65ad6bfa5be14d574c5fb09bb1920f52577780", - "https://deno.land/std@0.219.0/path/windows/normalize_glob.ts": "9c87a829b6c0f445d03b3ecadc14492e2864c3ebb966f4cea41e98326e4435c6", - "https://deno.land/std@0.219.0/path/windows/parse.ts": "dbdfe2bc6db482d755b5f63f7207cd019240fcac02ad2efa582adf67ff10553a", - "https://deno.land/std@0.219.0/path/windows/relative.ts": "3e1abc7977ee6cc0db2730d1f9cb38be87b0ce4806759d271a70e4997fc638d7", - "https://deno.land/std@0.219.0/path/windows/resolve.ts": "8dae1dadfed9d46ff46cc337c9525c0c7d959fb400a6308f34595c45bdca1972", - "https://deno.land/std@0.219.0/path/windows/to_file_url.ts": "40e560ee4854fe5a3d4d12976cef2f4e8914125c81b11f1108e127934ced502e", - "https://deno.land/std@0.219.0/path/windows/to_namespaced_path.ts": "4ffa4fb6fae321448d5fe810b3ca741d84df4d7897e61ee29be961a6aac89a4c", - "https://deno.land/std@0.219.0/semver/_constants.ts": "5ef89c5f33e6095546ae3e57920592feefcb8372d4cc05542f6bf15a1977e3c9", - "https://deno.land/std@0.219.0/semver/_shared.ts": "5c53a675225cba9ad74ae2e17c124e333728fc2b551a13e8a32b99433b90c1c2", - "https://deno.land/std@0.219.0/semver/can_parse.ts": "d4a26f74be078f3ab10293b07bf022021a2f362b3e21b58422c214e7268110b2", - "https://deno.land/std@0.219.0/semver/compare.ts": "e8871844a35cc8fe16e883c16e5237e06a93aa4830ae10d06501abe63586fc57", - "https://deno.land/std@0.219.0/semver/constants.ts": "a0daa58502949654af044928f86288d8b27bd1880218e9faba7733ec0bde63ab", - "https://deno.land/std@0.219.0/semver/difference.ts": "be4f01b7745406408a16b708185a48c1c652cc87e0244b12a5ca75c5585db668", - "https://deno.land/std@0.219.0/semver/equals.ts": "8b9b18260c9a55feee9d3f9250fba345be922380f2e8f8009e455c394ce5e81d", - "https://deno.land/std@0.219.0/semver/format.ts": "26d3a357ac5abd73dee0fe7dbbac6107fbdce0a844370c7b1bcb673c92e46bf6", - "https://deno.land/std@0.219.0/semver/format_range.ts": "6ad2d0c27aac63dfb7efca6286a6ab7742accfb986cc53662047740f17dacfe5", - "https://deno.land/std@0.219.0/semver/greater_or_equal.ts": "89c26f68070896944676eb9704cbb617febc6ed693720282741d6859c3d1fe80", - "https://deno.land/std@0.219.0/semver/greater_than.ts": "d8c4a227cd28ea80a1de9c80215d7f3f95786fe1b196f0cb5ec91d6567adad27", - "https://deno.land/std@0.219.0/semver/increment.ts": "427a043be71d6481e45c1a3939b955e800924d70779cb297b872d9cbf9f0e46d", - "https://deno.land/std@0.219.0/semver/is_range.ts": "15dd9a8d6a8dee56dea6799d8c8210e06c0a38cc1a9aa6152aeea39ce45e2111", - "https://deno.land/std@0.219.0/semver/is_semver.ts": "57914027d6141e593eb04418aaabbfd6f4562a1c53c6c33a1743fa50ada8d849", - "https://deno.land/std@0.219.0/semver/less_or_equal.ts": "7dbf8190f37f3281048c30cf11e072a7af18685534ae88d295baa170b485bd90", - "https://deno.land/std@0.219.0/semver/less_than.ts": "b0c7902c54cecadcc7c1c80afc2f6a0f1bf0b3f53c8d2bfd11f01a3a414cccfe", - "https://deno.land/std@0.219.0/semver/max_satisfying.ts": "03e5182a7424c308ddbb410e4b927da0dabc4e07d4b5a72f7e9b26fb18a02152", - "https://deno.land/std@0.219.0/semver/min_satisfying.ts": "b6fadc9af17278289481c416e1eb135614f88063f4fc2b7b72b43eb3baa2f08f", - "https://deno.land/std@0.219.0/semver/mod.ts": "6e1f8854cec50c027037a597d3dd54af72e063f763ec0cbc4ea1e534a627ffae", - "https://deno.land/std@0.219.0/semver/not_equals.ts": "17147a6f68b9d14f4643c1e2150378ccf6954710309f9618f75b411752a8e13d", - "https://deno.land/std@0.219.0/semver/parse.ts": "b64052ff8ce0b0bba9ed97b835a224c828fc7ad227585c3e8c2bac72a07bf572", - "https://deno.land/std@0.219.0/semver/parse_range.ts": "5190afffc90cc14410ce2478fb81ed83b55d7e96b6fbbd69fc715c457082ec94", - "https://deno.land/std@0.219.0/semver/range_intersects.ts": "2c358f7c27b51960a9889be5462ec1cac44feeb5e40041a5c5a03700c0ddc017", - "https://deno.land/std@0.219.0/semver/range_max.ts": "4c43d018841ba67d018e515f0aef32658dab611a39fdc74e31b1e48709be281c", - "https://deno.land/std@0.219.0/semver/range_min.ts": "37c5e3dac7bd63812ae249add9ea815a351826f510d2baf391c225d1d8272d17", - "https://deno.land/std@0.219.0/semver/test_range.ts": "72ba2af827e4ad94db9a29e22e86cbec9b3f8519fc36fd6ce0d4308717536c70", - "https://deno.land/std@0.219.0/semver/try_parse.ts": "7e2a3594212445d9d6f6154f02288d66a0c0b79ce3e859c41f3d47e29dfa439a", - "https://deno.land/std@0.219.0/semver/try_parse_range.ts": "4f211f0ff4f5fdaa85622ab96c360123bbcf0e5a91a57eb7a8258af6b7a3c704", - "https://deno.land/std@0.219.0/semver/types.ts": "13e1e0c64a4ac76f0add74afee6240c92a7dba184e63e0bd4cb456afed8c7291", - "https://deno.land/std@0.219.0/streams/_common.ts": "948735ef6d140cd6916dca861197b88fc57db52c2f923c392b7a14033d8fed4b", - "https://deno.land/std@0.219.0/streams/buffer.ts": "e012de72a53ad17c56512488e9afb6f4b6ed046b32fc1415ae7a4e6fc0efce38", - "https://deno.land/std@0.219.0/streams/byte_slice_stream.ts": "5bbdcadb118390affa9b3d0a0f73ef8e83754f59bb89df349add669dd9369713", - "https://deno.land/std@0.219.0/streams/delimiter_stream.ts": "4e4050740ff27a8824defa6c96126229ef9d794c4ace4ef9cabb10b5ad4a5d14", - "https://deno.land/std@0.219.0/streams/early_zip_readable_streams.ts": "21f5cf6dd36381c6a50c31a7727b5bd219f6382bbb7a413418595c3e466c4d14", - "https://deno.land/std@0.219.0/streams/iterate_reader.ts": "a50bed95514736c3c554e4c69ea2d8d2699252e4e74507769999d22c3886c777", - "https://deno.land/std@0.219.0/streams/limited_bytes_transform_stream.ts": "b22a45a337374e863c4eb1867ec6b8ad3e68620a6c52fe837746060ea610e6f1", - "https://deno.land/std@0.219.0/streams/limited_transform_stream.ts": "4c47da5ca38a30fa9f33b0f1a61d4548e7f52a9a58c294b0f430f680e44cc543", - "https://deno.land/std@0.219.0/streams/merge_readable_streams.ts": "73eed8ff54c9111b8b974b11a5a11c1ed0b7800e0157c39277ccac3ed14721e2", - "https://deno.land/std@0.219.0/streams/mod.ts": "d56624832b9649b680c74ab9c77e746e8be81ae1a24756cc04623e25a0d43ce9", - "https://deno.land/std@0.219.0/streams/readable_stream_from_reader.ts": "4289a63836f73901441c1879f2be76eea2a983920f4b10a4a9b8a6d8c29ece56", - "https://deno.land/std@0.219.0/streams/reader_from_iterable.ts": "82f1ecef32ec70c7841ca2a54b09c73167d940f0578bec91e874bb8cd42ba8f3", - "https://deno.land/std@0.219.0/streams/reader_from_stream_reader.ts": "dda702bd365a133be8bdbc5a1ba96c67b350c3504410632f3a833895bfc7bae3", - "https://deno.land/std@0.219.0/streams/text_delimiter_stream.ts": "94dfc900204e306496c1b58c80473db57b6097afdcb8ea9eaff453a193a659f1", - "https://deno.land/std@0.219.0/streams/text_line_stream.ts": "21f33d3922e019ec1a1676474beb543929cb564ec99b69cd2654e029e0f45bd5", - "https://deno.land/std@0.219.0/streams/to_array_buffer.ts": "1a9c07c4a396ce557ab205c44415815ab13b614fed94a12f62b80f8e650c726d", - "https://deno.land/std@0.219.0/streams/to_blob.ts": "bf5daaae50fa8f57e0c8bfd7474ebac16ac09e130e3d01ef2947ae5153912b4a", - "https://deno.land/std@0.219.0/streams/to_json.ts": "b6a908d0da7cd30956e5fbbfa7460747e50b8f307d1041282ed6fe9070d579ee", - "https://deno.land/std@0.219.0/streams/to_text.ts": "6f93593bdfc2cea5cca39755ea5caf0d4092580c0a713dfe04a1e85c60df331f", - "https://deno.land/std@0.219.0/streams/to_transform_stream.ts": "4c4836455ef89bab9ece55975ee3a819f07d3d8b0e43101ec7f4ed033c8a2b61", - "https://deno.land/std@0.219.0/streams/writable_stream_from_writer.ts": "62f2712d3a7bebd981fca8bd5140192c37450f9c4aa94283f7ca833e46bc7485", - "https://deno.land/std@0.219.0/streams/writer_from_stream_writer.ts": "b0e39ef607dfdc5abdfb627edf61a9672809463e2bb022afcbaf0cd006c40feb", - "https://deno.land/std@0.219.0/streams/zip_readable_streams.ts": "53eb10d7557539b489bd858907aab6dd28247f074b3446573801de3150cb932e", - "https://deno.land/std@0.219.0/yaml/_dumper/dumper.ts": "5a7b9b18e5b3f5e88b84d040c530b1f8e814c3565dfff7b7a5d16279bdf15ca4", - "https://deno.land/std@0.219.0/yaml/_dumper/dumper_state.ts": "ea262b459dc891c4828a0f814841abfe12d160d319c4b57eb11ed0c768cfcb6b", - "https://deno.land/std@0.219.0/yaml/_error.ts": "f38cdebdb69cde16903d9aa2f3b8a3dd9d13e5f7f3570bf662bfaca69fef669e", - "https://deno.land/std@0.219.0/yaml/_loader/loader.ts": "959c2ab7bbf5fb565bc3f3344f5e92b2712d39ea77a1e57039591696335c6d29", - "https://deno.land/std@0.219.0/yaml/_loader/loader_state.ts": "ee216de6040551940b85473c3185fdb7a6f3030b77153f87a6b7f63f82e489ea", - "https://deno.land/std@0.219.0/yaml/_mark.ts": "1d9d071f8c62d19f284ca4a5aae41680e67653a06a2a4b0eccf931fc5719afa1", - "https://deno.land/std@0.219.0/yaml/_state.ts": "f3b1c1fd11860302f1f33e35e9ce089bf069d4943e8d67516cd6bedbba058c13", - "https://deno.land/std@0.219.0/yaml/_type/binary.ts": "26216e8f306e62401ba00e306e93cdd5fb88da361cdaa567e63ee216dc3ebf93", - "https://deno.land/std@0.219.0/yaml/_type/bool.ts": "121743b23ba82a27ad6a3ec6298c7f5b0908f90e52707f8644a91f7ad51ed2ef", - "https://deno.land/std@0.219.0/yaml/_type/float.ts": "73295b7d8cc24edadfea5041e2255a6332e3491715e884e3bb7d03b563a90a81", - "https://deno.land/std@0.219.0/yaml/_type/function.ts": "bbf705058942bf3370604b37eb77a10aadd72f986c237c9f69b43378a42202c1", - "https://deno.land/std@0.219.0/yaml/_type/int.ts": "c2dc88438a60fccc8d2226042bd18b9967753adaf6bd145feb8b99d567e432ce", - "https://deno.land/std@0.219.0/yaml/_type/map.ts": "ae2acb1cb837fb8e96c75c98611cfd45af847d0114ab5336333c318e7d4b12f4", - "https://deno.land/std@0.219.0/yaml/_type/merge.ts": "ad0d971f91d2fb9f4ab3eba0c837eae357b1804d6b798adc99dc917bc5306b11", - "https://deno.land/std@0.219.0/yaml/_type/mod.ts": "e8929d7b1c969a74f76338d4eb380ef8c4a26cd6441117d521f076b766e9c265", - "https://deno.land/std@0.219.0/yaml/_type/nil.ts": "cbe4387d02d5933322c21b25d8955c5e6228c492e391a6fb82dcf4f498cc421c", - "https://deno.land/std@0.219.0/yaml/_type/omap.ts": "cda915105ab22ba9e1d6317adacee8eec2d8ddaf864cc2f814e3e476946e72c6", - "https://deno.land/std@0.219.0/yaml/_type/pairs.ts": "f97d7dc2b3fa18e246763f44147f6df0d6036c7e122af3e7b6692e4a6b0e289f", - "https://deno.land/std@0.219.0/yaml/_type/regexp.ts": "e49eb9e1c9356fd142bc15f7f323820d411fcc537b5ba3896df9a8b812d270a4", - "https://deno.land/std@0.219.0/yaml/_type/seq.ts": "2deffc7f970869bc01a1541b4961d076329a1c2b30b95e07918f3132db7c3fe2", - "https://deno.land/std@0.219.0/yaml/_type/set.ts": "be8a9e7237a7ffc92dfbe7f5e552d84b7eeba60f3f73cc77fc3c59d3506c74ea", - "https://deno.land/std@0.219.0/yaml/_type/str.ts": "88f0a1ba12295520cd57e96cd78d53aa0787d53c7a1c506155f418c496c2f550", - "https://deno.land/std@0.219.0/yaml/_type/timestamp.ts": "57a6bb4a0f0bd5eab85a1f0ee5ac8820fd3125ea939dc8a037de997a2b6ad05d", - "https://deno.land/std@0.219.0/yaml/_type/undefined.ts": "9d215953c65740f1764e0bdca021007573473f0c49e087f00d9ff02817ecfc97", - "https://deno.land/std@0.219.0/yaml/_utils.ts": "91bbe28b5e7000b9594e40ff5353f8fe7a7ba914eec917e1202cbaf5ac931c58", - "https://deno.land/std@0.219.0/yaml/mod.ts": "54e9bfad77c8cd58f49b65f4d568045ff08989ed36318a2ca733a43cb6f1bc00", - "https://deno.land/std@0.219.0/yaml/parse.ts": "f45278d9ebccb789af4eceeffa5c291e194bcf1fa9aab1b34ff52c2bd4a9d886", - "https://deno.land/std@0.219.0/yaml/schema.ts": "dae089ffa1ac4a2b031176aa019e126be6f7230a3011de38463ead8639b14739", - "https://deno.land/std@0.219.0/yaml/schema/core.ts": "1222f9401e2a0c1d38e63d753da98be333e61a6032335e9c46a68bd45ecce85a", - "https://deno.land/std@0.219.0/yaml/schema/default.ts": "b77c71cfd453951dd828e5f2f02f9f37335c9c0a49c8051d1a9653fa82357740", - "https://deno.land/std@0.219.0/yaml/schema/extended.ts": "996da59626409047b5c1a2d68bdbeead43914cedede47c5923e80ae4febe7d24", - "https://deno.land/std@0.219.0/yaml/schema/failsafe.ts": "24b2b630cef6fcce7de6d29db651523b0f49e5691d690931c42ecf4823837fdb", - "https://deno.land/std@0.219.0/yaml/schema/json.ts": "0fb9268282d266c24d963e75ef77f51accbbb74f40713a99e83ad621a81bc9ae", - "https://deno.land/std@0.219.0/yaml/schema/mod.ts": "9bf7ff80c2a246f781bdcab979211d0389760831a974cf5883bf2016567e3507", - "https://deno.land/std@0.219.0/yaml/stringify.ts": "580f8b2fa56e3233424520d8242f4fc0edf41ac54a6a6d2f6f8e0b6e99cd63c0", - "https://deno.land/std@0.219.0/yaml/type.ts": "708dde5f20b01cc1096489b7155b6af79a217d585afb841128e78c3c2391eb5c", - "https://deno.land/x/code_block_writer@12.0.0/mod.ts": "2c3448060e47c9d08604c8f40dee34343f553f33edcdfebbf648442be33205e5", - "https://deno.land/x/code_block_writer@12.0.0/utils/string_utils.ts": "60cb4ec8bd335bf241ef785ccec51e809d576ff8e8d29da43d2273b69ce2a6ff", - "https://deno.land/x/compress@v0.4.5/deps.ts": "096395daebc7ed8a18f0484e4ffcc3a7f70e50946735f7df9611a7fcfd8272cc", - "https://deno.land/x/compress@v0.4.5/gzip/gzip.ts": "4bf22e9cd3368332928324dd9443ef72cabd05e9234e5a37dd7b3517d50e945e", - "https://deno.land/x/compress@v0.4.5/gzip/gzip_file.ts": "b044ec0df4266c084baa033a4ab5394882e44a86d09d5616636467dcb39c671d", - "https://deno.land/x/compress@v0.4.5/gzip/gzip_stream.ts": "6781cf0e47648e3e5631cba4cc2cd018a24935ce09fdaa86e0cabcf78b5012df", - "https://deno.land/x/compress@v0.4.5/gzip/mod.ts": "4ade8edbe01b54a84f289351e137ebdfc040a74cd616636770cf1724fbf522d1", - "https://deno.land/x/compress@v0.4.5/gzip/writer_gunzip.ts": "5aba34394820b835c414048ac2e15f52d443f1f773ebe61fd2517c938572d616", - "https://deno.land/x/compress@v0.4.5/gzip/writer_gzip.ts": "c7aad0c51ab4f5952c068088186339cfc79a2ee1e057d6e16731b1175f342645", - "https://deno.land/x/compress@v0.4.5/interface.ts": "fc5f87bd208ab8a03a1f65972b11781967c3d21c3d756fe9ae99ca98e10e5780", - "https://deno.land/x/compress@v0.4.5/mod.ts": "ae8b15826334021583a5bd1978c63840f85156ea3635f5941bfc6733aad247e5", - "https://deno.land/x/compress@v0.4.5/tar/mod.ts": "6d9073005e678479908047cbe9e4716e484f80d1f2a1e15d3d6ac92213ffaeba", - "https://deno.land/x/compress@v0.4.5/tgz/mod.ts": "2fd4e99f26b57b0055d4d2f87721682304541ed1ca41bbb49c034d121f936f00", - "https://deno.land/x/compress@v0.4.5/utils/uint8.ts": "9c82e09c065f1f4bc648e3b14df441b43a7960fc7bdb29e9fb8d3a69c7e9d425", - "https://deno.land/x/compress@v0.4.5/zlib/deflate.ts": "e1e3b406dcc3e20021e53cde427b4b9ced752b72df820de73fec17c6e5ba999e", - "https://deno.land/x/compress@v0.4.5/zlib/inflate.ts": "618cc3dd25d202bf6b89d92f3ab2865e7495884cafce950638c77cbc1537aeb1", - "https://deno.land/x/compress@v0.4.5/zlib/mod.ts": "4dca9c1e934b7ab27f31c318abd7bfd39b09be96fd76ba27bd46f3a4e73b4ad0", - "https://deno.land/x/compress@v0.4.5/zlib/zlib/adler32.ts": "e34c7596d63a655755c4b0a44a40d4f9c1d1c4d3b891e5c1f3f840f8939e1940", - "https://deno.land/x/compress@v0.4.5/zlib/zlib/crc32.ts": "b9bc4adaf327d32585205d1176bd52f6453c06dd1040544611d4c869e638119c", - "https://deno.land/x/compress@v0.4.5/zlib/zlib/deflate.ts": "8d1dd88630279313e50deed4fe5feefe8128307cc48fa560e659b5234ab09d83", - "https://deno.land/x/compress@v0.4.5/zlib/zlib/gzheader.ts": "11e6da7383447aae9791308dc2350a809fa341a876a2da396b03a2a31408c20c", - "https://deno.land/x/compress@v0.4.5/zlib/zlib/inffast.ts": "282daf5ea16bb876d26e342f3c24fe1a8ec84640e713a970b02232955a853f86", - "https://deno.land/x/compress@v0.4.5/zlib/zlib/inflate.ts": "76751c1a5b18d70a929fa31ce4959db0bde1b9097bfa1b5ea3b4d1fba2ab92fa", - "https://deno.land/x/compress@v0.4.5/zlib/zlib/inftrees.ts": "8a6d765a5c42bf3b6990060cabbe52e88493f8ce6d082e6e35d97756914cfb8e", - "https://deno.land/x/compress@v0.4.5/zlib/zlib/messages.ts": "c82229bd67ccc3b6162f3aca1c5e7f936e546aa91ac9a9ac4fcfefc3a9dc5ac8", - "https://deno.land/x/compress@v0.4.5/zlib/zlib/status.ts": "5987864d2d43d59bbbfa2e6ef4d5a07284c1d10489cc5843ddf41ac547957ac3", - "https://deno.land/x/compress@v0.4.5/zlib/zlib/trees.ts": "6b65a767646e031e87e7b725ffad0c511fe701f393a01652e1e7ee8884f60fee", - "https://deno.land/x/compress@v0.4.5/zlib/zlib/zstream.ts": "c110fd5919235e317d64933852e24a1bba0126202be592e90e58f7b19315ad93", - "https://deno.land/x/convert_bytes@v2.1.1/mod.ts": "036bd2d9519c8ad44bd5a15d4e42123dc16843f793b3c81ca1fca905b21dd7df", - "https://deno.land/x/convert_bytes@v2.1.1/src/utility.ts": "a94b4c50286910a23a90c0a0510e8191fa3311dec44d062a6d4fe3d5b7ff8176", - "https://deno.land/x/crc32@v0.2.0/mod.ts": "de7a3fa2d4ef24b96fc21e1cc4d2d65d1d2b1dcea92f63960e3e11bfa82df0fa", - "https://deno.land/x/deno_cache@0.5.2/auth_tokens.ts": "5d1d56474c54a9d152e44d43ea17c2e6a398dd1e9682c69811a313567c01ee1e", - "https://deno.land/x/deno_cache@0.5.2/cache.ts": "92ce8511e1e5c00fdf53a41619aa77d632ea8e0fc711324322e4d5ebf8133911", - "https://deno.land/x/deno_cache@0.5.2/deno_dir.ts": "1ea355b8ba11c630d076b222b197cfc937dd81e5a4a260938997da99e8ff93a0", - "https://deno.land/x/deno_cache@0.5.2/deps.ts": "26a75905652510b76e54b6d5ef3cf824d1062031e00782efcd768978419224e7", - "https://deno.land/x/deno_cache@0.5.2/dirs.ts": "009c6f54e0b610914d6ce9f72f6f6ccfffd2d47a79a19061e0a9eb4253836069", - "https://deno.land/x/deno_cache@0.5.2/disk_cache.ts": "66a1e604a8d564b6dd0500326cac33d08b561d331036bf7272def80f2f7952aa", - "https://deno.land/x/deno_cache@0.5.2/file_fetcher.ts": "89616c50b6df73fb04e73d0b7cd99e5f2ed7967386913d65b9e8baa4238501f7", - "https://deno.land/x/deno_cache@0.5.2/http_cache.ts": "407135eaf2802809ed373c230d57da7ef8dff923c4abf205410b9b99886491fd", - "https://deno.land/x/deno_cache@0.5.2/lib/deno_cache_dir.generated.js": "18b6526d0c50791a73dd0eb894e99de1ac05ee79dcbd53298ff5b5b6b0757fe6", - "https://deno.land/x/deno_cache@0.5.2/lib/snippets/deno_cache_dir-77bed54ace8005e0/fs.js": "cbe3a976ed63c72c7cb34ef845c27013033a3b11f9d8d3e2c4aa5dda2c0c7af6", - "https://deno.land/x/deno_cache@0.5.2/mod.ts": "0b4d071ad095128bdc2b1bc6e5d2095222dcbae08287261690ee9757e6300db6", - "https://deno.land/x/deno_cache@0.5.2/util.ts": "f3f5a0cfc60051f09162942fb0ee87a0e27b11a12aec4c22076e3006be4cc1e2", - "https://deno.land/x/dir@1.5.1/data_local_dir/mod.ts": "91eb1c4bfadfbeda30171007bac6d85aadacd43224a5ed721bbe56bc64e9eb66", - "https://deno.land/x/djwt@v2.7/algorithm.ts": "ba9941961c46838f35a507414407e48aa9a4eca69c679b04fbbede55fe276a09", - "https://deno.land/x/djwt@v2.7/deps.ts": "a5d7952aaf7fad421717c9a2db0b2e736b409632cb70f3f7f9e68f8e96e04f45", - "https://deno.land/x/djwt@v2.7/mod.ts": "08cb2c745c9bc33883c2d027fc4af5c157f0a30564c3ba503a56fe0ab6959c8e", - "https://deno.land/x/djwt@v2.7/signature.ts": "f79b4e521cd6a6dff28cd2779b1d9f2059f9e0822fb99c9f747ff34ae26532e4", - "https://deno.land/x/dnt@0.38.1/lib/compiler.ts": "209ad2e1b294f93f87ec02ade9a0821f942d2e524104552d0aa8ff87021050a5", - "https://deno.land/x/dnt@0.38.1/lib/compiler_transforms.ts": "f21aba052f5dcf0b0595c734450842855c7f572e96165d3d34f8fed2fc1f7ba1", - "https://deno.land/x/dnt@0.38.1/lib/mod.deps.ts": "30367fc68bcd2acf3b7020cf5cdd26f817f7ac9ac35c4bfb6c4551475f91bc3e", - "https://deno.land/x/dnt@0.38.1/lib/npm_ignore.ts": "57fbb7e7b935417d225eec586c6aa240288905eb095847d3f6a88e290209df4e", - "https://deno.land/x/dnt@0.38.1/lib/package_json.ts": "61f35b06e374ed39ca776d29d67df4be7ee809d0bca29a8239687556c6d027c2", - "https://deno.land/x/dnt@0.38.1/lib/pkg/dnt_wasm.generated.js": "cfb352ae839865f5698c9b35099d4c783510195a1e3c9f9b04d94fac86394ed9", - "https://deno.land/x/dnt@0.38.1/lib/pkg/snippets/dnt-wasm-a15ef721fa5290c5/helpers.js": "45f74f00472b3a399bc16e5dc056966b55dcdd8fa2bd61505c6dfd2f5d33b9f4", - "https://deno.land/x/dnt@0.38.1/lib/shims.ts": "df1bd4d9a196dca4b2d512b1564fff64ac6c945189a273d706391f87f210d7e6", - "https://deno.land/x/dnt@0.38.1/lib/test_runner/get_test_runner_code.ts": "4dc7a73a13b027341c0688df2b29a4ef102f287c126f134c33f69f0339b46968", - "https://deno.land/x/dnt@0.38.1/lib/test_runner/test_runner.ts": "4d0da0500ec427d5f390d9a8d42fb882fbeccc92c92d66b6f2e758606dbd40e6", - "https://deno.land/x/dnt@0.38.1/lib/transform.deps.ts": "e42f2bdef46d098453bdba19261a67cf90b583f5d868f7fe83113c1380d9b85c", - "https://deno.land/x/dnt@0.38.1/lib/types.ts": "b8e228b2fac44c2ae902fbb73b1689f6ab889915bd66486c8a85c0c24255f5fb", - "https://deno.land/x/dnt@0.38.1/lib/utils.ts": "878b7ac7003a10c16e6061aa49dbef9b42bd43174853ebffc9b67ea47eeb11d8", - "https://deno.land/x/dnt@0.38.1/mod.ts": "b13349fe77847cf58e26b40bcd58797a8cec5d71b31a1ca567071329c8489de1", - "https://deno.land/x/dnt@0.38.1/transform.ts": "f68743a14cf9bf53bfc9c81073871d69d447a7f9e3453e0447ca2fb78926bb1d", - "https://deno.land/x/fuse@v6.4.1/dist/fuse.esm.min.js": "02034c3e0a1d7f4d207ecd104c9cde1bab116d474dc60c2a019e9d4353455ff4", - "https://deno.land/x/levenshtein@v1.0.1/mod.ts": "6b632d4a9bb11ba6d5d02a770c7fc9b0a4125f30bd9c668632ff85e7f05ff4f6", - "https://deno.land/x/monads@v0.5.10/either/either.ts": "89f539c7d50bd0ee8d9b902f37ef16687c19b62cc9dd23454029c97fbfc15cc6", - "https://deno.land/x/monads@v0.5.10/index.ts": "f0e90b8c1dd767efca137d682ac1a19b2dbae4d1990b8a79a40b4e054c69b3d6", - "https://deno.land/x/monads@v0.5.10/mod.ts": "f1b16a34d47e58fdf9f1f54c49d2fe6df67b3d2e077e21638f25fbe080eee6cf", - "https://deno.land/x/monads@v0.5.10/option/option.ts": "76ef03c3370207112759f932f39aab04999cdd1a5c5a954769b3868602faf883", - "https://deno.land/x/monads@v0.5.10/result/result.ts": "bb482b7b90949d3a67e78b4b0dd949774eccaa808df39ac83f6a585526edeb37", - "https://deno.land/x/oauth2_client@v1.0.2/mod.ts": "ea54c0a894d3303a80552ca65835b5b104d16415343b24e191f08e7f5db90ff7", - "https://deno.land/x/oauth2_client@v1.0.2/src/authorization_code_grant.ts": "36953750b75fb0a14fbf4e0e4bcc1d5ae0209d216d7b32f93a134b035ecf3d25", - "https://deno.land/x/oauth2_client@v1.0.2/src/client_credentials_grant.ts": "5bb9869925c5f5d11e8d66a86da37e2353107d57f57ec3a1480e197462e79be5", - "https://deno.land/x/oauth2_client@v1.0.2/src/errors.ts": "7603479b80386b5cc7e384c2af5f5262ed7c2123e4e297d9f21e95515f8a803a", - "https://deno.land/x/oauth2_client@v1.0.2/src/grant_base.ts": "86ae9eb3495f2304a634498fbb83741c5dc0e1357e02c40e12e212de5e9750f7", - "https://deno.land/x/oauth2_client@v1.0.2/src/implicit_grant.ts": "d5359aebbdaaff039c0d078890aa4ffa2869da19c521e535e15caf09c069e6b8", - "https://deno.land/x/oauth2_client@v1.0.2/src/oauth2_client.ts": "4e5ec26676661a3f69544826a4c27b30cc07dfcfc77f86981c324aaa53291a11", - "https://deno.land/x/oauth2_client@v1.0.2/src/pkce.ts": "d286a087cc8ef985b71a2bf391e9e9d86a78ac6d93e30c46e73006171aed0986", - "https://deno.land/x/oauth2_client@v1.0.2/src/refresh_token_grant.ts": "22cb1598e48fb037b4111a446573f7b48a3b361b58de58af17ba097221b12b54", - "https://deno.land/x/oauth2_client@v1.0.2/src/resource_owner_password_credentials.ts": "bd3df99d32eeebffb411c4a2d3c3d057395515fb41690a8d91460dd74b9bf466", - "https://deno.land/x/oauth2_client@v1.0.2/src/types.ts": "3327c2e81bc483e91843fb103595dd304393c3ac2a530d1c89200b6a5cf75e13", - "https://deno.land/x/redis@v0.32.1/backoff.ts": "33e4a6e245f8743fbae0ce583993a671a3ac2ecee433a3e7f0bd77b5dd541d84", - "https://deno.land/x/redis@v0.32.1/command.ts": "aa2312d4093ec7c72d61d32a71d3d13a33cc6302ca78c8f026e1994e76541e6e", - "https://deno.land/x/redis@v0.32.1/connection.ts": "45a3328ca49c021c9192c48510dba9808b29de4d8e65e424d7a6a1e2d782fd74", - "https://deno.land/x/redis@v0.32.1/errors.ts": "4c47b278c8a87e0f49c0f7a96c74c5bee09e4d5ea19f892923b0281707112d04", - "https://deno.land/x/redis@v0.32.1/executor.ts": "5ac4c1f7bec44d12ebc0f3702bf074bd3ba6c1aae74953582f6358d2948718e7", - "https://deno.land/x/redis@v0.32.1/internal/encoding.ts": "0525f7f444a96b92cd36423abdfe221f8d8de4a018dc5cb6750a428a5fc897c2", - "https://deno.land/x/redis@v0.32.1/internal/symbols.ts": "e36097bab1da1c9fe84a3bb9cb0ed1ec10c3dc7dd0b557769c5c54e15d110dd2", - "https://deno.land/x/redis@v0.32.1/mod.ts": "a2a2318e67db704c799a13cc840114b9f344a82cf682c933a293e90b1a02b3fa", - "https://deno.land/x/redis@v0.32.1/pipeline.ts": "f0ec80f58a88e9b9b157155882c2bb3568890e6b4d67ad99760a6fc2c51b47ba", - "https://deno.land/x/redis@v0.32.1/protocol/deno_streams/command.ts": "8e1e84f6d94637d8814abfac91de0916e97c6ea7d2ccab9ea9e3c9f2de283602", - "https://deno.land/x/redis@v0.32.1/protocol/deno_streams/mod.ts": "346d473bd4e834e397ca25bbbf1021f44e577adda8d6391a41bd03b7bc8c72f4", - "https://deno.land/x/redis@v0.32.1/protocol/deno_streams/reply.ts": "2707e9fe18608c1a9a49b4f0094397c7400141b8208170c7bcb128ceb5ddd790", - "https://deno.land/x/redis@v0.32.1/protocol/shared/command.ts": "71639adc162dac95fa41d701a7112bcd5d5cf3fd22c1307c8840f983628540be", - "https://deno.land/x/redis@v0.32.1/protocol/shared/protocol.ts": "5b9284ee28ec74dfc723c7c7f07dca8d5f9d303414f36689503622dfdde12551", - "https://deno.land/x/redis@v0.32.1/protocol/shared/reply.ts": "3311ff66357bacbd60785cb43b97539c341d8a7d963bc5e80cb864ac81909ea5", - "https://deno.land/x/redis@v0.32.1/protocol/shared/types.ts": "3d1ff5983abc1e4e56c751aaf4672042c87334cd004ce2fc0493575432151e1f", - "https://deno.land/x/redis@v0.32.1/pubsub.ts": "a36892455b0a4a50af169332a165b0985cc90d84486087f036e507e3137b2afb", - "https://deno.land/x/redis@v0.32.1/redis.ts": "6ec7be95f64174078279518afff0535d04d7f96d90da36f2e9a9ab9f388cbaa1", - "https://deno.land/x/redis@v0.32.1/stream.ts": "73b286174d4a02006720c9e2d193754d10e041e8e1450188e32f203a188bbecb", - "https://deno.land/x/redis@v0.32.1/vendor/https/deno.land/std/async/delay.ts": "7315c16b92e21d527d1acc7cced18c09d081c8a1efa2a993f7c039cf21ad1d54", - "https://deno.land/x/redis@v0.32.1/vendor/https/deno.land/std/bytes/concat.ts": "de0d17d9c07f9f87c353ce9df27ef5d7409d0ededf0885f50646336788920dbd", - "https://deno.land/x/redis@v0.32.1/vendor/https/deno.land/std/io/buf_reader.ts": "6529a1668e0054cb788e8a01d8c704c01e013698c6cd5bb141a35a2971cc9fe1", - "https://deno.land/x/redis@v0.32.1/vendor/https/deno.land/std/io/buf_writer.ts": "0dbd95b759fe47e53f99a4945e66673af581ebccfebd2ab4c764c3b09d10ea51", - "https://deno.land/x/ts_morph@18.0.0/bootstrap/mod.ts": "b53aad517f106c4079971fcd4a81ab79fadc40b50061a3ab2b741a09119d51e9", - "https://deno.land/x/ts_morph@18.0.0/bootstrap/ts_morph_bootstrap.js": "6645ac03c5e6687dfa8c78109dc5df0250b811ecb3aea2d97c504c35e8401c06", - "https://deno.land/x/ts_morph@18.0.0/common/DenoRuntime.ts": "6a7180f0c6e90dcf23ccffc86aa8271c20b1c4f34c570588d08a45880b7e172d", - "https://deno.land/x/ts_morph@18.0.0/common/mod.ts": "01985d2ee7da8d1caee318a9d07664774fbee4e31602bc2bb6bb62c3489555ed", - "https://deno.land/x/ts_morph@18.0.0/common/ts_morph_common.js": "845671ca951073400ce142f8acefa2d39ea9a51e29ca80928642f3f8cf2b7700", - "https://deno.land/x/ts_morph@18.0.0/common/typescript.js": "d5c598b6a2db2202d0428fca5fd79fc9a301a71880831a805d778797d2413c59", - "https://deno.land/x/wasmbuild@0.15.0/cache.ts": "89eea5f3ce6035a1164b3e655c95f21300498920575ade23161421f5b01967f4", - "https://deno.land/x/wasmbuild@0.15.0/loader.ts": "d98d195a715f823151cbc8baa3f32127337628379a02d9eb2a3c5902dbccfc02", - "https://deno.land/x/xhr@0.3.0/mod.ts": "094aacd627fd9635cd942053bf8032b5223b909858fa9dc8ffa583752ff63b20", - "https://deno.land/x/zod@v3.22.2/ZodError.ts": "4de18ff525e75a0315f2c12066b77b5c2ae18c7c15ef7df7e165d63536fdf2ea", - "https://deno.land/x/zod@v3.22.2/errors.ts": "5285922d2be9700cc0c70c95e4858952b07ae193aa0224be3cbd5cd5567eabef", - "https://deno.land/x/zod@v3.22.2/external.ts": "a6cfbd61e9e097d5f42f8a7ed6f92f93f51ff927d29c9fbaec04f03cbce130fe", - "https://deno.land/x/zod@v3.22.2/helpers/enumUtil.ts": "54efc393cc9860e687d8b81ff52e980def00fa67377ad0bf8b3104f8a5bf698c", - "https://deno.land/x/zod@v3.22.2/helpers/errorUtil.ts": "7a77328240be7b847af6de9189963bd9f79cab32bbc61502a9db4fe6683e2ea7", - "https://deno.land/x/zod@v3.22.2/helpers/parseUtil.ts": "f791e6e65a0340d85ad37d26cd7a3ba67126cd9957eac2b7163162155283abb1", - "https://deno.land/x/zod@v3.22.2/helpers/partialUtil.ts": "998c2fe79795257d4d1cf10361e74492f3b7d852f61057c7c08ac0a46488b7e7", - "https://deno.land/x/zod@v3.22.2/helpers/typeAliases.ts": "0fda31a063c6736fc3cf9090dd94865c811dfff4f3cb8707b932bf937c6f2c3e", - "https://deno.land/x/zod@v3.22.2/helpers/util.ts": "8baf19b19b2fca8424380367b90364b32503b6b71780269a6e3e67700bb02774", - "https://deno.land/x/zod@v3.22.2/index.ts": "d27aabd973613985574bc31f39e45cb5d856aa122ef094a9f38a463b8ef1a268", - "https://deno.land/x/zod@v3.22.2/locales/en.ts": "a7a25cd23563ccb5e0eed214d9b31846305ddbcdb9c5c8f508b108943366ab4c", - "https://deno.land/x/zod@v3.22.2/mod.ts": "64e55237cb4410e17d968cd08975566059f27638ebb0b86048031b987ba251c4", - "https://deno.land/x/zod@v3.22.2/types.ts": "18cbe3d895f42977c43fa9411da214b06d0d682cf2f4c9dd26cc8c3737740d40", - "https://esm.sh/@aws-sdk/client-s3@3.335.0?pin=v131": "0633878ddbd4e8d10cb685fedd109df3480c2536e72702c62f7e3b010ab912fc", - "https://esm.sh/@aws-sdk/s3-request-presigner@3.335.0?pin=v131": "f32c826ef4de3839aca3e48ed856426019a2f16cc787e1c09d2214d24dd448cb", - "https://esm.sh/v131/@aws-crypto/crc32@3.0.0/denonext/crc32.mjs": "a7b2905678c9acb4294fedf6f75c0d01c2a7c4a031acea1c816fd22b1372ad4a", - "https://esm.sh/v131/@aws-crypto/crc32c@3.0.0/denonext/crc32c.mjs": "b5b36bedb1a00f79183720f5d4c54cb672e8f9877ca820550bb333f778ce912e", - "https://esm.sh/v131/@aws-crypto/ie11-detection@3.0.0/denonext/ie11-detection.mjs": "7cbccafb093d6c2c1a5b9f3e8535533220cc612dfb2bf228ea793e69376f8a0f", - "https://esm.sh/v131/@aws-crypto/sha1-browser@3.0.0/denonext/sha1-browser.mjs": "8d00cbfad40fad9737dde1e190e26bd6c0f7925c1aff7c2c1685b825d817e57c", - "https://esm.sh/v131/@aws-crypto/sha256-browser@3.0.0/denonext/sha256-browser.mjs": "55e8c7cf121d71c0001a16e8c6eae414c626f37bc894c4f43cd5796c084caf00", - "https://esm.sh/v131/@aws-crypto/sha256-js@3.0.0/denonext/sha256-js.mjs": "ba78960638c2969e03f6f69175ab51e0aa1167196a32f4baa2d9a3be54c7be2a", - "https://esm.sh/v131/@aws-crypto/supports-web-crypto@3.0.0/denonext/supports-web-crypto.mjs": "361a53acba49a257feed671c9636779f9884723d590a22db56d7a00731dc435c", - "https://esm.sh/v131/@aws-crypto/util@3.0.0/denonext/util.mjs": "2f9527b5030c246599f883288161258583d6edb7eec6567119a9e48b0166b460", - "https://esm.sh/v131/@aws-sdk/chunked-blob-reader@3.310.0/denonext/chunked-blob-reader.mjs": "4401b1a6c954c398db355225a6d937e9403192f9e79310be7ff22c2a33e05f14", - "https://esm.sh/v131/@aws-sdk/client-s3@3.335.0/denonext/client-s3.mjs": "2990cd07204aac8c6c4046f19d5b33c71d37e36a9335ef7346025e8b2f0e1d9c", - "https://esm.sh/v131/@aws-sdk/config-resolver@3.329.0/denonext/config-resolver.mjs": "00b134417c639e27b2107d74ebf91ed93c603b91733f1c4ada4cd8cf3da3527b", - "https://esm.sh/v131/@aws-sdk/eventstream-codec@3.329.0/denonext/eventstream-codec.mjs": "2671176e614b701e53f3982689898875862be983427d78c69be6aab4b4a4ad53", - "https://esm.sh/v131/@aws-sdk/eventstream-serde-browser@3.329.0/denonext/eventstream-serde-browser.mjs": "40d2cdd4cd67f08266b299b36e5d1741c0a258897c565a9eecd63d3ca1d03c91", - "https://esm.sh/v131/@aws-sdk/eventstream-serde-config-resolver@3.329.0/denonext/eventstream-serde-config-resolver.mjs": "18ade7f876637f79053957e80bb0775c0bc78c357007cfa26a27a86931fc70a6", - "https://esm.sh/v131/@aws-sdk/eventstream-serde-universal@3.329.0/denonext/eventstream-serde-universal.mjs": "6a8fc6bc7d5f0801300340f8ab85ed4b7fbee303359767702791e51ea68e3457", - "https://esm.sh/v131/@aws-sdk/fetch-http-handler@3.329.0/denonext/fetch-http-handler.mjs": "d6d30c1712ac8e300af4fb082e6093a07aa607c50d0db61a7b25126bbff3a794", - "https://esm.sh/v131/@aws-sdk/hash-blob-browser@3.329.0/denonext/hash-blob-browser.mjs": "b34c3fd7f2faf2f60e99834a354d35067602f6a8d479f1a29f2196f0986ae65b", - "https://esm.sh/v131/@aws-sdk/invalid-dependency@3.329.0/denonext/invalid-dependency.mjs": "a2f92f8a138d476805c719a2c03f069460c3b6c7842ca86dc93edcedaa0206cd", - "https://esm.sh/v131/@aws-sdk/is-array-buffer@3.310.0/denonext/is-array-buffer.mjs": "6e439346764944fba7c50cc310a0d7d2242e87aaaf4fc342095422ff766bb9ee", - "https://esm.sh/v131/@aws-sdk/md5-js@3.329.0/denonext/md5-js.mjs": "b835157ac7a0bfe2c88a83a2b098fe92b6dfddcc8776b4a315ca238175394a62", - "https://esm.sh/v131/@aws-sdk/middleware-content-length@3.329.0/denonext/middleware-content-length.mjs": "0f170830741c27fbd2c274deb09d5d16545ee899c1be4ab7254a43b103b96bf0", - "https://esm.sh/v131/@aws-sdk/middleware-endpoint@3.329.0/denonext/middleware-endpoint.mjs": "aa77d6acf58e7fb12585b8d0b9d42a6cd188b6046b50dd2fe9002c52abd7014b", - "https://esm.sh/v131/@aws-sdk/middleware-expect-continue@3.329.0/denonext/middleware-expect-continue.mjs": "c8eb9ae0fbb9bd182eb84d0ceb68e8142c951cc6a6e35b2b6d6e27a21048fc80", - "https://esm.sh/v131/@aws-sdk/middleware-flexible-checksums@3.331.0/denonext/middleware-flexible-checksums.mjs": "999978cc064148fe7081eaccadd3bc8ac9b063fb550620a981cf81597d1f01a7", - "https://esm.sh/v131/@aws-sdk/middleware-host-header@3.329.0/denonext/middleware-host-header.mjs": "c0e33ae2c1dd2ad52ce753f5d9035e244fd7780dd15d499422ab2e4c7234e085", - "https://esm.sh/v131/@aws-sdk/middleware-location-constraint@3.329.0/denonext/middleware-location-constraint.mjs": "d58ff62eb0db60c6f3811ddc4f7a0ac48df1f76d2ba430a89fec2b829cd15cf0", - "https://esm.sh/v131/@aws-sdk/middleware-logger@3.329.0/denonext/middleware-logger.mjs": "3edceb18bf204dbc9a0fc4e9801f8aea23b5652dbb920fd05d3a70b37ff83d09", - "https://esm.sh/v131/@aws-sdk/middleware-recursion-detection@3.329.0/denonext/middleware-recursion-detection.mjs": "1998b36c65ed29e70cafc9b7dbad528a345ff7078d3e73e7ae9b6b838af942a5", - "https://esm.sh/v131/@aws-sdk/middleware-retry@3.329.0/denonext/middleware-retry.mjs": "2f7e543d69c95305999b2aa7b079c23a02d870b18d85d6d44ffbab001ded7e81", - "https://esm.sh/v131/@aws-sdk/middleware-sdk-s3@3.329.0/denonext/middleware-sdk-s3.mjs": "8084087a54dba109fd3e29782f25da7996d4f1f4bae5517c9d2fbaf3b36d8d2a", - "https://esm.sh/v131/@aws-sdk/middleware-serde@3.329.0/denonext/middleware-serde.mjs": "6cc2658658bbed61570b1aa86022af3c009ade420c5689a060c741a411f07306", - "https://esm.sh/v131/@aws-sdk/middleware-signing@3.329.0/denonext/middleware-signing.mjs": "caa4a5eeaac855c555cec5f51b8780ea77aa72ac7759a535d1e3a27b79e2c51c", - "https://esm.sh/v131/@aws-sdk/middleware-ssec@3.329.0/denonext/middleware-ssec.mjs": "893e62fa5b5981e8801273220f8af582974bc7ec19a75ae7be34da5fe55acfd6", - "https://esm.sh/v131/@aws-sdk/middleware-stack@3.329.0/denonext/middleware-stack.mjs": "fb99b7b75f28f75710d7c4335eed550049b5fb3a88bb803c9144dc94027126e4", - "https://esm.sh/v131/@aws-sdk/middleware-user-agent@3.332.0/denonext/middleware-user-agent.mjs": "59435f9dd7f0fb160500eada671164fb0f4d518213f8b474a91b54106d5b54b1", - "https://esm.sh/v131/@aws-sdk/property-provider@3.329.0/denonext/property-provider.mjs": "bc96051e0fae3b0a01d011b1b8e247ebf89caa52fbd3522fab77728f4f639345", - "https://esm.sh/v131/@aws-sdk/protocol-http@3.329.0/denonext/protocol-http.mjs": "4256a8110ed08f52124aac742d8df429d84b0b55b29147ebfa5b5db44b2990f6", - "https://esm.sh/v131/@aws-sdk/querystring-builder@3.329.0/denonext/querystring-builder.mjs": "cf0776b4fcc30f0b4911011e5184eb0d996c6e1c045d63c7c0ac8f75507982f0", - "https://esm.sh/v131/@aws-sdk/querystring-parser@3.329.0/denonext/querystring-parser.mjs": "40ff8f84d555f74f8996757645b31276755755412865833e1c2b73cb3c099233", - "https://esm.sh/v131/@aws-sdk/s3-request-presigner@3.335.0/denonext/s3-request-presigner.mjs": "41551ded4796e73be68e20a9be5af919979e9f15ef47808cd677e77577c69050", - "https://esm.sh/v131/@aws-sdk/service-error-classification@3.329.0/denonext/service-error-classification.mjs": "8d188836f247e51643e694518958375d6c24f38f8115438052e95a6fe11e790c", - "https://esm.sh/v131/@aws-sdk/signature-v4-crt@3.391.0/denonext/signature-v4-crt.mjs": "6791fe556546ffea4a106d0a30fa54d351a57c1a8a7ad2de071e1d194e94b683", - "https://esm.sh/v131/@aws-sdk/signature-v4-multi-region@3.329.0/denonext/signature-v4-multi-region.mjs": "c85bd24f342d6d35e4bb63beb8b5b059c557955200dcea37ab29360305b4c748", - "https://esm.sh/v131/@aws-sdk/signature-v4@3.329.0/denonext/signature-v4.mjs": "d6643233bc5e5a566b52e805a649a3eb01b7e1c87af221ccf03337a34fff1807", - "https://esm.sh/v131/@aws-sdk/smithy-client@3.329.0/denonext/smithy-client.mjs": "da930042fd268a64eeb89bf7d5d83aaedcf97ab1abd0739ed2cc493ea56992e2", - "https://esm.sh/v131/@aws-sdk/types@3.329.0/denonext/types.mjs": "f687ff69c53e1af2cc7af841af00691674fbb22889d12a2ae8cb1517600ee67c", - "https://esm.sh/v131/@aws-sdk/url-parser@3.329.0/denonext/url-parser.mjs": "d5963d8f1e62a1f73b4af00ff2e8bed11dc69a39156251b44ce5e9d59add55c1", - "https://esm.sh/v131/@aws-sdk/util-arn-parser@3.310.0/denonext/util-arn-parser.mjs": "da6927c63827861d70a20f1581d399fd5510ebb311f6ba23bb4f41ee6cb13ee4", - "https://esm.sh/v131/@aws-sdk/util-base64@3.310.0/denonext/util-base64.mjs": "dfaecb0f8ce33d1b670861e3eb420e12990dbb71b42574c32064ae86d17d8df0", - "https://esm.sh/v131/@aws-sdk/util-body-length-browser@3.310.0/denonext/util-body-length-browser.mjs": "606de31e860d9a8ef454bde44a42b77311340567e9246b72c42b2c2c604dbd56", - "https://esm.sh/v131/@aws-sdk/util-config-provider@3.310.0/denonext/util-config-provider.mjs": "9c3b6a127cce262b43e339c7f26d8d5444fc887ccda27cc4ca5483e050dfb2cf", - "https://esm.sh/v131/@aws-sdk/util-defaults-mode-browser@3.329.0/denonext/util-defaults-mode-browser.mjs": "acc59887a35a66d5fdcaa2101ac0dcf71141d332b243dc6808534c6ed5212f77", - "https://esm.sh/v131/@aws-sdk/util-endpoints@3.332.0/denonext/util-endpoints.mjs": "02da62ce90e11394aa5428b17b48fdfa74ff81003a689a53b522541101a9608b", - "https://esm.sh/v131/@aws-sdk/util-format-url@3.329.0/denonext/util-format-url.mjs": "6dedc088febc86ddbb24ed628f818ae6caf13ccdedb7d369c1ecc7884e1d0e2b", - "https://esm.sh/v131/@aws-sdk/util-hex-encoding@3.310.0/denonext/util-hex-encoding.mjs": "a0eefaaeb52f512fda170d4ba78b87df41f2588efabc96bc998d12fe7af83c9e", - "https://esm.sh/v131/@aws-sdk/util-locate-window@3.310.0/denonext/util-locate-window.mjs": "894879f284b5a41fc830b8fe40e2a7038b124d5f5b7a3fde841c3314366c56c5", - "https://esm.sh/v131/@aws-sdk/util-middleware@3.329.0/denonext/util-middleware.mjs": "c9e423e7b96aa3eb038defc3b70a7db2e20260e504ec846cff5bd233f34fe09d", - "https://esm.sh/v131/@aws-sdk/util-retry@3.329.0/denonext/util-retry.mjs": "ed702a959997b4820d93bf89503decc8d5a9734729bdbe5bd247f2db693e680b", - "https://esm.sh/v131/@aws-sdk/util-stream-browser@3.329.0/denonext/util-stream-browser.mjs": "7cf71ee2a0a20b67ea57e6834e23bd5076ad74674418d65e8d924f33cc378a06", - "https://esm.sh/v131/@aws-sdk/util-uri-escape@3.310.0/denonext/util-uri-escape.mjs": "c0888b31da1e24f84ce208869244230c4f67caacddcdacdea70b3ae01c0c30bd", - "https://esm.sh/v131/@aws-sdk/util-user-agent-browser@3.329.0/denonext/util-user-agent-browser.mjs": "3fae0af61dd1d0a5764275b34f497ac9511e87529a0fa9f5a30ccfb2a2683856", - "https://esm.sh/v131/@aws-sdk/util-utf8-browser@3.259.0/denonext/util-utf8-browser.mjs": "79fc8ce5cd61204fe274363d637902a5d49ea40688e8d40cbd5b6ecf56f782b7", - "https://esm.sh/v131/@aws-sdk/util-utf8@3.310.0/denonext/util-utf8.mjs": "b988a756b1d6e53db92e105d52a25c298e6fdbd749d24e9ac70a688c96565dc8", - "https://esm.sh/v131/@aws-sdk/util-waiter@3.329.0/denonext/util-waiter.mjs": "756743c076c5ef4d9b842f239bfde5e28903641b2475c4bdbb411e01b445782f", - "https://esm.sh/v131/@aws-sdk/xml-builder@3.310.0/denonext/xml-builder.mjs": "66aa1e7ed650d5da4a99f3ca05f5026fa6efcff293f720221b6cd63102f33dad", - "https://esm.sh/v131/@httptoolkit/websocket-stream@6.0.1/denonext/websocket-stream.mjs": "c5819a529fab01eaa27ec17550cc7b9dae4d0e3e5552f81c0ecb37c746c025c2", - "https://esm.sh/v131/@smithy/eventstream-codec@2.0.2/denonext/eventstream-codec.mjs": "af08552ab22199c7071e6449046a87d5461cbb92ece49c565c11a3d01e3106bb", - "https://esm.sh/v131/@smithy/is-array-buffer@2.0.0/denonext/is-array-buffer.mjs": "8fcbe490a3730ac1eac71766b5e1cb41ccba2f2abf646badb0e50a95340b3623", - "https://esm.sh/v131/@smithy/protocol-http@1.2.0/denonext/protocol-http.mjs": "29f698026fbe2c9c139d356a8ca5f7e197fe34d4f5d9fb364da0a4340729aa12", - "https://esm.sh/v131/@smithy/querystring-parser@2.0.3/denonext/querystring-parser.mjs": "2f656d24d351a2f741fbe5dbeae352f51bf73d80258a0e2d39893c69786843c8", - "https://esm.sh/v131/@smithy/signature-v4@2.0.1/denonext/signature-v4.mjs": "01efbf6f929d92a7d01edc68f5e4d6488684d462c22383955cbf1a7ca5f2ac8e", - "https://esm.sh/v131/@smithy/types@1.2.0/denonext/types.mjs": "e7310b4830d09404b64c0e5512232b86d6374023aaf950049615b99caaed51ec", - "https://esm.sh/v131/@smithy/util-hex-encoding@2.0.0/denonext/util-hex-encoding.mjs": "48b73551d6dc8f87fff840debe36f207f56b04a36c3c21fe2099613457c9d22d", - "https://esm.sh/v131/@smithy/util-middleware@2.0.0/denonext/util-middleware.mjs": "89a29c46c58825db0566b99d517476aa973d4cc09fcd5e82413f018599db8f26", - "https://esm.sh/v131/@smithy/util-uri-escape@2.0.0/denonext/util-uri-escape.mjs": "1e46ae4ab088b9dfcb5dd73715de2a2530747e920cf5b405012aed7d944e2976", - "https://esm.sh/v131/@smithy/util-utf8@2.0.0/denonext/util-utf8.mjs": "c50f8d6d64a39a8717e88184dee0fec145cb2d17a0d0a456e007eae02062bae5", - "https://esm.sh/v131/aws-crt@1.15.16/denonext/aws-crt.mjs": "382aad6bd02cf4f568160bb79b01a47d0332aa4021e1451eaed0b74498d7de9c", - "https://esm.sh/v131/axios@0.24.0/denonext/axios.mjs": "895bb627711160f383d2674e7cae963f8e2734ed90b1972918a35f81d6139675", - "https://esm.sh/v131/bl@4.1.0/denonext/bl.mjs": "77f87a325a0e68eb01e3a3b40856d42a037d0c111a6e3949a82ce6b50c24181a", - "https://esm.sh/v131/bowser@2.11.0/denonext/bowser.mjs": "3fd0c5d68c4bb8b3243c1b0ac76442fa90f5e20ee12773ce2b2f476c2e7a3615", - "https://esm.sh/v131/bufferutil@4.0.7/denonext/bufferutil.mjs": "abe42a54dfdc6365872850cd4395be09f2198b84a1d46022b88c98a6196f6e1f", - "https://esm.sh/v131/core-util-is@1.0.3/denonext/core-util-is.mjs": "f19dfe63f62278ae0c5a25bd85ffeac5bbdb099b22f005d01bbb62673505deec", - "https://esm.sh/v131/crypto-js@4.1.1/denonext/crypto-js.mjs": "b25d264259764a5c95fe9dfe04820d3aa6b22e063776db1dd1d0e7ac2e106eb3", - "https://esm.sh/v131/debug@4.3.4/denonext/debug.mjs": "892826bb4505deb6337df2f0f72b1e355e5377e702dd739b78774539d7482f5c", - "https://esm.sh/v131/duplexify@3.7.1/denonext/duplexify.mjs": "ac16b0738f66a2009a5f40e52f69e534df9577e694da65d1ba709c47081ff6e8", - "https://esm.sh/v131/duplexify@4.1.2/denonext/duplexify.mjs": "8e183775cd15c5752a4ba69439c3efbbfaa47b20c504b97a5ff4c3ef13c9f944", - "https://esm.sh/v131/end-of-stream@1.4.4/denonext/end-of-stream.mjs": "77a90d627b92ff8a6b577d3ce46e7f26ba55808557d1cfca70c540b76bd96af2", - "https://esm.sh/v131/fast-xml-parser@4.1.2/denonext/fast-xml-parser.mjs": "909a019fba61593212441bfc4db1e0e8652c28f108dda2db1435a2f6203bea19", - "https://esm.sh/v131/inherits@2.0.4/denonext/inherits.mjs": "8095f3d6aea060c904fb24ae50f2882779c0acbe5d56814514c8b5153f3b4b3b", - "https://esm.sh/v131/isarray@1.0.0/denonext/isarray.mjs": "6368a41cf02c83843453ac571deb4c393c14e6f5e1d9ca6bbe43a4623f3856c8", - "https://esm.sh/v131/isomorphic-ws@5.0.0/denonext/isomorphic-ws.mjs": "6ebc8e183811a7b10ff098e9e76f2ceaf14682a045e199b4885a47d211e61aac", - "https://esm.sh/v131/js-sdsl@4.3.0/denonext/js-sdsl.mjs": "b9d39574526cc0ea4021040025ad9c6184efc8ba32ced483fd5c785afffa49f1", - "https://esm.sh/v131/lru-cache@6.0.0/denonext/lru-cache.mjs": "24583c5c6a66ad0c20393bb59f45bb5bf77a4bff6545d2f22c4718f48d943840", - "https://esm.sh/v131/mqtt-packet@6.10.0/denonext/mqtt-packet.mjs": "cbab199254918314ec410ff47ed4c2c0753a872b3749c999aad1054155570278", - "https://esm.sh/v131/mqtt@4.3.7/denonext/mqtt.mjs": "c5c3a58d1f400e1c34b985c76ed2bfe7d271488a31af8bb3d515c3995bb2ab3b", - "https://esm.sh/v131/ms@2.1.2/denonext/ms.mjs": "aa4dc45ba72554c5011168f8910cc646c37af53cfff1a15a4decced838b8eb14", - "https://esm.sh/v131/node-gyp-build@4.6.0/denonext/node-gyp-build.mjs": "58fc8e41b3ffd2f8a6b2a1694292976e6e12768d6e3895b9c8c13239562ffe64", - "https://esm.sh/v131/number-allocator@1.0.14/denonext/number-allocator.mjs": "31973164cee3564b8bc660006622bb89fde09ac1aff800ec27b4afd01bbdc74a", - "https://esm.sh/v131/once@1.4.0/denonext/once.mjs": "b4eb5beddf7f0f8ab4db5e56987d53e5f0fd77961eac5dd554ab75aa79ef0202", - "https://esm.sh/v131/process-nextick-args@2.0.1/denonext/process-nextick-args.mjs": "a57885eb600374afb2521e1d47e92df4d292d49c90c31496da5d0dde2f0d0b5f", - "https://esm.sh/v131/readable-stream@2.3.8/denonext/readable-stream.mjs": "9c2952f308e93db73ce18182be01e4e820866fdf35042a60ef29c317a4ffa72b", - "https://esm.sh/v131/readable-stream@3.6.2/denonext/readable-stream.mjs": "6d839ff306020b3a33ba1c9e46ee4f6c73a6edf453fe5c706db14a2e6ab3d987", - "https://esm.sh/v131/reinterval@1.1.0/denonext/reinterval.mjs": "6697cf544429f073376f5b8fcc5696097917bbedab45792b74d3f785e7747b58", - "https://esm.sh/v131/rfdc@1.3.0/denonext/default.js": "14b787ae4011ae4dfd0507974a9b6c11741367a1c31de2fcb3e13c92d8c4f91c", - "https://esm.sh/v131/safe-buffer@5.1.2/denonext/safe-buffer.mjs": "bf91200afdaf8be92e5c7d4c79e4dc9b5c534f76e104f1b37e5891d6f81eaca2", - "https://esm.sh/v131/safe-buffer@5.2.1/denonext/safe-buffer.mjs": "facbcb4f4622e13062978522fa12c42cae4e12f55b0e1d3fa1c4bc751bd827c7", - "https://esm.sh/v131/stream-shift@1.0.1/denonext/stream-shift.mjs": "1ec867cd3a4f89303a28e3f50e56a1d60c200b9204e9678e1a7f908f91ccccd9", - "https://esm.sh/v131/strnum@1.0.5/denonext/strnum.mjs": "1ffef4adec2f74139e36a2bfed8381880541396fe1c315779fb22e081b17468b", - "https://esm.sh/v131/tslib@1.14.1/denonext/tslib.mjs": "5e49e8960f064d11fb709e3338f5437e2ede57e7df873a09d7834c2a0bf533f7", - "https://esm.sh/v131/utf-8-validate@6.0.3/denonext/utf-8-validate.mjs": "6197c86d1731c0c56002eac5d14d7dc6a23d7f8de06623eeef5587aa63aa968b", - "https://esm.sh/v131/util-deprecate@1.0.2/denonext/util-deprecate.mjs": "f69f67cf655c38428b0934e0f7c865c055834a87cc3866b629d6b2beb21005e9", - "https://esm.sh/v131/uuid@8.3.2/denonext/uuid.mjs": "2cea289bbecc01fab6f701b719513f6ac8a3c21a5e52aa3f8682cf61d70a5dc5", - "https://esm.sh/v131/wrappy@1.0.2/denonext/wrappy.mjs": "3c31e4782e0307cf56b319fcec6110f925dafe6cb47a8fa23350d480f5fa8b06", - "https://esm.sh/v131/ws@7.5.9/denonext/ws.mjs": "bb14a389271bb68778d59f498428caee8048221eea59cc7522898b44aad66d88", - "https://esm.sh/v131/ws@8.13.0/denonext/ws.mjs": "ed9425cc1b9c9b9987590c15646b9adcd8e7d4c4cfff745fdc273a46cbc2b7cc", - "https://esm.sh/v131/xtend@4.0.2/denonext/xtend.mjs": "503056f181793967e90c0566a737612694366fa7191172f4a106099b5c2a80d2", - "https://esm.sh/v131/yallist@4.0.0/denonext/yallist.mjs": "61f180d807dda50bac17028eda05d5722a3fecef6e98a9064e2353ea6864fd82", - "https://raw.githubusercontent.com/levibostian/deno-udd/ignore-prerelease/deps.ts": "2b20d8c142749898e0ad5e4adfdc554dbe1411e8e5ef093687767650a1073ff8", - "https://raw.githubusercontent.com/levibostian/deno-udd/ignore-prerelease/mod.ts": "3ef8bb10b88541586bae7d92c32f469627d3a6a799fa8a897ac819b2f7dd95e8", - "https://raw.githubusercontent.com/levibostian/deno-udd/ignore-prerelease/progress.ts": "bb8eb122f5ac32efc073e05e2c13cceea61458b0e49ac05bddc3a49124dc39e3", - "https://raw.githubusercontent.com/levibostian/deno-udd/ignore-prerelease/registry.ts": "fd8e1b05f14cb988fee7a72a51e68131a920f7d4b72f949d9b86794b3c699671", - "https://raw.githubusercontent.com/levibostian/deno-udd/ignore-prerelease/search.ts": "52f9a539ca76893c47d01f8c6d401487ea286d54d1305b079b8727598e4c847a", - "https://raw.githubusercontent.com/levibostian/deno-udd/ignore-prerelease/semver.ts": "c051a906405dd72b55434eb0f390f678881379d57847abe4ec60d8a02af4f6f2" - } -} diff --git a/ghjk.ts b/ghjk.ts index 120364d34b..dda43a4326 100644 --- a/ghjk.ts +++ b/ghjk.ts @@ -113,7 +113,6 @@ if (inDev()) { ghjk.install( ports.act({}), ports.cargobi({ crateName: "whiz", locked: true }), - ports.cargobi({ crateName: "wasmtime-cli", locked: true }), installs.comp_py[0], ); } diff --git a/libs/pyrt_wit_wire/main.py b/libs/pyrt_wit_wire/main.py index 842b18f4d7..04e60cc7f9 100644 --- a/libs/pyrt_wit_wire/main.py +++ b/libs/pyrt_wit_wire/main.py @@ -16,6 +16,9 @@ import types from typing import Callable, Any +# the `MatWire` class is instantiated for each +# external call. We have to put any persisted +# state here. handlers = {} diff --git a/typegate/engine/runtime.js b/typegate/engine/runtime.js index 5f107cad96..c7d977e3b5 100644 --- a/typegate/engine/runtime.js +++ b/typegate/engine/runtime.js @@ -1 +1,9 @@ /// + +//! This file provides the import point for types and values defined in: +// - ./00_runtime.js: which is preloaded by the custom deno runtime +// - ./runtime.d.ts: which types the objects from the preload +// +// The preload directly adds the Meta object the global scope but we can hide +// that implementation detail and users will "import" `Meta` from this file instead. +// Or at least that is what will appear to be happening to in the type system. diff --git a/typegate/src/runtimes/python_wasi/python_wasi.ts b/typegate/src/runtimes/python_wasi/python_wasi.ts index 3061bb69a7..3e8099be31 100644 --- a/typegate/src/runtimes/python_wasi/python_wasi.ts +++ b/typegate/src/runtimes/python_wasi/python_wasi.ts @@ -22,7 +22,7 @@ export class PythonWasiRuntime extends Runtime { } static async init(params: RuntimeInitParams): Promise { - const { materializers, typegraphName } = params; + const { materializers, typegraphName, _typegraph } = params; const wireMatInfos = materializers.map((mat) => { let matData: object; @@ -42,8 +42,15 @@ export class PythonWasiRuntime extends Runtime { effect: mat.effect, }; break; - case "import_function": { - } + /* case "import_function": { + matData = { + ty: "def", + source: mat.data.fn as string, + func_name: mat.data.name as string, + effect: mat.effect, + }; + break; + } */ default: throw new Error(`unsupported materializer type: ${mat.name}`); } From 5c165b380b1b5854abd8be2f08dfa7b618f679a9 Mon Sep 17 00:00:00 2001 From: Yohe-Am <56622350+Yohe-Am@users.noreply.github.com> Date: Mon, 22 Apr 2024 11:49:02 +0000 Subject: [PATCH 05/16] wip: try ci fix --- .github/workflows/tests.yml | 6 ++++-- dev/Dockerfile | 9 +++++---- dev/lock.yml | 2 -- ghjk.ts | 13 ++++++------- typegate/src/runtimes/wasm.ts | 12 ++---------- 5 files changed, 17 insertions(+), 25 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 20af02bc30..150ec6060f 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -188,8 +188,10 @@ jobs: runner: ubuntu-latest # FIXME: try macos-14 runner once all actions support it # docker buildx action broken as of 2024-02-09 - # - platform: linux/arm64 - # runner: custom-macos + - platform: linux/arm64 + runner: custom-macos + - platform: linux/arm64 + runner: macos-14 steps: - uses: actions/checkout@v4 - uses: docker/setup-buildx-action@v3 diff --git a/dev/Dockerfile b/dev/Dockerfile index 5fc416ecd8..24af53e787 100644 --- a/dev/Dockerfile +++ b/dev/Dockerfile @@ -46,6 +46,7 @@ RUN set -eux; \ git \ curl \ # asdf deps \ + zstd \ xz-utils \ unzip \ ; \ @@ -59,10 +60,10 @@ COPY ghjk.ts . RUN OCI=1 NO_PYTHON=1 ghjk ports sync ENV GHJK_ENV=/root/.local/share/ghjk/env.sh -ARG WASM_OPT_VERSION=0.116.0 -ARG WASM_TOOLS_VERSION=1.0.53 -RUN cargo install wasm-opt@$WASM_OPT_VERSION --locked --debug -RUN cargo install wasm-tools@$WASM_TOOLS_VERSION --locked --debug +# ARG WASM_OPT_VERSION=0.116.0 +# ARG WASM_TOOLS_VERSION=1.0.53 +# RUN cargo install wasm-opt@$WASM_OPT_VERSION --locked --debug +# RUN cargo install wasm-tools@$WASM_TOOLS_VERSION --locked --debug COPY --from=plan /app/recipe.json recipe.json diff --git a/dev/lock.yml b/dev/lock.yml index de091b9efa..b648e1ae98 100644 --- a/dev/lock.yml +++ b/dev/lock.yml @@ -55,8 +55,6 @@ dev: (ARG DENO_VERSION=).*(): DENO_VERSION (ARG RUST_VERSION=).*(): RUST_VERSION (ARG GHJK_VERSION=).*(): GHJK_VERSION - (ARG WASM_OPT_VERSION=).*(): WASM_OPT_VERSION - (ARG WASM_TOOLS_VERSION=).*(): WASM_TOOLS_VERSION typegate/src/typegraph/versions.ts: (const typegraphVersion = ").*(";): TYPEGRAPH_VERSION typegraph/core/src/typegraph.rs: diff --git a/ghjk.ts b/ghjk.ts index dda43a4326..a57bad2960 100644 --- a/ghjk.ts +++ b/ghjk.ts @@ -57,17 +57,16 @@ ghjk.install( }), ports.cargo_binstall(), ports.temporal_cli({ version: TEMPORAL_VERSION }), + installs.wasm_opt, + ports.cargobi({ + crateName: "wasm-tools", + version: WASM_TOOLS_VERSION, + locked: true, + }), ); if (!inOci()) { ghjk.install( - // FIXME: use cargobi when avail - installs.wasm_opt, - ports.cargobi({ - crateName: "wasm-tools", - version: WASM_TOOLS_VERSION, - locked: true, - }), // these aren't required by the typegate build process ports.cargobi({ crateName: "cargo-insta", diff --git a/typegate/src/runtimes/wasm.ts b/typegate/src/runtimes/wasm.ts index b57e25c50d..3b9bbf5aa4 100644 --- a/typegate/src/runtimes/wasm.ts +++ b/typegate/src/runtimes/wasm.ts @@ -92,10 +92,8 @@ export class WasmRuntime extends Runtime { sizeInBytes: art.size, }; - // always wasi - const resolver: Resolver = async (args) => { + return async (args) => { const transfert = order.map((k) => JSON.stringify(args[k])); - const { res } = nativeResult( await native.wasmtime_wit({ func: func as string, @@ -103,14 +101,8 @@ export class WasmRuntime extends Runtime { args: transfert, }), ); + console.log("OUTPUT", res); return JSON.parse(res); }; - - return [ - new ComputeStage({ - ...stage.props, - resolver, - }), - ]; } } From 56d2dbaefbe8a955876b997dc04f8ef3a22d9a5d Mon Sep 17 00:00:00 2001 From: Yohe-Am <56622350+Yohe-Am@users.noreply.github.com> Date: Tue, 23 Apr 2024 11:03:43 +0000 Subject: [PATCH 06/16] feat: add pyrt bin inline --- .ghjk/lock.json | 83 ++++++++----------- .gitignore | 1 + Cargo.lock | 1 + Cargo.toml | 4 +- dev/lock.yml | 4 +- ghjk.ts | 14 ++-- libs/metagen/src/mdk_rust/mod.rs | 2 +- libs/metagen/src/mdk_rust/stubs.rs | 15 ---- libs/metagen/src/tests/mod.rs | 4 +- libs/pyrt_wit_wire/pyrt/__init__.py | 12 --- libs/pyrt_wit_wire/pyrt/exports/__init__.py | 24 ------ libs/pyrt_wit_wire/pyrt/exports/mat_wire.py | 44 ---------- libs/pyrt_wit_wire/pyrt/imports/__init__.py | 0 libs/pyrt_wit_wire/pyrt/imports/shared.py | 18 ---- .../pyrt/imports/typegate_wire.py | 21 ----- libs/pyrt_wit_wire/pyrt/types.py | 23 ----- typegate/engine/Cargo.toml | 8 +- typegate/engine/build.rs | 58 ++++++++++++- typegate/engine/src/lib.rs | 10 ++- typegate/engine/src/runtimes/wit_wire.rs | 79 +++++++++++------- typegate/src/runtimes/Runtime.ts | 5 +- .../src/runtimes/python_wasi/python_wasi.ts | 4 +- .../runtimes/python_wasi/python_wasi_test.ts | 6 +- typegraph/python/pyproject.toml | 2 +- 24 files changed, 178 insertions(+), 264 deletions(-) delete mode 100644 libs/pyrt_wit_wire/pyrt/__init__.py delete mode 100644 libs/pyrt_wit_wire/pyrt/exports/__init__.py delete mode 100644 libs/pyrt_wit_wire/pyrt/exports/mat_wire.py delete mode 100644 libs/pyrt_wit_wire/pyrt/imports/__init__.py delete mode 100644 libs/pyrt_wit_wire/pyrt/imports/shared.py delete mode 100644 libs/pyrt_wit_wire/pyrt/imports/typegate_wire.py delete mode 100644 libs/pyrt_wit_wire/pyrt/types.py diff --git a/.ghjk/lock.json b/.ghjk/lock.json index 6c9a65a607..0d5e15f92b 100644 --- a/.ghjk/lock.json +++ b/.ghjk/lock.json @@ -493,6 +493,37 @@ "portRef": "cargobi_cratesio@0.1.0", "crateName": "wasmtime-cli", "locked": true + }, + "d7e75b813748aaecfc889b73be7e9615eadceb4790eacb449f0c3a1bb24a5c42": { + "version": "19.0.0", + "depConfigs": { + "cargo_binstall_ghrel": { + "version": "v1.6.4", + "depConfigs": {}, + "portRef": "cargo_binstall_ghrel@0.1.0" + }, + "rust_rustup": { + "version": "1.77.2", + "depConfigs": { + "rustup_rustlang": { + "version": "1.27.0", + "depConfigs": { + "git_aa": { + "version": "2.40.1", + "depConfigs": {}, + "portRef": "git_aa@0.1.0" + } + }, + "portRef": "rustup_rustlang@0.1.0" + } + }, + "portRef": "rust_rustup@0.1.0", + "profile": "minimal" + } + }, + "portRef": "cargobi_cratesio@0.1.0", + "crateName": "wasmtime-cli", + "locked": true } } }, @@ -592,13 +623,14 @@ }, "build-pyrt": { "name": "build-pyrt", - "dependsOn": [], + "dependsOn": [ + "gen-pyrt-bind" + ], "env": { "installs": [ "be7e967b2420f3d6a8af7d3ff11192362ee4b5c8", "5dfbf570fa87f14a3524560c40bd08d0d62a7526", - "a24f45ef0b2064658d87264a95d31fe4694f6f4e", - "a4de04b77193fd53fed574b61e8568dc63a53544" + "a24f45ef0b2064658d87264a95d31fe4694f6f4e" ], "env": {}, "allowedPortDeps": [ @@ -1196,51 +1228,6 @@ ], "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/cpy_bs.ts" } - }, - "a4de04b77193fd53fed574b61e8568dc63a53544": { - "version": "19.0.2", - "depConfigs": { - "rust_rustup": { - "portRef": "rust_rustup@0.1.0", - "profile": "minimal" - } - }, - "port": { - "ty": "denoWorker@v1", - "name": "cargobi_cratesio", - "platforms": [ - "x86_64-linux", - "aarch64-linux", - "x86_64-darwin", - "aarch64-darwin", - "x86_64-windows", - "aarch64-windows", - "x86_64-freebsd", - "aarch64-freebsd", - "x86_64-netbsd", - "aarch64-netbsd", - "x86_64-aix", - "aarch64-aix", - "x86_64-solaris", - "aarch64-solaris", - "x86_64-illumos", - "aarch64-illumos", - "x86_64-android", - "aarch64-android" - ], - "version": "0.1.0", - "deps": [ - { - "name": "cargo_binstall_ghrel" - }, - { - "name": "rust_rustup" - } - ], - "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/cargobi.ts" - }, - "crateName": "wasmtime-cli", - "locked": true } }, "allowedPortDeps": { diff --git a/.gitignore b/.gitignore index 8d32968cbf..e44eaabaa2 100644 --- a/.gitignore +++ b/.gitignore @@ -47,3 +47,4 @@ typegraph/python/typegraph/gen *.egg-info/ examples/typegraphs/migrations +libs/pyrt_wit_wire/pyrt diff --git a/Cargo.lock b/Cargo.lock index 8c7b295d3e..9f884094be 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12080,6 +12080,7 @@ dependencies = [ "user-facing-errors", "wasmtime", "wasmtime-wasi", + "zstd 0.13.1", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 82b4ba05a3..58f317d5c1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,6 @@ exclude = [ "typegate/tests/runtimes/wasm/rust", "libs/pyrt_wit_wire" ] - [workspace.package] version = "0.3.7-0" edition = "2021" @@ -57,3 +56,6 @@ indexmap = { version = "2.1.0", features = ["serde"] } tempfile = "3.8.1" regex = "1.10.2" once_cell = "1.18.0" + +wasmtime = "20.0.0" +wasmtime-wasi = "20.0.0" diff --git a/dev/lock.yml b/dev/lock.yml index b648e1ae98..a0e7d53bcb 100644 --- a/dev/lock.yml +++ b/dev/lock.yml @@ -49,6 +49,8 @@ dev: (description = ").+("): TAGLINE '([\w-]+\s*=\s*\{\s*git\s*=\s*"https:\/\/github\.com\/prisma\/prisma-engines"\s*,\s*tag\s*=\s*").+("\s*\})': PRISMA_VERSION '(deno\s*=\s*\{\s*git\s*=\s*"https:\/\/github\.com\/metatypedev\/deno"\s*,\s*branch\s*=\s*"v).+(-embeddable"\s*\})': DENO_VERSION + (wasmtime = ").+("): WASMTIME_VERSION + (wasmtime-wasi = ").+("): WASMTIME_VERSION dev/cross.Dockerfile: (ARG GHJK_VERSION=).*(): GHJK_VERSION dev/Dockerfile: @@ -91,7 +93,7 @@ dev: CARGO_INSTA_VERSION: 1.33.0 WASM_TOOLS_VERSION: 1.0.53 JCO_VERSION: 1.0.0 - WASMTIME_VERSION: 19.0.2 + WASMTIME_VERSION: 20.0.0 TYPEGRAPH_VERSION: 0.0.3 PRISMA_VERSION: 5.5.2 METATYPE_VERSION: 0.3.7-0 diff --git a/ghjk.ts b/ghjk.ts index a57bad2960..05300f7206 100644 --- a/ghjk.ts +++ b/ghjk.ts @@ -9,7 +9,7 @@ const PYTHON_VERSION = "3.8.18"; const PNPM_VERSION = "v9.0.5"; const WASM_TOOLS_VERSION = "1.0.53"; const JCO_VERSION = "1.0.0"; -const WASMTIME_VERSION = "19.0.2"; +const WASMTIME_VERSION = "20.0.0"; const WASM_OPT_VERSION = "0.116.0"; const MOLD_VERSION = "v2.4.0"; const CMAKE_VERSION = "3.28.0-rc6"; @@ -142,11 +142,13 @@ ghjk.task("gen-pyrt-bind", { }); ghjk.task("build-pyrt", { - installs: [...installs.comp_py, installs.wasm_opt, installs.wasmtime], + installs: [...installs.comp_py, installs.wasm_opt], allowedPortDeps, - async fn({ $ }) { - await $`componentize-py -d ./libs/pyrt_wit_wire/wit/ componentize -o ./target/pyrt.wasm libs.pyrt_wit_wire.main`; - await $`wasmtime compile -W component-model ./target/pyrt.wasm -o ./target/pyrt.cwasm`; - // await $`wasm-opt -Oz ./target/pyrt.wasm -o ./target/pyrt.wasm2`; + dependsOn: ["gen-pyrt-bind"], + async fn({ $, argv, env }) { + const target = env["PYRT_TARGET"] ? `--target ${env["PYRT_TARGET"]}` : ""; + const wasmOut = env["PYRT_WASM_OUT"] ?? "./target/pyrt.wasm"; + const cwasmOut = env["PYRT_CWASM_OUT"] ?? "./target/pyrt.cwasm"; + await $`componentize-py -d ./libs/pyrt_wit_wire/wit/ componentize -o ${wasmOut} libs.pyrt_wit_wire.main`; }, }); diff --git a/libs/metagen/src/mdk_rust/mod.rs b/libs/metagen/src/mdk_rust/mod.rs index 9e272d8ff7..2287a0b411 100644 --- a/libs/metagen/src/mdk_rust/mod.rs +++ b/libs/metagen/src/mdk_rust/mod.rs @@ -183,7 +183,7 @@ fn mdk_rs_e2e() -> anyhow::Result<()> { .into_iter() .collect(), }; - let out = tokio::runtime::Builder::new_multi_thread() + tokio::runtime::Builder::new_multi_thread() .enable_all() .thread_stack_size(16 * 1024 * 1024) .build()? diff --git a/libs/metagen/src/mdk_rust/stubs.rs b/libs/metagen/src/mdk_rust/stubs.rs index b9a4d38845..1661688eff 100644 --- a/libs/metagen/src/mdk_rust/stubs.rs +++ b/libs/metagen/src/mdk_rust/stubs.rs @@ -139,18 +139,3 @@ pub trait MyFunc { Ok(()) } } - -trait MyT { - fn hey() {} -} -trait MyT2 { - fn you() {} -} - -struct T {} -impl MyT for T { - fn hey() {} -} -impl MyT2 for T { - fn you() {} -} diff --git a/libs/metagen/src/tests/mod.rs b/libs/metagen/src/tests/mod.rs index d5acebda29..b31d84ee34 100644 --- a/libs/metagen/src/tests/mod.rs +++ b/libs/metagen/src/tests/mod.rs @@ -41,7 +41,7 @@ pub struct E2eTestCase { pub async fn e2e_test(cases: Vec) -> anyhow::Result<()> { // spin_up_typegate for case in cases { - let tmp_dir = tokio::task::spawn_blocking(|| tempfile::tempdir()) + let tmp_dir = tokio::task::spawn_blocking(tempfile::tempdir) .await?? .into_path(); { @@ -94,7 +94,7 @@ async fn spin_up_typegate() -> anyhow::Result<(tokio::process::Child, common::no let tg_admin_password = "password"; let typegate = tokio::process::Command::new("cargo") - .args(&["r", "-p", "typegate"]) + .args(["r", "-p", "typegate"]) .envs([ ("LOG_LEVEL".to_string(), "DEBUG".to_string()), ("TG_PORT".to_string(), tg_port.to_string()), diff --git a/libs/pyrt_wit_wire/pyrt/__init__.py b/libs/pyrt_wit_wire/pyrt/__init__.py deleted file mode 100644 index 5efd3e883d..0000000000 --- a/libs/pyrt_wit_wire/pyrt/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -from typing import TypeVar, Generic, Union, Optional, Protocol, Tuple, List, Any, Self -from enum import Flag, Enum, auto -from dataclasses import dataclass -from abc import abstractmethod -import weakref - -from .types import Result, Ok, Err, Some - - - -class Pyrt(Protocol): - pass diff --git a/libs/pyrt_wit_wire/pyrt/exports/__init__.py b/libs/pyrt_wit_wire/pyrt/exports/__init__.py deleted file mode 100644 index 0b44f2c981..0000000000 --- a/libs/pyrt_wit_wire/pyrt/exports/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -from typing import TypeVar, Generic, Union, Optional, Protocol, Tuple, List, Any, Self -from enum import Flag, Enum, auto -from dataclasses import dataclass -from abc import abstractmethod -import weakref - -from ..types import Result, Ok, Err, Some -from ..imports import shared -from ..exports import mat_wire - -class MatWire(Protocol): - - @abstractmethod - def init(self, args: mat_wire.InitArgs) -> mat_wire.InitResponse: - """ - Raises: `pyrt.types.Err(pyrt.imports.mat_wire.InitError)` - """ - raise NotImplementedError - - @abstractmethod - def handle(self, req: shared.Req) -> Result[str, str]: - raise NotImplementedError - - diff --git a/libs/pyrt_wit_wire/pyrt/exports/mat_wire.py b/libs/pyrt_wit_wire/pyrt/exports/mat_wire.py deleted file mode 100644 index 6b2b368537..0000000000 --- a/libs/pyrt_wit_wire/pyrt/exports/mat_wire.py +++ /dev/null @@ -1,44 +0,0 @@ -from typing import TypeVar, Generic, Union, Optional, Protocol, Tuple, List, Any, Self -from enum import Flag, Enum, auto -from dataclasses import dataclass -from abc import abstractmethod -import weakref - -from ..types import Result, Ok, Err, Some - - -@dataclass -class MatInfo: - op_name: str - mat_title: str - mat_hash: str - mat_data_json: str - -@dataclass -class InitArgs: - metatype_version: str - expected_ops: List[MatInfo] - -@dataclass -class InitResponse: - ok: int - - -@dataclass -class InitError_VersionMismatch: - value: str - - -@dataclass -class InitError_UnexpectedMat: - value: MatInfo - - -@dataclass -class InitError_Other: - value: str - - -InitError = Union[InitError_VersionMismatch, InitError_UnexpectedMat, InitError_Other] - - diff --git a/libs/pyrt_wit_wire/pyrt/imports/__init__.py b/libs/pyrt_wit_wire/pyrt/imports/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libs/pyrt_wit_wire/pyrt/imports/shared.py b/libs/pyrt_wit_wire/pyrt/imports/shared.py deleted file mode 100644 index 7d9cb8c370..0000000000 --- a/libs/pyrt_wit_wire/pyrt/imports/shared.py +++ /dev/null @@ -1,18 +0,0 @@ -""" -use metatype:typegraph/runtimes; -""" -from typing import TypeVar, Generic, Union, Optional, Protocol, Tuple, List, Any, Self -from enum import Flag, Enum, auto -from dataclasses import dataclass -from abc import abstractmethod -import weakref - -from ..types import Result, Ok, Err, Some - - -@dataclass -class Req: - op_name: str - in_json: str - - diff --git a/libs/pyrt_wit_wire/pyrt/imports/typegate_wire.py b/libs/pyrt_wit_wire/pyrt/imports/typegate_wire.py deleted file mode 100644 index 75b7b2134c..0000000000 --- a/libs/pyrt_wit_wire/pyrt/imports/typegate_wire.py +++ /dev/null @@ -1,21 +0,0 @@ -from typing import TypeVar, Generic, Union, Optional, Protocol, Tuple, List, Any, Self -from enum import Flag, Enum, auto -from dataclasses import dataclass -from abc import abstractmethod -import weakref - -from ..types import Result, Ok, Err, Some - - -@dataclass -class Req: - op_name: str - in_json: str - - -def hostcall(req: Req) -> str: - """ - Raises: `pyrt.types.Err(pyrt.imports.str)` - """ - raise NotImplementedError - diff --git a/libs/pyrt_wit_wire/pyrt/types.py b/libs/pyrt_wit_wire/pyrt/types.py deleted file mode 100644 index 77ad379069..0000000000 --- a/libs/pyrt_wit_wire/pyrt/types.py +++ /dev/null @@ -1,23 +0,0 @@ -from typing import TypeVar, Generic, Union, Optional, Protocol, Tuple, List, Any, Self -from enum import Flag, Enum, auto -from dataclasses import dataclass -from abc import abstractmethod -import weakref - - -S = TypeVar('S') -@dataclass -class Some(Generic[S]): - value: S - -T = TypeVar('T') -@dataclass -class Ok(Generic[T]): - value: T - -E = TypeVar('E') -@dataclass(frozen=True) -class Err(Generic[E], Exception): - value: E - -Result = Union[Ok[T], Err[E]] diff --git a/typegate/engine/Cargo.toml b/typegate/engine/Cargo.toml index ecf33b90f5..1ef4716a44 100644 --- a/typegate/engine/Cargo.toml +++ b/typegate/engine/Cargo.toml @@ -34,13 +34,13 @@ mt_deno.workspace = true common.workspace = true typescript.workspace = true -wasmtime = { version = "20.0.0", features = ["component-model"] } -wasmtime-wasi = { version = "20.0.0" } +wasmtime = { workspace = true, features = ["component-model"] } +wasmtime-wasi.workspace = true shadow-rs.workspace = true serde.workspace = true regex = "1.10.2" - +zstd = "0.13" async-trait = "0.1" [dev-dependencies] @@ -48,3 +48,5 @@ env_logger.workspace = true [build-dependencies] shadow-rs.workspace = true +wasmtime = { workspace = true, features = ["component-model"] } +zstd = "0.13" diff --git a/typegate/engine/build.rs b/typegate/engine/build.rs index dba61fbd72..c0281ec3f4 100644 --- a/typegate/engine/build.rs +++ b/typegate/engine/build.rs @@ -1,9 +1,59 @@ // Copyright Metatype OÜ, licensed under the Elastic License 2.0. // SPDX-License-Identifier: Elastic-2.0 -// Copyright Metatype OÜ, licensed under the Mozilla Public License Version 2.0. -// SPDX-License-Identifier: MPL-2.0 +use std::path::PathBuf; -fn main() -> shadow_rs::SdResult<()> { - shadow_rs::new() +fn main() -> Result<(), Box> { + shadow_rs::new()?; + + // build and compress the `pyrt_wit_wire` wasm compress + // into OUT_DIR/pyrt.cwasm.zst + + let cwd = PathBuf::from(std::env::var("CARGO_MANIFEST_DIR")?); + let pyrt_path = cwd.join("../../libs/pyrt_wit_wire/"); + let out_dir = PathBuf::from(std::env::var("OUT_DIR")?); + let target = std::env::var("TARGET")?; + + println!( + "cargo:rerun-if-changed={}/main.py", + pyrt_path.to_string_lossy() + ); + println!("cargo:rerun-if-changed={}/wit", pyrt_path.to_string_lossy()); + + let wasm_path = out_dir.join("pyrt.wasm"); + // note: we're using ghjk here + // if this proves troubsome, consider moving the + // task impl inline + assert!( + std::process::Command::new("ghjk") + .args(["x", "build-pyrt", "--target"]) + .env("PYRT_WASM_OUT", &wasm_path) + .current_dir(cwd.join("../../")) + .output()? + .status + .success(), + "error building pyrt" + ); + + let engine = wasmtime::Engine::new( + wasmtime::Config::new() + .cache_config_load_default() + .map_err(|err| format!("error reading system's wasmtime cache config: {err}"))? + .target(&target) + .map_err(|err| format!("error configuring wasmtime for target {target}: {err}"))?, + )?; + let comp = wasmtime::component::Component::from_file(&engine, wasm_path)?; + let cwasm = comp.serialize().unwrap(); + + zstd::stream::copy_encode( + &cwasm[..], + std::fs::File::create(out_dir.join("pyrt.cwasm.zst")).unwrap(), + if std::env::var("PROFILE")? == "release" { + 19 + } else { + 0 + }, + )?; + // wasmtime::Component + Ok(()) } diff --git a/typegate/engine/src/lib.rs b/typegate/engine/src/lib.rs index 1f411205a6..49f456450b 100644 --- a/typegate/engine/src/lib.rs +++ b/typegate/engine/src/lib.rs @@ -74,8 +74,14 @@ impl OpDepInjector { #[cfg(test)] state.put(ext::tests::TestCtx { val: 10 }); state.put(runtimes::temporal::Ctx::default()); - let engine = wasmtime::Engine::new(wasmtime::Config::new().async_support(true)) - .expect("invalid wasmtime engine config"); + let engine = wasmtime::Engine::new( + wasmtime::Config::new() + .async_support(true) + .cache_config_load_default() + .context("error reading system's wasmtime cache config") + .unwrap(), + ) + .expect("invalid wasmtime engine config"); state.put(runtimes::wit_wire::Ctx::new(engine)); state.put(runtimes::prisma::Ctx::new(self.tmp_dir.unwrap())); } diff --git a/typegate/engine/src/runtimes/wit_wire.rs b/typegate/engine/src/runtimes/wit_wire.rs index c8a6cda6f8..b25813198a 100644 --- a/typegate/engine/src/runtimes/wit_wire.rs +++ b/typegate/engine/src/runtimes/wit_wire.rs @@ -6,6 +6,9 @@ use dashmap::DashMap; #[rustfmt::skip] use deno_core as deno_core; // necessary for re-exported macros to work use deno_core::OpState; +use wasmtime::component::{Component, Linker}; +use wit::exports::metatype::pyrt::mat_wire::{InitArgs, InitError, MatInfo, Req as MatReq}; +use wit::metatype::pyrt::typegate_wire::{Host, Req as HostReq, Res as HostRes}; mod wit { wasmtime::component::bindgen!({ @@ -13,15 +16,12 @@ mod wit { async: true, }); } -use wasmtime::component::{Component, Linker}; -use wit::exports::metatype::pyrt::mat_wire::{InitArgs, InitError, MatInfo, Req as MatReq}; -use wit::metatype::pyrt::typegate_wire::{Host, Req as HostReq, Res as HostRes}; #[derive(Clone)] pub struct Ctx { engine: wasmtime::Engine, instances: Arc>, - components: Arc>, + components: Arc>, } #[derive(Clone)] @@ -42,18 +42,30 @@ impl Ctx { } } - async fn get_component(&self, wasm_relative_path: PathBuf) -> Result { - let wasm_absolute_path = match std::env::current_dir() { - Ok(cwd) => cwd.join(wasm_relative_path), - Err(err) => return Err(format!("error trying to find cwd: {err}")), - }; - - let comp = if let Some(comp) = self.components.get(&wasm_absolute_path) { - comp.clone() + async fn get_component(&self, wasm_relative_path: String) -> Result { + if let Some(comp) = self.components.get(&wasm_relative_path[..]) { + return Ok(comp.clone()); + } + let engine = self.engine.clone(); + let comp = if wasm_relative_path == "inline://pyrt_wit_wire.cwasm" { + let cwasm_zst_bytes = include_bytes!(concat!(env!("OUT_DIR"), "/pyrt.cwasm.zst")); + tokio::task::spawn_blocking(move || unsafe { + let mut cwasm_bytes = vec![]; + zstd::stream::copy_decode(&cwasm_zst_bytes[..], &mut cwasm_bytes) + .map_err(|err| format!("error decompressing serialized component: {err}"))?; + Component::deserialize(&engine, cwasm_bytes) + .map_err(|err| format!("error loading pyrt serialized component: {err}")) + }) + .await + .map_err(|err| format!("tokio error loading serialized component: {err}"))?? } else { - let engine = self.engine.clone(); + let wasm_absolute_path = match std::env::current_dir() { + Ok(cwd) => cwd.join(&wasm_relative_path), + Err(err) => return Err(format!("error trying to find cwd: {err}")), + }; let path_clone = wasm_absolute_path.clone(); - let comp = if wasm_absolute_path + + if wasm_absolute_path .extension() .map(|ext| ext == "cwasm") .unwrap_or_default() @@ -64,29 +76,32 @@ impl Ctx { }) .await .map_err(|err| format!("tokio error loading serialized component: {err}"))? - .map_err(|err| format!("error loading serialized component: {err}"))? + .map_err(|err| { + format!("error loading serialized component from {wasm_relative_path}: {err}") + })? } else { tokio::task::spawn_blocking(move || Component::from_file(&engine, &path_clone)) .await .map_err(|err| format!("tokio error loading component: {err}"))? - .map_err(|err| format!("error loading component: {err}"))? - }; - - let mut linker = Linker::::new(&self.engine); - - for res in [ - wasmtime_wasi::bindings::Imports::add_to_linker(&mut linker, |host| host), - wit::Pyrt::add_to_linker(&mut linker, |host| host), - ] { - res.map_err(|err| format!("erorr trying to link component: {err}"))?; + .map_err(|err| { + format!("error loading component from {wasm_relative_path}: {err}") + })? } - self.components - .entry(wasm_absolute_path) - .insert_entry(LinkedComponent(comp, linker.into())) - .get() - .clone() }; - Ok(comp) + let mut linker = Linker::::new(&self.engine); + + for res in [ + wasmtime_wasi::bindings::Imports::add_to_linker(&mut linker, |host| host), + wit::Pyrt::add_to_linker(&mut linker, |host| host), + ] { + res.map_err(|err| format!("erorr trying to link component: {err}"))?; + } + Ok(self + .components + .entry(wasm_relative_path) + .insert_entry(LinkedComponent(comp, linker.into())) + .get() + .clone()) } } @@ -221,7 +236,7 @@ pub async fn op_wit_wire_init( }; let LinkedComponent(ref component, ref linker) = ctx - .get_component(PathBuf::from(component_path)) + .get_component(component_path) .await .map_err(WitWireInitError::ModuleErr)?; diff --git a/typegate/src/runtimes/Runtime.ts b/typegate/src/runtimes/Runtime.ts index 92c4cc8344..5cd80c086b 100644 --- a/typegate/src/runtimes/Runtime.ts +++ b/typegate/src/runtimes/Runtime.ts @@ -8,7 +8,10 @@ import { Resolver } from "../types.ts"; export abstract class Runtime { readonly id: string; - constructor(typegraphName: string, uuid = crypto.randomUUID() as string) { + constructor( + public typegraphName: string, + uuid = crypto.randomUUID() as string, + ) { this.id = `${typegraphName}_${this.constructor.name}_${uuid}`; } diff --git a/typegate/src/runtimes/python_wasi/python_wasi.ts b/typegate/src/runtimes/python_wasi/python_wasi.ts index 3e8099be31..664695a72c 100644 --- a/typegate/src/runtimes/python_wasi/python_wasi.ts +++ b/typegate/src/runtimes/python_wasi/python_wasi.ts @@ -22,7 +22,7 @@ export class PythonWasiRuntime extends Runtime { } static async init(params: RuntimeInitParams): Promise { - const { materializers, typegraphName, _typegraph } = params; + const { materializers, typegraphName } = params; const wireMatInfos = materializers.map((mat) => { let matData: object; @@ -68,7 +68,7 @@ export class PythonWasiRuntime extends Runtime { // add default vm for lambda/def const uuid = crypto.randomUUID(); const wire = await WitWireMessenger.init( - "./target/pyrt.cwasm", + "inline://pyrt_wit_wire.cwasm", uuid, wireMatInfos, ); diff --git a/typegate/tests/runtimes/python_wasi/python_wasi_test.ts b/typegate/tests/runtimes/python_wasi/python_wasi_test.ts index b42d3b127b..7f3a8948b7 100644 --- a/typegate/tests/runtimes/python_wasi/python_wasi_test.ts +++ b/typegate/tests/runtimes/python_wasi/python_wasi_test.ts @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Elastic-2.0 import { assert, assertEquals } from "std/assert/mod.ts"; -import { gql, Meta } from "../../utils/mod.ts"; +import { gql, Meta } from "test-utils/mod.ts"; import { WitWireMessenger } from "../../../src/runtimes/python_wasi/wit_wire.ts"; import type { ResolverArgs } from "../../../src/types.ts"; import { testDir } from "test-utils/dir.ts"; @@ -32,7 +32,7 @@ const reusableTgOutput = { Meta.test("Python WASI VM performance", async (t) => { await t.should("work with low latency for lambdas", async () => { await using wire = await WitWireMessenger.init( - "./target/pyrt.cwasm", + "inline://pyrt_wit_wire.cwasm", crypto.randomUUID(), [ { @@ -69,7 +69,7 @@ Meta.test("Python WASI VM performance", async (t) => { await t.should("work with low latency for defs", async () => { await using wire = await WitWireMessenger.init( - "./target/pyrt.cwasm", + "inline://pyrt_wit_wire.cwasm", crypto.randomUUID(), [ { diff --git a/typegraph/python/pyproject.toml b/typegraph/python/pyproject.toml index a604aa825a..8262743705 100644 --- a/typegraph/python/pyproject.toml +++ b/typegraph/python/pyproject.toml @@ -15,7 +15,7 @@ classifiers = [ [tool.poetry.dependencies] python = ">=3.8,<4.0" -wasmtime = "^19.0.2" +wasmtime = "^20.0.0" typing-extensions = "^4.8.0" python-box = "^7.1.1" astunparse = "^1.6.3" From e62ba349faafc1d25cbce0c9b9a2a9857a3aa1f5 Mon Sep 17 00:00:00 2001 From: Yohe-Am <56622350+Yohe-Am@users.noreply.github.com> Date: Tue, 23 Apr 2024 16:06:02 +0000 Subject: [PATCH 07/16] refactor: `python_wasi` -> `python` --- libs/common/src/typegraph/runtimes/mod.rs | 5 +- libs/pyrt_wit_wire/main.py | 3 + typegate/engine/build.rs | 8 + typegate/src/runtimes/mod.ts | 2 +- .../{python_wasi/python_wasi.ts => python.ts} | 24 ++- typegate/src/runtimes/python_wasi.ts | 7 - .../wit_wire.ts => wit_wire/mod.ts} | 0 typegate/src/typegraph/types.ts | 2 +- typegate/src/typegraphs/introspection.json | 2 +- typegate/src/typegraphs/prisma_migration.json | 2 +- typegate/src/typegraphs/typegate.json | 2 +- .../__snapshots__/typegraph_test.ts.snap | 4 +- .../__snapshots__/planner_test.ts.snap | 186 +++++++++--------- .../{python_wasi => python}/py/hello.py | 0 .../{python_wasi => python}/py/nested/dep.py | 0 .../python_wasi.py => python/python.py} | 8 +- .../python_wasi.ts => python/python.ts} | 2 +- .../python_test.ts} | 35 ++-- typegate/tests/utils/bindings_test.ts | 1 + typegraph/core/src/conversion/runtimes.rs | 2 +- 20 files changed, 152 insertions(+), 143 deletions(-) rename typegate/src/runtimes/{python_wasi/python_wasi.ts => python.ts} (82%) delete mode 100644 typegate/src/runtimes/python_wasi.ts rename typegate/src/runtimes/{python_wasi/wit_wire.ts => wit_wire/mod.ts} (100%) rename typegate/tests/runtimes/{python_wasi => python}/py/hello.py (100%) rename typegate/tests/runtimes/{python_wasi => python}/py/nested/dep.py (100%) rename typegate/tests/runtimes/{python_wasi/python_wasi.py => python/python.py} (95%) rename typegate/tests/runtimes/{python_wasi/python_wasi.ts => python/python.ts} (94%) rename typegate/tests/runtimes/{python_wasi/python_wasi_test.ts => python/python_test.ts} (91%) diff --git a/libs/common/src/typegraph/runtimes/mod.rs b/libs/common/src/typegraph/runtimes/mod.rs index 3270553733..5b1308ccba 100644 --- a/libs/common/src/typegraph/runtimes/mod.rs +++ b/libs/common/src/typegraph/runtimes/mod.rs @@ -49,8 +49,7 @@ pub enum KnownRuntime { GraphQL(GraphQLRuntimeData), #[serde(rename = "http")] HTTP(HTTPRuntimeData), - #[serde(rename = "python_wasi")] - PythonWasi(PythonRuntimeData), + Python(PythonRuntimeData), Random(RandomRuntimeData), Prisma(PrismaRuntimeData), PrismaMigration(PrismaMigrationRuntimeData), @@ -83,7 +82,7 @@ impl TGRuntime { KnownRuntime::Deno(_) => "deno", KnownRuntime::GraphQL(_) => "graphql", KnownRuntime::HTTP(_) => "http", - KnownRuntime::PythonWasi(_) => "python_wasi", + KnownRuntime::Python(_) => "python", KnownRuntime::Random(_) => "random", KnownRuntime::Prisma(_) => "prisma", KnownRuntime::PrismaMigration(_) => "prisma_migration", diff --git a/libs/pyrt_wit_wire/main.py b/libs/pyrt_wit_wire/main.py index 04e60cc7f9..12d18aa8d3 100644 --- a/libs/pyrt_wit_wire/main.py +++ b/libs/pyrt_wit_wire/main.py @@ -58,5 +58,8 @@ def op_to_handler(op: MatInfo) -> ErasedHandler: elif data_parsed["ty"] == "lambda": fn = eval(data_parsed["source"]) return ErasedHandler(handler_fn=lambda inp: fn(inp)) + elif data_parsed["ty"] == "import_function": + fn = eval(data_parsed["source"]) + return ErasedHandler(handler_fn=lambda inp: fn(inp)) else: raise Err(InitError_UnexpectedMat(op)) diff --git a/typegate/engine/build.rs b/typegate/engine/build.rs index c0281ec3f4..716a8971d2 100644 --- a/typegate/engine/build.rs +++ b/typegate/engine/build.rs @@ -42,6 +42,14 @@ fn main() -> Result<(), Box> { .target(&target) .map_err(|err| format!("error configuring wasmtime for target {target}: {err}"))?, )?; + // note: compilation here is extra-slow if building under the debug profile + // since wasmtime will also be in the debug profile + // consider upgrading the cranelift crates to opt3 if this proves + // to be an issue. + // At first, I was just using the wasmtime CLI for precomiplation. + // The cli is distrubuted in release mode and did the deed in 3 secs max. + // The engine kept rejecting the checksum from the CLI even on the same + // version (19.0.0). let comp = wasmtime::component::Component::from_file(&engine, wasm_path)?; let cwasm = comp.serialize().unwrap(); diff --git a/typegate/src/runtimes/mod.ts b/typegate/src/runtimes/mod.ts index da92abff74..d48520d0d3 100644 --- a/typegate/src/runtimes/mod.ts +++ b/typegate/src/runtimes/mod.ts @@ -41,7 +41,7 @@ export async function init_runtimes(): Promise { import("./graphql.ts"), import("./http.ts"), import("./prisma.ts"), - import("./python_wasi.ts"), + import("./python.ts"), import("./random.ts"), import("./s3.ts"), import("./temporal.ts"), diff --git a/typegate/src/runtimes/python_wasi/python_wasi.ts b/typegate/src/runtimes/python.ts similarity index 82% rename from typegate/src/runtimes/python_wasi/python_wasi.ts rename to typegate/src/runtimes/python.ts index 664695a72c..2758e69276 100644 --- a/typegate/src/runtimes/python_wasi/python_wasi.ts +++ b/typegate/src/runtimes/python.ts @@ -1,18 +1,20 @@ // Copyright Metatype OÜ, licensed under the Elastic License 2.0. // SPDX-License-Identifier: Elastic-2.0 -import { getLogger } from "../../log.ts"; -import { Runtime } from "../Runtime.ts"; -import type { Resolver, RuntimeInitParams } from "../../types.ts"; -import { ComputeStage } from "../../engine/query_engine.ts"; -import { Materializer } from "../../typegraph/types.ts"; +import { registerRuntime } from "./mod.ts"; +import { getLogger } from "../log.ts"; +import { Runtime } from "./Runtime.ts"; +import type { Resolver, RuntimeInitParams } from "../types.ts"; +import { ComputeStage } from "../engine/query_engine.ts"; +import { Materializer } from "../typegraph/types.ts"; import * as ast from "graphql/ast"; -import { WitWireMessenger } from "./wit_wire.ts"; -import { WitWireMatInfo } from "../../../engine/runtime.js"; +import { WitWireMessenger } from "./wit_wire/mod.ts"; +import { WitWireMatInfo } from "../../engine/runtime.js"; const _logger = getLogger(import.meta); -export class PythonWasiRuntime extends Runtime { +@registerRuntime("python") +export class PythonRuntime extends Runtime { private constructor( typegraphName: string, uuid: string, @@ -43,8 +45,10 @@ export class PythonWasiRuntime extends Runtime { }; break; /* case "import_function": { + const pyModMat = typegraph.materializers[mat.data.mod as number]; + const code = pyModMat.data.code as string; matData = { - ty: "def", + ty: "import_function", source: mat.data.fn as string, func_name: mat.data.name as string, effect: mat.effect, @@ -73,7 +77,7 @@ export class PythonWasiRuntime extends Runtime { wireMatInfos, ); - return new PythonWasiRuntime(typegraphName, uuid, wire); + return new PythonRuntime(typegraphName, uuid, wire); } async deinit(): Promise { diff --git a/typegate/src/runtimes/python_wasi.ts b/typegate/src/runtimes/python_wasi.ts deleted file mode 100644 index 740e3cab50..0000000000 --- a/typegate/src/runtimes/python_wasi.ts +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright Metatype OÜ, licensed under the Elastic License 2.0. -// SPDX-License-Identifier: Elastic-2.0 - -import { registerRuntime } from "./mod.ts"; -import { PythonWasiRuntime } from "./python_wasi/python_wasi.ts"; - -registerRuntime("python_wasi")(PythonWasiRuntime); diff --git a/typegate/src/runtimes/python_wasi/wit_wire.ts b/typegate/src/runtimes/wit_wire/mod.ts similarity index 100% rename from typegate/src/runtimes/python_wasi/wit_wire.ts rename to typegate/src/runtimes/wit_wire/mod.ts diff --git a/typegate/src/typegraph/types.ts b/typegate/src/typegraph/types.ts index 993a38a9b3..cec49b03e2 100644 --- a/typegate/src/typegraph/types.ts +++ b/typegate/src/typegraph/types.ts @@ -283,7 +283,7 @@ export type KnownRuntime = { name: "http"; data: HTTPRuntimeData; } | { - name: "python_wasi"; + name: "python"; data: PythonRuntimeData; } | { name: "random"; diff --git a/typegate/src/typegraphs/introspection.json b/typegate/src/typegraphs/introspection.json index dc1508ebfe..5bc6ffcf29 100644 --- a/typegate/src/typegraphs/introspection.json +++ b/typegate/src/typegraphs/introspection.json @@ -601,4 +601,4 @@ "randomSeed": null, "artifacts": {} } -} +} \ No newline at end of file diff --git a/typegate/src/typegraphs/prisma_migration.json b/typegate/src/typegraphs/prisma_migration.json index 7bfda1f3a5..a65d823e77 100644 --- a/typegate/src/typegraphs/prisma_migration.json +++ b/typegate/src/typegraphs/prisma_migration.json @@ -383,4 +383,4 @@ "randomSeed": null, "artifacts": {} } -} +} \ No newline at end of file diff --git a/typegate/src/typegraphs/typegate.json b/typegate/src/typegraphs/typegate.json index d56f46cc2f..a838b99d82 100644 --- a/typegate/src/typegraphs/typegate.json +++ b/typegate/src/typegraphs/typegate.json @@ -1084,4 +1084,4 @@ "randomSeed": null, "artifacts": {} } -} +} \ No newline at end of file diff --git a/typegate/tests/e2e/typegraph/__snapshots__/typegraph_test.ts.snap b/typegate/tests/e2e/typegraph/__snapshots__/typegraph_test.ts.snap index dbe2f83c7a..e23dc9ce09 100644 --- a/typegate/tests/e2e/typegraph/__snapshots__/typegraph_test.ts.snap +++ b/typegate/tests/e2e/typegraph/__snapshots__/typegraph_test.ts.snap @@ -437,7 +437,7 @@ snapshot[`typegraphs creation 2`] = ` } }, { - "name": "python_wasi", + "name": "python", "data": { "config": null } @@ -1199,7 +1199,7 @@ snapshot[`typegraphs creation 5`] = ` } }, { - "name": "python_wasi", + "name": "python", "data": { "config": null } diff --git a/typegate/tests/planner/__snapshots__/planner_test.ts.snap b/typegate/tests/planner/__snapshots__/planner_test.ts.snap index 1122e72a27..8f52cc428c 100644 --- a/typegate/tests/planner/__snapshots__/planner_test.ts.snap +++ b/typegate/tests/planner/__snapshots__/planner_test.ts.snap @@ -1,98 +1,5 @@ export const snapshot = {}; -snapshot[`planner 1`] = ` -[ - { - id: "one", - node: "one", - path: [ - "one", - ], - type: { - title: "func_75", - type: "function", - }, - }, - { - id: "one.id", - node: "id", - path: [ - "one", - "id", - ], - type: { - format: "uuid", - title: "string_12", - type: "string", - }, - }, - { - id: "one.email", - node: "email", - path: [ - "one", - "email", - ], - type: { - format: "email", - title: "string_13", - type: "string", - }, - }, - { - id: "one.nested", - node: "nested", - path: [ - "one", - "nested", - ], - type: { - title: "object_19", - type: "object", - }, - }, - { - id: "one.nested.first", - node: "first", - path: [ - "one", - "nested", - "first", - ], - type: { - title: "string_14", - type: "string", - }, - }, - { - id: "one.nested.second", - node: "second", - path: [ - "one", - "nested", - "second", - ], - type: { - title: "list_16", - type: "list", - }, - }, - { - id: "one.nested.third", - node: "third", - path: [ - "one", - "nested", - "third", - ], - type: { - title: "optional_18", - type: "optional", - }, - }, -] -`; - snapshot[`planner 2`] = ` { one: { @@ -201,6 +108,99 @@ snapshot[`planner 4`] = ` ] `; +snapshot[`planner 1`] = ` +[ + { + id: "one", + node: "one", + path: [ + "one", + ], + type: { + title: "func_75", + type: "function", + }, + }, + { + id: "one.id", + node: "id", + path: [ + "one", + "id", + ], + type: { + format: "uuid", + title: "string_12", + type: "string", + }, + }, + { + id: "one.email", + node: "email", + path: [ + "one", + "email", + ], + type: { + format: "email", + title: "string_13", + type: "string", + }, + }, + { + id: "one.nested", + node: "nested", + path: [ + "one", + "nested", + ], + type: { + title: "object_19", + type: "object", + }, + }, + { + id: "one.nested.first", + node: "first", + path: [ + "one", + "nested", + "first", + ], + type: { + title: "string_14", + type: "string", + }, + }, + { + id: "one.nested.second", + node: "second", + path: [ + "one", + "nested", + "second", + ], + type: { + title: "list_16", + type: "list", + }, + }, + { + id: "one.nested.third", + node: "third", + path: [ + "one", + "nested", + "third", + ], + type: { + title: "optional_18", + type: "optional", + }, + }, +] +`; + snapshot[`planner: dependencies 1`] = ` [ "two two two object object_68 false", diff --git a/typegate/tests/runtimes/python_wasi/py/hello.py b/typegate/tests/runtimes/python/py/hello.py similarity index 100% rename from typegate/tests/runtimes/python_wasi/py/hello.py rename to typegate/tests/runtimes/python/py/hello.py diff --git a/typegate/tests/runtimes/python_wasi/py/nested/dep.py b/typegate/tests/runtimes/python/py/nested/dep.py similarity index 100% rename from typegate/tests/runtimes/python_wasi/py/nested/dep.py rename to typegate/tests/runtimes/python/py/nested/dep.py diff --git a/typegate/tests/runtimes/python_wasi/python_wasi.py b/typegate/tests/runtimes/python/python.py similarity index 95% rename from typegate/tests/runtimes/python_wasi/python_wasi.py rename to typegate/tests/runtimes/python/python.py index 8412e7e4e9..e4142f2b7e 100644 --- a/typegate/tests/runtimes/python_wasi/python_wasi.py +++ b/typegate/tests/runtimes/python/python.py @@ -46,7 +46,7 @@ def infinite_loop(x): @typegraph() -def python_wasi(g: Graph): +def python(g: Graph): public = Policy.public() python = PythonRuntime() @@ -91,13 +91,13 @@ def python_wasi(g: Graph): gate = f"http://localhost:{PORT}" auth = BasicAuth("admin", "password") -pytho_wasi_tg = python_wasi() +pytho_tg = python() deploy_result = tg_deploy( - pytho_wasi_tg, + pytho_tg, TypegraphDeployParams( base_url=gate, auth=auth, - typegraph_path=os.path.join(cwd, "python_wasi.py"), + typegraph_path=os.path.join(cwd, "python.py"), artifacts_config=ArtifactResolutionConfig( dir=cwd, prefix=None, diff --git a/typegate/tests/runtimes/python_wasi/python_wasi.ts b/typegate/tests/runtimes/python/python.ts similarity index 94% rename from typegate/tests/runtimes/python_wasi/python_wasi.ts rename to typegate/tests/runtimes/python/python.ts index 0292e6ec4d..4e0260ee70 100644 --- a/typegate/tests/runtimes/python_wasi/python_wasi.ts +++ b/typegate/tests/runtimes/python/python.ts @@ -10,7 +10,7 @@ const tpe = t.struct({ "b": t.list(t.either([t.integer(), t.string()])), }); -export const tg = await typegraph("python_wasi", (g: any) => { +export const tg = await typegraph("python", (g: any) => { const python = new PythonRuntime(); const pub = Policy.public(); diff --git a/typegate/tests/runtimes/python_wasi/python_wasi_test.ts b/typegate/tests/runtimes/python/python_test.ts similarity index 91% rename from typegate/tests/runtimes/python_wasi/python_wasi_test.ts rename to typegate/tests/runtimes/python/python_test.ts index 7f3a8948b7..61f1a3214a 100644 --- a/typegate/tests/runtimes/python_wasi/python_wasi_test.ts +++ b/typegate/tests/runtimes/python/python_test.ts @@ -3,15 +3,16 @@ import { assert, assertEquals } from "std/assert/mod.ts"; import { gql, Meta } from "test-utils/mod.ts"; -import { WitWireMessenger } from "../../../src/runtimes/python_wasi/wit_wire.ts"; +import { WitWireMessenger } from "../../../src/runtimes/wit_wire/mod.ts"; +import { QueryEngine } from "../../../src/engine/query_engine.ts"; import type { ResolverArgs } from "../../../src/types.ts"; import { testDir } from "test-utils/dir.ts"; -import { tg } from "./python_wasi.ts"; +import { tg } from "./python.ts"; import * as path from "std/path/mod.ts"; import { QueryEngine } from "../../../src/engine/query_engine.ts"; import { BasicAuth, tgDeploy } from "@typegraph/sdk/tg_deploy.js"; -const cwd = path.join(testDir, "runtimes/python_wasi"); +const cwd = path.join(testDir, "runtimes/python"); const auth = new BasicAuth("admin", "password"); const localSerializedMemo = tg.serialize({ @@ -29,7 +30,7 @@ const reusableTgOutput = { serialize: (_: any) => localSerializedMemo, }; -Meta.test("Python WASI VM performance", async (t) => { +Meta.test("Python VM performance", async (t) => { await t.should("work with low latency for lambdas", async () => { await using wire = await WitWireMessenger.init( "inline://pyrt_wit_wire.cwasm", @@ -106,13 +107,13 @@ Meta.test("Python WASI VM performance", async (t) => { Meta.test( { - name: "Python WASI runtime", + name: "Python runtime", port: true, systemTypegraphs: true, }, async (t) => { const e = await t.engineFromTgDeployPython( - "runtimes/python_wasi/python_wasi.py", + "runtimes/python/python.py", cwd, ); @@ -194,7 +195,7 @@ Meta.test( const duration = end - start; console.log(`duration: ${duration}ms`); - assert(duration < 800, `Python WASI runtime was too slow: ${duration}ms`); + assert(duration < 800, `Python runtime was too slow: ${duration}ms`); }); }, ); @@ -224,7 +225,7 @@ Meta.test( }, dir: cwd, }, - typegraphPath: path.join(cwd, "python_wasi.ts"), + typegraphPath: path.join(cwd, "python.ts"), secrets: {}, }, ); @@ -272,7 +273,7 @@ Meta.test( /* Meta.test( { - name: "Python WASI: upload artifacts with deps", + name: "Python: upload artifacts with deps", port: true, systemTypegraphs: true, }, @@ -296,7 +297,7 @@ Meta.test( }, dir: cwd, }, - typegraphPath: path.join(cwd, "pyton_wasi.ts"), + typegraphPath: path.join(cwd, "pyton.ts"), secrets: {}, }, ); @@ -324,14 +325,14 @@ Meta.test( Meta.test( { - name: "Python WASI: infinite loop or similar", + name: "Python: infinite loop or similar", sanitizeOps: false, port: true, systemTypegraphs: true, }, async (t) => { const e = await t.engineFromTgDeployPython( - "runtimes/python_wasi/python_wasi.py", + "runtimes/python/python.py", cwd, ); @@ -366,7 +367,7 @@ Meta.test( Meta.test( { - name: "Python WASI: typegate reloading", + name: "Python: typegate reloading", port: true, systemTypegraphs: true, }, @@ -390,7 +391,7 @@ Meta.test( }, dir: cwd, }, - typegraphPath: path.join(cwd, "python_wasi.ts"), + typegraphPath: path.join(cwd, "python.ts"), secrets: {}, }, ); @@ -398,7 +399,7 @@ Meta.test( return await metaTest.engineFromDeployed(serialized); }; - const runPythonOnPythonWasi = async (currentEngine: QueryEngine) => { + const runPythonOnPython = async (currentEngine: QueryEngine) => { await gql` query { identityDef(input: { a: "hello", b: [1, 2, "three"] }) { @@ -433,14 +434,14 @@ Meta.test( }; const engine = await load(); await metaTest.should("work before typegate is reloaded", async () => { - await runPythonOnPythonWasi(engine); + await runPythonOnPython(engine); }); // reload const reloadedEngine = await load(); await metaTest.should("work after typegate is reloaded", async () => { - await runPythonOnPythonWasi(reloadedEngine); + await runPythonOnPython(reloadedEngine); }); }, ); diff --git a/typegate/tests/utils/bindings_test.ts b/typegate/tests/utils/bindings_test.ts index be918b1f13..62985c71ad 100644 --- a/typegate/tests/utils/bindings_test.ts +++ b/typegate/tests/utils/bindings_test.ts @@ -8,6 +8,7 @@ import { validate_prisma_runtime_data, wasmtime_wit, } from "native"; +import type { WasmInput } from "../../engine/runtime.js"; function assert(val: T) { if (!val) throw Error("assertion failed"); diff --git a/typegraph/core/src/conversion/runtimes.rs b/typegraph/core/src/conversion/runtimes.rs index 5f5ac0db86..3fee68fd9a 100644 --- a/typegraph/core/src/conversion/runtimes.rs +++ b/typegraph/core/src/conversion/runtimes.rs @@ -427,7 +427,7 @@ pub fn convert_runtime(_c: &mut TypegraphContext, runtime: Runtime) -> Result { - Ok(TGRuntime::Known(Rt::PythonWasi(PythonRuntimeData { config: None })).into()) + Ok(TGRuntime::Known(Rt::Python(PythonRuntimeData { config: None })).into()) } Runtime::Random(d) => Ok(TGRuntime::Known(Rt::Random(RandomRuntimeData { seed: d.seed, From 93e1a7d476254737a443b005040f6c422bb08b71 Mon Sep 17 00:00:00 2001 From: Yohe-Am <56622350+Yohe-Am@users.noreply.github.com> Date: Wed, 24 Apr 2024 06:05:32 +0000 Subject: [PATCH 08/16] wip: import module support --- .ghjk/.gitignore | 2 +- .ghjk/lock.json | 93 ---------------- Cargo.lock | 1 + typegate/engine/Cargo.toml | 2 + typegate/engine/src/lib.rs | 8 +- typegate/engine/src/runtimes/wit_wire.rs | 61 ++++++----- typegate/src/runtimes/python.ts | 128 +++++++++++++++-------- 7 files changed, 128 insertions(+), 167 deletions(-) diff --git a/.ghjk/.gitignore b/.ghjk/.gitignore index 996b9f8c22..abf95c1618 100644 --- a/.ghjk/.gitignore +++ b/.ghjk/.gitignore @@ -1,2 +1,2 @@ envs -hash.json +hash.json \ No newline at end of file diff --git a/.ghjk/lock.json b/.ghjk/lock.json index 0d5e15f92b..0bddfbf1b1 100644 --- a/.ghjk/lock.json +++ b/.ghjk/lock.json @@ -392,37 +392,6 @@ "crateName": "whiz", "locked": true }, - "c9f51792ad7f2c2d6f64976a8b712ae3e37f07b568ff409013dacbd285ac19a0": { - "version": "20.0.0", - "depConfigs": { - "cargo_binstall_ghrel": { - "version": "v1.6.4", - "depConfigs": {}, - "portRef": "cargo_binstall_ghrel@0.1.0" - }, - "rust_rustup": { - "version": "1.77.2", - "depConfigs": { - "rustup_rustlang": { - "version": "1.27.0", - "depConfigs": { - "git_aa": { - "version": "2.40.1", - "depConfigs": {}, - "portRef": "git_aa@0.1.0" - } - }, - "portRef": "rustup_rustlang@0.1.0" - } - }, - "portRef": "rust_rustup@0.1.0", - "profile": "minimal" - } - }, - "portRef": "cargobi_cratesio@0.1.0", - "crateName": "wasmtime-cli", - "locked": true - }, "3552829e559260faef01394d084d1c64d8da0b0fde33000127ae676322402254": { "version": "0.13.3", "depConfigs": { @@ -462,68 +431,6 @@ } }, "portRef": "cpy_bs_ghrel@0.1.0" - }, - "f1552d80bc05967757fc8f6530cfb4a0f875a6e6d46167eedc2530b533abac26": { - "version": "19.0.2", - "depConfigs": { - "cargo_binstall_ghrel": { - "version": "v1.6.4", - "depConfigs": {}, - "portRef": "cargo_binstall_ghrel@0.1.0" - }, - "rust_rustup": { - "version": "1.77.2", - "depConfigs": { - "rustup_rustlang": { - "version": "1.27.0", - "depConfigs": { - "git_aa": { - "version": "2.40.1", - "depConfigs": {}, - "portRef": "git_aa@0.1.0" - } - }, - "portRef": "rustup_rustlang@0.1.0" - } - }, - "portRef": "rust_rustup@0.1.0", - "profile": "minimal" - } - }, - "portRef": "cargobi_cratesio@0.1.0", - "crateName": "wasmtime-cli", - "locked": true - }, - "d7e75b813748aaecfc889b73be7e9615eadceb4790eacb449f0c3a1bb24a5c42": { - "version": "19.0.0", - "depConfigs": { - "cargo_binstall_ghrel": { - "version": "v1.6.4", - "depConfigs": {}, - "portRef": "cargo_binstall_ghrel@0.1.0" - }, - "rust_rustup": { - "version": "1.77.2", - "depConfigs": { - "rustup_rustlang": { - "version": "1.27.0", - "depConfigs": { - "git_aa": { - "version": "2.40.1", - "depConfigs": {}, - "portRef": "git_aa@0.1.0" - } - }, - "portRef": "rustup_rustlang@0.1.0" - } - }, - "portRef": "rust_rustup@0.1.0", - "profile": "minimal" - } - }, - "portRef": "cargobi_cratesio@0.1.0", - "crateName": "wasmtime-cli", - "locked": true } } }, diff --git a/Cargo.lock b/Cargo.lock index 9f884094be..52baba6b62 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12047,6 +12047,7 @@ dependencies = [ "anyhow", "async-trait", "base64 0.21.7", + "cap-std", "common", "connection-string", "convert_case 0.6.0", diff --git a/typegate/engine/Cargo.toml b/typegate/engine/Cargo.toml index 1ef4716a44..4ba4a0d503 100644 --- a/typegate/engine/Cargo.toml +++ b/typegate/engine/Cargo.toml @@ -36,6 +36,8 @@ typescript.workspace = true wasmtime = { workspace = true, features = ["component-model"] } wasmtime-wasi.workspace = true +# remove when bumping wasmtime to 20 +cap-std = "3" shadow-rs.workspace = true serde.workspace = true diff --git a/typegate/engine/src/lib.rs b/typegate/engine/src/lib.rs index 49f456450b..75b50770a0 100644 --- a/typegate/engine/src/lib.rs +++ b/typegate/engine/src/lib.rs @@ -82,8 +82,12 @@ impl OpDepInjector { .unwrap(), ) .expect("invalid wasmtime engine config"); - state.put(runtimes::wit_wire::Ctx::new(engine)); - state.put(runtimes::prisma::Ctx::new(self.tmp_dir.unwrap())); + let tmp_dir = self.tmp_dir.unwrap(); + state.put(runtimes::wit_wire::Ctx::new( + engine, + tmp_dir.join("wit_wire_workdir"), + )); + state.put(runtimes::prisma::Ctx::new(tmp_dir)); } } diff --git a/typegate/engine/src/runtimes/wit_wire.rs b/typegate/engine/src/runtimes/wit_wire.rs index b25813198a..a7069780d1 100644 --- a/typegate/engine/src/runtimes/wit_wire.rs +++ b/typegate/engine/src/runtimes/wit_wire.rs @@ -22,23 +22,19 @@ pub struct Ctx { engine: wasmtime::Engine, instances: Arc>, components: Arc>, + instance_workdir: PathBuf, } #[derive(Clone)] -struct LinkedComponent(Component, Arc>); - -/* static WASI_CTX: once_cell::sync::Lazy = once_cell::sync::Lazy::new(|| { - wasmtime_wasi::WasiCtxBuilder::new() - .allow_ip_name_lookup(true) - .build() -}); */ +struct LinkedComponent(Component, Arc>); impl Ctx { - pub fn new(engine: wasmtime::Engine) -> Self { + pub fn new(engine: wasmtime::Engine, instance_workdir: PathBuf) -> Self { Self { instances: Default::default(), components: Default::default(), engine, + instance_workdir, } } @@ -88,11 +84,11 @@ impl Ctx { })? } }; - let mut linker = Linker::::new(&self.engine); + let mut linker = Linker::::new(&self.engine); for res in [ - wasmtime_wasi::bindings::Imports::add_to_linker(&mut linker, |host| host), - wit::Pyrt::add_to_linker(&mut linker, |host| host), + wasmtime_wasi::bindings::Imports::add_to_linker(&mut linker, |state| state), + wit::Pyrt::add_to_linker(&mut linker, |state| &mut state.tg_host), ] { res.map_err(|err| format!("erorr trying to link component: {err}"))?; } @@ -108,37 +104,37 @@ impl Ctx { struct Instance { bindings: wit::Pyrt, _instance: wasmtime::component::Instance, - store: wasmtime::Store, + store: wasmtime::Store, } -struct TypegateHost { +struct InstanceState { table: wasmtime_wasi::ResourceTable, ctx: wasmtime_wasi::WasiCtx, + tg_host: TypegateHost, } -impl TypegateHost { - fn new() -> Self { +impl InstanceState { + fn new(preopen_dir: impl AsRef, tg_host: TypegateHost) -> Self { Self { ctx: wasmtime_wasi::WasiCtxBuilder::new() .allow_ip_name_lookup(true) + .preopened_dir( + cap_std::fs::Dir::open_ambient_dir(preopen_dir, cap_std::ambient_authority()) + .unwrap(), + wasmtime_wasi::DirPerms::all(), + wasmtime_wasi::FilePerms::all(), + ".", + ) // TODO: stream stdio to debug log .inherit_stdio() .build(), table: Default::default(), + tg_host, } } } -#[async_trait::async_trait] -impl Host for TypegateHost { - async fn hostcall(&mut self, _req: HostReq) -> wasmtime::Result { - todo!() - } -} - -impl wit::metatype::pyrt::shared::Host for TypegateHost {} - -impl wasmtime_wasi::WasiView for TypegateHost { +impl wasmtime_wasi::WasiView for InstanceState { fn table(&mut self) -> &mut wasmtime_wasi::ResourceTable { &mut self.table } @@ -153,6 +149,16 @@ pub struct WitWireInitArgs { metatype_version: String, expected_ops: Vec, } +struct TypegateHost {} + +#[async_trait::async_trait] +impl Host for TypegateHost { + async fn hostcall(&mut self, _req: HostReq) -> wasmtime::Result { + todo!() + } +} + +impl wit::metatype::pyrt::shared::Host for TypegateHost {} impl From for InitArgs { fn from(value: WitWireInitArgs) -> Self { @@ -240,7 +246,10 @@ pub async fn op_wit_wire_init( .await .map_err(WitWireInitError::ModuleErr)?; - let mut store = wasmtime::Store::new(&ctx.engine, TypegateHost::new()); + let mut store = wasmtime::Store::new( + &ctx.engine, + InstanceState::new(ctx.instance_workdir.join(&instance_id), TypegateHost {}), + ); let (bindings, instance) = wit::Pyrt::instantiate_async(&mut store, component, linker) .await .map_err(|err| { diff --git a/typegate/src/runtimes/python.ts b/typegate/src/runtimes/python.ts index 2758e69276..f3627bb912 100644 --- a/typegate/src/runtimes/python.ts +++ b/typegate/src/runtimes/python.ts @@ -6,7 +6,7 @@ import { getLogger } from "../log.ts"; import { Runtime } from "./Runtime.ts"; import type { Resolver, RuntimeInitParams } from "../types.ts"; import { ComputeStage } from "../engine/query_engine.ts"; -import { Materializer } from "../typegraph/types.ts"; +import { Artifact, Materializer } from "../typegraph/types.ts"; import * as ast from "graphql/ast"; import { WitWireMessenger } from "./wit_wire/mod.ts"; import { WitWireMatInfo } from "../../engine/runtime.js"; @@ -24,50 +24,88 @@ export class PythonRuntime extends Runtime { } static async init(params: RuntimeInitParams): Promise { - const { materializers, typegraphName } = params; - - const wireMatInfos = materializers.map((mat) => { - let matData: object; - switch (mat.name) { - case "lambda": - matData = { - ty: "lambda", - source: mat.data.fn as string, - effect: mat.effect, - }; - break; - case "def": - matData = { - ty: "def", - source: mat.data.fn as string, - func_name: mat.data.name as string, - effect: mat.effect, - }; - break; - /* case "import_function": { - const pyModMat = typegraph.materializers[mat.data.mod as number]; - const code = pyModMat.data.code as string; - matData = { - ty: "import_function", - source: mat.data.fn as string, - func_name: mat.data.name as string, - effect: mat.effect, - }; - break; - } */ - default: - throw new Error(`unsupported materializer type: ${mat.name}`); - } - const out: WitWireMatInfo = { - op_name: mat.data.name as string, - // TODO: hashing - mat_hash: mat.data.name as string, - // TODO: title of materializer type? - mat_title: mat.data.name as string, - mat_data_json: JSON.stringify(matData), - }; - return out; - }); + const { materializers, typegraphName, typegraph, typegate } = params; + + const wireMatInfos = await Promise.all(materializers.map( + async (mat) => { + let matData: object; + switch (mat.name) { + case "lambda": + matData = { + ty: "lambda", + source: mat.data.fn as string, + effect: mat.effect, + }; + break; + case "def": + matData = { + ty: "def", + source: mat.data.fn as string, + func_name: mat.data.name as string, + effect: mat.effect, + }; + break; + case "import_function": { + const pyModMat = typegraph.materializers[mat.data.mod as number]; + + // resolve the python module artifacts/files + const { pythonArtifact, depsMeta: depArtifacts } = pyModMat.data; + + const deps = depArtifacts as Artifact[]; + const artifact = pythonArtifact as Artifact; + + const sources = Object.fromEntries( + await Promise.all( + [ + { + typegraphName: typegraphName, + relativePath: artifact.path, + hash: artifact.hash, + sizeInBytes: artifact.size, + }, + ...deps.map((dep) => { + return { + typegraphName: typegraphName, + relativePath: dep.path, + hash: dep.hash, + sizeInBytes: dep.size, + }; + }), + ].map( + async (meta) => + [ + meta.relativePath, + await Deno.readTextFile( + await typegate.artifactStore.getLocalPath(meta), + ), + ] as const, + ), + ), + ); + + matData = { + ty: "import_function", + effect: mat.effect, + sources, + rootSourcePath: artifact.path, + func_name: mat.data.name as string, + }; + break; + } + default: + throw new Error(`unsupported materializer type: ${mat.name}`); + } + const out: WitWireMatInfo = { + op_name: mat.data.name as string, + // TODO: hashing + mat_hash: mat.data.name as string, + // TODO: title of materializer type? + mat_title: mat.data.name as string, + mat_data_json: JSON.stringify(matData), + }; + return out; + }, + )); // add default vm for lambda/def const uuid = crypto.randomUUID(); From ab4705f46a1639f903fa34d2864b3bb1c29774dc Mon Sep 17 00:00:00 2001 From: Yohe-Am <56622350+Yohe-Am@users.noreply.github.com> Date: Tue, 30 Apr 2024 06:21:28 +0000 Subject: [PATCH 09/16] fix: rebase bugs --- .github/workflows/tests.yml | 4 +- Cargo.lock | 2 - dev/Dockerfile | 5 -- poetry.lock | 60 +++++++++++++++++++----- typegate/engine/Cargo.toml | 3 -- typegate/engine/src/runtimes/wit_wire.rs | 12 +++-- 6 files changed, 57 insertions(+), 29 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 150ec6060f..256aae8381 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -190,8 +190,8 @@ jobs: # docker buildx action broken as of 2024-02-09 - platform: linux/arm64 runner: custom-macos - - platform: linux/arm64 - runner: macos-14 + # - platform: linux/arm64 + # runner: macos-14 steps: - uses: actions/checkout@v4 - uses: docker/setup-buildx-action@v3 diff --git a/Cargo.lock b/Cargo.lock index 52baba6b62..9637a79ac5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12045,9 +12045,7 @@ name = "typegate_engine" version = "0.3.7-0" dependencies = [ "anyhow", - "async-trait", "base64 0.21.7", - "cap-std", "common", "connection-string", "convert_case 0.6.0", diff --git a/dev/Dockerfile b/dev/Dockerfile index 24af53e787..479623677f 100644 --- a/dev/Dockerfile +++ b/dev/Dockerfile @@ -60,11 +60,6 @@ COPY ghjk.ts . RUN OCI=1 NO_PYTHON=1 ghjk ports sync ENV GHJK_ENV=/root/.local/share/ghjk/env.sh -# ARG WASM_OPT_VERSION=0.116.0 -# ARG WASM_TOOLS_VERSION=1.0.53 -# RUN cargo install wasm-opt@$WASM_OPT_VERSION --locked --debug -# RUN cargo install wasm-tools@$WASM_TOOLS_VERSION --locked --debug - COPY --from=plan /app/recipe.json recipe.json RUN . $GHJK_ENV \ diff --git a/poetry.lock b/poetry.lock index fcc3d8c788..4f48552058 100644 --- a/poetry.lock +++ b/poetry.lock @@ -50,13 +50,13 @@ files = [ [[package]] name = "exceptiongroup" -version = "1.2.0" +version = "1.2.1" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, - {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, + {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, + {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, ] [package.extras] @@ -129,6 +129,24 @@ files = [ {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] +[[package]] +name = "importlib-resources" +version = "6.4.0" +description = "Read resources from Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_resources-6.4.0-py3-none-any.whl", hash = "sha256:50d10f043df931902d4194ea07ec57960f66a80449ff867bfe782b4c486ba78c"}, + {file = "importlib_resources-6.4.0.tar.gz", hash = "sha256:cdb2b453b8046ca4e3798eb1d84f3cce1446a0e8e7b5ef4efb600f19fc398145"}, +] + +[package.dependencies] +zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["jaraco.test (>=5.4)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)", "zipp (>=3.17)"] + [[package]] name = "python-box" version = "7.1.1" @@ -285,7 +303,7 @@ files = [ [[package]] name = "typegraph" version = "0.3.7-0" -description = "Declarative API development platform. Build serverless backends with zero-trust and less code, no matter where and how your (legacy) systems are." +description = "Declarative API development platform. Build backend components with WASM/Typescript/Python, no matter where and how your (legacy) systems are." optional = false python-versions = ">=3.8,<4.0" files = [] @@ -295,7 +313,7 @@ develop = true astunparse = "^1.6.3" python-box = "^7.1.1" typing-extensions = "^4.8.0" -wasmtime = "^18.0.2" +wasmtime = "^20.0.0" [package.source] type = "directory" @@ -314,19 +332,22 @@ files = [ [[package]] name = "wasmtime" -version = "18.0.2" +version = "20.0.0" description = "A WebAssembly runtime powered by Wasmtime" optional = false python-versions = ">=3.8" files = [ - {file = "wasmtime-18.0.2-py3-none-any.whl", hash = "sha256:49625d389ddd766f5416a1723a76a25473df1dbe6ad706902b7bdbfa549ec3df"}, - {file = "wasmtime-18.0.2-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:190f182e51f7f0e5340a7ffeb01519eb759748872a2bb227c6b1c055cbee61ce"}, - {file = "wasmtime-18.0.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:817c780eb506deaabe31cf23c5e9fe9ab9a1815bc0b805d292ec7502c495e10a"}, - {file = "wasmtime-18.0.2-py3-none-manylinux1_x86_64.whl", hash = "sha256:30adbf2fb380aae2d7cfd18c6f14d7633d62a8204caf185b7557b2364533268d"}, - {file = "wasmtime-18.0.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:c43d281df87af4139735aa62950d855499f58f72778b0e7a79488b3b8807d108"}, - {file = "wasmtime-18.0.2-py3-none-win_amd64.whl", hash = "sha256:7ccc88a9ee2bb601dbd1dc065a22af7b2f1a85c39b1aa8ebfb8ea57f78157d35"}, + {file = "wasmtime-20.0.0-py3-none-any.whl", hash = "sha256:6d9806e34c7cebe3d2ff4ba58a0c7db3648d4d952a0b6821aed4c4d966a4b312"}, + {file = "wasmtime-20.0.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:2ae53f5d84f071f42bf7c05da3bfe4a18e0b5ad801931188bff2e5092137213e"}, + {file = "wasmtime-20.0.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3f9ea16cf19039c5dc11d1f9a8f024ebb0d4c6cd1cbb2d0889797326f8ba5c06"}, + {file = "wasmtime-20.0.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:137c92cfde23b9ed18a85d5d1a1bfa844f1322c3bd80bc36c3b5adc3322f4a6e"}, + {file = "wasmtime-20.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:69505f8c1f42815c3784f77df5b3be9f4742ede56299a0f2d7d71083893e855d"}, + {file = "wasmtime-20.0.0-py3-none-win_amd64.whl", hash = "sha256:8ddb958a1b6eed88e56ec4aaae9478c273bed2e4fcd3331f29fda8d9d12def3d"}, ] +[package.dependencies] +importlib-resources = ">=5.10" + [package.extras] testing = ["coverage", "pycparser", "pytest", "pytest-mypy"] @@ -344,6 +365,21 @@ files = [ [package.extras] test = ["pytest (>=6.0.0)", "setuptools (>=65)"] +[[package]] +name = "zipp" +version = "3.18.1" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"}, + {file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] + [metadata] lock-version = "2.0" python-versions = ">=3.8,<4.0" diff --git a/typegate/engine/Cargo.toml b/typegate/engine/Cargo.toml index 4ba4a0d503..64eaa4dfed 100644 --- a/typegate/engine/Cargo.toml +++ b/typegate/engine/Cargo.toml @@ -36,14 +36,11 @@ typescript.workspace = true wasmtime = { workspace = true, features = ["component-model"] } wasmtime-wasi.workspace = true -# remove when bumping wasmtime to 20 -cap-std = "3" shadow-rs.workspace = true serde.workspace = true regex = "1.10.2" zstd = "0.13" -async-trait = "0.1" [dev-dependencies] env_logger.workspace = true diff --git a/typegate/engine/src/runtimes/wit_wire.rs b/typegate/engine/src/runtimes/wit_wire.rs index a7069780d1..48032b49cb 100644 --- a/typegate/engine/src/runtimes/wit_wire.rs +++ b/typegate/engine/src/runtimes/wit_wire.rs @@ -87,7 +87,7 @@ impl Ctx { let mut linker = Linker::::new(&self.engine); for res in [ - wasmtime_wasi::bindings::Imports::add_to_linker(&mut linker, |state| state), + wasmtime_wasi::add_to_linker_async(&mut linker), wit::Pyrt::add_to_linker(&mut linker, |state| &mut state.tg_host), ] { res.map_err(|err| format!("erorr trying to link component: {err}"))?; @@ -115,16 +115,18 @@ struct InstanceState { impl InstanceState { fn new(preopen_dir: impl AsRef, tg_host: TypegateHost) -> Self { + let preopen_dir = preopen_dir.as_ref(); Self { ctx: wasmtime_wasi::WasiCtxBuilder::new() .allow_ip_name_lookup(true) .preopened_dir( - cap_std::fs::Dir::open_ambient_dir(preopen_dir, cap_std::ambient_authority()) - .unwrap(), + preopen_dir, + ".", wasmtime_wasi::DirPerms::all(), wasmtime_wasi::FilePerms::all(), - ".", ) + .with_context(|| format!("error preopening dir for instance at {preopen_dir:?}")) + .unwrap() // TODO: stream stdio to debug log .inherit_stdio() .build(), @@ -151,7 +153,7 @@ pub struct WitWireInitArgs { } struct TypegateHost {} -#[async_trait::async_trait] +#[wasmtime_wasi::async_trait] impl Host for TypegateHost { async fn hostcall(&mut self, _req: HostReq) -> wasmtime::Result { todo!() From 3d989a6e7a16efa7b5e1bce87d547f3832702c6e Mon Sep 17 00:00:00 2001 From: Yohe-Am <56622350+Yohe-Am@users.noreply.github.com> Date: Tue, 30 Apr 2024 19:21:52 +0300 Subject: [PATCH 10/16] feat(metagen): `mdk_rs` finalization (#673) - Finalizes the host side of the `wit_wire` implementation started in #687 . - Fixes a few issues with the `mdk_rust` generator. #### Motivation and context The code generator was already in place but we the typegate had no support for the `wit_wire` interface used by the rust mdk. This PR adds that. The two week delay is mainly due to the base work required in #669 and related PRs. #### Migration notes _No breaking changes on user._ ### Checklist - [x] The change come with new or modified tests - [x] Hard-to-understand functions have explanatory comments - [ ] End-user documentation is updated to reflect the change --- .gitignore | 2 +- .pre-commit-config.yaml | 1 + Cargo.lock | 23 + Cargo.toml | 8 +- dev/Dockerfile.dockerignore | 1 + examples/deploy/deploy.mjs | 2 +- examples/deploy/deploy.py | 3 +- ghjk.ts | 13 +- libs/common/src/typegraph/runtimes/mod.rs | 6 +- libs/common/src/typegraph/runtimes/wasm.rs | 6 +- libs/metagen/Cargo.toml | 1 + libs/metagen/src/config.rs | 2 + libs/metagen/src/lib.rs | 36 +- libs/metagen/src/mdk/mdk.wit | 42 -- libs/metagen/src/mdk_rust/mod.rs | 214 +++++-- libs/metagen/src/mdk_rust/static/Cargo.toml | 2 +- libs/metagen/src/mdk_rust/static/lib.rs | 4 + libs/metagen/src/mdk_rust/static/mdk.rs | 129 ++++ libs/metagen/src/mdk_rust/static/mod.rs | 37 -- libs/metagen/src/mdk_rust/stubs.rs | 105 +++- libs/metagen/src/mdk_rust/types.rs | 553 ++++++++++++------ libs/metagen/src/tests/mod.rs | 7 +- libs/metagen/src/utils.rs | 8 +- libs/metagen/tests/mat_rust/lib.rs | 18 +- libs/metagen/tests/placeholder | 0 libs/metagen/tests/tg.ts | 14 +- libs/pyrt_wit_wire/main.py | 144 ++++- meta-cli/src/cli/gen.rs | 14 +- rustfmt.toml | 1 + typegate/engine/build.rs | 10 +- typegate/engine/runtime.d.ts | 14 +- typegate/engine/src/lib.rs | 8 +- .../src/runtimes/prisma/engine_import.rs | 2 +- typegate/engine/src/runtimes/wit_wire.rs | 160 ++--- typegate/src/engine/planner/mod.ts | 20 +- typegate/src/engine/query_engine.ts | 8 +- typegate/src/log.ts | 11 +- typegate/src/main.ts | 10 +- typegate/src/runtimes/Runtime.ts | 2 +- typegate/src/runtimes/mod.ts | 6 +- typegate/src/runtimes/python.ts | 182 +++--- .../runtimes/{wasm.ts => wasm_reflected.ts} | 27 +- typegate/src/runtimes/wasm_wire.ts | 116 ++++ typegate/src/runtimes/wit_wire/mod.ts | 103 +++- .../src/services/auth/protocols/oauth2.ts | 2 +- typegate/src/services/graphql_service.ts | 11 +- typegate/src/typegate/artifacts/local.ts | 10 +- typegate/src/typegate/artifacts/mod.ts | 2 +- typegate/src/typegraph/types.ts | 7 +- typegate/tests/metatype.yml | 8 + typegate/tests/runtimes/python/py/hello.py | 7 +- typegate/tests/runtimes/python/python.py | 14 +- typegate/tests/runtimes/python/python.ts | 4 +- typegate/tests/runtimes/python/python_test.ts | 17 +- typegate/tests/runtimes/wasm/rust.wasm | Bin 2227814 -> 0 bytes typegate/tests/runtimes/wasm/rust/build.sh | 10 - typegate/tests/runtimes/wasm/wasm.ts | 50 -- .../tests/runtimes/wasm_reflected/rust.wasm | Bin 0 -> 22545 bytes .../{wasm => wasm_reflected}/rust/Cargo.lock | 0 .../{wasm => wasm_reflected}/rust/Cargo.toml | 4 + .../runtimes/wasm_reflected/rust/build.sh | 11 + .../{wasm => wasm_reflected}/rust/src/lib.rs | 0 .../rust/wit/example.wit | 0 .../wasm_reflected.py} | 9 +- .../runtimes/wasm_reflected/wasm_reflected.ts | 45 ++ .../wasm_reflected_test.ts} | 15 +- .../runtimes/wasm_reflected/wasm_sync_test.ts | 166 ++++++ typegate/tests/runtimes/wasm_wire/rust.wasm | Bin 0 -> 183920 bytes .../tests/runtimes/wasm_wire/rust/Cargo.lock | 314 ++++++++++ .../tests/runtimes/wasm_wire/rust/Cargo.toml | 18 + .../tests/runtimes/wasm_wire/rust/build.sh | 14 + typegate/tests/runtimes/wasm_wire/rust/lib.rs | 77 +++ typegate/tests/runtimes/wasm_wire/rust/mdk.rs | 310 ++++++++++ .../{wasm => wasm_wire}/wasm_sync_test.ts | 12 +- .../tests/runtimes/wasm_wire/wasm_wire.py | 58 ++ .../tests/runtimes/wasm_wire/wasm_wire.ts | 47 ++ .../runtimes/wasm_wire/wasm_wire_test.ts | 189 ++++++ typegate/tests/utils/bindings_test.ts | 2 +- typegate/tests/utils/shell.ts | 1 - typegraph/core/src/conversion/runtimes.rs | 19 +- typegraph/core/src/runtimes/mod.rs | 49 +- typegraph/core/src/runtimes/wasm.rs | 3 +- .../core/src/utils/postprocess/python_rt.rs | 2 +- .../core/src/utils/postprocess/wasm_rt.rs | 34 +- typegraph/core/wit/typegraph.wit | 19 +- typegraph/node/pnpm-lock.yaml | 23 +- typegraph/node/sdk/src/runtimes/wasm.ts | 80 ++- typegraph/python/typegraph/runtimes/wasm.py | 84 ++- website/static/specs/0.0.3.json | 60 +- whiz.yaml | 5 +- .../wit/pyrt.wit => wit/wit-wire.wit | 39 +- 91 files changed, 3117 insertions(+), 809 deletions(-) delete mode 100644 libs/metagen/src/mdk/mdk.wit create mode 100644 libs/metagen/src/mdk_rust/static/lib.rs create mode 100644 libs/metagen/src/mdk_rust/static/mdk.rs delete mode 100644 libs/metagen/src/mdk_rust/static/mod.rs create mode 100644 libs/metagen/tests/placeholder create mode 100644 rustfmt.toml rename typegate/src/runtimes/{wasm.ts => wasm_reflected.ts} (80%) create mode 100644 typegate/src/runtimes/wasm_wire.ts delete mode 100644 typegate/tests/runtimes/wasm/rust.wasm delete mode 100755 typegate/tests/runtimes/wasm/rust/build.sh delete mode 100644 typegate/tests/runtimes/wasm/wasm.ts create mode 100644 typegate/tests/runtimes/wasm_reflected/rust.wasm rename typegate/tests/runtimes/{wasm => wasm_reflected}/rust/Cargo.lock (100%) rename typegate/tests/runtimes/{wasm => wasm_reflected}/rust/Cargo.toml (71%) create mode 100755 typegate/tests/runtimes/wasm_reflected/rust/build.sh rename typegate/tests/runtimes/{wasm => wasm_reflected}/rust/src/lib.rs (100%) rename typegate/tests/runtimes/{wasm => wasm_reflected}/rust/wit/example.wit (100%) rename typegate/tests/runtimes/{wasm/wasm.py => wasm_reflected/wasm_reflected.py} (90%) create mode 100644 typegate/tests/runtimes/wasm_reflected/wasm_reflected.ts rename typegate/tests/runtimes/{wasm/wasm_test.ts => wasm_reflected/wasm_reflected_test.ts} (92%) create mode 100644 typegate/tests/runtimes/wasm_reflected/wasm_sync_test.ts create mode 100644 typegate/tests/runtimes/wasm_wire/rust.wasm create mode 100644 typegate/tests/runtimes/wasm_wire/rust/Cargo.lock create mode 100644 typegate/tests/runtimes/wasm_wire/rust/Cargo.toml create mode 100755 typegate/tests/runtimes/wasm_wire/rust/build.sh create mode 100644 typegate/tests/runtimes/wasm_wire/rust/lib.rs create mode 100644 typegate/tests/runtimes/wasm_wire/rust/mdk.rs rename typegate/tests/runtimes/{wasm => wasm_wire}/wasm_sync_test.ts (93%) create mode 100644 typegate/tests/runtimes/wasm_wire/wasm_wire.py create mode 100644 typegate/tests/runtimes/wasm_wire/wasm_wire.ts create mode 100644 typegate/tests/runtimes/wasm_wire/wasm_wire_test.ts rename libs/pyrt_wit_wire/wit/pyrt.wit => wit/wit-wire.wit (61%) diff --git a/.gitignore b/.gitignore index e44eaabaa2..3718e9139f 100644 --- a/.gitignore +++ b/.gitignore @@ -47,4 +47,4 @@ typegraph/python/typegraph/gen *.egg-info/ examples/typegraphs/migrations -libs/pyrt_wit_wire/pyrt +libs/pyrt_wit_wire/wit_wire diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5fd7d3c2a2..1bdc03aa12 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -118,6 +118,7 @@ repos: - --license-filepath=dev/license-header-Elastic-2.0.txt - "--comment-style=//" - "--skip-license-insertion-comment=no-auto-license-header" + - "--skip-license-insertion-comment=@generated" types_or: - rust files: ^(typegate|libs!(/metagen/.*))/ diff --git a/Cargo.lock b/Cargo.lock index 9637a79ac5..b6b32a1434 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3453,6 +3453,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "diff" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" + [[package]] name = "difflib" version = "0.4.0" @@ -6523,6 +6529,7 @@ dependencies = [ "indexmap 2.2.6", "log", "once_cell", + "pretty_assertions", "regex", "reqwest", "serde 1.0.199", @@ -8172,6 +8179,16 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6fa0831dd7cc608c38a5e323422a0077678fa5744aa2be4ad91c4ece8eec8d5" +[[package]] +name = "pretty_assertions" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66" +dependencies = [ + "diff", + "yansi", +] + [[package]] name = "prettyplease" version = "0.1.25" @@ -13834,6 +13851,12 @@ dependencies = [ "linked-hash-map", ] +[[package]] +name = "yansi" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" + [[package]] name = "zerocopy" version = "0.7.32" diff --git a/Cargo.toml b/Cargo.toml index 58f317d5c1..7dd8429cab 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,11 +6,13 @@ members = [ "typegate/engine", "typegate/standalone", "meta-cli", - "typegraph/core", ] + "typegraph/core", +] exclude = [ - "typegate/tests/runtimes/wasm/rust", - "libs/pyrt_wit_wire" + "typegate/tests/runtimes/wasm_reflected/rust", + "typegate/tests/runtimes/wasm_wire/rust", + "libs/pyrt_wit_wire", ] [workspace.package] version = "0.3.7-0" diff --git a/dev/Dockerfile.dockerignore b/dev/Dockerfile.dockerignore index 491e0f8ef8..ef004ad9ed 100644 --- a/dev/Dockerfile.dockerignore +++ b/dev/Dockerfile.dockerignore @@ -4,6 +4,7 @@ !dev/update.ts !dev/LICENSE-Elastic-2.0.md !libs/ +!wit/ !meta-cli/Cargo.toml !typegraph/core/ !typegate/engine diff --git a/examples/deploy/deploy.mjs b/examples/deploy/deploy.mjs index 204ead8b2d..c88b22aee7 100644 --- a/examples/deploy/deploy.mjs +++ b/examples/deploy/deploy.mjs @@ -22,7 +22,7 @@ const tg = await typegraph({ }, (g) => { const deno = new DenoRuntime(); const python = new PythonRuntime(); - const wasm = new WasmRuntime(); + const wasm = WasmRuntime.reflected("wasi/rust.wasm"); const prisma = new PrismaRuntime("prisma", "POSTGRES"); const pub = Policy.public(); const student = t.struct( diff --git a/examples/deploy/deploy.py b/examples/deploy/deploy.py index 51826b48ea..2d69a2daf1 100644 --- a/examples/deploy/deploy.py +++ b/examples/deploy/deploy.py @@ -18,7 +18,7 @@ def deploy_example_python(g: Graph): deno = DenoRuntime() python = PythonRuntime() - wasm = WasmRuntime() # noqa + wasm = WasmRuntime.reflected("wasi/rust.wasm") prisma = PrismaRuntime("prisma", "POSTGRES") pub = Policy.public() @@ -62,7 +62,6 @@ def deploy_example_python(g: Graph): testWasmAdd=wasm.from_wasm( t.struct({"a": t.float(), "b": t.float()}), t.integer(), - wasm="wasm/rust.wasm", func="add", ), # Prisma diff --git a/ghjk.ts b/ghjk.ts index 05300f7206..958fce23a4 100644 --- a/ghjk.ts +++ b/ghjk.ts @@ -136,8 +136,9 @@ ghjk.task("gen-pyrt-bind", { installs: installs.comp_py, allowedPortDeps, async fn({ $ }) { - await $.removeIfExists("./libs/pyrt_wit_wire/pyrt"); - await $`componentize-py -d wit/ bindings .`.cwd("./libs/pyrt_wit_wire"); + await $.removeIfExists("./libs/pyrt_wit_wire/wit_wire"); + await $`componentize-py -d ../../wit/wit-wire.wit bindings .` + .cwd("./libs/pyrt_wit_wire"); }, }); @@ -146,9 +147,11 @@ ghjk.task("build-pyrt", { allowedPortDeps, dependsOn: ["gen-pyrt-bind"], async fn({ $, argv, env }) { - const target = env["PYRT_TARGET"] ? `--target ${env["PYRT_TARGET"]}` : ""; const wasmOut = env["PYRT_WASM_OUT"] ?? "./target/pyrt.wasm"; - const cwasmOut = env["PYRT_CWASM_OUT"] ?? "./target/pyrt.cwasm"; - await $`componentize-py -d ./libs/pyrt_wit_wire/wit/ componentize -o ${wasmOut} libs.pyrt_wit_wire.main`; + // TODO: support for `world-module` is missing on the `componentize` subcmd + await $`componentize-py -d ./wit/wit-wire.wit componentize -o ${wasmOut} libs.pyrt_wit_wire.main`; + // const target = env["PYRT_TARGET"] ? `--target ${env["PYRT_TARGET"]}` : ""; + // const cwasmOut = env["PYRT_CWASM_OUT"] ?? "./target/pyrt.cwasm"; + // await `wasmtime compile -W component-model ${target} ${wasmOut} -o ${cwasmOut}`; }, }); diff --git a/libs/common/src/typegraph/runtimes/mod.rs b/libs/common/src/typegraph/runtimes/mod.rs index 5b1308ccba..2bd2f41360 100644 --- a/libs/common/src/typegraph/runtimes/mod.rs +++ b/libs/common/src/typegraph/runtimes/mod.rs @@ -55,7 +55,8 @@ pub enum KnownRuntime { PrismaMigration(PrismaMigrationRuntimeData), S3(S3RuntimeData), Temporal(TemporalRuntimeData), - Wasm(WasmRuntimeData), + WasmReflected(WasmRuntimeData), + WasmWire(WasmRuntimeData), Typegate(TypegateRuntimeData), Typegraph(TypegraphRuntimeData), } @@ -88,7 +89,8 @@ impl TGRuntime { KnownRuntime::PrismaMigration(_) => "prisma_migration", KnownRuntime::S3(_) => "s3", KnownRuntime::Temporal(_) => "temporal", - KnownRuntime::Wasm(_) => "wasm", + KnownRuntime::WasmWire(_) => "wasm_wire", + KnownRuntime::WasmReflected(_) => "wasm_reflected", KnownRuntime::Typegate(_) => "typegate", KnownRuntime::Typegraph(_) => "typegraph", }, diff --git a/libs/common/src/typegraph/runtimes/wasm.rs b/libs/common/src/typegraph/runtimes/wasm.rs index 1047a87d1a..e486183cc9 100644 --- a/libs/common/src/typegraph/runtimes/wasm.rs +++ b/libs/common/src/typegraph/runtimes/wasm.rs @@ -1,6 +1,8 @@ // Copyright Metatype OÜ, licensed under the Elastic License 2.0. // SPDX-License-Identifier: Elastic-2.0 +use std::path::PathBuf; + #[cfg(feature = "codegen")] use schemars::JsonSchema; use serde::{Deserialize, Serialize}; @@ -9,11 +11,11 @@ use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, Clone, Debug)] #[serde(rename_all = "camelCase")] pub struct WasmMatData { - pub wasm_artifact: String, + pub op_name: String, } #[cfg_attr(feature = "codegen", derive(JsonSchema))] #[derive(Serialize, Deserialize, Clone, Debug)] pub struct WasmRuntimeData { - pub config: Option, // placeholder (pre-commit fails on empty interfaces otherwise) + pub wasm_artifact: PathBuf, } diff --git a/libs/metagen/Cargo.toml b/libs/metagen/Cargo.toml index b998f8586e..1bbe90c864 100644 --- a/libs/metagen/Cargo.toml +++ b/libs/metagen/Cargo.toml @@ -16,6 +16,7 @@ garde = { version = "0.18", features = ["derive"] } heck = "0.5.0-rc.1" regex.workspace = true once_cell.workspace = true +pretty_assertions = "1.4.0" # indoc.workspace = true [dev-dependencies] diff --git a/libs/metagen/src/config.rs b/libs/metagen/src/config.rs index 4929f14693..2a9c0e05b6 100644 --- a/libs/metagen/src/config.rs +++ b/libs/metagen/src/config.rs @@ -2,6 +2,7 @@ // SPDX-License-Identifier: MPL-2.0 //! Sample yaml: +//! ```yaml //! generators: # this section only required when we support external generators //! - mdk_rust //! - mdk_ts @@ -14,6 +15,7 @@ //! typegraph: console //! path: ./mats/gen //! annotate_debug: true +//! ``` use crate::interlude::*; #[derive(Deserialize, Debug, Clone)] diff --git a/libs/metagen/src/lib.rs b/libs/metagen/src/lib.rs index ff570bad43..ce7618fcf9 100644 --- a/libs/metagen/src/lib.rs +++ b/libs/metagen/src/lib.rs @@ -14,6 +14,7 @@ mod interlude { pub use anyhow::Context; pub use indexmap::IndexMap; pub use log::{debug, error, info, trace, warn}; + pub use pretty_assertions::assert_str_eq; pub use serde::{Deserialize, Serialize}; #[cfg(test)] pub use tokio::process::Command; @@ -30,18 +31,28 @@ use crate::interlude::*; pub use config::*; +/// This implements a command object pattern API for generator +/// implemntations to access the external world. See [InputResolver]. +/// +/// The rationale being that +/// - Ease of mocking for tests through [InputResolver] implemntaiton. +/// - Ease of translating to wasm API for any future user implemented generators. #[derive(Debug)] pub enum GeneratorInputOrder { TypegraphFromTypegate { name: String }, TypegraphFromPath { path: PathBuf, name: Option }, } +/// Response types for the command object API implemented +/// by [GeneratorInputOrder]. #[derive(Debug)] pub enum GeneratorInputResolved { TypegraphFromTypegate { raw: Typegraph }, TypegraphFromPath { raw: Typegraph }, } +/// This type plays the "dispatcher" role to the command object +/// API implemented by [GeneratorInputOrder] and [GeneratorInputResolved]. pub trait InputResolver { fn resolve( &self, @@ -50,10 +61,22 @@ pub trait InputResolver { } #[derive(Debug)] -pub struct GeneratorOutput(pub HashMap); +pub struct GeneratedFile { + // pub path: PathBuf, + pub contents: String, + pub overwrite: bool, +} + +#[derive(Debug)] +pub struct GeneratorOutput(pub HashMap); +/// The core trait any metagen generator modules will implement. trait Plugin: Send + Sync { + /// A list of inputs required by an implementatoin to do it's job. + /// The [GeneratorInputOrder]s here will be resolved by the + /// host's [InputResolver]. fn bill_of_inputs(&self) -> HashMap; + fn generate( &self, inputs: HashMap, @@ -66,15 +89,16 @@ trait Plugin: Send + Sync { pub async fn generate_target( config: &config::Config, target_name: &str, + workspace_path: PathBuf, resolver: impl InputResolver + Send + Sync + Clone + 'static, -) -> anyhow::Result> { +) -> anyhow::Result { let generators = [ // builtin generators ( "mdk_rust".to_string(), // initialize the impl - &|val| { - let config: mdk_rust::MdkRustGenConfig = serde_json::from_value(val)?; + &|workspace_path: &Path, val| { + let config = mdk_rust::MdkRustGenConfig::from_json(val, workspace_path)?; let generator = mdk_rust::Generator::new(config)?; Ok::<_, anyhow::Error>(Box::new(generator) as Box) }, @@ -96,7 +120,7 @@ pub async fn generate_target( .get(&gen_name[..]) .with_context(|| format!("generator \"{gen_name}\" not found in config"))?; - let gen_impl = get_gen_fn(config)?; + let gen_impl = get_gen_fn(&workspace_path, config)?; let bill = gen_impl.bill_of_inputs(); let mut resolve_set = tokio::task::JoinSet::new(); @@ -132,5 +156,5 @@ pub async fn generate_target( .into_iter() .map(|(path, (_, buf))| (path, buf)) .collect(); - Ok(out) + Ok(GeneratorOutput(out)) } diff --git a/libs/metagen/src/mdk/mdk.wit b/libs/metagen/src/mdk/mdk.wit deleted file mode 100644 index 08030bb7de..0000000000 --- a/libs/metagen/src/mdk/mdk.wit +++ /dev/null @@ -1,42 +0,0 @@ -package metatype:mdk; - -interface shared { - record req { - op-name: string, - in-json: string, - } - - type res = result; -} - -interface typegate-wasi-host { - use shared.{req, res}; - - hostcall: func(req: req) -> res; -} - -interface mat { - use shared.{req, res}; - - handle: func(req: req) -> res; - - record init-args { - } - - record mat-tag { - title: string, - hash: string, - } - - record init-res { - metatype-version: string, - implemented-mats: list - } - - init: func(args: init-args) -> init-res; -} - -world wasi-mat { - import typegate-wasi-host; - export mat; -} diff --git a/libs/metagen/src/mdk_rust/mod.rs b/libs/metagen/src/mdk_rust/mod.rs index 2287a0b411..dd211fa038 100644 --- a/libs/metagen/src/mdk_rust/mod.rs +++ b/libs/metagen/src/mdk_rust/mod.rs @@ -1,6 +1,15 @@ // Copyright Metatype OÜ, licensed under the Mozilla Public License Version 2.0. // SPDX-License-Identifier: MPL-2.0 +//! Generates typegraph types and mdk interface for rust. +//! - dir/Cargo.toml +//! - Will not be replaced on second generation. +//! - dir/mdk.rs +//! - Contains generated types and mdk interface. +//! - dir/lib.rs +//! - Some directions to get the user started. +//! - Will not be replaced on second generation. + mod stubs; mod types; mod utils; @@ -10,15 +19,36 @@ use crate::mdk::*; use crate::utils::*; use crate::*; +use std::fmt::Write; + #[derive(Serialize, Deserialize, Debug, garde::Validate)] pub struct MdkRustGenConfig { #[serde(flatten)] #[garde(dive)] pub base: crate::config::MdkGeneratorConfigBase, + /// Runtimes to generate stubbed materializer implenetations for. #[garde(skip)] pub stubbed_runtimes: Option>, + /// Name of the crate to be put in the generated `Cargo.toml` + #[garde(length(min = 1))] + crate_name: Option, #[garde(skip)] - pub no_crate_manifest: Option, + pub skip_cargo_toml: Option, + #[garde(skip)] + pub skip_lib_rs: Option, +} + +impl MdkRustGenConfig { + pub fn from_json(json: serde_json::Value, workspace_path: &Path) -> anyhow::Result { + let mut config: mdk_rust::MdkRustGenConfig = serde_json::from_value(json)?; + config.base.path = workspace_path.join(config.base.path); + config.base.typegraph_path = config + .base + .typegraph_path + .as_ref() + .map(|path| workspace_path.join(path)); + Ok(config) + } } pub struct Generator { @@ -69,16 +99,33 @@ impl crate::Plugin for Generator { }; let mut out = HashMap::new(); out.insert( - self.config.base.path.join("mod.rs"), - gen_mod_rs(&self.config, tg)?, + self.config.base.path.join("mdk.rs"), + GeneratedFile { + contents: gen_mod_rs(&self.config, tg)?, + overwrite: true, + }, ); - if self.config.no_crate_manifest.unwrap_or(true) { + let crate_name = self.config.crate_name.clone().unwrap_or_else(|| { use heck::ToSnekCase; let tg_name = tg.name().unwrap_or_else(|_| "generated".to_string()); - let crate_name = format!("{}_mdk", tg_name.to_snek_case()); + format!("{}_mdk", tg_name.to_snek_case()) + }); + if !matches!(self.config.skip_cargo_toml, Some(true)) { out.insert( self.config.base.path.join("Cargo.toml"), - gen_cargo_toml(Some(&crate_name)), + GeneratedFile { + contents: gen_cargo_toml(Some(&crate_name)), + overwrite: false, + }, + ); + } + if !matches!(self.config.skip_lib_rs, Some(true)) { + out.insert( + self.config.base.path.join("lib.rs"), + GeneratedFile { + contents: gen_lib_rs(), + overwrite: false, + }, ); } Ok(GeneratorOutput(out)) @@ -89,71 +136,154 @@ fn gen_mod_rs(config: &MdkRustGenConfig, tg: &Typegraph) -> anyhow::Result) -> String { - let lib_rs = include_str!("static/Cargo.toml"); - if let Some(crate_name) = crate_name { - const DEF_CRATE_NAME: &str = "metagen_mdk_rust_static"; - lib_rs.replace(DEF_CRATE_NAME, crate_name) - } else { - lib_rs.to_string() + for line in stubs_rs.buf.lines() { + if !line.is_empty() { + writeln!(&mut mod_rs.buf, " {line}")?; + } else { + writeln!(&mut mod_rs.buf)?; + } + } } + writeln!(&mut mod_rs.buf, "}}")?; + Ok(mod_rs.buf) } pub fn gen_static(dest: &mut GenDestBuf) -> anyhow::Result> { - use std::fmt::Write; + let mod_rs = include_str!("static/mdk.rs").to_string(); + let mod_rs = mod_rs.replace("__METATYPE_VERSION__", std::env!("CARGO_PKG_VERSION")); - let mod_rs = include_str!("static/mod.rs"); - let mdk_wit = include_str!("../mdk/mdk.wit"); + let mdk_wit = include_str!("../../../../wit/wit-wire.wit"); writeln!(&mut dest.buf, "// gen-static-start")?; + + let gen_start = "// gen-start\n"; + let wit_start = "// wit-start\n"; write!( &mut dest.buf, "{}", - &mod_rs[..mod_rs.find("//wit-start").unwrap()] + &mod_rs[mod_rs.find(gen_start).unwrap() + gen_start.len()..mod_rs.find(wit_start).unwrap()] )?; + writeln!( &mut dest.buf, r#" - inline: "{mdk_wit}" -"# + inline: "{mdk_wit}""# )?; + + let gen_end = "// gen-end\n"; + let wit_end = "// wit-end\n"; write!( &mut dest.buf, "{}", - &mod_rs[mod_rs.find("//wit-end").unwrap() + "//wit-end".len()..] + &mod_rs[mod_rs.find(wit_end).unwrap() + wit_end.len()..mod_rs.find(gen_end).unwrap()] )?; + writeln!(&mut dest.buf, "// gen-static-end")?; Ok("Ctx".into()) } +pub fn gen_cargo_toml(crate_name: Option<&str>) -> String { + let cargo_toml = include_str!("static/Cargo.toml"); + if let Some(crate_name) = crate_name { + const DEF_CRATE_NAME: &str = "metagen_mdk_rust_static"; + cargo_toml.replace(DEF_CRATE_NAME, crate_name) + } else { + cargo_toml.to_string() + } +} + +pub fn gen_lib_rs() -> String { + r#" +mod mdk; +pub use mdk::*; + +/* +init_mat! { + hook: || { + // initialize global stuff here if you need it + MatBuilder::new() + // register function handlers here + .register_handler(stubs::MyFunc::erased(MyMat)) + } +} + +struct MyMat; + +// FIXME: use actual types from your mdk here +impl stubs::MyFunc for MyMat { + fn handle(&self, input: types::MyFuncIn, _cx: Ctx) -> anyhow::Result { + unimplemented!() + } +} +*/ +"# + .into() +} + #[test] fn mdk_rs_e2e() -> anyhow::Result<()> { use crate::tests::*; @@ -166,13 +296,15 @@ fn mdk_rs_e2e() -> anyhow::Result<()> { [( "mdk_rust".to_string(), serde_json::to_value(mdk_rust::MdkRustGenConfig { - stubbed_runtimes: None, - no_crate_manifest: None, + skip_cargo_toml: None, + skip_lib_rs: Some(true), + stubbed_runtimes: Some(vec!["wasm".into()]), + crate_name: None, base: config::MdkGeneratorConfigBase { typegraph_name: Some(tg_name.into()), typegraph_path: None, // NOTE: root will map to the test's tempdir - path: "./gen/".into(), + path: "./".into(), }, })?, )] diff --git a/libs/metagen/src/mdk_rust/static/Cargo.toml b/libs/metagen/src/mdk_rust/static/Cargo.toml index e50c6a70dd..d983715b39 100644 --- a/libs/metagen/src/mdk_rust/static/Cargo.toml +++ b/libs/metagen/src/mdk_rust/static/Cargo.toml @@ -3,7 +3,7 @@ package.edition = "2021" package.version = "0.0.1" [lib] -path = "mod.rs" +path = "lib.rs" crate-type = ["cdylib", "rlib"] [dependencies] diff --git a/libs/metagen/src/mdk_rust/static/lib.rs b/libs/metagen/src/mdk_rust/static/lib.rs new file mode 100644 index 0000000000..af7247c9ee --- /dev/null +++ b/libs/metagen/src/mdk_rust/static/lib.rs @@ -0,0 +1,4 @@ +// Copyright Metatype OÜ, licensed under the Mozilla Public License Version 2.0. +// SPDX-License-Identifier: MPL-2.0 + +mod mdk; diff --git a/libs/metagen/src/mdk_rust/static/mdk.rs b/libs/metagen/src/mdk_rust/static/mdk.rs new file mode 100644 index 0000000000..5346cda52f --- /dev/null +++ b/libs/metagen/src/mdk_rust/static/mdk.rs @@ -0,0 +1,129 @@ +// no-auto-license-header | @generated (pre-commit doesn't support two headers) +// gen-start +#![allow(unused)] + +pub mod wit { + wit_bindgen::generate!({ + pub_export_macro: true, + // wit-start + // this bit gets replaced by the inline wit string + world: "wit-wire", + path: "../../../../../wit/wit-wire.wit" + // wit-end + }); +} + +use std::cell::RefCell; +use std::collections::HashMap; + +use anyhow::Context; + +use wit::exports::metatype::wit_wire::mat_wire::*; + +pub type HandlerFn = Box Result>; + +pub struct ErasedHandler { + mat_id: String, + mat_trait: String, + mat_title: String, + handler_fn: HandlerFn, +} + +pub struct MatBuilder { + handlers: HashMap, +} + +impl MatBuilder { + pub fn new() -> Self { + Self { + handlers: Default::default(), + } + } + + pub fn register_handler(mut self, handler: ErasedHandler) -> Self { + self.handlers.insert(handler.mat_trait.clone(), handler); + self + } +} + +pub struct Router { + handlers: HashMap, +} + +impl Router { + pub fn from_builder(builder: MatBuilder) -> Self { + Self { + handlers: builder.handlers, + } + } + + pub fn init(&self, args: InitArgs) -> Result { + static MT_VERSION: &str = "0.3.7-0"; + if args.metatype_version != MT_VERSION { + return Err(InitError::VersionMismatch(MT_VERSION.into())); + } + for info in args.expected_ops { + let mat_trait = stubs::op_to_trait_name(&info.op_name); + if !self.handlers.contains_key(mat_trait) { + return Err(InitError::UnexpectedMat(info)); + } + } + Ok(InitResponse { ok: true }) + } + + pub fn handle(&self, req: HandleReq) -> Result { + let mat_trait = stubs::op_to_trait_name(&req.op_name); + let Some(handler) = self.handlers.get(mat_trait) else { + return Err(HandleErr::NoHandler); + }; + let cx = Ctx { + gql: GraphqlClient {}, + }; + (handler.handler_fn)(&req.in_json, cx) + } +} + +pub type InitCallback = fn() -> anyhow::Result; + +thread_local! { + pub static MAT_STATE: RefCell = panic!("MDK_STATE has not been initialized"); +} + +pub struct Ctx { + gql: GraphqlClient, +} + +pub struct GraphqlClient {} + +#[macro_export] +macro_rules! init_mat { + (hook: $init_hook:expr) => { + struct MatWireGuest; + use wit::exports::metatype::wit_wire::mat_wire::*; + wit::export!(MatWireGuest with_types_in wit); + + #[allow(unused)] + impl Guest for MatWireGuest { + fn handle(req: HandleReq) -> Result { + MAT_STATE.with(|router| { + let router = router.borrow(); + router.handle(req) + }) + } + + fn init(args: InitArgs) -> Result { + let hook = $init_hook; + let router = Router::from_builder(hook()); + let resp = router.init(args)?; + MAT_STATE.set(router); + Ok(resp) + } + } + }; +} +// gen-end +mod stubs { + pub fn op_to_trait_name(op_name: &str) -> &'static str { + panic!("unrecognized op_name: {op_name}"); + } +} diff --git a/libs/metagen/src/mdk_rust/static/mod.rs b/libs/metagen/src/mdk_rust/static/mod.rs deleted file mode 100644 index c36a037858..0000000000 --- a/libs/metagen/src/mdk_rust/static/mod.rs +++ /dev/null @@ -1,37 +0,0 @@ -#![allow(unused)] - -// Copyright Metatype OÜ, licensed under the Mozilla Public License Version 2.0. -// SPDX-License-Identifier: MPL-2.0 - -mod wit { - wit_bindgen::generate!({ - //wit-start - // this bit gets replaced by the inline wit string - world: "wasi-mat", - path: "../../mdk/mdk.wit" - //wit-end - }); -} - -use wit::exports::metatype::mdk::mat::*; - -struct Module; - -#[allow(unused)] -impl Guest for Module { - fn handle(req: Req) -> Res { - todo!("do routing and rpc") - } - - fn init(args: InitArgs) -> InitRes { - todo!("do init") - } -} - -wit::export!(Module with_types_in wit); - -pub struct Ctx { - gql: GraphqlClient, -} - -pub struct GraphqlClient {} diff --git a/libs/metagen/src/mdk_rust/stubs.rs b/libs/metagen/src/mdk_rust/stubs.rs index 1661688eff..a86c384127 100644 --- a/libs/metagen/src/mdk_rust/stubs.rs +++ b/libs/metagen/src/mdk_rust/stubs.rs @@ -11,10 +11,10 @@ pub struct GenStubOptions {} pub fn gen_stub( fun: &StubbedFunction, - dest: &mut GenDestBuf, + mod_stub_traits: &mut GenDestBuf, type_names: &HashMap>, _opts: &GenStubOptions, -) -> anyhow::Result> { +) -> anyhow::Result { let TypeNode::Function { base, data } = &fun.node else { unreachable!() }; @@ -24,16 +24,58 @@ pub fn gen_stub( let out_ty = type_names .get(&data.output) .context("output type for function not found")?; - let trait_name: Arc = normalize_type_title(&base.title).into(); + let trait_name: String = normalize_type_title(&base.title); + let title = &base.title; + // FIXME: use hash or other stable id + let id = title; writeln!( - &mut dest.buf, - r#"pub trait {trait_name} {{ - fn handle(input: {inp_ty}, cx: Ctx) -> anyhow::Result<{out_ty}>; + &mut mod_stub_traits.buf, + r#"pub trait {trait_name}: Sized + 'static {{ + fn erased(self) -> ErasedHandler {{ + ErasedHandler {{ + mat_id: "{id}".into(), + mat_title: "{title}".into(), + mat_trait: "{trait_name}".into(), + handler_fn: Box::new(move |req, cx| {{ + let req = serde_json::from_str(req) + .map_err(|err| HandleErr::InJsonErr(format!("{{err}}")))?; + let res = self + .handle(req, cx) + .map_err(|err| HandleErr::HandlerErr(format!("{{err}}")))?; + serde_json::to_string(&res) + .map_err(|err| HandleErr::HandlerErr(format!("{{err}}"))) + }}), + }} + }} + + fn handle(&self, input: {inp_ty}, cx: Ctx) -> anyhow::Result<{out_ty}>; }}"# )?; Ok(trait_name) } +pub fn gen_op_to_mat_map( + op_to_trait_map: &HashMap, + dest: &mut GenDestBuf, + _opts: &GenStubOptions, +) -> anyhow::Result<()> { + writeln!( + &mut dest.buf, + r#"pub fn op_to_trait_name(op_name: &str) -> &'static str {{ + match op_name {{"# + )?; + for (op_name, trait_name) in op_to_trait_map { + writeln!(&mut dest.buf, r#" "{op_name}" => "{trait_name}","#,)?; + } + writeln!( + &mut dest.buf, + r#" _ => panic!("unrecognized op_name: {{op_name}}"), + }} +}}"# + )?; + Ok(()) +} + #[cfg(test)] mod test { use super::*; @@ -60,7 +102,7 @@ mod test { materializers: vec![Materializer { name: "function".into(), runtime: 0, - data: Default::default(), + data: serde_json::from_value(serde_json::json!({ "op_name": "my_op" })).unwrap(), effect: Effect { effect: None, idempotent: false, @@ -107,12 +149,14 @@ mod test { }; let generator = Generator::new(MdkRustGenConfig { base: crate::config::MdkGeneratorConfigBase { - path: "/tmp".into(), + path: "/".into(), typegraph_name: Some(tg_name.clone()), typegraph_path: None, }, stubbed_runtimes: Some(vec!["wasm".into()]), - no_crate_manifest: None, + crate_name: None, + skip_lib_rs: None, + skip_cargo_toml: None, })?; let out = generator.generate( [( @@ -125,16 +169,47 @@ mod test { let (_, buf) = out .0 .iter() - .find(|(path, _)| path.file_name().unwrap() == "mod.rs") + .find(|(path, _)| path.file_name().unwrap() == "mdk.rs") .unwrap(); - assert_eq!( + pretty_assertions::assert_eq!( r#"// gen-static-end -pub type MyInt = i64; -pub trait MyFunc { - fn handle(input: MyInt, cx: Ctx) -> anyhow::Result; +use types::*; +pub mod types { + use super::*; + pub type MyInt = i64; +} +use stubs::*; +pub mod stubs { + use super::*; + pub trait MyFunc: Sized + 'static { + fn erased(self) -> ErasedHandler { + ErasedHandler { + mat_id: "my_func".into(), + mat_title: "my_func".into(), + mat_trait: "MyFunc".into(), + handler_fn: Box::new(move |req, cx| { + let req = serde_json::from_str(req) + .map_err(|err| HandleErr::InJsonErr(format!("{err}")))?; + let res = self + .handle(req, cx) + .map_err(|err| HandleErr::HandlerErr(format!("{err}")))?; + serde_json::to_string(&res) + .map_err(|err| HandleErr::HandlerErr(format!("{err}"))) + }), + } + } + + fn handle(&self, input: MyInt, cx: Ctx) -> anyhow::Result; + } + pub fn op_to_trait_name(op_name: &str) -> &'static str { + match op_name { + "my_op" => "MyFunc", + _ => panic!("unrecognized op_name: {op_name}"), + } + } } "#, - &buf[buf.find("// gen-static-end").unwrap()..] + &buf.contents[buf.contents.find("// gen-static-end").unwrap()..] ); Ok(()) } diff --git a/libs/metagen/src/mdk_rust/types.rs b/libs/metagen/src/mdk_rust/types.rs index 5584d098a6..ef8ba8efeb 100644 --- a/libs/metagen/src/mdk_rust/types.rs +++ b/libs/metagen/src/mdk_rust/types.rs @@ -4,6 +4,11 @@ use super::utils::*; use crate::interlude::*; use crate::utils::*; +use common::typegraph::FileTypeData; +use common::typegraph::FloatTypeData; +use common::typegraph::ListTypeData; +use common::typegraph::OptionalTypeData; +use common::typegraph::StringTypeData; use heck::ToPascalCase; use std::fmt::Write; @@ -38,176 +43,292 @@ pub fn gen_type( }; // generate the type name up first - let ty_name = match node { - TypeNode::Function { .. } => "()".to_string(), - TypeNode::Boolean { base, .. } - | TypeNode::Integer { base, .. } - | TypeNode::String { base, .. } - | TypeNode::File { base, .. } - | TypeNode::Any { base, .. } - | TypeNode::Object { base, .. } - | TypeNode::Float { base, .. } - | TypeNode::Optional { base, .. } - | TypeNode::List { base, .. } - | TypeNode::Union { base, .. } - | TypeNode::Either { base, .. } => normalize_type_title(&base.title), - /* TypeNode::Union { base, .. } => { + let (gen_code, ty_name) = match node { + // functions will be absent in our gnerated types + TypeNode::Function { .. } => (false, "()".to_string()), + + // under certain conditionds, we don't want to generate aliases + // for primitive types. this includes + // - types with defualt generated names + // - types with no special semantics + TypeNode::Boolean { base } if base.title.starts_with("boolean_") => { + (false, "bool".to_string()) + } + TypeNode::Integer { + base, + data: + common::typegraph::IntegerTypeData { + minimum: None, + maximum: None, + multiple_of: None, + exclusive_minimum: None, + exclusive_maximum: None, + }, + } if base.title.starts_with("integer_") => (false, "i64".to_string()), + TypeNode::Float { + base, + data: + FloatTypeData { + minimum: None, + maximum: None, + multiple_of: None, + exclusive_minimum: None, + exclusive_maximum: None, + }, + } if base.title.starts_with("float_") => (false, "f64".to_string()), + TypeNode::String { + base, + data: + StringTypeData { + min_length: None, + max_length: None, + format: None, + pattern: None, + }, + } if base.title.starts_with("string_") => (false, "String".to_string()), + TypeNode::File { + base, + data: + FileTypeData { + min_size: None, + max_size: None, + mime_types: None, + }, + } if base.title.starts_with("file_") => (false, "Vec".to_string()), + TypeNode::Optional { + // NOTE: keep this condition + // in sync with similar one + // below + base, + data: + OptionalTypeData { + default_value: None, + .. + }, + } if base.title.starts_with("optional_") => { + // since the type name of Optionl | Vec depends on + // the name of the inner type, we use placeholders at this ploint + (true, normalize_type_title(&format!("&&placeholder{id}%%"))) + } + TypeNode::List { + // NOTE: keep this condition + // in sync with similar one + // below + base, + data: + ListTypeData { + min_items: None, + max_items: None, + .. + }, + } if base.title.starts_with("list_") => { + // since the type name of Optionl | Vec depends on + // the name of the inner type, we use placeholders at this ploint + (true, normalize_type_title(&format!("&&placeholder{id}%%"))) + } + ty => (true, normalize_type_title(&ty.base().title)), + /* + TypeNode::Union { base, .. } => { format!("{}Union", normalize_type_title(&base.title)) } TypeNode::Either { base, .. } => { format!("{}Either", normalize_type_title(&base.title)) } - // since the type name of Optionl | Vec depends on - // the name of the inner type, we use placeholders at this ploint - TypeNode::Optional { .. } | TypeNode::List { .. } => { - normalize_type_title(&format!("Placeholder{id}")) - } */ + */ }; - let ty_name: Arc = ty_name.into(); + let mut ty_name: Arc = ty_name.into(); // insert typename into memo before generation to allow cyclic resolution // if this function is recursively called when generating dependent branches memo.insert(id, ty_name.clone()); - match node { - TypeNode::Function { .. } => {} - TypeNode::Boolean { .. } => { - gen_alias(&mut dest.buf, &ty_name, "bool")?; - } - TypeNode::Float { .. } => { - gen_alias(&mut dest.buf, &ty_name, "f64")?; - } - TypeNode::Integer { .. } => { - gen_alias(&mut dest.buf, &ty_name, "i64")?; - } - TypeNode::String { .. } => { - gen_alias(&mut dest.buf, &ty_name, "String")?; - } - TypeNode::File { .. } => { - gen_alias(&mut dest.buf, &ty_name, "Vec")?; - } - TypeNode::Any { .. } => { - gen_alias(&mut dest.buf, &ty_name, "serde_json::Value")?; - } - TypeNode::Object { data, .. } => { - let props = data - .properties - .iter() - // generate property type sfirst - .map(|(name, &dep_id)| { - let (ty_name, branch_visited_types) = - gen_type(dep_id, nodes, dest, memo, opts, &my_path)?; + if gen_code { + match node { + TypeNode::Function { .. } => unreachable!(), + TypeNode::Boolean { .. } => { + gen_alias(&mut dest.buf, &ty_name, "bool")?; + } + TypeNode::Float { .. } => { + gen_alias(&mut dest.buf, &ty_name, "f64")?; + } + TypeNode::Integer { .. } => { + gen_alias(&mut dest.buf, &ty_name, "i64")?; + } + TypeNode::String { .. } => { + gen_alias(&mut dest.buf, &ty_name, "String")?; + } + TypeNode::File { .. } => { + gen_alias(&mut dest.buf, &ty_name, "Vec")?; + } + TypeNode::Any { .. } => { + gen_alias(&mut dest.buf, &ty_name, "serde_json::Value")?; + } + TypeNode::Object { data, .. } => { + let props = data + .properties + .iter() + // generate property type sfirst + .map(|(name, &dep_id)| { + let (ty_name, branch_visited_types) = + gen_type(dep_id, nodes, dest, memo, opts, &my_path)?; - let ty_name = if data.required.contains(name) { - ty_name.to_string() - } else { - format!("Option<{ty_name}>") - }; + /* let ty_name = if data.required.contains(name) { + ty_name.to_string() + } else { + format!("Option<{ty_name}>") + }; */ - let ty_name = if let Some(true) = - is_path_unsized_cyclic(id, &my_path, &branch_visited_types, nodes) - { - format!("Box<{ty_name}>") - } else { - ty_name - }; - merge_visited_paths_into(branch_visited_types, &mut visited_types); + let ty_name = if let Some(true) = + is_path_unsized_cyclic(id, &my_path, &branch_visited_types, nodes) + { + format!("Box<{ty_name}>") + } else { + ty_name.to_string() + }; + merge_visited_paths_into(branch_visited_types, &mut visited_types); - let normalized_prop_name = normalize_struct_prop_name(name); - let rename_name = if normalized_prop_name.as_str() != name.as_str() { - Some(name.clone()) - } else { - None - }; - Ok::<_, anyhow::Error>((normalized_prop_name, (ty_name, rename_name))) - }) - .collect::, _>>()?; - gen_struct(&mut dest.buf, opts, &ty_name[..], props)?; - } - TypeNode::Union { data, .. } => { - let variants = data - .any_of - .iter() - .map(|&inner| { - let (ty_name, branch_visited_types) = - gen_type(inner, nodes, dest, memo, opts, &my_path)?; - let variant_name = ty_name.to_pascal_case(); - let ty_name = if let Some(true) = - is_path_unsized_cyclic(id, &my_path, &branch_visited_types, nodes) - { - format!("Box<{ty_name}>") - } else { - ty_name.to_string() - }; - merge_visited_paths_into(branch_visited_types, &mut visited_types); - Ok::<_, anyhow::Error>((variant_name, ty_name)) - }) - .collect::, _>>()?; - gen_enum(&mut dest.buf, opts, &ty_name, variants)?; - } - TypeNode::Either { data, .. } => { - let variants = data - .one_of - .iter() - .map(|&inner| { - let (ty_name, branch_visited_types) = - gen_type(inner, nodes, dest, memo, opts, &my_path)?; - let variant_name = ty_name.to_pascal_case(); - let ty_name = if let Some(true) = - is_path_unsized_cyclic(id, &my_path, &branch_visited_types, nodes) - { - format!("Box<{ty_name}>") - } else { - ty_name.to_string() - }; - merge_visited_paths_into(branch_visited_types, &mut visited_types); - Ok::<_, anyhow::Error>((variant_name, ty_name)) - }) - .collect::, _>>()?; - gen_enum(&mut dest.buf, opts, &ty_name, variants)?; - } - TypeNode::Optional { data, .. } => { - // TODO: handle cyclic case where entire cycle is aliases - let (inner_ty_name, inner_visited_types) = - gen_type(data.item, nodes, dest, memo, opts, &my_path)?; - // let optional_ty_name: Arc = format!("{inner_ty_name}Maybe").into(); - let inner_ty_name = if let Some(true) = - is_path_unsized_cyclic(id, &my_path, &inner_visited_types, nodes) - { - format!("Box<{inner_ty_name}>") - } else { - inner_ty_name.to_string() - }; - merge_visited_paths_into(inner_visited_types, &mut visited_types); - gen_alias(&mut dest.buf, &ty_name, &format!("Option<{inner_ty_name}>"))?; - // dest.buf = replace_placeholder_ty_name(&dest.buf, &ty_name, &optional_ty_name); - // memo.insert(id, optional_ty_name.clone()); - // ty_name = optional_ty_name; - } - TypeNode::List { data, .. } => { - // TODO: handle cyclic case where entire cycle is aliases - let (inner_ty_name, inner_visited_types) = - gen_type(data.items, nodes, dest, memo, opts, &my_path)?; - merge_visited_paths_into(inner_visited_types, &mut visited_types); - if let Some(true) = data.unique_items { - // let ty_name = format!("{inner_ty_name}Set"); - gen_alias( - &mut dest.buf, - &ty_name, - &format!("std::collections::HashSet<{inner_ty_name}>"), - )?; - // ty_name - } else { - // let ty_name = format!("{inner_ty_name}List"); - gen_alias(&mut dest.buf, &ty_name, &format!("Vec<{inner_ty_name}>"))?; - // ty_name - }; - // let true_ty_name: Arc = true_ty_name.into(); - // dest.buf = replace_placeholder_ty_name(&dest.buf, &ty_name, &true_ty_name); - // memo.insert(id, true_ty_name.clone()); - // ty_name = true_ty_name; - } - }; + let normalized_prop_name = normalize_struct_prop_name(name); + let rename_name = if normalized_prop_name.as_str() != name.as_str() { + Some(name.clone()) + } else { + None + }; + Ok::<_, anyhow::Error>((normalized_prop_name, (ty_name, rename_name))) + }) + .collect::, _>>()?; + gen_struct(&mut dest.buf, opts, &ty_name[..], props)?; + } + TypeNode::Union { data, .. } => { + let variants = data + .any_of + .iter() + .map(|&inner| { + let (ty_name, branch_visited_types) = + gen_type(inner, nodes, dest, memo, opts, &my_path)?; + let variant_name = ty_name.to_pascal_case(); + let ty_name = if let Some(true) = + is_path_unsized_cyclic(id, &my_path, &branch_visited_types, nodes) + { + format!("Box<{ty_name}>") + } else { + ty_name.to_string() + }; + merge_visited_paths_into(branch_visited_types, &mut visited_types); + Ok::<_, anyhow::Error>((variant_name, ty_name)) + }) + .collect::, _>>()?; + gen_enum(&mut dest.buf, opts, &ty_name, variants)?; + } + TypeNode::Either { data, .. } => { + let variants = data + .one_of + .iter() + .map(|&inner| { + let (ty_name, branch_visited_types) = + gen_type(inner, nodes, dest, memo, opts, &my_path)?; + let variant_name = ty_name.to_pascal_case(); + let ty_name = if let Some(true) = + is_path_unsized_cyclic(id, &my_path, &branch_visited_types, nodes) + { + format!("Box<{ty_name}>") + } else { + ty_name.to_string() + }; + merge_visited_paths_into(branch_visited_types, &mut visited_types); + Ok::<_, anyhow::Error>((variant_name, ty_name)) + }) + .collect::, _>>()?; + gen_enum(&mut dest.buf, opts, &ty_name, variants)?; + } + TypeNode::Optional { + // NOTE: keep this condition + // in sync with similar one above + base, + data: + OptionalTypeData { + default_value: None, + item, + }, + } if base.title.starts_with("optional_") => { + // TODO: handle cyclic case where entire cycle is aliases + let (inner_ty_name, inner_visited_types) = + gen_type(*item, nodes, dest, memo, opts, &my_path)?; + let inner_ty_name = if let Some(true) = + is_path_unsized_cyclic(id, &my_path, &inner_visited_types, nodes) + { + format!("Box<{inner_ty_name}>") + } else { + inner_ty_name.to_string() + }; + merge_visited_paths_into(inner_visited_types, &mut visited_types); + let true_ty_name = format!("Option<{inner_ty_name}>"); + let true_ty_name: Arc = true_ty_name.into(); + dest.buf = replace_placeholder_ty_name(&dest.buf, &ty_name, &true_ty_name); + memo.insert(id, true_ty_name.clone()); + ty_name = true_ty_name; + } + TypeNode::Optional { data, .. } => { + // TODO: handle cyclic case where entire cycle is aliases + let (inner_ty_name, inner_visited_types) = + gen_type(data.item, nodes, dest, memo, opts, &my_path)?; + // let optional_ty_name: Arc = format!("{inner_ty_name}Maybe").into(); + let inner_ty_name = if let Some(true) = + is_path_unsized_cyclic(id, &my_path, &inner_visited_types, nodes) + { + format!("Box<{inner_ty_name}>") + } else { + inner_ty_name.to_string() + }; + merge_visited_paths_into(inner_visited_types, &mut visited_types); + gen_alias(&mut dest.buf, &ty_name, &format!("Option<{inner_ty_name}>"))?; + } + TypeNode::List { + // NOTE: keep this condition + // in sync with similar one above + base, + data: + ListTypeData { + min_items: None, + max_items: None, + unique_items, + items, + }, + } if base.title.starts_with("list_") => { + // TODO: handle cyclic case where entire cycle is aliases + let (inner_ty_name, inner_visited_types) = + gen_type(*items, nodes, dest, memo, opts, &my_path)?; + merge_visited_paths_into(inner_visited_types, &mut visited_types); + let true_ty_name = if let Some(true) = unique_items { + format!("std::collections::HashSet<{inner_ty_name}>") + } else { + format!("Vec<{inner_ty_name}>") + }; + let true_ty_name: Arc = true_ty_name.into(); + dest.buf = replace_placeholder_ty_name(&dest.buf, &ty_name, &true_ty_name); + memo.insert(id, true_ty_name.clone()); + ty_name = true_ty_name; + } + TypeNode::List { data, .. } => { + // TODO: handle cyclic case where entire cycle is aliases + let (inner_ty_name, inner_visited_types) = + gen_type(data.items, nodes, dest, memo, opts, &my_path)?; + merge_visited_paths_into(inner_visited_types, &mut visited_types); + if let Some(true) = data.unique_items { + // let ty_name = format!("{inner_ty_name}Set"); + gen_alias( + &mut dest.buf, + &ty_name, + &format!("std::collections::HashSet<{inner_ty_name}>"), + )?; + // ty_name + } else { + // let ty_name = format!("{inner_ty_name}List"); + gen_alias(&mut dest.buf, &ty_name, &format!("Vec<{inner_ty_name}>"))?; + // ty_name + }; + } + }; + } Ok((ty_name, visited_types)) } @@ -242,7 +363,6 @@ fn is_path_unsized_cyclic( }) } -#[allow(unused)] fn replace_placeholder_ty_name(buf: &str, placeholder: &str, replacement: &str) -> String { buf.replace(placeholder, replacement).replace( &normalize_struct_prop_name(placeholder), @@ -302,6 +422,7 @@ fn gen_enum( variants: Vec<(String, String)>, ) -> std::fmt::Result { gen_derive(dest, opts)?; + writeln!(dest, "#[serde(untagged)]")?; writeln!(dest, "pub enum {ty_name} {{")?; for (var_name, ty_name) in variants.into_iter() { writeln!(dest, " {var_name}({ty_name}),")?; @@ -417,12 +538,12 @@ mod test { properties: [ ("myString".to_string(), 0), ("list".to_string(), 1), - ("optional".to_string(), 0), - ("optionalOptional".to_string(), 3), + ("optional".to_string(), 3), ] .into_iter() .collect(), - required: ["myString", "list"].into_iter().map(Into::into).collect(), + // FIXME: remove required + required: vec![], }, base: TypeNodeBase { title: "my_obj".into(), @@ -462,11 +583,10 @@ pub struct MyObj { #[serde(rename = "myString")] pub my_string: MyStr, pub list: MyStrList, - pub optional: Option, - #[serde(rename = "optionalOptional")] - pub optional_optional: Option, + pub optional: MyStrMaybe, } #[derive(Debug, serde::Serialize, serde::Deserialize)] +#[serde(untagged)] pub enum MyEither { MyStr(MyStr), MyStrList(MyStrList), @@ -479,6 +599,7 @@ pub enum MyEither { MyObj(MyObj), } #[derive(Debug, serde::Serialize, serde::Deserialize)] +#[serde(untagged)] pub enum MyUnion { MyStr(MyStr), MyStrList(MyStrList), @@ -493,6 +614,102 @@ pub enum MyUnion { } "#, ), + ( + "alias_avoidance", + vec![ + TypeNode::String { + data: StringTypeData { + format: None, + pattern: None, + min_length: None, + max_length: None, + }, + base: TypeNodeBase { + title: "string_0".into(), + ..default_type_node_base() + }, + }, + TypeNode::List { + data: ListTypeData { + items: 0, + max_items: None, + min_items: None, + unique_items: None, + }, + base: TypeNodeBase { + title: "list_1".into(), + ..default_type_node_base() + }, + }, + TypeNode::List { + data: ListTypeData { + items: 0, + max_items: None, + min_items: None, + unique_items: Some(true), + }, + base: TypeNodeBase { + title: "list_2".into(), + ..default_type_node_base() + }, + }, + TypeNode::Optional { + data: OptionalTypeData { + item: 0, + default_value: None, + }, + base: TypeNodeBase { + title: "optional_3".into(), + ..default_type_node_base() + }, + }, + TypeNode::Integer { + data: IntegerTypeData { + maximum: None, + multiple_of: None, + exclusive_minimum: None, + exclusive_maximum: None, + minimum: None, + }, + base: TypeNodeBase { + title: "integer_4".into(), + ..default_type_node_base() + }, + }, + TypeNode::Float { + data: FloatTypeData { + maximum: None, + multiple_of: None, + exclusive_minimum: None, + exclusive_maximum: None, + minimum: None, + }, + base: TypeNodeBase { + title: "float_5".into(), + ..default_type_node_base() + }, + }, + TypeNode::Boolean { + base: TypeNodeBase { + title: "boolean_6".into(), + ..default_type_node_base() + }, + }, + TypeNode::File { + data: FileTypeData { + min_size: None, + max_size: None, + mime_types: None, + }, + base: TypeNodeBase { + title: "file_7".into(), + ..default_type_node_base() + }, + }, + ], + "Vec", + r#""#, + ), ( "cycles_obj", vec![ @@ -583,6 +800,7 @@ pub struct ObjA { pub obj_b: ObjB, } #[derive(Debug, serde::Serialize, serde::Deserialize)] +#[serde(untagged)] pub enum CUnion { ObjA(Box), } @@ -629,6 +847,7 @@ pub struct ObjA { pub obj_b: ObjB, } #[derive(Debug, serde::Serialize, serde::Deserialize)] +#[serde(untagged)] pub enum CEither { ObjA(Box), } @@ -649,17 +868,15 @@ pub enum CEither { &[], )?; - assert_eq!( + pretty_assertions::assert_eq!( &gen_name[..], name, "{test_name}: generated unexpected type name" ); - assert_eq!( - dest.buf.as_str(), - out, - "{test_name}: output buffer was not equal for {name}\n{}{}", + pretty_assertions::assert_eq!( dest.buf.as_str(), out, + "{test_name}: output buffer was not equal for {name}", ); } Ok(()) diff --git a/libs/metagen/src/tests/mod.rs b/libs/metagen/src/tests/mod.rs index b31d84ee34..d8343cdbb3 100644 --- a/libs/metagen/src/tests/mod.rs +++ b/libs/metagen/src/tests/mod.rs @@ -60,11 +60,12 @@ pub async fn e2e_test(cases: Vec) -> anyhow::Result<()> { let test_cx = TestCtx { typegraphs: typegraphs.clone(), }; - let files = crate::generate_target(&case.config, &case.target, test_cx).await?; - for (path, buf) in files { + let files = + crate::generate_target(&case.config, &case.target, tmp_dir.clone(), test_cx).await?; + for (path, buf) in files.0 { let path = tmp_dir.join(path); tokio::fs::create_dir_all(path.parent().unwrap()).await?; - tokio::fs::write(path, buf).await?; + tokio::fs::write(path, buf.contents).await?; } // compile (case.build_fn)(BuildArgs { diff --git a/libs/metagen/src/utils.rs b/libs/metagen/src/utils.rs index 03821d3c4a..f2664d7f1a 100644 --- a/libs/metagen/src/utils.rs +++ b/libs/metagen/src/utils.rs @@ -5,18 +5,14 @@ use crate::interlude::*; trait GenDest {} +/// A generation destination analogous to a single file. pub struct GenDestBuf { pub buf: String, } impl GenDest for GenDestBuf {} +/// A generation destination analogous to a directory. pub struct GenDestFs { pub files: HashMap, } impl GenDest for GenDestFs {} - -trait Generate { - type Dest: GenDest; - - fn generate(&self, dest: &mut Self::Dest) -> anyhow::Result<()>; -} diff --git a/libs/metagen/tests/mat_rust/lib.rs b/libs/metagen/tests/mat_rust/lib.rs index 6d36d3c11c..c56281cdab 100644 --- a/libs/metagen/tests/mat_rust/lib.rs +++ b/libs/metagen/tests/mat_rust/lib.rs @@ -1,9 +1,19 @@ // Copyright Metatype OÜ, licensed under the Mozilla Public License Version 2.0. // SPDX-License-Identifier: MPL-2.0 -use gen_test_mdk::*; +mod mdk; +use mdk::stubs::*; +use mdk::types::*; +use mdk::*; -#[allow(unused)] -fn init() { - println!("im in it"); +init_mat! { + hook: || MatBuilder::new().register_handler(FaasImpl::erased(FaasImpl)) +} + +struct FaasImpl; + +impl MyFaas for FaasImpl { + fn handle(&self, input: MyObj, _cx: Ctx) -> anyhow::Result { + Ok(input) + } } diff --git a/libs/metagen/tests/placeholder b/libs/metagen/tests/placeholder new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libs/metagen/tests/tg.ts b/libs/metagen/tests/tg.ts index 8a6db06dfa..e01bf14d9b 100644 --- a/libs/metagen/tests/tg.ts +++ b/libs/metagen/tests/tg.ts @@ -3,7 +3,7 @@ import { t, typegraph, } from "../../../typegraph/node/sdk/dist/index.js"; -import { RandomRuntime } from "../../../typegraph/node/sdk/dist/runtimes/random.js"; +import { WasmRuntime } from "../../../typegraph/node/sdk/dist/runtimes/wasm.js"; typegraph( { @@ -12,6 +12,8 @@ typegraph( const obj = t.struct({ str: t.string(), int: t.integer(), + float: t.float(), + boolean: t.boolean(), file: t.file(), opt: t.optional(t.string()), either: t.either([ @@ -23,12 +25,16 @@ typegraph( t.struct({ b: t.string() }), ]), list: t.list(t.string()), - }); + }).rename("MyObj"); - const rand_rt = new RandomRuntime({}); + const wasm = WasmRuntime.wire("placeholder"); g.expose( { - random: rand_rt.gen(obj), + my_faas: wasm.handler( + obj, + obj, + { func: "my_faas" }, + ).rename("my_faas"), }, Policy.public(), ); diff --git a/libs/pyrt_wit_wire/main.py b/libs/pyrt_wit_wire/main.py index 12d18aa8d3..f5b89af528 100644 --- a/libs/pyrt_wit_wire/main.py +++ b/libs/pyrt_wit_wire/main.py @@ -1,20 +1,31 @@ -import pyrt.exports +import wit_wire.exports # NOTE: all imports must be toplevel as constrained by `componentize-py` # https://github.com/bytecodealliance/componentize-py/issues/23 -from pyrt.imports.shared import Req, Ok, Err - # from pyrt.imports.typegate_wire import hostcall -from pyrt.exports.mat_wire import ( +from wit_wire.exports.mat_wire import ( InitArgs, InitResponse, InitError_UnexpectedMat, + InitError_Other, MatInfo, + HandleReq, + HandleErr_NoHandler, + HandleErr_InJsonErr, + HandleErr_HandlerErr, + Err, ) import json import types -from typing import Callable, Any +from typing import Callable, Any, Dict +import importlib +import importlib.util +import importlib.abc +import importlib.machinery +import os +import sys +import traceback # the `MatWire` class is instantiated for each # external call. We have to put any persisted @@ -22,30 +33,41 @@ handlers = {} -class MatWire(pyrt.exports.MatWire): +class MatWire(wit_wire.exports.MatWire): def init(self, args: InitArgs): for op in args.expected_ops: - handlers[op.op_name] = op_to_handler(op) + try: + handlers[op.op_name] = op_to_handler(op) + except Exception as err: + traceback.print_exc() + raise Err(InitError_Other(str(err))) return InitResponse(ok=True) - def handle(self, req: Req): + def handle(self, req: HandleReq): handler = handlers.get(req.op_name) if handler is None: - return Err(json.dumps({"ty": "handler_404", "op_name": req.op_name})) + print( + f"no handler found for {req.op_name}, registered handlers: {[op for op in handlers]}" + ) + raise Err(HandleErr_NoHandler()) try: return handler.handle(req) + except json.JSONDecodeError as err: + traceback.print_exc() + raise Err(HandleErr_InJsonErr(str(err))) except Exception as err: - return Err(json.dumps({"ty": "handler_500", "message": str(err)})) + traceback.print_exc() + raise Err(HandleErr_HandlerErr(str(err))) class ErasedHandler: def __init__(self, handler_fn: Callable[[Any], Any]) -> None: self.handler_fn = handler_fn - def handle(self, req: Req): + def handle(self, req: HandleReq): in_parsed = json.loads(req.in_json) out = self.handler_fn(in_parsed) - return Ok(json.dumps(out)) + return json.dumps(out) def op_to_handler(op: MatInfo) -> ErasedHandler: @@ -55,11 +77,103 @@ def op_to_handler(op: MatInfo) -> ErasedHandler: exec(data_parsed["source"], module.__dict__) fn = module.__dict__[data_parsed["func_name"]] return ErasedHandler(handler_fn=lambda inp: fn(inp)) - elif data_parsed["ty"] == "lambda": - fn = eval(data_parsed["source"]) - return ErasedHandler(handler_fn=lambda inp: fn(inp)) elif data_parsed["ty"] == "import_function": + prefix = data_parsed["func_name"] + + modules_raw = data_parsed["sources"] + finder = ThePathFinder( + {os.path.join(prefix, path): modules_raw[path] for path in modules_raw} + ) + sys.meta_path.append(finder) + + module = importlib.import_module( + ThePathFinder.path_to_module( + os.path.join(prefix, data_parsed["root_src_path"]) + ) + ) + return ErasedHandler(handler_fn=getattr(module, data_parsed["func_name"])) + elif data_parsed["ty"] == "lambda": fn = eval(data_parsed["source"]) return ErasedHandler(handler_fn=lambda inp: fn(inp)) else: raise Err(InitError_UnexpectedMat(op)) + + +class ThePathFinder(importlib.abc.MetaPathFinder): + @staticmethod + def path_to_module(path: str): + return os.path.splitext((os.path.normpath(path)))[0].replace("/", ".") + + def __init__(self, modules: Dict[str, str]): + self._mods_raw = modules + self._pkgs = set() + for path in self._mods_raw: + dirname = os.path.dirname(path) + while dirname != "/" and dirname != "" and dirname != ".": + if dirname not in self._mods_raw: + self._pkgs.add(dirname) + dirname = os.path.dirname(dirname) + self._mod_names = {ThePathFinder.path_to_module(path): path for path in modules} + self._pkg_names = { + ThePathFinder.path_to_module(path): path for path in self._pkgs + } + + # Look for a spec under a certain module name + # https://peps.python.org/pep-0302/ + # https://peps.python.org/pep-0451/ + def find_spec(self, fullname: str, _path, target=None): + if fullname in self._mod_names: + path = self._mod_names[fullname] + # this helper will return a ModuleSpec populating + # its' fields according to methods on the Loader + # note, the loader is ultimately responsible for making + # the module as well. The spec itself is an indirection + # for flexebility purposes + return importlib.util.spec_from_loader( + fullname, + # our fake loader will give out the raw module src + # when asked + FakeFileLoader( + fullname, path, src=self._mods_raw[path], is_package=False + ), + ) + # when one imports foo.bar.keg + # python will ask us for packages foo and bar + # to get to keg. + # incoming artifacts are written around directory + # based packages. this impl doesn't support that + # so we instead return empty files for packages + if fullname in self._pkg_names: + path = self._pkg_names[fullname] + return importlib.util.spec_from_loader( + fullname, FakeFileLoader(fullname, path, src="", is_package=True) + ) + + +# most of the actual Loader impl lives in FileLoader +# and othe parent classes. +# We only need to override enough for our usecases +class FakeFileLoader(importlib.abc.FileLoader): + def __init__( + self, + fullname: str, + path: str, + src: str, + is_package: bool, + ): + self.name = fullname + self.path = path + self._is_pkg = is_package + self._src = src + + def is_package(self, fullname: str): + assert fullname == self.name + return self._is_pkg + + def get_source(self, fullname: str): + assert fullname == self.name + return self._src + + def get_filename(self, name=None): + assert name is not None and name == self.name + return self.path diff --git a/meta-cli/src/cli/gen.rs b/meta-cli/src/cli/gen.rs index 3891ef875f..4f60ea13b9 100644 --- a/meta-cli/src/cli/gen.rs +++ b/meta-cli/src/cli/gen.rs @@ -108,12 +108,20 @@ impl Action for Gen { } } GeneratorOp::Mdk => { - let files = metagen::generate_target(mgen_conf, &self.gen_target, resolver).await?; + let files = metagen::generate_target( + mgen_conf, + &self.gen_target, + config.path.as_ref().unwrap().parent().unwrap().into(), + resolver, + ) + .await?; let mut set = tokio::task::JoinSet::new(); - for (path, file) in files { + for (path, file) in files.0 { set.spawn(async move { tokio::fs::create_dir_all(path.parent().unwrap()).await?; - tokio::fs::write(path, file).await?; + if file.overwrite || !tokio::fs::try_exists(&path).await? { + tokio::fs::write(path, file.contents).await?; + } Ok::<_, tokio::io::Error>(()) }); } diff --git a/rustfmt.toml b/rustfmt.toml new file mode 100644 index 0000000000..40a6f9e62d --- /dev/null +++ b/rustfmt.toml @@ -0,0 +1 @@ +# format_generated_files=false diff --git a/typegate/engine/build.rs b/typegate/engine/build.rs index 716a8971d2..46a222d127 100644 --- a/typegate/engine/build.rs +++ b/typegate/engine/build.rs @@ -10,15 +10,17 @@ fn main() -> Result<(), Box> { // into OUT_DIR/pyrt.cwasm.zst let cwd = PathBuf::from(std::env::var("CARGO_MANIFEST_DIR")?); - let pyrt_path = cwd.join("../../libs/pyrt_wit_wire/"); let out_dir = PathBuf::from(std::env::var("OUT_DIR")?); let target = std::env::var("TARGET")?; println!( "cargo:rerun-if-changed={}/main.py", - pyrt_path.to_string_lossy() + cwd.join("../../libs/pyrt_wit_wire/").to_string_lossy() + ); + println!( + "cargo:rerun-if-changed={}/wit-wire.wit", + cwd.join("../../wit/").to_string_lossy() ); - println!("cargo:rerun-if-changed={}/wit", pyrt_path.to_string_lossy()); let wasm_path = out_dir.join("pyrt.wasm"); // note: we're using ghjk here @@ -59,7 +61,7 @@ fn main() -> Result<(), Box> { if std::env::var("PROFILE")? == "release" { 19 } else { - 0 + 1 }, )?; // wasmtime::Component diff --git a/typegate/engine/runtime.d.ts b/typegate/engine/runtime.d.ts index 9101937f60..26d3d6d604 100644 --- a/typegate/engine/runtime.d.ts +++ b/typegate/engine/runtime.d.ts @@ -62,7 +62,7 @@ type MetaNS = { handle: ( instanceId: string, args: WitWireReq, - ) => Promise; + ) => Promise; }; }; @@ -250,3 +250,15 @@ export type WitWireInitError = | { Other: string; }; + +export type WitWireHandleResponse = + | { + Ok: string; + } + | "NoHandler" + | { + InJsonErr: string; + } + | { + HandlerErr: string; + }; diff --git a/typegate/engine/src/lib.rs b/typegate/engine/src/lib.rs index 75b50770a0..723205387a 100644 --- a/typegate/engine/src/lib.rs +++ b/typegate/engine/src/lib.rs @@ -83,10 +83,10 @@ impl OpDepInjector { ) .expect("invalid wasmtime engine config"); let tmp_dir = self.tmp_dir.unwrap(); - state.put(runtimes::wit_wire::Ctx::new( - engine, - tmp_dir.join("wit_wire_workdir"), - )); + state.put( + runtimes::wit_wire::Ctx::new(engine, tmp_dir.join("wit_wire_workdir")) + .expect("error initializing wit_wire state"), + ); state.put(runtimes::prisma::Ctx::new(tmp_dir)); } } diff --git a/typegate/engine/src/runtimes/prisma/engine_import.rs b/typegate/engine/src/runtimes/prisma/engine_import.rs index 7a563c9d19..1e014b2ef9 100644 --- a/typegate/engine/src/runtimes/prisma/engine_import.rs +++ b/typegate/engine/src/runtimes/prisma/engine_import.rs @@ -1,4 +1,4 @@ -// no-auto-license-header +// no-auto-license-header | @generated (pre-commit doesn't support two headers) // Copyright 2019 Prisma Data, Inc. // Modifications copyright Metatype OÜ diff --git a/typegate/engine/src/runtimes/wit_wire.rs b/typegate/engine/src/runtimes/wit_wire.rs index 48032b49cb..d3d1776bcd 100644 --- a/typegate/engine/src/runtimes/wit_wire.rs +++ b/typegate/engine/src/runtimes/wit_wire.rs @@ -7,12 +7,15 @@ use dashmap::DashMap; use deno_core as deno_core; // necessary for re-exported macros to work use deno_core::OpState; use wasmtime::component::{Component, Linker}; -use wit::exports::metatype::pyrt::mat_wire::{InitArgs, InitError, MatInfo, Req as MatReq}; -use wit::metatype::pyrt::typegate_wire::{Host, Req as HostReq, Res as HostRes}; +use wit::exports::metatype::wit_wire::mat_wire::{InitArgs, InitError, MatInfo}; +use wit::metatype::wit_wire::typegate_wire::Host; + +use self::wit::exports::metatype::wit_wire::mat_wire::{HandleErr, HandleReq}; mod wit { wasmtime::component::bindgen!({ - path: "../../libs/pyrt_wit_wire/wit", + world: "wit-wire", + path: "../../wit/", async: true, }); } @@ -21,31 +24,38 @@ mod wit { pub struct Ctx { engine: wasmtime::Engine, instances: Arc>, - components: Arc>, instance_workdir: PathBuf, + linker: Linker, + cached_components: DashMap, } -#[derive(Clone)] -struct LinkedComponent(Component, Arc>); - impl Ctx { - pub fn new(engine: wasmtime::Engine, instance_workdir: PathBuf) -> Self { - Self { + pub fn new(engine: wasmtime::Engine, instance_workdir: PathBuf) -> anyhow::Result { + Ok(Self { instances: Default::default(), - components: Default::default(), - engine, instance_workdir, - } + cached_components: Default::default(), + linker: { + let mut linker = Linker::::new(&engine); + + wasmtime_wasi::add_to_linker_async(&mut linker)?; + wit::WitWire::add_to_linker(&mut linker, |state| &mut state.tg_host)?; + + linker + }, + engine, + }) } - async fn get_component(&self, wasm_relative_path: String) -> Result { - if let Some(comp) = self.components.get(&wasm_relative_path[..]) { - return Ok(comp.clone()); - } + async fn get_component(&self, wasm_relative_path: String) -> Result { let engine = self.engine.clone(); let comp = if wasm_relative_path == "inline://pyrt_wit_wire.cwasm" { + // we only manually cache inline components since they'll never change + if let Some(comp) = self.cached_components.get(&wasm_relative_path) { + return Ok(comp.clone()); + } let cwasm_zst_bytes = include_bytes!(concat!(env!("OUT_DIR"), "/pyrt.cwasm.zst")); - tokio::task::spawn_blocking(move || unsafe { + let comp = tokio::task::spawn_blocking(move || unsafe { let mut cwasm_bytes = vec![]; zstd::stream::copy_decode(&cwasm_zst_bytes[..], &mut cwasm_bytes) .map_err(|err| format!("error decompressing serialized component: {err}"))?; @@ -53,58 +63,34 @@ impl Ctx { .map_err(|err| format!("error loading pyrt serialized component: {err}")) }) .await - .map_err(|err| format!("tokio error loading serialized component: {err}"))?? + .map_err(|err| format!("tokio error loading serialized component: {err}"))??; + self.cached_components + .insert(wasm_relative_path, comp.clone()); + comp } else { + // for user provided components, we let wasmtime take care + // of the caching let wasm_absolute_path = match std::env::current_dir() { Ok(cwd) => cwd.join(&wasm_relative_path), Err(err) => return Err(format!("error trying to find cwd: {err}")), }; - let path_clone = wasm_absolute_path.clone(); - - if wasm_absolute_path - .extension() - .map(|ext| ext == "cwasm") - .unwrap_or_default() - { - // TODO: self manage precompilation cache - tokio::task::spawn_blocking(move || unsafe { - Component::deserialize_file(&engine, &path_clone) - }) + let raw = tokio::fs::read(&wasm_absolute_path).await.map_err(|err| { + format!("error loading serialized component from {wasm_relative_path}: {err}") + })?; + tokio::task::spawn_blocking(move || Component::from_binary(&engine, &raw[..])) .await - .map_err(|err| format!("tokio error loading serialized component: {err}"))? - .map_err(|err| { - format!("error loading serialized component from {wasm_relative_path}: {err}") - })? - } else { - tokio::task::spawn_blocking(move || Component::from_file(&engine, &path_clone)) - .await - .map_err(|err| format!("tokio error loading component: {err}"))? - .map_err(|err| { - format!("error loading component from {wasm_relative_path}: {err}") - })? - } + .map_err(|err| format!("tokio error loading component: {err}"))? + .map_err(|err| format!("error loading component: {err}"))? }; - let mut linker = Linker::::new(&self.engine); - - for res in [ - wasmtime_wasi::add_to_linker_async(&mut linker), - wit::Pyrt::add_to_linker(&mut linker, |state| &mut state.tg_host), - ] { - res.map_err(|err| format!("erorr trying to link component: {err}"))?; - } - Ok(self - .components - .entry(wasm_relative_path) - .insert_entry(LinkedComponent(comp, linker.into())) - .get() - .clone()) + Ok(comp) } } struct Instance { - bindings: wit::Pyrt, + bindings: wit::WitWire, _instance: wasmtime::component::Instance, store: wasmtime::Store, + preopen_dir: PathBuf, } struct InstanceState { @@ -155,13 +141,14 @@ struct TypegateHost {} #[wasmtime_wasi::async_trait] impl Host for TypegateHost { - async fn hostcall(&mut self, _req: HostReq) -> wasmtime::Result { + async fn hostcall( + &mut self, + _req: (String, String), + ) -> wasmtime::Result> { todo!() } } -impl wit::metatype::pyrt::shared::Host for TypegateHost {} - impl From for InitArgs { fn from(value: WitWireInitArgs) -> Self { InitArgs { @@ -243,25 +230,25 @@ pub async fn op_wit_wire_init( ctx.clone() }; - let LinkedComponent(ref component, ref linker) = ctx + let component = ctx .get_component(component_path) .await .map_err(WitWireInitError::ModuleErr)?; - let mut store = wasmtime::Store::new( - &ctx.engine, - InstanceState::new(ctx.instance_workdir.join(&instance_id), TypegateHost {}), - ); - let (bindings, instance) = wit::Pyrt::instantiate_async(&mut store, component, linker) + let work_dir = ctx.instance_workdir.join(&instance_id); + tokio::fs::create_dir_all(&work_dir).await.unwrap(); + let mut store = + wasmtime::Store::new(&ctx.engine, InstanceState::new(&work_dir, TypegateHost {})); + let (bindings, instance) = wit::WitWire::instantiate_async(&mut store, &component, &ctx.linker) .await .map_err(|err| { WitWireInitError::ModuleErr(format!("error tring to make component instance: {err}")) })?; - let guest = bindings.metatype_pyrt_mat_wire(); + let guest = bindings.metatype_wit_wire_mat_wire(); let args = input.into(); let res = guest.call_init(&mut store, &args).await.map_err(|err| { WitWireInitError::ModuleErr(format!("module error calling init: {err}")) - })??; + })??; // <- note second try for the wit err. we have an into impl above assert!(res.ok); ctx.instances.insert( instance_id, @@ -269,6 +256,7 @@ pub async fn op_wit_wire_init( _instance: instance, bindings, store, + preopen_dir: work_dir, }, ); Ok(WitWireInitResponse {}) @@ -282,7 +270,15 @@ pub async fn op_wit_wire_destroy(state: Rc>, #[string] instance ctx.clone() }; - ctx.instances.remove(&instance_id); + let Some((_id, instance)) = ctx.instances.remove(&instance_id) else { + return; + }; + if let Err(err) = tokio::fs::remove_dir_all(&instance.preopen_dir).await { + error!( + "error removing preopend dir for instance {_id} at {:?}: {err}", + instance.preopen_dir + ) + } } #[derive(Deserialize)] @@ -292,7 +288,7 @@ pub struct WitWireReq { in_json: String, } -impl From for MatReq { +impl From for HandleReq { fn from(value: WitWireReq) -> Self { Self { op_name: value.op_name, @@ -306,19 +302,26 @@ impl From for MatReq { pub enum WitWireHandleError { #[error("instance not found under id {id}")] InstanceNotFound { id: String }, - #[error("mat error: {0:?}")] - MatErr(String), #[error("wasm module error: {0:?}")] ModuleErr(String), } +#[derive(Serialize)] +#[serde(crate = "serde")] +pub enum HandleRes { + Ok(String), + NoHandler, + InJsonErr(String), + HandlerErr(String), +} + #[deno_core::op2(async)] -#[string] +#[serde] pub async fn op_wit_wire_handle( state: Rc>, #[string] instance_id: String, #[serde] input: WitWireReq, -) -> Result { +) -> Result { let ctx = { let state = state.borrow(); let ctx = state.borrow::(); @@ -331,12 +334,19 @@ pub async fn op_wit_wire_handle( .ok_or(WitWireHandleError::InstanceNotFound { id: instance_id })?; // reborrow https://bevy-cheatbook.github.io/pitfalls/split-borrows.html let instance = &mut *instance; - let guest = instance.bindings.metatype_pyrt_mat_wire(); + let guest = instance.bindings.metatype_wit_wire_mat_wire(); let res = guest .call_handle(&mut instance.store, &input.into()) .await .map_err(|err| { WitWireHandleError::ModuleErr(format!("module error calling handle: {err}")) })?; - res.map_err(WitWireHandleError::MatErr) + Ok(match res { + Ok(json) => HandleRes::Ok(json), + Err(err) => match err { + HandleErr::NoHandler => HandleRes::NoHandler, + HandleErr::InJsonErr(msg) => HandleRes::InJsonErr(msg), + HandleErr::HandlerErr(msg) => HandleRes::HandlerErr(msg), + }, + }) } diff --git a/typegate/src/engine/planner/mod.ts b/typegate/src/engine/planner/mod.ts index be5a39768a..2dd234a274 100644 --- a/typegate/src/engine/planner/mod.ts +++ b/typegate/src/engine/planner/mod.ts @@ -134,15 +134,17 @@ export class Planner { this.verbose && logger.debug( - this.tg.root.title, - name, - args.map((n) => n.name?.value), - selection.map((n) => n.name?.value), - typ.type, - Object.entries(props).reduce( - (agg, [k, v]) => ({ ...agg, [k]: this.tg.type(v).type }), - {}, - ), + `${this.tg.root.title} {}`, + { + name, + args: args.map((n) => n.name?.value), + selection: selection.map((n) => n.name?.value), + type: typ.type, + props: Object.entries(props).reduce( + (agg, [k, v]) => ({ ...agg, [k]: this.tg.type(v).type }), + {}, + ), + }, ); stages.push( diff --git a/typegate/src/engine/query_engine.ts b/typegate/src/engine/query_engine.ts index d68fbc661e..d4eac71ffa 100644 --- a/typegate/src/engine/query_engine.ts +++ b/typegate/src/engine/query_engine.ts @@ -287,17 +287,17 @@ export class QueryEngine { return await this.tg.deinit(); } - materialize( + async materialize( stages: ComputeStage[], verbose: boolean, - ): ComputeStage[] { + ): Promise { const stagesMat: ComputeStage[] = []; const waitlist = [...stages]; while (waitlist.length > 0) { const stage = waitlist.shift()!; stagesMat.push( - ...stage.props.runtime.materialize(stage, waitlist, verbose), + ...await stage.props.runtime.materialize(stage, waitlist, verbose), ); } @@ -336,7 +336,7 @@ export class QueryEngine { */ // how - const stagesMat = this.materialize(stages, verbose); + const stagesMat = await this.materialize(stages, verbose); // when const optimizedStages = this.optimize(stagesMat, verbose); diff --git a/typegate/src/log.ts b/typegate/src/log.ts index 7d6f4b3868..5a02bda066 100644 --- a/typegate/src/log.ts +++ b/typegate/src/log.ts @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Elastic-2.0 import { handlers, LevelName, Logger } from "std/log/mod.ts"; -import { basename } from "std/url/mod.ts"; +import { basename, dirname } from "std/url/mod.ts"; import { extname } from "std/path/mod.ts"; import { z } from "zod"; import { deepMerge } from "std/collections/deep_merge.ts"; @@ -104,9 +104,7 @@ const consoleHandler = new handlers.ConsoleHandler( typeof arg === "string" ? arg : JSON.stringify(arg), ); } - return `${log.datetime.toISOString()} ${log.levelName.padEnd(5)} ${ - log.loggerName.padEnd(16) - } ${msg}`; + return `${log.datetime.toISOString()} [${log.levelName} ${log.loggerName}] ${msg}`; }, }, ); @@ -124,8 +122,9 @@ export function getLogger( return defaultLogger; } if (typeof name === "object") { - name = basename(name.url); - name = name.replace(extname(name), ""); + const bname = basename(name.url); + const dname = basename(dirname(name.url)); + name = `${dname}/${bname.replace(extname(bname), "")}`; } let logger = loggers.get(name); if (!logger) { diff --git a/typegate/src/main.ts b/typegate/src/main.ts index 347282db49..b7e148e2ea 100644 --- a/typegate/src/main.ts +++ b/typegate/src/main.ts @@ -34,10 +34,10 @@ try { debug: true, }); - addEventListener("unhandledrejection", (e) => { - Sentry.captureException(e); - logger.error(e); - e.preventDefault(); + addEventListener("unhandledrejection", (err) => { + Sentry.captureException(err); + logger.error(Deno.inspect(err)); + err.preventDefault(); }); // init rust native libs @@ -60,6 +60,6 @@ try { await server.finished; } catch (err) { - logger.error(err); + logger.error(Deno.inspect(err)); throw err; } diff --git a/typegate/src/runtimes/Runtime.ts b/typegate/src/runtimes/Runtime.ts index 5cd80c086b..895181c59f 100644 --- a/typegate/src/runtimes/Runtime.ts +++ b/typegate/src/runtimes/Runtime.ts @@ -21,7 +21,7 @@ export abstract class Runtime { stage: ComputeStage, waitlist: ComputeStage[], verbose: boolean, - ): ComputeStage[]; + ): ComputeStage[] | Promise; static collectRelativeStages( base: ComputeStage, diff --git a/typegate/src/runtimes/mod.ts b/typegate/src/runtimes/mod.ts index d48520d0d3..56727de88c 100644 --- a/typegate/src/runtimes/mod.ts +++ b/typegate/src/runtimes/mod.ts @@ -35,8 +35,7 @@ export async function initRuntime( } export async function init_runtimes(): Promise { - await Promise.allSettled([ - import("./Runtime.ts"), + await Promise.all([ import("./deno.ts"), import("./graphql.ts"), import("./http.ts"), @@ -47,6 +46,7 @@ export async function init_runtimes(): Promise { import("./temporal.ts"), import("./typegate.ts"), import("./typegraph.ts"), - import("./wasm.ts"), + import("./wasm_wire.ts"), + import("./wasm_reflected.ts"), ]); } diff --git a/typegate/src/runtimes/python.ts b/typegate/src/runtimes/python.ts index f3627bb912..649aef824a 100644 --- a/typegate/src/runtimes/python.ts +++ b/typegate/src/runtimes/python.ts @@ -10,6 +10,7 @@ import { Artifact, Materializer } from "../typegraph/types.ts"; import * as ast from "graphql/ast"; import { WitWireMessenger } from "./wit_wire/mod.ts"; import { WitWireMatInfo } from "../../engine/runtime.js"; +import { sha256 } from "../crypto.ts"; const _logger = getLogger(import.meta); @@ -26,86 +27,98 @@ export class PythonRuntime extends Runtime { static async init(params: RuntimeInitParams): Promise { const { materializers, typegraphName, typegraph, typegate } = params; - const wireMatInfos = await Promise.all(materializers.map( - async (mat) => { - let matData: object; - switch (mat.name) { - case "lambda": - matData = { - ty: "lambda", - source: mat.data.fn as string, - effect: mat.effect, - }; - break; - case "def": - matData = { - ty: "def", - source: mat.data.fn as string, - func_name: mat.data.name as string, - effect: mat.effect, - }; - break; - case "import_function": { - const pyModMat = typegraph.materializers[mat.data.mod as number]; - - // resolve the python module artifacts/files - const { pythonArtifact, depsMeta: depArtifacts } = pyModMat.data; - - const deps = depArtifacts as Artifact[]; - const artifact = pythonArtifact as Artifact; - - const sources = Object.fromEntries( - await Promise.all( - [ - { - typegraphName: typegraphName, - relativePath: artifact.path, - hash: artifact.hash, - sizeInBytes: artifact.size, - }, - ...deps.map((dep) => { - return { - typegraphName: typegraphName, - relativePath: dep.path, - hash: dep.hash, - sizeInBytes: dep.size, - }; - }), - ].map( - async (meta) => + const wireMatInfos = await Promise.all( + materializers + .filter((mat) => mat.name != "pymodule") + .map( + async (mat) => { + let matInfoData: object; + switch (mat.name) { + case "lambda": + matInfoData = { + ty: "lambda", + effect: mat.effect, + source: mat.data.fn as string, + }; + break; + case "def": + matInfoData = { + ty: "def", + func_name: mat.data.name as string, + effect: mat.effect, + source: mat.data.fn as string, + }; + break; + case "import_function": { + const pyModMat = + typegraph.materializers[mat.data.mod as number]; + + // resolve the python module artifacts/files + const { pythonArtifact, depsMeta: depArtifacts } = + pyModMat.data; + + const deps = depArtifacts as Artifact[]; + const artifact = pythonArtifact as Artifact; + + const sources = Object.fromEntries( + await Promise.all( [ - meta.relativePath, - await Deno.readTextFile( - await typegate.artifactStore.getLocalPath(meta), - ), - ] as const, - ), - ), - ); - - matData = { - ty: "import_function", - effect: mat.effect, - sources, - rootSourcePath: artifact.path, - func_name: mat.data.name as string, + { + typegraphName: typegraphName, + relativePath: artifact.path, + hash: artifact.hash, + sizeInBytes: artifact.size, + }, + ...deps.map((dep) => { + return { + typegraphName: typegraphName, + relativePath: dep.path, + hash: dep.hash, + sizeInBytes: dep.size, + }; + }), + ].map( + async (meta) => + [ + meta.relativePath, + await Deno.readTextFile( + await typegate.artifactStore.getLocalPath(meta), + ), + ] as const, + ), + ), + ); + + matInfoData = { + ty: "import_function", + effect: mat.effect, + root_src_path: artifact.path, + func_name: mat.data.name as string, + sources, + }; + break; + } + default: + throw new Error(`unsupported materializer type: ${mat.name}`); + } + + // TODO: use materializer type node hash instead + const dataHash = await sha256(JSON.stringify(mat.data)); + const op_name = `${mat.data.name as string}_${ + dataHash.slice(0, 12) + }`; + + const out: WitWireMatInfo = { + op_name, + mat_hash: dataHash, + // TODO: source title of materializer type? + mat_title: mat.data.name as string, + mat_data_json: JSON.stringify(matInfoData), }; - break; - } - default: - throw new Error(`unsupported materializer type: ${mat.name}`); - } - const out: WitWireMatInfo = { - op_name: mat.data.name as string, - // TODO: hashing - mat_hash: mat.data.name as string, - // TODO: title of materializer type? - mat_title: mat.data.name as string, - mat_data_json: JSON.stringify(matData), - }; - return out; - }, - )); + return out; + }, + ), + ); // add default vm for lambda/def const uuid = crypto.randomUUID(); @@ -122,11 +135,11 @@ export class PythonRuntime extends Runtime { await using _drop = this.wire; } - materialize( + async materialize( stage: ComputeStage, _waitlist: ComputeStage[], _verbose: boolean, - ): ComputeStage[] { + ): Promise { if (stage.props.node === "__typename") { return [stage.withResolver(() => { const { parent: parentStage } = stage.props; @@ -148,8 +161,9 @@ export class PythonRuntime extends Runtime { if (stage.props.materializer != null) { const mat = stage.props.materializer; + return [ - stage.withResolver(this.delegate(mat)), + stage.withResolver(await this.delegate(mat)), ]; } @@ -166,8 +180,10 @@ export class PythonRuntime extends Runtime { })]; } - delegate(mat: Materializer): Resolver { + async delegate(mat: Materializer): Promise { const { name } = mat.data; - return (args) => this.wire.handle(name as string, args); + const dataHash = await sha256(JSON.stringify(mat.data)); + const op_name = `${name as string}_${dataHash.slice(0, 12)}`; + return (args) => this.wire.handle(op_name, args); } } diff --git a/typegate/src/runtimes/wasm.ts b/typegate/src/runtimes/wasm_reflected.ts similarity index 80% rename from typegate/src/runtimes/wasm.ts rename to typegate/src/runtimes/wasm_reflected.ts index 3b9bbf5aa4..c19a54f481 100644 --- a/typegate/src/runtimes/wasm.ts +++ b/typegate/src/runtimes/wasm_reflected.ts @@ -1,26 +1,29 @@ // Copyright Metatype OÜ, licensed under the Elastic License 2.0. // SPDX-License-Identifier: Elastic-2.0 +import { registerRuntime } from "./mod.ts"; import { Runtime } from "./Runtime.ts"; import * as native from "native"; import { Resolver, RuntimeInitParams } from "../types.ts"; import { nativeResult } from "../utils.ts"; import { ComputeStage } from "../engine/query_engine.ts"; -import { registerRuntime } from "./mod.ts"; import * as ast from "graphql/ast"; -import { Materializer } from "../typegraph/types.ts"; +import { Materializer, WasmRuntimeData } from "../typegraph/types.ts"; import { Typegate } from "../typegate/mod.ts"; -@registerRuntime("wasm") -export class WasmRuntime extends Runtime { - private constructor(typegraphName: string, private typegate: Typegate) { +@registerRuntime("wasm_reflected") +export class WasmRuntimeReflected extends Runtime { + private constructor( + public artifactKey: string, + typegraphName: string, + private typegate: Typegate, + ) { super(typegraphName); } - static init(params: RuntimeInitParams): Promise { - const { typegraphName, typegate } = params; - - return Promise.resolve(new WasmRuntime(typegraphName, typegate)); + static init(params: RuntimeInitParams): Runtime { + const { typegraphName, typegate, args: { wasm_artifact } } = params; + return new WasmRuntimeReflected(wasm_artifact, typegraphName, typegate); } async deinit(): Promise {} @@ -80,10 +83,10 @@ export class WasmRuntime extends Runtime { materializer: Materializer, argumentTypes?: Record, ): Resolver { - const { wasmArtifact, func } = materializer?.data ?? {}; + const { op_name } = materializer?.data ?? {}; const order = Object.keys(argumentTypes ?? {}); const typegraph = this.typegate.register.get(this.typegraphName)!; - const art = typegraph.tg.tg.meta.artifacts[wasmArtifact as string]; + const art = typegraph.tg.tg.meta.artifacts[this.artifactKey as string]; const artifactMeta = { typegraphName: this.typegraphName, @@ -96,7 +99,7 @@ export class WasmRuntime extends Runtime { const transfert = order.map((k) => JSON.stringify(args[k])); const { res } = nativeResult( await native.wasmtime_wit({ - func: func as string, + func: op_name as string, wasm: await this.typegate.artifactStore.getLocalPath(artifactMeta), args: transfert, }), diff --git a/typegate/src/runtimes/wasm_wire.ts b/typegate/src/runtimes/wasm_wire.ts new file mode 100644 index 0000000000..47fc8453c8 --- /dev/null +++ b/typegate/src/runtimes/wasm_wire.ts @@ -0,0 +1,116 @@ +// Copyright Metatype OÜ, licensed under the Elastic License 2.0. +// SPDX-License-Identifier: Elastic-2.0 + +import { registerRuntime } from "./mod.ts"; +import { Runtime } from "./Runtime.ts"; +import { Resolver, RuntimeInitParams } from "../types.ts"; +import { ComputeStage } from "../engine/query_engine.ts"; +import * as ast from "graphql/ast"; +import { Materializer, WasmRuntimeData } from "../typegraph/types.ts"; +import { getLogger } from "../log.ts"; +import { WitWireMessenger } from "./wit_wire/mod.ts"; + +const logger = getLogger(import.meta); + +@registerRuntime("wasm_wire") +export class WasmRuntimeWire extends Runtime { + private constructor( + typegraphName: string, + uuid: string, + private wire: WitWireMessenger, + ) { + super(typegraphName, uuid); + } + + static async init( + params: RuntimeInitParams, + ): Promise { + const { + typegraph, + typegraphName, + typegate, + args: { wasm_artifact }, + materializers, + } = params; + + const moduleArt = typegraph.meta.artifacts[wasm_artifact]; + const artifactMeta = { + typegraphName: typegraphName, + relativePath: moduleArt.path, + hash: moduleArt.hash, + sizeInBytes: moduleArt.size, + }; + + const uuid = crypto.randomUUID(); + logger.debug("initializing wit wire {}", { + instanceId: uuid, + module: artifactMeta, + }); + const wire = await WitWireMessenger.init( + await typegate.artifactStore.getLocalPath(artifactMeta), + uuid, + materializers.map((mat) => ({ + op_name: mat.data.op_name as string, + // TODO; appropriately source the following + mat_hash: mat.data.op_name as string, + mat_title: mat.data.op_name as string, + mat_data_json: JSON.stringify({}), + })), + ); + + return new WasmRuntimeWire(typegraphName, uuid, wire); + } + + async deinit(): Promise { + await using _drop = this.wire; + } + + materialize( + stage: ComputeStage, + _waitlist: ComputeStage[], + _verbose: boolean, + ): ComputeStage[] { + if (stage.props.node === "__typename") { + return [stage.withResolver(() => { + const { parent: parentStage } = stage.props; + if (parentStage != null) { + return parentStage.props.outType.title; + } + switch (stage.props.operationType) { + case ast.OperationTypeNode.QUERY: + return "Query"; + case ast.OperationTypeNode.MUTATION: + return "Mutation"; + default: + throw new Error( + `Unsupported operation type '${stage.props.operationType}'`, + ); + } + })]; + } + + if (stage.props.materializer != null) { + const mat = stage.props.materializer; + return [ + stage.withResolver(this.delegate(mat)), + ]; + } + + if (stage.props.outType.config?.__namespace) { + return [stage.withResolver(() => ({}))]; + } + + return [stage.withResolver(({ _: { parent } }) => { + if (stage.props.parent == null) { // namespace + return {}; + } + const resolver = parent[stage.props.node]; + return typeof resolver === "function" ? resolver() : resolver; + })]; + } + + delegate(mat: Materializer): Resolver { + const { op_name } = mat.data; + return (args) => this.wire.handle(op_name as string, args); + } +} diff --git a/typegate/src/runtimes/wit_wire/mod.ts b/typegate/src/runtimes/wit_wire/mod.ts index d6b4929f02..3c7588b901 100644 --- a/typegate/src/runtimes/wit_wire/mod.ts +++ b/typegate/src/runtimes/wit_wire/mod.ts @@ -5,25 +5,37 @@ import type { WitWireMatInfo } from "../../../engine/runtime.js"; import { ResolverArgs } from "../../types.ts"; export class WitWireMessenger { - static async init(componentPath: string, id: string, ops: WitWireMatInfo[]) { + static async init( + componentPath: string, + instanceId: string, + ops: WitWireMatInfo[], + ) { try { - const _res = await Meta.wit_wire.init(componentPath, id, { + const _res = await Meta.wit_wire.init(componentPath, instanceId, { expected_ops: ops, - metatype_version: "TODO", + // FIXME: source actual version + metatype_version: "0.3.7-0", }); - return new WitWireMessenger(id); + return new WitWireMessenger(instanceId, componentPath, ops); } catch (err) { - throw new Error(`error on init for component at path: ${componentPath}`, { - cause: { - componentPath, - ops, - err, + throw new Error( + `error on init for component at path: ${componentPath}: ${err}`, + { + cause: { + componentPath, + ops, + err, + }, }, - }); + ); } } - constructor(public id: string) { + constructor( + public id: string, + public componentPath: string, + public ops: WitWireMatInfo[], + ) { } async [Symbol.asyncDispose]() { @@ -32,20 +44,73 @@ export class WitWireMessenger { async handle(opName: string, args: ResolverArgs) { const { _, ...inJson } = args; + let res; try { - const res = await Meta.wit_wire.handle(this.id, { + res = await Meta.wit_wire.handle(this.id, { op_name: opName, in_json: JSON.stringify(inJson), }); - return JSON.parse(res); } catch (err) { - throw new Error(`error handling request for op ${opName}`, { - cause: { - opName, - args, - err, + throw new Error( + `unexpected error handling request for op ${opName}: ${err}`, + { + cause: { + opName, + args: inJson, + component: this.componentPath, + err, + }, }, - }); + ); + } + if ( + typeof res == "string" + ) { + if (res == "NoHandler") { + throw new Error( + `materializer doesn't implement handler for op ${opName}`, + { + cause: { + opName, + args: inJson, + component: this.componentPath, + ops: this.ops, + }, + }, + ); + } else { + throw new Error(`unexpected mat result for op ${opName}: ${res}`, { + cause: { + opName, + args: inJson, + component: this.componentPath, + }, + }); + } + } else if ("Ok" in res) { + return JSON.parse(res.Ok); + } else if ("InJsonErr" in res) { + throw new Error( + `materializer failed deserializing json args for op ${opName}: ${res.InJsonErr}`, + { + cause: { + opName, + args: inJson, + component: this.componentPath, + }, + }, + ); + } else { + throw new Error( + `materializer handler error for op ${opName}: ${res.HandlerErr}`, + { + cause: { + opName, + args: inJson, + component: this.componentPath, + }, + }, + ); } } } diff --git a/typegate/src/services/auth/protocols/oauth2.ts b/typegate/src/services/auth/protocols/oauth2.ts index e4a0cb96bf..df626ba982 100644 --- a/typegate/src/services/auth/protocols/oauth2.ts +++ b/typegate/src/services/auth/protocols/oauth2.ts @@ -78,7 +78,7 @@ class AuthProfiler { validatorInputWeak(input); // Note: this assumes func is a simple t.func(inp, out, mat) - const stages = runtime.materialize( + const stages = await runtime.materialize( this.getComputeStage(), [], true, diff --git a/typegate/src/services/graphql_service.ts b/typegate/src/services/graphql_service.ts index bb6ff7f6aa..498944e950 100644 --- a/typegate/src/services/graphql_service.ts +++ b/typegate/src/services/graphql_service.ts @@ -63,8 +63,7 @@ export async function handleGraphQL( const verbose = !isIntrospection; if (verbose) { - logger.info("———"); - logger.info("op:", operationName); + logger.info("op: {}", operationName); } const startTime = performance.now(); @@ -114,8 +113,12 @@ export async function handleGraphQL( Object.keys(context).length === 0 ? 401 : 403, ); } else { - console.error(e); - logger.error(`request err: ${e}`); + logger.error(`request err: ${Deno.inspect(e)}`); + if (e.cause) { + logger.error( + Deno.inspect(e.cause, { strAbbreviateSize: 1024, depth: 10 }), + ); + } return jsonError(e.message, headers, 400); } } diff --git a/typegate/src/typegate/artifacts/local.ts b/typegate/src/typegate/artifacts/local.ts index c1dea6bba0..9dc1b10235 100644 --- a/typegate/src/typegate/artifacts/local.ts +++ b/typegate/src/typegate/artifacts/local.ts @@ -10,9 +10,12 @@ import { STORE_DIR, STORE_TEMP_DIR, } from "./mod.ts"; +import { getLogger } from "../../log.ts"; import { createHash } from "node:crypto"; import * as jwt from "jwt"; +const logger = getLogger(import.meta); + export interface UploadUrlStore { mapToMeta: Map; expirationQueue: [string, number][]; @@ -72,13 +75,14 @@ export class LocalArtifactStore extends ArtifactStore { const hash = hasher.digest("hex"); const targetFile = resolve(STORE_DIR, hash); - console.log(`Persisting artifact to ${targetFile}`); + logger.debug(`persisting artifact {}`, { hash }); await Deno.rename(tmpFile, targetFile); return hash; } override async delete(hash: string) { + logger.debug(`deleting artifact {}`, { hash }); await Deno.remove(resolve(STORE_DIR, hash)); } @@ -104,6 +108,10 @@ export class LocalArtifactStore extends ArtifactStore { override async prepareUpload(meta: ArtifactMeta, origin: URL) { // should not be uploaded again if (await this.has(ArtifactStore.getArtifactKey(meta))) { + logger.debug( + "artifact already exists, skipping upload preparation {}", + { meta }, + ); return null; } diff --git a/typegate/src/typegate/artifacts/mod.ts b/typegate/src/typegate/artifacts/mod.ts index 0a1ed465da..00b6c54ff6 100644 --- a/typegate/src/typegate/artifacts/mod.ts +++ b/typegate/src/typegate/artifacts/mod.ts @@ -26,7 +26,7 @@ export async function getLocalPath( ARTIFACTS_DIR, mainModuleMeta.hash, meta.typegraphName, - meta.relativePath, + meta.hash, ); // TODO: what happens when symlink already exists? or when same local path artifacts with different cachedPath diff --git a/typegate/src/typegraph/types.ts b/typegate/src/typegraph/types.ts index cec49b03e2..4dd07fc3a6 100644 --- a/typegate/src/typegraph/types.ts +++ b/typegate/src/typegraph/types.ts @@ -301,7 +301,10 @@ export type KnownRuntime = { name: "temporal"; data: TemporalRuntimeData; } | { - name: "wasm"; + name: "wasm_wire"; + data: WasmRuntimeData; +} | { + name: "wasm_reflected"; data: WasmRuntimeData; } | { name: "typegate"; @@ -483,7 +486,7 @@ export interface TemporalRuntimeData { namespace_secret?: string; } export interface WasmRuntimeData { - config?: string | null; + wasm_artifact: string; } export interface TypegateRuntimeData { } diff --git a/typegate/tests/metatype.yml b/typegate/tests/metatype.yml index 3067f30e81..165d746fb4 100644 --- a/typegate/tests/metatype.yml +++ b/typegate/tests/metatype.yml @@ -25,3 +25,11 @@ typegraphs: materializers: prisma: migrations_path: "prisma-migrations" + +metagen: + targets: + wasm_wire: + mdk_rust: + path: ./runtimes/wasm_wire/rust/ + typegraph_path: ./runtimes/wasm_wire/wasm_wire.ts + stubbed_runtimes: ["wasm"] diff --git a/typegate/tests/runtimes/python/py/hello.py b/typegate/tests/runtimes/python/py/hello.py index 52d6a9ffdf..dc9b0d49b8 100644 --- a/typegate/tests/runtimes/python/py/hello.py +++ b/typegate/tests/runtimes/python/py/hello.py @@ -1,9 +1,10 @@ -from nested.dep import hello +from .nested.dep import hello +from typing import Dict -def sayHello(x: any): +def sayHello(x: Dict): return hello(x["name"]) -def identity(x: any): +def identity(x: Dict): return x["input"] diff --git a/typegate/tests/runtimes/python/python.py b/typegate/tests/runtimes/python/python.py index e4142f2b7e..85f18856f4 100644 --- a/typegate/tests/runtimes/python/python.py +++ b/typegate/tests/runtimes/python/python.py @@ -61,13 +61,13 @@ def python(g: Graph): t.string(), test, ).with_policy(public), - # testMod=python.import_( - # t.struct({"name": t.string()}), - # t.string(), - # module="py/hello.py", - # deps=["py/nested/dep.py"], - # name="sayHello", - # ).with_policy(public), + testMod=python.import_( + t.struct({"name": t.string()}), + t.string(), + module="py/hello.py", + deps=["py/nested/dep.py"], + name="sayHello", + ).with_policy(public), identity=python.from_def( t.struct({"input": tpe}), tpe, diff --git a/typegate/tests/runtimes/python/python.ts b/typegate/tests/runtimes/python/python.ts index 4e0260ee70..cc82c57386 100644 --- a/typegate/tests/runtimes/python/python.ts +++ b/typegate/tests/runtimes/python/python.ts @@ -30,7 +30,7 @@ export const tg = await typegraph("python", (g: any) => { `, }, ).withPolicy(pub), - /* identityMod: python.import( + identityMod: python.import( t.struct({ input: tpe }), tpe, { @@ -38,6 +38,6 @@ export const tg = await typegraph("python", (g: any) => { module: "py/hello.py", deps: ["py/nested/dep.py"], }, - ).withPolicy(pub), */ + ).withPolicy(pub), }); }); diff --git a/typegate/tests/runtimes/python/python_test.ts b/typegate/tests/runtimes/python/python_test.ts index 61f1a3214a..a17105268e 100644 --- a/typegate/tests/runtimes/python/python_test.ts +++ b/typegate/tests/runtimes/python/python_test.ts @@ -9,7 +9,6 @@ import type { ResolverArgs } from "../../../src/types.ts"; import { testDir } from "test-utils/dir.ts"; import { tg } from "./python.ts"; import * as path from "std/path/mod.ts"; -import { QueryEngine } from "../../../src/engine/query_engine.ts"; import { BasicAuth, tgDeploy } from "@typegraph/sdk/tg_deploy.js"; const cwd = path.join(testDir, "runtimes/python"); @@ -271,7 +270,7 @@ Meta.test( }, ); -/* Meta.test( +Meta.test( { name: "Python: upload artifacts with deps", port: true, @@ -321,7 +320,7 @@ Meta.test( .on(engine); }); }, -); */ +); Meta.test( { @@ -410,10 +409,10 @@ Meta.test( a b } - # identityMod(input: { a: "hello", b: [1, 2, "three"] }) { - # a - # b - # } + identityMod(input: { a: "hello", b: [1, 2, "three"] }) { + a + b + } } ` .expectData({ @@ -425,10 +424,10 @@ Meta.test( a: "hello", b: [1, 2, "three"], }, - /* identityMod: { + identityMod: { a: "hello", b: [1, 2, "three"], - }, */ + }, }) .on(currentEngine); }; diff --git a/typegate/tests/runtimes/wasm/rust.wasm b/typegate/tests/runtimes/wasm/rust.wasm deleted file mode 100644 index 5a954791b554d051995039efb9a1b296d73970eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2227814 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%0ABG$;H#RpVUyl~vC5`AWLL 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
_77HFi=etT3|nT84zyK?Wys=SKZ}N()Ym#S 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�xOh-b$lcrKgYr?OIeXQlcVYeIM6Ec9_GaH1O))k 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

~@Vpjo?2dS-=ybfT&TPvH3OKScWy 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≪zDO3Tr(~U74=FEI>_mO4heLm6~9j5@}Vg=6y_V}B^d zq*pH=Uq*ju>|0zow!8#fT;Lu1W@Ev&Fs!9kMGl^JA2~>)i|zo5q|eSm{Os%{G+w7H zu<<7{!1J4atAZhnU$y<3ZJ~-Sb@o8wUZWkZtuJtNn*V`z@3V6580h-+oF zgQ)@yvoRVMBj&3x?l-Ow=sg0n*H~?b!2(Sw#6Xot>#Z}(X%!yZUg(6z$&TM#45975 zBS-dK+qmk`;}0~BUVG(%MuP@-6u`rG+1JZHbfAEPEA1t}L$d+V&!*zorIb{bj-6RQ zS+SaKE0|wyFE5r;mR43#=`kZiaw5?WwN9fY_EEUP<(3hip7&90!#4knGu6kY{JF zMB*&?i&wOJhpb2pilMa_QryCd=Q&P@QAE)6o9G5m#LlDiUFpoDq$K@%839t|47^r7 ztXArEE401PMq;8q28&cl;cxJVNs$h@ZUkElJAL`&gP zH-Yen*A7<~{eaT7TCJF^nrl{qz;+`_*O(^7h|x;i7$r#z6`WI4)!{#~(Rz6_eXwjd zsG67n6D9VIp$`6N$0=sY5kmgLZDS;ZFnqshx2iPc4}y9aVtfU>3_)gvdo%jlGY!!T zQG-bh<>etpj#tgEv^)D3+QIrl2kqrvEIeGy-7+cWchImN;vbkRH9|j_Hv$Y*j3{2e z!1$i^$4o3d-9a@*P_h!s2?3HAvt)l!j=JR7t$~G%R(oYtOzLH`D)U3OuwmzLxO~O( zCB$(PiqG15J8WQm<=o266tlrg72MuyYA_~_LnMm%N<8ha-#j6|oVSeMOhFmzw ztIb}~I_x^QeA#;E{CyYhy7+=!58Jy-cABC{BRcgY|17sJ=aLzPSvl4ASH(2WLb>oz z=v>#TxIwF0MMa>p$7InvQV%H-lY*I>qa5#!RXG3W=C}Z$BaKVI+#D5w;c2n)>BtKL zXkWV#?aOP5^bU=<>D+7_G>#-~S(Wloc9Eu88PvZJ!|bdap3cs4me0;|miM&9vZ+RC zoShZjoRP~m1gUydb5cH~5s<%Tw`v$`k; zDSFR1d%y_0Y4}OO9v-Sgiz3nD%BgOg95?WqfmQb^Ev)j}SaHknpieZ7^F^{;xQm9K z7o=O|qv$i^B|cH7;+bQOD@={+OO0E|Dm9Qu%&_TOj^Fe=E2v_f0*Oh4o-S;S zgUQpjh;^p^xg%wQqDA6tIYg`5RNC#e)iA*5Bx#zO&8B5HgSy)^ov>BK*r|tO+CB}O z1MS_rw_y9!Q+?ttsghYKmt{a^=XhOGPft``#t;tW(RJ#kX<_0}bx}J#>|PLoC-D3B z?K2J@JlI>$H>vNea=&TYrs?@u?G3$p9zgQ%%iu9l5a5pmL4m zs8l^nYpt3W_*iLgq3cel`O;&rTt(uFUb=#Q&Dj@lrLdX^G|PzQY69K*C~~7+upMP~2eA#>w7zIR`&!Qw(iK_b>{b zy@87>#>tyRJHXGX5 za7YoaPf~gq6S9DGlsi~A(YjN68FOFw_2~#uygZ%A?{ZMjBUogF;V-p8!n-5dospj2 z%NV%xupwI)(enBFs9v~Bx%VNK&tzW6m02`P!*+!BwU4cfU8}wvWXkmh|3cA8<#HFB zSrjxbF(?)&V?vpDSx{E3xw*J}cE_5othc5kvmj~nO>+tBb+qQTxJHY~w(GdI>DB`) zs@p+?#qSh-4+WR>{k>r&Xi<1%Dd}5Axp0?O=e=Bx#UO}>Z7TKa>&s%*W`(+O+cz=S zvT5*S@#aYJ-9kIULVYc2dUdN}n-*=zW4BP|mQ3Hw08RA1uH1wt zw%J+9HanZihW@S>lKZzSYffl2oArv@44i5u!a#)-5FG<=I}XtX+mXYlk9$Hsx2W23L`ln% zqWj>}N;EJ_ofF=kL$k=O8s`t}710T~)eDmO^)M!}CR>w7Jt-LrwBKS6BUx0Rojr&n zUOc&x>xAMk7fPj=@1V}sT+6FCO{?h#QLRNQ0zDjick>A!(Wr-} zW8?e?PN0}(&Bb_qaHG+uWHQd?reOdF#v2o>#!j`_^ynB--7{&WD6Ym?E%uIAE&IjA zm8PE{mkiNLr1!1RmL)4~#;UyPBF^$G`O8?pT0A2Un8^9`WigIUlzCGDSRNbkI0N`KM%UTS|HzIcDb zs@ilezJ-0pTCL(@R3-K|;z(lLfD<0Pu1XE$=n>t^txq91RN!@d(&(Do2CU0eJqr&NbU+#&hm%sB>PT}J$g<0_}EPFa39cKZd zyJQJ3<6WNRCD`e`S!BY|-SNfz>Al(HGVS!6{l^-@=5Gl9@8=#}nG z`p~c2Va2VQ^``5zFz4-(sbP_N4!%X)y}un+n{+U^;s=h^w5#ch^Q!qL-zpcAvTKGO zN04p2ybk5bea*OGh3DB>c$OQ!adqu)U&U%Qju?ayZLPqeh86ot_=Q&0#=)pcXa_E? zd01Wzvr$1Aa{n1;R<7>0x)?APy6BCwlWXDvSj{u5m8KtBq2qcErY=Mf!O~5l?)eyQ zm8l)FD#BVtL#~6t^2sXhwvkDMYSpRvt-93=LznKt<8%@k;m9zG8{)BKVF!cOLTMnJ zL`OFLHc+PMb{hDV1md)C^RH$)b<6U+z{X|qUOj|(USdr|lHN7O4w8z~dN{@$Vx`QD zDo)rZl{DQe?=0hlJ(lss@%cejsC(BONn+t3zEgvx5X;8#WJ+M6E!{*ql}Bz=s!-YQg9p z0rHNfJlIX+fYf#0%#h;f%2jeuff7xoMx;1I-ZcZqtD9a0>nm7hp(`UyHL#Liia{UC zL+Lvat=AV;&G}ZVKK8s!%)4l+oc9hL9n?CS=N=u+>bB@zI=Z0~UtSyWnuJwr>|Xbp zSpLL+@y$H^h5;J-j~WNhuho6rVKZB(6g9NZeBLH|9Z)pKvcWYs=<;4frvZ`aOJ$YH z`S}yePOEJ?&W$%LVxx52J!nxXac{#|pv(Jcd=8wz>bP+!_SLAU;#zSij{H$Z@*QOd zw=-liT7xf#4BY$|mqYrlDf6um8)Rf=4F;iX9A>xbwqyD&G{Q*-0fzXJaK?a-TuT?? zEnyNQJn%EjQNVyD0K@G}S|K zS-PZ#<%Sz-=<9;o>3VDR%=&6MSx9YwIAAIctC7l$ePpJrW>3KBkj-?^W;$#$9k`he-Ao5>ro%VW3YcjPth5GJS_3Ps zftA+4N^4-HHL%heSZNKcv<6mM13RsOZFbFI&;mDdNpyL}qJL&(y))>raHZ?RI4rri zM#N(T>DQG+%Mrr>aUnqzhaR&uCeGFbm}f^V+cRC8&C(3wPU_vDP^#nub;+?!9|N0K zwO*?@K^^zk;$uniut2IdH)#_8HY{Yqi^bwzgOjF%UVv4Itr1%2eOh*_RmGGrbW9BBGCb*Z0c?kHz6gt`Y?={y zml*RKsz9$L#HQ)hV7bNd>?o>Z;aY@^G0DVfq#h0t znViDAOK1J251~FMOkR zqMwoJ#Wr@)WZ*J)1*<$QT)cOhbrZ)mW15hPHNs)m6)hWfp+r3mTMZx9Y?fC#qHTd- zoaL%UcGIaw0ZM8G>kk%dBlnaL#b2*nPn0cLB>s9Fmuwv9s5CHDk0fkEUTk-*WE2SdH46K&(5>nqelqWa z_@jU~n^+`^>Ik6jp;J^bi)`Zc%bozbtC}@2r%2XH<1hjk0SSF4YFW60TXQh@?`PXH zV0DwOM?y=O*`eTMHm3iF`Zyz8Gpj)mI+bcuq)ohw$fw}t4uD){7+^54Z_iO0hrq~z zcN?pgU$4RN1QG`ZZ0RsEDIcGzi96YJC(YI{ENniAt64a^DJ)>fK?;^_ar*`)Z-mP$ z_6NltXKH;@G7mjpj=edRNQqD4);+(Cy}Sb=C`6E4)0R2WJ)j<1o?ofMf<*;pKnEO9 zC((0rXm5%SV1|rrk~8UDRoVQa3^0yM`at#&aj=RQch`gJK30yFk1gVMD#{Pcxl}yc zssw)6bn8_VO(rHHr~@|5g=M)mE^CbqQzQ|r(bmigmWZfdNYO<_p%wbf_6Yal_K;p& z6hGb?X;qpq?_7a}8(0s(^f|LN!g1^w6Xof_D`d^9f;BT_HEdBM(!D*ntcsZ`hco#! zT5jAJwpWDZTDRrm-Vcm;WA1G=$)0tZp(pv0_OD;N*!EnA8MosEt;lKC0@s0!PGNfv zn+tuL5AosNp#>2mHo18~T&jD8&dPCIiljy)axL2as-i2#!2)!~f)dwpMOjA>LrS2m z-s4CJVS)4{FP_5k9XOL|AiN zT))6lO5~%$$~8_YSllGWcv>FBAeH;Z7j#%5v7L8SCtQ`23mD*D#d9TL=Ts(3u8q)2OvgV?`!_gjS97W@^p|xQ|7~J0LIl3`CG_F_j-E?L2xxAuC!o2x zbU+FTYl|x|h0EJP;zG7ORwk~4>=PG4Xr&8hg|e4q;=Q5l7Q!SRRm*M0iY}A)&81Vu zyJ(Z6?}j;DoG;^+Ihmi(8f)OAo^ejf#O|IH6b2o5OJ>+jwBAdi!#TInRrEM{vX{=1 zU8*dhy8xnDAnNYI1eW7jcC~3XG0mw}Fbs}&Vftl@h1o2+_rQfF*#4a*2T$#JcC*q9 zFqv!xauKN8W5+M%bT8reW^`5=oJ*C@6!sI6HVEC3>RGLR^{@w2L&sgO1Wv`XO^l$A z$R`i80VJndGi?%rmD2z(ZZ`%$faqmb$HfbXcvsS*oy#U>b6#X3ZTh(S(nqC7@*rYz zNtB0>IHV^YQy93zG-MU8TZHVeUUzF4!DodA6E0zc{W6oLD`0v z2Js-8Tdl&5LS5WvPwi+9y`kS*hw>K{7nwxnyP7Z{7PuZ#VVt~2ZNS@S7P`Ks8(=Cv zDDQ_Quc{o-0$qdwu`peD5YJ=;VzMjC=-|r^nQdh(9(!1B@&#&K39G)5yJq#2XQz7vg-KM|+T_->hNeCGKbp zkCeE*(cQk2gFdA9(CtX<gZZW<~>LG#75s#UfvRdbrW0?!v8dp zpPi*nLH>Q|I%d(uMN~e$OBLhhamRbsou)H6-kn|A9S<|=kb zU4V$`uri=*6y<6Rnbj1(V6;@YDGQ~Tdc!OwAHlzhEQV*9$@u76w^SpaYuxy|vhlCe zn-VBq^2MqOR=V*RSj`RsG>)i=33X3yO<*%CqcUb@7})19Ybwp2=GQlLnl8GbsvF^j z&}x9Ls8?Tvsy3oZdJ+R3K%u(~Y-c28nTzcL^%(cbJMcR+QCloY%ZkAUm9fOWG*we- z!Q_iPI6oPiPf?o>%F%RCoNs_&pdp#`Ozhia2FYD5ofngBkX1rdE4D5Lyt((!J_3p9d&W|3ZyvsIy$XzM1 zdW-!}4^MyLm;mlN;-TpPe(~>0KkeAL5jbU|a1C0B0Yh)ESuqIt2cOSlz z`+T%vIMCR>$)unXpOtdR~l-1YT?&pBx@Z-bq7^TIP zwiRK!*Q?=BpBds17sl#6>i1OIL~ni}4NphT%@P0HT;Wv9nQJ2yh*S=a;=8Av#mdCy zZ9>MNd!S?``Kul3Xx$~Q7I6dM+&wICM<;G(dF(|~Tprjv+09`?{{ z-@VI%xGLD!q(G$HFGj-*q4jD7r)sMq&il7qr-GB5JznC6T{2?DoH-delcusah|Sc- z?R{8BV}O|tS_3@ELu>ZEqGc}``^kjRKRA&g@Rm;;1kMAZy{W-QBNmx_H=eX7n#J8J zd!nX+9|`Whw%OMV?8L`5yR%iS8QHGclM|GIvT+fE^dymHXZs#V5~UKOIv%>s&UO>B zhqhnL2=@2P@^)aOm8Vq;ak0d~`IX2Gaixr&JL^gPc;bnqr#J56^2x)Vv+-frOjF?X zq*k}F>7D4KDRYCs#j?L$vnx)$MvpG^`0N{F_lARgy=+?<4`ee_7ujy&zBro88kU@K zM=7Men;!2x){%aBt2h&4f6T;HxxSJ0x&uogGFZH|8e%EECu~X*yYS7U3#XKSp&yRH}%4M ztW3R9t5tCfvDU2Oz^mQ21SRCn&55yRMjnb#N?t~@0hvm7PV?k!s%(Wm-FXe0f!}I6 zkvM9aj_@AcEW7J*`dqPpbON9lYhcj_+3ODt5PBUp1x3Zfa#~ zfnxo-HyOSDWK3spG9~SuO83=P)RkCy*!jZimUwE~bKGVvQne8xyA$cfmk~0t=$}TW zV-Y8Lo}$r>NWBg_;MGb6mvqszHit$80Sw&$%as*1WmXI*KE>kVR;rHU!;$_5yy9PC*e`#}u^+#fB+^%+co`_25Yt(=c$;)DcDB+bv3J@kN&Qnxi61tD>Jf^L zW^OLiwe?PGdf2lgu$*K19vLFYRI`7GcV|ZycFkzR+a9g5F&nuur(5Phu^dHky4TDq znm5(rTXW*ZoHPfukBpj#n>B}}0l;CwjH`Bzf_97!i$x+@{o1WqglN6hqm0q}Nya_5>hr z@GOrnii?g!9B-kMwYWEYh>y3(26m`KQDBouZOA#5lu_e-7w)=P96%FgM;hPYM%Ju=~@1@zqsfILXFJjfso1EeB=+s${_{MHlrCO~j;? z>b{v8MnOHm#J7q!<-E|r1e@PXMN6TJNA-UPBT7_ei@hWV2%Oi1n`h;_tH?Z%3UQM%N)p*viR0?@b-HX zS65&S%yFqWL~bk3|I zprKm?IxXX_T-;-!J_)x3L-f(KKO^42j!g#T*%TQ=k2of){_;X_9LMnJ!t{X?s7=OY zeg_@wzO}Wm-Ffr^E_%myQ4fbv$2hWZ3@?Q5hf!YC(W{q_FRz?hPMLDyx`ul@bqWhueBV% zj>e={nk+E`ca^$5HRVQT%W1EHbZKE=fM~Zxw0%00zPbSWgKP3-i`113aZvoc>&Uqt z##q-DME>FlWIT61@8b;lqEDXNVX&}L^G!4|YA@sY0C@9HtcSegCTbIj?s8CC z2o{XEmhe_H6p!9+bVY)h%orO*X{6k%{gaZQ0% zby9qZfYi-}j9H(-vBuQ}JduqyzAsmpay?yd5Ik#~gQ`Wj~n+tSS!eASGakz==T{olr|AskgxDys;d4Z(4El$dA-5j8BD!vJg3 z@yO004DpD&iy#TxNN|l#X=UZcX#H68WV?;C);BEpW0w_?(bP~*EotD*if#6cL$}RO zY)hbajBagQ&e!)Prqc}U17QrG>PTcei1Je0WG6K$;;D4>uWPUbvFZm4oikTpHW4kt zcvOxRD2ilwdfrD{ws0~OYbWh9n0SQklcDI+#CYgn@(Qh-pJNFoHXPN!>tu}vS%QiK zi~F5;QBES0cO!VBo18VS4PH;cIhkZU@5&s(UHl%CtiqC_x8$!j!ZzIz#x9!$i&ha1 zaW?T*8RmO2EpB*5O5a4gR5H)aVaAzFp@cD6EaZg3Vz02ig`r0L=8-n?dwGbFr)0zl zty2(}tg^wY7IV5MDRL$~Y@{_q&&I&kv%)&sP%<4D^^rD1>3O+_|SYE`iJ6E;@UWwfv1-UI5%=CluK)BS`)^k;pmM?CIc!r7fl)p zWN*)NHL@Lzo5g|cG*4^>661+ZPc5jFR12b7=y*XC!6FFmzBw2`bGpl>aG*kZZIeXS zwUP;Ak{jx}po(*nK|@u}QK)6kiB-RqRU<5KygR?TY@J-It=rK_@5a;P&y6Ueykvs0 zQl3>4#gc;DgXmdUh;3pe%SHnh8sz5MfaL}nXqB<#5HD55%T#@H-1PFqUOd@^RS(SA zu-MRDTo`lt0SkMg+F|ermxl*~=iaS{!y3&* zv9yJuC0=KB92kMd8yUFE6Pw)viRa8zUX!!jBBVr!T(n;^&J$%?RC?-*ViP{#b>(Uk zP32(%Dez&A2v0HK$q~$VB?(3-#k-Bz9%FNU`;y@}%`(@88Lh49G>JTZ8v*e7}XOZeBf|5MaQIN@)x9!rXKY(J}%sF-Nz}<)u9Xhes-%1-Cq>-keHI%J+E_M56j6ldk!qOh zNYa2n*1MUDV7ekKdI1>|CD-zTpji>i??azF%ceON*CXFHo3@STa&V0gS0!khgU3Tf zOH%x#0WOtPaL&F`$MXP@LpFx!NrP-wb(ct}9jfAN0Bw}wz=mHp>p=_8V>Bx@`G&(F z&-7$mcki`uQ^uzAU}gn&{yl2AV0k{k+LbV!msR${UA!?ulbyn$neM5D&U}My*ELom zMAdQ4$g0#sv)M9hc;E#EKEs4cc41!;-z!Yu>FnT%=dl_z#8~y)oizmK!(uEB!bG@; zPOUV8>$OliAcN?+GBS9NRh6~W$%3SOUoj>qffLc-jfcxOUv&?gK%sh-O)w|I$W1#yX=H4Z#K@S~s^ zL^aQC;@*usElcD9aS`^lB?oP0C&3qO6wHBx2B!{NaF!XGNZ7FAr8}7B8MON7_J&@d z>uo(o?sTk54Hhk7&k|2$;aL-8aJthOHcpF=iVtJy?OBF#?geYN91rJAG9qW~>vk7D zUQ0rI2h+c{<%J$9Ufkp453noD!a*tZl8Jvp0w3)(Lb)c=rSLFfDA}cpk3QE4rfmsoFKj+TRi3ZKj%E zs{}BPRP!AdgYis9lrxx|*3agd2A zQ&4GQeJ$`>0Uh*+X#+Z?B2N;&Zesbk&q zL!5%fky$*i?FAT7Cy9tMkjjU8%df#Q9lZ@^*Xr~v80SOI;#@Q-Qh8!GVG<7s5JuHj z4d&Flc`~7}IU6i1bYWN=?@~vtrrqLf7#?bzC32y_afD^(0guTj2wE?42LJ>l3%PM z>{BDRPRC@;+xH;>(pB~xPpcN`0~ zLY#GQFb7gBIgRu}1BOtz`9!x+A`6BAF*sDd(2z~LcuG6qiZd+)b%zazba#9|_(^#e zN1^L2+re{sCZ1hD9DB$3^1+3y0@6%Z_kELk(&AVq*L2xo#r9N8+N7mLE?S8e@kFs~ zVmXvnukpeuZd{3Hfip~f4T+*|QS!FXVO}>ll65g@rOTwqHaEf^3oeWX^)T?z z9mZ2yqV{Ems=S>qCLnysP|lt*_vS93`nhrW*b_zH!R0(evua}c?9-9SBmqXMUgB*U zZUn`U)|KNz^ij#o%Jllig|-|MdZ8Ja5pLGn^?KO!agKR(S%DYeeI6`cL@nRM6WoJk z)wt%?xZ|D-C}BOgWv)DGe4UFtgT+8zBMZ71Z_BRjerB4h#JsMx6%j>x(O? z;#WzB%9bmk9iCijt}l3Js;j5UIaJm-a^NT~cOKX$?)lL2#()C}bfc)isRUZ_PwxZ~)(|tbTC?KVUKJIziq^2vc{Z4q1U+m+wMAN!!5877jYlEHGrV}!%*H0LYXugDAU5_9vP?r|I%tzuXlbiftHCgC zgf1CJKLT0|6%=vBvbnGbQwK1J&`nD_v#3oeH9Jf9F`1br6G^UmSS+)vEx!rtP*uDZ zBL_CJFys>z=P|Z2VFd*yB?4H84k?d|>cn{-*m!BGLfrzEq;U2MhC^j`rz25Vx+3qf z`C^%^S_Q`oExhT9FSs=g8kD`9f)0>;K@=1q49uzJTw&ijs< zqs8Twc(lG4%P#rtl0FD+h(jNo}D88ydL4jf|~g z$`bfh2d}-?U^oheg^7l|T!2jG@do0)+Frp>1xL!zxE@<+pV6GR=Yxo7!y2YBY?PiH z`->B#H{eH4Ggb54JAo>`@O7=YnjKQ^%dTwq^;vsohVFQ@EcHr)rik zEG6^uqLp)`iFEQYJ1d4z{d-ZkroN1A>iy)1UQ-~DO4uLw@Sut5)*?*X=mi-;Nj38E zK6hqsSy+C=FkyD~;)Tu?a#NW%m!&4@K28J)?iD(ufk!^@76h(;RV_SOOAGXZg6Z!n ztN_x{SpF%SU1@c(hHBVcXyB$|2b&Yr9LK-I&U$+}M#&t07?*-XPA211k_4sep;uPA$ zYFJoZp-~3a9V}3*wdZ;EqC_C6scljY1i^F>de0`UWs8ib@u#@pAatdz78DY!&il6I+8Db!RzPR* z6ucwG=lmQI8k`mvV5sUJhn2dx;AuAKxFa6U*4r)Xc;il5$JVWgiVQGKk*Kl-LZbV4 z2_wR5Pyv?ey@)pEQuI+1ni{#eIW%{3b26a0xqSMok{^c?G4GI9vl{e*OMH22&^av; z@iEGMch%m`eJ(a$fbwBv)+aM)O~JZt_aDwLOP)V4roXx>nnk0n^<}_E1o#E zOeBqtd*vN^nj>>?Zd{ZdS;7W|W#W>7gVVi^Rlx~cteeFLB55rSc7JQ)%qGd3orMas zvm61~B9=$d5}^Y|s4L4@tHyZpAQqsAFMYa7S}mrnV_JElCJvk64lcCeEn72e1@TcB zZKQG8J#2@|0jx;Sc=lXVt~}J`Y15SEGA(9jGifod+BiN0lY)4>v=W9UM&5EUg>zs? zhMQC|x(0rc0-gtZE_IkUz=KAnL$3t(a10#|(r)czR<@%A=44i7yv|x0>LlH?D zQjhv78pYJ*bV!y3K6B)WB}HNpSL<-UimD$DEt{rQZD9clgKbp5KCYqh9NY@RzFTb5 zt*e|(in-UwN8^t2%Tj2_X*D#XmFHJTDGQsi4qmuTs(~y^>EWAI7d0Z8I*B(Jai%$b zbTK`!!*(-n095d%l7pk-w4++ic3jn8KIOKZ`BT-U6H9J&Y3xxu6;`p_HMPUI{p>Kx zDOX$(yQM#=nwW2-Eq+lmQ$<-v@8Z$*n2Lw(&0dz2IbZQaM9LVH+;pa8fFApa`?^*e z)20;VmY>`ZBojmXvd?-@XOc3im@y_NEGlMj{f2$w5q(O@KEs1$8OyDnYA&5QcEfQr z(XC}%{wSy7(fEzdjS33^Snj2z-(#@!%&CV3>bbe}00}(TtD3>oqYRKsMstn{I|XhP zolB+i|JZvI9y^XBZTI{X;u~RL-D@A$zBF`+E78(?#MqW$$sXV{28~+DHk;jaFO)bJ z{_ppRT&l9_RMn|-dSR0mY>~~bs@yX&GUAOlgnh7N`o)W+9$9F|%JLNht{L&cC)sR^ zx*nI^n~S&a?q{G;O>yPeq(QQYPL;6nk>{TCv+w-uz7smXkDQ-l=jX)vIdy){ zoS$>&XRLI6BYd}J->uqr>-OEseYbYst=@O*_uU43VkE*nZxoinnH&Sd0}kyS$^l}- z*dz7k|1?*Z{H4yHm%?BocIwS6ROSG<4O9-d=Qrj~5hNyCl5@)3?I`@c&TDnl0m!~j zwHB&xH@c~$NZ#fB-M!o>Bma#}9KYRizKSKkPr!nM+ZUfZSwGs44Bk!xmhRAThGF8c zr3&Hty1BYMKUMU~FZjpV#VwAwH}XL4gupynCiaZv94=Fzbm-*7yd(Gt`_js)g+1#V zMC==KCa4B{2Qu3I#ITMQ{YO*Q^e{9N5_NCVH77hq5frn zuMFZ8ZXPCyjvilgfDbvRSBZdbdY% zu5&`ip0MWUswyIP#)NOjnnC!lj?x^Vh?^=OPtjK ze&upsl8VSS^mZmPErW)1Fg~*g;b zD#Wb8h0;D8aME|el$ggpBZME1%nZ>Rma<5W6xbn7a){;|uxT8mHZs8ZdS_u-OSF#b zPqhtw?f%(GsyUDINZ^6+O8kLQNK`a8J&p5N(?nVOIOj!w!7yWf@HhXC!AFY_O^A?a zyr!1DrU&{=1D2vx*a^uohf9g#nwZ-hQ$*E7FzM~sox~E-%{l+b)SPSblgJ05;1?~y zSZN6-h#YdP8y;#@okhXzAoJ`cnKiUvjL&NDCy4K9;R&di8vaReLf`( zYX$LDnPVNq`Kf&nXBSIAM7LAoLnQ{~td>w?1`{w+)d{;3(p`d#=Y5bkLAC zZDF2v-4jd`CXYD4X#&|!#B2?nCQOv$wVaV8fg&0VfZ3DJfX*}PX~>4MtIPIqO0A2F zt1E@oZ$e@G0AE@JEmSqkm3pE(sdtNxtl;G3ZfRt&+EozQsoi7~z$~h)st}T4_IqV{ zZQFSIwvLmS9J~C9`ss60s(5-)>!58M57WXV^sY*e5YMQJ%Eqt#yh-uqXfLMjvmG^& z-*bz7cS3Q{ra5u{FpT9utR+TZM+2T(!>}xg85;ANUdaI~E+y|*(ZcLg2zcCizG^v- zL=Ya*G-!ha;vM*R#1YnuAfTmI0%e`TJmw!;7*co7$2FueF&^MH*l1FD@8zzL`tYd?N>Sf@8!xY z(Ae$8Sga8L2NP@2X1)hAfX}WUh!uv({d!^Gch_HDq)1y1o46w8!T=R|KdmD4bqk-; zOtd_~m6-Wu1gA2@d&G!ndE&HfQJhqG!3j19D}Z68m$M9vIB^P)owd+8yYo}T5ov1i z`gk&G+&JBxzrMVF<42^@i_^MD@{q%_mc}Xg!p`Wd-}kV)CIR#5iDMWn!m<0F9L7~b zv@dsS1i2?Nsh0~2E82l63NWz);LonlA2bktEeKHC>PIq#s1!Ig1#n^yabR^VrT}pN>y)uw$OD}d24a+aN8+C3ex;+ab z5Yv8<5-Sq6iG*|+Nw`!^cMH0sjFbRwxo%`WsvgW?os2xP@(u?ymY%tU>k#M-$f$;6 z5_#ZC&!yT{FPB}pdN*{7JCXAe7rBA0rwZdHLwaWHeKfdr{aKX7WdZo5hJuR2frM9_ zURoBfD|)4r1`z|vc$9Hs0RL$@E*vR+FE#b@o7+TA9B2;5E%uXA+6}@PP;RI zG=gZP(UmdxMp$f%*n_Z1PG(oKFSUGbhjt-CZlv-cMw!ELCuZn{4IVmI0odd~zB(&! zZzR%jH+N1==8wJ!cKP6(k)HDbQ=L!w(rFb`^&TcX6^0>sPW;;b0>PAT&~W&Ab*SqBBiU)`jt~qAj0j#?#3_j(APqFsL1W|4%45C-IR?zv z2M9~#kFbj<0e}H!H+ja~_OqK8(OyCX?3Wd4V;*Vn@o|fx<&;JtOtJ)mca-~`#h@B! z2H5;%jRAAxzVJyWWQOO>eQ+zUxe(_mCNL0EWG$_$3WJB5gXIHR1ajAG_V2#Q@ghVH zHj0u2EtsH?j7RTONISeHk7EKmap+Xs3`RS3x#fq=+A(Db(ybdC{sCk9&qx@d4KGP} zh2;z6l~Ite1NEXrMNi<(A!X>xo^ zE-pci2 zBdj^(V{+69s{E7)fK%Ls2;`*7$~@(@+KaBe2n`kKLqh;7 z(ujzRXgL~PE%yWSaKWcCdoh@Gsw__H>{ljD`XC|tL<01Q)aT^wDBf;f5;=MXko?8v z?Zpl01#9AOoNVQr#Z=~2i(7o@KJ%RqPz2M-&Fc>r&-7udnEd`rGK6m4-xPwkKAj-M z{0t}+cZUD#t5;<6xVYJ$!aNtq2v9>v1_{4zfryfjGp*tEYbDcV_q4wP3~#LoN_eSa zJyW0C4sumlBE>+U?~D(q7LsTkHaB2u0Y-6R+V5K})Hj94(WBR>hXe4;ot0kQyOoE+ z#1V$E1lu(!xe`!msZd1h9AUFUYhA6$^=ksfgt-8Xt!8ye_EnC|grh(|T9Ci%s&K`8 zS#V?LI1WgK<;9X+xEJ&DY<27Eak@gfP#6?_>|gLzi?PXeWxfuBUjL_g)t-a0Cr8?l z-x4Eq{rXgt8^#TcQq#m>(4rPay=Heh&n-}Rq|q)H3e)cww`mEwoj(9wUf*6d{9MZ~ z>Mx|qJOad1r=YE}z^mDm|DSp7-@Jc5OqE$)G!@BtK|RH3B|z)0N`HNoqiEs19VJc( z!v+*aZB9IcxK_Ga-Prj>%d}Y*d+Q2eVyW;aG}ztYLS@l7b?pIkjaJAMer#H1x|;tLn-9O~+`nwn~&R2q$vZ6~=qXK{@&6(tyZ;rfu*W zSKk`!0U_fSg2V<rp*=l&`y(@aG%Is%?G3Pd>C=g0wNbp7^H-?Bn%y7gDUcxAh#Q4YU*%eMlM4CF(RaDINd3#^6t@Yo}|KYd)bD4QR#c$64 z=YC>aP0%6%l51$f`-sY!a7yuo%tuJ7$?GUkxzZ4t+#!xRZ7t?`mY!_~e|;b`sxqZn z(9JzusT7lzJ;F3Fw8mx%a)~SlO@Jkpo80)NrM+XzQlzm1pxFG;)tx3YoFqEyxh+|@ zvPo;?OX&l{_Uj-<+6_wyI%X5)Q6F>xDFHq!1%sUB5Qh20bdEYHJp|csMox_Do_)Xs ze+{ltE;3@`N~OH*iq(+BpBhz^co9nH6SD0cCMha&dp9QV5=FJRKu@)#b%3USm^i*X7UQ0)*4RN$t~B#LW1zScgZ z_s(vShC8t$KO@mKA-0~3loJ$#2ETS$Os`}2&JXWd)Rg$bVR~y4U!fti-FIQ~t!ejt z13l5QaMX;*j*n=?H{F_AygItQ*fmhwChoWgW`+E^TK!O4D^B6?ZO_DJh*6vr??5es z)&o~Ug!$l&rD1f2<%o7pPws95lT2WKSq!uXte+shyRJ?b;f`!Y)L5Ojflrb#obgyQ ztg5=CDBIERCwpE&c5k6;-tQW}dUfpDwQT!#Mt#1S>#E%y{Wxaqe5en-mKa!pX^oc0 ze3kCV9MjV2+1+g-r21f?!l1&nMM9YU3&i(8jI($RX=zCqCYkTxRjsNrkGOC2kC#@7 zK0~-Qt{Yo98^i{ZXJs8Gur)TVk6G_qp)XvjhSIxehy{FD4{N=9WMf}e62dPT5>SS5 zE(L7K^y8T4vULjoonq`&v#hVa62f>c4?#uU{Jy#P{^EDS>DvvDnownlb_(zV_hrkt z+s5#M!1EWzSU<&M$*Hjsb{w1PkVS@`&0UR39_>b=Qa zBBYnkMC+D_cgzS)P5Ztgo8a4L|If1@9Zh6r(M6;Jr7Fp8Bp=H>CLTnDEdvu0ASW?j z!&l~~)Z%FA&dG`DkDxtw+B|O5^1%5paFb|2oJKMOa)4Jsf_jp|p#WS^JUfFo2Iey* zxJENemJ@dtyN?f=Pq+#UbXPaZYfI(92SOet(3&8R`{x}9c13f{_BFRBld?ywc(Tn_ z=j%3Ud(tYZ$o^W^1u88Egc$dMrrY_aQ4f-X|fG-&;oqb0hd)|*78 zheJlAH_0Wn~JElL~GQvQ8&_u=Pw?#%yE#TZ)T5-fV6SaO^ z9FelDeMm6CDJ+??%85oLRv>Q+Vp|Dq*O3D9aA~C879Yxn$YW*4Hh&F9Pi?M2zDwC{ zW~Nl!w4qAYmZrc) z;2PS86)k_R46|a4@7keLh=lygWQ-dWE$3BGkWDxPf(Cs8G;re!r)X@4v_L5)hs?Ik znAJ5|-RA9Y=UUy6_PmOiW)x6A?BH{QaXX+DdgKJ}jR)=8#&jJ}KxcnD;2Y-%L5?pd znY(6&xN0L#4sHlOlO}nMkxUNdz(K8WjhqL4Xl#TBedBJB^=1`Gdz}avk+`F*7GeY? ztjsyDQx9m9NUR?0=1PGkN&^05`DOVh@9!5bB@o=={O;bK&FYnX<^pO5@qI5XFNxq&9k%26PgS0auNVx@udFEGDg)>geXGL#BARtC8$#vF}B_xZ%_n3(N1D4&e+BtdM*9mbW*N`M= zFk;7fgT`$9Y>%HE213A?C`>X4f&6JofOaC_57~3VlKF8{#lW~wc?oWLLfj!Mqz}dw z_&1SKz0M*38cx+g+5}N3ZCXHth{qsH1;RJdCUp5)kykYjR0jRjDg(Q1nOioyYE9^a zKxlIa;KHhg0?9Et&r4kA+(w@b2`_J0_9?M?Nt>H#H|PFWYTOofnB!L2xxV^|y`KRH zQp&oh&+z_5EHN*Lfd015JnNW=8b(27o!IgEP~I%1nrDAxx<1s*K>M43G(q z%si-O$MS$86;x&H)v|a(k6Bx^Jj{2?EN(LpqU@+9{dr&dVRXu+i8FQwY|KRsbQG7yW$u8QG+!szz9csQ{GB5orj;u+4EUN>=2s*#q^e`#j!BHf~v&_o0MhD{T%Qp z>zT#AFaqwC=3r|@UKULTffOYAdBur+khMbCA%s<44aYhaLx&fvvr$0)hX0rV@(gfT z*kY)>qm4qiD(q-Lf)yFKEZj`cp=7c7&x1&H1nZ2u4>7nzN0W4(1?L5alm(0 z-#FkCyYytAuUAUStOB%M0VXF17BYn+loB6$PE;)7`X!Q9c&HquWvxoOAP&0&a865F zvNhBmJRn>UlE%lKlF&FM^^dnTEHv~WQ^RaIU-t4`clg2V3UX&B`zI05X@HC#*%ju_ z-YJ8+;>_q3oT#u~nfiJfL4b7BNCpRN~7ctO~QE`+ReEqXLCLuuWmU`TY@d zaLU;lr#nhw4A}>Kr6cwDJ{1^8JDc0G)}nwKLNsrN6aopr0dtr|VSbppgIL+yEeX?7 zn%TUH0+M>>1g&RrE`s7PgMuuIL9KH#xVI++07N8H1JoWV)J52M*es8kV-}A&)i*g| z`Yrq^*mDlCBG?{3T5j1a%<+o*MGiR^NfGdUbq0f-ye#f%c#ydOtuTPYt{kD9+cCEyCQJno;-wOu2l0Gd2)W4$G3uPU+}$g$u1j#V zV2K+*k{u0)auHxEn9U;CS2crMnX(iBJBsUwBv~Z=75i9!x#}$ivj<8?J82^ZP~&%4 zCMB2EeK1W`W&*1>7@-#tdufu^ zcN?+Td6#y*4Ysb)lO}vT}j6EsfSt zBkE9YFyw;~BgQ2p8#rtc7Uj0Ls3k*aWGG@tOjOlb2v9MPDnK&KDcmuO&Ai)MlH3t2q(!cVDn{#Y>at^a7wx z1zM-#h-$Jj;TRYgVa@gO&@;$ciHEusVjuHAWD~G4lekUnUsG;{m1m)IH<}j3u(_+W zEsEI?%wrq0bwfrUaz&MLMYm56KD7t;ax>**oMV;ck;6%B5DO08Qy>dHM$y461l||L zwaR!UW~%KL@bPv_BIl;vZht3#{o(dTsE2d)JCgw^MF)X{xWq?60>Ts(qWs2DuMaZcv=jd`9SJz>IqGiZfBz2S5 znc~zqZg_Qc zuyxMpynn<6L|m{*ywSE%B3U67V$OL{U_yi%7RofDO z4=_1E5l2%yf)##st<$GTlM{IuLR5wmuL%nGW?|2q#hab8sW|A@H)cxqdXS}gWyviI z1XrET$=;=j8a8L22=)T#bBQD^0_DI&GIl23UIZUd-Mm?1S2Er$J(ZD?WX)ClBsz*w z|E#(oQIngOvcY}dce8S%yl=OEZK}yzhPuIQx9Xiq-jnV22k20~0|`kK=G7k+7m6=|kj@FwoqaA9#aA-_2$$1GC-UToq?G-1Q7Ev!tKDxs)Ln(7qaD z<+7ER8Dnk`z+4hB^zpB%e~P zIz*3nyioyK8AP>LN130+F?w=0W{VPSZiKqdE(wIWkJ*UEi|6jKxqYZ_`!X97OTq3w zwG_xu|KsGogAg*pP2}ZX*(4Y@wCgiHXhphBb;OJo0^h3G>YdH+`_7x9d{zNjwknS_ zhe<`U7eHV_sH6qf0TN(oUG|ukSFbncmp|canWG(S&Q%EbrfgoFU8v9Ri6F3!Z{FtNhc`uY{rcjk zzu%c3P=v__V!&^%E-(J4+5B*JP9~Ghe?YegSK#{wrbWzD0(ZoUM&>t(Yu_MBH>Y3A zKm8wGpOgE&``LGXcHaq|-$%~RvGa4{{G2*JXU@;L^Rqvw*sa-jtM=WxeYbMot=)I4 z_ucw^w*kJ}g1~J-;I<%eTM)P{2;3F~ZVLjp1%cawz->X`wjgv{5c(T65i&>LVvA;$ z_EI@2d0@hFVJdjDQGR77kFCSqC`^UMueO)Nag@P&fx!{KwekImsexjB5n zsZt=$^Q{?1wc=F+WrYxUig%hdj<;HI3qFSHd{t^+<4j*Vg*wOj(n~`p`|_J+(3f8_ z&iAF4=A<|W;ZbMu1lE9)R^O*JLKuSK>P@CjeuOj!k`M1k3WY*|O(OO(3#8!TYAxn- zfHRakESyHSb8%{8<#7+7e&_Xr!)%v;reK8=w27i6Ux9$v} zbmjYBa)uWq5$#Y>JKuF1?{7PghTCoGxrH@NeA+K+H9fllgky|n4rfb%r3E$*{D*}_ z<=&de(VZ%02S{JfIMPo}^v8XG=uRQCm`%)WBw}-%K87`Q>WXp9`g3mmhg$YXY?hEv zvnJ24@6`bgK*zFobX$xBnwcz%&CJOy><2Ic`&H_}+-I?wI|Dm6J31&~=k=i(dfq7E zxL>%LbAycWGZQbE(-Mo#+$sDyWKu9#vm!e){~YYDFCRNs%Y6jCKMyt(@$i1Mz)o_f z0)X=KGW9(iDcB%Iwf|~rLw@Y|O)gDjUm%Sv(TI5_z6f{JAJ`7B5JltJA2eWY+NW$? zWPNYb+~dSeL!sU31X^m8M1P7RAF3|Px}fcGihH5)lK@sb@G+E0Z2XSZ4hGk8!{>I8 z^@Q{dnsFabwuGQs%%?a9vK;qDi1Ab}YnZJF7ZRqr!GNu{j#@ZSOAo^ktp#gnRAa%g zPBt|;T*Nfd6`5qXhuv&?q)DQ22Wp3==5fg5Bvb|fAy#u>1?GkAR!j?W^}WrMP2m>& z0jZ(Xn`dDlzq3h>OD?{!3nmc05ne30L1d;jytTQ0izcyw$J$-2ay~)De$~kDgc7vwu zGYUt9V!`N9kf;@wl$tU}i;y0u((B@;=r~`x1+CT2Kxd)u23j#zFt9N>I~Yb+A&qMw z2!d%W14csPU;psoe_wLZmhqEy>?fE@-jP*JDkGObc_sr$GVd6YxG>8SN?-uTFPS}{ z3)3g0DlM}wDi%9i9*nO^lvVIelmr^ZPI>)nb0y}dr!ckOkUrw(_UeLQX=w3iB8iDe zQzr?lqlOd`Fm+A5H&Z6|ThnJa-Y>7{HbKF1E3@szx!;iERMO!11QWRJo%mp`mT}96 zpUQ2aNN{+=M;hj^8$}$9qdpA3n5)OPy*aD7Zv%a{-N?!H%z_Z16wP_m#*z+558@+nIQAR3X z%yz+KwABKM3qm~*+%(CAn<||AdLH@D$Dw@8AKvEN-;~95!_O2LZO&sU5kr;El+yj6 za(iimT5q!1{J!{bd3$3fhIf_e9;&%_7$2`8*o58&BV^OtybrPK3qNOP?p}M8zTAi% zN!2<)aj9FHH1Fi(&@!JZ3lmfHs=+*Ub=jVs^Fu|yUXdz>Arqrx1S{hWJ-;cgBb^u` zk%7$3IOb-I^1esMSSZ%_?TFH!Z*Ef3SFkW-Ce^Cg6gRBZ^7f{oS9B*9vuZ4_s6TS~ zLM`A-9%S+$o8($mB&9Y-#5v{5n#1UM?)$1jeqsft>eq}JB_;BEweeZrSFa-ZBbGnZ z17Chh<&RAM$km7H-?Czx3rYg3bnR_Ox6Nd!fB2gVZ4B2!CEYaUt=LRXrY4#Km}&kr zQ_W9yuBE{;+5FwjHb1Kbi`Z#p8JuuN!%4kdj07SZ!Q>rjOJmC9Cnr7Azm@u}SX9aDN$H{lh;iUj6+aui#=mzq8@~ z7rVS`75~KS@*;pYr|9?Q&iqgFL#D9BN<|EL?DG@q5ss&8c%CcKz@oD7lR8eoCz29C z*cpefC>2wCsnPyiXSCG0-BRjy`}OsAJVR-f>pZVfZrbF;Qw9Yp5o9|;7ONj^c-*P2 zs!f5YtEYf41y#+L1vuOQ>OttC0h~yS+!y5AP;1UyLFD>j;Ln5Rywq0_X%73DLIH4u zWkw(##3Mx2=x7?*>hhn}qE&Nztq7c+pS5xe2_o_WhD8bXCTXGl#5t)H1od1W?dCTk z2gLLB8F)C9`Nm!#6?&3;*{cg9J(aJc^9)%vLrL*_l5IEt$lqq~v-0on!hclhhx?Ij z2PQ3>&O@brNmJRVP))Tv=woE0`cXTfj05VE%1I?&K%2Vlm;6)@lAlWCn;h>UTOj}1 zq#(XdB&PbkkBq~-QW0gC5^@M3Pl~M8kM3zVlfU}!`AC`j>mbU?n_|#9&k~m~h9>a4k7tF!uzQ5&tNFpO%wb64xD&jPIk0zXKBT zq14|tn_qJAAr4MXSpQ_I;Ju1Vyq7ncVed zjWid^5`jg>gNDeLVMHywI)j&1PS?|=W-KRo-D=ycUH4A<9~^`80L zG~Rm8enrTd4{KQ6KEoOs{>Be}6Zl_#IaCt16&KIT-(CTiLSOsvTT(Xs7N}M8^R^P3 z$MyE?@;6EAr*#mNXuz@O`R#A<5&x#-tyj&(Z@g^~Z9Vnf`B}NWy8i9|E6-2O^DWUl z(4SUWT}xb6od2eJb-VQ*q!F91{{1$4R$QAgS3~=|ro4UioQZpXQ#2fIJ8=_pV zt}d_kHBk#;{i(k6E0uXcV5&Q*_9=Hdg7sC}4$}P2$|%%x2SJ0Z)$tCXphmhb2Y@)N zabDcMBM5n;eydXE>_ZB5!?zg>=3R!`PL`VUeY2wNKFe>}0{>l$1KlN&6k=`{N5}H# z|J=-e$kIEmOxvU#OYhuN?rWl5+T7yyB#&Dz$u`XNi-mD=qE-W_h_yRq>Dz9^jwso* z4GFTrRYU07(QR!yyl>X+DQ8wB)Qh*m6C)mOB1IKu>mL(%1t_KSR|eRKa{5$ zWQ}3TBsR(#ytsi+6n;=ZTBc(KCyLnPTh%qd&lKWh#;=+X1B?zJE@s;#9NxGqrBAkT zLRXS^zYa%k@-M#m(--QYvPmhxy>ZcpSwl!3luRHIATpMSJQD}In}aGfE^aPm1Rar| zGa~3KBf3?*x8|AZ?u5%5$ESFNo=w-?pxrUJaCYOv-X zy?O$|h?FILgM$SS_v_+{sMnggwugY2iG(t$sff1)8vD?9`EFW}W_hQZ`Y}Wex35k? z)02t$bt9RMNF$01nCR9LN}yUWRHJuvdO0I>m3q~c=Moc)o-8*&;rvYlKzbCe;mBO_d_&leT@7H2>J!{VE z>y6SGU#f!CkH1GX-uzC7fOYnP%vPCq@1*#nug;olS(H^A5%vu4ecJ@^_L3Y=KNA(z z>i$aVoSev3!k=e0)FALujijyUPz|%3!`l(%{ z+QA??oPdV{9Z1+=TCfU;TfiX+&}2158?`klMC#A1uQ?G zoR|ijoQyvq60SQG2Cd2z3P`sFpa#q;kV-dEnKwB-v=8kvlv)T-5N9QKvFlNh=C?sG zLSylfLI>H>=r*{ykSw@REhRos7hDw6W7ajV53c9yJd9Gw*%*QbAt?gbB3pF-nl=0z zM1d_{ThS5?Mo9ESvXU^gr*aycD&?^+g~}Q*m2iA9K`qEiISXgs?mCg^>xLielcrM% zz!u7)ky7DC3F`#1jS$kJ9Htii=qo+MDrklHDjdafFbP6nbACqP2BDLi-`iiCovL0w zIk9h_oOCbzp!_}?vtG=-10@`^h((R;fJwe{@5em^Inja~K%=so*if=>l?$!w7TM21 zFQ!Gzp;43(z#r4CJJmfkX^~791L;>pJ_Jxn7cp$8G2-2fim6f0G-INXB}?moY9yXZ zbS&I>aF;XVHSrW^kM=XAP<0oK{A(KzmT_dMt1DjzEtz`>4FnmC#!@1I>_aKW^hHlX zq9+K}6Ip<_+_eTvFNEctkPZ@Z)p;2R^X|lZeWBAB&t55xf*1~e`UXE1lq=eyh=z#n z)U5(DYL#Ys*Jj{NB_m)Qy@F8nJjhG(Lc#h0YH{jCtwpOg zK2!H0xh2h|PE?>-l|x3Mm}TEYkk;XFkjw}zOU$fS87%dRD&7KJ2JP}xVXXE0o{Z$SdEzeNl{w4?gxewL~;MSUeXmjXe)3pEAxG68bln2)sj?5}3h z3%iRCkl}M0$?t!)N|ndu`N5Gf0X!gK-d-wUpooUeWZH=zI<$W}fqVy*$ZcgPY} z#g;7cL72ibQy>7>bfj;Gr>JI0W`Q>?^JNp6c}tW^344{&d_=R{ZW)^G){gXcYYe`f zD&XQk^an+$MNIohDS-D>!0UkIX7#HGcr7ZJGI)Ms5M@bjm5{A5Y1WvN@L0ras3 z#{k^!u_&W92&Pf0`HK{de30RT_NjmtFw2<7EJ>k4yshTw2`W1?wJKZEO)ur{H zY?^KSq(1Sb)r{|03{XkMjUoEoIZ^krF!gYlLFutZ4MHSfH&ks9)X;UxiKyCU7h`uB zXI1K154xXXot<14I;}5^CbFn&21Qjr5V?^`T~qHBrA}pBPyg{YV8VoLy9>*Ea=tIkspRMsPr8 zMZs`j#6hW%IEL;O)pW;II%)jaXg0cyupnr=nw(eQ_yJL?e~Z94Iho(my=;|B_Q>?8 zbY&4MzH^f4dp0TCTS7b&Vvv#wo;CL*lZ&<;64BrmP7iCzO(IUBY4haUR9 zLw9-e8q=BE(}S$IBxkRMK}T|J!sQ>Jt|VL_IC|xQYJ*$$>Hsdg(J<~-Xw6Uwl7*dg z(?&Zm?pxXA`+8_HA#`61`g(ACFv}z;@)Z#+M7#l`RX=ncuAO*hz5a z6G~PTvPHY%k#7*Ox)=#j$a=|%pie@dNy~|vgLpq@GzYKS@Q6W)>EIP9QI@0bGV2Wu z(hsY)M7!`>C~?O{Dkqp*V6@xBiTl3^y%d3uSW-CxLTKTM^7C6Z)u2u5z1qVKO;qD} zuuMzz9Z)OQokLrlK7hWHEUIcIw+)F9mkAh@VjH827@&k1%r zsPz*sjUrAgq2C>pWQV~Nv)}G98k%@e+Hh#JblGluTj^l6NUB3NI2Xv8%eIi>56YSc zWAsf>7H?Q7m60tB1~xWeSt!%+phCXyc`8)VKu^_I-AAn3AS)o&ZkpD^c$*9R1RKG` z9>3g`=c24l5S`g*v1!h`#t$(q2zh1|kYZBbt~BSJK2s-^HPuzq60_#bU)qqj+c@+1 zYfB5SmZE2F5}?gwn{vY=&H^6j5Kgcb%WD5v_1vX@pI+bV#CKVe!3CECxfkNF38_fN zHFine^!6L?;C01&gi(+`IVsrQO&f58?i8J6&qOj2RNbU zuR2nB;@Amxm%paITh}=;=|S{?#Vv&+QE2fgKRt$`QQKh=9~_DNDGMT!oyJON8qC?m zx!|BeyYkGTu-wOVK*~2Eet!I7k4bp4DLBhLzX1JR;sPo?J(;<7;TcJLepX?A(YsGv zxgu?5hIF_^gymVByWDv#7&m68Q1X{vAvWGU3m(~}Jpz#U*sU!ud^L%xwx%i-L zFcG;uixg&&F!Ty96JJR8bbW#4<>k38kc=3l#Ha&;xZ66B)2@5ETj14A5WX!wlnq~B zyiwuhXy!_I(Ot+4&{9|j;7u@BvKVIG-TeE~8MCydmy0NFH z0;uAK52t_p{>RfleEs8(-~L%Z+}fy=;itGR z+UA*1r(Rt=`(H2q*E29E=ApT`5C2kFe*3jZ%4pb>S&0GCW2!MCNQ#DJzeNb@ik#H~ zC>TYQ{`oI|)QGEz`utIZYRJo!Spse#b8z5gBJl#OaI&A}R=pO;ibAhlOTU0wKPfQl zUdB;vI1;q$G(J&_W*wSo!X!_TuSU%*M8_>ZM*?@QeB%K+?L7W$1CT0fJfbJa^!U%A2P2||8 z3+&VIor7?gpF9>YB$-iz`zprHlz}(XL81!Y&@q|my@*@v>{?-wMF-U@9Pzu_5}lf_ z{eXkx=Im{ADtJN`p(MbFldP=Lq;3m|Q*~c3!T1`ZWTVn;1GJOw5U3hnjx^3{%!nlK z#TTaCzmvc=br_u%SJmsyPsO$HB-?5gGA2aHu20`zo`XL-7h`}Ik`s!g?>;6NypFg5 z2XClr5CLmWgwx>pQt7D~5o*Em7z-o=A5fXWX4{RHDj!EP$hGUUss|qWUjIv2RO$XcyB$U%Ah0u{;7o(*0E|FI7y*ET4-Q|5Yz+Pn(L(x>kD-6)XA3TsCf z3u*16sv*Wm91#W(6lLWVARZHmXc>HBZU?>1Q?~Kp;tRDkDu|qENHrI*0)+h0jsvR` z&z6XcM2igHzrA4mu?G;&$r8*9zfM3#l?CA+&KugL;rjFRa(4d|X~iNIf<6zO9*ZrG5jx?%L*7tpM1cAw z!?lBv6D)BmDah@bQXDSkA7hVRq&<48?;bP?19lF2hROio)y7LTF2L8+GJW%!1|G<; z%>%68TsGMNbYtv@hqnx%y($A#fC@B{zX_mH59IGI8$?e>b@ZK{80M=&;-GKpVN5f>*cQNHQy+&u z`5H;w7u(CX3cvns7j6yG(IfH$^EUP_((SMHg^7djR3vKeqlCr`D4bRqe^i#bpf;L&p#kyz&rPV9*H^Nt(QY?u8YQH$V@~v;D*L%ecRh$Tl_ZpvDPSn->p8npeq7>o>xfA_c5d0IFHQ3xds?IO3Z&5Fri}#YLY^ilU*XipdR?5e)=c}?tuu1D9k|Y% z#WSH*95BhUF#3jf(;c^GSAa#&d3xHg4&<-{P@AMd6h?6owt=9^hwtp4)CWAK)Rjl; z_7mDkbivl={(0Q?yxR!dMRDx*!$o{u;T~fOYNF6W=+4Rr&9D}fih1_&hrYYSTHUB2 z^dJY325t^Zi)VEsEw<62L}S%)|9uF+()qyz628ZJl%;>qCj-H(9ce;m33L^{gG@4Z z1h`!!T!O2L3@k+CaM{=1F`_t7_(?&DLz_qr`MIkLRmTt9*8W|IK?jG*SupiZH+voSVle z3HIUVI2pa-7--y6M<=jX>AJ`H+gq1a@MN7Gdn(CysnXxoJg0s|x}mC;gwuZRVJ|e# zKI$|-w~-4f;^#4vF9O?giSx1Q+B{wlN86eQec#aRpUheMwVz)S#O7mNP zd~mKBT?=1P<5jq=iMvS2p)RMXJo=~$`VNPPz9}2SZl`d}QB(l86Ub*8S8$=%@a3dQ z=`~7)d1tZK$0~7FA$|ZwZpHX$LA!qzjl!}2MSE&LfXQ`5ce>i`)$@RFj2&pN)~!`y zKfz+7_rR{DW^Wl?JMZ5xeL#;#nw32t=$hHx4`cBOe6;wSpHKvdE^{5Hnelcrc%Rb(fEX`L-Q6#!fT?`l09$T+UDk1hol(o36O41k|lB#3v`tP4|i3RAG&jxB^^q5Hefk zQU?#~m8^aBJ3$-jE20q;kMs5iDdVO5EEjq=(2-T5R!aD)8G60AMAcRy>bQZSwrz>Jq(9ZBaqMU*V@WPhN z-`LjGll?;DGu46QbU(uXXqTV3Esl|LlGoCMl%|Y=pn;9!04X=`;L`5)^kJn++=70n zJ-Ge|h{Kh0)Xv%02eodG+}cF*G=)dHM_ZQ1UG?)MUtKg=JcbnqkgNh|HCK|DG-@XOta`8XS)un_E{U84R zi%DE4B0(U`sd?_>RkJUMR*gzoF*k(a2Pqu&OFi?of0e!rsKK|!!ZP;&8DZgLlL zM8|U+CLG5}kU;?KOVIK-EJ-(6B}2HWH}47<>rF2-&tR;H7tn5C8RRMKQ?M1C{k(GI zeXoK&4$2YOhm)j0DE76GzmYt+-(UR~skT>E2qL_WgCq(f zKhB{ACMx~IHI&?M-$HH7z=ib0_xj&SoQ7_XACnFG-7Oed;Ncg=Te?*^aiO#WoAkAtqmG4WOPev-)^a1!vps4DF~yk z>_h$%Q$tU&>k*q#5s6Q-jJA*j75gZ5O)Qyag6@|75<_&Z1wLst7~?i)4}ioD6LL(% zLX6fu{Yq%`Em~K>mdAN$o^L=kZ#1ZRqcF{O357gJ^n+MENb9p}u%ki}2~eCFg@82m z+Qh3wPUvT5#V1-m#9F{PJL`A)wYimUp7vrbNbnhvp@S6cA*56qt{-WB3gJ1JD`-Uf zRS~9ClucD*^C70k2$&-RTnK7t3nI5-(!u5ls}1=!r~PB&l6)wa*Vi95!cp|%_3g!* zKGuqDdKIguzSlq2$tz@E5@;8CVN9q_>xB^qh>~lv*Hws_Op_r#QRB<+w_6D$*>3fu zZMAu9RJb&zJQfEqdvi>x6V2WFOU z$oy#}R!9dTX}?)>ARHl+B>wRe&Ij_YSIzac zsV*>`)SF3F=PX6@?sog_&u2G3+!Qyr*Sq6CT`wvK%$rqBd~8#aMF`U-lwU2}F_6t;!_u|*p03877FXGLaryS$ zoUj9r%6kS`WH5;Q~n$u0afWmR9tmQv~Ncvi>8JO~$7bCaWoP ztGbR&)2NCP{ef%4B+q5Q5J z7;_6Ophd63vfxa}h`2>h;uiQ7*|CH@RimNlE(1F%EO4Kh#An320>mUMM*=xoCRQQB z2gyaEMr-taVt(DV$B!gYPO0MNENwE0E1;s!pn6R~7IR}9zOpa@du#IsHGy%jMYHsYHc9MJ;>l6h!rcED>qKa#>DfF>U zW-{z|Q4-W_@)?`?y%B#AV0@<7hX zvJ!DEv5tC`xJ%g4Pb6}Amt`&nHSPmC;#!1PLb!J2y{^47s2q#qIB8w%MAe8O5j;Ui z^g@V*fOIY#2fENM(%QIB<@1vhx8=QgOX}q$UaHr07ME_fPY1gh8DLc~nuGz2gf$H- ziy$`k+ftKs$qQ=^06S!D%L$n>?#?Q?43)RyG4%$6J@LR-0lZztdJeQ&$ z_^gV&wu1FebQNg5goCp`tIV1IelN+JgWX;=cLSP>dJ|HyK z`r(2Bg7MIXhsA0n7e-TGljisI6}wXwLMBZ2EqCEOP8wmlAG~qr8j(T7?Y|d`P1$lq z<2J&lkG6Z&Xt~1Uk80 zcL^5K0_;2p3b-#MSI*8`3ss6~R@ooKLKvJ~#_AWTwo7()+fL?c-N?1txJ?pe}56o}p$VsSV*MCBIf zm{6`vB|D#U)u7&-IYg7x+KOiv$~(-zG^ZY0oC!Qxz~q4}7-75Ij^Q zj%u5_6|rTP7`LRULmtbvz6W&+jp>1fep(sPW?8uaUEiMHC|U9QKOryp??tbfsB16w z4aouD$p|P@T1guMQx(Z{3QXVAT8XYg?mSY(SCYS#?MLEN?ro}IV$7vr4Pw!IgC@gg zF>bQin!`JOx0OvJU))~bT)uT$S>$yIH#S(Cpd_gUy1}4eyG>Q8qR{=^kE&^&E^@}4 zKh*kg&J0SI5goTs_4apUNt1_1^hx^08V#V?h9iua$)@0x+!_7JL6&Oo+~Z-F<6SoY zagX6#xB|F|VnW(wS#0mrGNKbAGy$7rcoI>#B?sAH_;#jZP?D^vci6bxl^*S?-Q(7% z@i&85lIa)Y8w^H-pakvS`qj6?8hyB(SFKdcNJ?_)Q&_DnyQgl0(j3k<-0BCc7`(mn zYcvLDZMQ`XFoDc#3AYuXedFOXXOFYCAIz9F92ESN<1raeL%&g32RSQ%OmCcUEjosH z=my{KtONbAQ>Vnj#$t0IJ>Dt2z>;K;awB2c^`RweNt>#O)JE^zgLUuu0eNHn5bvaO^m@G4<9}*Y<2D%_tHK#$S}|5P=x;2sW&@jQf=yDDtGVRK~_QdhQkTv zxJ572Q+5ySoe{LXl4C9}4jVd1t{h-1n99U2ZQ6)l=ogPJl!jOi&a4LwNdaeexkA*AK8te55elrkFugj3IVJjYtuGqDoEjvo{C`~ z&?}Vw|0sO`B|svD1_DB$3jmyU`d}0g?kZ0H@aG$jl}$^wS(T~$yNk_t7k|J%@ZH7t z7nKs7`WC=jnSCqK5A%u=PcL~5F(XtN1;`(6aY>sc%J^lTe$^8Zn^foOFO0Y?*N#6G z7iZN=e&jClE5lv2_?jBbIdGFj9?eKl3kN}K7bw`?2*0`_d6C~@#?QgK2^WeJ;n(ZB z`vwOqHa1aEc|{6KW-eD)J9JuBb%-g;vLzv#G;k+gQ^ts6!gxE?8y)V>+~vBmPOp$| zH;@+cmxKEHLCyat@pQg>Rnn^Q?xj@ej>eS?dJWjbn(HYUn%dk0x|^W>6#`Onby8!; zA6-wCjFy^Ym8hE5U00`W0o~=V8y;L8>sQNm%UEx>U)-i8abNsl2+#PrmS6CPz6r*X zSeVM>`^gUPu>KIwpGisn;$5SCu`ruZwV?&SMG`SocYkXl2kX1r|A5M07AaP_d zZIz>29tdMSAPBjO=wy}@f&HH{piz}a+b!qrTEGLH-Ms}ugdG%Qx%5lyluc`9QlBtV z5tOsV)zz6WNq(b$5QNk?ujIpY;iXz`#bV{L;kO~X9~`%mZhE}{Y&51f1jRTY7W>oh2yY{afSL#;i2<6&u#9_ zuT^<}QKZRC-9(|z8<8zJ@x*$NVMhZWFO=!>030avHJ#G?R1e| z|3Ykw70hvpb&#-u7Pfpur+U&AFaU29p&yVI6z5gV+XB8)x7)7-%IgS_A$9{^;LL}5 zykVi@?*wy!rSlwk{phnj&<(gDF~w9N2H_wiJ*YEmf>#&=crbXI$PjJ_J9S*SxgeE;5i4Lp(sZ!LVjLAzPWM5L5EMTo1PcVlH5mFG_S9j*$_v#Pg(iPec_6Trl z@_eO)q2fc!C8(x<{3w0W$b(RWc2_R$+0O0Weiv-VfZ7t0Xyh$6!Z;Nw6D!_Dl=>5C zk@synw_Qp%nAQL-20{x2H-YfNM@E$}>O?3Wx3uvhlAh;ryK~zziv6tEvMqg#DIT6T zHaBY-G+`m0`V!+Tfl*o+-79Y&z2UR_tm6dwB)E_pJkKprCtwsC4Y8#6=XR> z4NACh9nN$7088$HCZjv7pBzE%P(B|((-wOsoq zr2nJHe0?nlxE3s&K8ySBmnnzz1ZUnNmTUJj9!0{`))l(X#?Pk4Rz3sT`7B;Zg?oeLH^(d7HYjdxPJ`UcAE2Y$DCNi$1) zR>#QC*%N!f4er7eaj+=s6nF69)gcMN~3MCRz3Jvr^~O}v@Ys0#>rMdQAQl;v2^(lF#V2W28Y+`r0a$% zpA7flF|sNtiN6a{oS|IL?w4ma9ni5FIt^4POcM}8luguzLY=tt);eB9qK5Hu*L;SEZD($5v51cRWFG_M*?a?ZES_v(9Me|FD-QU zj=P%pk~oGyvVfxw!Sz_XI?N!wA~&}5*K36E@5s#}=xsog?*!FP@_6<4(rDe!UT4&N z$bG5?_z=DvX6&(=?@EBXuRMZsyg07Olw7t30ihG#QU}mMt$gBw9JuTxJ>MOyWk6v2X zlJ|y}TfFmjQ+cn>^~up_AWnkH535X3Nm9`sXf$_;beP}4P{L~#)J+9;AxE$n3i4m= zy+41(hS^{2*n4N+T2Dq7w*xM@P`2w}sr};ce)o`fQ@nw^@#^wI5w0ijxWwc?NGrs= zKqLCc_bNr63k&_}1-!FDL;pwl+da85`_xa&V=*`?1{h(Fyit(6(SbmxN696 zkCzKEA<(AjlDnBVOUK~?N;SoedSF8{#x))Wt%TVpfd$aR1dZ*}M4IT?8gzG|QJu;F zCPozfvx`#&Mt97-IyA$yRADD|;V??cAXw8p!&H-tjt z!I_QQs>2DPQG)LN?Bej&OE2gFSV_rDpF+Uz5wtkNzDG6044!p>nqxZD_h=AB;@K#M z+mhyZ2>^eBhlSPxJ{xAZe{5q&?Cu#9%uuB0?tYM}o*+vqe!gaZO zI@pI35u0Y=4hbcOOedtBfC~2F1Iu_1or#w>M6skeyOW$iCP75IQ)+keG@S|6z#ee% zVV8mz#b}O#w;%9ujzOfVx$?FtiE0383s`o6L1eiNePvp#ClJjOa-RHN{k2OC0+V~4 zmn6pla_lE1>u#1BWJSgI&j2F1nn~6k3i%cRHzvf*!!6jy!r&^&}>`Szm-P@kc{Zi zupl-@;r^#q`8Z~tEv=W0K9_>-ln^16s|v-pB}+uFE2>Ir%!Fi4hV> ziXx=9>R>s#vD(-$KZ0K0W)b!Vwcy zMVb?(2Xh4%d_4+^lwkAI897^+V+r$gGn@Fn^Oo=F5{0`Uk}sAWfy+79F}SGLE(mND-^AuQ+qACv3*en##2 zMr(|{ZfXt?{cFM!WmlgHy(N^_o?rcPyET6u!h@8lZxA9> z2AfPMq1@yg0m@o}DYg$S_Yye5erxqTn37`79^5<0oQ+Wh&wZ0;1d1k{%XY2J2$^oB zsSu-3LJUveU!DWSKbMXanA{3K_42%er&!RJgEuVMqaJwoPrhwx0@-0aNLw$*cvK#^0}7F>48>a4owlyD4gyxNoiXR^*j?7TRFtHpM9c$;q2%?ac1R3Q_KuM~hKRjR zn=B8~G$K!r4eHgSqDNF~;S6~nzpYA}KXY=CfM>R{tf7DO77@7HhM|*Qh~kIDeBP4$qTL2IgSI_ z%&Xm}eLL!eOkk26z#~nDWXPVrFqw;07h{iKk<+paBsXCu76vudD!Tux+a$t(py%Gn zq37Pf^6s$>+lTs(nDvaHZy$o?mUX31jF;o+_{{#^C=)5XOPp;9*|%~SPLUM)kkW}F z^vDat@Q6W|Myg9~EPS`^`Q=YyIEE~jRfkFnzZrJYC?XEM!JILAryC>59y3?4Utt%4 z<>Pb#?`cqR#XnE3<9vt#X z$&H)?0KvcXfu5GB+3hDI@Mr5HOE`=Xa4S?K9+Ozl$v3->$ZG5sSpzeB108*Z)>lS3 z4b_W%ASCUy4&~0_D>{inB5IjE)VQ{l_~;3#F6~^9MiXD`J%$PMFC!9*V`mo%SBw$v zG5jxbXjp|-l8Y#%)?9^jUNMtFQb+jz~oEQ zS;*9?kz6!#-R`d4JC*8a@VTTpB(H;mq9E>(6m}$t4K|1iMf0bZn_FmC8Eng z!hz2RVU04T4~>5DC%UbP{(bcB_WCt)#Sb#*tc5TQMq`4bNdm@${;TQC0QPG#u6PM) zv7m#8Z%i`R$k%9%o!X_wX@Upd6&W=NO-QZ9o{AB{ad$onm3g;!ht1EV9yuN90*EI( z$RIT$B960+QM3;?mXx9|W|qIezACns0e=N~Jy_vV51`W2FAG6cV}a!OR8Q{JC9p7V zT7*rsU!jsyd<2JslE44yqN%%B-4|b2^o&1D^OL4rsEBTXM~e)_?L?ZN`{p4z3J3EL zBQ#DqZ$~HsCnWhWk}N7Xd{US!>J<6$?M5Cv%$m60K}oI~v~RNPs@xl0k_aQ%oVvDK z1)`N4#sX+})|t)&q=v-Cd-rQdXDgXxZ~JwNub4zbNGricRLM$ zP3s2I8@c?|PUbntckY)Ipxb==>mE8emzv>-u!+6wE!XWfDJl|o$l(K< zY=(yBJpY#*{-;N%VW&*iJyS+vTXJFNqy$RP$s3M1GiCDpqfVJp>nEi@X-I@Q$SQ@t zVk0-wM)bJFlsr3%)Q~+%{>A;rWb%=pMA}4#VyHl)Yh&`UVM{20$Y~7pf=q_ZPUmdA z=19MND`hvLGGLZc!cjL@H^IKS-FB}M^J>2m?ct@gW!HOsNDnw?;j{ysn1J$&L)!zb z{;HHgWD;Qv@Zt04QqP7rEE2zhZs$b>KH9}_{w6ltG7Cbo@V|c{n5@MG&!Vr5sm-+tZKf$Qh6y- zb3dj9rH8kzZlWZB;wjGiyYr|+A%(=r@aWacOqDJLOZE7*)Zbs+#wESJjWzwPd`)Ha zGKDKJCJ{RTS|QWs_sV9gcU`1YfX11shbeN(vGwVKu19@sj6hN_XrcP@^Sl^*Yu&vRk(cW2W*ysw<`L zL*nONfbFY^TeLPwT}JWCI-{R?8q_9>?#`Og-U4hI6dNI=1j!L>3lJ?_OAIDU1TQE- z6KGl>9Q-8Xes?g>%f0Jaj!G0ORD+*c9A8F{3J2M-T(Rgg_Dr$iI>s28SA7zY`sbllkq9R@Nw_*@koNkFp)pnC0bH3@P z-JlASvkUTDD$r%smSCS!EI=M%Rti=qj~=CS`_BPCcCNjv=Ml;27*|$*W~bj;*)k!N zZ3B+rBmz)qt!(ou*b(xpKWbgeT%1=;;`tdmhS2k1@>=j*Y3-EHr@XXAEY9Do?U{G~ zqWSrq9cMAwE@9EnNktf-2V>;fyJBW!T_lEbb~AzMX&IK-otfN3!gu7sy)Je~^IsVn z*7^L%_ z=WT_Pq$X^Ow0N@Pd9C@_2P&d+Yh&7eakGC2MOYFZ{_=9bWj{_%d9=?Ch9jTUT_0tsJA z5kN(dCh)3DadPW6FD%U0ik5$#E8jDVx>ctPpoW4x%~0`z-$_cwuYbHSdWSEd{;ct7 zf%rtP&#G(eH}Ax82CSzffFScKvJ?_*D|mu;9}a->OdmNbCOM7nuC`f^j~_^aO|Th- z;RVP^DV+h3_v*$&^r98GFWl?+b{lj`Zd?q!BBDI@6G%d;D}j+nrXBwJ@zR7!{QBA7 zw7Rwj+NNJR;2!+nD`sV9pTn)-L042Y1e~CDpx_Sn`N56ol-a4(m{x>I!HyAxx!-_X zJY+Q<+>#Ze0Sx)`QA#wGLad}dJD=EYf+Wf!5_-={PzmbE!|aXW;nl4Hu|h|JYNb6~ zqY?lQz>_k(_`;AO4;Gr!3pOd{AoIDclXzO3=Y)bmeoMA?6puqyWuI`rYupl?duO7r z=%hMHi_w?(7yv9mAt0^sOZ&RDtQo>C@TkjD1ho~lhp54ZyhATJWh^`m zZb_GjaY4dB)Z**kSs0*Rg07`?I8a2d5DfQwcnPnGb9j~bmKreR4fcF|iYy=Zg^xKh zhF`+Yz@7tYUJV}I`t5eCf{6IC478IErd0qNN(3A%+5265tYAnYk{N>%4T#wQfPY_t zq0LDZlNR8z$f%T6_=}G78m!sSY1Vmot#GnVLFAE`a}c*p?*r5)~y6au3W4K zkNXNKv7SZI@ZtM_*jmg^by$-(T$HVY`0(%D8+44|B-Y1q%qx(kQggRkrRIvASRhhxR#nknct`*k36rsO!)1QRgiQTN^UykavE(3-wL*}!9orXB z%nOM#IxpTqpdsdI6t$f5q`}8TKxS;L5~KI->x6m4!*hBwHgOy^WP!=68rnbcD-I8u zqjq=_@IUxglBk55CdJrraqZQwi$2{sSw7ajAL-8tK}u!r`~2aBQO0n)FD$I# zUZAZVivzW}zJj~$`-7)UOM}(hv-Y9TmjD|=>r29Qw9)XW?RjuhSDYIDj@u-X6_6E2M z(z28s)#PJ^T3L(*hh=a0*!RIcH9~*j&aoU?s{A5{?6<1@!Y}X%18?|+Dj)It;AgqCJ3Ove`!t8C9^?2^(2VSO&nozjtsQ-~D^sis3dp80KRJvTwIIcVwv4it_}WKa zp6=CBd^h9(_cA}rEAp==65Q{;@Uay4`(K_1U#M2uqsE9h$>r8SyA{C5)CM8fpb4Z5 z4#}e+*a97T2>A8>73ll<-GN$1odtf_kgwGBjKl0gtQ0IZ@JVEl-$L`?zH!eh)-Ico z`Qu>esLOe3Gw)bg1V6Ky;Kzi9VzQFV5HK^P9?X>3tF4*PHK|&dq1Wa`iGknG;(!!r zyuBV~_%w&FztJk5-WAzhItYJ&gdlL3%qlsoRt1zDE~@^itrHU^9>bbwXV?k(OlQMn z|3ug?OmgFB+0OSHoJ+8U-?VTD!Pyez5DGW=lg@88%3mzCW!jr0D`2~wbS0~3m5*iV zlgAPD>wN^DuL_G(OizR}V@w#L9E?f}uRjq0b;Dwuc<)|k=?)S%sSBX?88POPG%P_i z(-QaAPu6Ul;IShNd&8;706)Hlo_IL?aRxq`pu;wRjG`9Wr_nnPHT1%?IO3=1M7kf| zUN~%utPDJg!@LYUU5WDXS9!hh|vExkGyBFu!OygW7 znS`i+#eF^SgU`#zHi{Z3GY=k@oa7ThOjIa0ux=yGjq|6ERu|fsG6R+!5$*>6!;?X) z+XcMh5PMMYk`IKx&4P?TboA&HS@E>&oa%(K=FU5!)*sW+?waE`*IEls%xP^<;T>@f_bX*a z%fBEYQBZhQ(6)k#cyi0%F6oiI@IaWPEoCjL>$x`MJt{VM0FL&PBo6_t#z55TA}56S zKyb9~@l&&VsWbIsBK{NXOJoztnu3@Hh?IK^>tiAQp@D^Gq>RCPH!ZaDpUKS5%F52N z-g&+wPgu|{D|S!YbnWGmf+ggNSYazs_~Vanx_)_4 zouiMxZ`RweKjJ70*jqUWuv^VL2}m9m#l+PIa0QSij@`chv-`J$?pdmVe~i2QXg)%F z0Wj9ktIM~Fn)6I@c3c!H`&v_y0}O_T8b_O#W2q;b^6;&D9i#;tB>8`r0w}vRE5^9> zo;|zLt%GgS#TS&&){^tLYP}|lBvq1Ozm9vqrt8}?^wM1*o5)V>&D(D8=GzvOB z_eqAKyk&()IEld`s<7Gaqweeox$0>@WDpNuQK6mn&$1%2v+L95?YkSH`oUpP>&T_RgmRS6I zb#CpIsav7@fvAf-V7HB}%qSf<2hRwYg-UwO*wr*LXi<7+ywa_}^XD3SM@nfRM zMF>M;fkp|jLJ)8{(~rLTcP8?g@e<4r!>2x5`;F5dQ(On)QE?=73HM!0criKl$l4R2 zNw_aOijdYqF@!o?CF-$_gP7%gbH2FhH5+g6_-wrW_EcwJKGE>KTMQ{i))QdhC4@bS z=<=p`(}=KJ?6W|BGW+J(i zRvtxPvYNQdWLQ9tl9jOKB#|FiDO*9&nC)F9pY|cp+stJwIX zOdx%1;IlspI1r*b*GnSRxmz`sa3>?tfwW-L%qE!^1wmDoVd6EZ;$XiM3CUCQD)bvr z`v;FAYJt(4Ae%f1&}17@lHZZ2<*AL4A+TIlZS>*y(YDEM*pp<1gp@~&15N1%Y?y}( zdpaD&^VDX!-wC4|T3c3W>iaO(rxm>5oC@}ard?wPkZEteud3U3XJn;6AmdKx4Zi9z zr#m@!nl>T7J3NL&MZ}Ppe|9*_ zh|ycI+}5)!_&&~oa}4Q{+!F0QCAV!3xfr>1;BLxs<2ldw-xjT7;15qG$MEtRQOC*p z(K4JAP(!6LDH$LH^ztA=&;6vRVApOSH8}T+8XVy^n<9tZy-f2wZfiocp9VI0=vV4p zSR?FUhe&!P{AR90)~{d7K8;cmmy+x@Eq$-3g_^E=x*(}mY=--t?-5Eg<>>TDhMFYg z(I%Jn(;zi?sQErvZ&^caFjxh6j6t?Qd`b4lFch}Beia;C`=U4H;bj5fd7u18K?C1x zRwj5uU171XsQV52;6CQQs*x->5J&u!k=#*|*T7NgAO_-^R(QhPP5gPy!@+xG%?`a^ z3F>YF%?ZO}ImcsvlGZSA;kU!=%buF2VM?zA&NtkC;y^Akj0OK7I3^%~=w3Uj^hRX}~D} z74OD`#~({@zBFLN6?^H^8vEWzk$MHR)i683UXzlZ=VKcw21CB<{-{Y@8@5TFXKk63 z;o~!nT{R_$-pikijVC5GOcKPcPim8>$~f@d7e3ay9V+E3R_{PDj#F^RB?;@GafbDa zi^fa4Xcsd?LwtXd1`x_+rl@+d2vyZtK!8a z2l3C#kVSRL?&O%n2cTQEX-Vc4NFAy~oFZ0^oi7OH6$@@y3u(e6VR>4|cwqcNEp~p^ z-mMR(gg*{X4;L{e05Sh+gpXBQbbujk*PeM5)Hie?`S%y~kt ziLQIYUf+3v1>V#Qvf6?wBY#oYa#4XWp~hY~_2R>xo%$=I;a<4$o4-b{q47K)2bjWiQ*9bh6R>+I6qUItp$8J zVa7euKKz$=e2(43(A(8jo@6zwLNTeRK2bOE3d!&prWsEyc`Gs=9_V zzJmR+Y#`+M|Ji#N-Z+jd&zB#?i!qGudwUD{e(?GVu+{QFcie5klDmOjEQows1yd}V zMcURZ`n%uXIT4W=S(RB;6h+#e^SrJQl&S@0|!uXB>pH+hh6oL0(F<0?cGgx(Ov!YZ^6HQA9tDfzkswj%Fgc15{{=YZv$HU&u9>R>)8j)oSI1p|4hYcvdS3Ltm||u~BZj-m6LyBV?U^hJS&ab{1 z>U26H&PCylo!AsS5b>z($kxe=GKr*KGB&f>C!b`N#;k!tdXQ_Lo)%ILA3Vx4iN6IG zDh@%2Oxq;!b2O6e`>Q6*zPM?GZM=aOD6W)ozmr%psg4kWG7}_8)ni)g^3rZ-dra0Z9)lRRy2HrF89Tqx{?j75ytQo2W+NUPO1`qN`=eZPhmUTklv z*7N-J?G3IV$A)C%6Y_#O%%q@RlS+-3c=CMo(WsMGQ=~l*@aM_9Gwb#2Ogk4c$qKy!EL)zN@?O5H z);f|dR;$1AUl~Or|70j|-8`&fN+v-DWyPY<#W1NPpA78yQuD=>Or$g_aDB9-uB(60 z-$p0P%&n;Ook#xk>dh}5i}>Z{7wLN-#r=972c`(%Ws*|Ly^VXSK}X`SWI&()&%5G( zokE6bv9t!$!F_s{)}P)L{AfS*sE+c}Y1}6bG?%7XYI`53+AW8E>-?OF9vaxQvzumQ z712!-hM=ys)z$Y@KKh=;$0ZxoaS~<$44sTyMP+mCt}i*>=jR-6rO7#Jdv^BEuKHo@ z$#8^R{y5o(bS+d(zrpq8B`ro9}%Kq>&$)C@@jMopkTj5xm2YmWMSQ2g3b*QudC+bgVN6|M{n%e*2XZ!R*;JGxunP zln81M=#)5XQ`-^&0 z1Nb#nn*hD4LYv%qkt4>4r%lY}=fPdAVABceSnh?m54EbVt{#673Z~|GohryTEZH!I z2MyzC8Ff-q)(g<%G|#dq5-nt8)Q>ie;pm0YzVv1ZR5~ATp${hLllXrXm58W_P3XmB za_`Z*WgccdM*jaO>*Jkm@4l#dOv+^Ruv;Bf%Qz8-?u$nr7+&G+9d$p;Z}q2>OkM~J z%(0_hbT=ZK)CGmddWvQDRo5j6x2kQk62D#5%j*5+?)LorYyIh*#J)`Mve(Ln0|Dbrqa3|bU_~GQP=+{^4?c0m*iD=&sQnNkUANF$dSVC?;gMcU3 z<;C}R6s%*Ks5GShAcRp!H*Yernvd~swX#2~2(zbg*yb<%8$OZG(NEs=X&iPG@ulot5JE%JuscGK5cMOx!0pwv z5j7X3a#k84#Mw4^N6+wyln@4KBBYPP{h2Ic^)R?`FUmC68nd!j0m)E891Y2$U{#dUjEsYtQ(N%Qx?S@-g) zXI$(0vcoW-XKfHUVub={Q2I@FuI$P6?vk*}(0`g#4159>?w+s*@bI$RML7AC9ePlY z(eG;so0>AhHMTj*83$4GSW7q%=+Wgfm*&C3ohbo1H~r=2XNkqFz*oa6kdgS`Q0kA6 z;i8Q_)M@b#FV_GKrxifcCN0~R0LP?F%DiSZU;&1u4Sccuw))wM#BT=Ml`@};>fMGi z(*N1Xh`{dR8-$QYb=8G(*($pm9$A*=2eu=XtFw32FBi2SqE{h-(ZH9(*Xk&j>ZGR0 zWLp2_lm6;YpV>51^YhQ2{P$;;tMH-obBbGcVzYX7#&45OV*Y>?5c~gI;y0iJ>K0@e zZVHL9oPF=eAFZ%76>AyLU0Zn58=+<1m@n$%(Z6<)C_8USAZ>pb0vt166-LW zSJnDqY|Ecuq;-TLAS~jp>yb2OZA4UT1~^+KPS!>|45sO0ah|z*d6xc6(cRk{Oz-VQQ;F#<>PV3QNTdUd zE6x*%4wk~a<1>dTaEI!Xw|x1s6W%J)2j5SKjS2dcn-fJ^i)&6F;TF|L-DcRbxmI%* zYZf}C7_;`4o$w+oiCulC=GB;g(p^eYfRt22asVTx=Y;cj-E59%X=UG)Pg zvtT4QQC|1Dl7i<4OC<1?t7y(eQik?Mb$%}6#m3ElrC(2o zW?!j&eYMpcj(2JvfBNMsY}+*I0%)y@*zirjosx<;7fi)OcIP|x+2U$*b#Zlfc^PJZ z-(3BjUxuZ$?^8dsj~ix?WI@8u(Y|Z4&zh}6j=Zl7~QJ!YSovbZ752*njS9pV0F!?jkcSM<29E?@j8CpqeVl->~+A>=Oa zDgN9G{ATx~_Sjy&Q}N*JukIIUt#E%GehG8eF3Y3N3@K%?m6v6It1_kjL=30IhY@0H za*dz6PqDx6iA#9>o=}>1x~s#-hhJuT35&ZcsY!ovS&=+LTFTwk4|Et*)B%pEcpk;E zna}=XOI^RY>AL6g9bv*l-@`BE(4Ji1bduuTr*bSIA8r7mreJ~6FtBjJIXxLS)e=<$ zZT5AA+pwm{SOZbRyYK0h1rfi;JQ0goX2gCWoyaewib@;1)Wm@tsv#U?l^tDovvv zV=w+*e4bO`dpghwf16`5g`w zK&)*O2Vyv<_l7yzL*+g8;I0!h6aA!_Y=Kx6HgO$-LPzyDc+>Qe16`Wy=RW5z+w?s` z0&7eje%U1*t^(+rA1}^Kld{DF{2|r0FubOm*TwKP(AL`?3}h7J0E;I#r`JBuXv~MQ z>-E*$R-}!nrGgKk)H&i-6pN?DG#z?7f5#eLt2EyBZBVCSQN(pxliZJ3YuXOIA4cz_ z`*9wiOW|9^(TBe$*X#iQfy19N+cwMx4=t(R+y=}Ah-hv+|A9lFiUN`2dXB@z&+A*l zUEC7Ek%F88I<@>a&fvsz4<7n-9LpP9G#Hg5&6kCIg)c@uYS+jM0{OcY_jrk{gv z9qP2uQEoOub~(fDixh1Dx(^CLDUi9+c<2im>BNRg$k1=ns>$1qgg9LS({$+VL`F{E z1ptp}SA!ZBKrE^BO~d?~b9^c?#g+z!kyNCL6Cc|bVE`bm_)4!3h;PjUANAbYdy}yH zzM)=L8%IP-C{*R4dsC0y!HcRG2F+)FLP8_SR(UoC86yc$&8v>Wf3+} zBX!#LAA5M$?%KLQzSUqqv4fOB0xU4`cNKA*i5`99^7HkY~Eet5mp&!m?Y73 z85jjgA0-F|lBlr%*nzH%ba2o(2Doe0ijD0*yPJ(@svMk{{0NF!vZ!IsL?=(2&MR{( z&5b0$*U_#UwJ9e(er1M?Y9#qi7A@rZP1Mp-gRlL+%w9m5caieM4_2kzBf zlt^yJ_U)SdpnhWn)?u@PhFVK8)-J596{!a%k7(}U`9(D1P@(2+{AH|GP!tU?MM1+= zSp-tQ$u-V@VP-X=_@-k6$@06C`?I~+cHe8J7oU&ODtfX8@QRcTF+buInSJ(NYcw+m z(o5cM?k-!1doA-K#jqh%f!v}Fts)WVjj{cqofW9ruA{QYd%*0{3N*VY6EVg%KD3t* zYn(3R#oNuL93ZBJP!j^Xlw=^pg^F>t^UPAGug$0CH#N7d@vTPNQMjbTESDw$;weT| zPSECh{>`GgTz`LcaVH8@0lHL|?;~jy&d=f&B^RiAz zbE?v`hdRCXrKz5-65blSjIn#rT>{B~(nHaKh?1n8D4_lm5AHCsGmEUO*ig?UuDYti z#1iyUsM3Gnq1{D^RW1AV4TiGmRn8WZhzQ3D0Xr^YIM&j`4;@CBdAFvUd6g1H7W7pS zLM%-QU)X)gv#;yuNKePxv?P84Ke3HUr|nDmA|u=}7;>3E$PQ}B=rco#=v z=?fEaOG+5yaGT-kC90U%$%rJWBxfqqM@}dH*ioCV1>?s4#(B?6Y9SDdTcCR{gNOG39&27tnA>HatV!(%+F!`q_b`3Xj@6w;YK0ihuXWw zw!QGSroh(gTQy$SZ4+S%lEM!qQLr{aR$5QmmgwgjbadGkW00o$GgY&znhaAk{swW; ze_(z(sU_U+bv+Rp7!Za4-g9 zP#aqBHOiRDGbX1C^@B3Am@p!7fKexv z$dj52(cEnQV-M~+^1n%^8B#22KwbbLhDOd=@*j9;cPMzQsJZVk4C22b$|X%xVsp5- zUE_gX45w7rGWJ{JTE>ajG<_eHxKu$ELJHO%WmlsK2wq%Hq&zb!kM2Zk(;Vs$RB zuUMI+2JGjI60_9^Ta1dF?o8U zEA$sU6FsRom9VCvb^a?e^h*>}JIKX+6Icg?;#j0(Y=8;e!)rgV=z~%+{4&>BVhDu- zBaU13MbQbsH3bCw8t0>YvOG+p{|-v zvcac!i~IGPtx5iIzS*6e9t|6wePJ<9TSKO{DDXORnT!pGd%5q$ltGOyYx{~M0NrlH z&FTW);k?`l@-Qn`#?<-cUJrWgwLvLUbFD7U*ju$BL7H{5&gSJg-G32qTdNzKy^xt2 ze&l<}3)k#9$vb2V)Lr;FQg5BZItC~Cp|O2tyyqXVLr=OMZW&N|aT&)h3g39@u~4#w z5mg9?i|x3q$!Zmxd;ad?u<;%LTy5W-pKr*##E*Pi-FAfe@DEwxm=%h-(i3?mkw+3~ z3M2TT*o-bak~Zn0E>WJ4Ba0yJ1Gs=P%;5p|C5;&$zXCAG<>iHZlrJQlpRQtnWrM9z z^Hy7Bu|VUq1QMpNF-Wc19;Dw!AD4iFzfF2W3vwpZA|jZEQVIvQwvY z@(j(MS-3f+`Y*x4zir-PS0YAFt-yJkL`mGm6%KPQe<6(Vfe)OPa*ibg4Ddd%NAyA{ z%oDJW3MH>2NfTw=G?`vqn${alq%?;{&Yw(3JJ2(!^d9DNY~~IpAVH8k$h1ft9q_c? z;oSW`SC(5VFkz6wIbiQLS7B%#gbe$QxZ#eHSy~1e6H@&ZZ5&NWvYRf?zLx*~M>kMe zW*Q^K);!#HH)%5xcvwp zjZ=nqLD*@~8WWtLZGyX5xRv-0=SkLm_aLQ)glxQry5uwTfQzspCBGqVk=PND#m43b z^dgkY*YhCEO1#@l01W+(uk-iC&kDDlvL}xhQl1_6MoMZe+20`Ye-JN>AhEUB?v~kM zRT9Pse@crW1)CjmVnIIFm+r+8qkj#3Ebu}?lw*W?u=qp5mDTnCfxK`!Eh9(~hF|mq z0EzsYiWO{Y(_ROQn2Da#aDDe6(fU`y+lKfx6+7`_=ub(r)S&;#U0-3B>%dY%Y%YnK zmdF$*3Fs~Ir}q7o4PK-#vQq4z&dT9-1Z@%|5zNdvX;tmgVbhF=d4VaTk%!6bk+wsML|J)#dVk=rrEZE)5rd4%*+{^ z93rWa+!O)gHa1VZ*8U;F=7KP`D8hNfO=Wo;S%eZ{?7+jsb>Za2Bj1ooBrPy5RS}gj z__e*bPOKOx?;axrtcDF0QsR=j^~mBneowBObZ?|7N!rU$Qs1oshA}^_>6hA4pjD9S zPeMVBAcCBxk4f`x27)Rf?la*R`rLQI;LE;~{*5siLvm9Vq^%LP-IM}^F|?j-n+>61 zXRqbQU#r{7ok=TxWTw3w+DYN;8t_k0I|+#<$>{FtO3c81l@Op(<}u}Q-ihH9O}*|plY_%R>d$;z+;Ej@pU5n4g_kCaxjS54Ss^Ysj;gQ zk1@!>YWk57cXxneW4n87;pYTLxJ?Ho89LmXV-9_CQA`U6~PxuCGRIJ&>bb5+3*p=4Z;{rPwQ@ zzDh(0)31;oGYE{6!)Q*?mz&LHa=EEQYiocMK|o>SLhu_h$Zz(|(4JHKmek@C%t4Z# zkX@x*ir20Iq+gnJiScV<_E=J}!jxfOXh4O?uST0MN(M;qB*;Rz6wCto&rCPVXeZ86 zC7n4-$^RCq2nf9MbK8k@u&1BQe@)foMLlQyvZy8FC$%$owKxDi{gmM(PM12SM>Tgh zH^PhDTRWe8hOP0xc{_b@g+p)h!gYu<4!8|-WIO5}A%%GDzst1{N|XD0QD+MSLnETW zs)Bh`{U#ba2i62J2v8idNAzq+AIJ1pU*87#fuK!-X~9&ja!FtnE$pM}u}gILh@@vp z*HNZf*=J|t3g3S_ph^gmM4gf_a-t^5Z1eT~X;%+DI>(2XOi!PTj?$wP-2+oreBlCg zHGRZgTZLX*Q;@AwuPw}_SKyO9mmhj#=^yBvIKU{S@<3c-4 z%d9hlj%D+!)_|bBT3^ZS^h)~MzepEH6d(za@kFh;KCTgO-H3KYjnjvyyeu{OU!1ZL z`OJ{jJ;sI_NB{s)z&)`JX^h0H)42DpA7>FU_D7Ti;+^weaYHQ|8jSHy*fet>52))T zAgfN0<%!2AB9uX*?=YW8iyNWiFz#_8K!F|ry+FWth@OCptlxEKFG={Tt_Ex4&}kyA zxowTF6f~htaCBm_ZtFb5uE^oy@22drp0tE7h3t3%|KKN!%=3gc# z(`+L-CmaI*0U2xl2;wWuF-PKVklC;?iEgff?Q{kQnE_|sTS)xyk)P?xmS%9!39Vw3cFzWD;bSwaW|J-_IcR!4g z3-8^I^kC!{DZ(aeI?B;je%U>QnK_%$TD?v!X^~Np0TYQmT8_e6fe*YxYoAZ-hGBak z_87|qiYhucqOUaICj8I$7dTLUIQyF4aG_{=tb9gwU)+SYJqq0eMyGpj45ulkRCSPI zsS&^f05`g{QWDe_Lvc0b<%k3j5AO5o`WAq0yB1!9_C#j==JKb7#VE{~QC4Rpi(z!D z)$Hi@@6IFV2rN(J9UO;o0~C<(NgMMzu_t_-<;I1uWF zHfw1P^DuMhX3+F>#rFv5V{L&F

Sr2ca7vL+-oiCEMP&N}1>8S85G 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πYxhWkr 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�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 z


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≫Qo#W|J^Le3PJy=Bd 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 JmMJ^c{|}!}Km-5) diff --git a/typegate/tests/runtimes/wasm/rust/build.sh b/typegate/tests/runtimes/wasm/rust/build.sh deleted file mode 100755 index 1820252b2c..0000000000 --- a/typegate/tests/runtimes/wasm/rust/build.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env sh - -set -e - -cargo build --target wasm32-unknown-unknown -wasm-tools component new ./target/wasm32-unknown-unknown/debug/rust.wasm -o ./target/rust-component.wasm -# debug -wasm-tools component wit target/rust-component.wasm - -mv target/rust-component.wasm ../rust.wasm diff --git a/typegate/tests/runtimes/wasm/wasm.ts b/typegate/tests/runtimes/wasm/wasm.ts deleted file mode 100644 index de663b058e..0000000000 --- a/typegate/tests/runtimes/wasm/wasm.ts +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright Metatype OÜ, licensed under the Elastic License 2.0. -// SPDX-License-Identifier: Elastic-2.0 - -import { Policy, t, typegraph } from "@typegraph/sdk"; -import { WasmRuntime } from "@typegraph/sdk/runtimes/wasm.js"; - -export const tg = await typegraph("wasm-ts", (g: any) => { - const pub = Policy.public(); - const wasm = new WasmRuntime(); - const entity = t.struct({ - name: t.string(), - age: t.integer().optional(), - profile: t.struct({ - level: t.enum_(["bronze", "silver", "gold"]), // wit enum - attributes: t.list(t.enum_(["attack", "defend", "cast"])), // wit flags - category: t.struct({ // wit variant - tag: t.enum_(["a", "b", "c"]), - value: t.string().optional(), - }), - metadatas: t.list(t.list(t.either([t.string(), t.float()]))), - }), - }); - - g.expose({ - add: wasm - .fromWasm( - t.struct({ "a": t.float(), "b": t.float() }), - t.integer(), - { func: "add", wasm: "rust.wasm" }, - ).withPolicy(pub), - range: wasm - .fromWasm( - t.struct({ "a": t.integer().optional(), "b": t.integer() }), - t.list(t.integer()), - { func: "range", wasm: "rust.wasm" }, - ).withPolicy(pub), - record: wasm - .fromWasm( - t.struct({}), - t.list(entity), - { func: "record-creation", wasm: "rust.wasm" }, - ).withPolicy(pub), - identity: wasm - .fromWasm( - t.struct({ "arg0": entity }), - entity, - { func: "identity", wasm: "rust.wasm" }, - ).withPolicy(pub), - }); -}); diff --git a/typegate/tests/runtimes/wasm_reflected/rust.wasm b/typegate/tests/runtimes/wasm_reflected/rust.wasm new file mode 100644 index 0000000000000000000000000000000000000000..b60e7749513e19b2b59dadae5ff076181fdcd163 GIT binary patch literal 22545 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 K2~&&rPX8YpGlRAO literal 0 HcmV?d00001 diff --git a/typegate/tests/runtimes/wasm/rust/Cargo.lock b/typegate/tests/runtimes/wasm_reflected/rust/Cargo.lock similarity index 100% rename from typegate/tests/runtimes/wasm/rust/Cargo.lock rename to typegate/tests/runtimes/wasm_reflected/rust/Cargo.lock diff --git a/typegate/tests/runtimes/wasm/rust/Cargo.toml b/typegate/tests/runtimes/wasm_reflected/rust/Cargo.toml similarity index 71% rename from typegate/tests/runtimes/wasm/rust/Cargo.toml rename to typegate/tests/runtimes/wasm_reflected/rust/Cargo.toml index b5cfcea6f8..02d1a7ae28 100644 --- a/typegate/tests/runtimes/wasm/rust/Cargo.toml +++ b/typegate/tests/runtimes/wasm_reflected/rust/Cargo.toml @@ -8,3 +8,7 @@ crate-type = ["cdylib"] [dependencies] wit-bindgen = "0.24.0" + +[profile.release] +strip = "symbols" +opt-level = "z" diff --git a/typegate/tests/runtimes/wasm_reflected/rust/build.sh b/typegate/tests/runtimes/wasm_reflected/rust/build.sh new file mode 100755 index 0000000000..d8b71f06ed --- /dev/null +++ b/typegate/tests/runtimes/wasm_reflected/rust/build.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env sh + +set -e + +cargo build --target wasm32-unknown-unknown --release +wasm-opt -Oz ./target/wasm32-unknown-unknown/release/rust.wasm -o ./target/rust-component.wasm.opt +wasm-tools component new ./target/rust-component.wasm.opt -o ./target/rust-component.wasm +# debug +wasm-tools component wit target/rust-component.wasm + +mv target/rust-component.wasm ../rust.wasm diff --git a/typegate/tests/runtimes/wasm/rust/src/lib.rs b/typegate/tests/runtimes/wasm_reflected/rust/src/lib.rs similarity index 100% rename from typegate/tests/runtimes/wasm/rust/src/lib.rs rename to typegate/tests/runtimes/wasm_reflected/rust/src/lib.rs diff --git a/typegate/tests/runtimes/wasm/rust/wit/example.wit b/typegate/tests/runtimes/wasm_reflected/rust/wit/example.wit similarity index 100% rename from typegate/tests/runtimes/wasm/rust/wit/example.wit rename to typegate/tests/runtimes/wasm_reflected/rust/wit/example.wit diff --git a/typegate/tests/runtimes/wasm/wasm.py b/typegate/tests/runtimes/wasm_reflected/wasm_reflected.py similarity index 90% rename from typegate/tests/runtimes/wasm/wasm.py rename to typegate/tests/runtimes/wasm_reflected/wasm_reflected.py index 634160cca2..feffec7500 100644 --- a/typegate/tests/runtimes/wasm/wasm.py +++ b/typegate/tests/runtimes/wasm_reflected/wasm_reflected.py @@ -16,15 +16,14 @@ @typegraph() -def wasm_py(g: Graph): +def wasm_reflected_py(g: Graph): pub = Policy.public() - wasm = WasmRuntime() + wasm = WasmRuntime.reflected("rust.wasm") g.expose( - test=wasm.from_wasm( + test=wasm.from_export( t.struct({"a": t.float(), "b": t.float()}), t.integer(), - wasm="rust.wasm", func="add", ).with_policy(pub), ) @@ -35,7 +34,7 @@ def wasm_py(g: Graph): gate = f"http://localhost:{PORT}" auth = BasicAuth("admin", "password") -wasm_tg = wasm_py() +wasm_tg = wasm_reflected_py() deploy_result = tg_deploy( wasm_tg, TypegraphDeployParams( diff --git a/typegate/tests/runtimes/wasm_reflected/wasm_reflected.ts b/typegate/tests/runtimes/wasm_reflected/wasm_reflected.ts new file mode 100644 index 0000000000..c3e71e5c81 --- /dev/null +++ b/typegate/tests/runtimes/wasm_reflected/wasm_reflected.ts @@ -0,0 +1,45 @@ +// Copyright Metatype OÜ, licensed under the Elastic License 2.0. +// SPDX-License-Identifier: Elastic-2.0 + +import { Policy, t, typegraph } from "@typegraph/sdk"; +import { WasmRuntime } from "@typegraph/sdk/runtimes/wasm.js"; + +export const tg = await typegraph("wasm-reflected-ts", (g: any) => { + const entity = t.struct({ + name: t.string(), + age: t.integer().optional(), + profile: t.struct({ + level: t.enum_(["bronze", "silver", "gold"]), // wit enum + attributes: t.list(t.enum_(["attack", "defend", "cast"])), // wit flags + category: t.struct({ // wit variant + tag: t.enum_(["a", "b", "c"]), + value: t.string().optional(), + }), + metadatas: t.list(t.list(t.either([t.string(), t.float()]))), + }), + }); + + const wasm = WasmRuntime.reflected("rust.wasm"); + g.expose({ + add: wasm.fromExport( + t.struct({ "a": t.float(), "b": t.float() }), + t.integer(), + { func: "add" }, + ), + range: wasm.fromExport( + t.struct({ "a": t.integer().optional(), "b": t.integer() }), + t.list(t.integer()), + { func: "range" }, + ), + record: wasm.fromExport( + t.struct({}), + t.list(entity), + { func: "record-creation" }, + ), + identity: wasm.fromExport( + t.struct({ "arg0": entity }), + entity, + { func: "identity" }, + ), + }, Policy.public()); +}); diff --git a/typegate/tests/runtimes/wasm/wasm_test.ts b/typegate/tests/runtimes/wasm_reflected/wasm_reflected_test.ts similarity index 92% rename from typegate/tests/runtimes/wasm/wasm_test.ts rename to typegate/tests/runtimes/wasm_reflected/wasm_reflected_test.ts index d33fbd94ce..dfc8a64590 100644 --- a/typegate/tests/runtimes/wasm/wasm_test.ts +++ b/typegate/tests/runtimes/wasm_reflected/wasm_reflected_test.ts @@ -4,20 +4,23 @@ import { BasicAuth, tgDeploy } from "@typegraph/sdk/tg_deploy.js"; import { gql, Meta } from "test-utils/mod.ts"; import { testDir } from "test-utils/dir.ts"; -import { tg } from "./wasm.ts"; +import { tg } from "./wasm_reflected.ts"; import * as path from "std/path/mod.ts"; -const cwd = path.join(testDir, "runtimes/wasm"); +const cwd = path.join(testDir, "runtimes/wasm_reflected"); const auth = new BasicAuth("admin", "password"); Meta.test( { - name: "Wasm runtime", + name: "Wasm runtime: reflected", port: true, systemTypegraphs: true, }, async (t) => { - const e = await t.engineFromTgDeployPython("runtimes/wasm/wasm.py", cwd); + const e = await t.engineFromTgDeployPython( + path.join(cwd, "wasm_reflected.py"), + cwd, + ); await t.should("works", async () => { await gql` @@ -35,7 +38,7 @@ Meta.test( Meta.test( { - name: "Wasm Runtime typescript sdk", + name: "Wasm Runtime typescript sdk: reflected", port: true, systemTypegraphs: true, }, @@ -57,7 +60,7 @@ Meta.test( }, dir: cwd, }, - typegraphPath: path.join(cwd, "wasm.ts"), + typegraphPath: path.join(cwd, "wasm_reflected.ts"), secrets: {}, }); diff --git a/typegate/tests/runtimes/wasm_reflected/wasm_sync_test.ts b/typegate/tests/runtimes/wasm_reflected/wasm_sync_test.ts new file mode 100644 index 0000000000..e7159da3dd --- /dev/null +++ b/typegate/tests/runtimes/wasm_reflected/wasm_sync_test.ts @@ -0,0 +1,166 @@ +// Copyright Metatype OÜ, licensed under the Elastic License 2.0. +// SPDX-License-Identifier: Elastic-2.0 + +import { BasicAuth, tgDeploy, tgRemove } from "@typegraph/sdk/tg_deploy.js"; +import { gql, Meta } from "test-utils/mod.ts"; +import { testDir } from "test-utils/dir.ts"; +import { tg } from "./wasm_reflected.ts"; +import * as path from "std/path/mod.ts"; +import { connect } from "redis"; +import { S3Client } from "aws-sdk/client-s3"; +import { createBucket, listObjects, tryDeleteBucket } from "test-utils/s3.ts"; +import { assertEquals, assertExists } from "std/assert/mod.ts"; + +const redisKey = "typegraph"; +const redisEventKey = "typegraph_event"; + +async function cleanUp() { + using redis = await connect(syncConfig.redis); + await redis.del(redisKey); + await redis.del(redisEventKey); + + const s3 = new S3Client(syncConfig.s3); + await tryDeleteBucket(s3, syncConfig.s3Bucket); + await createBucket(s3, syncConfig.s3Bucket); + s3.destroy(); + await redis.quit(); +} + +const syncConfig = { + redis: { + hostname: "localhost", + port: 6379, + password: "password", + db: 1, + }, + s3: { + endpoint: "http://localhost:9000", + region: "local", + credentials: { + accessKeyId: "minio", + secretAccessKey: "password", + }, + forcePathStyle: true, + }, + s3Bucket: "metatype-sync-test", +}; + +const cwd = path.join(testDir, "runtimes/wasm_reflected"); +const auth = new BasicAuth("admin", "password"); + +Meta.test( + { + name: "Wasm Runtime typescript SDK: Sync Config", + port: true, + systemTypegraphs: true, + syncConfig, + async setup() { + await cleanUp(); + }, + async teardown() { + await cleanUp(); + }, + }, + async (metaTest) => { + const port = metaTest.port; + const gate = `http://localhost:${port}`; + + const { serialized, typegate: gateResponseAdd } = await tgDeploy(tg, { + baseUrl: gate, + auth, + artifactsConfig: { + prismaMigration: { + globalAction: { + create: true, + reset: false, + }, + migrationDir: "prisma-migrations", + }, + dir: cwd, + }, + typegraphPath: path.join(cwd, "wasm_reflected.ts"), + secrets: {}, + }); + + await metaTest.should("work after deploying artifact to S3", async () => { + const s3 = new S3Client(syncConfig.s3); + assertEquals((await listObjects(s3, syncConfig.s3Bucket))?.length, 2); + + assertExists(serialized, "serialized has a value"); + assertEquals(gateResponseAdd, { + data: { + addTypegraph: { + name: "wasm-reflected-ts", + messages: [], + migrations: [], + }, + }, + }); + + const s3Objects = await listObjects(s3, syncConfig.s3Bucket); + // two objects, the artifact and the typegraph + assertEquals(s3Objects?.length, 2); + + const engine = await metaTest.engineFromDeployed(serialized); + + await gql` + query { + add(a: 11, b: 2) + range(a: 1, b: 4) + } + ` + .expectData({ + add: 13, + range: [1, 2, 3, 4], + }) + .on(engine); + + s3.destroy(); + }); + + await metaTest.should("work with multiple typegate instances", async () => { + const s3 = new S3Client(syncConfig.s3); + + // typegraphs are pushed to s3 whenever pushed to a typegate + assertEquals((await listObjects(s3, syncConfig.s3Bucket))?.length, 3); + + const engine = await metaTest.engineFromDeployed(serialized); + + await gql` + query { + add(a: 11, b: 2) + range(a: 1, b: 4) + } + ` + .expectData({ + add: 13, + range: [1, 2, 3, 4], + }) + .on(engine); + + // second engine on the other typegate instance + const engine2 = await metaTest.engineFromDeployed(serialized); + + await gql` + query { + add(a: 11, b: 2) + range(a: 1, b: 4) + } + ` + .expectData({ + add: 13, + range: [1, 2, 3, 4], + }) + .on(engine2); + + const { typegate: gateResponseRem } = await tgRemove(tg, { + baseUrl: gate, + auth, + }); + + assertEquals(gateResponseRem, { data: { removeTypegraphs: true } }); + + s3.destroy(); + }); + }, +); diff --git a/typegate/tests/runtimes/wasm_wire/rust.wasm b/typegate/tests/runtimes/wasm_wire/rust.wasm new file mode 100644 index 0000000000000000000000000000000000000000..3c60a8fce9e0ab7d13aeb5a17dc021728787defb GIT binary patch literal 183920 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

hg+Dj_qw{j~j0&dBYi}y5 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�=^8Z(5a$a@w2`C+ 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 literal 0 HcmV?d00001 diff --git a/typegate/tests/runtimes/wasm_wire/rust/Cargo.lock b/typegate/tests/runtimes/wasm_wire/rust/Cargo.lock new file mode 100644 index 0000000000..264d53ad93 --- /dev/null +++ b/typegate/tests/runtimes/wasm_wire/rust/Cargo.lock @@ -0,0 +1,314 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "anyhow" +version = "1.0.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" + +[[package]] +name = "bitflags" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "id-arena" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" + +[[package]] +name = "indexmap" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +dependencies = [ + "equivalent", + "hashbrown", + "serde", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "leb128" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" + +[[package]] +name = "log" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" + +[[package]] +name = "proc-macro2" +version = "1.0.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rust" +version = "0.0.1" +dependencies = [ + "anyhow", + "serde", + "serde_json", + "wit-bindgen", +] + +[[package]] +name = "ryu" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" + +[[package]] +name = "semver" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" + +[[package]] +name = "serde" +version = "1.0.198" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.198" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.116" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "spdx" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29ef1a0fa1e39ac22972c8db23ff89aea700ab96aa87114e1fb55937a631a0c9" +dependencies = [ + "smallvec", +] + +[[package]] +name = "syn" +version = "2.0.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-segmentation" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "wasm-encoder" +version = "0.201.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9c7d2731df60006819b013f64ccc2019691deccf6e11a1804bc850cd6748f1a" +dependencies = [ + "leb128", +] + +[[package]] +name = "wasm-metadata" +version = "0.201.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fd83062c17b9f4985d438603cde0a5e8c5c8198201a6937f778b607924c7da2" +dependencies = [ + "anyhow", + "indexmap", + "serde", + "serde_derive", + "serde_json", + "spdx", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasmparser" +version = "0.201.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84e5df6dba6c0d7fafc63a450f1738451ed7a0b52295d83e868218fa286bf708" +dependencies = [ + "bitflags", + "indexmap", + "semver", +] + +[[package]] +name = "wit-bindgen" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "288f992ea30e6b5c531b52cdd5f3be81c148554b09ea416f058d16556ba92c27" +dependencies = [ + "bitflags", + "wit-bindgen-rt", + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e85e72719ffbccf279359ad071497e47eb0675fe22106dea4ed2d8a7fcb60ba4" +dependencies = [ + "anyhow", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb8738270f32a2d6739973cbbb7c1b6dd8959ce515578a6e19165853272ee64" + +[[package]] +name = "wit-bindgen-rust" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a39a15d1ae2077688213611209849cad40e9e5cccf6e61951a425850677ff3" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d376d3ae5850526dfd00d937faea0d81a06fa18f7ac1e26f386d760f241a8f4b" +dependencies = [ + "anyhow", + "proc-macro2", + "quote", + "syn", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.201.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "421c0c848a0660a8c22e2fd217929a0191f14476b68962afd2af89fd22e39825" +dependencies = [ + "anyhow", + "bitflags", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.201.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "196d3ecfc4b759a8573bf86a9b3f8996b304b3732e4c7de81655f875f6efdca6" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] diff --git a/typegate/tests/runtimes/wasm_wire/rust/Cargo.toml b/typegate/tests/runtimes/wasm_wire/rust/Cargo.toml new file mode 100644 index 0000000000..2ea6289527 --- /dev/null +++ b/typegate/tests/runtimes/wasm_wire/rust/Cargo.toml @@ -0,0 +1,18 @@ +package.name = "rust" +package.edition = "2021" +package.version = "0.0.1" + +[lib] +path = "lib.rs" +crate-type = ["cdylib", "rlib"] + +[dependencies] +anyhow = "1" +serde = { version = "1", features = ["derive"] } +serde_json = "1" +# TODO: update typegraph_core bindgen version +wit-bindgen = "0.22.0" + +[profile.release] +strip = "symbols" +opt-level = "z" diff --git a/typegate/tests/runtimes/wasm_wire/rust/build.sh b/typegate/tests/runtimes/wasm_wire/rust/build.sh new file mode 100755 index 0000000000..144d454112 --- /dev/null +++ b/typegate/tests/runtimes/wasm_wire/rust/build.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env sh + +set -e + +pushd .. +cargo run -p meta-cli -- gen mdk wasm_wire +popd +cargo build --target wasm32-unknown-unknown --release +wasm-opt -Oz ./target/wasm32-unknown-unknown/release/rust.wasm -o ./target/rust-component.wasm.opt +wasm-tools component new ./target/rust-component.wasm.opt -o ./target/rust-component.wasm +# debug +wasm-tools component wit target/rust-component.wasm + +mv target/rust-component.wasm ../rust.wasm diff --git a/typegate/tests/runtimes/wasm_wire/rust/lib.rs b/typegate/tests/runtimes/wasm_wire/rust/lib.rs new file mode 100644 index 0000000000..44d512051c --- /dev/null +++ b/typegate/tests/runtimes/wasm_wire/rust/lib.rs @@ -0,0 +1,77 @@ +// Copyright Metatype OÜ, licensed under the Elastic License 2.0. +// SPDX-License-Identifier: Elastic-2.0 + +mod mdk; +use mdk::*; + +init_mat! { + hook: || { + // initialize global stuff here if you need it + MatBuilder::new() + // register function handlers here + .register_handler(stubs::Identity::erased(MyMat)) + .register_handler(stubs::Add::erased(MyMat)) + .register_handler(stubs::Range::erased(MyMat)) + .register_handler(stubs::RecordCreation::erased(MyMat)) + } +} + +struct MyMat; + +impl stubs::Identity for MyMat { + fn handle(&self, input: types::Entity, _cx: Ctx) -> anyhow::Result { + Ok(input) + } +} + +impl stubs::Add for MyMat { + fn handle(&self, input: types::AddArgs, _cx: Ctx) -> anyhow::Result { + Ok((input.a + input.b) as _) + } +} +impl stubs::Range for MyMat { + fn handle(&self, input: types::RangeArgs, _cx: Ctx) -> anyhow::Result> { + let a = input.a.unwrap_or(1); + let b = input.b; + if a > b { + anyhow::bail!("invalid range: {a} > {b}"); + } + Ok(Vec::from_iter(a..=b)) + } +} + +impl stubs::RecordCreation for MyMat { + fn handle(&self, _input: types::Object35, _cx: Ctx) -> anyhow::Result { + Ok(vec![ + types::Entity { + name: "Entity A".into(), + age: None, + profile: types::Profile { + category: types::Object9 { + tag: "a".into(), + value: None, + }, + level: "bronze".into(), + metadatas: vec![vec![ + types::Either12::String("strength".into()), + types::Either12::F64(3.14), + ]], + attributes: vec!["defend".into()], + }, + }, + types::Entity { + name: "Entity B".into(), + age: Some(11), + profile: types::Profile { + category: types::Object9 { + tag: "b".into(), + value: Some("bbb".into()), + }, + level: "gold".into(), + metadatas: vec![], + attributes: vec![format!("attack"), format!("defend"), format!("cast")], + }, + }, + ]) + } +} diff --git a/typegate/tests/runtimes/wasm_wire/rust/mdk.rs b/typegate/tests/runtimes/wasm_wire/rust/mdk.rs new file mode 100644 index 0000000000..84bc0864f7 --- /dev/null +++ b/typegate/tests/runtimes/wasm_wire/rust/mdk.rs @@ -0,0 +1,310 @@ +// This file was @generated by metagen and is intended +// to be generated again on subsequent metagen runs. +#![cfg_attr(rustfmt, rustfmt_skip)] + +// gen-static-start +#![allow(unused)] + +pub mod wit { + wit_bindgen::generate!({ + pub_export_macro: true, + + inline: "package metatype:wit-wire; + +interface typegate-wire { + hostcall: func(req: tuple) -> result; +} + +interface mat-wire { + type json-str = string; + + record mat-info { + op-name: string, + mat-title: string, + mat-hash: string, + mat-data-json: string, + } + + record init-args { + metatype-version: string, + expected-ops: list + } + + record init-response { + ok: bool + } + + variant init-error { + version-mismatch(string), + unexpected-mat(mat-info), + other(string) + } + + init: func(args: init-args) -> result; + + record handle-req { + op-name: string, + in-json: json-str, + } + + variant handle-err { + no-handler, + in-json-err(string), + handler-err(string), + } + + handle: func(req: handle-req) -> result; +} + +world wit-wire { + import typegate-wire; + export mat-wire; +} +" + }); +} + +use std::cell::RefCell; +use std::collections::HashMap; + +use anyhow::Context; + +use wit::exports::metatype::wit_wire::mat_wire::*; + +pub type HandlerFn = Box Result>; + +pub struct ErasedHandler { + mat_id: String, + mat_trait: String, + mat_title: String, + handler_fn: HandlerFn, +} + +pub struct MatBuilder { + handlers: HashMap, +} + +impl MatBuilder { + pub fn new() -> Self { + Self { + handlers: Default::default(), + } + } + + pub fn register_handler(mut self, handler: ErasedHandler) -> Self { + self.handlers.insert(handler.mat_trait.clone(), handler); + self + } +} + +pub struct Router { + handlers: HashMap, +} + +impl Router { + pub fn from_builder(builder: MatBuilder) -> Self { + Self { + handlers: builder.handlers, + } + } + + pub fn init(&self, args: InitArgs) -> Result { + static MT_VERSION: &str = "0.3.7-0"; + if args.metatype_version != MT_VERSION { + return Err(InitError::VersionMismatch(MT_VERSION.into())); + } + for info in args.expected_ops { + let mat_trait = stubs::op_to_trait_name(&info.op_name); + if !self.handlers.contains_key(mat_trait) { + return Err(InitError::UnexpectedMat(info)); + } + } + Ok(InitResponse { ok: true }) + } + + pub fn handle(&self, req: HandleReq) -> Result { + let mat_trait = stubs::op_to_trait_name(&req.op_name); + let Some(handler) = self.handlers.get(mat_trait) else { + return Err(HandleErr::NoHandler); + }; + let cx = Ctx { + gql: GraphqlClient {}, + }; + (handler.handler_fn)(&req.in_json, cx) + } +} + +pub type InitCallback = fn() -> anyhow::Result; + +thread_local! { + pub static MAT_STATE: RefCell = panic!("MDK_STATE has not been initialized"); +} + +pub struct Ctx { + gql: GraphqlClient, +} + +pub struct GraphqlClient {} + +#[macro_export] +macro_rules! init_mat { + (hook: $init_hook:expr) => { + struct MatWireGuest; + use wit::exports::metatype::wit_wire::mat_wire::*; + wit::export!(MatWireGuest with_types_in wit); + + #[allow(unused)] + impl Guest for MatWireGuest { + fn handle(req: HandleReq) -> Result { + MAT_STATE.with(|router| { + let router = router.borrow(); + router.handle(req) + }) + } + + fn init(args: InitArgs) -> Result { + let hook = $init_hook; + let router = Router::from_builder(hook()); + let resp = router.init(args)?; + MAT_STATE.set(router); + Ok(resp) + } + } + }; +} +// gen-static-end +use types::*; +pub mod types { + use super::*; + #[derive(Debug, serde::Serialize, serde::Deserialize)] + pub struct AddArgs { + pub a: f64, + pub b: f64, + } + #[derive(Debug, serde::Serialize, serde::Deserialize)] + pub struct RangeArgs { + pub a: Option, + pub b: i64, + } + #[derive(Debug, serde::Serialize, serde::Deserialize)] + pub struct Object35 { + } + #[derive(Debug, serde::Serialize, serde::Deserialize)] + pub struct Object9 { + pub tag: String, + pub value: Option, + } + #[derive(Debug, serde::Serialize, serde::Deserialize)] + #[serde(untagged)] + pub enum Either12 { + String(String), + F64(f64), + } + #[derive(Debug, serde::Serialize, serde::Deserialize)] + pub struct Profile { + pub level: String, + pub attributes: Vec, + pub category: Object9, + pub metadatas: Vec>, + } + #[derive(Debug, serde::Serialize, serde::Deserialize)] + pub struct Entity { + pub name: String, + pub age: Option, + pub profile: Profile, + } + pub type Entity36 = Vec; +} +use stubs::*; +pub mod stubs { + use super::*; + pub trait Add: Sized + 'static { + fn erased(self) -> ErasedHandler { + ErasedHandler { + mat_id: "add".into(), + mat_title: "add".into(), + mat_trait: "Add".into(), + handler_fn: Box::new(move |req, cx| { + let req = serde_json::from_str(req) + .map_err(|err| HandleErr::InJsonErr(format!("{err}")))?; + let res = self + .handle(req, cx) + .map_err(|err| HandleErr::HandlerErr(format!("{err}")))?; + serde_json::to_string(&res) + .map_err(|err| HandleErr::HandlerErr(format!("{err}"))) + }), + } + } + + fn handle(&self, input: AddArgs, cx: Ctx) -> anyhow::Result; + } + pub trait Range: Sized + 'static { + fn erased(self) -> ErasedHandler { + ErasedHandler { + mat_id: "range".into(), + mat_title: "range".into(), + mat_trait: "Range".into(), + handler_fn: Box::new(move |req, cx| { + let req = serde_json::from_str(req) + .map_err(|err| HandleErr::InJsonErr(format!("{err}")))?; + let res = self + .handle(req, cx) + .map_err(|err| HandleErr::HandlerErr(format!("{err}")))?; + serde_json::to_string(&res) + .map_err(|err| HandleErr::HandlerErr(format!("{err}"))) + }), + } + } + + fn handle(&self, input: RangeArgs, cx: Ctx) -> anyhow::Result>; + } + pub trait RecordCreation: Sized + 'static { + fn erased(self) -> ErasedHandler { + ErasedHandler { + mat_id: "record-creation".into(), + mat_title: "record-creation".into(), + mat_trait: "RecordCreation".into(), + handler_fn: Box::new(move |req, cx| { + let req = serde_json::from_str(req) + .map_err(|err| HandleErr::InJsonErr(format!("{err}")))?; + let res = self + .handle(req, cx) + .map_err(|err| HandleErr::HandlerErr(format!("{err}")))?; + serde_json::to_string(&res) + .map_err(|err| HandleErr::HandlerErr(format!("{err}"))) + }), + } + } + + fn handle(&self, input: Object35, cx: Ctx) -> anyhow::Result; + } + pub trait Identity: Sized + 'static { + fn erased(self) -> ErasedHandler { + ErasedHandler { + mat_id: "identity".into(), + mat_title: "identity".into(), + mat_trait: "Identity".into(), + handler_fn: Box::new(move |req, cx| { + let req = serde_json::from_str(req) + .map_err(|err| HandleErr::InJsonErr(format!("{err}")))?; + let res = self + .handle(req, cx) + .map_err(|err| HandleErr::HandlerErr(format!("{err}")))?; + serde_json::to_string(&res) + .map_err(|err| HandleErr::HandlerErr(format!("{err}"))) + }), + } + } + + fn handle(&self, input: Entity, cx: Ctx) -> anyhow::Result; + } + pub fn op_to_trait_name(op_name: &str) -> &'static str { + match op_name { + "add" => "Add", + "record-creation" => "RecordCreation", + "range" => "Range", + "identity" => "Identity", + _ => panic!("unrecognized op_name: {op_name}"), + } + } +} diff --git a/typegate/tests/runtimes/wasm/wasm_sync_test.ts b/typegate/tests/runtimes/wasm_wire/wasm_sync_test.ts similarity index 93% rename from typegate/tests/runtimes/wasm/wasm_sync_test.ts rename to typegate/tests/runtimes/wasm_wire/wasm_sync_test.ts index 34f72aedf2..18e9e18ccb 100644 --- a/typegate/tests/runtimes/wasm/wasm_sync_test.ts +++ b/typegate/tests/runtimes/wasm_wire/wasm_sync_test.ts @@ -4,7 +4,7 @@ import { BasicAuth, tgDeploy, tgRemove } from "@typegraph/sdk/tg_deploy.js"; import { gql, Meta } from "test-utils/mod.ts"; import { testDir } from "test-utils/dir.ts"; -import { tg } from "./wasm.ts"; +import { tg } from "./wasm_wire.ts"; import * as path from "std/path/mod.ts"; import { connect } from "redis"; import { S3Client } from "aws-sdk/client-s3"; @@ -45,7 +45,7 @@ const syncConfig = { s3Bucket: "metatype-sync-test", }; -const cwd = path.join(testDir, "runtimes/wasm"); +const cwd = path.join(testDir, "runtimes/wasm_wire"); const auth = new BasicAuth("admin", "password"); Meta.test( @@ -78,7 +78,7 @@ Meta.test( }, dir: cwd, }, - typegraphPath: path.join(cwd, "wasm.ts"), + typegraphPath: path.join(cwd, "wasm_wire.ts"), secrets: {}, }); @@ -89,7 +89,11 @@ Meta.test( assertExists(serialized, "serialized has a value"); assertEquals(gateResponseAdd, { data: { - addTypegraph: { name: "wasm-ts", messages: [], migrations: [] }, + addTypegraph: { + name: "wasm-wire-ts", + messages: [], + migrations: [], + }, }, }); diff --git a/typegate/tests/runtimes/wasm_wire/wasm_wire.py b/typegate/tests/runtimes/wasm_wire/wasm_wire.py new file mode 100644 index 0000000000..260cbe73f4 --- /dev/null +++ b/typegate/tests/runtimes/wasm_wire/wasm_wire.py @@ -0,0 +1,58 @@ +import os +import sys + +from typegraph.gen.exports.core import ( + ArtifactResolutionConfig, + MigrationAction, + MigrationConfig, +) +from typegraph.graph.shared_types import BasicAuth +from typegraph.graph.tg_deploy import TypegraphDeployParams, tg_deploy +from typegraph.graph.typegraph import Graph +from typegraph.policy import Policy +from typegraph.runtimes.wasm import WasmRuntime + +from typegraph import t, typegraph + + +@typegraph() +def wasm_wire_py(g: Graph): + wasm = WasmRuntime.wire("rust.wasm") + + g.expose( + Policy.public(), + test=wasm.handler( + t.struct({"a": t.float(), "b": t.float()}).rename("add_args"), + t.integer(), + func="add", + ).rename("add"), + ) + + +cwd = sys.argv[1] +PORT = sys.argv[2] +gate = f"http://localhost:{PORT}" +auth = BasicAuth("admin", "password") + +wasm_tg = wasm_wire_py() +deploy_result = tg_deploy( + wasm_tg, + TypegraphDeployParams( + base_url=gate, + auth=auth, + typegraph_path=os.path.join(cwd, "wasm.py"), + artifacts_config=ArtifactResolutionConfig( + dir=cwd, + prefix=None, + disable_artifact_resolution=None, + codegen=None, + prisma_migration=MigrationConfig( + migration_dir="prisma-migrations", + global_action=MigrationAction(reset=False, create=True), + runtime_actions=None, + ), + ), + ), +) + +print(deploy_result.serialized) diff --git a/typegate/tests/runtimes/wasm_wire/wasm_wire.ts b/typegate/tests/runtimes/wasm_wire/wasm_wire.ts new file mode 100644 index 0000000000..10c6f36040 --- /dev/null +++ b/typegate/tests/runtimes/wasm_wire/wasm_wire.ts @@ -0,0 +1,47 @@ +// Copyright Metatype OÜ, licensed under the Elastic License 2.0. +// SPDX-License-Identifier: Elastic-2.0 + +import { Policy, t, typegraph } from "@typegraph/sdk"; +import { WasmRuntime } from "@typegraph/sdk/runtimes/wasm.js"; + +export const tg = await typegraph("wasm-wire-ts", (g: any) => { + const entity = t.struct({ + name: t.string(), + age: t.integer().optional(), + profile: t.struct({ + level: t.enum_(["bronze", "silver", "gold"]), // wit enum + attributes: t.list(t.enum_(["attack", "defend", "cast"])), // wit flags + category: t.struct({ // wit variant + tag: t.enum_(["a", "b", "c"]), + value: t.string().optional(), + }), + metadatas: t.list(t.list(t.either([t.string(), t.float()]))), + }).rename("profile"), + }).rename("entity"); + + const wasm = WasmRuntime.wire("rust.wasm"); + g.expose({ + add: wasm.handler( + t.struct({ "a": t.float(), "b": t.float() }).rename("add_args"), + t.integer(), + { func: "add" }, + ).rename("add"), + range: wasm.handler( + t.struct({ "a": t.integer().optional(), "b": t.integer() }).rename( + "range_args", + ), + t.list(t.integer()), + { func: "range" }, + ).rename("range"), + record: wasm.handler( + t.struct({}), + t.list(entity), + { func: "record-creation" }, + ).rename("record-creation"), + identity: wasm.handler( + entity, + entity, + { func: "identity" }, + ).rename("identity"), + }, Policy.public()); +}); diff --git a/typegate/tests/runtimes/wasm_wire/wasm_wire_test.ts b/typegate/tests/runtimes/wasm_wire/wasm_wire_test.ts new file mode 100644 index 0000000000..11970ec741 --- /dev/null +++ b/typegate/tests/runtimes/wasm_wire/wasm_wire_test.ts @@ -0,0 +1,189 @@ +// Copyright Metatype OÜ, licensed under the Elastic License 2.0. +// SPDX-License-Identifier: Elastic-2.0 +import { BasicAuth, tgDeploy } from "@typegraph/sdk/tg_deploy.js"; +import { gql, Meta } from "test-utils/mod.ts"; +import { testDir } from "test-utils/dir.ts"; +import { tg } from "./wasm_wire.ts"; +import * as path from "std/path/mod.ts"; + +const cwd = path.join(testDir, "runtimes/wasm_wire"); +const auth = new BasicAuth("admin", "password"); + +Meta.test( + { + name: "Wasm runtime: wire", + port: true, + systemTypegraphs: true, + }, + async (t) => { + const e = await t.engineFromTgDeployPython( + path.join(cwd, "wasm_wire.py"), + cwd, + ); + + await t.should("works", async () => { + await gql` + query { + test(a: 1, b: 2) + } + ` + .expectData({ + test: 3, + }) + .on(e); + }); + }, +); + +Meta.test( + { + name: "Wasm Runtime typescript sdk: wire", + port: true, + systemTypegraphs: true, + }, + async (metaTest) => { + const port = metaTest.port; + const gate = `http://localhost:${port}`; + + await metaTest.should("work after deploying artifact", async (t) => { + const { serialized, typegate: _gateResponseAdd } = await tgDeploy(tg, { + baseUrl: gate, + auth, + artifactsConfig: { + prismaMigration: { + globalAction: { + create: true, + reset: false, + }, + migrationDir: "prisma-migrations", + }, + dir: cwd, + }, + typegraphPath: path.join(cwd, "wasm_wire.ts"), + secrets: {}, + }); + + const engine = await metaTest.engineFromDeployed(serialized); + + await t.step("wit bindings", async () => { + await gql` + query { + add(a: 11, b: 2) + range(a: 1, b: 4) + } + ` + .expectData({ + add: 13, + range: [1, 2, 3, 4], + }) + .on(engine); + }); + + await t.step("wit error should propagate gracefully", async () => { + await gql` + query { + range(a: 100, b: 1) + } + ` + .expectErrorContains("invalid range: 100 > 1") + .on(engine); + }); + + await t.step( + "nested wit output value should deserialize properly", + async () => { + await gql` + query { + record { + name + age + profile { + level + attributes + category { + tag + value + } + metadatas + } + } + } + ` + .expectData({ + record: [ + { + name: "Entity A", + age: null, + profile: { + attributes: ["defend"], + level: "bronze", + category: { tag: "a", value: null }, + metadatas: [["strength", 3.14]], + }, + }, + { + name: "Entity B", + age: 11, + profile: { + attributes: ["attack", "defend", "cast"], + level: "gold", + category: { tag: "b", value: "bbb" }, + metadatas: [], + }, + }, + ], + }) + .on(engine); + }, + ); + + await t.step("support nested wit input", async () => { + await gql` + query { + identity( + name: "Monster A" + age: null + profile: { + attributes: ["attack", "defend"] + level: "gold" + # category: { tag: "a", value: "unexpected" }, # fail! + category: { tag: "b", value: "payload" } + metadatas: [["a", 1.0], ["b", 1.3]] # list> + } + ) { + name + age + profile { + level + attributes + category { + tag + value + } + metadatas + } + } + } + ` + .expectData({ + identity: { + name: "Monster A", + age: null, + profile: { + attributes: ["attack", "defend"], + level: "gold", + category: { tag: "b", value: "payload" }, + metadatas: [ + ["a", 1.0], + ["b", 1.3], + ], + }, + }, + }) + .on(engine); + }); + + await engine.terminate(); + }); + }, +); diff --git a/typegate/tests/utils/bindings_test.ts b/typegate/tests/utils/bindings_test.ts index 62985c71ad..971a3181b9 100644 --- a/typegate/tests/utils/bindings_test.ts +++ b/typegate/tests/utils/bindings_test.ts @@ -151,7 +151,7 @@ Deno.test("typegraphValidate", () => { Deno.test("Wasm Wit", async () => { const input: WasmInput = { - wasm: "typegate/tests/runtimes/wasm/rust.wasm", + wasm: "typegate/tests/runtimes/wasm_reflected/rust.wasm", func: "add", args: [JSON.stringify(1), JSON.stringify(2)], }; diff --git a/typegate/tests/utils/shell.ts b/typegate/tests/utils/shell.ts index 30aa22a6aa..da868d0393 100644 --- a/typegate/tests/utils/shell.ts +++ b/typegate/tests/utils/shell.ts @@ -33,7 +33,6 @@ async function readOutput(p: Deno.ChildProcess): Promise { })(), ]); const status = await p.status; - console.log(status); return { stdout, stderr, code: status.code }; } diff --git a/typegraph/core/src/conversion/runtimes.rs b/typegraph/core/src/conversion/runtimes.rs index 3fee68fd9a..869b3a9059 100644 --- a/typegraph/core/src/conversion/runtimes.rs +++ b/typegraph/core/src/conversion/runtimes.rs @@ -316,15 +316,17 @@ impl MaterializerConverter for WasmMaterializer { effect: WitEffect, ) -> Result { let runtime = c.register_runtime(runtime_id)?; - let WasmMaterializer::Module(mat) = self; + let (name, func_name) = match &self { + WasmMaterializer::ReflectedFunc(func) => ("wasm_reflected_func", &func.func_name[..]), + WasmMaterializer::WireHandler(handler) => ("wasm_wire_handler", &handler.func_name[..]), + }; let data = serde_json::from_value(json!({ - "wasmArtifact": mat.wasm_artifact, - "func": mat.func_name, + "op_name": func_name, })) .map_err(|e| e.to_string())?; - let name = "wasm".to_string(); + let name = name.to_string(); Ok(Materializer { name, runtime, @@ -434,7 +436,14 @@ pub fn convert_runtime(_c: &mut TypegraphContext, runtime: Runtime) -> Result Ok(TGRuntime::Known(Rt::Wasm(WasmRuntimeData { config: None })).into()), + Runtime::WasmReflected(data) => Ok(TGRuntime::Known(Rt::WasmReflected(WasmRuntimeData { + wasm_artifact: std::path::PathBuf::from(&data.wasm_artifact), + })) + .into()), + Runtime::WasmWire(data) => Ok(TGRuntime::Known(Rt::WasmWire(WasmRuntimeData { + wasm_artifact: std::path::PathBuf::from(&data.wasm_artifact), + })) + .into()), Runtime::Prisma(d, _) => Ok(ConvertedRuntime::Lazy(Box::new( move |runtime_id, runtime_idx, tg| -> Result<_> { let ctx = get_prisma_context(runtime_id); diff --git a/typegraph/core/src/runtimes/mod.rs b/typegraph/core/src/runtimes/mod.rs index 81952519d4..ad0953083d 100644 --- a/typegraph/core/src/runtimes/mod.rs +++ b/typegraph/core/src/runtimes/mod.rs @@ -28,7 +28,7 @@ use crate::wit::core::{FuncParams, MaterializerId, RuntimeId, TypeId as CoreType use crate::wit::runtimes::{ self as wit, BaseMaterializer, Error as TgError, GraphqlRuntimeData, HttpRuntimeData, MaterializerHttpRequest, PrismaLinkData, PrismaMigrationOperation, PrismaRuntimeData, - RandomRuntimeData, TemporalOperationData, TemporalRuntimeData, + RandomRuntimeData, TemporalOperationData, TemporalRuntimeData, WasmRuntimeData, }; use crate::{typegraph::TypegraphContext, wit::runtimes::Effect as WitEffect}; use enum_dispatch::enum_dispatch; @@ -57,7 +57,8 @@ pub enum Runtime { Http(Rc), Python, Random(Rc), - Wasm, + WasmWire(Rc), + WasmReflected(Rc), Prisma(Rc, Rc>), PrismaMigration, Temporal(Rc), @@ -175,7 +176,7 @@ pub enum MaterializerData { Http(Rc), Python(Rc), Random(Rc), - WasmEdge(Rc), + Wasm(Rc), Prisma(Rc), PrismaMigration(PrismaMigrationOperation), Temporal(Rc), @@ -355,15 +356,39 @@ impl crate::wit::runtimes::Guest for crate::Lib { Ok(Store::register_materializer(mat)) } - fn register_wasm_runtime() -> Result { - Ok(Store::register_runtime(Runtime::Wasm)) + fn register_wasm_reflected_runtime( + data: wit::WasmRuntimeData, + ) -> Result { + Ok(Store::register_runtime(Runtime::WasmReflected(data.into()))) } - fn from_wasm_module( + fn register_wasm_wire_runtime( + data: wit::WasmRuntimeData, + ) -> Result { + Ok(Store::register_runtime(Runtime::WasmWire(data.into()))) + } + + fn from_wasm_reflected_func( + base: wit::BaseMaterializer, + data: wit::MaterializerWasmReflectedFunc, + ) -> Result { + let mat = Materializer::wasm( + base.runtime, + WasmMaterializer::ReflectedFunc(data), + base.effect, + ); + Ok(Store::register_materializer(mat)) + } + + fn from_wasm_wire_handler( base: wit::BaseMaterializer, - data: wit::MaterializerWasm, + data: wit::MaterializerWasmWireHandler, ) -> Result { - let mat = Materializer::wasm(base.runtime, WasmMaterializer::Module(data), base.effect); + let mat = Materializer::wasm( + base.runtime, + WasmMaterializer::WireHandler(data), + base.effect, + ); Ok(Store::register_materializer(mat)) } @@ -390,14 +415,14 @@ impl crate::wit::runtimes::Guest for crate::Lib { prisma_op!(runtime, model, Aggregate, "aggregate") } - fn prisma_group_by(runtime: RuntimeId, model: CoreTypeId) -> Result { - prisma_op!(runtime, model, GroupBy, "groupBy") - } - fn prisma_count(runtime: RuntimeId, model: CoreTypeId) -> Result { prisma_op!(runtime, model, Count, "count") } + fn prisma_group_by(runtime: RuntimeId, model: CoreTypeId) -> Result { + prisma_op!(runtime, model, GroupBy, "groupBy") + } + fn prisma_create_one(runtime: RuntimeId, model: CoreTypeId) -> Result { prisma_op!( runtime, diff --git a/typegraph/core/src/runtimes/wasm.rs b/typegraph/core/src/runtimes/wasm.rs index df68ba8bb4..dc92261af4 100644 --- a/typegraph/core/src/runtimes/wasm.rs +++ b/typegraph/core/src/runtimes/wasm.rs @@ -5,5 +5,6 @@ use crate::wit::runtimes as wit; #[derive(Debug)] pub enum WasmMaterializer { - Module(wit::MaterializerWasm), + ReflectedFunc(wit::MaterializerWasmReflectedFunc), + WireHandler(wit::MaterializerWasmWireHandler), } diff --git a/typegraph/core/src/utils/postprocess/python_rt.rs b/typegraph/core/src/utils/postprocess/python_rt.rs index 0db7ff017f..fb6c33632c 100644 --- a/typegraph/core/src/utils/postprocess/python_rt.rs +++ b/typegraph/core/src/utils/postprocess/python_rt.rs @@ -28,7 +28,7 @@ impl PostProcessor for PythonProcessor { let python_module_path = fs_host::make_absolute(&path)?; - let (module_hash, size) = fs_host::hash_file(&python_module_path.clone())?; + let (module_hash, size) = fs_host::hash_file(&python_module_path)?; tg.deps.push(python_module_path); tg.meta.artifacts.insert( diff --git a/typegraph/core/src/utils/postprocess/wasm_rt.rs b/typegraph/core/src/utils/postprocess/wasm_rt.rs index b79d0bb785..b1cbb20ca0 100644 --- a/typegraph/core/src/utils/postprocess/wasm_rt.rs +++ b/typegraph/core/src/utils/postprocess/wasm_rt.rs @@ -2,7 +2,10 @@ // SPDX-License-Identifier: MPL-2.0 use crate::utils::fs_host; -use common::typegraph::{runtimes::Artifact, Typegraph}; +use common::typegraph::{ + runtimes::{Artifact, KnownRuntime, TGRuntime}, + Typegraph, +}; use std::path::PathBuf; use crate::utils::postprocess::PostProcessor; @@ -11,24 +14,27 @@ pub struct WasmProcessor; impl PostProcessor for WasmProcessor { fn postprocess(self, tg: &mut Typegraph) -> Result<(), crate::errors::TgError> { - for mat in tg.materializers.iter_mut() { - if mat.name.as_str() == "wasm" { - let path = mat.data.get("wasmArtifact").unwrap(); - let path: PathBuf = path.as_str().unwrap().into(); - - if tg.meta.artifacts.contains_key(&path) { + for rt in &tg.runtimes { + let data = match rt { + TGRuntime::Known(KnownRuntime::WasmReflected(data)) + | TGRuntime::Known(KnownRuntime::WasmWire(data)) => data, + _ => { continue; } + }; + let path = PathBuf::from(&data.wasm_artifact); + if tg.meta.artifacts.contains_key(&path) { + continue; + } - let wasi_path = fs_host::make_absolute(&path)?; + let wasi_path = fs_host::make_absolute(&path)?; - let (hash, size) = fs_host::hash_file(&wasi_path.clone())?; + let (hash, size) = fs_host::hash_file(&wasi_path)?; - tg.deps.push(wasi_path.clone()); - tg.meta - .artifacts - .insert(path.clone(), Artifact { hash, size, path }); - } + tg.deps.push(wasi_path.clone()); + tg.meta + .artifacts + .insert(path.clone(), Artifact { hash, size, path }); } Ok(()) } diff --git a/typegraph/core/wit/typegraph.wit b/typegraph/core/wit/typegraph.wit index 845b722185..fbf55057e5 100644 --- a/typegraph/core/wit/typegraph.wit +++ b/typegraph/core/wit/typegraph.wit @@ -368,13 +368,24 @@ interface runtimes { create-random-mat: func(base: base-materializer, data: materializer-random) -> result; // wasm - record materializer-wasm { - func-name: string, + + record wasm-runtime-data { wasm-artifact: string, } - register-wasm-runtime: func() -> result; - from-wasm-module: func(base: base-materializer, data: materializer-wasm) -> result; + record materializer-wasm-reflected-func { + func-name: string, + } + + register-wasm-reflected-runtime: func(data: wasm-runtime-data) -> result; + from-wasm-reflected-func: func(base: base-materializer, data: materializer-wasm-reflected-func) -> result; + + record materializer-wasm-wire-handler { + func-name: string, + } + + register-wasm-wire-runtime: func(data: wasm-runtime-data) -> result; + from-wasm-wire-handler: func(base: base-materializer, data: materializer-wasm-wire-handler) -> result; // prisma record prisma-runtime-data { diff --git a/typegraph/node/pnpm-lock.yaml b/typegraph/node/pnpm-lock.yaml index 1d4f022476..10977fbcc1 100644 --- a/typegraph/node/pnpm-lock.yaml +++ b/typegraph/node/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '9.0' +lockfileVersion: '6.0' settings: autoInstallPeers: true @@ -19,23 +19,18 @@ importers: packages: - '@types/node@20.11.10': + /@types/node@20.11.10: resolution: {integrity: sha512-rZEfe/hJSGYmdfX9tvcPMYeYPW2sNl50nsw4jZmRcaG0HIAb0WYEpsB05GOb53vjqpyE9GUhlDQ4jLSoB5q9kg==} + dependencies: + undici-types: 5.26.5 + dev: true - typescript@5.3.3: + /typescript@5.3.3: resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} engines: {node: '>=14.17'} hasBin: true + dev: true - undici-types@5.26.5: + /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - -snapshots: - - '@types/node@20.11.10': - dependencies: - undici-types: 5.26.5 - - typescript@5.3.3: {} - - undici-types@5.26.5: {} + dev: true diff --git a/typegraph/node/sdk/src/runtimes/wasm.ts b/typegraph/node/sdk/src/runtimes/wasm.ts index b606e1e3da..c4d2f40d07 100644 --- a/typegraph/node/sdk/src/runtimes/wasm.ts +++ b/typegraph/node/sdk/src/runtimes/wasm.ts @@ -7,36 +7,89 @@ import { Effect } from "../gen/interfaces/metatype-typegraph-runtimes.js"; import { Materializer, Runtime } from "./mod.js"; import { fx } from "../index.js"; -interface WasmMat extends Materializer { - module: string; - funcMame: string; +export class WasmRuntime extends Runtime { + static reflected(modulePath: string) { + return new WasmRuntimeReflected(modulePath); + } + static wire(modulePath: string) { + return new WasmRuntimeWire(modulePath); + } +} + +interface ReflectedFuncWasmMat extends Materializer { + funcName: string; effect: Effect; } -export class WasmRuntime extends Runtime { - constructor() { - super(runtimes.registerWasmRuntime()); +interface WireHandlerWasmMat extends Materializer { + funcName: string; + effect: Effect; +} + +class WasmRuntimeWire extends WasmRuntime { + constructor(artifactPath: string) { + super( + runtimes.registerWasmWireRuntime({ + wasmArtifact: artifactPath, + }), + ); + } + + handler< + I extends t.Typedef = t.Typedef, + O extends t.Typedef = t.Typedef, + >( + inp: I, + out: O, + { func, effect = fx.read() }: { + func: string; + effect?: Effect; + }, + ): t.Func { + const matId = runtimes.fromWasmWireHandler( + { + runtime: this._id, + effect, + }, + { + funcName: func, + }, + ); + + return t.func(inp, out, { + _id: matId, + effect, + funcName: func, + }); + } +} + +class WasmRuntimeReflected extends WasmRuntime { + constructor(artifactPath: string) { + super( + runtimes.registerWasmReflectedRuntime({ + wasmArtifact: artifactPath, + }), + ); } - fromWasm< + fromExport< I extends t.Typedef = t.Typedef, O extends t.Typedef = t.Typedef, >( inp: I, out: O, - { func, wasm, effect = fx.read() }: { + { func, effect = fx.read() }: { func: string; - wasm: string; effect?: Effect; }, - ): t.Func { - const matId = runtimes.fromWasmModule( + ): t.Func { + const matId = runtimes.fromWasmReflectedFunc( { runtime: this._id, effect, }, { - wasmArtifact: wasm, funcName: func, }, ); @@ -44,8 +97,7 @@ export class WasmRuntime extends Runtime { return t.func(inp, out, { _id: matId, effect, - module: wasm, - funcMame: func, + funcName: func, }); } } diff --git a/typegraph/python/typegraph/runtimes/wasm.py b/typegraph/python/typegraph/runtimes/wasm.py index b6e5b06a19..1d225d8b12 100644 --- a/typegraph/python/typegraph/runtimes/wasm.py +++ b/typegraph/python/typegraph/runtimes/wasm.py @@ -1,13 +1,15 @@ # Copyright Metatype OÜ, licensed under the Mozilla Public License Version 2.0. # SPDX-License-Identifier: MPL-2.0 from dataclasses import dataclass -from typing import List, Optional +from typing import Optional from typegraph.gen.exports.runtimes import ( BaseMaterializer, Effect, EffectRead, - MaterializerWasm, + WasmRuntimeData, + MaterializerWasmReflectedFunc, + MaterializerWasmWireHandler, ) from typegraph.gen.types import Err from typegraph.runtimes.base import Materializer, Runtime @@ -17,24 +19,45 @@ class WasmRuntime(Runtime): - def __init__(self): - super().__init__(runtimes.register_wasm_runtime(store)) + @staticmethod + def reflected(module_path: str) -> "WasmRuntimeReflected": + return WasmRuntimeReflected(artifact_path=module_path) - def from_wasm( + @staticmethod + def wire(module_path: str) -> "WasmRuntimeWire": + return WasmRuntimeWire(artifact_path=module_path) + + +@dataclass +class WireWasmMat(Materializer): + func_name: str + + +class WasmRuntimeWire(WasmRuntime): + def __init__(self, artifact_path: str): + runtime_id = runtimes.register_wasm_wire_runtime( + store, + data=WasmRuntimeData(wasm_artifact=artifact_path), + ) + if isinstance(runtime_id, Err): + raise Exception(runtime_id.value) + + super().__init__(runtime_id.value) + + def handler( self, inp: "t.struct", out: "t.typedef", *, func: str, - wasm: str, effect: Optional[Effect] = None, ): effect = effect or EffectRead() - mat_id = runtimes.from_wasm_module( + mat_id = runtimes.from_wasm_wire_handler( store, - BaseMaterializer(runtime=self.id.value, effect=effect), - MaterializerWasm(wasm_artifact=wasm, func_name=func), + BaseMaterializer(runtime=self.id, effect=effect), + MaterializerWasmWireHandler(func_name=func), ) if isinstance(mat_id, Err): @@ -43,12 +66,47 @@ def from_wasm( return t.func( inp, out, - WasmMat(id=mat_id.value, module=wasm, func_name=func, effect=effect), + WireWasmMat(id=mat_id.value, func_name=func, effect=effect), ) @dataclass -class WasmMat(Materializer): - module: str +class ReflectedWasmMat(Materializer): func_name: str - effect: List[str] + + +class WasmRuntimeReflected(WasmRuntime): + def __init__(self, artifact_path: str): + runtime_id = runtimes.register_wasm_reflected_runtime( + store, + data=WasmRuntimeData(wasm_artifact=artifact_path), + ) + if isinstance(runtime_id, Err): + raise Exception(runtime_id.value) + + super().__init__(runtime_id.value) + + def from_export( + self, + inp: "t.struct", + out: "t.typedef", + *, + func: str, + effect: Optional[Effect] = None, + ): + effect = effect or EffectRead() + + mat_id = runtimes.from_wasm_reflected_func( + store, + BaseMaterializer(runtime=self.id, effect=effect), + MaterializerWasmReflectedFunc(func_name=func), + ) + + if isinstance(mat_id, Err): + raise Exception(mat_id.value) + + return t.func( + inp, + out, + ReflectedWasmMat(id=mat_id.value, func_name=func, effect=effect), + ) diff --git a/website/static/specs/0.0.3.json b/website/static/specs/0.0.3.json index ab7f97e20e..9a7f7bcb89 100644 --- a/website/static/specs/0.0.3.json +++ b/website/static/specs/0.0.3.json @@ -1646,7 +1646,7 @@ "name": { "type": "string", "enum": [ - "python_wasi" + "python" ] }, "data": { @@ -1754,7 +1754,25 @@ "name": { "type": "string", "enum": [ - "wasm" + "wasm_reflected" + ] + }, + "data": { + "$ref": "#/definitions/WasmRuntimeData" + } + } + }, + { + "type": "object", + "required": [ + "data", + "name" + ], + "properties": { + "name": { + "type": "string", + "enum": [ + "wasm_wire" ] }, "data": { @@ -2293,12 +2311,12 @@ }, "WasmRuntimeData": { "type": "object", + "required": [ + "wasm_artifact" + ], "properties": { - "config": { - "type": [ - "string", - "null" - ] + "wasm_artifact": { + "type": "string" } } }, @@ -2572,11 +2590,29 @@ "title": "ModuleMatData", "type": "object", "required": [ - "code" + "denoArtifact", + "deps" ], "properties": { - "code": { - "type": "string" + "denoArtifact": { + "type": "object", + "additionalProperties": true + }, + "deps": { + "type": "array", + "items": { + "type": "string" + } + }, + "depsMeta": { + "type": [ + "array", + "null" + ], + "items": { + "type": "object", + "additionalProperties": true + } } } }, @@ -2766,10 +2802,10 @@ "title": "WasmMatData", "type": "object", "required": [ - "wasmArtifact" + "opName" ], "properties": { - "wasmArtifact": { + "opName": { "type": "string" } } diff --git a/whiz.yaml b/whiz.yaml index 49d25f3d0d..32ced8f46b 100644 --- a/whiz.yaml +++ b/whiz.yaml @@ -3,6 +3,7 @@ env: CLICOLOR_FORCE: "1" RUST_LOG: "typegate=info,typegate_engine=info,mt_deno=info,swc_ecma_codegen=off,tracing::span=off,error" NPM_CONFIG_REGISTRY: http://localhost:4873 + WASMTIME_BACKTRACE_DETAILS: "1" gate1: &tp watch: @@ -121,7 +122,7 @@ setup: curl -fsSL https://raw.githubusercontent.com/metatypedev/ghjk/$GHJK_VERSION/install.sh | bash . $(ghjk print share-dir-path)/env.sh ghjk p sync - echo "exec ./. to refresh env vars" - [ -d .venv ] || python3 -m venv .venv + echo "cd ./. to refresh env vars" + [ -d .venv ] || python3 -m venv .venv && echo "virtual env created" poetry install --sync --no-root yes | pnpm install --recursive --filter ./website/... --filter ./typegraph/node/... diff --git a/libs/pyrt_wit_wire/wit/pyrt.wit b/wit/wit-wire.wit similarity index 61% rename from libs/pyrt_wit_wire/wit/pyrt.wit rename to wit/wit-wire.wit index de1bbfbd77..52786b929c 100644 --- a/libs/pyrt_wit_wire/wit/pyrt.wit +++ b/wit/wit-wire.wit @@ -1,28 +1,11 @@ -package metatype:pyrt; - -// use metatype:typegraph/runtimes; - -interface shared { - record req { - op-name: string, - in-json: string, - } - - type res = result; -} +package metatype:wit-wire; interface typegate-wire { - record req { - op-name: string, - in-json: string, - } - type res = result; - - hostcall: func(req: req) -> res; + hostcall: func(req: tuple) -> result; } interface mat-wire { - use shared.{req, res}; + type json-str = string; record mat-info { op-name: string, @@ -47,10 +30,22 @@ interface mat-wire { } init: func(args: init-args) -> result; - handle: func(req: req) -> res; + + record handle-req { + op-name: string, + in-json: json-str, + } + + variant handle-err { + no-handler, + in-json-err(string), + handler-err(string), + } + + handle: func(req: handle-req) -> result; } -world pyrt { +world wit-wire { import typegate-wire; export mat-wire; } From a5d138788f341969ce5085fcb8eff65129ba7a96 Mon Sep 17 00:00:00 2001 From: Yohe-Am <56622350+Yohe-Am@users.noreply.github.com> Date: Tue, 30 Apr 2024 16:41:34 +0000 Subject: [PATCH 11/16] fix: update poetry lockfile --- typegraph/python/poetry.lock | 58 +++++++++++++++++++++++++++++------- 1 file changed, 47 insertions(+), 11 deletions(-) diff --git a/typegraph/python/poetry.lock b/typegraph/python/poetry.lock index 20a456839b..24fc776425 100644 --- a/typegraph/python/poetry.lock +++ b/typegraph/python/poetry.lock @@ -15,6 +15,24 @@ files = [ six = ">=1.6.1,<2.0" wheel = ">=0.23.0,<1.0" +[[package]] +name = "importlib-resources" +version = "6.4.0" +description = "Read resources from Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_resources-6.4.0-py3-none-any.whl", hash = "sha256:50d10f043df931902d4194ea07ec57960f66a80449ff867bfe782b4c486ba78c"}, + {file = "importlib_resources-6.4.0.tar.gz", hash = "sha256:cdb2b453b8046ca4e3798eb1d84f3cce1446a0e8e7b5ef4efb600f19fc398145"}, +] + +[package.dependencies] +zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["jaraco.test (>=5.4)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)", "zipp (>=3.17)"] + [[package]] name = "python-box" version = "7.1.1" @@ -60,30 +78,33 @@ files = [ [[package]] name = "typing-extensions" -version = "4.10.0" +version = "4.11.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.10.0-py3-none-any.whl", hash = "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475"}, - {file = "typing_extensions-4.10.0.tar.gz", hash = "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb"}, + {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, + {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, ] [[package]] name = "wasmtime" -version = "18.0.2" +version = "20.0.0" description = "A WebAssembly runtime powered by Wasmtime" optional = false python-versions = ">=3.8" files = [ - {file = "wasmtime-18.0.2-py3-none-any.whl", hash = "sha256:49625d389ddd766f5416a1723a76a25473df1dbe6ad706902b7bdbfa549ec3df"}, - {file = "wasmtime-18.0.2-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:190f182e51f7f0e5340a7ffeb01519eb759748872a2bb227c6b1c055cbee61ce"}, - {file = "wasmtime-18.0.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:817c780eb506deaabe31cf23c5e9fe9ab9a1815bc0b805d292ec7502c495e10a"}, - {file = "wasmtime-18.0.2-py3-none-manylinux1_x86_64.whl", hash = "sha256:30adbf2fb380aae2d7cfd18c6f14d7633d62a8204caf185b7557b2364533268d"}, - {file = "wasmtime-18.0.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:c43d281df87af4139735aa62950d855499f58f72778b0e7a79488b3b8807d108"}, - {file = "wasmtime-18.0.2-py3-none-win_amd64.whl", hash = "sha256:7ccc88a9ee2bb601dbd1dc065a22af7b2f1a85c39b1aa8ebfb8ea57f78157d35"}, + {file = "wasmtime-20.0.0-py3-none-any.whl", hash = "sha256:6d9806e34c7cebe3d2ff4ba58a0c7db3648d4d952a0b6821aed4c4d966a4b312"}, + {file = "wasmtime-20.0.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:2ae53f5d84f071f42bf7c05da3bfe4a18e0b5ad801931188bff2e5092137213e"}, + {file = "wasmtime-20.0.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3f9ea16cf19039c5dc11d1f9a8f024ebb0d4c6cd1cbb2d0889797326f8ba5c06"}, + {file = "wasmtime-20.0.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:137c92cfde23b9ed18a85d5d1a1bfa844f1322c3bd80bc36c3b5adc3322f4a6e"}, + {file = "wasmtime-20.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:69505f8c1f42815c3784f77df5b3be9f4742ede56299a0f2d7d71083893e855d"}, + {file = "wasmtime-20.0.0-py3-none-win_amd64.whl", hash = "sha256:8ddb958a1b6eed88e56ec4aaae9478c273bed2e4fcd3331f29fda8d9d12def3d"}, ] +[package.dependencies] +importlib-resources = ">=5.10" + [package.extras] testing = ["coverage", "pycparser", "pytest", "pytest-mypy"] @@ -101,7 +122,22 @@ files = [ [package.extras] test = ["pytest (>=6.0.0)", "setuptools (>=65)"] +[[package]] +name = "zipp" +version = "3.18.1" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"}, + {file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] + [metadata] lock-version = "2.0" python-versions = ">=3.8,<4.0" -content-hash = "56e8d570e226c410bc7f7e5161672004c4796a7e84637e7fe2893988a8a350ee" +content-hash = "054c721c7557b8c008b8d2baeada154e0c0b2e8b0812b34440c2bcb0f5cf525a" From 3957885e08af310c7b9a2edc5bd928ca464f1d4f Mon Sep 17 00:00:00 2001 From: Yohe-Am <56622350+Yohe-Am@users.noreply.github.com> Date: Tue, 30 Apr 2024 17:37:19 +0000 Subject: [PATCH 12/16] fix: CI issues --- ghjk.ts | 2 +- libs/metagen/src/mdk_rust/mod.rs | 2 +- typegate/tests/metatype.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ghjk.ts b/ghjk.ts index 7b87573db9..8642eea1a6 100644 --- a/ghjk.ts +++ b/ghjk.ts @@ -102,7 +102,7 @@ if (!Deno.env.has("NO_PYTHON")) { version: POETRY_VERSION, })[0], ); - if (inDev()) { + if (!inOci()) { ghjk.install( ports.pipi({ packageName: "pre-commit" })[0], ); diff --git a/libs/metagen/src/mdk_rust/mod.rs b/libs/metagen/src/mdk_rust/mod.rs index dd211fa038..51eb6ff12e 100644 --- a/libs/metagen/src/mdk_rust/mod.rs +++ b/libs/metagen/src/mdk_rust/mod.rs @@ -298,7 +298,7 @@ fn mdk_rs_e2e() -> anyhow::Result<()> { serde_json::to_value(mdk_rust::MdkRustGenConfig { skip_cargo_toml: None, skip_lib_rs: Some(true), - stubbed_runtimes: Some(vec!["wasm".into()]), + stubbed_runtimes: Some(vec!["wasm_wire".into()]), crate_name: None, base: config::MdkGeneratorConfigBase { typegraph_name: Some(tg_name.into()), diff --git a/typegate/tests/metatype.yml b/typegate/tests/metatype.yml index 165d746fb4..087b1c7ad8 100644 --- a/typegate/tests/metatype.yml +++ b/typegate/tests/metatype.yml @@ -32,4 +32,4 @@ metagen: mdk_rust: path: ./runtimes/wasm_wire/rust/ typegraph_path: ./runtimes/wasm_wire/wasm_wire.ts - stubbed_runtimes: ["wasm"] + stubbed_runtimes: ["wasm_wire"] From 76530562d35ef65490588688c4ea97ad668fc287 Mon Sep 17 00:00:00 2001 From: Yohe-Am <56622350+Yohe-Am@users.noreply.github.com> Date: Wed, 1 May 2024 00:45:00 +0000 Subject: [PATCH 13/16] fix: minor bugs --- .ghjk/lock.json | 3 +-- ghjk.ts | 2 +- libs/metagen/src/mdk_rust/static/Cargo.toml | 1 - libs/metagen/tests/mat_rust/lib.rs | 1 + typegate/engine/build.rs | 13 ++++++++++--- typegate/src/typegate/artifacts/mod.ts | 2 +- typegate/tests/runtimes/wasm_wire/rust/Cargo.toml | 1 - 7 files changed, 14 insertions(+), 9 deletions(-) diff --git a/.ghjk/lock.json b/.ghjk/lock.json index 7c87e2a35f..1b931dfca7 100644 --- a/.ghjk/lock.json +++ b/.ghjk/lock.json @@ -536,8 +536,7 @@ "env": { "installs": [ "be7e967b2420f3d6a8af7d3ff11192362ee4b5c8", - "5dfbf570fa87f14a3524560c40bd08d0d62a7526", - "a24f45ef0b2064658d87264a95d31fe4694f6f4e" + "5dfbf570fa87f14a3524560c40bd08d0d62a7526" ], "env": {}, "allowedPortDeps": [ diff --git a/ghjk.ts b/ghjk.ts index 8642eea1a6..b9b7345753 100644 --- a/ghjk.ts +++ b/ghjk.ts @@ -144,7 +144,7 @@ ghjk.task("gen-pyrt-bind", { }); ghjk.task("build-pyrt", { - installs: [...installs.comp_py, installs.wasm_opt], + installs: [...installs.comp_py], allowedPortDeps, dependsOn: ["gen-pyrt-bind"], async fn({ $, argv, env }) { diff --git a/libs/metagen/src/mdk_rust/static/Cargo.toml b/libs/metagen/src/mdk_rust/static/Cargo.toml index d983715b39..42c3ddd4ed 100644 --- a/libs/metagen/src/mdk_rust/static/Cargo.toml +++ b/libs/metagen/src/mdk_rust/static/Cargo.toml @@ -10,5 +10,4 @@ crate-type = ["cdylib", "rlib"] anyhow = "1" serde = { version = "1", features = ["derive"] } serde_json = "1" -# TODO: update typegraph_core bindgen version wit-bindgen = "0.22.0" diff --git a/libs/metagen/tests/mat_rust/lib.rs b/libs/metagen/tests/mat_rust/lib.rs index c56281cdab..cab6d6f8da 100644 --- a/libs/metagen/tests/mat_rust/lib.rs +++ b/libs/metagen/tests/mat_rust/lib.rs @@ -1,6 +1,7 @@ // Copyright Metatype OÜ, licensed under the Mozilla Public License Version 2.0. // SPDX-License-Identifier: MPL-2.0 +#[rustfmt::skip] mod mdk; use mdk::stubs::*; use mdk::types::*; diff --git a/typegate/engine/build.rs b/typegate/engine/build.rs index 46a222d127..5bbd8b3a94 100644 --- a/typegate/engine/build.rs +++ b/typegate/engine/build.rs @@ -15,11 +15,17 @@ fn main() -> Result<(), Box> { println!( "cargo:rerun-if-changed={}/main.py", - cwd.join("../../libs/pyrt_wit_wire/").to_string_lossy() + cwd.join("../../libs/pyrt_wit_wire") + .canonicalize() + .unwrap() + .to_string_lossy() ); println!( "cargo:rerun-if-changed={}/wit-wire.wit", - cwd.join("../../wit/").to_string_lossy() + cwd.join("../../wit") + .canonicalize() + .unwrap() + .to_string_lossy() ); let wasm_path = out_dir.join("pyrt.wasm"); @@ -28,8 +34,9 @@ fn main() -> Result<(), Box> { // task impl inline assert!( std::process::Command::new("ghjk") - .args(["x", "build-pyrt", "--target"]) + .args(["x", "build-pyrt"]) .env("PYRT_WASM_OUT", &wasm_path) + .env("PYRT_TARGET", &wasm_path) .current_dir(cwd.join("../../")) .output()? .status diff --git a/typegate/src/typegate/artifacts/mod.ts b/typegate/src/typegate/artifacts/mod.ts index 00b6c54ff6..0a1ed465da 100644 --- a/typegate/src/typegate/artifacts/mod.ts +++ b/typegate/src/typegate/artifacts/mod.ts @@ -26,7 +26,7 @@ export async function getLocalPath( ARTIFACTS_DIR, mainModuleMeta.hash, meta.typegraphName, - meta.hash, + meta.relativePath, ); // TODO: what happens when symlink already exists? or when same local path artifacts with different cachedPath diff --git a/typegate/tests/runtimes/wasm_wire/rust/Cargo.toml b/typegate/tests/runtimes/wasm_wire/rust/Cargo.toml index 2ea6289527..595877dacb 100644 --- a/typegate/tests/runtimes/wasm_wire/rust/Cargo.toml +++ b/typegate/tests/runtimes/wasm_wire/rust/Cargo.toml @@ -10,7 +10,6 @@ crate-type = ["cdylib", "rlib"] anyhow = "1" serde = { version = "1", features = ["derive"] } serde_json = "1" -# TODO: update typegraph_core bindgen version wit-bindgen = "0.22.0" [profile.release] From c709ec92ce30202cb8b1f10650382f80de365348 Mon Sep 17 00:00:00 2001 From: Yohe-Am <56622350+Yohe-Am@users.noreply.github.com> Date: Wed, 1 May 2024 08:19:07 +0000 Subject: [PATCH 14/16] fix: ci breakage --- .github/workflows/tests.yml | 5 +++-- typegate/engine/build.rs | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 256aae8381..6257205998 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -324,8 +324,9 @@ jobs: deno cache --import-map typegate/import_map.json \ typegate/src/main.ts \ typegate/tests/utils/*.ts \ - typegate/tests/runtimes/wasm/*.ts \ - typegate/tests/runtimes/python_wasi/*.ts \ + typegate/tests/runtimes/wasm_wire/*.ts \ + typegate/tests/runtimes/wasm_reflected/*.ts \ + typegate/tests/runtimes/python/*.ts \ dev/deps.ts \ dev/utils.ts deno --unstable-worker-options --unstable-net coverage ./coverage --lcov > coverage.lcov diff --git a/typegate/engine/build.rs b/typegate/engine/build.rs index 5bbd8b3a94..171873e275 100644 --- a/typegate/engine/build.rs +++ b/typegate/engine/build.rs @@ -38,8 +38,8 @@ fn main() -> Result<(), Box> { .env("PYRT_WASM_OUT", &wasm_path) .env("PYRT_TARGET", &wasm_path) .current_dir(cwd.join("../../")) - .output()? - .status + .spawn()? + .wait()? .success(), "error building pyrt" ); From c56a58dbe817cb23b148cc7f3f35c08bb24acd55 Mon Sep 17 00:00:00 2001 From: Yohe-Am <56622350+Yohe-Am@users.noreply.github.com> Date: Thu, 2 May 2024 06:42:01 +0000 Subject: [PATCH 15/16] wip: try fix --- typegate/tests/runtimes/wasm_reflected/wasm_sync_test.ts | 2 +- typegate/tests/runtimes/wasm_wire/wasm_sync_test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/typegate/tests/runtimes/wasm_reflected/wasm_sync_test.ts b/typegate/tests/runtimes/wasm_reflected/wasm_sync_test.ts index e7159da3dd..ea1b83c24d 100644 --- a/typegate/tests/runtimes/wasm_reflected/wasm_sync_test.ts +++ b/typegate/tests/runtimes/wasm_reflected/wasm_sync_test.ts @@ -42,7 +42,7 @@ const syncConfig = { }, forcePathStyle: true, }, - s3Bucket: "metatype-sync-test", + s3Bucket: "metatype-reflected-sync-test", }; const cwd = path.join(testDir, "runtimes/wasm_reflected"); diff --git a/typegate/tests/runtimes/wasm_wire/wasm_sync_test.ts b/typegate/tests/runtimes/wasm_wire/wasm_sync_test.ts index 18e9e18ccb..72bd25a9bc 100644 --- a/typegate/tests/runtimes/wasm_wire/wasm_sync_test.ts +++ b/typegate/tests/runtimes/wasm_wire/wasm_sync_test.ts @@ -42,7 +42,7 @@ const syncConfig = { }, forcePathStyle: true, }, - s3Bucket: "metatype-sync-test", + s3Bucket: "metatype-wasm-wire-sync-test", }; const cwd = path.join(testDir, "runtimes/wasm_wire"); From 9f8e0a46ac70d57de05f475abe5546ba0398c0b4 Mon Sep 17 00:00:00 2001 From: Yohe-Am <56622350+Yohe-Am@users.noreply.github.com> Date: Tue, 7 May 2024 02:26:57 +0000 Subject: [PATCH 16/16] wip: try fix --- .ghjk/deno.lock | 60 ++++++++ .ghjk/lock.json | 204 +++++++++++++------------- .github/workflows/publish-website.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/tests.yml | 4 +- dev/Dockerfile | 2 +- dev/cross.Dockerfile | 2 +- dev/lock.yml | 2 +- ghjk.ts | 8 +- typegraph/node/pnpm-lock.yaml | 23 +-- whiz.yaml | 2 +- 11 files changed, 188 insertions(+), 123 deletions(-) diff --git a/.ghjk/deno.lock b/.ghjk/deno.lock index 2768c989f4..90ef5d97b5 100644 --- a/.ghjk/deno.lock +++ b/.ghjk/deno.lock @@ -2,6 +2,9 @@ "version": "3", "redirects": { "https://deno.land/std/path/mod.ts": "https://deno.land/std@0.223.0/path/mod.ts", + "https://raw.github.com/metatypedev/ghjk/2725af8/mod.ts": "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/mod.ts", + "https://raw.github.com/metatypedev/ghjk/2725af8/ports/mod.ts": "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/mod.ts", + "https://raw.github.com/metatypedev/ghjk/2725af8/utils/mod.ts": "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/utils/mod.ts", "https://raw.github.com/metatypedev/ghjk/423d38e/mod.ts": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/mod.ts", "https://raw.github.com/metatypedev/ghjk/423d38e/ports/mod.ts": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/mod.ts", "https://raw.github.com/metatypedev/ghjk/423d38e/utils/mod.ts": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/utils/mod.ts" @@ -459,6 +462,63 @@ "https://deno.land/x/zod@v3.22.4/types.ts": "724185522fafe43ee56a52333958764c8c8cd6ad4effa27b42651df873fc151e", "https://esm.sh/jszip@3.7.1": "f3872a819b015715edb05f81d973b5cd05d3d213d8eb28293ca5471fe7a71773", "https://esm.sh/v135/jszip@3.7.1/denonext/jszip.mjs": "d31d7f9e0de9c6db3c07ca93f7301b756273d4dccb41b600461978fc313504c9", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/deps/cli.ts": "4eacc555cf80686b487e7502db63a4cfbc2060a7b847d15b14cf1cc008a3b65c", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/deps/common.ts": "46d30782086ccc79e4a2633fe859723e7686ebc5adb4101e76c4bf2d6d2e94ff", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/deps/ports.ts": "3c60d1f7ab626ffdd81b37f4e83a780910936480da8fe24f4ccceaefa207d339", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/host/types.ts": "22c06b190172d08092717ad788ed04b050af58af0cf3f8c78b1511984101e9e4", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/mod.ts": "7a78701c53b9ba6ba16f4dc6a45ea316b5d6818fda520751088a87c09fd82464", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/modules/mod.ts": "6aa0b765ce5684842ea531e026926836ffde7d2513e62457bffe9cb4ec7eb0df", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/modules/ports/ambient.ts": "25623410c535e2bfaf51fca1e582e7325a00a7690d5b5e763a12be9407f619cf", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/modules/ports/base.ts": "8ef8a8de372420bddcd63a1b363937f43d898059e99478a58621e8432bcd5891", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/modules/ports/db.ts": "3f4541d6874c434f2f869774a17fd41c3d86914ed190d412e2f63f564b58ce95", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/modules/ports/ghrel.ts": "e94d53507feedb8f8456aed91b034621951def4f83102490e18eb5a367f2ee64", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/modules/ports/mod.ts": "e38ad2d3599b6a5522da436b52e5945bb85cabba2aca27f633eae43e465b5794", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/modules/ports/std.ts": "985902519aafef6e8e6aecc8922e70abdea5b8e97d5439bf94338b93242fe11f", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/modules/ports/sync.ts": "46447c2c51c085193f567ddcd2451b14bb33ee2d761edeb91a6153e2ba642f42", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/modules/ports/types.ts": "b3967d9d75def187b3b55f2b0b1357c9cb69a70e475a9280fc66717193b8b43c", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/modules/ports/types/platform.ts": "0ecffeda71919293f9ffdb6c564ddea4f23bc85c4e640b08ea78225d34387fdc", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/modules/ports/worker.ts": "25c01e3afddd97d48af89d9c97a9a5188e7db09fceb26a69eac4dabacd8ac4fc", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/modules/std.ts": "ddb2c134c080bb0e762a78f2f2edd69536991cc4257bd29a6fc95944b2f105a9", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/modules/tasks/deno.ts": "f988a4d1062364b99272087fa0c7d54e699944ead3790c5b83140577bda089de", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/modules/tasks/exec.ts": "7a07f2cce79fe16e86f0b74df6d57f0160bac75a8c6d58a03f2883a5ecccddf0", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/modules/tasks/mod.ts": "0edbe1ce953a44b6b0fd45aa9c9dd52c11b12053eef21307eac3b24b6db4745e", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/modules/tasks/types.ts": "536495a17c7a917bdd1c316ecc98ce2947b4959a713f92a175d372196dcaafc0", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/modules/types.ts": "b44609942d7ad66c925c24485057c5b4b2ffcad20c0a94e14dc6af34cf9e8241", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/port.ts": "c039a010dee7dfd978478cf4c5e2256c643135e10f33c30a09f8db9915e9d89d", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/act.ts": "a42bcd3e68ee476ccf30d99cdb7bc487cfad00d2e8fbf152e5776a32ccb29c76", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/asdf.ts": "70033efcd24b7d2b836e1bc36754597de69a4a1771174d3fbc2fdda6c45f5d0a", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/asdf_plugin_git.ts": "946e051218a7681bb9b6cc8834b8795aef2713ec6cb331e30440073e68161e2b", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/cargo-binstall.ts": "014ead93f46ed8463c4d620c958ed6b8df5f9e4c223b1d76ea8f27ac0575707b", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/cargobi.ts": "f3b84615cba7778d502d0ad4415ae1ff527337cd39801f25b5fae5804c05e5a2", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/cpy_bs.ts": "cd3e53832969c2f94cb25e2bf96a3fc0d35d7a8929bd24da8aff07c4c4532ae4", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/curl.ts": "58acd2a158187f448d940f45bfcd87c9b4884db127dcbaaaef27258bb4ebce92", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/earthly.ts": "7a3c8cae1631f670105a63bc41c47a49da6fc777968c0e9546c55d43fa418619", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/git.ts": "2e68f1fa5ba534ee32db204bcc357f987437dffe5d87c1a0a9c47850fa654419", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/infisical.ts": "7e60029b1f73fa72c38aa8d134f9bd62ba488c5e23b6cb7a568acb79a7027e04", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/jq_ghrel.ts": "e31dc346bbeb9c3cc5411bf7170d1238bd75ca843bfc85baeb8e33375758f380", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/meta_cli_ghrel.ts": "c337c1ecc251694849f6e4b120e542272aa7ac1dac48db6d3dcd781fe6265159", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/mod.ts": "8521c092ee3d7b1b2cf28f47f084e353656cb98b4506f8c2fbbcc47505c2bf89", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/mold.ts": "0b91d6a73992d175a0cae048aa4c0547ad68906cd2b18377121b86dd318ab650", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/node.ts": "f68993de9d67168f68c4c950c73273d26eeea0a617852f59676cc64577afa6c8", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/npmi.ts": "05e69eb75f5b0350b988fd06ddc7fd47707b4027482b254c1a6d5d5d1c90cc95", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/opentofu_ghrel.ts": "46ef05d30772d36b91d88a2dc1aae31e096c59ba6ecf82af08359996c1476725", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/pipi.ts": "7feece45b8fe0a8cb0735cb07c3f935f36ca7dac654d58f8ead098932a9dd202", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/pnpm.ts": "41e7f473a687123ae96ab14a3a04f67ef0c4b44eea6747448826dbdae00bfdde", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/protoc.ts": "ef93af8f37d8186c2220b6d2f760b5da10decaa3e9fe7768003ee319d32335bf", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/ruff.ts": "d9a4d22224bec2829a794a718d275580a6b2836f970ba6c5923ff485016931d0", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/rust.ts": "72ca49bc8419b556af836d464ba62829e7fd961a9c3f5305c258f8562e242885", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/rustup.ts": "a3918809c59fb4681222a22279b03ea0333de42114e12ede3b1cb11f7bd5f59a", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/tar.ts": "c3c43a99f8a9b1c160286cbc6240f59658d994856eeacaee479f645ece44d6c4", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/temporal_cli.ts": "d2a99eb0f47abf69d5f08d360a289311a92977f6e2898a836688b280b12f96dc", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/terraform.ts": "0da89441ae69647cc63306fe92fc36c35c34eb17620e785a64d069f20d25d647", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/unzip.ts": "c4559c627246f9c051571bbdff8c63ab15780ffd9e71656a9055488cc3bf32c3", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/wasmedge.ts": "ea80044069a75ca9ce938bc72b2504955fa3747949f680cdcd64ce172c723545", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/zstd.ts": "fb8334b7b43ef34ba60ad391460e2fabb62889f77eade7798c823b14842cea45", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/setup_logger.ts": "f8a206bda0595497d6f4718032d4a959000b32ef3346d4b507777eec6a169458", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/utils/logger.ts": "86fdf651123d00ea1081bf8001ed9039cd41a79940e6ebadb8484952ab390e73", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/utils/mod.ts": "1ee68d9390259c065144c10663f6e360d29aec36db2af38d02647e304eeeaedc", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/utils/unarchive.ts": "3f66464c445d67b003e792cdefea9c529e2fd527df19d3fc52000d91d43a65b2", + "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/utils/url.ts": "e1ada6fd30fc796b8918c88456ea1b5bbd87a07d0a0538b092b91fd2bb9b7623", "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/deps/cli.ts": "4eacc555cf80686b487e7502db63a4cfbc2060a7b847d15b14cf1cc008a3b65c", "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/deps/common.ts": "46d30782086ccc79e4a2633fe859723e7686ebc5adb4101e76c4bf2d6d2e94ff", "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/deps/ports.ts": "3c60d1f7ab626ffdd81b37f4e83a780910936480da8fe24f4ccceaefa207d339", diff --git a/.ghjk/lock.json b/.ghjk/lock.json index 1b931dfca7..9804ab46d9 100644 --- a/.ghjk/lock.json +++ b/.ghjk/lock.json @@ -444,24 +444,24 @@ "id": "ports", "config": { "installs": [ - "db5b506ba0936c6713a2efef3ee82df7ea271b06", - "651e1043d59561e4e71e5fb0775daf746467a028", - "e7b2f3414caa4c4441240c02dcb8f7c781fd01ee", - "af5c6b39c783d32544799829316564ffe51861a9", - "a24f45ef0b2064658d87264a95d31fe4694f6f4e", - "57da4ca242ec52ba50359a7fd78653e6bf253df0", - "67d371eb0c4ae641830a955975d7134f7ee9a864", - "4ca29edff5e070fd0885680b178ed6948d7a4c7f", - "a12d1020fe585e5ea75d9a2035bdcbde8dd90044", - "4d1916871a40b6ac730709f7721f740df192c84d", - "4df902463d60efc5b8e760ea4899f6ab6df0f16e", - "88f6aa5ddb513712623d31a17096ea26286064da", - "185be72d02330f9b3dfa3d0791274feb958e119d", - "5549508f1f5eddf9cb2465f07cf0c7603dc0c849", - "5c041a4209ae50657ea5acacc26683688f2913a9", - "d0bcae26fcc8ca53ffbdb66de5735c608858a313", - "ca8e4bf52171b6a173a6ba349f33721806b86d48", - "be7e967b2420f3d6a8af7d3ff11192362ee4b5c8" + "439fc98060b33a81493ea6c9d54d834f5d548c0a", + "6c4eb5db74544926094ea3be684f453ac448da0a", + "0dac7df77bad6ba3f8a46710f1199cf36b260c82", + "fefe1d7a6a79be5dedaf34f4c7e5c00bd6f41554", + "a4c9551574e821b184e492ffbdbf295311099397", + "c69d5f47d8bede1fc7a55bc46ca5f0f2c9252719", + "2aedace78ffe026f5c0918231de4f7f9050aab1c", + "c13712d0a06c2329378872201d5cb51e0575bed9", + "9e72a9f857bd9b14b47702b5b8ee660833828d4b", + "cfe6640502ddf9772073889af75888d361b1f2b9", + "8e5e02544073c4733d8f2156c404a0dd524cdaaf", + "e05f859f4a734a85fd3439f9b0fc0de1e733bdac", + "38285a3b335e394ccce5ac5d59e15f660bfa4cc9", + "7bbf00da8e265c56c2bff5bb7d89ba806e2590d2", + "14fd3752a984c5d82e1451f7388c73a21fcce705", + "f25385325ad568d22d9538724df856df62a7b06b", + "3ed4089145ee327a97198237a8a2eb8a48212b6c", + "ea543033c55cfcaa9f7e253529d0efe3a9827c6d" ], "allowedDeps": { "tar_aa": "e0d1f160d2d7755765f6f01a27a0c33a02ff98d2", @@ -469,13 +469,13 @@ "curl_aa": "3c447f912abf18883bd05314f946740975ee0dd3", "unzip_aa": "dfb0f5e74666817e6ab8cbceca0c9da271142bca", "zstd_aa": "d9122eff1fe3ef56872e53dae725ff3ccb37472e", - "rustup_rustlang": "89f6529a87b3d47e2ebdc50486bf0ed2f39049d4", - "rust_rustup": "201f72d1b59c9377240c3d5008d835ea83d0ba74", - "cargo_binstall_ghrel": "c8084cf4c423d1862a1d783c70b8221c0cf9d73c", - "pnpm_ghrel": "422c26d0e74744b87f0f6f0eefa25e54a1188e08", - "asdf_plugin_git": "f77828fcb8896a0df3511920d0055d0f89bfdec9", - "cpy_bs_ghrel": "ff0a30a4efc90a6a49611e273e167ac3d3444441", - "node_org": "601d3ac573271b2e2fb3c453ccd54f22d151c64e" + "rustup_rustlang": "4cd389bd9c1a017e3af681e4515df06afc8ae94b", + "rust_rustup": "78a3ffea7ebe9b9f09acee4f5912ce24df923dc3", + "cargo_binstall_ghrel": "ba089892903fc9374065ebf6466fa43baf308251", + "pnpm_ghrel": "5d09c2a1d5a6611daf46efcc36eca64f53cb279c", + "asdf_plugin_git": "9c0f4895f4f2512781cf21f405fdf1a3b6b276d2", + "cpy_bs_ghrel": "14d99c79513af7d220c32bef7a266958781e021b", + "node_org": "adf17609822d9b8edd5253323d2edab7a1152ec2" } } }, @@ -495,11 +495,11 @@ "3c447f912abf18883bd05314f946740975ee0dd3", "dfb0f5e74666817e6ab8cbceca0c9da271142bca", "d9122eff1fe3ef56872e53dae725ff3ccb37472e", - "89f6529a87b3d47e2ebdc50486bf0ed2f39049d4", - "201f72d1b59c9377240c3d5008d835ea83d0ba74", - "c8084cf4c423d1862a1d783c70b8221c0cf9d73c", - "422c26d0e74744b87f0f6f0eefa25e54a1188e08", - "f77828fcb8896a0df3511920d0055d0f89bfdec9" + "4cd389bd9c1a017e3af681e4515df06afc8ae94b", + "78a3ffea7ebe9b9f09acee4f5912ce24df923dc3", + "ba089892903fc9374065ebf6466fa43baf308251", + "5d09c2a1d5a6611daf46efcc36eca64f53cb279c", + "9c0f4895f4f2512781cf21f405fdf1a3b6b276d2" ] } }, @@ -508,8 +508,8 @@ "dependsOn": [], "env": { "installs": [ - "be7e967b2420f3d6a8af7d3ff11192362ee4b5c8", - "5dfbf570fa87f14a3524560c40bd08d0d62a7526" + "ea543033c55cfcaa9f7e253529d0efe3a9827c6d", + "3044097f18de955d9402bcac8b0006554638849d" ], "env": {}, "allowedPortDeps": [ @@ -518,13 +518,13 @@ "3c447f912abf18883bd05314f946740975ee0dd3", "dfb0f5e74666817e6ab8cbceca0c9da271142bca", "d9122eff1fe3ef56872e53dae725ff3ccb37472e", - "89f6529a87b3d47e2ebdc50486bf0ed2f39049d4", - "201f72d1b59c9377240c3d5008d835ea83d0ba74", - "c8084cf4c423d1862a1d783c70b8221c0cf9d73c", - "422c26d0e74744b87f0f6f0eefa25e54a1188e08", - "f77828fcb8896a0df3511920d0055d0f89bfdec9", - "46f2cbb62e80bc1b748292c57cc18ff18b94ba06", - "601d3ac573271b2e2fb3c453ccd54f22d151c64e" + "4cd389bd9c1a017e3af681e4515df06afc8ae94b", + "78a3ffea7ebe9b9f09acee4f5912ce24df923dc3", + "ba089892903fc9374065ebf6466fa43baf308251", + "5d09c2a1d5a6611daf46efcc36eca64f53cb279c", + "9c0f4895f4f2512781cf21f405fdf1a3b6b276d2", + "39c0cfd108ba0ce29a11769416cadb7ed988b831", + "adf17609822d9b8edd5253323d2edab7a1152ec2" ] } }, @@ -535,8 +535,8 @@ ], "env": { "installs": [ - "be7e967b2420f3d6a8af7d3ff11192362ee4b5c8", - "5dfbf570fa87f14a3524560c40bd08d0d62a7526" + "ea543033c55cfcaa9f7e253529d0efe3a9827c6d", + "3044097f18de955d9402bcac8b0006554638849d" ], "env": {}, "allowedPortDeps": [ @@ -545,13 +545,13 @@ "3c447f912abf18883bd05314f946740975ee0dd3", "dfb0f5e74666817e6ab8cbceca0c9da271142bca", "d9122eff1fe3ef56872e53dae725ff3ccb37472e", - "89f6529a87b3d47e2ebdc50486bf0ed2f39049d4", - "201f72d1b59c9377240c3d5008d835ea83d0ba74", - "c8084cf4c423d1862a1d783c70b8221c0cf9d73c", - "422c26d0e74744b87f0f6f0eefa25e54a1188e08", - "f77828fcb8896a0df3511920d0055d0f89bfdec9", - "46f2cbb62e80bc1b748292c57cc18ff18b94ba06", - "601d3ac573271b2e2fb3c453ccd54f22d151c64e" + "4cd389bd9c1a017e3af681e4515df06afc8ae94b", + "78a3ffea7ebe9b9f09acee4f5912ce24df923dc3", + "ba089892903fc9374065ebf6466fa43baf308251", + "5d09c2a1d5a6611daf46efcc36eca64f53cb279c", + "9c0f4895f4f2512781cf21f405fdf1a3b6b276d2", + "39c0cfd108ba0ce29a11769416cadb7ed988b831", + "adf17609822d9b8edd5253323d2edab7a1152ec2" ] } }, @@ -570,7 +570,7 @@ ], "globalEnv": { "installs": { - "db5b506ba0936c6713a2efef3ee82df7ea271b06": { + "439fc98060b33a81493ea6c9d54d834f5d548c0a": { "version": "v24.1", "port": { "ty": "denoWorker@v1", @@ -582,10 +582,10 @@ "x86_64-darwin" ], "version": "0.1.0", - "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/protoc.ts" + "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/protoc.ts" } }, - "651e1043d59561e4e71e5fb0775daf746467a028": { + "6c4eb5db74544926094ea3be684f453ac448da0a": { "version": "3.28.0-rc6", "depConfigs": { "asdf_plugin_git": { @@ -631,12 +631,12 @@ "name": "asdf_plugin_git" } ], - "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/asdf.ts" + "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/asdf.ts" }, "pluginRepo": "https://github.com/asdf-community/asdf-cmake", "installType": "version" }, - "e7b2f3414caa4c4441240c02dcb8f7c781fd01ee": { + "0dac7df77bad6ba3f8a46710f1199cf36b260c82": { "port": { "ty": "denoWorker@v1", "name": "cargo_binstall_ghrel", @@ -647,10 +647,10 @@ "x86_64-darwin" ], "version": "0.1.0", - "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/cargo-binstall.ts" + "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/cargo-binstall.ts" } }, - "af5c6b39c783d32544799829316564ffe51861a9": { + "fefe1d7a6a79be5dedaf34f4c7e5c00bd6f41554": { "version": "0.10.7", "port": { "ty": "denoWorker@v1", @@ -665,10 +665,10 @@ ], "version": "0.1.0", "deps": [], - "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/temporal_cli.ts" + "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/temporal_cli.ts" } }, - "a24f45ef0b2064658d87264a95d31fe4694f6f4e": { + "a4c9551574e821b184e492ffbdbf295311099397": { "version": "0.116.0", "depConfigs": { "rust_rustup": { @@ -708,12 +708,12 @@ "name": "rust_rustup" } ], - "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/cargobi.ts" + "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/cargobi.ts" }, "crateName": "wasm-opt", "locked": true }, - "57da4ca242ec52ba50359a7fd78653e6bf253df0": { + "c69d5f47d8bede1fc7a55bc46ca5f0f2c9252719": { "version": "1.0.53", "depConfigs": { "rust_rustup": { @@ -753,12 +753,12 @@ "name": "rust_rustup" } ], - "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/cargobi.ts" + "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/cargobi.ts" }, "crateName": "wasm-tools", "locked": true }, - "67d371eb0c4ae641830a955975d7134f7ee9a864": { + "2aedace78ffe026f5c0918231de4f7f9050aab1c": { "version": "1.33.0", "depConfigs": { "rust_rustup": { @@ -798,12 +798,12 @@ "name": "rust_rustup" } ], - "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/cargobi.ts" + "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/cargobi.ts" }, "crateName": "cargo-insta", "locked": true }, - "4ca29edff5e070fd0885680b178ed6948d7a4c7f": { + "c13712d0a06c2329378872201d5cb51e0575bed9": { "version": "20.8.0", "port": { "ty": "denoWorker@v1", @@ -822,10 +822,10 @@ "name": "tar_aa" } ], - "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/node.ts" + "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/node.ts" } }, - "a12d1020fe585e5ea75d9a2035bdcbde8dd90044": { + "9e72a9f857bd9b14b47702b5b8ee660833828d4b": { "version": "v9.0.5", "port": { "ty": "denoWorker@v1", @@ -839,10 +839,10 @@ "x86_64-windows" ], "version": "0.1.0", - "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/pnpm.ts" + "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/pnpm.ts" } }, - "4d1916871a40b6ac730709f7721f740df192c84d": { + "cfe6640502ddf9772073889af75888d361b1f2b9": { "version": "1.0.0", "port": { "ty": "denoWorker@v1", @@ -873,11 +873,11 @@ "name": "node_org" } ], - "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/npmi.ts" + "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/npmi.ts" }, "packageName": "@bytecodealliance/jco" }, - "4df902463d60efc5b8e760ea4899f6ab6df0f16e": { + "8e5e02544073c4733d8f2156c404a0dd524cdaaf": { "version": "10.0.1", "port": { "ty": "denoWorker@v1", @@ -908,11 +908,11 @@ "name": "node_org" } ], - "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/npmi.ts" + "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/npmi.ts" }, "packageName": "node-gyp" }, - "88f6aa5ddb513712623d31a17096ea26286064da": { + "e05f859f4a734a85fd3439f9b0fc0de1e733bdac": { "version": "v2.4.0", "port": { "ty": "denoWorker@v1", @@ -927,11 +927,11 @@ "name": "tar_aa" } ], - "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/mold.ts" + "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/mold.ts" }, "replaceLd": false }, - "185be72d02330f9b3dfa3d0791274feb958e119d": { + "38285a3b335e394ccce5ac5d59e15f660bfa4cc9": { "version": "3.8.18", "port": { "ty": "denoWorker@v1", @@ -953,11 +953,11 @@ "name": "zstd_aa" } ], - "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/cpy_bs.ts" + "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/cpy_bs.ts" }, "releaseTag": "20240224" }, - "5549508f1f5eddf9cb2465f07cf0c7603dc0c849": { + "7bbf00da8e265c56c2bff5bb7d89ba806e2590d2": { "version": "1.7.0", "port": { "ty": "denoWorker@v1", @@ -988,11 +988,11 @@ "name": "cpy_bs_ghrel" } ], - "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/pipi.ts" + "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/pipi.ts" }, "packageName": "poetry" }, - "5c041a4209ae50657ea5acacc26683688f2913a9": { + "14fd3752a984c5d82e1451f7388c73a21fcce705": { "port": { "ty": "denoWorker@v1", "name": "pipi_pypi", @@ -1022,11 +1022,11 @@ "name": "cpy_bs_ghrel" } ], - "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/pipi.ts" + "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/pipi.ts" }, "packageName": "pre-commit" }, - "d0bcae26fcc8ca53ffbdb66de5735c608858a313": { + "f25385325ad568d22d9538724df856df62a7b06b": { "port": { "ty": "denoWorker@v1", "name": "act_ghrel", @@ -1039,10 +1039,10 @@ "x86_64-windows" ], "version": "0.1.0", - "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/act.ts" + "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/act.ts" } }, - "ca8e4bf52171b6a173a6ba349f33721806b86d48": { + "3ed4089145ee327a97198237a8a2eb8a48212b6c": { "depConfigs": { "rust_rustup": { "portRef": "rust_rustup@0.1.0", @@ -1081,12 +1081,12 @@ "name": "rust_rustup" } ], - "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/cargobi.ts" + "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/cargobi.ts" }, "crateName": "whiz", "locked": true }, - "be7e967b2420f3d6a8af7d3ff11192362ee4b5c8": { + "ea543033c55cfcaa9f7e253529d0efe3a9827c6d": { "port": { "ty": "denoWorker@v1", "name": "pipi_pypi", @@ -1116,11 +1116,11 @@ "name": "cpy_bs_ghrel" } ], - "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/pipi.ts" + "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/pipi.ts" }, "packageName": "componentize-py" }, - "5dfbf570fa87f14a3524560c40bd08d0d62a7526": { + "3044097f18de955d9402bcac8b0006554638849d": { "port": { "ty": "denoWorker@v1", "name": "cpy_bs_ghrel", @@ -1141,7 +1141,7 @@ "name": "zstd_aa" } ], - "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/cpy_bs.ts" + "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/cpy_bs.ts" } } }, @@ -1276,7 +1276,7 @@ "portRef": "zstd_aa@0.1.0" } }, - "89f6529a87b3d47e2ebdc50486bf0ed2f39049d4": { + "4cd389bd9c1a017e3af681e4515df06afc8ae94b": { "manifest": { "ty": "denoWorker@v1", "name": "rustup_rustlang", @@ -1301,13 +1301,13 @@ "name": "git_aa" } ], - "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/rustup.ts" + "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/rustup.ts" }, "defaultInst": { "portRef": "rustup_rustlang@0.1.0" } }, - "201f72d1b59c9377240c3d5008d835ea83d0ba74": { + "78a3ffea7ebe9b9f09acee4f5912ce24df923dc3": { "manifest": { "ty": "denoWorker@v1", "name": "rust_rustup", @@ -1337,13 +1337,13 @@ "name": "rustup_rustlang" } ], - "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/rust.ts" + "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/rust.ts" }, "defaultInst": { "portRef": "rust_rustup@0.1.0" } }, - "c8084cf4c423d1862a1d783c70b8221c0cf9d73c": { + "ba089892903fc9374065ebf6466fa43baf308251": { "manifest": { "ty": "denoWorker@v1", "name": "cargo_binstall_ghrel", @@ -1354,13 +1354,13 @@ "x86_64-darwin" ], "version": "0.1.0", - "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/cargo-binstall.ts" + "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/cargo-binstall.ts" }, "defaultInst": { "portRef": "cargo_binstall_ghrel@0.1.0" } }, - "422c26d0e74744b87f0f6f0eefa25e54a1188e08": { + "5d09c2a1d5a6611daf46efcc36eca64f53cb279c": { "manifest": { "ty": "denoWorker@v1", "name": "pnpm_ghrel", @@ -1373,13 +1373,13 @@ "x86_64-windows" ], "version": "0.1.0", - "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/pnpm.ts" + "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/pnpm.ts" }, "defaultInst": { "portRef": "pnpm_ghrel@0.1.0" } }, - "f77828fcb8896a0df3511920d0055d0f89bfdec9": { + "9c0f4895f4f2512781cf21f405fdf1a3b6b276d2": { "manifest": { "ty": "denoWorker@v1", "name": "asdf_plugin_git", @@ -1402,13 +1402,13 @@ "name": "git_aa" } ], - "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/asdf_plugin_git.ts" + "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/asdf_plugin_git.ts" }, "defaultInst": { "portRef": "asdf_plugin_git@0.1.0" } }, - "46f2cbb62e80bc1b748292c57cc18ff18b94ba06": { + "39c0cfd108ba0ce29a11769416cadb7ed988b831": { "manifest": { "ty": "denoWorker@v1", "name": "cpy_bs_ghrel", @@ -1429,14 +1429,14 @@ "name": "zstd_aa" } ], - "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/cpy_bs.ts" + "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/cpy_bs.ts" }, "defaultInst": { "portRef": "cpy_bs_ghrel@0.1.0", "releaseTag": "20240224" } }, - "601d3ac573271b2e2fb3c453ccd54f22d151c64e": { + "adf17609822d9b8edd5253323d2edab7a1152ec2": { "manifest": { "ty": "denoWorker@v1", "name": "node_org", @@ -1454,14 +1454,14 @@ "name": "tar_aa" } ], - "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/node.ts" + "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/node.ts" }, "defaultInst": { "version": "20.8.0", "portRef": "node_org@0.1.0" } }, - "ff0a30a4efc90a6a49611e273e167ac3d3444441": { + "14d99c79513af7d220c32bef7a266958781e021b": { "manifest": { "ty": "denoWorker@v1", "name": "cpy_bs_ghrel", @@ -1482,7 +1482,7 @@ "name": "zstd_aa" } ], - "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/423d38e/ports/cpy_bs.ts" + "moduleSpecifier": "https://raw.githubusercontent.com/metatypedev/ghjk/2725af8/ports/cpy_bs.ts" }, "defaultInst": { "portRef": "cpy_bs_ghrel@0.1.0", diff --git a/.github/workflows/publish-website.yml b/.github/workflows/publish-website.yml index d4c2251f0c..d36dce20af 100644 --- a/.github/workflows/publish-website.yml +++ b/.github/workflows/publish-website.yml @@ -4,7 +4,7 @@ on: - main env: - GHJK_VERSION: "423d38e" + GHJK_VERSION: "2725af8" jobs: changes: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index dedf928dac..36cf2875ea 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,7 +16,7 @@ on: - v* env: - GHJK_VERSION: "423d38e" + GHJK_VERSION: "2725af8" DENO_VERSION: "1.41.0" REGISTRY_IMAGE: ghcr.io/${{ github.repository_owner }}/typegate diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 6257205998..d6ad21f00f 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -9,7 +9,7 @@ on: - ready_for_review env: - GHJK_VERSION: "423d38e" + GHJK_VERSION: "2725af8" DENO_VERSION: "1.41.0" RUST_BACKTRACE: "full" RUST_LOG: "info,swc_ecma_codegen=off,tracing::span=off" @@ -223,7 +223,7 @@ jobs: if: "! steps.check.outputs.has-permission" with: file: dev/Dockerfile - platforms: linux/amd64 + platforms: ${{ matrix.platform }} push: false cache-from: type=registry,ref=ghcr.io/${{ github.repository_owner }}/typegate:latest target: check diff --git a/dev/Dockerfile b/dev/Dockerfile index 479623677f..60ca57cbfa 100644 --- a/dev/Dockerfile +++ b/dev/Dockerfile @@ -52,7 +52,7 @@ RUN set -eux; \ ; \ apt clean autoclean; apt autoremove --yes; rm -rf /var/lib/{apt,dpkg,cache,log}/; -ARG GHJK_VERSION=423d38e +ARG GHJK_VERSION=2725af8 RUN GHJK_INSTALL_EXE_DIR=/usr/bin GHJK_INSTALL_HOOK_SHELLS=bash \ deno run -A https://raw.github.com/metatypedev/ghjk/$GHJK_VERSION/install.ts diff --git a/dev/cross.Dockerfile b/dev/cross.Dockerfile index abac290569..9e869fbeb0 100644 --- a/dev/cross.Dockerfile +++ b/dev/cross.Dockerfile @@ -33,7 +33,7 @@ RUN set -eux \ xz-utils \ unzip -ARG GHJK_VERSION=423d38e +ARG GHJK_VERSION=2725af8 ENV GHJK_SHARE_DIR=/ghjk RUN curl -fsSL https://raw.github.com/metatypedev/ghjk/$GHJK_VERSION/install.sh \ | GHJK_INSTALL_EXE_DIR=/usr/bin GHJK_INSTALL_HOOK_SHELLS=bash sh diff --git a/dev/lock.yml b/dev/lock.yml index a0e7d53bcb..77d456ed0e 100644 --- a/dev/lock.yml +++ b/dev/lock.yml @@ -81,7 +81,7 @@ dev: '(\s*"@typegraph\/sdk"\s*:\s*"npm:@typegraph\/sdk@).+(",?)': METATYPE_VERSION '(\s*"@typegraph\/sdk\/"\s*:\s*"npm:/@typegraph\/sdk@).+(\/",?)': METATYPE_VERSION lock: - GHJK_VERSION: 423d38e + GHJK_VERSION: 2725af8 GHJK_ACTION_VERSION: 2e8bbf084060a18828338a7cdd43fde6feb2a3cc PYTHON_VERSION: 3.8.18 POETRY_VERSION: 1.7.0 diff --git a/ghjk.ts b/ghjk.ts index b9b7345753..4f25f8c783 100644 --- a/ghjk.ts +++ b/ghjk.ts @@ -1,7 +1,7 @@ -export { ghjk } from "https://raw.github.com/metatypedev/ghjk/423d38e/mod.ts"; -import * as ghjk from "https://raw.github.com/metatypedev/ghjk/423d38e/mod.ts"; -import { thinInstallConfig } from "https://raw.github.com/metatypedev/ghjk/423d38e/utils/mod.ts"; -import * as ports from "https://raw.github.com/metatypedev/ghjk/423d38e/ports/mod.ts"; +export { ghjk } from "https://raw.github.com/metatypedev/ghjk/2725af8/mod.ts"; +import * as ghjk from "https://raw.github.com/metatypedev/ghjk/2725af8/mod.ts"; +import { thinInstallConfig } from "https://raw.github.com/metatypedev/ghjk/2725af8/utils/mod.ts"; +import * as ports from "https://raw.github.com/metatypedev/ghjk/2725af8/ports/mod.ts"; import { dirname, resolve } from "https://deno.land/std/path/mod.ts"; const PROTOC_VERSION = "v24.1"; diff --git a/typegraph/node/pnpm-lock.yaml b/typegraph/node/pnpm-lock.yaml index 10977fbcc1..1d4f022476 100644 --- a/typegraph/node/pnpm-lock.yaml +++ b/typegraph/node/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true @@ -19,18 +19,23 @@ importers: packages: - /@types/node@20.11.10: + '@types/node@20.11.10': resolution: {integrity: sha512-rZEfe/hJSGYmdfX9tvcPMYeYPW2sNl50nsw4jZmRcaG0HIAb0WYEpsB05GOb53vjqpyE9GUhlDQ4jLSoB5q9kg==} - dependencies: - undici-types: 5.26.5 - dev: true - /typescript@5.3.3: + typescript@5.3.3: resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} engines: {node: '>=14.17'} hasBin: true - dev: true - /undici-types@5.26.5: + undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - dev: true + +snapshots: + + '@types/node@20.11.10': + dependencies: + undici-types: 5.26.5 + + typescript@5.3.3: {} + + undici-types@5.26.5: {} diff --git a/whiz.yaml b/whiz.yaml index b7d6743669..94eae26c93 100644 --- a/whiz.yaml +++ b/whiz.yaml @@ -117,7 +117,7 @@ setup: - typegraph/python/pyproject.toml - website/package.json env: - GHJK_VERSION: "423d38e" + GHJK_VERSION: "2725af8" command: | set -e curl -fsSL https://raw.githubusercontent.com/metatypedev/ghjk/$GHJK_VERSION/install.sh | bash