From 7a6fd18a32c311895370487b84730f916549d39f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl?= Date: Thu, 28 Mar 2024 12:26:41 +0300 Subject: [PATCH] feat(sdk): introduce flag for disabling hashing artifacts + move hash to rust (#645) #### Motivation and context The mdk codegen and typegraph mutually depends on each other (typegraph needs a concrete mdk.wasm for hashing, and for the mdk.wasm to be built, it needs type generation based on the typegraph) Add a flag to enable processing a partial typegraph when using `meta gen` (partial == no artifact resolution). #### Migration notes `get_file_hash` has been moved to core sdk (under the name `hash_file`) ### Checklist - [x] The change come with new or modified tests - [ ] Hard-to-understand functions have explanatory comments - [ ] End-user documentation is updated to reflect the change --------- Co-authored-by: Yohe-Am <56622350+Yohe-Am@users.noreply.github.com> --- .github/workflows/tests.yml | 101 ++++++------ dev/update.ts | 10 +- dev/utils.ts | 9 +- examples/deploy/deploy.py | 5 +- meta-cli/src/com/server.rs | 2 + meta-cli/src/com/store.rs | 10 ++ typegate/deno.lock | 148 +----------------- typegate/src/typegraphs/introspection.json | 4 +- typegate/src/typegraphs/prisma_migration.json | 34 +++- typegate/src/typegraphs/typegate.json | 4 +- typegate/tests/artifacts/rust.wasm | Bin 173492 -> 0 bytes typegate/tests/runtimes/wasmedge/wasmedge.py | 2 +- typegate/tests/runtimes/wasmedge/wasmedge.ts | 19 +-- .../tests/runtimes/wasmedge/wasmedge_test.ts | 3 +- typegate/tests/sync/typegraph_sync_test.ts | 2 + typegraph/core/src/conversion/runtimes.rs | 4 +- typegraph/core/src/typegraph.rs | 35 ++--- typegraph/core/src/utils/fs_host.rs | 17 +- typegraph/core/src/utils/postprocess/mod.rs | 15 +- .../core/src/utils/postprocess/wasmedge_rt.rs | 11 +- typegraph/core/wit/typegraph.wit | 4 +- typegraph/node/sdk/src/runtimes/wasmedge.ts | 8 +- typegraph/node/sdk/src/tg_manage.ts | 1 + typegraph/node/sdk/src/utils/file_utils.ts | 41 ----- typegraph/python/typegraph/graph/tg_manage.py | 3 + .../python/typegraph/runtimes/wasmedge.py | 4 +- typegraph/python/typegraph/utils.py | 19 --- website/static/specs/0.0.3.json | 7 + 28 files changed, 181 insertions(+), 341 deletions(-) delete mode 100755 typegate/tests/artifacts/rust.wasm delete mode 100644 typegraph/node/sdk/src/utils/file_utils.ts diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index dd23969e36..ff9633bca6 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -175,58 +175,55 @@ jobs: cargo run --locked --package meta-cli -- --help cargo test --locked --package meta-cli - # test-docker: - # needs: changes - # if: ${{ needs.changes.outputs.typegate == 'true' }} - # runs-on: ${{ matrix.runner }} - # strategy: - # fail-fast: false - # matrix: - # include: - # - platform: linux/amd64 - # runner: ubuntu-latest - # # - platform: linux/amd64 - # # runner: custom-ubuntu-large - # # FIXME: try macos-14 runner once all actions support it - # # docker buildx action broken as of 2024-02-09 - # # TODO - # # - platform: linux/arm64 - # # runner: custom-macos - # steps: - # - uses: actions/checkout@v4 - # - uses: docker/setup-buildx-action@v3 - # - uses: scherermichael-oss/action-has-permission@master - # id: check - # with: - # required-permission: write - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # - uses: docker/login-action@v3 - # if: steps.check.outputs.has-permission - # with: - # registry: docker.io - # username: zifeo - # password: ${{ secrets.DOCKERHUB_TOKEN }} - # - name: Build with cache (internal) - # uses: docker/build-push-action@v5 - # if: steps.check.outputs.has-permission - # with: - # file: dev/Dockerfile - # platforms: ${{ matrix.platform }} - # push: false - # cache-from: type=registry,ref=docker.io/zifeo/metatype-cache:ci - # cache-to: type=registry,ref=docker.io/zifeo/metatype-cache:ci,mode=max - # # check target runs extra validation steps in the Dockerfile - # target: check - # - name: Build without cache (external) - # uses: docker/build-push-action@v5 - # if: "! steps.check.outputs.has-permission" - # with: - # file: dev/Dockerfile - # platforms: linux/amd64 - # push: false - # cache-from: type=registry,ref=ghcr.io/${{ github.repository_owner }}/typegate:latest - # target: check + test-docker: + needs: changes + if: ${{ needs.changes.outputs.typegate == 'true' }} + runs-on: ${{ matrix.runner }} + strategy: + fail-fast: false + matrix: + include: + - platform: linux/amd64 + 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 + steps: + - uses: actions/checkout@v4 + - uses: docker/setup-buildx-action@v3 + - uses: scherermichael-oss/action-has-permission@master + id: check + with: + required-permission: write + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - uses: docker/login-action@v3 + if: steps.check.outputs.has-permission + with: + registry: docker.io + username: zifeo + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build with cache (internal) + uses: docker/build-push-action@v5 + if: steps.check.outputs.has-permission + with: + file: dev/Dockerfile + platforms: ${{ matrix.platform }} + push: false + cache-from: type=registry,ref=docker.io/zifeo/metatype-cache:ci + cache-to: type=registry,ref=docker.io/zifeo/metatype-cache:ci,mode=max + # check target runs extra validation steps in the Dockerfile + target: check + - name: Build without cache (external) + uses: docker/build-push-action@v5 + if: "! steps.check.outputs.has-permission" + with: + file: dev/Dockerfile + platforms: linux/amd64 + push: false + cache-from: type=registry,ref=ghcr.io/${{ github.repository_owner }}/typegate:latest + target: check test-full: needs: changes diff --git a/dev/update.ts b/dev/update.ts index e87c5ef7c2..83388077eb 100644 --- a/dev/update.ts +++ b/dev/update.ts @@ -60,16 +60,20 @@ const tsFiles = [ { root: projectDir, globstar: true, - exclude: ["typegate/tests/e2e/nextjs"], + exclude: [ + "typegate/tests/e2e/nextjs", + "typegate/tests/runtimes/temporal/worker", + ], }, ), ].map((f: WalkEntry) => f.path); await runOrExit([ - "deno", + Deno.execPath(), "cache", `--config=${denoConfigPath}`, - "--unstable", + "--unstable-worker-options", + "--unstable-net", ...flags["cache-only"] ? [] : ["--reload", "--lock-write"], ...tsFiles, ], projectDir); diff --git a/dev/utils.ts b/dev/utils.ts index 5142f5dbe5..371947e035 100644 --- a/dev/utils.ts +++ b/dev/utils.ts @@ -13,16 +13,17 @@ export async function runOrExit( cwd?: string, env: Record = {}, ) { + // console.error("shell: ", cmd.join(" "), { env, cwd }); const p = new Deno.Command(cmd[0], { args: cmd.slice(1), cwd, - stdout: "piped", - stderr: "piped", + // stdout: "piped", + // stderr: "piped", env: { ...Deno.env.toObject(), ...env }, }).spawn(); - await p.stdout.pipeTo(Deno.stdout.writable, { preventClose: true }); - await p.stderr.pipeTo(Deno.stderr.writable, { preventClose: true }); + // await p.stdout.pipeTo(Deno.stdout.writable, { preventClose: true }); + // await p.stderr.pipeTo(Deno.stderr.writable, { preventClose: true }); const { code, success } = await p.status; if (!success) { diff --git a/examples/deploy/deploy.py b/examples/deploy/deploy.py index d69d390dfb..431eb668af 100644 --- a/examples/deploy/deploy.py +++ b/examples/deploy/deploy.py @@ -82,7 +82,10 @@ def deploy_example_python(g: Graph): runtime_actions=None, # usually set from the cli ) artifacts_config = ArtifactResolutionConfig( - prefix=None, dir=None, prisma_migration=config_params + prefix=None, + dir=None, + prisma_migration=config_params, + disable_artifact_resolution=None, ) diff --git a/meta-cli/src/com/server.rs b/meta-cli/src/com/server.rs index 01a54ecd8d..26ac1a2548 100644 --- a/meta-cli/src/com/server.rs +++ b/meta-cli/src/com/server.rs @@ -59,6 +59,7 @@ async fn config(req: HttpRequest) -> impl Responder { let endpoint = ServerStore::get_endpoint(); let secrets = ServerStore::get_secrets(); let migration_action_glob = ServerStore::get_migration_action_glob(); + let disable_artifact_resolution = !ServerStore::get_artifact_resolution_flag(); let mut migration_action_per_rt = vec![]; if let Some(per_rt_actions) = @@ -96,6 +97,7 @@ async fn config(req: HttpRequest) -> impl Responder { "globalAction": migration_action_glob, "runtimeAction": migration_action_per_rt }, + "disableArtifactResolution": disable_artifact_resolution }, }); diff --git a/meta-cli/src/com/store.rs b/meta-cli/src/com/store.rs index 42d5fead5d..5dd2a15e21 100644 --- a/meta-cli/src/com/store.rs +++ b/meta-cli/src/com/store.rs @@ -68,6 +68,7 @@ pub struct ServerStore { endpoint: Endpoint, prefix: Option, sdk_responses: HashMap>>, + artifact_resolution: Option, } #[allow(dead_code)] @@ -176,4 +177,13 @@ impl ServerStore { pub fn get_prefix() -> Option { with_store(|s| s.prefix.to_owned()) } + + pub fn set_artifact_resolution_flag(value: bool) { + with_store_mut(|s| s.artifact_resolution = Some(value)) + } + + /// true by default + pub fn get_artifact_resolution_flag() -> bool { + with_store(|s| s.artifact_resolution.unwrap_or(true)) + } } diff --git a/typegate/deno.lock b/typegate/deno.lock index 901aa42d8b..029acfc602 100644 --- a/typegate/deno.lock +++ b/typegate/deno.lock @@ -3,7 +3,6 @@ "packages": { "specifiers": { "npm:@sentry/node@7.70.0": "npm:@sentry/node@7.70.0", - "npm:@types/node": "npm:@types/node@18.16.19", "npm:chance@1.1.11": "npm:chance@1.1.11", "npm:graphql@16.8.1": "npm:graphql@16.8.1", "npm:json-schema-faker@0.5.3": "npm:json-schema-faker@0.5.3", @@ -13,10 +12,10 @@ "npm:validator": "npm:validator@13.11.0" }, "npm": { - "@babel/runtime@7.23.2": { - "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "@babel/runtime@7.24.1": { + "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==", "dependencies": { - "regenerator-runtime": "regenerator-runtime@0.14.0" + "regenerator-runtime": "regenerator-runtime@0.14.1" } }, "@sentry-internal/tracing@7.70.0": { @@ -60,10 +59,6 @@ "tslib": "tslib@2.6.2" } }, - "@types/node@18.16.19": { - "integrity": "sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==", - "dependencies": {} - }, "agent-base@6.0.2": { "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dependencies": { @@ -174,7 +169,7 @@ "mathjs@11.11.1": { "integrity": "sha512-uWrwMrhU31TCqHKmm1yFz0C352njGUVr/I1UnpMOxI/VBTTbCktx/mREUXx5Vyg11xrFdg/F3wnMM7Ql/csVsQ==", "dependencies": { - "@babel/runtime": "@babel/runtime@7.23.2", + "@babel/runtime": "@babel/runtime@7.24.1", "complex.js": "complex.js@2.1.1", "decimal.js": "decimal.js@10.4.3", "escape-latex": "escape-latex@1.2.0", @@ -268,8 +263,8 @@ "xtend": "xtend@4.0.2" } }, - "regenerator-runtime@0.14.0": { - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", + "regenerator-runtime@0.14.1": { + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", "dependencies": {} }, "seedrandom@3.0.5": { @@ -309,8 +304,7 @@ "redirects": { "https://cdn.pika.dev/big.js/^5.2.2": "https://cdn.skypack.dev/big.js@^5.2.2", "https://crux.land/router@0.0.5": "https://crux.land/api/get/2KNRVU.ts", - "https://github.com/levibostian/deno-udd/raw/ignore-prerelease/mod.ts": "https://raw.githubusercontent.com/levibostian/deno-udd/ignore-prerelease/mod.ts", - "https://github.com/metatypedev/metatype/raw/feat/MET-250/refactor-ffi/typegate/src/main.ts": "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/main.ts" + "https://github.com/levibostian/deno-udd/raw/ignore-prerelease/mod.ts": "https://raw.githubusercontent.com/levibostian/deno-udd/ignore-prerelease/mod.ts" }, "remote": { "https://cdn.skypack.dev/-/big.js@v5.2.2-sUR8fKsGHRxsJyqyvOSP/dist=es2019,mode=imports/optimized/bigjs.js": "b6d8e6af0c1f7bdc7e8cd0890819ecee2dcbb0776ec4089eae281de8ebd7b2bd", @@ -472,38 +466,6 @@ "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.192.0/_util/asserts.ts": "178dfc49a464aee693a7e285567b3d0b555dc805ff490505a8aae34f9cfb1462", - "https://deno.land/std@0.192.0/_util/os.ts": "d932f56d41e4f6a6093d56044e29ce637f8dcc43c5a90af43504a889cf1775e3", - "https://deno.land/std@0.192.0/collections/filter_values.ts": "5b9feaf17b9a6e5ffccdd36cf6f38fa4ffa94cff2602d381c2ad0c2a97929652", - "https://deno.land/std@0.192.0/collections/map_values.ts": "431b78fd770c72cc978ca7bbfa08cdc0805e69c7d2b69ad19859e093467bd46d", - "https://deno.land/std@0.192.0/fs/_util.ts": "fbf57dcdc9f7bc8128d60301eece608246971a7836a3bb1e78da75314f08b978", - "https://deno.land/std@0.192.0/fs/copy.ts": "14214efd94fc3aa6db1e4af2b4b9578e50f7362b7f3725d5a14ad259a5df26c8", - "https://deno.land/std@0.192.0/fs/empty_dir.ts": "c3d2da4c7352fab1cf144a1ecfef58090769e8af633678e0f3fabaef98594688", - "https://deno.land/std@0.192.0/fs/ensure_dir.ts": "dc64c4c75c64721d4e3fb681f1382f803ff3d2868f08563ff923fdd20d071c40", - "https://deno.land/std@0.192.0/fs/ensure_file.ts": "c38602670bfaf259d86ca824a94e6cb9e5eb73757fefa4ebf43a90dd017d53d9", - "https://deno.land/std@0.192.0/fs/ensure_link.ts": "c0f5b2f0ec094ed52b9128eccb1ee23362a617457aa0f699b145d4883f5b2fb4", - "https://deno.land/std@0.192.0/fs/ensure_symlink.ts": "5006ab2f458159c56d689b53b1e48d57e05eeb1eaf64e677f7f76a30bc4fdba1", - "https://deno.land/std@0.192.0/fs/eol.ts": "f1f2eb348a750c34500741987b21d65607f352cf7205f48f4319d417fff42842", - "https://deno.land/std@0.192.0/fs/exists.ts": "29c26bca8584a22876be7cb8844f1b6c8fc35e9af514576b78f5c6884d7ed02d", - "https://deno.land/std@0.192.0/fs/expand_glob.ts": "e4f56259a0a70fe23f05215b00de3ac5e6ba46646ab2a06ebbe9b010f81c972a", - "https://deno.land/std@0.192.0/fs/mod.ts": "bc3d0acd488cc7b42627044caf47d72019846d459279544e1934418955ba4898", - "https://deno.land/std@0.192.0/fs/move.ts": "b4f8f46730b40c32ea3c0bc8eb0fd0e8139249a698883c7b3756424cf19785c9", - "https://deno.land/std@0.192.0/fs/walk.ts": "920be35a7376db6c0b5b1caf1486fb962925e38c9825f90367f8f26b5e5d0897", - "https://deno.land/std@0.192.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0", - "https://deno.land/std@0.192.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b", - "https://deno.land/std@0.192.0/path/_util.ts": "d7abb1e0dea065f427b89156e28cdeb32b045870acdf865833ba808a73b576d0", - "https://deno.land/std@0.192.0/path/common.ts": "ee7505ab01fd22de3963b64e46cff31f40de34f9f8de1fff6a1bd2fe79380000", - "https://deno.land/std@0.192.0/path/glob.ts": "d479e0a695621c94d3fd7fe7abd4f9499caf32a8de13f25073451c6ef420a4e1", - "https://deno.land/std@0.192.0/path/mod.ts": "f065032a7189404fdac3ad1a1551a9ac84751d2f25c431e101787846c86c79ef", - "https://deno.land/std@0.192.0/path/posix.ts": "8b7c67ac338714b30c816079303d0285dd24af6b284f7ad63da5b27372a2c94d", - "https://deno.land/std@0.192.0/path/separator.ts": "0fb679739d0d1d7bf45b68dacfb4ec7563597a902edbaf3c59b50d5bcadd93b1", - "https://deno.land/std@0.192.0/path/win32.ts": "d186344e5583bcbf8b18af416d13d82b35a317116e6460a5a3953508c3de5bba", - "https://deno.land/std@0.194.0/_util/asserts.ts": "178dfc49a464aee693a7e285567b3d0b555dc805ff490505a8aae34f9cfb1462", - "https://deno.land/std@0.194.0/async/deferred.ts": "42790112f36a75a57db4a96d33974a936deb7b04d25c6084a9fa8a49f135def8", - "https://deno.land/std@0.194.0/async/delay.ts": "73aa04cec034c84fc748c7be49bb15cac3dd43a57174bfdb7a4aec22c248f0dd", - "https://deno.land/std@0.194.0/bytes/copy.ts": "939d89e302a9761dcf1d9c937c7711174ed74c59eef40a1e4569a05c9de88219", - "https://deno.land/std@0.194.0/io/buf_reader.ts": "06fff3337091c49e99ebd2dd790c9a90364c087a2953ea081667400fd6c6cebb", - "https://deno.land/std@0.194.0/io/buf_writer.ts": "48c33c8f00b61dcbc7958706741cec8e59810bd307bc6a326cbd474fe8346dfd", "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/_constants.ts": "8a9da298c26750b28b326b297316cdde860bc237533b07e1337c021379e6b2a9", @@ -538,7 +500,6 @@ "https://deno.land/std@0.202.0/assert/unimplemented.ts": "d56fbeecb1f108331a380f72e3e010a1f161baa6956fd0f7cf3e095ae1a4c75a", "https://deno.land/std@0.202.0/assert/unreachable.ts": "4600dc0baf7d9c15a7f7d234f00c23bca8f3eba8b140286aaca7aa998cf9a536", "https://deno.land/std@0.202.0/async/deferred.ts": "42790112f36a75a57db4a96d33974a936deb7b04d25c6084a9fa8a49f135def8", - "https://deno.land/std@0.202.0/async/delay.ts": "a6142eb44cdd856b645086af2b811b1fcce08ec06bb7d50969e6a872ee9b8659", "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", @@ -547,7 +508,6 @@ "https://deno.land/std@0.202.0/collections/distinct_by.ts": "3afe11d81eafb30c7c9dbf568d94357f3d88153292c00671b72cd695deae6602", "https://deno.land/std@0.202.0/collections/filter_keys.ts": "a29cfe8730ddb54e9e071ea45e8a82e166c7629d18675652def70c1bf80e2ef6", "https://deno.land/std@0.202.0/collections/filter_values.ts": "16e1fc456a7969e770ec5b89edf5ac97b295ca534b47c1a83f061b409aad7814", - "https://deno.land/std@0.202.0/collections/group_by.ts": "f90f483598b38f0174f946589f3af25b1c3cf89d4f3b14d4f0fbe3aaaca0abdd", "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", @@ -581,7 +541,6 @@ "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/http/server.ts": "1b2403b3c544c0624ad23e8ca4e05877e65380d9e0d75d04957432d65c3d5f41", "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", @@ -691,7 +650,6 @@ "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/testing/asserts.ts": "b4e4b1359393aeff09e853e27901a982c685cb630df30426ed75496961931946", "https://deno.land/std@0.202.0/testing/snapshot.ts": "d53cc4ad3250e3a826df9a1a90bc19c9a92c8faa8fd508d16b5e6ce8699310ca", "https://deno.land/std@0.202.0/url/_strip.ts": "86f852d266b86e5867f50ac5d453bedea7b7e7a1919669df93d66a0b59b00e5b", "https://deno.land/std@0.202.0/url/basename.ts": "232e7570ee75fdaafe205e6216a8c0c4a6236db32a1fe81ac3d5a1adbb8365fa", @@ -949,8 +907,6 @@ "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/std@0.83.0/bytes/mod.ts": "e4f91c6473fe13e3cf1a23649137f87f49135c10bc08fc0f83382a0fb0b03744", - "https://deno.land/x/caller@0.1.4/caller.ts": "22e23d46ea649f9d1cd2dbcf920aa6ba50956e021ca0089b9e070b759f84cab0", "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/color_util@1.0.1/colors/cmykcolor.ts": "f717cee02bdec255c7c2879b55033da7547d46c1fbb8ada7980d49bd2c1554ee", @@ -1075,27 +1031,6 @@ "https://deno.land/x/oauth2_client@v1.0.2/src/types.ts": "3327c2e81bc483e91843fb103595dd304393c3ac2a530d1c89200b6a5cf75e13", "https://deno.land/x/outdent@v0.8.0/mod.ts": "72630e680dcc36d5ae556fbff6900b12706c81a6fd592345fc98bcc0878fb3ca", "https://deno.land/x/outdent@v0.8.0/src/index.ts": "6dc3df4108d5d6fedcdb974844d321037ca81eaaa16be6073235ff3268841a22", - "https://deno.land/x/readline@v1.1.0/deps.ts": "ad98d16593ba9981320c193bc306cb6c00b491ad4ea265ff3c8b26285bcba74a", - "https://deno.land/x/readline@v1.1.0/mod.ts": "fdfe3162d558e75c3ae20e7f23e0fe894205c1040ab08b1bd5169da877594487", - "https://deno.land/x/redis@v0.31.0/backoff.ts": "33e4a6e245f8743fbae0ce583993a671a3ac2ecee433a3e7f0bd77b5dd541d84", - "https://deno.land/x/redis@v0.31.0/command.ts": "9d1a679821c9065298fc2b8831b6532605426259b17a1f9d41ee9219180244c7", - "https://deno.land/x/redis@v0.31.0/connection.ts": "dc22be33b61a315992a943d03948153ab7eabdbc9983719b546b72bfefdf1f90", - "https://deno.land/x/redis@v0.31.0/errors.ts": "589c41fc0fbd9fbac896a2517cf461a6af211432dd4bb77e0681f5a256d46e66", - "https://deno.land/x/redis@v0.31.0/executor.ts": "ffb74d4f5383ae33ca7896ca883860f3e98719c6465ab68cad43e152eed3d2bd", - "https://deno.land/x/redis@v0.31.0/mod.ts": "77fa981b447b027da65e59679ef6c88b02d15a24fb33d6b0870d2c4e0d319807", - "https://deno.land/x/redis@v0.31.0/pipeline.ts": "149b64138fa526467c9afa36757deb96c5df51ce1c34a9249c2ca0c76c2dc912", - "https://deno.land/x/redis@v0.31.0/protocol/_util.ts": "0525f7f444a96b92cd36423abdfe221f8d8de4a018dc5cb6750a428a5fc897c2", - "https://deno.land/x/redis@v0.31.0/protocol/command.ts": "46ed3727a002cfd49afefbdd3b872529e6c4c6215099511d63f0cffb88aaa969", - "https://deno.land/x/redis@v0.31.0/protocol/mod.ts": "fd926647bf7bfc4aed967adf0010ed1cf79245d999310b82b1918a3d676dbb52", - "https://deno.land/x/redis@v0.31.0/protocol/reply.ts": "82434aa6b0e64ec26aae3b739711ee932a255febb1ecc1fc913cf429be1ac9f1", - "https://deno.land/x/redis@v0.31.0/protocol/types.ts": "f8b8ea762313243dd81ac146b36dabbff672c827f05f4506539846645c65da86", - "https://deno.land/x/redis@v0.31.0/pubsub.ts": "68234e7edce9382631e2ec40a434d0ab221bea23deab8b428f19eec8bcaad669", - "https://deno.land/x/redis@v0.31.0/redis.ts": "3747018a954c1229cf133cfbc511356b76324b87f51f4d882538c0a8d2b3fcb4", - "https://deno.land/x/redis@v0.31.0/stream.ts": "baed5a4e67d7c5c5a6ed424205c3e984383c5eadf74d7e0e068f8694865595e4", - "https://deno.land/x/redis@v0.31.0/vendor/https/deno.land/std/async/deferred.ts": "f62d1787bff301374d926d1bdf802a27e57f2dcd222ad8e9aea57828843f8bb0", - "https://deno.land/x/redis@v0.31.0/vendor/https/deno.land/std/async/delay.ts": "02287836867605a1bc3c8988d581c965413fa86053c4b00a0d3b4e0e8b180c5b", - "https://deno.land/x/redis@v0.31.0/vendor/https/deno.land/std/io/buf_reader.ts": "19c85ef56b347850fe7d8af842f4fd460024ec4baba2dcf1aa60bb3a4c740797", - "https://deno.land/x/redis@v0.31.0/vendor/https/deno.land/std/io/buf_writer.ts": "96b76346974976c34d23d39728f1f086495c6a20856abde20876f83f20b2dc05", "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", @@ -1270,73 +1205,6 @@ "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", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/config.ts": "6f21a1ebc996dde4d0facccd81542c183042f281fc251b2ce900ff7c5132f45f", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/crypto.ts": "a3fec70d2b7eec16a5b2b7100080b5164b2c002708aec5af74ff0d763b833f8a", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/engine/computation_engine.ts": "17a69d2fdb2160d7dc9e4a839071e55b60aeda800d81f89e430eb9badad39642", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/engine/planner/args.ts": "db35af27e2789682e37d1b474ad404bcc9ceed693961814f1d76bcff6cfbdac3", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/engine/planner/dependency_resolver.ts": "98c9505a700ad0cd74fac327e7258aae6bbd60cd60587a4ec56bcfe57cf6fe79", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/engine/planner/injection_utils.ts": "21a0b4117e00c48533a83bd2985046eb4510aba3c331c02bf64920d719d282bc", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/engine/planner/mod.ts": "d1200441068eca6ab3c4075faa40f08e7964c82fb153e53f72e1405c275d5f28", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/engine/planner/policies.ts": "7bdf11af15e34ad4f421da6920ff2f318bdd233579f03bbba207b8dd7ee38a0f", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/engine/query_engine.ts": "b797f27fc067a56cace094f03594ded4ba11e1791f5eeceabcb562b6ec36c709", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/engine/stage_id.ts": "b3b3c62215ff421103788079b77943af8f0026a56eafaa929415cb39ccde3cca", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/engine/typecheck/code_generator.ts": "6061ced53785ba861d35055f244df1569867ca4038c17f0642307c618125e3c5", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/engine/typecheck/common.ts": "4ffe1e3ff6db33131cd7917e76dae2853b3834508bbbffd4ad9e693a4cd37c22", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/engine/typecheck/input.ts": "488355dfa059be7232fd86d6b26317ee81a99b7fad17284d6ac1f2442d267380", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/engine/typecheck/matching_variant.ts": "9d9e2f149cbfa08fe39c648198644cb899ff26a2a0ba8d03281c25c338abf42f", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/engine/typecheck/result.ts": "571ef0c51ab311d7e811692c8f683b859b8d46535afbdc84be3dcc0222c86f04", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/errors.ts": "0c9739966d001d5b9f2b8b74bc08fa3457e75892ed7a74ad4ae85c61cda1051a", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/log.ts": "e25e0ec09b89d79409853aae057ca43faf7fb03d5bd8acd46e43a724987cd31b", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/main.ts": "cb6023066fa3ac2f7c370b48ca6ee25323777a115f8450c23869d54549cf5d8c", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/replicated_map.ts": "c1ac563289b145d958e10b06dce69a2f2ea5cec5dfe9d0f23b4b827e1fca3ceb", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/runtimes/Runtime.ts": "002a080e00e3d280ad15be1c3a246dd6d8937f01ee2627325d31922722285815", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/runtimes/deno/deno.ts": "525f92ada58503fcd18a6c2077a7a8526f2c1dabdcff65a75b5c880c39ff72b6", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/runtimes/deno/deno_messenger.ts": "615ec7ac10c7476d74948aa3042d0fc9170ba4d7b9a1fb76ad970ac18e0b990b", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/runtimes/deno/shared_types.ts": "2ef1fa347c241162a8a32cebb1113b20f94326c4b20b0883e72b79bb879e5d07", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/runtimes/mod.ts": "c7a0829600d5497c83864544d3167ca6dee6357e59385b0c5843bb8c6fb5e446", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/runtimes/patterns/messenger/async_messenger.ts": "4f6b1af75527a43df73885ba8f926ca41697a914effe9002073fd76b9806a4df", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/runtimes/patterns/messenger/lazy_async_messenger.ts": "2d5a4744ff6951eace45d765d1b3617ac5dbebddd5b1d18aea2eb59e4eb4acb8", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/runtimes/patterns/messenger/types.ts": "8d1ea8fabadb2ed69adaea30222daf0cf13f7e95fa095ba7699e565004004b84", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/runtimes/prisma/hooks/generate_schema.ts": "1e5df70dbe8080248fcee76af4b93b9186d3795eb7989b6578841057b08bd7e2", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/runtimes/prisma/hooks/mod.ts": "3e33752e3676b538c7016f3ddd4f1f49d75e217c410bcaa6319d33ed987d3c60", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/runtimes/prisma/hooks/run_migrations.ts": "c8b0db5cf57ad06eb21c6a7908b5f57645e123130cdf77c96db71f9a27edd48b", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/runtimes/prisma/migration.ts": "0a4012595469fa411827fc0e0cf4af72986eaa739edded0006ba6bed0661f280", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/runtimes/prisma/mod.ts": "a0e44e86a45aad8b2bb0357ddbe8ba02802e6979451553940ec3688be571127f", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/runtimes/prisma/prisma.ts": "f16d7cfc919039e37a3a4b0bbd4218a7b358d7a1a8f3c9942d344b7f1aaf6985", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/runtimes/prisma/types.ts": "44e221d8143e314e8db39b62e245518a290bf4248ace208a755d0aa1a5af99bb", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/runtimes/typegate.ts": "9811e11eddc8f3a0bb884a041cfbfdc91df8c208a79e59d1c370ddc75d9a7670", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/runtimes/typegraph.ts": "55b5d9b6a4a0d536a06d63b57e863f12f3dae38b2b421f205c50340424e43f7f", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/services/auth/cookies.ts": "1ba5bf4de32655a6586f246da3cfe8d12be48283643f9523dc5fa069f1536907", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/services/auth/mod.ts": "df8d917a5ec7c324b966b8f37f630c3d6753c122844b2cba6002691e9b4f7252", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/services/auth/protocols/basic.ts": "bddfe3fe53d06fd6341a3c3fea1e804705cd7bcfba5f7e969774602818c147ce", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/services/auth/protocols/internal.ts": "da8691842fe28a16a17261bf0b953b35d17d05c84a291b0e3397406b27c5f1a2", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/services/auth/protocols/jwt.ts": "fa391369332dce68573cb6e912b18a3d62283d1c78bfc75658adccf115dba863", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/services/auth/protocols/oauth2.ts": "c6abb32b16f997cf2db5ce976882d853316d7ca822b6c12be33d2fbcf5f828a2", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/services/auth/protocols/protocol.ts": "ba8c8883f8d5a4c8ab0bbc12a59bbb1641ec15e96456804c0343dc99decce4ee", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/services/graphql_service.ts": "88b709f4b4e619f4b26806ffe0df465d9f8de7c5a492fd4a8f6ed13ca2cb88da", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/services/info_service.ts": "8b44f333bf0d6ee94af7da9a616b8bed92854e8b475d29c39ec02963eff5270b", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/services/middlewares.ts": "68a2e47738d7886106c9f41e387e105801a9d63483773bf14d596f65539a570b", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/services/playground_service.ts": "2b6f64b78f3ef35e99512529cb4cc07fbd36fddf08d6c942f75279d9c1ba8ec4", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/services/responses.ts": "fcd9b960d26b1f20853a35c60acb29fb8b0a2800ce2f44a0ab036ad01475f0ab", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/services/rest_service.ts": "e2103f70ec61d146d94b2446a083f98c1d6be6331b94df56f12a50b1643e20f3", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/system_typegraphs.ts": "3e9c18fbf2ab4d89488ed37f57d3dda0188699f99ee3baed6d513cfcf40a8d2b", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/transports/graphql/graphql.ts": "fd36d55366b2d0736580a2d8a7c408b6070ad7291db3cfbba37a6ed06ad01733", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/transports/graphql/request_parser.ts": "afbc95debcb1bbfa6fc2b88937d7abedbed1f4335bb2d17bf98c7293761cfdb0", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/transports/graphql/typegraph.ts": "e79b5acd4993a902ca4104f30075931bda49c140a5297920b644d6d3f4712ef2", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/transports/graphql/utils.ts": "ab4ee0fe51e53b4b21f7f2cfc4c77513a47d641a0bfe6822ceb46a7d8128adb9", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/transports/rest/rest_schema_generator.ts": "80d22818682b9856368dd87bf3085d6d7f53b7facf3412956588666b518bb8e5", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/typegate/hooks.ts": "acfb28115a5aed0473ce869e83a226909bf2f49422d41deccbf91389bcef2df6", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/typegate/mod.ts": "848ba0eb8e9dfa28fd10d2f02c9ea1e842d17e46a3fd60ae3e15cf3e293426ec", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/typegate/rate_limiter.ts": "2d6711ede0de4fbfc8f82491e0ac9c0e37528bed5a701f9fc3e37837d5c365c5", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/typegate/register.ts": "837c7779e5fc85455ccac3439694672f5f0d0f787b81d92488af231b88f81308", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/typegraph/mod.ts": "a5b0a9346f3d143b849c3f412685669a0e32f177eb6bb8207af7f1cfa3262eae", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/typegraph/type_node.ts": "e5956ba47eaa04fa1287314991e197c3b502d1a73cf377137f7482190defcb41", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/typegraph/types.ts": "480b9db8fb9d888bf92723dfa9f3ac1a0f493c42f57e6284eb03081ef3345b11", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/typegraph/utils.ts": "09e0d110026dae5c796bfdfbf9f0e374a23e6aa8bac7ea98bf115ef0cb5289d9", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/typegraph/versions.ts": "0846090dc468f8186a290469eb3d6ea66e79cbb14d1a851b12915e391e36a956", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/typegraph/visitor.ts": "854f2dd1adadc62ea2050f6e0f293c88f76d4feefb7620bcc490049fb8967043", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/types.ts": "1857e6bf96b0642e15352e10dd4e175c4983edc421868ae0158ce271e075926d", - "https://raw.githubusercontent.com/metatypedev/metatype/feat/MET-250/refactor-ffi/typegate/src/utils.ts": "8a34944dc326d1759c67fcdd4a714f99838d5eac040773bcdb7287a00118923b" + "https://raw.githubusercontent.com/levibostian/deno-udd/ignore-prerelease/semver.ts": "c051a906405dd72b55434eb0f390f678881379d57847abe4ec60d8a02af4f6f2" } } diff --git a/typegate/src/typegraphs/introspection.json b/typegate/src/typegraphs/introspection.json index ac46e21fa2..c3d7d1550a 100644 --- a/typegate/src/typegraphs/introspection.json +++ b/typegate/src/typegraphs/introspection.json @@ -597,8 +597,8 @@ }, "auths": [], "rate": null, - "ref_artifacts": {}, "version": "0.0.3", - "random_seed": null + "random_seed": null, + "ref_artifacts": {} } } \ No newline at end of file diff --git a/typegate/src/typegraphs/prisma_migration.json b/typegate/src/typegraphs/prisma_migration.json index a41dc97b89..7fad7f2743 100644 --- a/typegate/src/typegraphs/prisma_migration.json +++ b/typegate/src/typegraphs/prisma_migration.json @@ -15,13 +15,21 @@ "deploy": 14, "reset": 18 }, - "required": ["diff", "apply", "create", "deploy", "reset"] + "required": [ + "diff", + "apply", + "create", + "deploy", + "reset" + ] }, { "type": "function", "title": "func_10", "runtime": 1, - "policies": [0], + "policies": [ + 0 + ], "config": {}, "as_id": false, "input": 2, @@ -87,7 +95,9 @@ "type": "function", "title": "func_23", "runtime": 1, - "policies": [0], + "policies": [ + 0 + ], "config": {}, "as_id": false, "input": 8, @@ -137,7 +147,9 @@ "type": "function", "title": "func_40", "runtime": 1, - "policies": [0], + "policies": [ + 0 + ], "config": {}, "as_id": false, "input": 12, @@ -181,7 +193,9 @@ "type": "function", "title": "func_51", "runtime": 1, - "policies": [0], + "policies": [ + 0 + ], "config": {}, "as_id": false, "input": 15, @@ -229,7 +243,9 @@ "type": "function", "title": "func_58", "runtime": 1, - "policies": [0], + "policies": [ + 0 + ], "config": {}, "as_id": false, "input": 19, @@ -350,7 +366,9 @@ "name": "basic", "protocol": "basic", "auth_data": { - "users": ["admin"] + "users": [ + "admin" + ] } } ], @@ -365,4 +383,4 @@ "random_seed": null, "ref_artifacts": {} } -} +} \ No newline at end of file diff --git a/typegate/src/typegraphs/typegate.json b/typegate/src/typegraphs/typegate.json index 9d43f10292..779b5cbe17 100644 --- a/typegate/src/typegraphs/typegate.json +++ b/typegate/src/typegraphs/typegate.json @@ -913,8 +913,8 @@ "context_identifier": "user", "local_excess": 5 }, - "ref_artifacts": {}, "version": "0.0.3", - "random_seed": null + "random_seed": null, + "ref_artifacts": {} } } \ No newline at end of file diff --git a/typegate/tests/artifacts/rust.wasm b/typegate/tests/artifacts/rust.wasm deleted file mode 100755 index 4ea4a5c07a46df55ff4d2066d2cb181ef6a25b50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173492 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ðk~(U0$&^4j4^v-Yw`{i;>=_8h!=CIXd1DN?@qjw^dx+9tGaRdEypna za~zpWml7q8m1|NBu{hElijSjg>%~y224+G+g6iyZsEDwO)M$uFwd7;24I+_1Hrdtjn%IRns zpRIT<9=DsVml6(7GR{3%x|b^yI1|m`_k+m-9mJN)WI_O8yX1eOCl^E{NTNeky35X~lC#(4oty4Fn$B0fdbc;INuDg!=-HRs<^JA_-T}ZPd%NE(&cxw>F!dyni@-*l+ zIDM|<%LyF8aq$(qY9(K5oz0Q;)m(Te*h2zOCXUlPISl zFsB*ijAyL(XzS<99WyKip7R`q(k2J>|SD z`+YQ*FXeJc+r-z+i;ttCY!YW#d7#IeYRuxXXNn!Pe=8OTf7Cre>wNP4r%*+3eY$k z4Xztge#EXgiC-bH zePhSv>*U_ww;ubfefBx0d!}c=5GY_ypR@PcYp?aK@BRJ1FxLg;QvB%($YnjK849L( zPC_Yj3HL+ZG~)>OzI{NNNq4kMe@zIMysoo9?uhvF@KCd4PyY0iV)~Z zqsXtFvphh2oX$!jY_{d7#nLkMWz&M<-Ij$RAYk`EpMu3)Ek-@yb>b9n1C}32*)35_ z|32fIU0R^V%~4ZDB>{2lp0-HR*(O-Vp-bdJIN?%BeaA7CkqMI|loaS?vtG_c+VPS| zh)(QTl<6ZSisTcJkpnM5fipCyM>dnmOa^4x!KW}O^3ch5i!lxItVp8S{CzGwOS~b& zSf}0yED?7H@W6@#+7L8`dzrg6FZ3g^)Owjbk7XfpiJzg}B@tCpZ5{Z-tPb{5mz5>~ zwY%sFA^soz%B2bEauBFm6t{$lb}e*U5K8HJE(UBt51{$n{p~}#B(!kgRkEddO1NM$ zCB_#}+F+h<7JCutlzKDzSX6r+b24ZEQ;11w=A_rt!aHq9H=8i$w8vRqzK*u8QVF?P zAE13W9ZzocRZm!?)%x0$j7=&@frsM|_>)_%ty!tfZX|LC5KN8?sUajeQ;LIV4qJaiR%*JT1ve4k5{41a z9U;q*gq4JnAb%L1cVh-ypTV5BFivsPIO6?LaQ$06545GpOJRRmLY8!(Sk78&tGn~og)=5WQ zrLIqcuuk@n(ST*Nb_2xwbAb_~B4UU9#lc9rn|Zil(~Ier^!gof zOo}DOsi0X|chi)OoORJSlSx|^H`trfVCH6hiB05#-L8l_F%BYOT3q-q}^k=ac_tl%C9 zG_Pwo*=$2Zi6aYjo?U3p-~pK24bl-l2}A6Xk&Vv>N!27toqMD8R>);;8V)$Ah@Y}T zsQ7Ih+MDFvJ(tX-)re7BLn3v8m#hjV)6AR3ocpq2ODM%8kum`TrFUW9W)?I8vfwc% zD4I-Up5U1fZSsa*=AbSu$d#@pFQ}R=r)b%%6nW6z?fXhxr;;wFmOR705IWSG)k|H| z#^0qRBqSs*m35r8Wa(r@=uJrW|B{>?CtsATJs z`2=nYb!~tN+3T-Z06IpwMnNd?x)cO@%xn%^;#D|hocE==rp4P35IxVpaPk)Jat}j5 zAZ-fED033S4mRQ}r=RSkAV6y+<8X?NXSZc985qt7^s^!rYY#gepA!(z9fj=`=qMy? zXGx?*<*&*KxD!bMa)23Rl}zlu@7MEq6~^_$krkUudC9{%gvqXeSde zWqP;DPF=dz99M)+@efZ>4@f}rUqjDj4xMI^1qb~Av`1Z3A+#>)w+9MPR9a5)y z2OwQ-J?gik(x3p!tC4)#!rLxcb0##eDj3HOQ7y8l{cP$kZ|QE6i|T0;o#t#63bHGp z5>g0qmX)xLVPz(zWhJ27pbnmZL`;mfYLf^*gBwYvD6{W8coWj>QPRj|&!$b%yG(o? zp@(?d-IF$Lk&{rCHY6AVJvZaGmqd(KegYjwvL9Ga)MMaK@kU!lL|IqB8$=<#N8C7# zq*mqLy;f>0OcSISuLJ&MpQ%K|sg2}8A&bdFz0B8{@vEW?agInhmB?yp2keWHaFP7o zQ`n+f=S@SQGo^C{Np*&UU8--lC0d31E+Qo}if|U|Q4U}p;Ur)c5mVsjlSqq`0C+e% zsuni;GB$#iY#9PX07rp$5P7?>Fm~;5d!|@rlr&bzZR`p2D*B--^9w?pF>SLWaUJX2 zjev8)l{O(lN$|{$l$a`C6MP(4%qFkRW~rSx-)c7*d8hNJt}ITA2^)}P3jRV2R6u4n z4wZkgyD`cvqN?C9@0=2><*o)$7*i@~G0*|#69F7ES{I6$9n(N~h&UZ0maz3N<7f-O zh-_QhR#Tj(xM#7m?L|VX^Q@Icm=}?4rQ2!00{xq1qZui za|vAQ)mkZ5mgsW?KmcJAur7+Zsn?kev?N4bk+6#$Rq7xt0ogtF$z?}U!--x&A{Fr# zsy6)Rh!SixmCi@Gn~f^qe68Kx*?V9rttN5zzM&agw}=DaMEgOcfHN__@rNl)6VDmuBXF+5osvma^x#TD&)|T|3u9PimBbM zg90$61&CAGAq=GL8Btu zEWmC?)Td_9j_r||HLs5`EozYGuxG8JRp(^&0?-N@BP?YHOHG}IzRx*>PwGYh!@%j% zc$8!kQrliYtfaOkbJM&e55r8Q0PnSdU@3l!5wej#s5ovqq%cz#CXFrF1>ju)v?7a= zAfKpMGxlfB{1U8N+%#+-$^MjIMsZ+n+tcMZFt@<6fK(!M&_*hD)7jG(3Umx|rVOOt zw3UK*Oe~BfbJJChY`HwR04tkVAQ6%YE-!z+BI%bxG~i=to`g%$*+qk6LRJkSD>PGN zfA0gc+(NtF3=*U{?TM zasgg3QD}15In}!ON+xga6^62xQSRWaO6+NXa3~xjz>J}$Us(oNtXgFzkjoq6LS~_G zlwrA|QO|D7Z3h@qBGJ5LRU@isD0?SsM`WG3(l8$CPYobUY6=57A#ZpzKX;JUAeCz_ z;t&M7l(q=aJ~p5P{1=}B<-frc<9xPt+FsjdMv6v#Bi+RZLuGK%m2{d=0+tt|-ya;w zTTF4rNs4x6`YV(miEWOzAZc!;_JJ4#PC3wNsOk1@H6*o1ot>#WXBg1gVPU{;qu-O= zqF?WFjE*@B5>g9@665^CG$J72PfyF1K95VJ%$%2sfrq1P5?I&Ts=0-X4o^y7QeZ9cH&1fV#O=9BNIl)D8 zul;HCs|_gdt*3+*>j-=ipt>)cg!^GdoPm>C(m!K(eQQV6bhTP1ALJ%tGf|aM!bEU| z6Se7Yo$-^+ogS7EZV!5JMrjxt_Ux8rzL#|Cas1{i8>J&uU1^2|B>sMGl}H9@p>qB} zf-8t;A}UFy!tXSDF55Vlx|q)O!r^wTBNDZxw?ZC76n=QOcMSQ;B6NW)K)w{E?6?!_ z+C0!mIE%3y*_1$SlywQ3Xv-6FWfJg8NU`;%*-yB@^C6B$(>6#WGSmA>)|iAQjQ6aj z6GZ|nt{&iWn5LyTbMDBd!Qn;O211WOlsBzaqCQNzxZb$k+>u?x14wx*CFm_?WjpZ( z>Zv-}a#e>xC?~=zPO24b1JAq}q%`1ES`ptXm&uP=4b}8vB9m43@OY3zh}(y-eCVEQ zoD9Z;yAVj%OSHsUnc-e3VhX+~0QKH}+1U|}2{^I_lRzwxxJ)<$h;pj4&E5Mj#l3I> z)&(vD%J}i%W}sOZ>d>6S4P?A3LP%XbU2@P;1go%HFH$B$*+`IfV>(_o&e1b|BItkk@diQz;hoZ`X4(>m}<%Mk8tJ zKn((Vm>1?j$>sP51pk7fU#j1!LxLrDD{d8A+cCtl3Ivbj&45^i5dy-mzWVcm8&I%n zS~cC%8%+#boHF3PVw9pq>p6G!c&Aa&&|`wmkyFfHprg%Q=2ALP$f5+GWSl!vhdo=a zjzFWW9jQdb&#>pr2z^vFs4?JwVFuX2+?fFMp0dit-Jk|;;kY7YRlM3Ht;LvR{de4V z+|7nMKt3dmhSXz<*#NUKqkT?t|3YbB10(`jXebAPd9rnP7~NJUf}bP-{J1ew`Y?N* z9pks=p*aYFDvpYz`v4;6Ee{9U)wbt+9^>`oe5Dh>R_NwK$}qgQcLPx=3dr~8#JQ(B zUoFj((`?9d`^++S#P?(UKQvCssP+ea5ElndS3UF3$yN|#f|mjEMJoubJ-cS6Ja}b@ zZ?1+KEgcjhz~+FwE2%)$Z(xYr{J&qlfe(SoD-ceQ0%+;}MxhkUd#L$JmdQ#=blnNM z7C@?OUeLRjJ)^8_-tV@|ShC{${3)@C&!4hQHSC69#?gU{NCZ10A)py4Efc5GPeEiu zLUaWH4f>jphhlGZJvfXBUkn@6b;dpQegcJ$Ey5Xr{STJWlV2e1QapqR%A&fC?X{Qg z8AEe!Dr)CQ3ngX94%0Et%k&VU$y0SGnw_Lem)`pMmgWq(&1Dv#f&|3E2*X#vvfBH= zLGwBHfAA~%l`#b_`8lb;lVn2`i1G&*S`kj)11 z4ANdkA7tC409Q0IrYCW(I-T8PAMD+V|At!YA|gJAClJliT&yX^_)@Vxq^R7~m{^rU zQj#S14n>3#X#bv7YJS!}1;T(hq$rD_{1{Y}44)Bo#j^t`?uP~LcB}cZ#2RMHZVD^S zU;xjipf_d+!!tu%DLkSyCY^(F-v))1WOFmRjks&g%47$SzAts~ z)Eds?{tX57ic|sGreOwC99dGU0~|rOwwEFovA5~eK{_wl1{5!tLA2PK?U4Co3+pnl z9?<1#IGVWhy&HPm41W=R3@mxPYXIrZU3RHf8R@mKXYxd%jDlBxH2-AfW*@ur>Xcl9 z@K({GBb8}LH)}28Vm&%6L*U!CsOvBYumYv>8aEDUVgQR6is`l9m=mW19fzagb=K-T z`YKY}FmeQ2s-n@J9=+2uI|H3oKtN`PI7q}7Z!a^Hzc{tR7LbxZf!m*w0}|3;uy*oV z3s`(#;u?;Sd`fLfLiPlH=iJ;V=hi0eY22nR;fWY2y~6jj`N;qmH~NGWLh85epyp*+ z!hSV;p*d`?dAhJi0qG}qlnS4O5_kW7R&oF#P0jA91tAfHT(p{u4gdDV%MmW>PfIaO zghLb@Xi5vK)QsY3dUFsiCJl}%nve!4?NwN%oQ}TMJ_y({UYuxLsn_Gzy}bXwlNEC7dmuvF9=@ zxx0O&ce(@kuwiXXhC9tyNy8-VqBZyT)58pb%wT4(VjnD8C(&#JMO(U~xY_iXg`9yN zup~L$_FPbnm$f)-Q_{sqrSaB62x$SRoV7Fi#j%=Rmpc7q$>Wf=?ooueN&*U)XG^Y6 zz%b;mN1V$7Go&vKvq9FSU$iiLJJi+8eN3s?quxMrd!(VQp1MbDgYKj>tv`28On`Q? zJ=2~&FUerj7%>kl7)cyNUu*yUkr9bh_jA>RfM7xE65tu}X-wv>Lf3WuA@P3Eof(a} zlx))K^5&FM(n^LHjgP4Cz&O({X0yGFe&t+Ax~<6Fx_@DJtcLomq51uF9{~=(Bx9&1 zCziV1!an;d#vOeCg$h()YRSIATTp66H0~B=g~rNla2qtr zLTWYeo!i^YvzE1HPBy{A=2k38T#|Gmqh%%6LLN#$8Y zmCI>^)bvG==S5Jq9Z6^ztbhgt`K8YrIz=6$xBS{@HuLRztpf3<_o zo#A@%0t7G03N&y@5}@eC8*ov+u_ww%xFjDCK11a%R_B6+S_CNN0@oDT02fK8T)`8} z{l~5_vBL*bEq}y@_j~LFB(55=W!?+jDxW| z%|yxQ*$Hr#B;LB4p#qXh1-G<-57;-6IQ6LOiF3;H7I--qHK!kfe>b~sWR+DDp! zFBv+H+)>)nvAlp&5#siiXCF!O_q$#8O5ydzpv}uwqJY`%gyOjrLiJN4F zcT^&&^jyXng9Qp+qJCyiK9Z5pY841%MX(||U7Q+Dnx&v(&{aD$_jzi7E%3;VdOHln zjCD=HGy}Xdrn>;u4-~(fQLIL+Aq_4b5>*1-flf4bT<@om#<7G*bW zpV*bQ;HN0{OGyc!C^rBW(x0v zMolqYNGL#J4Tzh0+qEAA8uYfL1qDF*EH|axP1&r*f*99G?W1qe();k~;Ag#k@a;` zBX`?jzTF-^$~7H6Mc=IjW9kh%Dm;!^3qh~1iygndew_b5x?61AcG&)So-g&){3Fp( zv(-krqeoRc+&Wlk_XV$Y^yXdm=^%rVabz|NTSs zvZ2Jtv^x(!Szq7ge@}+%>rQpqP+D7Cc!{|7#kaMgtW#>wtEy&?OPGUyg`36BhBBf3 zqc@vZ(R1~Foz?%@+ci}fBEB0!B`^qCGYrj~_qal)z}>Pm7vzxfNxm|lpc?zh6x!N9 zPVd+cU4p*-+iz%Nzp@Cw_OJGdWz;O>%CnbW028s-=q-}?tr^SXfKbutEnz|Ub{NcD z$hiBv5JtAwg?&2HL@N)};u>md&u!C|>m28>g*89OpS+PyZ?d~!XcAvL5gYr});THh z;!Nv*y9sohxp%_MaS<2WM#rUmI%il7@G{TuEsxe7Y|g#rx>+V{mogB?v+bR_G6d6G zH^a1(#N1e4r<7()nFxpKU0Y}0#fPKs-7UU>dDzkGt<6m`xp*4{5%u&Bnr;hv*nM3D z=}A?}m45a+@%ZiY`KJ2+O1<=k>W!yQu?KJCB!m8b;kL~an7zniZy(hek+&T-(!XbS zuCH_H*)1yrJQB5=F+F?B^1I%A`1TE>T+H9Np|&0$XduIj(1qIV?W4E6dCBuP6jw0P ziVK|R5Fx5p!3hivm1@a*XLIYq!e0eUaQCdVQD6A8_D?SSMb7uaA9V5k!e17!gt@sI zk)q#X2DZJvZV&c3-4;wVH=L%Y>-BX5x!*}5*tsWh>|Y{T^he=>Mn-5=YkeKR3JrsW zq1ry&W~5%sZOTPCUB5n5_9Ia2r|$@CCF)9StSJ zN%SIlN~8X0)Gm~?d0fJQ26NkC^Ppb86#a1biwCgo6j#f=OpOsocIzonx!Trj_Tcq9 zMzZWS;fc#GasgSC%%zv~oN6mB?BNNmxUSbwV#RfH0lZaLc95+rF48Ay`D;o&K0;+I z`aP?%VxV3m8%1-)rFu(nyRE*eOPO6Ul1vY{fK^wVBI)??6&E1IdOhIxzI4SEosUwaaF%%(25Jq@~*hRmB}5wg>DwsIHDE^CH(Bg!?)TmOtVBZ z6Wkey5qsF?&YT;`n8$Yaw-7uB9autQ2OmXG4>9z_ZhP>-I=1A!971*ry-dsWg)2Aw zlHMOnmvbikJPs_qt4036#OIl_`AHNTJv(gGD9Z+rs58}5RTXz9^i=YsAe@Z(=_ouw;_{ptJw6;y}OP%)Ou5nMF^?Y`}*yjNZ zJ@<{kxVo?Oa?VX~cjA6MpjIZHCF>(|O1t&<+;-SL^MFramw1B(zP9cG&QH;O!2z{u zv2lvHthDuYY^U}0`_VXz4!Y9+H-E2bobK%B2=m##xVWGN=w+ag9@qhhPHY!Z6C-M) z+ee#ess-)r5|2U_xQ-qUyZbe&#?f2!ofx7p6Xb#&M~=X0c^`8G>_*-Y)SLq}wVoj1`uz3KQnyfN zWk^|*V?|*MFPgcN_Be*dIdvHWg$uo0h5>0kNUU0Fd&Zm9#jVbD{KfH(s7J0{MW=G= z9XPgK>jmu}WwXYHV*1w$OzrY(QTE10sd9>?e#r8hjLWZgF*Ca42Q0lugv%_)-jeNQ zi<4g9>hec%a@`!F%OA(NsLeR5!w2RXyU@oZGt7Fa?N|GXD}cKrmCzDM?pi3$omLK+ z9nt<{U4CLH=w_C75A3hzsNqM|N6tCx7yh{a`SxNF`HRspw>h1R8)iY{=sN=@hIk)XB;Zi^3yx_5`(rwIx)dlKm zF8O{=?laR9)A#n^zFOV_7aEB{E}V%IL4q@$Z708 zEOOn+To^ljqd=4K-Aj<_+C1G$WZv)EAAx@4|IrL<#KS(YKJ$>m1Fv?F5s>D(!LrxWVDw%p-wFI9{YLKy%!($bEk={K7jMju3Wbv z3-!XqV_eB3kohNc2Aq}pS~C&wGB;sQ!pvX0T0>a+q~%tuU88+S!}-B)7MkzocV(V1 z-P*JsQK!odO?WT)Z=NT99-M#HA?K!RW@L&DIgfR{i-~KLpF~b5JaE~GoPU`wI0oOB zS~{)Lx-RWMhV#t7=jUb9{HgrUx?B3NnT1$#%2w{1rcbfTWSk*Ue`)`h<}CjiH~|~{ zM`zmN*mmWdtHLe&cdNP-*oQ-&(AR&purSgX+0j0QyRQQz!t==Wy+jhUY$D3r+to$= z$!Xp)l?(bCohd9A%?AqQJ{@~;u|mEuu^AM2n?SBy81RBlZP`%u*13xk1l*$I^(L7% z1f2C#^!G%M7W`zaBRx&i?byZ?&Evc{kG@3WfBe!VU+7F)F?;1(U75k}<}W)pGXF_E zqd?#(Jipi>;|tQczjXD21CBXkxB8FWv zR!bOzizK4CQ%gnz+9CyqZl8sC5H!FP@x959UA4&QRK=X@x=;V8L|EYhc!clu{^lM_p|{wsprgRTo&X7w_2FuJ3q^ zK+^7Hjh(+8Kn8#aN}8w8V}Pp1J0u0iwkYe1k(q|?sawI+b6fnWRgct5NG%uS=|r>=4tbl0!?i453lHDY?et;LspH#&==LCg^P81=_WKUKbj|dq zIJY}FTb*flo`0=U&r|ZB?|Gq8fA9jOT%zGv7|xV5S@rkiTcW(`CN2@60nHDrhHn3H zDUgpHQZ{#92ZijfbIuU;Hb#WiN*bTqdcIOxOIPpX+ZpTnkUVt>@B2Qvzde6ytJzVH zGN}_f4@W)CN2Anc=`-pVxyU;o0isi=)I^-J90rKY63jy+nBv5{`;Ry^{P z{Y6nX^S5<^X3waA@!T2RQ4jI{W^L4m7~N(Os(;qq53TlMnR;JR+)nDzyw!6G4FtMS&UlWEA_T!!1i8{*r zc*&OP91qorJBaAdvIYCkz+LA~Id*sOjxK187lcc$E`D*lWwm7>%xqzX+`s1)b+wS3gKzx`=42~guSnVDov)V3Z=OCsuDTS!Gb~yc z9@WJcKP`{dwNw#&_gA@RF4gbkSGo(r;u&?G3kI2LZ(&8aOE_EyzN^(LOPd0zc!$V6%5P`2wO`FFdgVJ%GKEpb*S0tU`vYdMPjM_ih_Q$?95;m~h+cS=P=%FAUA7U+3Q*j<)(eA;{&{ z=Rb9XB9`?ZFmxZ^Q3Yt?R-OBHx6|rvzW@T@Mwe97@1c)B*!f9=Eq{P1^RAzyOE8@l&s2iBY z7gOTMb-a%b3#(V7MQJ@C0wyWR9^kPfJt%I_93N8rOBvo z+iZx|R@L2HVaOsxlld8UonKM#^9;6c#FJYYud{5_CwO~v?$t+Fl3rb$(Mx~HJ<+2$ zcRyh!^)`Mtc9pTHX1KBHBMdG?tp1n@e(}&zcWU0l&SIJlo5QG2ceEmU^*6!*?4f@~ zofG~2>_zoGmvF+p_1;iF-*GE#V}H_c7xfV1`5M8OLco83sNdn^s5 z@ze*zog~#?>R-tEn5FtL2Bh5O0$Ip22Z*|dhd;?Ujg~_@>Xlq2F`iHJJrh>1N2-{8 z!!!9~yoKGw0!{eiTq}B@p5m`TO}?8z{VKoijg|E`x;InrK+M<}?bB>b=NDY*+xQgo zG*d!3`W1-B3x+(#40Kws`p0m*9cd#{@%rspJC4w=)OWe>&u#ARs2`Er9S)bc+rSPWZnKUGt{sQNQWIA2G)l9KUn6^6K21WZ{z}BL?do_V-jE9k{OxnY8=(TS@s?@BoQ+?oGeO!p&Xs+_3FXMO%)Rz$L zgAzqylLtHFrK(=VVu-)?;w6t?o!YDJf19K781LL?pc+H-5(@a*W9~2U`?p-FUvMd2 z)n{0(89F1({-I0^uqV}rIRG{rhX|sp*#D^3o;|nx&vR&WtW)e7wb4C2f)7@x`}1!3 zU&r%nuq4$7xOm?o#NU7cj@2)W3}FgzPgS2jf03QjT-{QS{l{e!+%VYROFqqSG$L0@$%cg6w{x>SN;1 z80CGi*#5b-Ie4NOTpFtEvAY@S5+RQM_2AqZvYM+|Ts-*=^&-R)SzXQMxG~+o)Zf2} zNwm|7QsuEA$Et@B87mU>e(-whR$2TAbt5meI=K6Xcg|$p7i)Fz7`sjMh6|1Qq1Q*gr;Rl(?rIaauMJJ^sSoT%OCDi!KDZYLH0U}Kb)N9sxvvV+p z^Xk})73o;AVInAZdW%UMe6dkkmmHUNnS!>D@)0%Kb1Q80V$|uTc$>Zzu_6g{s@U^( z6#OBy>%SeaAWZ;WfP4w)wYGRV9Fr$F1M`_rQ`q;|K<=vF;ZPX0OO$u@PtXy4Ok?$G zwnDhHq^Z8)_12!UqpQz!YOtPJzZ6j5JN^TA8@(k)$^R68iMW{QBDxi(`XlI9)FJg5 z9$;1bXLKN1&*{7F^7zK2b%IbOP*z+<0IPDhKpicfV%dp>+qmPMlPrj=985o-3 zFj{x}Nv2`-$Y<2ILk8Ves1N(BZ!xFo%INGFb1K*mv#*{1`*lcpk>wOdr&{EAa>LxDPSBB*;@?d8un-#m6ZO{Ge&(gELU<<5O^+mUiKZJR=-coRm1Cj@7y6UIud*MMF5WSlbj(e zP<6Poa2#H`=D>@waFdRpvD#h_DM1UTx73faP5Z(&{#7pQ#mrIh4hD@)IO~wl;tiuZ z7(US32D}^ z^!>NNqlP6v0q0>kmh;ap7U;$kaET}hIhqE};ajgoQ|fs)=2^GaOs-Ig?sv01#ufb( zyj=HfbX1Xge$6ze&!~BrbZ3W_Lojw zYSi}*yi`5*ZSa89&Vb_eRVypPegFodi9vl9y+n3N{TecSzlh1tLW5eD)86Z|{3Sj& z%JxZiY{~Z5qQ*+%zVU2@jouo`q+FsXnw4GA9p#U_Bk8h625B`t(1_o>(|A(!wEETj z*2((CAsZe=hncS%`4pRcg+Z5oOB`b3?Z?JjTW8dboH4UyxZNH{v>@}(ZmGYG*{jdE zx&ij)d}b>gW^aHj7kayd-&!Bwkb*QZIghUp;vUZ58qLT6zNlyWi=}>8&h3t-VQG-s z8vJ$#q5j{IfZBPBJN}CHi0GmFtgfy2o6Ny!RYtO{7Q^Nmdlruk(Jod!t&?N6R^{>_ zrmlIVP>S;@i1KHTAQ7{lvl_1Y7z(QG1E6kS%ug&=oB7y`O$W~r{LGoleJ_1>##@9< z&0++fJ1oVET|5EixK}*kWt=Usa!u04-$jbs3X%Pk0{uId)x0m>`0wF3!gCw-3J$=m zMp*qF*4vB6eHWK;e%YP(EptqC^kB^QE)gNPePH}6}ubIlO7b95&G}q4WdBj_>DaPDus&lqrsN$YikMeFV+R~if zRxf$Jo4zkWT53{vd+`x?KjkWn3NBBsXn-jbZuzOyxFowK>vuPa1}$R5f> zVd?%)6br4si(*l;uloR<{{&QM!HLy>?wt$E6d;mb1m_!AqX#uMtNLB4>Wr6B+$c+~ zf9-&MIBDc?YF&dm4Zr^Sf$3w%^#Z$kfPu%n6S?+=4yEuFGmBydhw%Tx-l0?SZ@!tI z7g`$XjmVEH)74=e0>|C8S1W>}=z3N}sU6O*t%vt=G zfOT&JWLOL8dMH3U_hF469SEf1_O3*Y{5fXOMW(-mb@qA08QxG|2W#%kQT4asBu?g9 zSN*p^!X*#&0T#j+*%tFntQ9?AJ9|B9JF70AyBp@ zxqZZlHq`s^$WY0s{*jf|_RT(ZBObkBb5ixoSVewi@o#eb0nIXwyH4klL=YS^zTVx5 zGIP*>15PFiV^^iCoo??Qus;)ID{=dHmE|io<6gMH{S^h6o0}K!5r@aCc&lDov|Z78 zS@HdByQvzCbXc4g@;ZCx`(eILqcNt4icxaTZEummxT9`mkHxW~!&AR6cFq;)X8Wtm zT5`lT)$gLG50+K^A-^9))7bYueVmAhQQ#$8@|MK{QY+(5G`ilc8|s_bP0Nu1c)1|X zC>@P_+O3(U|L#<-ubYND*RzH0a4s|foKWu4FqW8z6jHoH2uE7rs+Y3A9w$^>g~( zEcG>VTrZxZPfz1S<2+5@(LXlougrv<`YoQJz2I2Zq>Y}1)P9{6*grH>=0g zPjW)+4wznl>N60HJ{0?0pC4FER%TFV^pm;B^o^#Z#!OW|VJY&ldXkqnzWUYaTWz=4 z>f@bKDN5o#xU-`~rylaRs2C?)8-qV&#vT6D8NC|n803A%a;UMqgZgsqI+0Wz7iakA zEU9UesD7e5fNnA8l-%!RAM_bgTb;v!>8t19QnOaq>iN*%p!vG`cM#Ei!e`#uUQ}-+ zUt+sf??;{)XPYjKNyK^fgl4(I0=`$sPPY$HKfnr~(6dpW?%c{NcyrBL3DZ&^VhM~7 zKz;R%a0SYA=v8ERl6t$*KgkK-qZ!tJVPaB)^C4(Kg8Hiu?O*pB%xnD*=F$@$#y#_H=+*aX%%x;Gs@MmA`Xxm56~xGYJDdCn(bs$N z{xEesh=z(6GHBn$dL^1`@30RK17Px=89&ej^tU{r?(pKCW;Z(6oL^zVjcvxVt53-O zQ(*JtfGPM^wVxugq5gN?+eXiygkA0%7UxfRvNqP#FTBnXy~zOo7k;65eVF}~N|T$rZ$m0gewn{mGIck5q`9}Atz+{x&~=FYw*@69H7PXX^QUN4 z$*+iS18(P9_18>TP`o9N){A%FwuCvF|eM7zN^(@T{y+z&e zcG-NXuDC+I6Jfq$vdiiDy=$z^ff0U1gBP94VpS+%L;WXC;*LnVu~w#W$EX|FZOeJ7 zocxxKRIN|zFR)Aieycx)724{US3^Bg_i_Bf+6h< zbJ22dabm?&H))GS{Vcml8S$q2CPY^khf?3cIQ@u?J^IF${4?8Ty@z?5gq z>#|ZOKFlEzpVf|fD?TnwC*#MYBZc|^zd%z`8u4T3j`}C{#~l+*Si*bw%Ut}XZmmLU zGMk8eZDuxJe7`tMPH%%E1wA}3 z-v8y|G1-xuo`37!H;Eeqgxu5TU+^7=yiHK z?mgZ;JoKDOvQ1f3q-78!W!}U|T8*xqGLcljc+7ie=C#vQ&rEVm2aj&HfdX4wyGQOkYN3hSx}k}Aon(F@<+ zJuJ7r_OLV|-rkJEP`|ji9ZsKRptMecB5boNE8D1vs?nFptn=PB+40ua7K~@s%Iub* z7E*cE)`ZSv!M4uHwj}Z=4{L+As;5bm@^73#6fgRTK7l6XfIwyTK9Mfp3y*G=&cvUY zZWkoOYcjUau>Tm3L`PEjsSx<$W)dV>R!)Mnh(|B}TGpvMT1h^bxIbx2Y*qb5mkPb%f<`rp%WB$Oy4Fu{_IY=R;$t1=0a$z=2uSK=AFy=Sy_+l13-8c*x2 zjmmoT%ImEfpkMb@H~VjuYI&{qEX>0!$nv<3nra%1UY*aaT38G*VYx8~1W!9G%BIcB zq-{p8iQEG+6Uq$Z9)ceCq*azq*`cbH!xzS*uPnNUbxbvPxo{myHFs7`(k6KxB}F|g zQ%LKzfqUAFEX^lDAL5Rzgo%VnJ(;vYl1`%0>*N6YZ@<)ckNgs$uq+mqIzciKvCN{&CH6+ta+puZV=`_hlZ+zr3hYbTW zu4KnBa6HZ6)pa$Q6d@q@)6t(l;Cu}QRbiG+(!9ya28AP=j*fJ!Fh&L!4u3T>c$y{t z;LY*Y*}7#)Sr#|bX*Gd$BYui>^rjnh-iC=N8pytzN4$QV=~YEW&Xh94TJYwrtsOgi zQPwfHAqz$hre$1(ylov;RXiz2U)7xipIzm=gMjgIM>Gt9jnfl}nGtBl_%Li*oR(HBLRXVK zEGLM^G;Joy=q;jH>Dlx~DVL7|@(a_+!z9d_NmMrt^J>!3t+JlOf%0YY)eJMuqA-cu zq)zFc(4bY`w&sSB^_;Cv%;NCasl0knC#-Cm7tLgJ`)%&}87E4$eB|mXYs)N-@?=`G z_Q7Pd_SWImVcAQoMQ_B#$;~C}6iy15W;_jwNj17dFO?BQat;?z4O2!SwUgb)Jn@s| zQJcr<6osUTCdG6V9G6)b!Mt)HE7@j}ET1Hhb=E}FX2QHu6H9mQYI zAX)59PqG@<){G|{twLwC3{T&}b!0!vsxA`tBCg7y9wnVp7~`Q$wev2KB*(DSDGYtE zVWFN$9TriN)j`F1tdmhHwo>lTPm|8tn$fVt9k;gjfCIx>HqXIgrdgea(=be?MNm#r zKC{c-@no7-HGL|o8bv87l2LxyL)BR^Mf<8I(;`o^JQ$%HF62a3ZmMN#V6bai9 zPgqhk4BEqtHuhFA;)-)$r2!lyFQcFxy{%*yV*JRN@gWw*wS2sZN$xE>XDDw{M*;g@ z#!=D)b%UySr?6PLH9EbOYGt9f;q`=;Dsfbxfh1K?=A&af9hu-|DZ+s%Xc&)CJF%j5 zCY_iINA7#z$dL#6-`z)e8Y|9WBDGDH+)#_`68~e8#WZc?7kAQOgR@+d7PZ5qTF z4MhfrxL5m+j9Q?5S;1hLeci8HPrZL@Yeren2l1GJ;+3~vV58#Oz|Mtrib7|XFlQJu!W>S?Q-j8>PEz{q^d=SlNEto-!xgSRDG$}*}IR3QT332Nc z#b70_+}mdf@-7eJv}j|_MmhQ#A@;&3+xvTrCaoc}(R-nHN0Xk}AghWub&7KSh<;XPcyNO@8QtGg zR~MZA0wWehD`=8v(!!=j?>eA1Z(bQ?prH*`6yeNCVe>{C~Iq?b-8al4$o?qRSe%m^D1BwbzO{3yl7Sid-5R0a?;juiZYi)ZIp3BMi0H& zGM(IJJEmG{Fo`fqqbW|ZtPN<_hEMU~r?|8<-aLKOX9X^6Yh6*$+L}p7>Ksj7C~(P{ zcm62Yto1+TEpjHRbEpYfjLdjM%n;#>#z%l;wh%|gHKw;w!`d+IG^|2&-mK1{M*Kaa zue)poFf1~Bs#%3DmzQ|+NAGbQIt*s-j&W#XovB9QU=ApaaFVo%aWP^|HKRxGw=b~x z#wfGuoVZo#SBG1t8}qQ zo;V*}(o~~my`*qJG{cN#Yd%=)7b|nobLjDxv8>qg(`+*O#&70Hr6+YRY0$yB)pu(i zaew=e4p9^iMn#rC!HZYaIe{Z|+aer|FI?rP$3*scaFWHXI6*>mwNRW7f8nxxFm2XC zh#dB~EDIt;qw0Vx--xIQaxb2?F#ZTH1CnoYg+x@ESMd}-=%k&ZZf4D>KHz+!`}HAqt#tqvn0Gjm9wB7iGe}9}wHt5$7e+QJUjIDkf7*)Sym-a@306c9kb!Nhu48 znAnhL(UUf5)6w+uNC~HXQ$-OTg(wQ)7mvM#SD10;!j*eLy=j2KP~lH1iX_RBa&+p2 znq3oXJpH0sInFm-YjS2Ee_^v}K5f2Wy4|*Cu5C8u-?P_>r*f;_y3Qufo_k4y17T~Y zHN8NdxWVN%kE#0C0KMBUv6#K4JbC9DEz-_k%c%mwZTAH`lkLZ!eEHbK0^A)A`fP>gn$1ZKaWp4S|vc=$bY8M?LywEM>D>g9`n;7fK(|T~M13z2HGolGOE96=|E>Cl{Z0 zjnGtm { +export const tg = await typegraph("wasmedge_ts", (g: any) => { const pub = Policy.public(); const wasmedge = new WasmEdgeRuntime(); - let mat; - try { - mat = await wasmedge + g.expose({ + // expose the wasi materializer + test_wasi_ts: wasmedge .wasi( t.struct({ "a": t.float(), @@ -19,15 +19,8 @@ export const tg = await typegraph("wasmedge_ts", async (g: any) => { t.integer(), { func: "add", - wasm: "typegate/tests/artifacts/rust.wasm", + wasm: "rust.wasm", }, - ); - } catch (e) { - throw new Error(`Failed to create wasi materializer: ${e}`); - } - - // expose the wasi materializer - g.expose({ - test_wasi_ts: mat.withPolicy(pub), + ).withPolicy(pub), }); }); diff --git a/typegate/tests/runtimes/wasmedge/wasmedge_test.ts b/typegate/tests/runtimes/wasmedge/wasmedge_test.ts index 5f641ec41b..a049a89722 100644 --- a/typegate/tests/runtimes/wasmedge/wasmedge_test.ts +++ b/typegate/tests/runtimes/wasmedge/wasmedge_test.ts @@ -5,8 +5,9 @@ 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 "./wasmedge.ts"; +import * as path from "std/path/mod.ts"; -const cwdDir = testDir; +const cwdDir = path.join(testDir, "runtimes/wasmedge"); const auth = new BasicAuth("admin", "password"); // Meta.test("WasmEdge runtime", async (t) => { diff --git a/typegate/tests/sync/typegraph_sync_test.ts b/typegate/tests/sync/typegraph_sync_test.ts index 8e9e119a49..860e9cd7e6 100644 --- a/typegate/tests/sync/typegraph_sync_test.ts +++ b/typegate/tests/sync/typegraph_sync_test.ts @@ -107,4 +107,6 @@ Meta.test("test sync through s3", async (t) => { async teardown() { await cleanUp(); }, + // FIXME: figure out problem with RedisConnection.processCommandQueue not cleaning up + sanitizeOps: false, }); diff --git a/typegraph/core/src/conversion/runtimes.rs b/typegraph/core/src/conversion/runtimes.rs index 2aa15b2319..6ff297babc 100644 --- a/typegraph/core/src/conversion/runtimes.rs +++ b/typegraph/core/src/conversion/runtimes.rs @@ -293,13 +293,11 @@ impl MaterializerConverter for WasiMaterializer { let data = serde_json::from_value(json!({ "wasm": mat.module, "func": mat.func_name, - "artifact_hash": mat.artifact_hash, + "artifact_hash": "", // resolved at finalization "tg_name": None::, })) .map_err(|e| e.to_string())?; - c.add_ref_artifacts(mat.artifact_hash.clone(), mat.module.clone().into())?; - let name = "wasi".to_string(); Ok(Materializer { name, diff --git a/typegraph/core/src/typegraph.rs b/typegraph/core/src/typegraph.rs index aaf65ac7c3..be4ebc96f2 100644 --- a/typegraph/core/src/typegraph.rs +++ b/typegraph/core/src/typegraph.rs @@ -6,7 +6,6 @@ use crate::conversion::runtimes::{convert_materializer, convert_runtime, Convert use crate::conversion::types::TypeConversion; use crate::global_store::SavedState; use crate::types::{TypeDef, TypeDefExt, TypeId}; -use crate::utils::fs_host; use crate::utils::postprocess::{PostProcessor, TypegraphPostProcessor}; use crate::validation::validate_name; use crate::Lib; @@ -25,7 +24,6 @@ use std::collections::hash_map::Entry; use std::collections::HashMap; use std::hash::Hasher as _; -use std::path::PathBuf; use std::rc::Rc; use crate::wit::core::{ @@ -197,14 +195,6 @@ pub fn finalize( let auths = finalize_auths(&mut ctx)?; - let referred_artifacts: Vec<(String, String)> = ctx - .meta - .ref_artifacts - .clone() - .iter() - .map(|(hash, path)| (hash.clone(), path.to_string_lossy().to_string())) - .collect(); - let mut tg = Typegraph { id: format!("https://metatype.dev/specs/{TYPEGRAPH_VERSION}.json"), types: ctx @@ -245,6 +235,15 @@ pub fn finalize( Err(e) => return Err(e), }; + // TODO: maybe remove this extra return value? tg.meta.ref_artifacts can be accessed on the sdk frontend + let referred_artifacts: Vec<(String, String)> = tg + .meta + .ref_artifacts + .clone() + .iter() + .map(|(hash, path)| (hash.clone(), path.to_string_lossy().to_string())) + .collect(); + #[cfg(test)] return Ok((result, referred_artifacts)); @@ -486,20 +485,4 @@ impl TypegraphContext { pub fn find_policy_index_by_store_id(&self, id: u32) -> Option { self.mapping.policies.get(&id).copied() } - - pub fn add_ref_artifacts(&mut self, file_hash: String, file_path: PathBuf) -> Result<()> { - let binding = file_path.to_string_lossy().to_string(); - let path = match binding.strip_prefix("file:") { - Some(path) => path, - None => return Err("file path has no prefix".into()), - }; - let absolute_file_path = match fs_host::make_absolute(&PathBuf::from(path)) { - Ok(path) => path, - Err(e) => return Err(e.into()), - }; - self.meta - .ref_artifacts - .insert(file_hash, absolute_file_path); - Ok(()) - } } diff --git a/typegraph/core/src/utils/fs_host.rs b/typegraph/core/src/utils/fs_host.rs index cbea596596..cf60bab11d 100644 --- a/typegraph/core/src/utils/fs_host.rs +++ b/typegraph/core/src/utils/fs_host.rs @@ -3,17 +3,17 @@ use std::path::{Path, PathBuf}; -use common::archive::{ - archive_entries_from_bytes, encode_bytes_to_base_64, tarb64_unpack_entries_as_map, -}; -use indexmap::IndexMap; - use crate::{ global_store::Store, wit::metatype::typegraph::host::{ expand_path as expand_path_host, get_cwd, path_exists, read_file, write_file, }, }; +use common::archive::{ + archive_entries_from_bytes, encode_bytes_to_base_64, tarb64_unpack_entries_as_map, +}; +use indexmap::IndexMap; +use sha2::{Digest, Sha256}; pub fn read_text_file>(path: P) -> Result { read_file(&path.into()).and_then(|bytes| { @@ -199,3 +199,10 @@ pub fn make_absolute(path: &Path) -> Result { false => Ok(path.to_owned()), } } + +pub fn hash_file(path: &Path) -> Result { + let mut sha256 = Sha256::new(); + let bytes = read_file(&path.to_string_lossy())?; + sha256.update(bytes); + Ok(format!("{:x}", sha256.finalize())) +} diff --git a/typegraph/core/src/utils/postprocess/mod.rs b/typegraph/core/src/utils/postprocess/mod.rs index 3999735e71..d4d8b692b6 100644 --- a/typegraph/core/src/utils/postprocess/mod.rs +++ b/typegraph/core/src/utils/postprocess/mod.rs @@ -38,13 +38,16 @@ impl PostProcessor for TypegraphPostProcessor { if let Some(config) = self.config { Store::set_deploy_cwd(config.dir); // fs_host::cwd() will now use this value PrismaProcessor::new(config.prisma_migration).postprocess(tg)?; - } - // Artifact resolution depends on the default cwd() (parent process) - // unless overwritten by `dir` through Store::set_deploy_cwd(..) (cli or custom dir with tgDeploy) - DenoProcessor.postprocess(tg)?; - PythonProcessor.postprocess(tg)?; - WasmedgeProcessor.postprocess(tg)?; + // Artifact resolution depends on the default cwd() (parent process) + // unless overwritten by `dir` through Store::set_deploy_cwd(..) (cli or custom dir with tgDeploy) + let allow_fs_read_artifacts = !config.disable_artifact_resolution.unwrap_or(false); + if allow_fs_read_artifacts { + DenoProcessor.postprocess(tg)?; + PythonProcessor.postprocess(tg)?; + WasmedgeProcessor.postprocess(tg)?; + } + } ValidationProcessor.postprocess(tg)?; Ok(()) diff --git a/typegraph/core/src/utils/postprocess/wasmedge_rt.rs b/typegraph/core/src/utils/postprocess/wasmedge_rt.rs index dd9a15ed75..c95de05a5e 100644 --- a/typegraph/core/src/utils/postprocess/wasmedge_rt.rs +++ b/typegraph/core/src/utils/postprocess/wasmedge_rt.rs @@ -26,14 +26,19 @@ impl PostProcessor for WasmedgeProcessor { let wasi_path = fs_host::make_absolute(&PathBuf::from(path))?; let file_name = path.split('/').last().unwrap(); - let artifact_hash = mat_data.artifact_hash.clone(); + + let artifact_hash = fs_host::hash_file(&wasi_path.clone())?; mat_data.wasm = file_name.into(); mat_data.artifact_hash = artifact_hash; mat_data.tg_name = Some(tg_name.clone()); - mat.data = map_from_object(mat_data).map_err(|e| e.to_string())?; - tg.deps.push(wasi_path); + mat.data = map_from_object(mat_data.clone()).map_err(|e| e.to_string())?; + + tg.deps.push(wasi_path.clone()); + tg.meta + .ref_artifacts + .insert(mat_data.artifact_hash.clone(), wasi_path.clone()); } } Ok(()) diff --git a/typegraph/core/wit/typegraph.wit b/typegraph/core/wit/typegraph.wit index 6f9f23a353..a0217df4ad 100644 --- a/typegraph/core/wit/typegraph.wit +++ b/typegraph/core/wit/typegraph.wit @@ -49,6 +49,7 @@ interface core { record artifact-resolution-config { dir: option, // cwd() if none prefix: option, // overrides tg.meta.prefix field if defined + disable-artifact-resolution: option, // any postprocess using fs ops should be disabled when set to true prisma-migration: migration-config } @@ -359,8 +360,7 @@ interface runtimes { // wasmedge record materializer-wasi { func-name: string, - module: string, - artifact-hash: string, + module: string } register-wasmedge-runtime: func() -> result diff --git a/typegraph/node/sdk/src/runtimes/wasmedge.ts b/typegraph/node/sdk/src/runtimes/wasmedge.ts index 4d8890d93a..76a6366072 100644 --- a/typegraph/node/sdk/src/runtimes/wasmedge.ts +++ b/typegraph/node/sdk/src/runtimes/wasmedge.ts @@ -6,7 +6,6 @@ import { runtimes } from "../wit.js"; import { Effect } from "../gen/interfaces/metatype-typegraph-runtimes.js"; import { Materializer, Runtime } from "./mod.js"; import { fx } from "../index.js"; -import { getFileHash } from "../utils/file_utils.js"; interface WasiMat extends Materializer { module: string; @@ -19,7 +18,7 @@ export class WasmEdgeRuntime extends Runtime { super(runtimes.registerWasmedgeRuntime()); } - async wasi< + wasi< I extends t.Typedef = t.Typedef, O extends t.Typedef = t.Typedef, >( @@ -30,9 +29,7 @@ export class WasmEdgeRuntime extends Runtime { wasm: string; effect?: Effect; }, - ): Promise> { - let artifactHash = await getFileHash(wasm); - + ): t.Func { const matId = runtimes.fromWasiModule( { runtime: this._id, @@ -41,7 +38,6 @@ export class WasmEdgeRuntime extends Runtime { { module: `file:${wasm}`, funcName: func, - artifactHash: artifactHash, }, ); diff --git a/typegraph/node/sdk/src/tg_manage.ts b/typegraph/node/sdk/src/tg_manage.ts index 92780460d9..30dbba98f7 100644 --- a/typegraph/node/sdk/src/tg_manage.ts +++ b/typegraph/node/sdk/src/tg_manage.ts @@ -28,6 +28,7 @@ type CLIConfigRequest = { prefix?: string; secrets: Record; artifactsConfig: ArtifactResolutionConfig; + disableArtifactResolution: boolean; }; type CLISuccess = { diff --git a/typegraph/node/sdk/src/utils/file_utils.ts b/typegraph/node/sdk/src/utils/file_utils.ts deleted file mode 100644 index c4e935869d..0000000000 --- a/typegraph/node/sdk/src/utils/file_utils.ts +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright Metatype OÜ, licensed under the Mozilla Public License Version 2.0. -// SPDX-License-Identifier: MPL-2.0 - -import * as fs from "node:fs"; -import * as crypto from "node:crypto"; -import { wit_utils } from "../wit.js"; - -export async function getFileHash(filePath: string): Promise { - const cwd = wit_utils.getCwd(); - filePath = `${cwd}/${filePath}`; - const hash = crypto.createHash("sha256"); - let file; - - try { - await fs.promises.access(filePath, fs.constants.F_OK); - file = await fs.promises.open(filePath, "r"); - - const CHUNK_SIZE = 4096; - let buffer = new Uint8Array(CHUNK_SIZE); - let bytesRead = 0; - let numBytesRead = 0; - do { - const { bytesRead: numBytesRead } = await file.read( - buffer, - 0, - CHUNK_SIZE, - bytesRead, - ); - bytesRead += numBytesRead; - hash.update(buffer.subarray(0, numBytesRead)); - } while (numBytesRead > 0); - - return hash.digest("hex"); - } catch (err) { - throw new Error(`Failed to calculate hash for ${filePath}: \n${err}`); - } finally { - if (file !== undefined) { - await file.close(); // Ensure file closure - } - } -} diff --git a/typegraph/python/typegraph/graph/tg_manage.py b/typegraph/python/typegraph/graph/tg_manage.py index 964a679626..9b4dbcf9aa 100644 --- a/typegraph/python/typegraph/graph/tg_manage.py +++ b/typegraph/python/typegraph/graph/tg_manage.py @@ -155,6 +155,9 @@ def request_config(self) -> CLIConfigRequest: "migrationDir" ], ), + disable_artifact_resolution=artifact_config_raw[ + "disableArtifactResolution" + ], ), ) diff --git a/typegraph/python/typegraph/runtimes/wasmedge.py b/typegraph/python/typegraph/runtimes/wasmedge.py index b9811ea32a..70fa2a7f4c 100644 --- a/typegraph/python/typegraph/runtimes/wasmedge.py +++ b/typegraph/python/typegraph/runtimes/wasmedge.py @@ -12,7 +12,6 @@ ) from typegraph.gen.types import Err from typegraph.runtimes.base import Materializer, Runtime -from typegraph.utils import get_file_hash from typegraph.wit import runtimes, store @@ -30,13 +29,12 @@ def wasi( effect: Optional[Effect] = None, ): effect = effect or EffectRead() - artifact_hash = get_file_hash(wasm) wasm = f"file:{wasm}" mat_id = runtimes.from_wasi_module( store, BaseMaterializer(runtime=self.id.value, effect=effect), - MaterializerWasi(module=wasm, func_name=func, artifact_hash=artifact_hash), + MaterializerWasi(module=wasm, func_name=func), ) if isinstance(mat_id, Err): diff --git a/typegraph/python/typegraph/utils.py b/typegraph/python/typegraph/utils.py index bbd8d31543..a83831c6c7 100644 --- a/typegraph/python/typegraph/utils.py +++ b/typegraph/python/typegraph/utils.py @@ -1,14 +1,11 @@ # Copyright Metatype OÜ, licensed under the Mozilla Public License Version 2.0. # SPDX-License-Identifier: MPL-2.0 -import hashlib import json -import os from functools import reduce from typing import Any, Dict, List, Optional, Tuple, Union from typegraph.gen.exports.utils import ReducePath, ReduceValue -from typegraph.gen.types import Err from typegraph.injection import InheritDef, serialize_static_injection from typegraph.wit import store, wit_utils @@ -79,19 +76,3 @@ def build_reduce_data(node: Any, paths: List[ReducePath], curr_path: List[str]): def unpack_tarb64(tar_b64: str, dest: str): return wit_utils.unpack_tarb64(store, tar_b64, dest) - - -def get_file_hash(file_path: str) -> str: - sha256_hasher = hashlib.sha256() - - curr_dir = wit_utils.get_cwd(store) - if isinstance(curr_dir, Err): - raise Exception(curr_dir.value) - file_dir = os.path.join(curr_dir.value, file_path) - - with open(file_dir, "rb") as file: - chunk = 0 - while chunk := file.read(4096): - sha256_hasher.update(chunk) - - return sha256_hasher.hexdigest() diff --git a/website/static/specs/0.0.3.json b/website/static/specs/0.0.3.json index 26c2c3fb76..627b6cea2d 100644 --- a/website/static/specs/0.0.3.json +++ b/website/static/specs/0.0.3.json @@ -2341,6 +2341,7 @@ "auths", "cors", "queries", + "ref_artifacts", "secrets", "version" ], @@ -2389,6 +2390,12 @@ ], "format": "uint32", "minimum": 0.0 + }, + "ref_artifacts": { + "type": "object", + "additionalProperties": { + "type": "string" + } } } },