From 86a86becad0d7849eefa662589d0227264f19eba Mon Sep 17 00:00:00 2001 From: Jacob Sapoznikow Date: Sat, 6 Jul 2024 19:05:57 +0000 Subject: [PATCH] Finishing db router stuff and custom prisma client for rpc-rs --- Cargo.lock | 1298 ++- Cargo.toml | 67 +- apps/bindings/src/lib.rs | 2 +- crates/commands/src/router.rs | 59 +- crates/data/src/prisma.rs | 519 +- crates/rpc-rs/src/lib.rs | 5 +- crates/rpc-rs/src/macros.rs | 140 + crates/rpc-rs/src/module/module.rs | 30 +- crates/rpc-rs/src/proc/mod.rs | 6 +- crates/rpc-rs/src/router/axum.rs | 8 +- crates/rpc-rs/src/router/export.rs | 2 +- crates/rpc-rs/src/router/func.rs | 15 +- crates/rpc-rs/src/router/mod.rs | 4 +- crates/rpc-rs/src/router/router.rs | 7 +- .../prisma-client-rust/.cargo/config.toml | 4 + external/prisma-client-rust/.gitignore | 10 + .../prisma-client-rust/.vscode/settings.json | 7 + .../prisma-client-rust/CODE_OF_CONDUCT.md | 76 + external/prisma-client-rust/Cargo.lock | 8965 +++++++++++++++++ external/prisma-client-rust/Cargo.toml | 37 + external/prisma-client-rust/LICENSE | 201 + external/prisma-client-rust/README.md | 68 + .../prisma-client-rust/crates/cli/Cargo.toml | 39 + .../crates/cli/src/binaries/mod.rs | 148 + .../crates/cli/src/binaries/platform.rs | 136 + .../prisma-client-rust/crates/cli/src/lib.rs | 17 + .../crates/cli/src/prisma_cli.rs | 41 + .../crates/generator-macros/Cargo.toml | 17 + .../crates/generator-macros/src/filter.rs | 173 + .../crates/generator-macros/src/lib.rs | 52 + .../generator-macros/src/partial_unchecked.rs | 138 + .../src/select_include/definitions.rs | 107 + .../src/select_include/mod.rs | 244 + .../src/select_include/selection/arg.rs | 35 + .../src/select_include/selection/filters.rs | 25 + .../src/select_include/selection/item.rs | 60 + .../src/select_include/selection/mod.rs | 181 + .../crates/generator-shared/Cargo.toml | 12 + .../crates/generator-shared/src/lib.rs | 149 + .../src/select_include/mod.rs | 5 + .../src/select_include/selectable_fields.rs | 54 + .../src/select_include/variant.rs | 58 + .../crates/generator/Cargo.toml | 41 + .../crates/generator/src/client.rs | 173 + .../generator/src/composite_types/data.rs | 33 + .../generator/src/composite_types/mod.rs | 129 + .../generator/src/composite_types/order_by.rs | 154 + .../src/composite_types/set_params.rs | 106 + .../src/composite_types/where_params.rs | 63 + .../crates/generator/src/enums.rs | 63 + .../crates/generator/src/header.rs | 44 + .../crates/generator/src/internal_enums.rs | 82 + .../crates/generator/src/lib.rs | 93 + .../crates/generator/src/models/actions.rs | 229 + .../crates/generator/src/models/create.rs | 149 + .../crates/generator/src/models/data.rs | 178 + .../crates/generator/src/models/filter.rs | 20 + .../crates/generator/src/models/mod.rs | 192 + .../crates/generator/src/models/order_by.rs | 210 + .../crates/generator/src/models/pagination.rs | 20 + .../generator/src/models/partial_unchecked.rs | 40 + .../generator/src/models/select_include.rs | 293 + .../crates/generator/src/models/set_params.rs | 735 ++ .../crates/generator/src/models/types.rs | 61 + .../crates/generator/src/models/update.rs | 108 + .../generator/src/models/where_params.rs | 735 ++ .../generator/src/models/with_params.rs | 153 + .../crates/generator/src/prelude.rs | 15 + .../crates/generator/src/read_filters.rs | 81 + .../crates/generator/src/write_params.rs | 92 + .../prisma-client-rust/crates/lib/Cargo.toml | 70 + .../crates/lib/src/actions.rs | 31 + .../crates/lib/src/client.rs | 267 + .../crates/lib/src/gen_macros.rs | 12 + .../prisma-client-rust/crates/lib/src/lib.rs | 143 + .../crates/lib/src/migrations.rs | 275 + .../prisma-client-rust/crates/lib/src/mock.rs | 52 + .../crates/lib/src/operator.rs | 17 + .../crates/lib/src/prisma_value.rs | 159 + .../crates/lib/src/queries/batch.rs | 291 + .../crates/lib/src/queries/count.rs | 166 + .../crates/lib/src/queries/create.rs | 111 + .../crates/lib/src/queries/create_many.rs | 96 + .../lib/src/queries/create_unchecked.rs | 111 + .../crates/lib/src/queries/delete.rs | 103 + .../crates/lib/src/queries/delete_many.rs | 74 + .../crates/lib/src/queries/error.rs | 40 + .../crates/lib/src/queries/execute_raw.rs | 56 + .../crates/lib/src/queries/find_first.rs | 215 + .../crates/lib/src/queries/find_many.rs | 322 + .../crates/lib/src/queries/find_unique.rs | 130 + .../crates/lib/src/queries/include.rs | 49 + .../crates/lib/src/queries/mod.rs | 132 + .../crates/lib/src/queries/mongo_raw.rs | 245 + .../crates/lib/src/queries/query.rs | 145 + .../crates/lib/src/queries/query_raw.rs | 101 + .../crates/lib/src/queries/select.rs | 49 + .../crates/lib/src/queries/update.rs | 133 + .../crates/lib/src/queries/update_many.rs | 94 + .../lib/src/queries/update_unchecked.rs | 134 + .../crates/lib/src/queries/upsert.rs | 135 + .../prisma-client-rust/crates/lib/src/raw.rs | 145 + .../crates/lib/src/scalar_types.rs | 9 + .../crates/lib/src/serde.rs | 23 + .../crates/lib/src/traits.rs | 7 + .../crates/lib/src/transaction.rs | 140 + .../prisma-client-rust/crates/sdk/Cargo.toml | 32 + .../crates/sdk/example/README.md | 17 + .../crates/sdk/example/app/.cargo/config.toml | 3 + .../crates/sdk/example/app/Cargo.toml | 12 + .../example/app/prisma/migrations/.gitkeep | 0 .../sdk/example/app/prisma/schema.prisma | 30 + .../crates/sdk/example/app/src/main.rs | 10 + .../crates/sdk/example/generator/Cargo.toml | 11 + .../crates/sdk/example/generator/src/lib.rs | 72 + .../crates/sdk/example/lib/Cargo.toml | 8 + .../crates/sdk/example/lib/src/lib.rs | 5 + .../crates/sdk/example/prisma-cli/Cargo.toml | 13 + .../prisma-cli/src/bin/custom-generator.rs | 3 + .../prisma-cli/src/bin/sdk-example-prisma.rs | 3 + .../prisma-client-rust/crates/sdk/src/args.rs | 437 + .../crates/sdk/src/casing.rs | 34 + .../prisma-client-rust/crates/sdk/src/dmmf.rs | 54 + .../crates/sdk/src/extensions.rs | 311 + .../crates/sdk/src/jsonrpc.rs | 41 + .../crates/sdk/src/keywords.rs | 57 + .../prisma-client-rust/crates/sdk/src/lib.rs | 170 + .../crates/sdk/src/runtime.rs | 189 + .../crates/sdk/src/shared_config.rs | 15 + .../crates/sdk/src/utils.rs | 9 + .../prisma-client-rust/docs/next-env.d.ts | 5 + .../prisma-client-rust/docs/next.config.js | 6 + external/prisma-client-rust/docs/package.json | 28 + .../docs/pages/0.6.0-migration.md | 113 + .../prisma-client-rust/docs/pages/_app.mdx | 5 + .../prisma-client-rust/docs/pages/_meta.json | 8 + .../docs/pages/extra/_meta.json | 12 + .../docs/pages/extra/batching.md | 130 + .../docs/pages/extra/composite-types.md | 184 + .../docs/pages/extra/error-handling.md | 60 + .../docs/pages/extra/migrations.md | 91 + .../docs/pages/extra/mocking.md | 72 + .../docs/pages/extra/partial-types.md | 72 + .../docs/pages/extra/raw.md | 165 + .../docs/pages/extra/rspc.md | 161 + .../docs/pages/extra/traits.md | 63 + .../docs/pages/extra/transactions.md | 206 + .../docs/pages/getting-started/_meta.json | 5 + .../pages/getting-started/installation.mdx | 146 + .../docs/pages/getting-started/setup.mdx | 84 + .../docs/pages/getting-started/structure.md | 35 + .../prisma-client-rust/docs/pages/index.md | 26 + .../docs/pages/reading-data/_meta.json | 8 + .../docs/pages/reading-data/count.md | 31 + .../docs/pages/reading-data/fetch.md | 107 + .../docs/pages/reading-data/find.md | 167 + .../docs/pages/reading-data/order-by.md | 89 + .../docs/pages/reading-data/pagination.md | 100 + .../docs/pages/reading-data/select-include.md | 248 + .../docs/pages/writing-data/_meta.json | 6 + .../docs/pages/writing-data/create.mdx | 177 + .../docs/pages/writing-data/delete.md | 59 + .../docs/pages/writing-data/update.md | 134 + .../docs/pages/writing-data/upsert.md | 50 + .../prisma-client-rust/docs/pnpm-lock.yaml | 3302 ++++++ .../prisma-client-rust/docs/postcss.config.js | 9 + external/prisma-client-rust/docs/style.css | 3 + .../docs/tailwind.config.js | 13 + .../prisma-client-rust/docs/theme.config.tsx | 100 + .../prisma-client-rust/docs/tsconfig.json | 29 + .../examples/actix/.cargo/config.toml | 2 + .../examples/actix/Cargo.toml | 9 + .../examples/actix/README.md | 21 + .../examples/actix/prisma/migrations/.gitkeep | 0 .../examples/actix/prisma/schema.prisma | 22 + .../examples/actix/src/main.rs | 86 + .../examples/axum-graphql/.cargo/config.toml | 2 + .../examples/axum-graphql/Cargo.toml | 13 + .../examples/axum-graphql/README.md | 27 + .../axum-graphql/prisma/migrations/.gitkeep | 0 .../axum-graphql/prisma/schema.prisma | 22 + .../examples/axum-graphql/src/graphql/mod.rs | 4 + .../axum-graphql/src/graphql/mutation/mod.rs | 10 + .../axum-graphql/src/graphql/mutation/post.rs | 34 + .../axum-graphql/src/graphql/mutation/user.rs | 22 + .../axum-graphql/src/graphql/query/mod.rs | 10 + .../axum-graphql/src/graphql/query/post.rs | 22 + .../axum-graphql/src/graphql/query/user.rs | 36 + .../axum-graphql/src/graphql/schema.rs | 23 + .../axum-graphql/src/graphql/types.rs | 67 + .../examples/axum-graphql/src/main.rs | 49 + .../examples/axum-rest/.cargo/config.toml | 2 + .../examples/axum-rest/Cargo.toml | 10 + .../examples/axum-rest/README.md | 53 + .../axum-rest/prisma/migrations/.gitkeep | 0 .../examples/axum-rest/prisma/schema.prisma | 23 + .../examples/axum-rest/src/main.rs | 27 + .../examples/axum-rest/src/routes.rs | 145 + .../examples/basic/.cargo/config.toml | 2 + .../examples/basic/Cargo.toml | 11 + .../examples/basic/README.md | 17 + .../examples/basic/prisma/migrations/.gitkeep | 0 .../examples/basic/prisma/schema.prisma | 24 + .../examples/basic/src/main.rs | 75 + .../examples/rocket/.cargo/config.toml | 2 + .../examples/rocket/Cargo.toml | 11 + .../examples/rocket/README.md | 69 + .../examples/rocket/Rocket.toml | 15 + .../rocket/prisma/migrations/.gitkeep | 0 .../examples/rocket/prisma/schema.prisma | 22 + .../examples/rocket/src/main.rs | 59 + .../examples/rspc/.cargo/config.toml | 2 + .../examples/rspc/Cargo.toml | 11 + .../examples/rspc/README.md | 20 + .../examples/rspc/bindings.ts | 18 + .../examples/rspc/prisma/migrations/.gitkeep | 0 .../examples/rspc/prisma/schema.prisma | 23 + .../examples/rspc/src/main.rs | 84 + .../examples/tauri/.gitignore | 3 + .../examples/tauri/.taurignore | 1 + .../examples/tauri/README.md | 21 + .../examples/tauri/index.html | 17 + .../examples/tauri/package.json | 26 + .../examples/tauri/pnpm-lock.yaml | 1889 ++++ .../examples/tauri/postcss.config.js | 6 + .../examples/tauri/public/tauri.svg | 6 + .../examples/tauri/public/vite.svg | 1 + .../tauri/src-tauri/.cargo/config.toml | 2 + .../examples/tauri/src-tauri/.gitignore | 4 + .../examples/tauri/src-tauri/Cargo.toml | 34 + .../examples/tauri/src-tauri/build.rs | 3 + .../src-tauri/gen/schemas/acl-manifests.json | 1 + .../src-tauri/gen/schemas/capabilities.json | 1 + .../src-tauri/gen/schemas/desktop-schema.json | 2153 ++++ .../src-tauri/gen/schemas/macOS-schema.json | 2153 ++++ .../tauri/src-tauri/icons/128x128.png | Bin 0 -> 3512 bytes .../tauri/src-tauri/icons/128x128@2x.png | Bin 0 -> 7012 bytes .../examples/tauri/src-tauri/icons/32x32.png | Bin 0 -> 974 bytes .../src-tauri/icons/Square107x107Logo.png | Bin 0 -> 2863 bytes .../src-tauri/icons/Square142x142Logo.png | Bin 0 -> 3858 bytes .../src-tauri/icons/Square150x150Logo.png | Bin 0 -> 3966 bytes .../src-tauri/icons/Square284x284Logo.png | Bin 0 -> 7737 bytes .../tauri/src-tauri/icons/Square30x30Logo.png | Bin 0 -> 903 bytes .../src-tauri/icons/Square310x310Logo.png | Bin 0 -> 8591 bytes .../tauri/src-tauri/icons/Square44x44Logo.png | Bin 0 -> 1299 bytes .../tauri/src-tauri/icons/Square71x71Logo.png | Bin 0 -> 2011 bytes .../tauri/src-tauri/icons/Square89x89Logo.png | Bin 0 -> 2468 bytes .../tauri/src-tauri/icons/StoreLogo.png | Bin 0 -> 1523 bytes .../examples/tauri/src-tauri/icons/icon.icns | Bin 0 -> 98451 bytes .../examples/tauri/src-tauri/icons/icon.ico | Bin 0 -> 86642 bytes .../examples/tauri/src-tauri/icons/icon.png | Bin 0 -> 14183 bytes .../src-tauri/prisma/migrations/.gitkeep | 0 .../tauri/src-tauri/prisma/schema.prisma | 16 + .../examples/tauri/src-tauri/src/main.rs | 59 + .../examples/tauri/src-tauri/tauri.conf.json | 34 + .../examples/tauri/src/App.tsx | 68 + .../examples/tauri/src/bindings.ts | 86 + .../examples/tauri/src/index.tsx | 7 + .../examples/tauri/src/styles.css | 3 + .../examples/tauri/tailwind.config.js | 11 + .../examples/tauri/tsconfig.json | 15 + .../examples/tauri/vite.config.ts | 31 + .../integration-tests/.cargo/config.toml | 2 + .../integration-tests/Cargo.toml | 28 + .../20221004185242_init/migration.sql | 103 + .../migration.sql | 7 + .../migrations/migration_lock.toml | 3 + .../integration-tests/schema.prisma | 127 + .../integration-tests/tests/batch.rs | 375 + .../integration-tests/tests/callbacks.rs | 67 + .../integration-tests/tests/count.rs | 93 + .../integration-tests/tests/create.rs | 141 + .../integration-tests/tests/create_many.rs | 53 + .../integration-tests/tests/delete.rs | 70 + .../integration-tests/tests/delete_many.rs | 33 + .../integration-tests/tests/find_first.rs | 358 + .../integration-tests/tests/find_many.rs | 514 + .../integration-tests/tests/find_unique.rs | 103 + .../integration-tests/tests/include.rs | 144 + .../integration-tests/tests/lib.rs | 43 + .../integration-tests/tests/mock.rs | 81 + .../integration-tests/tests/order.rs | 95 + .../integration-tests/tests/partial.rs | 83 + .../integration-tests/tests/raw.rs | 96 + .../integration-tests/tests/select.rs | 169 + .../integration-tests/tests/specta.rs | 25 + .../integration-tests/tests/transaction.rs | 258 + .../integration-tests/tests/types.rs | 24 + .../integration-tests/tests/update.rs | 463 + .../integration-tests/tests/upsert.rs | 51 + .../integration-tests/tests/utils.rs | 40 + .../integration-tests/tests/with.rs | 302 + .../prisma-client-rust/prisma-cli/Cargo.toml | 18 + .../prisma-cli/src/bin/prisma.rs | 3 + .../tests/database/mongodb/.cargo/config.toml | 2 + .../tests/database/mongodb/Cargo.toml | 26 + .../mongodb/prisma/migrations/.gitkeep | 0 .../database/mongodb/prisma/schema.prisma | 32 + .../tests/database/mongodb/tests/lib.rs | 364 + .../tests/database/mongodb/tests/utils.rs | 24 + .../database/postgres/.cargo/config.toml | 3 + .../tests/database/postgres/Cargo.toml | 26 + .../postgres/prisma/migrations/.gitkeep | 0 .../database/postgres/prisma/schema.prisma | 34 + .../tests/database/postgres/tests/lib.rs | 6 + .../tests/database/postgres/tests/utils.rs | 24 + .../database/sqlserver/.cargo/config.toml | 2 + .../tests/database/sqlserver/Cargo.toml | 25 + .../sqlserver/prisma/migrations/.gitkeep | 0 .../database/sqlserver/prisma/schema.prisma | 16 + .../tests/database/sqlserver/tests/lib.rs | 19 + .../tests/issues/issue-417/.cargo/config.toml | 2 + .../tests/issues/issue-417/Cargo.toml | 10 + .../issues/issue-417/prisma/schema.prisma | 18 + .../tests/issues/issue-417/src/lib.rs | 12 + src/api/bindings/app.ts | 66 +- 316 files changed, 41929 insertions(+), 251 deletions(-) create mode 100644 crates/rpc-rs/src/macros.rs create mode 100644 external/prisma-client-rust/.cargo/config.toml create mode 100644 external/prisma-client-rust/.gitignore create mode 100644 external/prisma-client-rust/.vscode/settings.json create mode 100644 external/prisma-client-rust/CODE_OF_CONDUCT.md create mode 100644 external/prisma-client-rust/Cargo.lock create mode 100644 external/prisma-client-rust/Cargo.toml create mode 100644 external/prisma-client-rust/LICENSE create mode 100644 external/prisma-client-rust/README.md create mode 100644 external/prisma-client-rust/crates/cli/Cargo.toml create mode 100644 external/prisma-client-rust/crates/cli/src/binaries/mod.rs create mode 100644 external/prisma-client-rust/crates/cli/src/binaries/platform.rs create mode 100644 external/prisma-client-rust/crates/cli/src/lib.rs create mode 100644 external/prisma-client-rust/crates/cli/src/prisma_cli.rs create mode 100644 external/prisma-client-rust/crates/generator-macros/Cargo.toml create mode 100644 external/prisma-client-rust/crates/generator-macros/src/filter.rs create mode 100644 external/prisma-client-rust/crates/generator-macros/src/lib.rs create mode 100644 external/prisma-client-rust/crates/generator-macros/src/partial_unchecked.rs create mode 100644 external/prisma-client-rust/crates/generator-macros/src/select_include/definitions.rs create mode 100644 external/prisma-client-rust/crates/generator-macros/src/select_include/mod.rs create mode 100644 external/prisma-client-rust/crates/generator-macros/src/select_include/selection/arg.rs create mode 100644 external/prisma-client-rust/crates/generator-macros/src/select_include/selection/filters.rs create mode 100644 external/prisma-client-rust/crates/generator-macros/src/select_include/selection/item.rs create mode 100644 external/prisma-client-rust/crates/generator-macros/src/select_include/selection/mod.rs create mode 100644 external/prisma-client-rust/crates/generator-shared/Cargo.toml create mode 100644 external/prisma-client-rust/crates/generator-shared/src/lib.rs create mode 100644 external/prisma-client-rust/crates/generator-shared/src/select_include/mod.rs create mode 100644 external/prisma-client-rust/crates/generator-shared/src/select_include/selectable_fields.rs create mode 100644 external/prisma-client-rust/crates/generator-shared/src/select_include/variant.rs create mode 100644 external/prisma-client-rust/crates/generator/Cargo.toml create mode 100644 external/prisma-client-rust/crates/generator/src/client.rs create mode 100644 external/prisma-client-rust/crates/generator/src/composite_types/data.rs create mode 100644 external/prisma-client-rust/crates/generator/src/composite_types/mod.rs create mode 100644 external/prisma-client-rust/crates/generator/src/composite_types/order_by.rs create mode 100644 external/prisma-client-rust/crates/generator/src/composite_types/set_params.rs create mode 100644 external/prisma-client-rust/crates/generator/src/composite_types/where_params.rs create mode 100644 external/prisma-client-rust/crates/generator/src/enums.rs create mode 100644 external/prisma-client-rust/crates/generator/src/header.rs create mode 100644 external/prisma-client-rust/crates/generator/src/internal_enums.rs create mode 100644 external/prisma-client-rust/crates/generator/src/lib.rs create mode 100644 external/prisma-client-rust/crates/generator/src/models/actions.rs create mode 100644 external/prisma-client-rust/crates/generator/src/models/create.rs create mode 100644 external/prisma-client-rust/crates/generator/src/models/data.rs create mode 100644 external/prisma-client-rust/crates/generator/src/models/filter.rs create mode 100644 external/prisma-client-rust/crates/generator/src/models/mod.rs create mode 100644 external/prisma-client-rust/crates/generator/src/models/order_by.rs create mode 100644 external/prisma-client-rust/crates/generator/src/models/pagination.rs create mode 100644 external/prisma-client-rust/crates/generator/src/models/partial_unchecked.rs create mode 100644 external/prisma-client-rust/crates/generator/src/models/select_include.rs create mode 100644 external/prisma-client-rust/crates/generator/src/models/set_params.rs create mode 100644 external/prisma-client-rust/crates/generator/src/models/types.rs create mode 100644 external/prisma-client-rust/crates/generator/src/models/update.rs create mode 100644 external/prisma-client-rust/crates/generator/src/models/where_params.rs create mode 100644 external/prisma-client-rust/crates/generator/src/models/with_params.rs create mode 100644 external/prisma-client-rust/crates/generator/src/prelude.rs create mode 100644 external/prisma-client-rust/crates/generator/src/read_filters.rs create mode 100644 external/prisma-client-rust/crates/generator/src/write_params.rs create mode 100644 external/prisma-client-rust/crates/lib/Cargo.toml create mode 100644 external/prisma-client-rust/crates/lib/src/actions.rs create mode 100644 external/prisma-client-rust/crates/lib/src/client.rs create mode 100644 external/prisma-client-rust/crates/lib/src/gen_macros.rs create mode 100644 external/prisma-client-rust/crates/lib/src/lib.rs create mode 100644 external/prisma-client-rust/crates/lib/src/migrations.rs create mode 100644 external/prisma-client-rust/crates/lib/src/mock.rs create mode 100644 external/prisma-client-rust/crates/lib/src/operator.rs create mode 100644 external/prisma-client-rust/crates/lib/src/prisma_value.rs create mode 100644 external/prisma-client-rust/crates/lib/src/queries/batch.rs create mode 100644 external/prisma-client-rust/crates/lib/src/queries/count.rs create mode 100644 external/prisma-client-rust/crates/lib/src/queries/create.rs create mode 100644 external/prisma-client-rust/crates/lib/src/queries/create_many.rs create mode 100644 external/prisma-client-rust/crates/lib/src/queries/create_unchecked.rs create mode 100644 external/prisma-client-rust/crates/lib/src/queries/delete.rs create mode 100644 external/prisma-client-rust/crates/lib/src/queries/delete_many.rs create mode 100644 external/prisma-client-rust/crates/lib/src/queries/error.rs create mode 100644 external/prisma-client-rust/crates/lib/src/queries/execute_raw.rs create mode 100644 external/prisma-client-rust/crates/lib/src/queries/find_first.rs create mode 100644 external/prisma-client-rust/crates/lib/src/queries/find_many.rs create mode 100644 external/prisma-client-rust/crates/lib/src/queries/find_unique.rs create mode 100644 external/prisma-client-rust/crates/lib/src/queries/include.rs create mode 100644 external/prisma-client-rust/crates/lib/src/queries/mod.rs create mode 100644 external/prisma-client-rust/crates/lib/src/queries/mongo_raw.rs create mode 100644 external/prisma-client-rust/crates/lib/src/queries/query.rs create mode 100644 external/prisma-client-rust/crates/lib/src/queries/query_raw.rs create mode 100644 external/prisma-client-rust/crates/lib/src/queries/select.rs create mode 100644 external/prisma-client-rust/crates/lib/src/queries/update.rs create mode 100644 external/prisma-client-rust/crates/lib/src/queries/update_many.rs create mode 100644 external/prisma-client-rust/crates/lib/src/queries/update_unchecked.rs create mode 100644 external/prisma-client-rust/crates/lib/src/queries/upsert.rs create mode 100644 external/prisma-client-rust/crates/lib/src/raw.rs create mode 100644 external/prisma-client-rust/crates/lib/src/scalar_types.rs create mode 100644 external/prisma-client-rust/crates/lib/src/serde.rs create mode 100644 external/prisma-client-rust/crates/lib/src/traits.rs create mode 100644 external/prisma-client-rust/crates/lib/src/transaction.rs create mode 100644 external/prisma-client-rust/crates/sdk/Cargo.toml create mode 100644 external/prisma-client-rust/crates/sdk/example/README.md create mode 100644 external/prisma-client-rust/crates/sdk/example/app/.cargo/config.toml create mode 100644 external/prisma-client-rust/crates/sdk/example/app/Cargo.toml create mode 100644 external/prisma-client-rust/crates/sdk/example/app/prisma/migrations/.gitkeep create mode 100644 external/prisma-client-rust/crates/sdk/example/app/prisma/schema.prisma create mode 100644 external/prisma-client-rust/crates/sdk/example/app/src/main.rs create mode 100644 external/prisma-client-rust/crates/sdk/example/generator/Cargo.toml create mode 100644 external/prisma-client-rust/crates/sdk/example/generator/src/lib.rs create mode 100644 external/prisma-client-rust/crates/sdk/example/lib/Cargo.toml create mode 100644 external/prisma-client-rust/crates/sdk/example/lib/src/lib.rs create mode 100644 external/prisma-client-rust/crates/sdk/example/prisma-cli/Cargo.toml create mode 100644 external/prisma-client-rust/crates/sdk/example/prisma-cli/src/bin/custom-generator.rs create mode 100644 external/prisma-client-rust/crates/sdk/example/prisma-cli/src/bin/sdk-example-prisma.rs create mode 100644 external/prisma-client-rust/crates/sdk/src/args.rs create mode 100644 external/prisma-client-rust/crates/sdk/src/casing.rs create mode 100644 external/prisma-client-rust/crates/sdk/src/dmmf.rs create mode 100644 external/prisma-client-rust/crates/sdk/src/extensions.rs create mode 100644 external/prisma-client-rust/crates/sdk/src/jsonrpc.rs create mode 100644 external/prisma-client-rust/crates/sdk/src/keywords.rs create mode 100644 external/prisma-client-rust/crates/sdk/src/lib.rs create mode 100644 external/prisma-client-rust/crates/sdk/src/runtime.rs create mode 100644 external/prisma-client-rust/crates/sdk/src/shared_config.rs create mode 100644 external/prisma-client-rust/crates/sdk/src/utils.rs create mode 100644 external/prisma-client-rust/docs/next-env.d.ts create mode 100644 external/prisma-client-rust/docs/next.config.js create mode 100644 external/prisma-client-rust/docs/package.json create mode 100644 external/prisma-client-rust/docs/pages/0.6.0-migration.md create mode 100644 external/prisma-client-rust/docs/pages/_app.mdx create mode 100644 external/prisma-client-rust/docs/pages/_meta.json create mode 100644 external/prisma-client-rust/docs/pages/extra/_meta.json create mode 100644 external/prisma-client-rust/docs/pages/extra/batching.md create mode 100644 external/prisma-client-rust/docs/pages/extra/composite-types.md create mode 100644 external/prisma-client-rust/docs/pages/extra/error-handling.md create mode 100644 external/prisma-client-rust/docs/pages/extra/migrations.md create mode 100644 external/prisma-client-rust/docs/pages/extra/mocking.md create mode 100644 external/prisma-client-rust/docs/pages/extra/partial-types.md create mode 100644 external/prisma-client-rust/docs/pages/extra/raw.md create mode 100644 external/prisma-client-rust/docs/pages/extra/rspc.md create mode 100644 external/prisma-client-rust/docs/pages/extra/traits.md create mode 100644 external/prisma-client-rust/docs/pages/extra/transactions.md create mode 100644 external/prisma-client-rust/docs/pages/getting-started/_meta.json create mode 100644 external/prisma-client-rust/docs/pages/getting-started/installation.mdx create mode 100644 external/prisma-client-rust/docs/pages/getting-started/setup.mdx create mode 100644 external/prisma-client-rust/docs/pages/getting-started/structure.md create mode 100644 external/prisma-client-rust/docs/pages/index.md create mode 100644 external/prisma-client-rust/docs/pages/reading-data/_meta.json create mode 100644 external/prisma-client-rust/docs/pages/reading-data/count.md create mode 100644 external/prisma-client-rust/docs/pages/reading-data/fetch.md create mode 100644 external/prisma-client-rust/docs/pages/reading-data/find.md create mode 100644 external/prisma-client-rust/docs/pages/reading-data/order-by.md create mode 100644 external/prisma-client-rust/docs/pages/reading-data/pagination.md create mode 100644 external/prisma-client-rust/docs/pages/reading-data/select-include.md create mode 100644 external/prisma-client-rust/docs/pages/writing-data/_meta.json create mode 100644 external/prisma-client-rust/docs/pages/writing-data/create.mdx create mode 100644 external/prisma-client-rust/docs/pages/writing-data/delete.md create mode 100644 external/prisma-client-rust/docs/pages/writing-data/update.md create mode 100644 external/prisma-client-rust/docs/pages/writing-data/upsert.md create mode 100644 external/prisma-client-rust/docs/pnpm-lock.yaml create mode 100644 external/prisma-client-rust/docs/postcss.config.js create mode 100644 external/prisma-client-rust/docs/style.css create mode 100644 external/prisma-client-rust/docs/tailwind.config.js create mode 100644 external/prisma-client-rust/docs/theme.config.tsx create mode 100644 external/prisma-client-rust/docs/tsconfig.json create mode 100644 external/prisma-client-rust/examples/actix/.cargo/config.toml create mode 100644 external/prisma-client-rust/examples/actix/Cargo.toml create mode 100644 external/prisma-client-rust/examples/actix/README.md create mode 100644 external/prisma-client-rust/examples/actix/prisma/migrations/.gitkeep create mode 100644 external/prisma-client-rust/examples/actix/prisma/schema.prisma create mode 100644 external/prisma-client-rust/examples/actix/src/main.rs create mode 100644 external/prisma-client-rust/examples/axum-graphql/.cargo/config.toml create mode 100644 external/prisma-client-rust/examples/axum-graphql/Cargo.toml create mode 100644 external/prisma-client-rust/examples/axum-graphql/README.md create mode 100644 external/prisma-client-rust/examples/axum-graphql/prisma/migrations/.gitkeep create mode 100644 external/prisma-client-rust/examples/axum-graphql/prisma/schema.prisma create mode 100644 external/prisma-client-rust/examples/axum-graphql/src/graphql/mod.rs create mode 100644 external/prisma-client-rust/examples/axum-graphql/src/graphql/mutation/mod.rs create mode 100644 external/prisma-client-rust/examples/axum-graphql/src/graphql/mutation/post.rs create mode 100644 external/prisma-client-rust/examples/axum-graphql/src/graphql/mutation/user.rs create mode 100644 external/prisma-client-rust/examples/axum-graphql/src/graphql/query/mod.rs create mode 100644 external/prisma-client-rust/examples/axum-graphql/src/graphql/query/post.rs create mode 100644 external/prisma-client-rust/examples/axum-graphql/src/graphql/query/user.rs create mode 100644 external/prisma-client-rust/examples/axum-graphql/src/graphql/schema.rs create mode 100644 external/prisma-client-rust/examples/axum-graphql/src/graphql/types.rs create mode 100644 external/prisma-client-rust/examples/axum-graphql/src/main.rs create mode 100644 external/prisma-client-rust/examples/axum-rest/.cargo/config.toml create mode 100644 external/prisma-client-rust/examples/axum-rest/Cargo.toml create mode 100644 external/prisma-client-rust/examples/axum-rest/README.md create mode 100644 external/prisma-client-rust/examples/axum-rest/prisma/migrations/.gitkeep create mode 100644 external/prisma-client-rust/examples/axum-rest/prisma/schema.prisma create mode 100644 external/prisma-client-rust/examples/axum-rest/src/main.rs create mode 100644 external/prisma-client-rust/examples/axum-rest/src/routes.rs create mode 100644 external/prisma-client-rust/examples/basic/.cargo/config.toml create mode 100644 external/prisma-client-rust/examples/basic/Cargo.toml create mode 100644 external/prisma-client-rust/examples/basic/README.md create mode 100644 external/prisma-client-rust/examples/basic/prisma/migrations/.gitkeep create mode 100644 external/prisma-client-rust/examples/basic/prisma/schema.prisma create mode 100644 external/prisma-client-rust/examples/basic/src/main.rs create mode 100644 external/prisma-client-rust/examples/rocket/.cargo/config.toml create mode 100644 external/prisma-client-rust/examples/rocket/Cargo.toml create mode 100644 external/prisma-client-rust/examples/rocket/README.md create mode 100644 external/prisma-client-rust/examples/rocket/Rocket.toml create mode 100644 external/prisma-client-rust/examples/rocket/prisma/migrations/.gitkeep create mode 100644 external/prisma-client-rust/examples/rocket/prisma/schema.prisma create mode 100644 external/prisma-client-rust/examples/rocket/src/main.rs create mode 100644 external/prisma-client-rust/examples/rspc/.cargo/config.toml create mode 100644 external/prisma-client-rust/examples/rspc/Cargo.toml create mode 100644 external/prisma-client-rust/examples/rspc/README.md create mode 100644 external/prisma-client-rust/examples/rspc/bindings.ts create mode 100644 external/prisma-client-rust/examples/rspc/prisma/migrations/.gitkeep create mode 100644 external/prisma-client-rust/examples/rspc/prisma/schema.prisma create mode 100644 external/prisma-client-rust/examples/rspc/src/main.rs create mode 100644 external/prisma-client-rust/examples/tauri/.gitignore create mode 100644 external/prisma-client-rust/examples/tauri/.taurignore create mode 100644 external/prisma-client-rust/examples/tauri/README.md create mode 100644 external/prisma-client-rust/examples/tauri/index.html create mode 100644 external/prisma-client-rust/examples/tauri/package.json create mode 100644 external/prisma-client-rust/examples/tauri/pnpm-lock.yaml create mode 100644 external/prisma-client-rust/examples/tauri/postcss.config.js create mode 100644 external/prisma-client-rust/examples/tauri/public/tauri.svg create mode 100644 external/prisma-client-rust/examples/tauri/public/vite.svg create mode 100644 external/prisma-client-rust/examples/tauri/src-tauri/.cargo/config.toml create mode 100644 external/prisma-client-rust/examples/tauri/src-tauri/.gitignore create mode 100644 external/prisma-client-rust/examples/tauri/src-tauri/Cargo.toml create mode 100644 external/prisma-client-rust/examples/tauri/src-tauri/build.rs create mode 100644 external/prisma-client-rust/examples/tauri/src-tauri/gen/schemas/acl-manifests.json create mode 100644 external/prisma-client-rust/examples/tauri/src-tauri/gen/schemas/capabilities.json create mode 100644 external/prisma-client-rust/examples/tauri/src-tauri/gen/schemas/desktop-schema.json create mode 100644 external/prisma-client-rust/examples/tauri/src-tauri/gen/schemas/macOS-schema.json create mode 100644 external/prisma-client-rust/examples/tauri/src-tauri/icons/128x128.png create mode 100644 external/prisma-client-rust/examples/tauri/src-tauri/icons/128x128@2x.png create mode 100644 external/prisma-client-rust/examples/tauri/src-tauri/icons/32x32.png create mode 100644 external/prisma-client-rust/examples/tauri/src-tauri/icons/Square107x107Logo.png create mode 100644 external/prisma-client-rust/examples/tauri/src-tauri/icons/Square142x142Logo.png create mode 100644 external/prisma-client-rust/examples/tauri/src-tauri/icons/Square150x150Logo.png create mode 100644 external/prisma-client-rust/examples/tauri/src-tauri/icons/Square284x284Logo.png create mode 100644 external/prisma-client-rust/examples/tauri/src-tauri/icons/Square30x30Logo.png create mode 100644 external/prisma-client-rust/examples/tauri/src-tauri/icons/Square310x310Logo.png create mode 100644 external/prisma-client-rust/examples/tauri/src-tauri/icons/Square44x44Logo.png create mode 100644 external/prisma-client-rust/examples/tauri/src-tauri/icons/Square71x71Logo.png create mode 100644 external/prisma-client-rust/examples/tauri/src-tauri/icons/Square89x89Logo.png create mode 100644 external/prisma-client-rust/examples/tauri/src-tauri/icons/StoreLogo.png create mode 100644 external/prisma-client-rust/examples/tauri/src-tauri/icons/icon.icns create mode 100644 external/prisma-client-rust/examples/tauri/src-tauri/icons/icon.ico create mode 100644 external/prisma-client-rust/examples/tauri/src-tauri/icons/icon.png create mode 100644 external/prisma-client-rust/examples/tauri/src-tauri/prisma/migrations/.gitkeep create mode 100644 external/prisma-client-rust/examples/tauri/src-tauri/prisma/schema.prisma create mode 100644 external/prisma-client-rust/examples/tauri/src-tauri/src/main.rs create mode 100644 external/prisma-client-rust/examples/tauri/src-tauri/tauri.conf.json create mode 100644 external/prisma-client-rust/examples/tauri/src/App.tsx create mode 100644 external/prisma-client-rust/examples/tauri/src/bindings.ts create mode 100644 external/prisma-client-rust/examples/tauri/src/index.tsx create mode 100644 external/prisma-client-rust/examples/tauri/src/styles.css create mode 100644 external/prisma-client-rust/examples/tauri/tailwind.config.js create mode 100644 external/prisma-client-rust/examples/tauri/tsconfig.json create mode 100644 external/prisma-client-rust/examples/tauri/vite.config.ts create mode 100644 external/prisma-client-rust/integration-tests/.cargo/config.toml create mode 100644 external/prisma-client-rust/integration-tests/Cargo.toml create mode 100644 external/prisma-client-rust/integration-tests/migrations/20221004185242_init/migration.sql create mode 100644 external/prisma-client-rust/integration-tests/migrations/20230225213923_add_unsupported_field/migration.sql create mode 100644 external/prisma-client-rust/integration-tests/migrations/migration_lock.toml create mode 100644 external/prisma-client-rust/integration-tests/schema.prisma create mode 100644 external/prisma-client-rust/integration-tests/tests/batch.rs create mode 100644 external/prisma-client-rust/integration-tests/tests/callbacks.rs create mode 100644 external/prisma-client-rust/integration-tests/tests/count.rs create mode 100644 external/prisma-client-rust/integration-tests/tests/create.rs create mode 100644 external/prisma-client-rust/integration-tests/tests/create_many.rs create mode 100644 external/prisma-client-rust/integration-tests/tests/delete.rs create mode 100644 external/prisma-client-rust/integration-tests/tests/delete_many.rs create mode 100644 external/prisma-client-rust/integration-tests/tests/find_first.rs create mode 100644 external/prisma-client-rust/integration-tests/tests/find_many.rs create mode 100644 external/prisma-client-rust/integration-tests/tests/find_unique.rs create mode 100644 external/prisma-client-rust/integration-tests/tests/include.rs create mode 100644 external/prisma-client-rust/integration-tests/tests/lib.rs create mode 100644 external/prisma-client-rust/integration-tests/tests/mock.rs create mode 100644 external/prisma-client-rust/integration-tests/tests/order.rs create mode 100644 external/prisma-client-rust/integration-tests/tests/partial.rs create mode 100644 external/prisma-client-rust/integration-tests/tests/raw.rs create mode 100644 external/prisma-client-rust/integration-tests/tests/select.rs create mode 100644 external/prisma-client-rust/integration-tests/tests/specta.rs create mode 100644 external/prisma-client-rust/integration-tests/tests/transaction.rs create mode 100644 external/prisma-client-rust/integration-tests/tests/types.rs create mode 100644 external/prisma-client-rust/integration-tests/tests/update.rs create mode 100644 external/prisma-client-rust/integration-tests/tests/upsert.rs create mode 100644 external/prisma-client-rust/integration-tests/tests/utils.rs create mode 100644 external/prisma-client-rust/integration-tests/tests/with.rs create mode 100644 external/prisma-client-rust/prisma-cli/Cargo.toml create mode 100644 external/prisma-client-rust/prisma-cli/src/bin/prisma.rs create mode 100644 external/prisma-client-rust/tests/database/mongodb/.cargo/config.toml create mode 100644 external/prisma-client-rust/tests/database/mongodb/Cargo.toml create mode 100644 external/prisma-client-rust/tests/database/mongodb/prisma/migrations/.gitkeep create mode 100644 external/prisma-client-rust/tests/database/mongodb/prisma/schema.prisma create mode 100644 external/prisma-client-rust/tests/database/mongodb/tests/lib.rs create mode 100644 external/prisma-client-rust/tests/database/mongodb/tests/utils.rs create mode 100644 external/prisma-client-rust/tests/database/postgres/.cargo/config.toml create mode 100644 external/prisma-client-rust/tests/database/postgres/Cargo.toml create mode 100644 external/prisma-client-rust/tests/database/postgres/prisma/migrations/.gitkeep create mode 100644 external/prisma-client-rust/tests/database/postgres/prisma/schema.prisma create mode 100644 external/prisma-client-rust/tests/database/postgres/tests/lib.rs create mode 100644 external/prisma-client-rust/tests/database/postgres/tests/utils.rs create mode 100644 external/prisma-client-rust/tests/database/sqlserver/.cargo/config.toml create mode 100644 external/prisma-client-rust/tests/database/sqlserver/Cargo.toml create mode 100644 external/prisma-client-rust/tests/database/sqlserver/prisma/migrations/.gitkeep create mode 100644 external/prisma-client-rust/tests/database/sqlserver/prisma/schema.prisma create mode 100644 external/prisma-client-rust/tests/database/sqlserver/tests/lib.rs create mode 100644 external/prisma-client-rust/tests/issues/issue-417/.cargo/config.toml create mode 100644 external/prisma-client-rust/tests/issues/issue-417/Cargo.toml create mode 100644 external/prisma-client-rust/tests/issues/issue-417/prisma/schema.prisma create mode 100644 external/prisma-client-rust/tests/issues/issue-417/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index a426dd4..3f097d8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -53,6 +53,7 @@ version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "getrandom 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", "once_cell 1.19.0 (registry+https://github.com/rust-lang/crates.io-index)", "version_check 0.9.4 (registry+https://github.com/rust-lang/crates.io-index)", "zerocopy 0.7.34 (registry+https://github.com/rust-lang/crates.io-index)", @@ -219,6 +220,11 @@ dependencies = [ "x11rb 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "ascii" version = "0.9.3" @@ -313,6 +319,17 @@ dependencies = [ "pin-project-lite 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "async-native-tls" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures-util 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", + "native-tls 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 1.0.61 (registry+https://github.com/rust-lang/crates.io-index)", + "url 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "async-process" version = "2.2.3" @@ -374,6 +391,18 @@ dependencies = [ "syn 2.0.68 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "asynchronous-codec" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-sink 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-util 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.7.4 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project-lite 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "atk" version = "0.15.1" @@ -580,6 +609,24 @@ dependencies = [ "serde 1.0.203 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "bindgen" +version = "0.59.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "cexpr 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "clang-sys 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazycell 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.86 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.36 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.10.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "shlex 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "bindings" version = "2.0.0" @@ -615,6 +662,17 @@ name = "bitflags" version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "funty 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "radium 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tap 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "wyz 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "block" version = "0.1.6" @@ -656,6 +714,28 @@ dependencies = [ "piper 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "borsh" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "borsh-derive 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg_aliases 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "borsh-derive" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "once_cell 1.19.0 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.86 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.36 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 2.0.68 (registry+https://github.com/rust-lang/crates.io-index)", + "syn_derive 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "brotli" version = "3.5.0" @@ -675,6 +755,27 @@ dependencies = [ "alloc-stdlib 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "bson" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ahash 0.8.11 (registry+https://github.com/rust-lang/crates.io-index)", + "base64 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bitvec 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.38 (registry+https://github.com/rust-lang/crates.io-index)", + "hex 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "indexmap 2.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.69 (registry+https://github.com/rust-lang/crates.io-index)", + "once_cell 1.19.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.203 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_bytes 0.11.15 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.119 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.3.36 (registry+https://github.com/rust-lang/crates.io-index)", + "uuid 1.9.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "bstr" version = "1.9.1" @@ -704,6 +805,26 @@ name = "bumpalo" version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytecheck_derive 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "ptr_meta 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "simdutf8 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.86 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.36 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.109 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "bytecount" version = "0.6.8" @@ -825,6 +946,14 @@ name = "cesu8" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "nom 7.1.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "cfb" version = "0.7.3" @@ -942,6 +1071,16 @@ dependencies = [ "tokio 1.38.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "glob 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.155 (registry+https://github.com/rust-lang/crates.io-index)", + "libloading 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "clap" version = "4.5.8" @@ -995,6 +1134,14 @@ dependencies = [ "error-code 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "cmake" +version = "0.1.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "cocoa" version = "0.24.1" @@ -1079,7 +1226,7 @@ dependencies = [ "log 0.4.22 (registry+https://github.com/rust-lang/crates.io-index)", "mcmeta 2.0.0", "midlog 2.0.0", - "prisma-client-rust 0.6.8 (git+https://github.com/Brendonovich/prisma-client-rust?rev=4f9ef9d)", + "prisma-client-rust 0.6.8", "query 2.0.0", "reqwest 0.12.5 (registry+https://github.com/rust-lang/crates.io-index)", "rpc-rs 2.0.0", @@ -1227,6 +1374,18 @@ dependencies = [ "cfg-if 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "crossbeam" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-channel 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-deque 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-epoch 0.9.18 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-queue 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.8.20 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "crossbeam-channel" version = "0.5.13" @@ -1252,6 +1411,14 @@ dependencies = [ "crossbeam-utils 0.8.20 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-utils 0.8.20 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "crossbeam-utils" version = "0.8.20" @@ -1340,6 +1507,15 @@ dependencies = [ "sha3 0.10.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "darling" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "darling_core 0.13.4 (registry+https://github.com/rust-lang/crates.io-index)", + "darling_macro 0.13.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "darling" version = "0.20.9" @@ -1349,6 +1525,19 @@ dependencies = [ "darling_macro 0.20.9 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "darling_core" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "fnv 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "ident_case 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.86 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.36 (registry+https://github.com/rust-lang/crates.io-index)", + "strsim 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.109 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "darling_core" version = "0.20.9" @@ -1362,6 +1551,16 @@ dependencies = [ "syn 2.0.68 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "darling_macro" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "darling_core 0.13.4 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.36 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.109 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "darling_macro" version = "0.20.9" @@ -1377,7 +1576,7 @@ name = "data" version = "2.0.0" dependencies = [ "anyhow 1.0.81", - "prisma-client-rust 0.6.8 (git+https://github.com/Brendonovich/prisma-client-rust?rev=4f9ef9d)", + "prisma-client-rust 0.6.8", "serde 1.0.203 (registry+https://github.com/rust-lang/crates.io-index)", "specta 2.0.0-rc.13 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 1.38.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1413,6 +1612,16 @@ dependencies = [ "serde 1.0.203 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.86 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.36 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.109 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "derive-new" version = "0.6.0" @@ -1655,6 +1864,63 @@ name = "embed_plist" version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "encoding" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "encoding-index-japanese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding-index-korean 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding-index-simpchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding-index-singlebyte 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding-index-tradchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "encoding-index-japanese" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "encoding-index-korean" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "encoding-index-simpchinese" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "encoding-index-singlebyte" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "encoding-index-tradchinese" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "encoding_index_tests" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "encoding_rs" version = "0.8.34" @@ -1673,6 +1939,17 @@ name = "endian-type" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "enum-as-inner" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "heck 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.86 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.36 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.109 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "enumflags2" version = "0.7.10" @@ -1862,6 +2139,7 @@ version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crc32fast 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libz-sys 1.1.18 (registry+https://github.com/rust-lang/crates.io-index)", "miniz_oxide 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1915,6 +2193,53 @@ dependencies = [ "percent-encoding 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "frunk" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "frunk_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "frunk_derives 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "frunk_proc_macros 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "frunk_core" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "frunk_derives" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "frunk_proc_macro_helpers 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.36 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 2.0.68 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "frunk_proc_macro_helpers" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "frunk_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.86 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.36 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 2.0.68 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "frunk_proc_macros" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "frunk_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "frunk_proc_macro_helpers 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.36 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 2.0.68 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "fuchsia-zircon" version = "0.3.3" @@ -1929,6 +2254,11 @@ name = "fuchsia-zircon-sys" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "futf" version = "0.1.5" @@ -2779,6 +3109,16 @@ name = "ident_case" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "idna" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "matches 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-bidi 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-normalization 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "idna" version = "0.5.0" @@ -2928,6 +3268,17 @@ dependencies = [ "libc 0.2.155 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "ipconfig" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "socket2 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)", + "widestring 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "windows-sys 0.48.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winreg 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "ipnet" version = "2.9.0" @@ -2963,6 +3314,14 @@ dependencies = [ "either 1.13.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "either 1.13.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "itoa" version = "0.4.8" @@ -3166,6 +3525,77 @@ name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "lexical" +version = "6.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lexical-core 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "lexical-core" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lexical-parse-float 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", + "lexical-parse-integer 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)", + "lexical-util 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", + "lexical-write-float 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", + "lexical-write-integer 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "lexical-parse-float" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lexical-parse-integer 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)", + "lexical-util 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", + "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "lexical-parse-integer" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lexical-util 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", + "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "lexical-util" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "lexical-write-float" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lexical-util 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", + "lexical-write-integer 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", + "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "lexical-write-integer" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lexical-util 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", + "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "libc" version = "0.2.155" @@ -3241,6 +3671,11 @@ dependencies = [ "vcpkg 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "linux-raw-sys" version = "0.4.14" @@ -3287,6 +3722,22 @@ dependencies = [ "hashbrown 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "lru" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "hashbrown 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "lru-cache" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "linked-hash-map 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "lsp-types" version = "0.91.1" @@ -3412,6 +3863,20 @@ dependencies = [ "zip 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "digest 0.10.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "md5" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "memchr" version = "2.7.4" @@ -3586,6 +4051,7 @@ version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.2.155 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.22 (registry+https://github.com/rust-lang/crates.io-index)", "wasi 0.11.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)", "windows-sys 0.48.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3619,6 +4085,129 @@ dependencies = [ "tracing-subscriber 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "mongodb" +version = "2.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "async-trait 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)", + "base64 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "bson 2.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.38 (registry+https://github.com/rust-lang/crates.io-index)", + "derivative 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.99.18 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-executor 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-io 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-util 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", + "hex 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "hmac 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "md-5 0.10.6 (registry+https://github.com/rust-lang/crates.io-index)", + "pbkdf2 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version_runtime 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustls 0.21.12 (registry+https://github.com/rust-lang/crates.io-index)", + "rustls-pemfile 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.203 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_bytes 0.11.15 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_with 1.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sha-1 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sha2 0.10.8 (registry+https://github.com/rust-lang/crates.io-index)", + "socket2 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "stringprep 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "strsim 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 1.0.61 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 1.38.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-rustls 0.24.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-util 0.7.11 (registry+https://github.com/rust-lang/crates.io-index)", + "trust-dns-proto 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)", + "trust-dns-resolver 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)", + "typed-builder 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "uuid 1.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki-roots 0.25.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "mongodb-client" +version = "0.1.0" +source = "git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched#75852858f43e426c423b263f7e1473f49044f788" +dependencies = [ + "mongodb 2.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "once_cell 1.19.0 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 1.0.61 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "mongodb-query-connector" +version = "0.1.0" +source = "git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched#75852858f43e426c423b263f7e1473f49044f788" +dependencies = [ + "anyhow 1.0.86 (registry+https://github.com/rust-lang/crates.io-index)", + "async-trait 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)", + "bigdecimal 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bson 2.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.38 (registry+https://github.com/rust-lang/crates.io-index)", + "cuid 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", + "indexmap 1.9.3 (registry+https://github.com/rust-lang/crates.io-index)", + "itertools 0.10.5 (registry+https://github.com/rust-lang/crates.io-index)", + "mongodb 2.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "mongodb-client 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)", + "prisma-models 0.0.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)", + "prisma-value 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)", + "psl 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)", + "query-connector 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)", + "query-engine-metrics 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.10.5 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.203 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.119 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 1.0.61 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 1.38.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tracing 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", + "tracing-futures 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", + "user-facing-errors 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)", + "uuid 1.9.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "mongodb-schema-connector" +version = "0.1.0" +source = "git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched#75852858f43e426c423b263f7e1473f49044f788" +dependencies = [ + "convert_case 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "datamodel-renderer 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)", + "enumflags2 0.7.10 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", + "indoc 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "mongodb 2.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "mongodb-client 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)", + "mongodb-schema-describer 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)", + "once_cell 1.19.0 (registry+https://github.com/rust-lang/crates.io-index)", + "psl 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)", + "regex 1.10.5 (registry+https://github.com/rust-lang/crates.io-index)", + "schema-connector 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)", + "serde_json 1.0.119 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 1.38.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tracing 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", + "user-facing-errors 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)", +] + +[[package]] +name = "mongodb-schema-describer" +version = "0.1.0" +source = "git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched#75852858f43e426c423b263f7e1473f49044f788" +dependencies = [ + "futures 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", + "mongodb 2.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.203 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "msa" version = "2.0.0" @@ -3644,6 +4233,76 @@ name = "murmur2" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "mysql_async" +version = "0.31.3" +source = "git+https://github.com/prisma/mysql_async?branch=vendored-openssl#0d40d0d2c332fc97512bff81e82e62002f03c224" +dependencies = [ + "bytes 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)", + "flate2 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-sink 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-util 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lexical 6.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lru 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.8.11 (registry+https://github.com/rust-lang/crates.io-index)", + "mysql_common 0.29.2 (registry+https://github.com/rust-lang/crates.io-index)", + "native-tls 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "once_cell 1.19.0 (registry+https://github.com/rust-lang/crates.io-index)", + "pem 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project 1.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "priority-queue 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.10.5 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.203 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.119 (registry+https://github.com/rust-lang/crates.io-index)", + "socket2 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 1.0.61 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 1.38.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-native-tls 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-util 0.7.11 (registry+https://github.com/rust-lang/crates.io-index)", + "twox-hash 1.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "url 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "mysql_common" +version = "0.29.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bigdecimal 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bindgen 0.59.2 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "bitvec 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "cmake 0.1.50 (registry+https://github.com/rust-lang/crates.io-index)", + "crc32fast 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "flate2 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", + "frunk 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lexical 6.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num-bigint 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.19 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.10.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rust_decimal 1.35.0 (registry+https://github.com/rust-lang/crates.io-index)", + "saturating 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.203 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.119 (registry+https://github.com/rust-lang/crates.io-index)", + "sha1 0.10.6 (registry+https://github.com/rust-lang/crates.io-index)", + "sha2 0.10.8 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.13.2 (registry+https://github.com/rust-lang/crates.io-index)", + "subprocess 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 1.0.61 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.3.36 (registry+https://github.com/rust-lang/crates.io-index)", + "uuid 1.9.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "nanoid" version = "0.4.0" @@ -4124,6 +4783,19 @@ dependencies = [ "tokio-stream 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "opentls" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures-util 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.22 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl 0.10.64 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-probe 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.102 (registry+https://github.com/rust-lang/crates.io-index)", + "url 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "option-ext" version = "0.2.0" @@ -4274,6 +4946,14 @@ name = "pathdiff" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "digest 0.10.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "pbkdf2" version = "0.12.2" @@ -4283,6 +4963,19 @@ dependencies = [ "hmac 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "peeking_take_while" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "pem" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "percent-encoding" version = "2.3.1" @@ -4588,6 +5281,49 @@ name = "portable-atomic" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "postgres-native-tls" +version = "0.5.0" +source = "git+https://github.com/prisma/rust-postgres?rev=00d4815e58859261bdfca71c75be7dc657303f7d#00d4815e58859261bdfca71c75be7dc657303f7d" +dependencies = [ + "native-tls 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 1.38.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-native-tls 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-postgres 0.7.7 (git+https://github.com/prisma/rust-postgres?rev=00d4815e58859261bdfca71c75be7dc657303f7d)", +] + +[[package]] +name = "postgres-protocol" +version = "0.6.4" +source = "git+https://github.com/prisma/rust-postgres?rev=00d4815e58859261bdfca71c75be7dc657303f7d#00d4815e58859261bdfca71c75be7dc657303f7d" +dependencies = [ + "base64 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "fallible-iterator 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hmac 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", + "md-5 0.10.6 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.7.4 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", + "sha2 0.10.8 (registry+https://github.com/rust-lang/crates.io-index)", + "stringprep 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "postgres-types" +version = "0.2.4" +source = "git+https://github.com/prisma/rust-postgres?rev=00d4815e58859261bdfca71c75be7dc657303f7d#00d4815e58859261bdfca71c75be7dc657303f7d" +dependencies = [ + "bit-vec 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.38 (registry+https://github.com/rust-lang/crates.io-index)", + "fallible-iterator 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "postgres-protocol 0.6.4 (git+https://github.com/prisma/rust-postgres?rev=00d4815e58859261bdfca71c75be7dc657303f7d)", + "serde 1.0.203 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.119 (registry+https://github.com/rust-lang/crates.io-index)", + "uuid 1.9.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -4603,17 +5339,30 @@ name = "precomputed-hash" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "pretty-hex" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "priority-queue" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "autocfg 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "indexmap 1.9.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "prisma" version = "2.0.0" dependencies = [ - "prisma-client-rust-cli 0.6.8 (git+https://github.com/Brendonovich/prisma-client-rust?rev=4f9ef9d)", + "prisma-client-rust-cli 0.6.8", ] [[package]] name = "prisma-client-rust" version = "0.6.8" -source = "git+https://github.com/Brendonovich/prisma-client-rust?rev=4f9ef9d#4f9ef9d38ca732162accff72b2eb684d2f120bab" dependencies = [ "base64 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", "bigdecimal 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4622,9 +5371,10 @@ dependencies = [ "diagnostics 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)", "dotenvy 0.15.7 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", + "include_dir 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", "indexmap 1.9.3 (registry+https://github.com/rust-lang/crates.io-index)", "paste 1.0.15 (registry+https://github.com/rust-lang/crates.io-index)", - "prisma-client-rust-generator-macros 0.6.8 (git+https://github.com/Brendonovich/prisma-client-rust?rev=4f9ef9d)", + "prisma-client-rust-generator-macros 0.6.8", "prisma-models 0.0.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)", "psl 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)", "query-core 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)", @@ -4634,7 +5384,10 @@ dependencies = [ "serde-value 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.119 (registry+https://github.com/rust-lang/crates.io-index)", "specta 2.0.0-rc.13 (registry+https://github.com/rust-lang/crates.io-index)", + "tempfile 3.10.1 (registry+https://github.com/rust-lang/crates.io-index)", "thiserror 1.0.61 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 1.38.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tracing 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", "user-facing-errors 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)", "uuid 1.9.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4642,12 +5395,11 @@ dependencies = [ [[package]] name = "prisma-client-rust-cli" version = "0.6.8" -source = "git+https://github.com/Brendonovich/prisma-client-rust?rev=4f9ef9d#4f9ef9d38ca732162accff72b2eb684d2f120bab" dependencies = [ "directories 4.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "flate2 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", - "prisma-client-rust-generator 0.6.8 (git+https://github.com/Brendonovich/prisma-client-rust?rev=4f9ef9d)", + "prisma-client-rust-generator 0.6.8", "proc-macro2 1.0.86 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.36 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.10.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4662,13 +5414,13 @@ dependencies = [ [[package]] name = "prisma-client-rust-generator" version = "0.6.8" -source = "git+https://github.com/Brendonovich/prisma-client-rust?rev=4f9ef9d#4f9ef9d38ca732162accff72b2eb684d2f120bab" dependencies = [ "directories 4.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "flate2 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", - "prisma-client-rust-generator-shared 0.1.0 (git+https://github.com/Brendonovich/prisma-client-rust?rev=4f9ef9d)", - "prisma-client-rust-sdk 0.6.8 (git+https://github.com/Brendonovich/prisma-client-rust?rev=4f9ef9d)", + "itertools 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", + "prisma-client-rust-generator-shared 0.1.0", + "prisma-client-rust-sdk 0.6.8", "proc-macro2 1.0.86 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.36 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.10.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4683,10 +5435,9 @@ dependencies = [ [[package]] name = "prisma-client-rust-generator-macros" version = "0.6.8" -source = "git+https://github.com/Brendonovich/prisma-client-rust?rev=4f9ef9d#4f9ef9d38ca732162accff72b2eb684d2f120bab" dependencies = [ "convert_case 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "prisma-client-rust-generator-shared 0.1.0 (git+https://github.com/Brendonovich/prisma-client-rust?rev=4f9ef9d)", + "prisma-client-rust-generator-shared 0.1.0", "proc-macro2 1.0.86 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.36 (registry+https://github.com/rust-lang/crates.io-index)", "syn 1.0.109 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4695,10 +5446,9 @@ dependencies = [ [[package]] name = "prisma-client-rust-generator-shared" version = "0.1.0" -source = "git+https://github.com/Brendonovich/prisma-client-rust?rev=4f9ef9d#4f9ef9d38ca732162accff72b2eb684d2f120bab" dependencies = [ "convert_case 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "prisma-client-rust-sdk 0.6.8 (git+https://github.com/Brendonovich/prisma-client-rust?rev=4f9ef9d)", + "prisma-client-rust-sdk 0.6.8", "proc-macro2 1.0.86 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.36 (registry+https://github.com/rust-lang/crates.io-index)", "syn 1.0.109 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4707,7 +5457,6 @@ dependencies = [ [[package]] name = "prisma-client-rust-sdk" version = "0.6.8" -source = "git+https://github.com/Brendonovich/prisma-client-rust?rev=4f9ef9d#4f9ef9d38ca732162accff72b2eb684d2f120bab" dependencies = [ "convert_case 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "dmmf 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)", @@ -4838,6 +5587,24 @@ dependencies = [ "url 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ptr_meta_derive 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.86 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.36 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.109 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "pulldown-cmark" version = "0.9.6" @@ -4856,19 +5623,31 @@ dependencies = [ "async-trait 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)", "base64 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", "bigdecimal 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bit-vec 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "chrono 0.4.38 (registry+https://github.com/rust-lang/crates.io-index)", "connection-string 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "either 1.13.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "metrics 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)", "mobc 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)", + "mysql_async 0.31.3 (git+https://github.com/prisma/mysql_async?branch=vendored-openssl)", + "native-tls 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.16.0 (registry+https://github.com/rust-lang/crates.io-index)", "percent-encoding 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "postgres-native-tls 0.5.0 (git+https://github.com/prisma/rust-postgres?rev=00d4815e58859261bdfca71c75be7dc657303f7d)", + "postgres-types 0.2.4 (git+https://github.com/prisma/rust-postgres?rev=00d4815e58859261bdfca71c75be7dc657303f7d)", "rusqlite 0.29.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.119 (registry+https://github.com/rust-lang/crates.io-index)", "sqlformat 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "thiserror 1.0.61 (registry+https://github.com/rust-lang/crates.io-index)", + "tiberius 0.11.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 1.38.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-postgres 0.7.7 (git+https://github.com/prisma/rust-postgres?rev=00d4815e58859261bdfca71c75be7dc657303f7d)", + "tokio-util 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", "tracing 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", "tracing-core 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", "url 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4992,6 +5771,11 @@ dependencies = [ "tracing-subscriber 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "quick-xml" version = "0.31.0" @@ -5061,6 +5845,11 @@ dependencies = [ "proc-macro2 1.0.86 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "radix_trie" version = "0.2.1" @@ -5247,6 +6036,14 @@ name = "regex-syntax" version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytecheck 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "request-handlers" version = "0.1.0" @@ -5259,6 +6056,7 @@ dependencies = [ "graphql-parser 0.3.0 (git+https://github.com/prisma/graphql-parser)", "indexmap 1.9.3 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.10.5 (registry+https://github.com/rust-lang/crates.io-index)", + "mongodb-query-connector 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)", "once_cell 1.19.0 (registry+https://github.com/rust-lang/crates.io-index)", "prisma-models 0.0.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)", "psl 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)", @@ -5392,6 +6190,15 @@ dependencies = [ "winreg 0.52.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "resolv-conf" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "hostname 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rfd" version = "0.10.0" @@ -5429,6 +6236,33 @@ dependencies = [ "windows-sys 0.52.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rkyv" +version = "0.7.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitvec 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytecheck 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hashbrown 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", + "ptr_meta 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "rend 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rkyv_derive 0.7.44 (registry+https://github.com/rust-lang/crates.io-index)", + "seahash 4.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tinyvec 1.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "uuid 1.9.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.86 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.36 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.109 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rpc-rs" version = "2.0.0" @@ -5458,6 +6292,21 @@ dependencies = [ "smallvec 1.13.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rust_decimal" +version = "1.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "arrayvec 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", + "borsh 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.19 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rkyv 0.7.44 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.203 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.119 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rustc-demangle" version = "0.1.24" @@ -5468,6 +6317,14 @@ name = "rustc-hash" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "rustc_version" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rustc_version" version = "0.4.0" @@ -5476,6 +6333,15 @@ dependencies = [ "semver 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rustc_version_runtime" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rustix" version = "0.38.34" @@ -5571,6 +6437,11 @@ dependencies = [ "winapi-util 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "saturating" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "schannel" version = "0.1.23" @@ -5627,6 +6498,7 @@ dependencies = [ "enumflags2 0.7.10 (registry+https://github.com/rust-lang/crates.io-index)", "json-rpc-api-build 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)", "jsonrpc-core 17.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "mongodb-schema-connector 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)", "psl 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)", "schema-connector 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)", "serde 1.0.203 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5659,6 +6531,11 @@ dependencies = [ "untrusted 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "security-framework" version = "2.11.0" @@ -5699,6 +6576,14 @@ dependencies = [ "thin-slice 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "semver" version = "1.0.23" @@ -5707,6 +6592,11 @@ dependencies = [ "serde 1.0.203 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "serde" version = "1.0.203" @@ -5724,6 +6614,14 @@ dependencies = [ "serde 1.0.203 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "serde_bytes" +version = "0.11.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde 1.0.203 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "serde_derive" version = "1.0.203" @@ -5803,6 +6701,15 @@ dependencies = [ "serde 1.0.203 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "serde_with" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde 1.0.203 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_with_macros 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "serde_with" version = "3.8.2" @@ -5820,6 +6727,17 @@ dependencies = [ "time 0.3.36 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "serde_with_macros" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "darling 0.13.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.86 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.36 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.109 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "serde_with_macros" version = "3.8.2" @@ -5952,6 +6870,11 @@ dependencies = [ "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -5965,6 +6888,11 @@ name = "simd-adler32" version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "siphasher" version = "0.3.11" @@ -6012,6 +6940,15 @@ dependencies = [ "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "socket2" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.155 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "socket2" version = "0.5.7" @@ -6228,6 +7165,21 @@ dependencies = [ "quote 1.0.36 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unicode-bidi 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-normalization 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-properties 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "strsim" version = "0.11.1" @@ -6250,6 +7202,15 @@ dependencies = [ "syn 2.0.68 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "subprocess" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.155 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "subtle" version = "2.6.1" @@ -6275,6 +7236,17 @@ dependencies = [ "unicode-ident 1.0.12 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "syn_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro-error 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.86 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.36 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 2.0.68 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "sync_wrapper" version = "0.1.2" @@ -6365,6 +7337,11 @@ dependencies = [ "version-compare 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "take_mut" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "tao" version = "0.16.9" @@ -6421,6 +7398,11 @@ dependencies = [ "syn 1.0.109 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "tar" version = "0.4.41" @@ -6699,6 +7681,37 @@ dependencies = [ "once_cell 1.19.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "tiberius" +version = "0.11.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "async-native-tls 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "async-trait 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)", + "asynchronous-codec 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "bigdecimal 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.38 (registry+https://github.com/rust-lang/crates.io-index)", + "connection-string 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", + "enumflags2 0.7.10 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-sink 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-util 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.19 (registry+https://github.com/rust-lang/crates.io-index)", + "once_cell 1.19.0 (registry+https://github.com/rust-lang/crates.io-index)", + "opentls 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project-lite 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", + "pretty-hex 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 1.0.61 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 1.38.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-util 0.7.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tracing 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", + "uuid 1.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "winauth 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "tiff" version = "0.9.1" @@ -6815,6 +7828,38 @@ dependencies = [ "tokio 1.38.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "tokio-postgres" +version = "0.7.7" +source = "git+https://github.com/prisma/rust-postgres?rev=00d4815e58859261bdfca71c75be7dc657303f7d#00d4815e58859261bdfca71c75be7dc657303f7d" +dependencies = [ + "async-trait 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "fallible-iterator 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-channel 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-util 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.22 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "phf 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project-lite 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", + "postgres-protocol 0.6.4 (git+https://github.com/prisma/rust-postgres?rev=00d4815e58859261bdfca71c75be7dc657303f7d)", + "postgres-types 0.2.4 (git+https://github.com/prisma/rust-postgres?rev=00d4815e58859261bdfca71c75be7dc657303f7d)", + "socket2 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 1.38.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-util 0.7.11 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rustls 0.21.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 1.38.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "tokio-rustls" version = "0.26.0" @@ -6881,6 +7926,20 @@ dependencies = [ "tokio 0.2.25 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "tokio-util" +version = "0.6.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-io 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-sink 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.22 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project-lite 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 1.38.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "tokio-util" version = "0.7.11" @@ -7129,6 +8188,49 @@ dependencies = [ "petgraph 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "trust-dns-proto" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "async-trait 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "data-encoding 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "enum-as-inner 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-channel 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-io 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-util 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", + "idna 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "ipnet 2.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.22 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.13.2 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 1.0.61 (registry+https://github.com/rust-lang/crates.io-index)", + "tinyvec 1.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 1.38.0 (registry+https://github.com/rust-lang/crates.io-index)", + "url 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "trust-dns-resolver" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-util 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", + "ipconfig 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.22 (registry+https://github.com/rust-lang/crates.io-index)", + "lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", + "resolv-conf 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.13.2 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 1.0.61 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 1.38.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trust-dns-proto 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "try-lock" version = "0.2.5" @@ -7202,6 +8304,26 @@ dependencies = [ "utf-8 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "twox-hash" +version = "1.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", + "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "typed-builder" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.86 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.36 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.109 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "typenum" version = "1.17.0" @@ -7248,6 +8370,11 @@ dependencies = [ "tinyvec 1.6.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "unicode-properties" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "unicode-segmentation" version = "1.11.0" @@ -7626,6 +8753,11 @@ dependencies = [ "system-deps 6.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "webpki-roots" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "webpki-roots" version = "0.26.3" @@ -7723,6 +8855,11 @@ dependencies = [ "sysinfo 0.30.12 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "widestring" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "winapi" version = "0.2.8" @@ -7760,6 +8897,18 @@ name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "winauth" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "md5 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "windows" version = "0.37.0" @@ -8308,6 +9457,14 @@ dependencies = [ "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "tap 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "x11" version = "2.21.0" @@ -8595,6 +9752,7 @@ dependencies = [ "checksum anyhow 1.0.86 (registry+https://github.com/rust-lang/crates.io-index)" = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" "checksum arbitrary 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" "checksum arboard 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9fb4009533e8ff8f1450a5bcbc30f4242a1d34442221f72314bea1f5dc9c7f89" +"checksum arrayvec 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" "checksum ascii 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" "checksum ascii 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16" "checksum async-broadcast 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20cd0e2e25ea8e5f7e9df04578dc6cf5c83577fd09b1a46aaf5c85e1c33f2a7e" @@ -8604,11 +9762,13 @@ dependencies = [ "checksum async-fs 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" "checksum async-io 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0d6baa8f0178795da0e71bc42c9e5d13261aac7ee549853162e66a241ba17964" "checksum async-lock 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +"checksum async-native-tls 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d57d4cec3c647232e1094dc013546c0b33ce785d8aeb251e1f20dfaf8a9a13fe" "checksum async-process 2.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "f7eda79bbd84e29c2b308d1dc099d7de8dcc7035e48f4bf5dc4a531a44ff5e2a" "checksum async-recursion 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" "checksum async-signal 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "794f185324c2f00e771cd9f1ae8b5ac68be2ca7abb129a87afd6e86d228bc54d" "checksum async-task 4.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" "checksum async-trait 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)" = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" +"checksum asynchronous-codec 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4057f2c32adbb2fc158e22fb38433c8e9bbf76b75a4732c7c0cbaf695fb65568" "checksum atk 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2c3d816ce6f0e2909a96830d6911c2aff044370b1ef92d7f267b43bae5addedd" "checksum atk-sys 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)" = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6" "checksum atomic-shim 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "67cd4b51d303cf3501c301e8125df442128d3c6d7c69f71b27833d253de47e77" @@ -8626,20 +9786,27 @@ dependencies = [ "checksum base64 0.22.1 (registry+https://github.com/rust-lang/crates.io-index)" = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" "checksum bigdecimal 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a6773ddc0eafc0e509fb60e48dff7f450f8e674a0686ae8605e8d9901bd5eefa" "checksum bigdecimal 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "51d712318a27c7150326677b321a5fa91b55f6d9034ffd67f20319e147d40cee" +"checksum bindgen 0.59.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2bd2a9a458e8f4304c52c43ebb0cfbd520289f8379a52e329a38afda99bf8eb8" "checksum bit-set 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" "checksum bit-vec 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" "checksum bitflags 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" "checksum bitflags 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +"checksum bitvec 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" "checksum block 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" "checksum block-buffer 0.10.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" "checksum block-buffer 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" "checksum block2 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" "checksum blocking 1.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +"checksum borsh 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a6362ed55def622cddc70a4746a68554d7b687713770de539e59a739b249f8ed" +"checksum borsh-derive 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c3ef8005764f53cd4dca619f5bf64cafd4664dada50ece25e4d81de54c80cc0b" "checksum brotli 3.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d640d25bc63c50fb1f0b545ffd80207d2e10a4c965530809b40ba3386825c391" "checksum brotli-decompressor 2.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f" +"checksum bson 2.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d8a88e82b9106923b5c4d6edfca9e7db958d4e98a478ec115022e81b9b38e2c8" "checksum bstr 1.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05efc5cfd9110c8416e471df0e96702d58690178e206e61b7173706673c93706" "checksum builtin-psl-connectors 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)" = "" "checksum bumpalo 3.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +"checksum bytecheck 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +"checksum bytecheck_derive 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" "checksum bytecount 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce" "checksum bytemuck 1.16.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" "checksum byteorder 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" @@ -8655,6 +9822,7 @@ dependencies = [ "checksum cargo_toml 0.15.3 (registry+https://github.com/rust-lang/crates.io-index)" = "599aa35200ffff8f04c1925aa1acc92fa2e08874379ef42e210a80e527e60838" "checksum cc 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)" = "2755ff20a1d93490d26ba33a6f092a38a508398a5320df5d4b3014fcccce9410" "checksum cesu8 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" +"checksum cexpr 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" "checksum cfb 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" "checksum cfg-expr 0.15.8 (registry+https://github.com/rust-lang/crates.io-index)" = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" "checksum cfg-expr 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3431df59f28accaf4cb4eed4a9acc66bea3f3c3753aa6cdc2f024174ef232af7" @@ -8667,12 +9835,14 @@ dependencies = [ "checksum chrono 0.4.38 (registry+https://github.com/rust-lang/crates.io-index)" = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" "checksum chunked_transfer 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6e4de3bc4ea267985becf712dc6d9eed8b04c953b3fcfb339ebc87acd9804901" "checksum cipher 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +"checksum clang-sys 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" "checksum clap 4.5.8 (registry+https://github.com/rust-lang/crates.io-index)" = "84b3edb18336f4df585bc9aa31dd99c036dfa5dc5e9a2939a722a188f3a8970d" "checksum clap-verbosity-flag 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb9b20c0dd58e4c2e991c8d203bbeb76c11304d1011659686b5b644bc29aa478" "checksum clap_builder 4.5.8 (registry+https://github.com/rust-lang/crates.io-index)" = "c1c09dd5ada6c6c78075d6fd0da3f90d8080651e2d6cc8eb2f1aaa4034ced708" "checksum clap_derive 4.5.8 (registry+https://github.com/rust-lang/crates.io-index)" = "2bac35c6dafb060fd4d275d9a4ffae97917c13a6327903a8be2153cd964f7085" "checksum clap_lex 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" "checksum clipboard-win 5.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "79f4473f5144e20d9aceaf2972478f06ddf687831eafeeb434fbaf0acc4144ad" +"checksum cmake 0.1.50 (registry+https://github.com/rust-lang/crates.io-index)" = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" "checksum cocoa 0.24.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" "checksum cocoa-foundation 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" "checksum color_quant 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" @@ -8697,9 +9867,11 @@ dependencies = [ "checksum crc 3.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" "checksum crc-catalog 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" "checksum crc32fast 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +"checksum crossbeam 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" "checksum crossbeam-channel 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)" = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" "checksum crossbeam-deque 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)" = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" "checksum crossbeam-epoch 0.9.18 (registry+https://github.com/rust-lang/crates.io-index)" = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +"checksum crossbeam-queue 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)" = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" "checksum crossbeam-utils 0.8.20 (registry+https://github.com/rust-lang/crates.io-index)" = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" "checksum crypto-common 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" "checksum cssparser 0.27.2 (registry+https://github.com/rust-lang/crates.io-index)" = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" @@ -8709,13 +9881,17 @@ dependencies = [ "checksum cuid 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "51294db11d38eb763c92936c5c88425d0090e27dce21dd15748134af9e53e739" "checksum cuid-util 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5ea2bfe0336ff1b7ca74819b2df8dfae9afea358aff6b1688baa5c181d8c3713" "checksum cuid2 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "47d99cacd52fd67db7490ad051c8c1973fb75520174d69aabbae08c534c9d0e8" +"checksum darling 0.13.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" "checksum darling 0.20.9 (registry+https://github.com/rust-lang/crates.io-index)" = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" +"checksum darling_core 0.13.4 (registry+https://github.com/rust-lang/crates.io-index)" = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" "checksum darling_core 0.20.9 (registry+https://github.com/rust-lang/crates.io-index)" = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" +"checksum darling_macro 0.13.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" "checksum darling_macro 0.20.9 (registry+https://github.com/rust-lang/crates.io-index)" = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" "checksum data-encoding 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" "checksum datamodel-renderer 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)" = "" "checksum deflate64 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "83ace6c86376be0b6cdcf3fb41882e81d94b31587573d1cfa9d01cd06bba210d" "checksum deranged 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)" = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +"checksum derivative 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" "checksum derive-new 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d150dea618e920167e5973d70ae6ece4385b7164e0d799fe7c122dd0a5d912ad" "checksum derive_arbitrary 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" "checksum derive_builder 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0350b5cb0331628a5916d6c5c0b72e97393b8b6b03b47a9284f4e7f5a405ffd7" @@ -8745,9 +9921,17 @@ dependencies = [ "checksum either 1.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" "checksum embed-resource 2.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c6985554d0688b687c5cb73898a34fbe3ad6c24c58c238a4d91d5e840670ee9d" "checksum embed_plist 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" +"checksum encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec" +"checksum encoding-index-japanese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91" +"checksum encoding-index-korean 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81" +"checksum encoding-index-simpchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7" +"checksum encoding-index-singlebyte 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a" +"checksum encoding-index-tradchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18" +"checksum encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" "checksum encoding_rs 0.8.34 (registry+https://github.com/rust-lang/crates.io-index)" = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" "checksum endi 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" "checksum endian-type 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" +"checksum enum-as-inner 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "21cdad81446a7f7dc43f6a77409efeb9733d2fa65553efef6018ef257c959b73" "checksum enumflags2 0.7.10 (registry+https://github.com/rust-lang/crates.io-index)" = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" "checksum enumflags2_derive 0.7.10 (registry+https://github.com/rust-lang/crates.io-index)" = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" "checksum envcrypt 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e6e5cd13693829e7659d44b8ed8e00d57fe069139b7e403e0b221bd60004857e" @@ -8778,8 +9962,14 @@ dependencies = [ "checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" "checksum foreign-types-shared 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" "checksum form_urlencoded 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +"checksum frunk 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "11a351b59e12f97b4176ee78497dff72e4276fb1ceb13e19056aca7fa0206287" +"checksum frunk_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "af2469fab0bd07e64ccf0ad57a1438f63160c69b2e57f04a439653d68eb558d6" +"checksum frunk_derives 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b0fa992f1656e1707946bbba340ad244f0814009ef8c0118eb7b658395f19a2e" +"checksum frunk_proc_macro_helpers 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "35b54add839292b743aeda6ebedbd8b11e93404f902c56223e51b9ec18a13d2c" +"checksum frunk_proc_macros 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "71b85a1d4a9a6b300b41c05e8e13ef2feca03e0334127f29eca9506a7fe13a93" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" +"checksum funty 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" "checksum futf 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" "checksum futures 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)" = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" "checksum futures-channel 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)" = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" @@ -8856,6 +10046,7 @@ dependencies = [ "checksum iana-time-zone-haiku 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" "checksum ico 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e3804960be0bb5e4edb1e1ad67afd321a9ecfd875c3e65c099468fd2717d7cae" "checksum ident_case 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +"checksum idna 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" "checksum idna 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" "checksum ignore 0.4.22 (registry+https://github.com/rust-lang/crates.io-index)" = "b46810df39e66e925525d6e38ce1e7f6e1d208f72dc39757880fcb66e2c58af1" "checksum image 0.24.9 (registry+https://github.com/rust-lang/crates.io-index)" = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" @@ -8869,11 +10060,13 @@ dependencies = [ "checksum inout 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" "checksum instant 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" "checksum iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" +"checksum ipconfig 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" "checksum ipnet 2.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" "checksum is-docker 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" "checksum is-wsl 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" "checksum is_terminal_polyfill 1.70.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" "checksum itertools 0.10.5 (registry+https://github.com/rust-lang/crates.io-index)" = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +"checksum itertools 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" "checksum itoa 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" "checksum itoa 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)" = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" "checksum javascriptcore-rs 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bf053e7843f2812ff03ef5afe34bb9c06ffee120385caad4f6b9967fcd37d41c" @@ -8894,6 +10087,14 @@ dependencies = [ "checksum lazy-regex 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5d12be4595afdf58bd19e4a9f4e24187da2a66700786ff660a418e9059937a4c" "checksum lazy-regex-proc_macros 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44bcd58e6c97a7fcbaffcdc95728b393b8d98933bfadad49ed4097845b57ef0b" "checksum lazy_static 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +"checksum lazycell 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" +"checksum lexical 6.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c7aefb36fd43fef7003334742cbf77b243fcd36418a1d1bdd480d613a67968f6" +"checksum lexical-core 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)" = "2cde5de06e8d4c2faabc400238f9ae1c74d5412d03a7bd067645ccbc47070e46" +"checksum lexical-parse-float 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)" = "683b3a5ebd0130b8fb52ba0bdc718cc56815b6a097e28ae5a6997d0ad17dc05f" +"checksum lexical-parse-integer 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)" = "6d0994485ed0c312f6d965766754ea177d07f9c00c9b82a5ee62ed5b47945ee9" +"checksum lexical-util 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)" = "5255b9ff16ff898710eb9eb63cb39248ea8a5bb036bea8085b1a767ff6c4e3fc" +"checksum lexical-write-float 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)" = "accabaa1c4581f05a3923d1b4cfd124c329352288b7b9da09e766b0668116862" +"checksum lexical-write-integer 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e1b6f3d1f4422866b68192d62f77bc5c700bee84f3069f2469d7bc8c77852446" "checksum libc 0.2.155 (registry+https://github.com/rust-lang/crates.io-index)" = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" "checksum libgit2-sys 0.16.2+1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ee4126d8b4ee5c9d9ea891dd875cfdc1e9d0950437179104b183d7d8a74d24e8" "checksum libloading 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e310b3a6b5907f99202fcdb4960ff45b93735d7c7d96b760fcff8db2dc0e103d" @@ -8902,12 +10103,15 @@ dependencies = [ "checksum libsqlite3-sys 0.26.0 (registry+https://github.com/rust-lang/crates.io-index)" = "afc22eff61b133b115c6e8c74e818c628d6d5e7a502afea6f64dee076dd94326" "checksum libssh2-sys 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2dc8a030b787e2119a731f1951d6a773e2280c660f8ec4b0f5e1505a386e71ee" "checksum libz-sys 1.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "c15da26e5af7e25c90b37a2d75cdbf940cf4a55316de9d84c679c9b8bfabf82e" +"checksum linked-hash-map 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" "checksum linux-raw-sys 0.4.14 (registry+https://github.com/rust-lang/crates.io-index)" = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" "checksum lock_api 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" "checksum lockfree-object-pool 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e" "checksum log 0.4.22 (registry+https://github.com/rust-lang/crates.io-index)" = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" "checksum loom 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" "checksum lru 0.7.8 (registry+https://github.com/rust-lang/crates.io-index)" = "e999beba7b6e8345721bd280141ed958096a2e4abdf74f67ff4ce49b4b54e47a" +"checksum lru 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b6e8aaa3f231bb4bd57b84b2d5dc3ae7f350265df8aa96492e0bc394a1571909" +"checksum lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" "checksum lsp-types 0.91.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2368312c59425dd133cb9a327afee65be0a633a8ce471d248e2202a48f8f68ae" "checksum lzma-rs 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "297e814c836ae64db86b36cf2a557ba54368d03f6afcd7d947c266692f71115e" "checksum lzma-sys 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)" = "5fda04ab3764e6cde78b9974eec4f779acaba7c4e84b36eca3cf77c581b85d27" @@ -8920,6 +10124,8 @@ dependencies = [ "checksum matchers 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" "checksum matches 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" "checksum matchit 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" +"checksum md-5 0.10.6 (registry+https://github.com/rust-lang/crates.io-index)" = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +"checksum md5 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e6bcd6433cff03a4bfc3d9834d504467db1f1cf6d0ea765d37d330249ed629d" "checksum memchr 2.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" "checksum memoffset 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" "checksum memoffset 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" @@ -8938,7 +10144,14 @@ dependencies = [ "checksum mio 0.8.11 (registry+https://github.com/rust-lang/crates.io-index)" = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" "checksum miow 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d" "checksum mobc 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d8d3681f0b299413df040f53c6950de82e48a8e1a9f79d442ed1ad3694d660b9" +"checksum mongodb 2.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ef206acb1b72389b49bc9985efe7eb1f8a9bb18e5680d262fac26c07f44025f1" +"checksum mongodb-client 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)" = "" +"checksum mongodb-query-connector 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)" = "" +"checksum mongodb-schema-connector 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)" = "" +"checksum mongodb-schema-describer 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)" = "" "checksum murmur2 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fb585ade2549a017db2e35978b77c319214fa4b37cede841e27954dd6e8f3ca8" +"checksum mysql_async 0.31.3 (git+https://github.com/prisma/mysql_async?branch=vendored-openssl)" = "" +"checksum mysql_common 0.29.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9006c95034ccf7b903d955f210469119f6c3477fc9c9e7a7845ce38a3e665c2a" "checksum nanoid 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ffa00dec017b5b1a8b7cf5e2c008bfda1aa7e0697ac1508b491fdf2622fb4d8" "checksum native-tls 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)" = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" "checksum ndk 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4" @@ -8990,6 +10203,7 @@ dependencies = [ "checksum openssl-src 300.3.1+3.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7259953d42a81bf137fbbd73bd30a8e1914d6dce43c2b90ed575783a22608b91" "checksum openssl-sys 0.9.102 (registry+https://github.com/rust-lang/crates.io-index)" = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" "checksum opentelemetry 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6105e89802af13fdf48c49d7646d3b533a70e536d818aae7e78ba0433d01acb8" +"checksum opentls 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6f561874f8d6ecfb674fc08863414040c93cc90c0b6963fe679895fab8b65560" "checksum option-ext 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" "checksum ordered-float 2.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" "checksum ordered-stream 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" @@ -9007,7 +10221,10 @@ dependencies = [ "checksum parser-database 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)" = "" "checksum paste 1.0.15 (registry+https://github.com/rust-lang/crates.io-index)" = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" "checksum pathdiff 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" +"checksum pbkdf2 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" "checksum pbkdf2 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +"checksum peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" +"checksum pem 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" "checksum percent-encoding 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" "checksum pest 2.7.10 (registry+https://github.com/rust-lang/crates.io-index)" = "560131c633294438da9f7c4b08189194b20946c8274c6b9e38881a7874dc8ee8" "checksum pest_derive 2.7.10 (registry+https://github.com/rust-lang/crates.io-index)" = "26293c9193fbca7b1a3bf9b79dc1e388e927e6cacaa78b4a3ab705a1d3d41459" @@ -9040,15 +10257,14 @@ dependencies = [ "checksum polling 3.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a3ed00ed3fbf728b5816498ecd316d1716eecaced9c0c8d2c5a6740ca214985b" "checksum poly1305 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" "checksum portable-atomic 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" +"checksum postgres-native-tls 0.5.0 (git+https://github.com/prisma/rust-postgres?rev=00d4815e58859261bdfca71c75be7dc657303f7d)" = "" +"checksum postgres-protocol 0.6.4 (git+https://github.com/prisma/rust-postgres?rev=00d4815e58859261bdfca71c75be7dc657303f7d)" = "" +"checksum postgres-types 0.2.4 (git+https://github.com/prisma/rust-postgres?rev=00d4815e58859261bdfca71c75be7dc657303f7d)" = "" "checksum powerfmt 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" "checksum ppv-lite86 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)" = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" "checksum precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" -"checksum prisma-client-rust 0.6.8 (git+https://github.com/Brendonovich/prisma-client-rust?rev=4f9ef9d)" = "" -"checksum prisma-client-rust-cli 0.6.8 (git+https://github.com/Brendonovich/prisma-client-rust?rev=4f9ef9d)" = "" -"checksum prisma-client-rust-generator 0.6.8 (git+https://github.com/Brendonovich/prisma-client-rust?rev=4f9ef9d)" = "" -"checksum prisma-client-rust-generator-macros 0.6.8 (git+https://github.com/Brendonovich/prisma-client-rust?rev=4f9ef9d)" = "" -"checksum prisma-client-rust-generator-shared 0.1.0 (git+https://github.com/Brendonovich/prisma-client-rust?rev=4f9ef9d)" = "" -"checksum prisma-client-rust-sdk 0.6.8 (git+https://github.com/Brendonovich/prisma-client-rust?rev=4f9ef9d)" = "" +"checksum pretty-hex 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c6fa0831dd7cc608c38a5e323422a0077678fa5744aa2be4ad91c4ece8eec8d5" +"checksum priority-queue 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a0bda9164fe05bc9225752d54aae413343c36f684380005398a6a8fde95fe785" "checksum prisma-models 0.0.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)" = "" "checksum prisma-value 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)" = "" "checksum proc-macro-crate 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" @@ -9059,18 +10275,22 @@ dependencies = [ "checksum proc-macro2 1.0.86 (registry+https://github.com/rust-lang/crates.io-index)" = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" "checksum psl 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)" = "" "checksum psl-core 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)" = "" +"checksum ptr_meta 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +"checksum ptr_meta_derive 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" "checksum pulldown-cmark 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)" = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" "checksum quaint 0.2.0-alpha.13 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)" = "" "checksum quanta 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "20afe714292d5e879d8b12740aa223c6a88f118af41870e8b6196e39a02238a8" "checksum query-connector 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)" = "" "checksum query-core 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)" = "" "checksum query-engine-metrics 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)" = "" +"checksum quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" "checksum quick-xml 0.31.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33" "checksum quick-xml 0.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d3a6e5838b60e0e8fa7a43f22ade549a37d61f8bdbe636d0d7816191de969c2" "checksum quinn 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e4ceeeeabace7857413798eb1ffa1e9c905a9946a57d81fb69b4b71c4d8eb3ad" "checksum quinn-proto 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddf517c03a109db8100448a4be38d498df8a210a99fe0e1b9eaf39e78c640efe" "checksum quinn-udp 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9096629c45860fc7fb143e125eb826b5e721e10be3263160c7d60ca832cf8c46" "checksum quote 1.0.36 (registry+https://github.com/rust-lang/crates.io-index)" = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +"checksum radium 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" "checksum radix_trie 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c069c179fcdc6a2fe24d8d18305cf085fdbd4f922c041943e203685d6a1c58fd" "checksum rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" "checksum rand 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)" = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" @@ -9093,16 +10313,23 @@ dependencies = [ "checksum regex-automata 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" "checksum regex-syntax 0.6.29 (registry+https://github.com/rust-lang/crates.io-index)" = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" "checksum regex-syntax 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +"checksum rend 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" "checksum request-handlers 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)" = "" "checksum reqwest 0.10.10 (registry+https://github.com/rust-lang/crates.io-index)" = "0718f81a8e14c4dbb3b34cf23dc6aaf9ab8a0dfec160c534b3dbca1aaa21f47c" "checksum reqwest 0.11.27 (registry+https://github.com/rust-lang/crates.io-index)" = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" "checksum reqwest 0.12.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" +"checksum resolv-conf 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" "checksum rfd 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0149778bd99b6959285b0933288206090c50e2327f47a9c463bfdbf45c8823ea" "checksum ring 0.17.8 (registry+https://github.com/rust-lang/crates.io-index)" = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +"checksum rkyv 0.7.44 (registry+https://github.com/rust-lang/crates.io-index)" = "5cba464629b3394fc4dbc6f940ff8f5b4ff5c7aef40f29166fd4ad12acbc99c0" +"checksum rkyv_derive 0.7.44 (registry+https://github.com/rust-lang/crates.io-index)" = "a7dddfff8de25e6f62b9d64e6e432bf1c6736c57d20323e15ee10435fbda7c65" "checksum rusqlite 0.29.0 (registry+https://github.com/rust-lang/crates.io-index)" = "549b9d036d571d42e6e85d1c1425e2ac83491075078ca9a15be021c56b1641f2" +"checksum rust_decimal 1.35.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1790d1c4c0ca81211399e0e0af16333276f375209e71a37b67698a373db5b47a" "checksum rustc-demangle 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)" = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" "checksum rustc-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" "checksum rustc_version 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +"checksum rustc_version_runtime 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d31b7153270ebf48bf91c65ae5b0c00e749c4cfad505f66530ac74950249582f" "checksum rustix 0.38.34 (registry+https://github.com/rust-lang/crates.io-index)" = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" "checksum rustls 0.21.12 (registry+https://github.com/rust-lang/crates.io-index)" = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" "checksum rustls 0.23.10 (registry+https://github.com/rust-lang/crates.io-index)" = "05cff451f60db80f490f3c182b77c35260baace73209e9cdbbe526bfe3a4d402" @@ -9114,6 +10341,7 @@ dependencies = [ "checksum rustversion 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)" = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" "checksum ryu 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)" = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" "checksum same-file 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +"checksum saturating 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ece8e78b2f38ec51c51f5d475df0a7187ba5111b2a28bdc761ee05b075d40a71" "checksum schannel 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)" = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" "checksum schema 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)" = "" "checksum schema-ast 0.1.0 (git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched)" = "" @@ -9122,12 +10350,16 @@ dependencies = [ "checksum scoped-tls 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" "checksum scopeguard 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" "checksum sct 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +"checksum seahash 4.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" "checksum security-framework 2.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" "checksum security-framework-sys 2.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" "checksum selectors 0.22.0 (registry+https://github.com/rust-lang/crates.io-index)" = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" +"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)" = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" "checksum serde 1.0.203 (registry+https://github.com/rust-lang/crates.io-index)" = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" "checksum serde-value 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" +"checksum serde_bytes 0.11.15 (registry+https://github.com/rust-lang/crates.io-index)" = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" "checksum serde_derive 1.0.203 (registry+https://github.com/rust-lang/crates.io-index)" = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" "checksum serde_either 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689643f4e7826ffcd227d2cc166bfdf5869750191ffe9fd593531e6ba351f2fb" "checksum serde_json 1.0.119 (registry+https://github.com/rust-lang/crates.io-index)" = "e8eddb61f0697cc3989c5d64b452f5488e2b8a60fd7d5076a3045076ffef8cb0" @@ -9136,7 +10368,9 @@ dependencies = [ "checksum serde_spanned 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" "checksum serde_urlencoded 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9ec5d77e2d4c73717816afac02670d5c4f534ea95ed430442cad02e7a6e32c97" "checksum serde_urlencoded 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +"checksum serde_with 1.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff" "checksum serde_with 3.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "079f3a42cd87588d924ed95b533f8d30a483388c4e400ab736a7058e34f16169" +"checksum serde_with_macros 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" "checksum serde_with_macros 3.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bc03aad67c1d26b7de277d51c86892e7d9a0110a2fe44bf6b26cc569fba302d6" "checksum serde_yaml 0.9.34+deprecated (registry+https://github.com/rust-lang/crates.io-index)" = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" "checksum serialize-to-javascript 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" @@ -9150,14 +10384,17 @@ dependencies = [ "checksum sha3 0.10.8 (registry+https://github.com/rust-lang/crates.io-index)" = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" "checksum sharded-slab 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" "checksum shared_child 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b0d94659ad3c2137fef23ae75b03d5241d633f8acded53d672decfa0e6e0caef" +"checksum shlex 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" "checksum signal-hook-registry 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" "checksum simd-adler32 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +"checksum simdutf8 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" "checksum siphasher 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)" = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" "checksum skeptic 0.13.7 (registry+https://github.com/rust-lang/crates.io-index)" = "16d23b015676c90a0f01c197bfdc786c20342c73a0afdda9025adb0bc42940a8" "checksum sketches-ddsketch 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "04d2ecae5fcf33b122e2e6bd520a57ccf152d2dde3b38c71039df1a6867264ee" "checksum slab 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)" = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" "checksum smallvec 1.13.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" "checksum socket2 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" +"checksum socket2 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" "checksum socket2 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)" = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" "checksum soup2 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b2b4d76501d8ba387cf0fefbe055c3e0a59891d09f0f995ae4e4b16f6b60f3c0" "checksum soup2-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "009ef427103fcb17f802871647a7fa6c60cbb654b4c4e4c0ac60a31c5f6dc9cf" @@ -9175,12 +10412,16 @@ dependencies = [ "checksum static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" "checksum string_cache 0.8.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" "checksum string_cache_codegen 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" +"checksum stringprep 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +"checksum strsim 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" "checksum strsim 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" "checksum strum 0.26.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" "checksum strum_macros 0.26.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +"checksum subprocess 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)" = "0c2e86926081dda636c546d8c5e641661049d7562a68f5488be4a1f7f66f6086" "checksum subtle 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" "checksum syn 1.0.109 (registry+https://github.com/rust-lang/crates.io-index)" = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" "checksum syn 2.0.68 (registry+https://github.com/rust-lang/crates.io-index)" = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" +"checksum syn_derive 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" "checksum sync_wrapper 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" "checksum sync_wrapper 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" "checksum synstructure 0.12.6 (registry+https://github.com/rust-lang/crates.io-index)" = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" @@ -9190,8 +10431,10 @@ dependencies = [ "checksum system-configuration-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" "checksum system-deps 5.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18db855554db7bd0e73e06cf7ba3df39f97812cb11d3f75e71c39bf45171797e" "checksum system-deps 6.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +"checksum take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" "checksum tao 0.16.9 (registry+https://github.com/rust-lang/crates.io-index)" = "575c856fc21e551074869dcfaad8f706412bd5b803dfa0fbf6881c4ff4bfafab" "checksum tao-macros 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ec114582505d158b669b136e6851f85840c109819d77c42bb7c0709f727d18c2" +"checksum tap 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" "checksum tar 0.4.41 (registry+https://github.com/rust-lang/crates.io-index)" = "cb797dad5fb5b76fcf519e702f4a589483b5ef06567f160c392832c1f5e44909" "checksum target-lexicon 0.12.14 (registry+https://github.com/rust-lang/crates.io-index)" = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" "checksum tauri 1.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "77567d2b3b74de4588d544147142d02297f3eaa171a25a065252141d8597a516" @@ -9210,6 +10453,7 @@ dependencies = [ "checksum thiserror 1.0.61 (registry+https://github.com/rust-lang/crates.io-index)" = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" "checksum thiserror-impl 1.0.61 (registry+https://github.com/rust-lang/crates.io-index)" = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" "checksum thread_local 1.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +"checksum tiberius 0.11.7 (registry+https://github.com/rust-lang/crates.io-index)" = "66303a42b7c5daffb95c10cd8f3007a9c29b3e90128cf42b3738f58102aa2516" "checksum tiff 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" "checksum time 0.3.36 (registry+https://github.com/rust-lang/crates.io-index)" = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" "checksum time-core 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" @@ -9221,12 +10465,15 @@ dependencies = [ "checksum tokio 1.38.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" "checksum tokio-macros 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" "checksum tokio-native-tls 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +"checksum tokio-postgres 0.7.7 (git+https://github.com/prisma/rust-postgres?rev=00d4815e58859261bdfca71c75be7dc657303f7d)" = "" +"checksum tokio-rustls 0.24.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" "checksum tokio-rustls 0.26.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" "checksum tokio-stream 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" "checksum tokio-tls 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9a70f4fcd7b3b24fb194f837560168208f669ca8cb70d0c4b862944452396343" "checksum tokio-tungstenite 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c83b561d025642014097b66e6c1bb422783339e0909e4429cde4749d1990bc38" "checksum tokio-tungstenite 0.23.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c6989540ced10490aaf14e6bad2e3d33728a2813310a0c71d1574304c49631cd" "checksum tokio-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "be8242891f2b6cbef26a2d7e8605133c2c554cd35b3e4948ea892d6d68436499" +"checksum tokio-util 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" "checksum tokio-util 0.7.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" "checksum toml 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)" = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" "checksum toml 0.7.8 (registry+https://github.com/rust-lang/crates.io-index)" = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" @@ -9250,11 +10497,15 @@ dependencies = [ "checksum tracing-serde 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" "checksum tracing-subscriber 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)" = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" "checksum tree_magic_mini 3.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "469a727cac55b41448315cc10427c069c618ac59bb6a4480283fcd811749bdc2" +"checksum trust-dns-proto 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c31f240f59877c3d4bb3b3ea0ec5a6a0cff07323580ff8c7a605cd7d08b255d" +"checksum trust-dns-resolver 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e4ba72c2ea84515690c9fcef4c6c660bb9df3036ed1051686de84605b74fd558" "checksum try-lock 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" "checksum trybuild 1.0.96 (registry+https://github.com/rust-lang/crates.io-index)" = "33a5f13f11071020bb12de7a16b925d2d58636175c20c11dc5f96cb64bb6c9b3" "checksum tungstenite 0.20.1 (git+https://github.com/snapview/tungstenite-rs?rev=fc17f73)" = "" "checksum tungstenite 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9ef1a641ea34f399a848dea702823bbecfb4c486f911735368f1f137cb8257e1" "checksum tungstenite 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6e2e2ce1e47ed2994fd43b04c8f618008d4cabdd5ee34027cf14f9d918edd9c8" +"checksum twox-hash 1.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" +"checksum typed-builder 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "89851716b67b937e393b3daa8423e67ddfc4bbbf1654bcf05488e95e0828db0c" "checksum typenum 1.17.0 (registry+https://github.com/rust-lang/crates.io-index)" = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" "checksum ucd-trie 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" "checksum uds_windows 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" @@ -9262,6 +10513,7 @@ dependencies = [ "checksum unicode-bidi 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" "checksum unicode-ident 1.0.12 (registry+https://github.com/rust-lang/crates.io-index)" = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" "checksum unicode-normalization 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)" = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +"checksum unicode-properties 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e4259d9d4425d9f0661581b804cb85fe66a4c631cadd8f490d1c13a35d5d9291" "checksum unicode-segmentation 1.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" "checksum unicode-xid 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" "checksum unicode_categories 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" @@ -9305,17 +10557,20 @@ dependencies = [ "checksum web-sys 0.3.69 (registry+https://github.com/rust-lang/crates.io-index)" = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" "checksum webkit2gtk 0.18.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b8f859735e4a452aeb28c6c56a852967a8a76c8eb1cc32dbf931ad28a13d6370" "checksum webkit2gtk-sys 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4d76ca6ecc47aeba01ec61e480139dda143796abcae6f83bcddf50d6b5b1dcf3" +"checksum webpki-roots 0.25.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" "checksum webpki-roots 0.26.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bd7c23921eeb1713a4e851530e9b9756e4fb0e89978582942612524cf09f01cd" "checksum webview2-com 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b4a769c9f1a64a8734bde70caafac2b96cada12cd4aefa49196b3a386b8b4178" "checksum webview2-com-macros 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "eaebe196c01691db62e9e4ca52c5ef1e4fd837dcae27dae3ada599b5a8fd05ac" "checksum webview2-com-sys 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aac48ef20ddf657755fdcda8dfed2a7b4fc7e4581acce6fe9b88c3d64f29dee7" "checksum weezl 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" +"checksum widestring 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-util 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +"checksum winauth 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8f820cd208ce9c6b050812dc2d724ba98c6c1e9db5ce9b3f58d925ae5723a5e6" "checksum windows 0.37.0 (registry+https://github.com/rust-lang/crates.io-index)" = "57b543186b344cc61c85b5aab0d2e3adf4e0f99bc076eff9aa5927bcc0b8a647" "checksum windows 0.39.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f1c4bd0a50ac6020f65184721f758dba47bb9fbc2133df715ec74a237b26794a" "checksum windows 0.48.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" @@ -9378,6 +10633,7 @@ dependencies = [ "checksum wl-clipboard-rs 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "12b41773911497b18ca8553c3daaf8ec9fe9819caf93d451d3055f69de028adb" "checksum wry 0.24.10 (registry+https://github.com/rust-lang/crates.io-index)" = "00711278ed357350d44c749c286786ecac644e044e4da410d466212152383b45" "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" +"checksum wyz 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" "checksum x11 2.21.0 (registry+https://github.com/rust-lang/crates.io-index)" = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" "checksum x11-dl 2.21.0 (registry+https://github.com/rust-lang/crates.io-index)" = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" "checksum x11rb 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" diff --git a/Cargo.toml b/Cargo.toml index ac10c40..ac13ea1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,12 @@ edition = "2021" license = "MIT" repository = "https://github.com/RedstoneWizard08/Wormhole" homepage = "https://github.com/RedstoneWizard08/Wormhole" -authors = ["RedstoneWizard08", "Rexicon226", "cheese3660", "Wormhole Contributors"] +authors = [ + "RedstoneWizard08", + "Rexicon226", + "cheese3660", + "Wormhole Contributors", +] [workspace.dependencies] tokio = { version = "1.37.0", features = ["full"] } @@ -13,9 +18,19 @@ serde = { version = "1.0.202", features = ["derive"] } tauri = { version = "1.6.6", features = ["api-all"] } zip-extensions = "0.8.0" keyvalues-parser = "0.2.0" -reqwest = { version = "0.12.4", features = ["json", "stream", "gzip", "rustls-tls"], default-features = false } +reqwest = { version = "0.12.4", features = [ + "json", + "stream", + "gzip", + "rustls-tls", +], default-features = false } tokio-util = { version = "0.7.11", features = ["full"] } -tokio-stream = { version = "0.1.15", features = ["tokio-util", "fs", "net", "sync"] } +tokio-stream = { version = "0.1.15", features = [ + "tokio-util", + "fs", + "net", + "sync", +] } tauri-build = "1.5.2" clap = { version = "4.5.4", features = ["derive", "env", "string"] } rand = "0.8.5" @@ -29,7 +44,13 @@ phf = { version = "0.11.2", features = ["macros"] } flate2 = "1.0.30" dirs = "5.0.1" tracing = { version = "0.1.40", features = ["log", "async-await"] } -tracing-subscriber = { version = "0.3.18", features = ["tracing", "env-filter", "json", "chrono", "serde"] } +tracing-subscriber = { version = "0.3.18", features = [ + "tracing", + "env-filter", + "json", + "chrono", + "serde", +] } cfg-if = "1.0.0" tar = "0.4.40" xz = "0.1.0" @@ -38,7 +59,11 @@ base64 = "0.22.1" ferinth = "2.11.0" furse = "1.5.15" tempfile = "3.10.1" -specta = { version = "2.0.0-rc.13", features = ["function", "typescript", "export"] } +specta = { version = "2.0.0-rc.13", features = [ + "function", + "typescript", + "export", +] } futures = { version = "0.3.30", features = ["executor"] } axum = { version = "0.7.5", features = ["macros", "ws"] } mime_guess = "2.0.4" @@ -50,7 +75,9 @@ ctrlc = { version = "3.4.4", features = ["termination"] } include_dir = "0.7.4" axum-core = "0.4.3" bytes = "1.6.0" -futures-util = { version = "0.3.30", default-features = false, features = ["alloc"] } +futures-util = { version = "0.3.30", default-features = false, features = [ + "alloc", +] } hyper = "1.3.1" hyper-util = { version = "0.1.5", features = ["tokio"] } sha-1 = "0.10.1" @@ -80,9 +107,26 @@ libc = "0.2.155" thiserror = "1.0.61" murmur2 = "0.1.0" serde_repr = "0.1.19" -tungstenite = { features = ["rustls"], git = "https://github.com/snapview/tungstenite-rs", version = "0.20.1", rev = "fc17f73" } -prisma-client-rust = { git = "https://github.com/Brendonovich/prisma-client-rust", rev = "4f9ef9d", features = ["specta", "sqlite"] } -prisma-client-rust-cli = { git = "https://github.com/Brendonovich/prisma-client-rust", rev = "4f9ef9d", features = ["specta", "sqlite"] } +tungstenite = { features = [ + "rustls", +], git = "https://github.com/snapview/tungstenite-rs", version = "0.20.1", rev = "fc17f73" } +convert_case = "0.6.0" +diagnostics = { git = "https://github.com/Brendonovich/prisma-engines", branch = "5.1.0-patched" } +dmmf = { git = "https://github.com/Brendonovich/prisma-engines", branch = "5.1.0-patched" } +prisma-models = { git = "https://github.com/Brendonovich/prisma-engines", branch = "5.1.0-patched" } +psl = { git = "https://github.com/Brendonovich/prisma-engines", branch = "5.1.0-patched" } +query-core = { git = "https://github.com/Brendonovich/prisma-engines", branch = "5.1.0-patched" } +schema-core = { git = "https://github.com/Brendonovich/prisma-engines", branch = "5.1.0-patched" } +request-handlers = { git = "https://github.com/Brendonovich/prisma-engines", branch = "5.1.0-patched" } +user-facing-errors = { git = "https://github.com/Brendonovich/prisma-engines", branch = "5.1.0-patched" } +prisma-client-rust = { path = "./external/prisma-client-rust/crates/lib", features = [ + "specta", + "sqlite", +] } +prisma-client-rust-cli = { path = "./external/prisma-client-rust/crates/cli", features = [ + "specta", + "sqlite", +] } wormhole-cli = { path = "./apps/cli" } wormhole-gui = { path = "./apps/gui" } @@ -135,5 +179,8 @@ members = [ "crates/commands", "crates/plugins", "crates/pack", - "tools/prisma", "crates/rpc-rs", + "tools/prisma", + "crates/rpc-rs", + "external/prisma-client-rust/crates/lib", + "external/prisma-client-rust/crates/cli", ] diff --git a/apps/bindings/src/lib.rs b/apps/bindings/src/lib.rs index b43b30d..86dc75d 100644 --- a/apps/bindings/src/lib.rs +++ b/apps/bindings/src/lib.rs @@ -15,7 +15,7 @@ pub struct Cli { impl Runnable for Cli { async fn run(&self) -> Result<()> { println!("Exporting app bindings..."); - + build_router().export("/rpc", self.path.clone())?; Ok(()) diff --git a/crates/commands/src/router.rs b/crates/commands/src/router.rs index eb15220..57dbf61 100644 --- a/crates/commands/src/router.rs +++ b/crates/commands/src/router.rs @@ -2,28 +2,45 @@ use std::sync::Arc; -use data::prisma::PrismaClient; -use rpc_rs::{module::module::Module, proc::wrap, router::router::Router}; +use data::prisma::{game, instance, r#mod, source, PrismaClient}; +use rpc_rs::{module::module::Module, prisma_module, proc::wrap, router::router::Router}; /// Create a router. pub fn build_router() -> Router> { - Router::>::new() - .mount( - "version", - Module::builder() - .read(wrap(|_cx, _: ()| async move { env!("CARGO_PKG_VERSION") })) - .build(), - ) - .mount( - "mods", - Module::builder() - .read(wrap(|cx: Arc, _: ()| async move { - cx.r#mod() - .find_many(vec![]) - .exec() - .await - .unwrap_or_default() - })) - .build(), - ) + let mut router = Router::>::new().mount( + "version", + Module::builder() + .read(wrap(|_cx, _: ()| async move { env!("CARGO_PKG_VERSION") })) + .build(), + ); + + prisma_module!(router += ["mod", "mods"] { + client: PrismaClient, + module: r#mod, + container: r#mod, + primary_key: id, + }); + + prisma_module!(router += ["game", "games"] { + client: PrismaClient, + module: game, + container: game, + primary_key: id, + }); + + prisma_module!(router += ["source", "sources"] { + client: PrismaClient, + module: source, + container: source, + primary_key: id, + }); + + prisma_module!(router += ["instance", "instances"] { + client: PrismaClient, + module: instance, + container: instance, + primary_key: id, + }); + + router } diff --git a/crates/data/src/prisma.rs b/crates/data/src/prisma.rs index d0272f5..3d0f40b 100644 --- a/crates/data/src/prisma.rs +++ b/crates/data/src/prisma.rs @@ -269,26 +269,44 @@ pub mod _prisma { pub mod read_filters { use super::*; #[derive(Debug, Clone)] - pub enum StringFilter { - Equals(String), - InVec(Vec), - NotInVec(Vec), - Lt(String), - Lte(String), - Gt(String), - Gte(String), - Contains(String), - StartsWith(String), - EndsWith(String), - Not(String), + pub enum BooleanFilter { + Equals(Boolean), + Not(Boolean), } - impl Into<::prisma_client_rust::SerializedWhereValue> for StringFilter { + impl Into<::prisma_client_rust::SerializedWhereValue> for BooleanFilter { fn into(self) -> ::prisma_client_rust::SerializedWhereValue { match self { Self::Equals(value) => { ::prisma_client_rust::SerializedWhereValue::Object(vec![( "equals".to_string(), - ::prisma_client_rust::PrismaValue::String(value), + ::prisma_client_rust::PrismaValue::Boolean(value), + )]) + } + Self::Not(value) => ::prisma_client_rust::SerializedWhereValue::Object(vec![( + "not".to_string(), + ::prisma_client_rust::PrismaValue::Boolean(value), + )]), + } + } + } + #[derive(Debug, Clone)] + pub enum IntFilter { + Equals(Int), + InVec(Vec), + NotInVec(Vec), + Lt(Int), + Lte(Int), + Gt(Int), + Gte(Int), + Not(Int), + } + impl Into<::prisma_client_rust::SerializedWhereValue> for IntFilter { + fn into(self) -> ::prisma_client_rust::SerializedWhereValue { + match self { + Self::Equals(value) => { + ::prisma_client_rust::SerializedWhereValue::Object(vec![( + "equals".to_string(), + ::prisma_client_rust::PrismaValue::Int(value), )]) } Self::InVec(value) => { @@ -297,7 +315,7 @@ pub mod _prisma { ::prisma_client_rust::PrismaValue::List( value .into_iter() - .map(|value| ::prisma_client_rust::PrismaValue::String(value)) + .map(|value| ::prisma_client_rust::PrismaValue::Int(value)) .collect(), ), )]) @@ -308,74 +326,53 @@ pub mod _prisma { ::prisma_client_rust::PrismaValue::List( value .into_iter() - .map(|value| ::prisma_client_rust::PrismaValue::String(value)) + .map(|value| ::prisma_client_rust::PrismaValue::Int(value)) .collect(), ), )]) } Self::Lt(value) => ::prisma_client_rust::SerializedWhereValue::Object(vec![( "lt".to_string(), - ::prisma_client_rust::PrismaValue::String(value), + ::prisma_client_rust::PrismaValue::Int(value), )]), Self::Lte(value) => ::prisma_client_rust::SerializedWhereValue::Object(vec![( "lte".to_string(), - ::prisma_client_rust::PrismaValue::String(value), + ::prisma_client_rust::PrismaValue::Int(value), )]), Self::Gt(value) => ::prisma_client_rust::SerializedWhereValue::Object(vec![( "gt".to_string(), - ::prisma_client_rust::PrismaValue::String(value), + ::prisma_client_rust::PrismaValue::Int(value), )]), Self::Gte(value) => ::prisma_client_rust::SerializedWhereValue::Object(vec![( "gte".to_string(), - ::prisma_client_rust::PrismaValue::String(value), + ::prisma_client_rust::PrismaValue::Int(value), )]), - Self::Contains(value) => { - ::prisma_client_rust::SerializedWhereValue::Object(vec![( - "contains".to_string(), - ::prisma_client_rust::PrismaValue::String(value), - )]) - } - Self::StartsWith(value) => { - ::prisma_client_rust::SerializedWhereValue::Object(vec![( - "startsWith".to_string(), - ::prisma_client_rust::PrismaValue::String(value), - )]) - } - Self::EndsWith(value) => { - ::prisma_client_rust::SerializedWhereValue::Object(vec![( - "endsWith".to_string(), - ::prisma_client_rust::PrismaValue::String(value), - )]) - } Self::Not(value) => ::prisma_client_rust::SerializedWhereValue::Object(vec![( "not".to_string(), - ::prisma_client_rust::PrismaValue::String(value), + ::prisma_client_rust::PrismaValue::Int(value), )]), } } } #[derive(Debug, Clone)] - pub enum StringNullableFilter { - Equals(Option), - InVec(Vec), - NotInVec(Vec), - Lt(String), - Lte(String), - Gt(String), - Gte(String), - Contains(String), - StartsWith(String), - EndsWith(String), - Not(Option), + pub enum IntNullableFilter { + Equals(Option), + InVec(Vec), + NotInVec(Vec), + Lt(Int), + Lte(Int), + Gt(Int), + Gte(Int), + Not(Option), } - impl Into<::prisma_client_rust::SerializedWhereValue> for StringNullableFilter { + impl Into<::prisma_client_rust::SerializedWhereValue> for IntNullableFilter { fn into(self) -> ::prisma_client_rust::SerializedWhereValue { match self { Self::Equals(value) => { ::prisma_client_rust::SerializedWhereValue::Object(vec![( "equals".to_string(), value - .map(|value| ::prisma_client_rust::PrismaValue::String(value)) + .map(|value| ::prisma_client_rust::PrismaValue::Int(value)) .unwrap_or_else(|| ::prisma_client_rust::PrismaValue::Null), )]) } @@ -385,7 +382,7 @@ pub mod _prisma { ::prisma_client_rust::PrismaValue::List( value .into_iter() - .map(|value| ::prisma_client_rust::PrismaValue::String(value)) + .map(|value| ::prisma_client_rust::PrismaValue::Int(value)) .collect(), ), )]) @@ -396,72 +393,57 @@ pub mod _prisma { ::prisma_client_rust::PrismaValue::List( value .into_iter() - .map(|value| ::prisma_client_rust::PrismaValue::String(value)) + .map(|value| ::prisma_client_rust::PrismaValue::Int(value)) .collect(), ), )]) } Self::Lt(value) => ::prisma_client_rust::SerializedWhereValue::Object(vec![( "lt".to_string(), - ::prisma_client_rust::PrismaValue::String(value), + ::prisma_client_rust::PrismaValue::Int(value), )]), Self::Lte(value) => ::prisma_client_rust::SerializedWhereValue::Object(vec![( "lte".to_string(), - ::prisma_client_rust::PrismaValue::String(value), + ::prisma_client_rust::PrismaValue::Int(value), )]), Self::Gt(value) => ::prisma_client_rust::SerializedWhereValue::Object(vec![( "gt".to_string(), - ::prisma_client_rust::PrismaValue::String(value), + ::prisma_client_rust::PrismaValue::Int(value), )]), Self::Gte(value) => ::prisma_client_rust::SerializedWhereValue::Object(vec![( "gte".to_string(), - ::prisma_client_rust::PrismaValue::String(value), + ::prisma_client_rust::PrismaValue::Int(value), )]), - Self::Contains(value) => { - ::prisma_client_rust::SerializedWhereValue::Object(vec![( - "contains".to_string(), - ::prisma_client_rust::PrismaValue::String(value), - )]) - } - Self::StartsWith(value) => { - ::prisma_client_rust::SerializedWhereValue::Object(vec![( - "startsWith".to_string(), - ::prisma_client_rust::PrismaValue::String(value), - )]) - } - Self::EndsWith(value) => { - ::prisma_client_rust::SerializedWhereValue::Object(vec![( - "endsWith".to_string(), - ::prisma_client_rust::PrismaValue::String(value), - )]) - } Self::Not(value) => ::prisma_client_rust::SerializedWhereValue::Object(vec![( "not".to_string(), value - .map(|value| ::prisma_client_rust::PrismaValue::String(value)) + .map(|value| ::prisma_client_rust::PrismaValue::Int(value)) .unwrap_or_else(|| ::prisma_client_rust::PrismaValue::Null), )]), } } } #[derive(Debug, Clone)] - pub enum IntFilter { - Equals(Int), - InVec(Vec), - NotInVec(Vec), - Lt(Int), - Lte(Int), - Gt(Int), - Gte(Int), - Not(Int), + pub enum StringFilter { + Equals(String), + InVec(Vec), + NotInVec(Vec), + Lt(String), + Lte(String), + Gt(String), + Gte(String), + Contains(String), + StartsWith(String), + EndsWith(String), + Not(String), } - impl Into<::prisma_client_rust::SerializedWhereValue> for IntFilter { + impl Into<::prisma_client_rust::SerializedWhereValue> for StringFilter { fn into(self) -> ::prisma_client_rust::SerializedWhereValue { match self { Self::Equals(value) => { ::prisma_client_rust::SerializedWhereValue::Object(vec![( "equals".to_string(), - ::prisma_client_rust::PrismaValue::Int(value), + ::prisma_client_rust::PrismaValue::String(value), )]) } Self::InVec(value) => { @@ -470,7 +452,7 @@ pub mod _prisma { ::prisma_client_rust::PrismaValue::List( value .into_iter() - .map(|value| ::prisma_client_rust::PrismaValue::Int(value)) + .map(|value| ::prisma_client_rust::PrismaValue::String(value)) .collect(), ), )]) @@ -481,53 +463,74 @@ pub mod _prisma { ::prisma_client_rust::PrismaValue::List( value .into_iter() - .map(|value| ::prisma_client_rust::PrismaValue::Int(value)) + .map(|value| ::prisma_client_rust::PrismaValue::String(value)) .collect(), ), )]) } Self::Lt(value) => ::prisma_client_rust::SerializedWhereValue::Object(vec![( "lt".to_string(), - ::prisma_client_rust::PrismaValue::Int(value), + ::prisma_client_rust::PrismaValue::String(value), )]), Self::Lte(value) => ::prisma_client_rust::SerializedWhereValue::Object(vec![( "lte".to_string(), - ::prisma_client_rust::PrismaValue::Int(value), + ::prisma_client_rust::PrismaValue::String(value), )]), Self::Gt(value) => ::prisma_client_rust::SerializedWhereValue::Object(vec![( "gt".to_string(), - ::prisma_client_rust::PrismaValue::Int(value), + ::prisma_client_rust::PrismaValue::String(value), )]), Self::Gte(value) => ::prisma_client_rust::SerializedWhereValue::Object(vec![( "gte".to_string(), - ::prisma_client_rust::PrismaValue::Int(value), + ::prisma_client_rust::PrismaValue::String(value), )]), + Self::Contains(value) => { + ::prisma_client_rust::SerializedWhereValue::Object(vec![( + "contains".to_string(), + ::prisma_client_rust::PrismaValue::String(value), + )]) + } + Self::StartsWith(value) => { + ::prisma_client_rust::SerializedWhereValue::Object(vec![( + "startsWith".to_string(), + ::prisma_client_rust::PrismaValue::String(value), + )]) + } + Self::EndsWith(value) => { + ::prisma_client_rust::SerializedWhereValue::Object(vec![( + "endsWith".to_string(), + ::prisma_client_rust::PrismaValue::String(value), + )]) + } Self::Not(value) => ::prisma_client_rust::SerializedWhereValue::Object(vec![( "not".to_string(), - ::prisma_client_rust::PrismaValue::Int(value), + ::prisma_client_rust::PrismaValue::String(value), )]), } } } #[derive(Debug, Clone)] - pub enum IntNullableFilter { - Equals(Option), - InVec(Vec), - NotInVec(Vec), - Lt(Int), - Lte(Int), - Gt(Int), - Gte(Int), - Not(Option), + pub enum StringNullableFilter { + Equals(Option), + InVec(Vec), + NotInVec(Vec), + Lt(String), + Lte(String), + Gt(String), + Gte(String), + Contains(String), + StartsWith(String), + EndsWith(String), + Not(Option), } - impl Into<::prisma_client_rust::SerializedWhereValue> for IntNullableFilter { + impl Into<::prisma_client_rust::SerializedWhereValue> for StringNullableFilter { fn into(self) -> ::prisma_client_rust::SerializedWhereValue { match self { Self::Equals(value) => { ::prisma_client_rust::SerializedWhereValue::Object(vec![( "equals".to_string(), value - .map(|value| ::prisma_client_rust::PrismaValue::Int(value)) + .map(|value| ::prisma_client_rust::PrismaValue::String(value)) .unwrap_or_else(|| ::prisma_client_rust::PrismaValue::Null), )]) } @@ -537,7 +540,7 @@ pub mod _prisma { ::prisma_client_rust::PrismaValue::List( value .into_iter() - .map(|value| ::prisma_client_rust::PrismaValue::Int(value)) + .map(|value| ::prisma_client_rust::PrismaValue::String(value)) .collect(), ), )]) @@ -548,53 +551,50 @@ pub mod _prisma { ::prisma_client_rust::PrismaValue::List( value .into_iter() - .map(|value| ::prisma_client_rust::PrismaValue::Int(value)) + .map(|value| ::prisma_client_rust::PrismaValue::String(value)) .collect(), ), )]) } Self::Lt(value) => ::prisma_client_rust::SerializedWhereValue::Object(vec![( "lt".to_string(), - ::prisma_client_rust::PrismaValue::Int(value), + ::prisma_client_rust::PrismaValue::String(value), )]), Self::Lte(value) => ::prisma_client_rust::SerializedWhereValue::Object(vec![( "lte".to_string(), - ::prisma_client_rust::PrismaValue::Int(value), + ::prisma_client_rust::PrismaValue::String(value), )]), Self::Gt(value) => ::prisma_client_rust::SerializedWhereValue::Object(vec![( "gt".to_string(), - ::prisma_client_rust::PrismaValue::Int(value), + ::prisma_client_rust::PrismaValue::String(value), )]), Self::Gte(value) => ::prisma_client_rust::SerializedWhereValue::Object(vec![( "gte".to_string(), - ::prisma_client_rust::PrismaValue::Int(value), - )]), - Self::Not(value) => ::prisma_client_rust::SerializedWhereValue::Object(vec![( - "not".to_string(), - value - .map(|value| ::prisma_client_rust::PrismaValue::Int(value)) - .unwrap_or_else(|| ::prisma_client_rust::PrismaValue::Null), + ::prisma_client_rust::PrismaValue::String(value), )]), - } - } - } - #[derive(Debug, Clone)] - pub enum BooleanFilter { - Equals(Boolean), - Not(Boolean), - } - impl Into<::prisma_client_rust::SerializedWhereValue> for BooleanFilter { - fn into(self) -> ::prisma_client_rust::SerializedWhereValue { - match self { - Self::Equals(value) => { + Self::Contains(value) => { ::prisma_client_rust::SerializedWhereValue::Object(vec![( - "equals".to_string(), - ::prisma_client_rust::PrismaValue::Boolean(value), + "contains".to_string(), + ::prisma_client_rust::PrismaValue::String(value), + )]) + } + Self::StartsWith(value) => { + ::prisma_client_rust::SerializedWhereValue::Object(vec![( + "startsWith".to_string(), + ::prisma_client_rust::PrismaValue::String(value), + )]) + } + Self::EndsWith(value) => { + ::prisma_client_rust::SerializedWhereValue::Object(vec![( + "endsWith".to_string(), + ::prisma_client_rust::PrismaValue::String(value), )]) } Self::Not(value) => ::prisma_client_rust::SerializedWhereValue::Object(vec![( "not".to_string(), - ::prisma_client_rust::PrismaValue::Boolean(value), + value + .map(|value| ::prisma_client_rust::PrismaValue::String(value)) + .unwrap_or_else(|| ::prisma_client_rust::PrismaValue::Null), )]), } } @@ -1306,9 +1306,18 @@ pub mod game { pub fn create(name: String, _params: Vec) -> Create { Create { name, _params } } - #[derive(Debug, Clone)] + #[derive( + Debug, + Clone, + :: serde :: Serialize, + :: serde :: Deserialize, + :: prisma_client_rust :: specta :: Type, + )] + # [specta (rename = "GameCreation" , crate = prisma_client_rust :: specta)] pub struct CreateUnchecked { + #[serde(rename = "name")] pub name: String, + #[serde(skip)] pub _params: Vec, } impl CreateUnchecked { @@ -1323,6 +1332,54 @@ pub mod game { pub fn create_unchecked(name: String, _params: Vec) -> CreateUnchecked { CreateUnchecked { name, _params } } + #[derive( + Debug, + Clone, + :: serde :: Serialize, + :: serde :: Deserialize, + :: prisma_client_rust :: specta :: Type, + )] + # [specta (rename = "GameUpdate" , crate = prisma_client_rust :: specta)] + pub struct Update { + #[serde(rename = "id")] + pub id: id::Type, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "curseforge", skip_serializing_if = "Option::is_none")] + pub curseforge: curseforge::Type, + #[serde(rename = "thunderstore", skip_serializing_if = "Option::is_none")] + pub thunderstore: thunderstore::Type, + #[serde(rename = "spacedock", skip_serializing_if = "Option::is_none")] + pub spacedock: spacedock::Type, + #[serde(rename = "ckan", skip_serializing_if = "Option::is_none")] + pub ckan: Option, + #[serde(rename = "modrinth", skip_serializing_if = "Option::is_none")] + pub modrinth: Option, + } + impl Update { + pub fn as_params(self) -> Vec { + let mut params = Vec::new(); + if let Some(field) = self.name { + params.push(name::set(field)); + } + if let Some(field) = self.curseforge { + params.push(curseforge::set(Some(field))); + } + if let Some(field) = self.thunderstore { + params.push(thunderstore::set(Some(field))); + } + if let Some(field) = self.spacedock { + params.push(spacedock::set(Some(field))); + } + if let Some(field) = self.ckan { + params.push(ckan::set(field)); + } + if let Some(field) = self.modrinth { + params.push(modrinth::set(field)); + } + params + } + } #[derive(Debug, Clone)] pub struct Types; impl ::prisma_client_rust::ModelTypes for Types { @@ -2920,9 +2977,18 @@ pub mod source { pub fn create(name: String, _params: Vec) -> Create { Create { name, _params } } - #[derive(Debug, Clone)] + #[derive( + Debug, + Clone, + :: serde :: Serialize, + :: serde :: Deserialize, + :: prisma_client_rust :: specta :: Type, + )] + # [specta (rename = "SourceCreation" , crate = prisma_client_rust :: specta)] pub struct CreateUnchecked { + #[serde(rename = "name")] pub name: String, + #[serde(skip)] pub _params: Vec, } impl CreateUnchecked { @@ -2937,6 +3003,29 @@ pub mod source { pub fn create_unchecked(name: String, _params: Vec) -> CreateUnchecked { CreateUnchecked { name, _params } } + #[derive( + Debug, + Clone, + :: serde :: Serialize, + :: serde :: Deserialize, + :: prisma_client_rust :: specta :: Type, + )] + # [specta (rename = "SourceUpdate" , crate = prisma_client_rust :: specta)] + pub struct Update { + #[serde(rename = "id")] + pub id: id::Type, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + } + impl Update { + pub fn as_params(self) -> Vec { + let mut params = Vec::new(); + if let Some(field) = self.name { + params.push(name::set(field)); + } + params + } + } #[derive(Debug, Clone)] pub struct Types; impl ::prisma_client_rust::ModelTypes for Types { @@ -4178,13 +4267,26 @@ pub mod instance { _params, } } - #[derive(Debug, Clone)] + #[derive( + Debug, + Clone, + :: serde :: Serialize, + :: serde :: Deserialize, + :: prisma_client_rust :: specta :: Type, + )] + # [specta (rename = "InstanceCreation" , crate = prisma_client_rust :: specta)] pub struct CreateUnchecked { + #[serde(rename = "name")] pub name: String, + #[serde(rename = "gameId")] pub game_id: Int, + #[serde(rename = "dataDir")] pub data_dir: String, + #[serde(rename = "cacheDir")] pub cache_dir: String, + #[serde(rename = "installDir")] pub install_dir: String, + #[serde(skip)] pub _params: Vec, } impl CreateUnchecked { @@ -4226,6 +4328,69 @@ pub mod instance { _params, } } + #[derive( + Debug, + Clone, + :: serde :: Serialize, + :: serde :: Deserialize, + :: prisma_client_rust :: specta :: Type, + )] + # [specta (rename = "InstanceUpdate" , crate = prisma_client_rust :: specta)] + pub struct Update { + #[serde(rename = "id")] + pub id: id::Type, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "gameId", skip_serializing_if = "Option::is_none")] + pub game_id: Option, + #[serde(rename = "dataDir", skip_serializing_if = "Option::is_none")] + pub data_dir: Option, + #[serde(rename = "cacheDir", skip_serializing_if = "Option::is_none")] + pub cache_dir: Option, + #[serde(rename = "installDir", skip_serializing_if = "Option::is_none")] + pub install_dir: Option, + #[serde(rename = "description", skip_serializing_if = "Option::is_none")] + pub description: Option, + #[serde(rename = "created", skip_serializing_if = "Option::is_none")] + pub created: Option, + #[serde(rename = "updated", skip_serializing_if = "Option::is_none")] + pub updated: Option, + #[serde(rename = "loader", skip_serializing_if = "Option::is_none")] + pub loader: loader::Type, + } + impl Update { + pub fn as_params(self) -> Vec { + let mut params = Vec::new(); + if let Some(field) = self.name { + params.push(name::set(field)); + } + if let Some(field) = self.game_id { + params.push(game_id::set(field)); + } + if let Some(field) = self.data_dir { + params.push(data_dir::set(field)); + } + if let Some(field) = self.cache_dir { + params.push(cache_dir::set(field)); + } + if let Some(field) = self.install_dir { + params.push(install_dir::set(field)); + } + if let Some(field) = self.description { + params.push(description::set(field)); + } + if let Some(field) = self.created { + params.push(created::set(field)); + } + if let Some(field) = self.updated { + params.push(updated::set(field)); + } + if let Some(field) = self.loader { + params.push(loader::set(Some(field))); + } + params + } + } #[derive(Debug, Clone)] pub struct Types; impl ::prisma_client_rust::ModelTypes for Types { @@ -6198,15 +6363,30 @@ pub mod r#mod { _params, } } - #[derive(Debug, Clone)] + #[derive( + Debug, + Clone, + :: serde :: Serialize, + :: serde :: Deserialize, + :: prisma_client_rust :: specta :: Type, + )] + # [specta (rename = "ModCreation" , crate = prisma_client_rust :: specta)] pub struct CreateUnchecked { + #[serde(rename = "mod")] pub r#mod: String, + #[serde(rename = "name")] pub name: String, + #[serde(rename = "file")] pub file: String, + #[serde(rename = "size")] pub size: Int, + #[serde(rename = "installed_files")] pub installed_files: String, + #[serde(rename = "sourceId")] pub source_id: Int, + #[serde(rename = "instanceId")] pub instance_id: Int, + #[serde(skip)] pub _params: Vec, } impl CreateUnchecked { @@ -6256,6 +6436,69 @@ pub mod r#mod { _params, } } + #[derive( + Debug, + Clone, + :: serde :: Serialize, + :: serde :: Deserialize, + :: prisma_client_rust :: specta :: Type, + )] + # [specta (rename = "ModUpdate" , crate = prisma_client_rust :: specta)] + pub struct Update { + #[serde(rename = "id")] + pub id: id::Type, + #[serde(rename = "mod", skip_serializing_if = "Option::is_none")] + pub r#mod: Option, + #[serde(rename = "version", skip_serializing_if = "Option::is_none")] + pub version: version::Type, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "file", skip_serializing_if = "Option::is_none")] + pub file: Option, + #[serde(rename = "size", skip_serializing_if = "Option::is_none")] + pub size: Option, + #[serde(rename = "hash", skip_serializing_if = "Option::is_none")] + pub hash: hash::Type, + #[serde(rename = "installed_files", skip_serializing_if = "Option::is_none")] + pub installed_files: Option, + #[serde(rename = "sourceId", skip_serializing_if = "Option::is_none")] + pub source_id: Option, + #[serde(rename = "instanceId", skip_serializing_if = "Option::is_none")] + pub instance_id: Option, + } + impl Update { + pub fn as_params(self) -> Vec { + let mut params = Vec::new(); + if let Some(field) = self.r#mod { + params.push(r#mod::set(field)); + } + if let Some(field) = self.version { + params.push(version::set(Some(field))); + } + if let Some(field) = self.name { + params.push(name::set(field)); + } + if let Some(field) = self.file { + params.push(file::set(field)); + } + if let Some(field) = self.size { + params.push(size::set(field)); + } + if let Some(field) = self.hash { + params.push(hash::set(Some(field))); + } + if let Some(field) = self.installed_files { + params.push(installed_files::set(field)); + } + if let Some(field) = self.source_id { + params.push(source_id::set(field)); + } + if let Some(field) = self.instance_id { + params.push(instance_id::set(field)); + } + params + } + } #[derive(Debug, Clone)] pub struct Types; impl ::prisma_client_rust::ModelTypes for Types { diff --git a/crates/rpc-rs/src/lib.rs b/crates/rpc-rs/src/lib.rs index 0720cd6..2db3bd8 100644 --- a/crates/rpc-rs/src/lib.rs +++ b/crates/rpc-rs/src/lib.rs @@ -1,6 +1,7 @@ #![feature(associated_type_defaults, trait_alias, async_closure)] -pub mod proc; +pub mod macros; pub mod module; -pub mod util; +pub mod proc; pub mod router; +pub mod util; diff --git a/crates/rpc-rs/src/macros.rs b/crates/rpc-rs/src/macros.rs new file mode 100644 index 0000000..b8ac065 --- /dev/null +++ b/crates/rpc-rs/src/macros.rs @@ -0,0 +1,140 @@ +/// A macro to create a module for a prisma-client-rust module. +/// Your client must be an `Arc<...>`, as the state of the router. +/// +/// Params: +/// - `client` - The path to the `PrismaClient` struct. +/// - `module` - The path to the module inside the generated `prisma` mod. +/// - `container` - The module's name. If you use `client.xxx.create(...)`, the container would be `xxx`. +/// - `primary_key` - The name of the model's primary key. +#[macro_export] +macro_rules! prisma_single_module { + { + client: $client: ty, + module: $module: ident, + container: $cont: ident, + primary_key: $pkey: ident, + } => { + Module::builder() + .read(wrap(|cx: Arc<$client>, item_id: i32| async move { + cx.$cont() + .find_first(vec![$module::$pkey::equals(item_id)]) + .exec() + .await + .unwrap_or_default() + })) + .create(wrap( + |cx: Arc<$client>, item: $module::CreateUnchecked| async move { + cx.$cont() + .create_many(vec![item]) + .exec() + .await + .map_err(|v| v.to_string()) + }, + )) + .update(wrap( + |cx: Arc<$client>, update: $module::Update| async move { + cx.$cont() + .update($module::$pkey::equals(update.id), update.as_params()) + .exec() + .await + .map_err(|v| v.to_string()) + }, + )) + .delete(wrap( + |cx: Arc<$client>, item_id: i32| async move { + cx.$cont() + .delete($module::$pkey::equals(item_id)) + .exec() + .await + .map_err(|v| v.to_string()) + }, + )) + .build() + }; +} + +/// A macro to create a module for a prisma-client-rust module. +/// Your client must be an `Arc<...>`, as the state of the router. +/// This will work with a `Vec<...>` of the model. +/// +/// Params: +/// - `client` - The path to the `PrismaClient` struct. +/// - `module` - The path to the module inside the generated `prisma` mod. +/// - `container` - The module's name. If you use `client.xxx.create(...)`, the container would be `xxx`. +/// - `primary_key` - The name of the model's primary key. +#[macro_export] +macro_rules! prisma_multi_module { + { + client: $client: ty, + module: $module: ident, + container: $cont: ident, + primary_key: $pkey: ident, + } => { + Module::builder() + .read(wrap(|cx: Arc<$client>, _: ()| async move { + cx.$cont() + .find_many(vec![]) + .exec() + .await + .unwrap_or_default() + })) + .create(wrap( + |cx: Arc<$client>, m: Vec<$module::CreateUnchecked>| async move { + cx.$cont() + .create_many(m) + .exec() + .await + .map_err(|v| v.to_string()) + }, + )) + .delete(wrap(|cx: Arc<$client>, ids: Vec| async move { + cx.$cont() + .delete_many(ids.iter().map(|v| $module::$pkey::equals(v.clone())).collect()) + .exec() + .await + .map_err(|v| v.to_string()) + })) + .build() + }; +} + +/// A macro to create a module for a prisma-client-rust module. +/// Your client must be an `Arc<...>`, as the state of the router. +/// +/// Params: +/// - `router` - The variable containing router (must be `mut`). +/// - `single` - The name for the single route. +/// - `multi` - The name for the multi route. +/// - `client` - The path to the `PrismaClient` struct. +/// - `module` - The path to the module inside the generated `prisma` mod. +/// - `container` - The module's name. If you use `client.xxx.create(...)`, the container would be `xxx`. +/// - `primary_key` - The name of the model's primary key. +#[macro_export] +macro_rules! prisma_module { + ($router: ident += [$single: expr, $multi: expr] { + client: $client: ty, + module: $module: ident, + container: $cont: ident, + primary_key: $pkey: ident, + }) => { + $router = $router.mount( + $single, + $crate::prisma_single_module! { + client: $client, + module: $module, + container: $cont, + primary_key: $pkey, + }, + ); + + $router = $router.mount( + $multi, + $crate::prisma_multi_module! { + client: $client, + module: $module, + container: $cont, + primary_key: $pkey, + }, + ); + }; +} diff --git a/crates/rpc-rs/src/module/module.rs b/crates/rpc-rs/src/module/module.rs index f38f864..a7f9cd7 100644 --- a/crates/rpc-rs/src/module/module.rs +++ b/crates/rpc-rs/src/module/module.rs @@ -2,7 +2,11 @@ use std::sync::Arc; use serde_json::Error; -use crate::{router::Method, proc::{wrap, GenericProcedure}, util::TripleS}; +use crate::{ + proc::{wrap, GenericProcedure}, + router::Method, + util::TripleS, +}; use super::builder::ModuleBuilder; @@ -17,10 +21,26 @@ pub struct Module { impl Module { pub(crate) fn new(builder: ModuleBuilder) -> Self { Self { - create: Arc::new(builder.create.unwrap_or(Box::new(wrap(Self::error_responder)))), - read: Arc::new(builder.read.unwrap_or(Box::new(wrap(Self::error_responder)))), - update: Arc::new(builder.update.unwrap_or(Box::new(wrap(Self::error_responder)))), - delete: Arc::new(builder.delete.unwrap_or(Box::new(wrap(Self::error_responder)))), + create: Arc::new( + builder + .create + .unwrap_or(Box::new(wrap(Self::error_responder))), + ), + read: Arc::new( + builder + .read + .unwrap_or(Box::new(wrap(Self::error_responder))), + ), + update: Arc::new( + builder + .update + .unwrap_or(Box::new(wrap(Self::error_responder))), + ), + delete: Arc::new( + builder + .delete + .unwrap_or(Box::new(wrap(Self::error_responder))), + ), } } diff --git a/crates/rpc-rs/src/proc/mod.rs b/crates/rpc-rs/src/proc/mod.rs index ef6ebed..dfe603f 100644 --- a/crates/rpc-rs/src/proc/mod.rs +++ b/crates/rpc-rs/src/proc/mod.rs @@ -20,7 +20,11 @@ impl< Arg: Send + Sync + 'static + DeserializeOwned + Type, > GenericProcedure for WrappedProcedure { - async fn run(&self, cx: Cx, data: String) -> Result { + async fn run(&self, cx: Cx, mut data: String) -> Result { + if data.is_empty() { + data = String::from("null"); + } + serde_json::to_string(&self.0.exec(cx, serde_json::from_str(&data)?).await) } diff --git a/crates/rpc-rs/src/router/axum.rs b/crates/rpc-rs/src/router/axum.rs index 0286d78..9f500aa 100644 --- a/crates/rpc-rs/src/router/axum.rs +++ b/crates/rpc-rs/src/router/axum.rs @@ -1,13 +1,7 @@ use std::{future::Future, pin::Pin}; use crate::{module::module::Module, util::TripleS}; -use axum::{ - body::Body, - extract::Request, - handler::Handler, - response::Response, - routing::any, -}; +use axum::{body::Body, extract::Request, handler::Handler, response::Response, routing::any}; use http_body_util::BodyExt; use super::{router::Router, Method}; diff --git a/crates/rpc-rs/src/router/export.rs b/crates/rpc-rs/src/router/export.rs index e63ca27..b77f158 100644 --- a/crates/rpc-rs/src/router/export.rs +++ b/crates/rpc-rs/src/router/export.rs @@ -2,8 +2,8 @@ use std::{collections::HashMap, fs, path::PathBuf, sync::Arc}; use specta::ts::{export_named_datatype, Result}; -use crate::{proc::GenericProcedure, util::TripleS}; use super::{func::export_function_header, router::Router, Method}; +use crate::{proc::GenericProcedure, util::TripleS}; pub(crate) const MODULE_STUB: &str = include_str!("./module_stub.ts"); pub(crate) const CORE: &str = include_str!("./core.ts"); diff --git a/crates/rpc-rs/src/router/func.rs b/crates/rpc-rs/src/router/func.rs index 3c5d393..0bb5021 100644 --- a/crates/rpc-rs/src/router/func.rs +++ b/crates/rpc-rs/src/router/func.rs @@ -1,9 +1,10 @@ -use specta::{function::FunctionDataType, ts::{datatype, ExportConfig, Result}, TypeMap}; +use specta::{ + function::FunctionDataType, + ts::{datatype, ExportConfig, Result}, + TypeMap, +}; -pub fn export_function_header( - dt: FunctionDataType, - config: &ExportConfig, -) -> Result { +pub fn export_function_header(dt: FunctionDataType, config: &ExportConfig) -> Result { let type_map = TypeMap::default(); let mut s = String::new(); @@ -31,13 +32,13 @@ pub fn export_function_header( if let Some(ty) = dt.result { s.push_str(": "); - + if dt.asyncness { s.push_str(&format!("Promise<{}>", datatype(config, &ty, &type_map)?)); } else { s.push_str(&datatype(config, &ty, &type_map)?); } } - + Ok(s) } diff --git a/crates/rpc-rs/src/router/mod.rs b/crates/rpc-rs/src/router/mod.rs index af76e47..faf67ba 100644 --- a/crates/rpc-rs/src/router/mod.rs +++ b/crates/rpc-rs/src/router/mod.rs @@ -1,8 +1,8 @@ use serde::{Deserialize, Serialize}; -pub mod router; -pub mod func; pub mod export; +pub mod func; +pub mod router; #[cfg(feature = "axum")] pub mod axum; diff --git a/crates/rpc-rs/src/router/router.rs b/crates/rpc-rs/src/router/router.rs index 982bc89..a72c3c4 100644 --- a/crates/rpc-rs/src/router/router.rs +++ b/crates/rpc-rs/src/router/router.rs @@ -1,6 +1,9 @@ use std::collections::HashMap; -use specta::{ts::{BigIntExportBehavior, ExportConfig}, TypeMap}; +use specta::{ + ts::{BigIntExportBehavior, ExportConfig}, + TypeMap, +}; use crate::{module::module::Module, util::TripleS}; @@ -16,7 +19,7 @@ impl Router { pub(crate) fn export_config() -> ExportConfig { ExportConfig::default().bigint(BigIntExportBehavior::BigInt) } - + pub fn new() -> Self { Self { modules: HashMap::new(), diff --git a/external/prisma-client-rust/.cargo/config.toml b/external/prisma-client-rust/.cargo/config.toml new file mode 100644 index 0000000..5c8d8d7 --- /dev/null +++ b/external/prisma-client-rust/.cargo/config.toml @@ -0,0 +1,4 @@ +[alias] +run-tests = "test -p integration-tests -- --test-threads 1" +prisma = "run -p prisma-cli --" + diff --git a/external/prisma-client-rust/.gitignore b/external/prisma-client-rust/.gitignore new file mode 100644 index 0000000..c8eed11 --- /dev/null +++ b/external/prisma-client-rust/.gitignore @@ -0,0 +1,10 @@ +target +.idea +DS_STORE +.DS_Store +db*.rs +db/ +dev.db +node_modules +.next +.env diff --git a/external/prisma-client-rust/.vscode/settings.json b/external/prisma-client-rust/.vscode/settings.json new file mode 100644 index 0000000..9a2214b --- /dev/null +++ b/external/prisma-client-rust/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "rust-analyzer.files.excludeDirs": ["**/db"], + "rust-analyzer.checkOnSave.enable": false, + "conventionalCommits.scopes": [ + "codegen" + ] +} diff --git a/external/prisma-client-rust/CODE_OF_CONDUCT.md b/external/prisma-client-rust/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..ae72fc5 --- /dev/null +++ b/external/prisma-client-rust/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to make participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies within all project spaces, and it also applies when +an individual is representing the project or its community in public spaces. +Examples of representing a project or community include using an official +project e-mail address, posting via an official social media account, or acting +as an appointed representative at an online or offline event. Representation of +a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at brendonovich@outlook.com. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq diff --git a/external/prisma-client-rust/Cargo.lock b/external/prisma-client-rust/Cargo.lock new file mode 100644 index 0000000..bdf40c1 --- /dev/null +++ b/external/prisma-client-rust/Cargo.lock @@ -0,0 +1,8965 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +dependencies = [ + "lazy_static", + "regex", +] + +[[package]] +name = "actix-codec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57a7559404a7f3573127aab53c08ce37a6c6a315c374a31070f3c91cd1b4a7fe" +dependencies = [ + "bitflags 1.3.2", + "bytes", + "futures-core", + "futures-sink", + "log", + "memchr", + "pin-project-lite", + "tokio", + "tokio-util 0.7.8", +] + +[[package]] +name = "actix-example" +version = "0.1.0" +dependencies = [ + "actix-web", + "prisma-client-rust", + "serde", +] + +[[package]] +name = "actix-http" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2079246596c18b4a33e274ae10c0e50613f4d32a4198e09c7b93771013fed74" +dependencies = [ + "actix-codec", + "actix-rt", + "actix-service", + "actix-utils", + "ahash 0.8.11", + "base64 0.21.0", + "bitflags 1.3.2", + "brotli", + "bytes", + "bytestring", + "derive_more", + "encoding_rs", + "flate2", + "futures-core", + "h2", + "http 0.2.9", + "httparse", + "httpdate", + "itoa 1.0.6", + "language-tags", + "local-channel", + "mime", + "percent-encoding", + "pin-project-lite", + "rand 0.8.5", + "sha1", + "smallvec", + "tokio", + "tokio-util 0.7.8", + "tracing", + "zstd", +] + +[[package]] +name = "actix-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "465a6172cf69b960917811022d8f29bc0b7fa1398bc4f78b3c466673db1213b6" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "actix-router" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66ff4d247d2b160861fa2866457e85706833527840e4133f8f49aa423a38799" +dependencies = [ + "bytestring", + "http 0.2.9", + "regex", + "serde", + "tracing", +] + +[[package]] +name = "actix-rt" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15265b6b8e2347670eb363c47fc8c75208b4a4994b27192f345fcbe707804f3e" +dependencies = [ + "futures-core", + "tokio", +] + +[[package]] +name = "actix-server" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e8613a75dd50cc45f473cee3c34d59ed677c0f7b44480ce3b8247d7dc519327" +dependencies = [ + "actix-rt", + "actix-service", + "actix-utils", + "futures-core", + "futures-util", + "mio", + "num_cpus", + "socket2 0.4.9", + "tokio", + "tracing", +] + +[[package]] +name = "actix-service" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b894941f818cfdc7ccc4b9e60fa7e53b5042a2e8567270f9147d5591893373a" +dependencies = [ + "futures-core", + "paste", + "pin-project-lite", +] + +[[package]] +name = "actix-utils" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a1dcdff1466e3c2488e1cb5c36a71822750ad43839937f85d2f4d9f8b705d8" +dependencies = [ + "local-waker", + "pin-project-lite", +] + +[[package]] +name = "actix-web" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd3cb42f9566ab176e1ef0b8b3a896529062b4efc6be0123046095914c4c1c96" +dependencies = [ + "actix-codec", + "actix-http", + "actix-macros", + "actix-router", + "actix-rt", + "actix-server", + "actix-service", + "actix-utils", + "actix-web-codegen", + "ahash 0.7.6", + "bytes", + "bytestring", + "cfg-if", + "cookie 0.16.2", + "derive_more", + "encoding_rs", + "futures-core", + "futures-util", + "http 0.2.9", + "itoa 1.0.6", + "language-tags", + "log", + "mime", + "once_cell", + "pin-project-lite", + "regex", + "serde", + "serde_json", + "serde_urlencoded", + "smallvec", + "socket2 0.4.9", + "time", + "url", +] + +[[package]] +name = "actix-web-codegen" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2262160a7ae29e3415554a3f1fc04c764b1540c116aa524683208078b7a75bc9" +dependencies = [ + "actix-router", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "addr2line" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "ahash" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +dependencies = [ + "getrandom 0.2.9", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "getrandom 0.2.9", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "0.7.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +dependencies = [ + "memchr", +] + +[[package]] +name = "aho-corasick" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "allocator-api2" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" + +[[package]] +name = "arrayvec" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" + +[[package]] +name = "ascii" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" + +[[package]] +name = "ascii_utils" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71938f30533e4d95a6d17aa530939da3842c2ab6f4f84b9dae68447e4129f74a" + +[[package]] +name = "async-graphql" +version = "3.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2106123e9c79a8d649bf0f7e9f58462a90ce2ca71ad9a0b69b4f2b67382c376f" +dependencies = [ + "async-graphql-derive", + "async-graphql-parser", + "async-graphql-value", + "async-stream", + "async-trait", + "bytes", + "fast_chemail", + "fnv", + "futures-util", + "http 0.2.9", + "indexmap 1.9.3", + "mime", + "multer", + "num-traits", + "once_cell", + "pin-project-lite", + "regex", + "serde", + "serde_json", + "static_assertions", + "tempfile", + "thiserror", +] + +[[package]] +name = "async-graphql-axum" +version = "3.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135713bf3439ac3325f29281fd88725a71f95dc621fd49b7f064333d099a5b35" +dependencies = [ + "async-graphql", + "async-trait", + "axum 0.5.17", + "bytes", + "futures-util", + "http-body 0.4.5", + "serde_json", + "serde_urlencoded", + "tokio-util 0.6.10", + "tower-service", +] + +[[package]] +name = "async-graphql-derive" +version = "3.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a6ec150ac445a660169a3ad5075b953a7351ec75fe28095e639f6282aac9fdb" +dependencies = [ + "Inflector", + "async-graphql-parser", + "darling 0.13.4", + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", + "thiserror", +] + +[[package]] +name = "async-graphql-parser" +version = "3.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0302764f05e0e50fd3b381646d4a0ed07d4ce5c9fc1eaf79bbd7745bd4893adb" +dependencies = [ + "async-graphql-value", + "pest", + "pest_derive", + "serde", + "serde_json", +] + +[[package]] +name = "async-graphql-value" +version = "3.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba2e19876bcd2068f597fd0182f4ba602ce3c89cb04c4b8810d7c36f44724e92" +dependencies = [ + "bytes", + "indexmap 1.9.3", + "serde", + "serde_json", +] + +[[package]] +name = "async-native-tls" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d57d4cec3c647232e1094dc013546c0b33ce785d8aeb251e1f20dfaf8a9a13fe" +dependencies = [ + "futures-util", + "native-tls", + "thiserror", + "url", +] + +[[package]] +name = "async-stream" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.61", +] + +[[package]] +name = "async-trait" +version = "0.1.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.61", +] + +[[package]] +name = "asynchronous-codec" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06a0daa378f5fd10634e44b0a29b2a87b890657658e072a30d6f26e57ddee182" +dependencies = [ + "bytes", + "futures-sink", + "futures-util", + "memchr", + "pin-project-lite", +] + +[[package]] +name = "atk" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4af014b17dd80e8af9fa689b2d4a211ddba6eb583c1622f35d0cb543f6b17e4" +dependencies = [ + "atk-sys", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "251e0b7d90e33e0ba930891a505a9a35ece37b2dd37a14f3ffc306c13b980009" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "atomic" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b88d82667eca772c4aa12f0f1348b3ae643424c8876448f3f7bd5787032e234c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "atomic-shim" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67cd4b51d303cf3501c301e8125df442128d3c6d7c69f71b27833d253de47e77" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi 0.1.19", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "axum" +version = "0.5.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acee9fd5073ab6b045a275b3e709c163dd36c90685219cb21804a147b58dba43" +dependencies = [ + "async-trait", + "axum-core 0.2.9", + "base64 0.13.1", + "bitflags 1.3.2", + "bytes", + "futures-util", + "headers", + "http 0.2.9", + "http-body 0.4.5", + "hyper 0.14.26", + "itoa 1.0.6", + "matchit 0.5.0", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "sha-1", + "sync_wrapper", + "tokio", + "tokio-tungstenite", + "tower", + "tower-http", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8175979259124331c1d7bf6586ee7e0da434155e4b2d48ec2c8386281d8df39" +dependencies = [ + "async-trait", + "axum-core 0.3.4", + "bitflags 1.3.2", + "bytes", + "futures-util", + "http 0.2.9", + "http-body 0.4.5", + "hyper 0.14.26", + "itoa 1.0.6", + "matchit 0.7.0", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37e5939e02c56fecd5c017c37df4238c0a839fa76b7f97acdd7efb804fd181cc" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http 0.2.9", + "http-body 0.4.5", + "mime", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http 0.2.9", + "http-body 0.4.5", + "mime", + "rustversion", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-graphql-example" +version = "0.1.0" +dependencies = [ + "async-graphql", + "async-graphql-axum", + "axum 0.5.17", + "dotenvy", + "prisma-client-rust", + "serde", + "tokio", +] + +[[package]] +name = "axum-rest-example" +version = "0.1.1" +dependencies = [ + "axum 0.6.18", + "prisma-client-rust", + "serde", + "tokio", +] + +[[package]] +name = "backtrace" +version = "0.3.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide 0.6.2", + "object", + "rustc-demangle", +] + +[[package]] +name = "base-x" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" + +[[package]] +name = "base36" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9c26bddc1271f7112e5ec797e8eeba6de2de211c1488e506b9500196dbf77c5" +dependencies = [ + "base-x", + "failure", +] + +[[package]] +name = "base64" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "basic-example" +version = "0.1.0" +dependencies = [ + "prisma-client-rust", + "serde", + "tokio", + "tracing", +] + +[[package]] +name = "bigdecimal" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aaf33151a6429fe9211d1b276eafdf70cdff28b071e76c0b0e1503221ea3744" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "bigdecimal" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06619be423ea5bb86c95f087d5707942791a08a85530df0db2209a3ecfb8bc9" +dependencies = [ + "autocfg", + "libm", + "num-bigint", + "num-integer", + "num-traits", + "serde", +] + +[[package]] +name = "bigint" +version = "4.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0e8c8a600052b52482eff2cf4d810e462fdff1f656ac1ecb6232132a1ed7def" +dependencies = [ + "byteorder", + "crunchy", +] + +[[package]] +name = "binascii" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "383d29d513d8764dcdc42ea295d979eb99c3c9f00607b3692cf68a431f7dca72" + +[[package]] +name = "bindgen" +version = "0.59.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bd2a9a458e8f4304c52c43ebb0cfbd520289f8379a52e329a38afda99bf8eb8" +dependencies = [ + "bitflags 1.3.2", + "cexpr", + "clang-sys", + "lazy_static", + "lazycell", + "peeking_take_while", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", +] + +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +dependencies = [ + "serde", +] + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "borsh" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4114279215a005bc675e386011e594e1d9b800918cea18fcadadcce864a2046b" +dependencies = [ + "borsh-derive", + "hashbrown 0.13.2", +] + +[[package]] +name = "borsh-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0754613691538d51f329cce9af41d7b7ca150bc973056f1156611489475f54f7" +dependencies = [ + "borsh-derive-internal", + "borsh-schema-derive-internal", + "proc-macro-crate 0.1.5", + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "borsh-derive-internal" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afb438156919598d2c7bad7e1c0adf3d26ed3840dbc010db1a882a65583ca2fb" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "borsh-schema-derive-internal" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634205cc43f74a1b9046ef87c4540ebda95696ec0f315024860cad7c5b0f5ccd" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "brotli" +version = "3.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "2.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b6561fd3f895a11e8f72af2cb7d22e08366bebc2b6b57f7744c4bda27034744" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bson" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aeb8bae494e49dbc330dd23cf78f6f7accee22f640ce3ab17841badaa4ce232" +dependencies = [ + "ahash 0.7.6", + "base64 0.13.1", + "bitvec", + "chrono", + "hex", + "indexmap 1.9.3", + "js-sys", + "lazy_static", + "rand 0.8.5", + "serde", + "serde_bytes", + "serde_json", + "time", + "uuid", +] + +[[package]] +name = "builtin-psl-connectors" +version = "0.1.0" +source = "git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched#75852858f43e426c423b263f7e1473f49044f788" +dependencies = [ + "connection-string", + "either", + "enumflags2", + "indoc 2.0.5", + "lsp-types", + "once_cell", + "psl-core", + "regex", +] + +[[package]] +name = "bumpalo" +version = "3.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b1ce199063694f33ffb7dd4e0ee620741495c32833cde5aa08f02a0bf96f0c8" + +[[package]] +name = "bytecheck" +version = "0.6.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13fe11640a23eb24562225322cd3e452b93a3d4091d62fab69c70542fcd17d1f" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31225543cb46f81a7e224762764f4a6a0f097b1db0b175f69e8065efaa42de5" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "bytemuck" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +dependencies = [ + "serde", +] + +[[package]] +name = "bytestring" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "238e4886760d98c4f899360c834fa93e62cf7f721ac3c2da375cbdf4b8679aae" +dependencies = [ + "bytes", +] + +[[package]] +name = "cairo-rs" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" +dependencies = [ + "bitflags 2.5.0", + "cairo-sys-rs", + "glib", + "libc", + "once_cell", + "thiserror", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "camino" +version = "1.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +dependencies = [ + "camino", + "cargo-platform", + "semver 1.0.17", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "cargo_toml" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a969e13a7589e9e3e4207e153bae624ade2b5622fb4684a4923b23ec3d57719" +dependencies = [ + "serde", + "toml 0.8.2", +] + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +dependencies = [ + "jobserver", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + +[[package]] +name = "cfb" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" +dependencies = [ + "byteorder", + "fnv", + "uuid", +] + +[[package]] +name = "cfg-expr" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8790cf1286da485c72cf5fc7aeba308438800036ec67d89425924c4807268c9" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77e53693616d3075149f4ead59bdeecd204ac6b8192d8969757601b74bddf00f" + +[[package]] +name = "chrono" +version = "0.4.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-targets 0.48.0", +] + +[[package]] +name = "clang-sys" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "cmake" +version = "0.1.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" +dependencies = [ + "cc", +] + +[[package]] +name = "cocoa" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6140449f97a6e97f9511815c5632d84c8aacf8ac271ad77c559218161a1373c" +dependencies = [ + "bitflags 1.3.2", + "block", + "cocoa-foundation", + "core-foundation", + "core-graphics", + "foreign-types 0.5.0", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "931d3837c286f56e3c58423ce4eba12d08db2374461a785c86f672b08b5650d6" +dependencies = [ + "bitflags 1.3.2", + "block", + "core-foundation", + "core-graphics-types", + "foreign-types 0.3.2", + "libc", + "objc", +] + +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "termcolor", + "unicode-width", +] + +[[package]] +name = "colored" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3616f750b84d8f0de8a58bda93e08e2a81ad3f523089b05f1dffecab48c6cbd" +dependencies = [ + "atty", + "lazy_static", + "winapi", +] + +[[package]] +name = "combine" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" +dependencies = [ + "ascii", + "byteorder", + "either", + "memchr", + "unreachable", +] + +[[package]] +name = "combine" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "connection-string" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "510ca239cf13b7f8d16a2b48f263de7b4f8c566f0af58d901031473c76afb1e3" + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "convert_case" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb4a24b1aaf0fd0ce8b45161144d6f42cd91677fd5940fd431183eb023b3a2b8" + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "cookie" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" +dependencies = [ + "percent-encoding", + "time", + "version_check", +] + +[[package]] +name = "cookie" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7efb37c3e1ccb1ff97164ad95ac1606e8ccd35b3fa0a7d99a304c7f4a428cc24" +dependencies = [ + "percent-encoding", + "time", + "version_check", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "core-graphics" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-graphics-types", + "foreign-types 0.5.0", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2801af0d36612ae591caa9568261fddce32ce6e08a7275ea334a06a4ad021a2c" +dependencies = [ + "cfg-if", + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "memoffset", + "scopeguard", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crunchy" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "cssparser" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa 0.4.8", + "matches", + "phf 0.8.0", + "proc-macro2", + "quote", + "smallvec", + "syn 1.0.109", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfae75de57f2b2e85e8768c3ea840fd159c8f33e2b6522c7835b7abac81be16e" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ctor" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" +dependencies = [ + "quote", + "syn 2.0.61", +] + +[[package]] +name = "cty" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" + +[[package]] +name = "cuid" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5d03ac594f5f9cc680b142fff46f3ad9f197e19272042ebf1a40b383fee6fb" +dependencies = [ + "base36", + "bigint", + "cuid2", + "hostname", + "num", + "once_cell", + "rand 0.8.5", +] + +[[package]] +name = "cuid2" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1debbff0c0f0b54e681296c6f064a78f8ecec8e89e7fcc472443d9f85b98ca9a" +dependencies = [ + "num", + "proptest", + "rand 0.8.5", + "sha3", +] + +[[package]] +name = "cxx" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f61f1b6389c3fe1c316bf8a4dccc90a38208354b330925bce1f74a6c4756eb93" +dependencies = [ + "cc", + "cxxbridge-flags", + "cxxbridge-macro", + "link-cplusplus", +] + +[[package]] +name = "cxx-build" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12cee708e8962df2aeb38f594aae5d827c022b6460ac71a7a3e2c3c2aae5a07b" +dependencies = [ + "cc", + "codespan-reporting", + "once_cell", + "proc-macro2", + "quote", + "scratch", + "syn 2.0.61", +] + +[[package]] +name = "cxxbridge-flags" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7944172ae7e4068c533afbb984114a56c46e9ccddda550499caa222902c7f7bb" + +[[package]] +name = "cxxbridge-macro" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2345488264226bf682893e25de0769f3360aac9957980ec49361b083ddaa5bc5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.61", +] + +[[package]] +name = "darling" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" +dependencies = [ + "darling_core 0.13.4", + "darling_macro 0.13.4", +] + +[[package]] +name = "darling" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0558d22a7b463ed0241e993f76f09f30b126687447751a8638587b864e4b3944" +dependencies = [ + "darling_core 0.20.1", + "darling_macro 0.20.1", +] + +[[package]] +name = "darling_core" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 1.0.109", +] + +[[package]] +name = "darling_core" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab8bfa2e259f8ee1ce5e97824a3c55ec4404a0d772ca7fa96bf19f0752a046eb" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.61", +] + +[[package]] +name = "darling_macro" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" +dependencies = [ + "darling_core 0.13.4", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "darling_macro" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29a358ff9f12ec09c3e61fef9b5a9902623a695a46a917b07f269bff1445611a" +dependencies = [ + "darling_core 0.20.1", + "quote", + "syn 2.0.61", +] + +[[package]] +name = "data-encoding" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23d8666cb01533c39dde32bcbab8e227b4ed6679b2c925eba05feabea39508fb" + +[[package]] +name = "datamodel-renderer" +version = "0.1.0" +source = "git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched#75852858f43e426c423b263f7e1473f49044f788" +dependencies = [ + "base64 0.13.1", + "once_cell", + "psl", + "regex", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_more" +version = "0.99.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +dependencies = [ + "convert_case 0.4.0", + "proc-macro2", + "quote", + "rustc_version 0.4.0", + "syn 1.0.109", +] + +[[package]] +name = "devise" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6eacefd3f541c66fc61433d65e54e0e46e0a029a819a7dbbc7a7b489e8a85f8" +dependencies = [ + "devise_codegen", + "devise_core", +] + +[[package]] +name = "devise_codegen" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8cf4b8dd484ede80fd5c547592c46c3745a617c8af278e2b72bea86b2dfed6" +dependencies = [ + "devise_core", + "quote", +] + +[[package]] +name = "devise_core" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35b50dba0afdca80b187392b24f2499a88c336d5a8493e4b4ccfb608708be56a" +dependencies = [ + "bitflags 2.5.0", + "proc-macro2", + "proc-macro2-diagnostics", + "quote", + "syn 2.0.61", +] + +[[package]] +name = "diagnostics" +version = "0.1.0" +source = "git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched#75852858f43e426c423b263f7e1473f49044f788" +dependencies = [ + "colored", + "indoc 2.0.5", + "pest", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +dependencies = [ + "block-buffer 0.10.4", + "crypto-common", + "subtle", +] + +[[package]] +name = "directories" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f51c5d4ddabd36886dd3e1438cb358cdcb0d7c499cb99cb4ac2e38e18b5cb210" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading", +] + +[[package]] +name = "dlopen2" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1297103d2bbaea85724fcee6294c2d50b1081f9ad47d0f6f6f61eda65315a6" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.61", +] + +[[package]] +name = "dmmf" +version = "0.1.0" +source = "git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched#75852858f43e426c423b263f7e1473f49044f788" +dependencies = [ + "bigdecimal 0.3.0", + "indexmap 1.9.3", + "prisma-models", + "psl", + "schema", + "serde", + "serde_json", +] + +[[package]] +name = "document-features" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e493c573fce17f00dcab13b6ac057994f3ce17d1af4dc39bfd482b83c6eb6157" +dependencies = [ + "litrs", +] + +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + +[[package]] +name = "dpi" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" +dependencies = [ + "serde", +] + +[[package]] +name = "dtoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0" + +[[package]] +name = "dtoa-short" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bde03329ae10e79ede66c9ce4dc930aa8599043b0743008548680f25b91502d6" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dunce" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" + +[[package]] +name = "dyn-clone" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" + +[[package]] +name = "either" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" + +[[package]] +name = "embed-resource" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80663502655af01a2902dff3f06869330782267924bf1788410b74edcd93770a" +dependencies = [ + "cc", + "rustc_version 0.4.0", + "toml 0.7.3", + "vswhom", + "winreg 0.11.0", +] + +[[package]] +name = "embed_plist" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" + +[[package]] +name = "encoding" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec" +dependencies = [ + "encoding-index-japanese", + "encoding-index-korean", + "encoding-index-simpchinese", + "encoding-index-singlebyte", + "encoding-index-tradchinese", +] + +[[package]] +name = "encoding-index-japanese" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91" +dependencies = [ + "encoding_index_tests", +] + +[[package]] +name = "encoding-index-korean" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81" +dependencies = [ + "encoding_index_tests", +] + +[[package]] +name = "encoding-index-simpchinese" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7" +dependencies = [ + "encoding_index_tests", +] + +[[package]] +name = "encoding-index-singlebyte" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a" +dependencies = [ + "encoding_index_tests", +] + +[[package]] +name = "encoding-index-tradchinese" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18" +dependencies = [ + "encoding_index_tests", +] + +[[package]] +name = "encoding_index_tests" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" + +[[package]] +name = "encoding_rs" +version = "0.8.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "endian-type" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" + +[[package]] +name = "enum-as-inner" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21cdad81446a7f7dc43f6a77409efeb9733d2fa65553efef6018ef257c959b73" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "enumflags2" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c041f5090df68b32bcd905365fd51769c8b9d553fe87fde0b683534f10c01bd2" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e9a1f9f7d83e59740248a6e14ecf93929ade55027844dfcea78beafccc15745" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.61", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "failure" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" +dependencies = [ + "backtrace", + "failure_derive", +] + +[[package]] +name = "failure_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "synstructure", +] + +[[package]] +name = "fallible-iterator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" + +[[package]] +name = "fallible-streaming-iterator" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" + +[[package]] +name = "fast_chemail" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "495a39d30d624c2caabe6312bfead73e7717692b44e0b32df168c275a2e8e9e4" +dependencies = [ + "ascii_utils", +] + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + +[[package]] +name = "fdeflate" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d329bdeac514ee06249dabc27877490f17f5d371ec693360768b838e19f3ae10" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "field-offset" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3cf3a800ff6e860c863ca6d4b16fd999db8b752819c1606884047b73e468535" +dependencies = [ + "memoffset", + "rustc_version 0.4.0", +] + +[[package]] +name = "figment" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e56602b469b2201400dec66a66aec5a9b8761ee97cd1b8c96ab2483fcc16cc9" +dependencies = [ + "atomic", + "pear", + "serde", + "toml 0.5.11", + "uncased", + "version_check", +] + +[[package]] +name = "fixedbitset" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86d4de0081402f5e88cdac65c8dcdcc73118c1a7a465e2a05f0da05843a8ea33" + +[[package]] +name = "flate2" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" +dependencies = [ + "crc32fast", + "libz-sys", + "miniz_oxide 0.7.1", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared 0.1.1", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared 0.3.1", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.61", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "frunk" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89c703bf50009f383a0873845357cc400a95fc535f836feddfe015d7df6e1e0" +dependencies = [ + "frunk_core", + "frunk_derives", + "frunk_proc_macros", +] + +[[package]] +name = "frunk_core" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a446d01a558301dca28ef43222864a9fa2bd9a2e71370f769d5d5d5ec9f3537" + +[[package]] +name = "frunk_derives" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b83164912bb4c97cfe0772913c7af7387ee2e00cb6d4636fb65a35b3d0c8f173" +dependencies = [ + "frunk_proc_macro_helpers", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "frunk_proc_macro_helpers" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "015425591bbeb0f5b8a75593340f1789af428e9f887a4f1e36c0c471f067ef50" +dependencies = [ + "frunk_core", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "frunk_proc_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea01524f285deab48affffb342b97f186e657b119c3f1821ac531780e0fbfae0" +dependencies = [ + "frunk_core", + "frunk_proc_macros_impl", + "proc-macro-hack", +] + +[[package]] +name = "frunk_proc_macros_impl" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a802d974cc18ee7fe1a7868fc9ce31086294fd96ba62f8da64ecb44e92a2653" +dependencies = [ + "frunk_core", + "frunk_proc_macro_helpers", + "proc-macro-hack", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" +dependencies = [ + "mac", + "new_debug_unreachable", +] + +[[package]] +name = "futures" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" + +[[package]] +name = "futures-executor" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" + +[[package]] +name = "futures-macro" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.61", +] + +[[package]] +name = "futures-sink" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" + +[[package]] +name = "futures-task" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" + +[[package]] +name = "futures-timer" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" + +[[package]] +name = "futures-util" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "gdk" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5ba081bdef3b75ebcdbfc953699ed2d7417d6bd853347a42a37d76406a33646" +dependencies = [ + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" +dependencies = [ + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", + "once_cell", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gdk-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31ff856cb3386dae1703a920f803abafcc580e9b5f711ca62ed1620c25b51ff2" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkwayland-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a90fbf5c033c65d93792192a49a8efb5bb1e640c419682a58bb96f5ae77f3d4a" +dependencies = [ + "gdk-sys", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkx11" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2ea8a4909d530f79921290389cbd7c34cb9d623bfe970eaae65ca5f9cd9cce" +dependencies = [ + "gdk", + "gdkx11-sys", + "gio", + "glib", + "libc", + "x11", +] + +[[package]] +name = "gdkx11-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fee8f00f4ee46cad2939b8990f5c70c94ff882c3028f3cc5abf950fa4ab53043" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps", + "x11", +] + +[[package]] +name = "generator" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3e123d9ae7c02966b4d892e550bdc32164f05853cd40ab570650ad600596a8a" +dependencies = [ + "cc", + "libc", + "log", + "rustversion", + "windows 0.48.0", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "gimli" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4" + +[[package]] +name = "gio" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "gio-sys", + "glib", + "libc", + "once_cell", + "pin-project-lite", + "smallvec", + "thiserror", +] + +[[package]] +name = "gio-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "winapi", +] + +[[package]] +name = "glib" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" +dependencies = [ + "bitflags 2.5.0", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "memchr", + "once_cell", + "smallvec", + "thiserror", +] + +[[package]] +name = "glib-macros" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" +dependencies = [ + "heck 0.4.1", + "proc-macro-crate 2.0.2", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.61", +] + +[[package]] +name = "glib-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +dependencies = [ + "libc", + "system-deps", +] + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "gobject-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "graphql-parser" +version = "0.3.0" +source = "git+https://github.com/prisma/graphql-parser#6a3f58bd879065588e710cb02b5bd30c1ce182c3" +dependencies = [ + "combine 3.8.1", + "indexmap 1.9.3", + "thiserror", +] + +[[package]] +name = "gtk" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93c4f5e0e20b60e10631a5f06da7fe3dda744b05ad0ea71fee2f47adf865890c" +dependencies = [ + "atk", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771437bf1de2c1c0b496c11505bdf748e26066bbe942dfc8f614c9460f6d7722" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps", +] + +[[package]] +name = "gtk3-macros" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6063efb63db582968fb7df72e1ae68aa6360dcfb0a75143f34fc7d616bad75e" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.61", +] + +[[package]] +name = "h2" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17f8a914c2987b688368b5138aa05321db91f4090cf26118185672ad588bce21" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.9", + "indexmap 1.9.3", + "slab", + "tokio", + "tokio-util 0.7.8", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +dependencies = [ + "ahash 0.7.6", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.6", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.11", +] + +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +dependencies = [ + "ahash 0.8.11", + "allocator-api2", +] + +[[package]] +name = "hashlink" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "312f66718a2d7789ffef4f4b7b213138ed9f1eb3aa1d0d82fc99f88fb3ffd26f" +dependencies = [ + "hashbrown 0.14.3", +] + +[[package]] +name = "headers" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3e372db8e5c0d213e0cd0b9be18be2aca3d44cf2fe30a9d46a65581cd454584" +dependencies = [ + "base64 0.13.1", + "bitflags 1.3.2", + "bytes", + "headers-core", + "http 0.2.9", + "httpdate", + "mime", + "sha1", +] + +[[package]] +name = "headers-core" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" +dependencies = [ + "http 0.2.9", +] + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.6", +] + +[[package]] +name = "hostname" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" +dependencies = [ + "libc", + "match_cfg", + "winapi", +] + +[[package]] +name = "html5ever" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bea68cab48b8459f17cf1c944c67ddc572d272d9f2b274140f223ecb1da4a3b7" +dependencies = [ + "log", + "mac", + "markup5ever", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "http" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +dependencies = [ + "bytes", + "fnv", + "itoa 1.0.6", +] + +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa 1.0.6", +] + +[[package]] +name = "http-body" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +dependencies = [ + "bytes", + "http 0.2.9", + "pin-project-lite", +] + +[[package]] +name = "http-body" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +dependencies = [ + "bytes", + "http 1.1.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" +dependencies = [ + "bytes", + "futures-core", + "http 1.1.0", + "http-body 1.0.0", + "pin-project-lite", +] + +[[package]] +name = "http-range-header" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bfe8eed0a9285ef776bb792479ea3834e8b94e13d615c2f66d03dd50a435a29" + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" + +[[package]] +name = "hyper" +version = "0.14.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http 0.2.9", + "http-body 0.4.5", + "httparse", + "httpdate", + "itoa 1.0.6", + "pin-project-lite", + "socket2 0.4.9", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "httparse", + "itoa 1.0.6", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper 0.14.26", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "hyper-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "hyper 1.3.1", + "pin-project-lite", + "socket2 0.5.7", + "tokio", + "tower", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0722cd7114b7de04316e7ea5456a0bbb20e4adb46fd27a3697adb812cff0f37c" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows 0.48.0", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca" +dependencies = [ + "cxx", + "cxx-build", +] + +[[package]] +name = "ico" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3804960be0bb5e4edb1e1ad67afd321a9ecfd875c3e65c099468fd2717d7cae" +dependencies = [ + "byteorder", + "png", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "include_dir" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18762faeff7122e89e0857b02f7ce6fcc0d101d5e9ad2ad7846cc01d61b7f19e" +dependencies = [ + "include_dir_macros", +] + +[[package]] +name = "include_dir_macros" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b139284b5cf57ecfa712bcc66950bb635b31aff41c188e8a4cfc758eca374a3f" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +dependencies = [ + "equivalent", + "hashbrown 0.14.3", + "serde", +] + +[[package]] +name = "indoc" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa799dd5ed20a7e349f3b4639aa80d74549c81716d9ec4f994c9b5815598306" + +[[package]] +name = "indoc" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5" + +[[package]] +name = "infer" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb33622da908807a06f9513c19b3c1ad50fab3e4137d82a78107d502075aa199" +dependencies = [ + "cfb", +] + +[[package]] +name = "inlinable_string" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb" + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "integration-tests" +version = "0.1.0" +dependencies = [ + "async-trait", + "prisma-client-rust", + "serde", + "serde_json", + "specta 2.0.0-rc.12", + "thiserror", + "tokio", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" +dependencies = [ + "hermit-abi 0.3.1", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "ipconfig" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd302af1b90f2463a98fa5ad469fc212c8e3175a41c3068601bfa2727591c5be" +dependencies = [ + "socket2 0.4.9", + "widestring", + "winapi", + "winreg 0.10.1", +] + +[[package]] +name = "ipnet" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f" + +[[package]] +name = "is-terminal" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" +dependencies = [ + "hermit-abi 0.3.1", + "io-lifetimes", + "rustix", + "windows-sys 0.48.0", +] + +[[package]] +name = "issue-417" +version = "0.1.0" +dependencies = [ + "prisma-client-rust", + "serde", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" + +[[package]] +name = "itoa" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" + +[[package]] +name = "javascriptcore-rs" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" +dependencies = [ + "bitflags 1.3.2", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine 4.6.6", + "jni-sys", + "log", + "thiserror", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec9ad60d674508f3ca8f380a928cfe7b096bc729c4e2dbfe3852bc45da3ab30b" +dependencies = [ + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "json-rpc-api-build" +version = "0.1.0" +source = "git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched#75852858f43e426c423b263f7e1473f49044f788" +dependencies = [ + "backtrace", + "heck 0.3.3", + "serde", + "toml 0.5.11", +] + +[[package]] +name = "jsonrpc-core" +version = "17.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4467ab6dfa369b69e52bd0692e480c4d117410538526a57a304a0f2250fd95e" +dependencies = [ + "futures", + "futures-executor", + "futures-util", + "log", + "serde", + "serde_derive", + "serde_json", +] + +[[package]] +name = "keccak" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3afef3b6eff9ce9d8ff9b3601125eec7f0c8cbac7abd14f355d053fa56c98768" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "keyboard-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" +dependencies = [ + "bitflags 2.5.0", + "serde", + "unicode-segmentation", +] + +[[package]] +name = "kuchikiki" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e4755b7b995046f510a7520c42b2fed58b77bd94d5a87a8eb43d2fd126da8" +dependencies = [ + "cssparser", + "html5ever", + "indexmap 1.9.3", + "matches", + "selectors", +] + +[[package]] +name = "language-tags" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + +[[package]] +name = "lexical" +version = "6.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7aefb36fd43fef7003334742cbf77b243fcd36418a1d1bdd480d613a67968f6" +dependencies = [ + "lexical-core", +] + +[[package]] +name = "lexical-core" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cde5de06e8d4c2faabc400238f9ae1c74d5412d03a7bd067645ccbc47070e46" +dependencies = [ + "lexical-parse-float", + "lexical-parse-integer", + "lexical-util", + "lexical-write-float", + "lexical-write-integer", +] + +[[package]] +name = "lexical-parse-float" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683b3a5ebd0130b8fb52ba0bdc718cc56815b6a097e28ae5a6997d0ad17dc05f" +dependencies = [ + "lexical-parse-integer", + "lexical-util", + "static_assertions", +] + +[[package]] +name = "lexical-parse-integer" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d0994485ed0c312f6d965766754ea177d07f9c00c9b82a5ee62ed5b47945ee9" +dependencies = [ + "lexical-util", + "static_assertions", +] + +[[package]] +name = "lexical-util" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5255b9ff16ff898710eb9eb63cb39248ea8a5bb036bea8085b1a767ff6c4e3fc" +dependencies = [ + "static_assertions", +] + +[[package]] +name = "lexical-write-float" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accabaa1c4581f05a3923d1b4cfd124c329352288b7b9da09e766b0668116862" +dependencies = [ + "lexical-util", + "lexical-write-integer", + "static_assertions", +] + +[[package]] +name = "lexical-write-integer" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1b6f3d1f4422866b68192d62f77bc5c700bee84f3069f2469d7bc8c77852446" +dependencies = [ + "lexical-util", + "static_assertions", +] + +[[package]] +name = "libappindicator" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" +dependencies = [ + "glib", + "gtk", + "gtk-sys", + "libappindicator-sys", + "log", +] + +[[package]] +name = "libappindicator-sys" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" +dependencies = [ + "gtk-sys", + "libloading", + "once_cell", +] + +[[package]] +name = "libc" +version = "0.2.154" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libm" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "348108ab3fba42ec82ff6e9564fc4ca0247bdccdc68dd8af9764bbc79c3c8ffb" + +[[package]] +name = "libsqlite3-sys" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afc22eff61b133b115c6e8c74e818c628d6d5e7a502afea6f64dee076dd94326" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "libz-sys" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ee889ecc9568871456d42f603d6a0ce59ff328d291063a45cbdf0036baf6db" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "line-wrap" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9" +dependencies = [ + "safemem", +] + +[[package]] +name = "link-cplusplus" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5" +dependencies = [ + "cc", +] + +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + +[[package]] +name = "linux-raw-sys" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b64f40e5e03e0d54f03845c8197d0291253cdbedfb1cb46b13c2c117554a9f4c" + +[[package]] +name = "litrs" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9275e0933cf8bb20f008924c0cb07a0692fe54d8064996520bf998de9eb79aa" + +[[package]] +name = "local-channel" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f303ec0e94c6c54447f84f3b0ef7af769858a9c4ef56ef2a986d3dcd4c3fc9c" +dependencies = [ + "futures-core", + "futures-sink", + "futures-util", + "local-waker", +] + +[[package]] +name = "local-waker" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e34f76eb3611940e0e7d53a9aaa4e6a3151f69541a282fd0dad5571420c53ff1" + +[[package]] +name = "lock_api" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" + +[[package]] +name = "loom" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls", + "serde", + "serde_json", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "lru" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999beba7b6e8345721bd280141ed958096a2e4abdf74f67ff4ce49b4b54e47a" +dependencies = [ + "hashbrown 0.12.3", +] + +[[package]] +name = "lru" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6e8aaa3f231bb4bd57b84b2d5dc3ae7f350265df8aa96492e0bc394a1571909" +dependencies = [ + "hashbrown 0.12.3", +] + +[[package]] +name = "lru-cache" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "lsp-types" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2368312c59425dd133cb9a327afee65be0a633a8ce471d248e2202a48f8f68ae" +dependencies = [ + "bitflags 1.3.2", + "serde", + "serde_json", + "serde_repr", + "url", +] + +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "mach" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" +dependencies = [ + "libc", +] + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "markup5ever" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2629bb1404f3d34c2e921f21fd34ba00b206124c81f65c50b43b6aaefeb016" +dependencies = [ + "log", + "phf 0.10.1", + "phf_codegen 0.10.0", + "string_cache", + "string_cache_codegen", + "tendril", +] + +[[package]] +name = "match_cfg" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "matchit" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73cbba799671b762df5a175adf59ce145165747bb891505c43d09aefbbf38beb" + +[[package]] +name = "matchit" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b87248edafb776e59e6ee64a79086f65890d3510f2c656c000bf2a7e8a0aea40" + +[[package]] +name = "md-5" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca" +dependencies = [ + "digest 0.10.6", +] + +[[package]] +name = "md5" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e6bcd6433cff03a4bfc3d9834d504467db1f1cf6d0ea765d37d330249ed629d" + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "memoffset" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +dependencies = [ + "autocfg", +] + +[[package]] +name = "metrics" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e52eb6380b6d2a10eb3434aec0885374490f5b82c8aaf5cd487a183c98be834" +dependencies = [ + "ahash 0.7.6", + "metrics-macros", +] + +[[package]] +name = "metrics" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "142c53885123b68d94108295a09d4afe1a1388ed95b54d5dacd9a454753030f2" +dependencies = [ + "ahash 0.7.6", + "metrics-macros", +] + +[[package]] +name = "metrics-exporter-prometheus" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953cbbb6f9ba4b9304f4df79b98cdc9d14071ed93065a9fca11c00c5d9181b66" +dependencies = [ + "hyper 0.14.26", + "indexmap 1.9.3", + "ipnet", + "metrics 0.19.0", + "metrics-util 0.13.0", + "parking_lot 0.11.2", + "quanta", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "metrics-macros" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49e30813093f757be5cf21e50389a24dc7dbb22c49f23b7e8f51d69b508a5ffa" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "metrics-util" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65a9e83b833e1d2e07010a386b197c13aa199bbd0fca5cf69bfa147972db890a" +dependencies = [ + "aho-corasick 0.7.20", + "atomic-shim", + "crossbeam-epoch", + "crossbeam-utils", + "hashbrown 0.11.2", + "indexmap 1.9.3", + "metrics 0.18.1", + "num_cpus", + "ordered-float", + "parking_lot 0.11.2", + "quanta", + "radix_trie", + "sketches-ddsketch", +] + +[[package]] +name = "metrics-util" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd1f4b69bef1e2b392b2d4a12902f2af90bb438ba4a66aa222d1023fa6561b50" +dependencies = [ + "atomic-shim", + "crossbeam-epoch", + "crossbeam-utils", + "hashbrown 0.11.2", + "metrics 0.19.0", + "num_cpus", + "parking_lot 0.11.2", + "quanta", + "sketches-ddsketch", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" +dependencies = [ + "adler", +] + +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +dependencies = [ + "libc", + "log", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.45.0", +] + +[[package]] +name = "mobc" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc79c4a77e312fee9c7bd4b957c12ad1196db73c4a81e5c0b13f02083c4f7f2f" +dependencies = [ + "async-trait", + "futures-channel", + "futures-core", + "futures-timer", + "futures-util", + "log", + "metrics 0.18.1", + "thiserror", + "tokio", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "mongodb" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe15399de63ad4294c80069967736cbb87ebe467a8cd0629df9cab88a6fbde6" +dependencies = [ + "async-trait", + "base64 0.13.1", + "bitflags 1.3.2", + "bson", + "chrono", + "derivative", + "derive_more", + "futures-core", + "futures-executor", + "futures-io", + "futures-util", + "hex", + "hmac", + "lazy_static", + "md-5", + "pbkdf2", + "percent-encoding", + "rand 0.8.5", + "rustc_version_runtime", + "rustls", + "rustls-pemfile", + "serde", + "serde_bytes", + "serde_with 1.14.0", + "sha-1", + "sha2 0.10.6", + "socket2 0.4.9", + "stringprep", + "strsim", + "take_mut", + "thiserror", + "tokio", + "tokio-rustls", + "tokio-util 0.7.8", + "trust-dns-proto", + "trust-dns-resolver", + "typed-builder", + "uuid", + "webpki-roots", +] + +[[package]] +name = "mongodb-client" +version = "0.1.0" +source = "git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched#75852858f43e426c423b263f7e1473f49044f788" +dependencies = [ + "mongodb", + "once_cell", + "percent-encoding", + "thiserror", +] + +[[package]] +name = "mongodb-query-connector" +version = "0.1.0" +source = "git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched#75852858f43e426c423b263f7e1473f49044f788" +dependencies = [ + "anyhow", + "async-trait", + "bigdecimal 0.3.0", + "bson", + "chrono", + "cuid", + "futures", + "indexmap 1.9.3", + "itertools", + "mongodb", + "mongodb-client", + "prisma-models", + "prisma-value", + "psl", + "query-connector", + "query-engine-metrics", + "rand 0.7.3", + "regex", + "serde", + "serde_json", + "thiserror", + "tokio", + "tracing", + "tracing-futures", + "user-facing-errors", + "uuid", +] + +[[package]] +name = "mongodb-schema-connector" +version = "0.1.0" +source = "git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched#75852858f43e426c423b263f7e1473f49044f788" +dependencies = [ + "convert_case 0.6.0", + "datamodel-renderer", + "enumflags2", + "futures", + "indoc 2.0.5", + "mongodb", + "mongodb-client", + "mongodb-schema-describer", + "once_cell", + "psl", + "regex", + "schema-connector", + "serde_json", + "tokio", + "tracing", + "user-facing-errors", +] + +[[package]] +name = "mongodb-schema-describer" +version = "0.1.0" +source = "git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched#75852858f43e426c423b263f7e1473f49044f788" +dependencies = [ + "futures", + "mongodb", + "serde", +] + +[[package]] +name = "mongodb-tests" +version = "0.1.0" +dependencies = [ + "prisma-client-rust", + "serde", + "tokio", +] + +[[package]] +name = "muda" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6fde56ead0971b4caae4aa0f19502e49d1fac2af9d0c60068e2d235e26ce709" +dependencies = [ + "cocoa", + "crossbeam-channel", + "dpi", + "gtk", + "keyboard-types", + "objc", + "once_cell", + "png", + "serde", + "thiserror", + "windows-sys 0.52.0", +] + +[[package]] +name = "multer" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01acbdc23469fd8fe07ab135923371d5f5a422fbf9c522158677c8eb15bc51c2" +dependencies = [ + "bytes", + "encoding_rs", + "futures-util", + "http 0.2.9", + "httparse", + "log", + "memchr", + "mime", + "spin 0.9.8", + "tokio", + "tokio-util 0.7.8", + "version_check", +] + +[[package]] +name = "mysql_async" +version = "0.31.3" +source = "git+https://github.com/prisma/mysql_async?branch=vendored-openssl#dad187b50dc7e8ce2b61fec126822e8e172a9c8a" +dependencies = [ + "bytes", + "crossbeam", + "flate2", + "futures-core", + "futures-sink", + "futures-util", + "lazy_static", + "lru 0.8.1", + "mio", + "mysql_common", + "native-tls", + "once_cell", + "pem", + "percent-encoding", + "pin-project", + "priority-queue", + "serde", + "serde_json", + "socket2 0.4.9", + "thiserror", + "tokio", + "tokio-native-tls", + "tokio-util 0.7.8", + "twox-hash", + "url", +] + +[[package]] +name = "mysql_common" +version = "0.29.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9006c95034ccf7b903d955f210469119f6c3477fc9c9e7a7845ce38a3e665c2a" +dependencies = [ + "base64 0.13.1", + "bigdecimal 0.3.0", + "bindgen", + "bitflags 1.3.2", + "bitvec", + "byteorder", + "bytes", + "cc", + "cmake", + "crc32fast", + "flate2", + "frunk", + "lazy_static", + "lexical", + "num-bigint", + "num-traits", + "rand 0.8.5", + "regex", + "rust_decimal", + "saturating", + "serde", + "serde_json", + "sha1", + "sha2 0.10.6", + "smallvec", + "subprocess", + "thiserror", + "time", + "uuid", +] + +[[package]] +name = "nanoid" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ffa00dec017b5b1a8b7cf5e2c008bfda1aa7e0697ac1508b491fdf2622fb4d8" +dependencies = [ + "rand 0.8.5", +] + +[[package]] +name = "native-tls" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "ndk" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0" +dependencies = [ + "bitflags 1.3.2", + "jni-sys", + "ndk-sys", + "num_enum", + "raw-window-handle 0.5.0", + "thiserror", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.4.1+23.1.7779620" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cf2aae958bd232cac5069850591667ad422d263686d75b52a065f9badeee5a3" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" + +[[package]] +name = "nibble_vec" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a5d83df9f36fe23f0c3648c6bbb8b0298bb5f1939c8f2704431371f4b84d43" +dependencies = [ + "smallvec", +] + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43db66d1170d347f9a065114077f7dccb00c1b9478c89384490a3425279a4606" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02e0d21255c828d6f128a1e41534206671e8c3ea0c62f32291e808dc82cff17d" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +dependencies = [ + "autocfg", + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +dependencies = [ + "hermit-abi 0.2.6", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "num_threads" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +dependencies = [ + "libc", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", + "objc_exception", +] + +[[package]] +name = "objc_exception" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" +dependencies = [ + "cc", +] + +[[package]] +name = "objc_id" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" +dependencies = [ + "objc", +] + +[[package]] +name = "object" +version = "0.30.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea86265d3d3dcb6a27fc51bd29a4bf387fae9d2986b823079d4986af253eb439" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "openssl" +version = "0.10.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01b8574602df80f7b85fdfc5392fa884a4e3b3f4f35402c070ab34c3d3f78d56" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "foreign-types 0.3.2", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.61", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-src" +version = "111.25.3+1.1.1t" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924757a6a226bf60da5f7dd0311a34d2b52283dd82ddeb103208ddc66362f80c" +dependencies = [ + "cc", +] + +[[package]] +name = "openssl-sys" +version = "0.9.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e17f59264b2809d77ae94f0e1ebabc434773f370d6ca667bd223ea10e06cc7e" +dependencies = [ + "cc", + "libc", + "openssl-src", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "opentelemetry" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6105e89802af13fdf48c49d7646d3b533a70e536d818aae7e78ba0433d01acb8" +dependencies = [ + "async-trait", + "crossbeam-channel", + "futures-channel", + "futures-executor", + "futures-util", + "js-sys", + "lazy_static", + "percent-encoding", + "pin-project", + "rand 0.8.5", + "serde", + "thiserror", + "tokio", + "tokio-stream", +] + +[[package]] +name = "opentls" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f561874f8d6ecfb674fc08863414040c93cc90c0b6963fe679895fab8b65560" +dependencies = [ + "futures-util", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "url", +] + +[[package]] +name = "ordered-float" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7940cf2ca942593318d07fcf2596cdca60a85c9e7fab408a5e21a4f9dcd40d87" +dependencies = [ + "num-traits", +] + +[[package]] +name = "ordermap" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a86ed3f5f244b372d6b1a00b72ef7f8876d0bc6a78a4c9985c53614041512063" + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "pango" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" +dependencies = [ + "gio", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core 0.8.6", +] + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core 0.9.7", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" +dependencies = [ + "cfg-if", + "instant", + "libc", + "redox_syscall 0.2.16", + "smallvec", + "winapi", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.2.16", + "smallvec", + "windows-sys 0.45.0", +] + +[[package]] +name = "parser-database" +version = "0.1.0" +source = "git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched#75852858f43e426c423b263f7e1473f49044f788" +dependencies = [ + "diagnostics", + "either", + "enumflags2", + "indexmap 1.9.3", + "rustc-hash", + "schema-ast", +] + +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest 0.10.6", +] + +[[package]] +name = "pear" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec95680a7087503575284e5063e14b694b7a9c0b065e5dceec661e0497127e8" +dependencies = [ + "inlinable_string", + "pear_codegen", + "yansi", +] + +[[package]] +name = "pear_codegen" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9661a3a53f93f09f2ea882018e4d7c88f6ff2956d809a276060476fd8c879d3c" +dependencies = [ + "proc-macro2", + "proc-macro2-diagnostics", + "quote", + "syn 2.0.61", +] + +[[package]] +name = "peeking_take_while" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" + +[[package]] +name = "pem" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" +dependencies = [ + "base64 0.13.1", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pest" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e68e84bfb01f0507134eac1e9b410a12ba379d064eab48c50ba4ce329a527b70" +dependencies = [ + "thiserror", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b79d4c71c865a25a4322296122e3924d30bc8ee0834c8bfc8b95f7f054afbfb" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c435bf1076437b851ebc8edc3a18442796b30f1728ffea6262d59bbe28b077e" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn 2.0.61", +] + +[[package]] +name = "pest_meta" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "745a452f8eb71e39ffd8ee32b3c5f51d03845f99786fa9b68db6ff509c505411" +dependencies = [ + "once_cell", + "pest", + "sha2 0.10.6", +] + +[[package]] +name = "petgraph" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3659d1ee90221741f65dd128d9998311b0e40c5d3c23a62445938214abce4f" +dependencies = [ + "fixedbitset", + "ordermap", +] + +[[package]] +name = "phf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +dependencies = [ + "phf_macros 0.8.0", + "phf_shared 0.8.0", + "proc-macro-hack", +] + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_shared 0.10.0", +] + +[[package]] +name = "phf" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928c6535de93548188ef63bb7c4036bd415cd8f36ad25af44b9789b2ee72a48c" +dependencies = [ + "phf_macros 0.11.1", + "phf_shared 0.11.1", +] + +[[package]] +name = "phf_codegen" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", +] + +[[package]] +name = "phf_codegen" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", +] + +[[package]] +name = "phf_generator" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" +dependencies = [ + "phf_shared 0.8.0", + "rand 0.7.3", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand 0.8.5", +] + +[[package]] +name = "phf_generator" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1181c94580fa345f50f19d738aaa39c0ed30a600d95cb2d3e23f94266f14fbf" +dependencies = [ + "phf_shared 0.11.1", + "rand 0.8.5", +] + +[[package]] +name = "phf_macros" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "phf_macros" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92aacdc5f16768709a569e913f7451034034178b05bdc8acda226659a3dccc66" +dependencies = [ + "phf_generator 0.11.1", + "phf_shared 0.11.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1fb5f6f826b772a8d4c0394209441e7d37cbbb967ae9c7e0e8134365c9ee676" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" + +[[package]] +name = "plist" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bd9647b268a3d3e14ff09c23201133a62589c658db02bb7388c7246aafe0590" +dependencies = [ + "base64 0.21.0", + "indexmap 1.9.3", + "line-wrap", + "quick-xml", + "serde", + "time", +] + +[[package]] +name = "png" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aaeebc51f9e7d2c150d3f3bfeb667f2aa985db5ef1e3d212847bdedb488beeaa" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide 0.7.1", +] + +[[package]] +name = "postgres-native-tls" +version = "0.5.0" +source = "git+https://github.com/prisma/rust-postgres?rev=00d4815e58859261bdfca71c75be7dc657303f7d#00d4815e58859261bdfca71c75be7dc657303f7d" +dependencies = [ + "native-tls", + "tokio", + "tokio-native-tls", + "tokio-postgres", +] + +[[package]] +name = "postgres-protocol" +version = "0.6.4" +source = "git+https://github.com/prisma/rust-postgres?rev=00d4815e58859261bdfca71c75be7dc657303f7d#00d4815e58859261bdfca71c75be7dc657303f7d" +dependencies = [ + "base64 0.13.1", + "byteorder", + "bytes", + "fallible-iterator", + "hmac", + "md-5", + "memchr", + "rand 0.8.5", + "sha2 0.10.6", + "stringprep", +] + +[[package]] +name = "postgres-tests" +version = "0.1.0" +dependencies = [ + "prisma-client-rust", + "serde", + "tokio", +] + +[[package]] +name = "postgres-types" +version = "0.2.4" +source = "git+https://github.com/prisma/rust-postgres?rev=00d4815e58859261bdfca71c75be7dc657303f7d#00d4815e58859261bdfca71c75be7dc657303f7d" +dependencies = [ + "bit-vec", + "bytes", + "chrono", + "fallible-iterator", + "postgres-protocol", + "serde", + "serde_json", + "uuid", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "pretty-hex" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6fa0831dd7cc608c38a5e323422a0077678fa5744aa2be4ad91c4ece8eec8d5" + +[[package]] +name = "priority-queue" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca9c6be70d989d21a136eb86c2d83e4b328447fac4a88dace2143c179c86267" +dependencies = [ + "autocfg", + "indexmap 1.9.3", +] + +[[package]] +name = "prisma-cli" +version = "0.0.0" +dependencies = [ + "prisma-client-rust-cli", +] + +[[package]] +name = "prisma-client-rust" +version = "0.6.8" +dependencies = [ + "base64 0.13.1", + "bigdecimal 0.3.0", + "bigdecimal 0.4.2", + "chrono", + "diagnostics", + "dotenvy", + "futures", + "include_dir", + "indexmap 1.9.3", + "paste", + "prisma-client-rust-generator-macros", + "prisma-models", + "psl", + "query-core", + "request-handlers", + "rspc", + "schema-core", + "serde", + "serde-value", + "serde_json", + "specta 2.0.0-rc.12", + "tempfile", + "thiserror", + "tokio", + "tracing", + "user-facing-errors", + "uuid", +] + +[[package]] +name = "prisma-client-rust-cli" +version = "0.6.8" +dependencies = [ + "directories", + "flate2", + "http 0.2.9", + "prisma-client-rust-generator", + "proc-macro2", + "quote", + "regex", + "reqwest 0.11.17", + "serde", + "serde_json", + "serde_path_to_error", + "syn 1.0.109", + "thiserror", +] + +[[package]] +name = "prisma-client-rust-generator" +version = "0.6.8" +dependencies = [ + "directories", + "flate2", + "http 0.2.9", + "prisma-client-rust-generator-shared", + "prisma-client-rust-sdk", + "proc-macro2", + "quote", + "regex", + "reqwest 0.11.17", + "serde", + "serde_json", + "serde_path_to_error", + "syn 1.0.109", + "thiserror", +] + +[[package]] +name = "prisma-client-rust-generator-macros" +version = "0.6.8" +dependencies = [ + "convert_case 0.6.0", + "prisma-client-rust-generator-shared", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "prisma-client-rust-generator-shared" +version = "0.1.0" +dependencies = [ + "convert_case 0.6.0", + "prisma-client-rust-sdk", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "prisma-client-rust-sdk" +version = "0.6.8" +dependencies = [ + "convert_case 0.5.0", + "dmmf", + "prisma-models", + "proc-macro2", + "psl", + "query-core", + "quote", + "request-handlers", + "serde", + "serde_json", + "serde_path_to_error", + "syn 1.0.109", + "thiserror", +] + +[[package]] +name = "prisma-client-rust-tauri-example" +version = "0.0.0" +dependencies = [ + "prisma-client-rust", + "serde", + "serde_json", + "specta 2.0.0-rc.12", + "tauri", + "tauri-build", + "tauri-specta", + "tokio", +] + +[[package]] +name = "prisma-models" +version = "0.0.0" +source = "git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched#75852858f43e426c423b263f7e1473f49044f788" +dependencies = [ + "bigdecimal 0.3.0", + "chrono", + "cuid", + "itertools", + "nanoid", + "prisma-value", + "psl", + "thiserror", + "uuid", +] + +[[package]] +name = "prisma-value" +version = "0.1.0" +source = "git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched#75852858f43e426c423b263f7e1473f49044f788" +dependencies = [ + "base64 0.13.1", + "bigdecimal 0.3.0", + "chrono", + "once_cell", + "regex", + "serde", + "serde_json", + "uuid", +] + +[[package]] +name = "proc-macro-crate" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +dependencies = [ + "toml 0.5.11", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.8", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +dependencies = [ + "toml_datetime", + "toml_edit 0.20.2", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + +[[package]] +name = "proc-macro2" +version = "1.0.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proc-macro2-diagnostics" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "606c4ba35817e2922a308af55ad51bab3645b59eae5c570d4a6cf07e36bd493b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.61", + "version_check", + "yansi", +] + +[[package]] +name = "proptest" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29f1b898011ce9595050a68e60f90bad083ff2987a695a42357134c8381fba70" +dependencies = [ + "bit-set", + "bitflags 1.3.2", + "byteorder", + "lazy_static", + "num-traits", + "quick-error 2.0.1", + "rand 0.8.5", + "rand_chacha 0.3.1", + "rand_xorshift", + "regex-syntax 0.6.29", + "rusty-fork", + "tempfile", + "unarray", +] + +[[package]] +name = "psl" +version = "0.1.0" +source = "git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched#75852858f43e426c423b263f7e1473f49044f788" +dependencies = [ + "builtin-psl-connectors", + "psl-core", +] + +[[package]] +name = "psl-core" +version = "0.1.0" +source = "git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched#75852858f43e426c423b263f7e1473f49044f788" +dependencies = [ + "bigdecimal 0.3.0", + "chrono", + "diagnostics", + "enumflags2", + "indoc 2.0.5", + "itertools", + "lsp-types", + "once_cell", + "parser-database", + "prisma-value", + "regex", + "schema-ast", + "serde", + "serde_json", + "url", +] + +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "quaint" +version = "0.2.0-alpha.13" +source = "git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched#75852858f43e426c423b263f7e1473f49044f788" +dependencies = [ + "async-trait", + "base64 0.12.3", + "bigdecimal 0.3.0", + "bit-vec", + "byteorder", + "bytes", + "chrono", + "connection-string", + "either", + "futures", + "hex", + "lru-cache", + "metrics 0.18.1", + "mobc", + "mysql_async", + "native-tls", + "num_cpus", + "percent-encoding", + "postgres-native-tls", + "postgres-types", + "rusqlite", + "serde_json", + "sqlformat", + "thiserror", + "tiberius", + "tokio", + "tokio-postgres", + "tokio-util 0.6.10", + "tracing", + "tracing-core", + "url", + "uuid", +] + +[[package]] +name = "quanta" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20afe714292d5e879d8b12740aa223c6a88f118af41870e8b6196e39a02238a8" +dependencies = [ + "crossbeam-utils", + "libc", + "mach", + "once_cell", + "raw-cpuid", + "wasi 0.10.2+wasi-snapshot-preview1", + "web-sys", + "winapi", +] + +[[package]] +name = "query-connector" +version = "0.1.0" +source = "git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched#75852858f43e426c423b263f7e1473f49044f788" +dependencies = [ + "anyhow", + "async-trait", + "chrono", + "futures", + "indexmap 1.9.3", + "itertools", + "prisma-models", + "prisma-value", + "serde", + "serde_json", + "thiserror", + "user-facing-errors", + "uuid", +] + +[[package]] +name = "query-core" +version = "0.1.0" +source = "git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched#75852858f43e426c423b263f7e1473f49044f788" +dependencies = [ + "async-trait", + "bigdecimal 0.3.0", + "chrono", + "connection-string", + "crossbeam-channel", + "cuid", + "enumflags2", + "futures", + "indexmap 1.9.3", + "itertools", + "lru 0.7.8", + "once_cell", + "opentelemetry", + "petgraph", + "prisma-models", + "psl", + "query-connector", + "query-engine-metrics", + "schema", + "serde", + "serde_json", + "thiserror", + "tokio", + "tracing", + "tracing-futures", + "tracing-opentelemetry", + "tracing-subscriber", + "user-facing-errors", + "uuid", +] + +[[package]] +name = "query-engine-metrics" +version = "0.1.0" +source = "git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched#75852858f43e426c423b263f7e1473f49044f788" +dependencies = [ + "metrics 0.18.1", + "metrics-exporter-prometheus", + "metrics-util 0.12.1", + "once_cell", + "parking_lot 0.12.1", + "serde", + "serde_json", + "tracing", + "tracing-futures", + "tracing-subscriber", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + +[[package]] +name = "quick-xml" +version = "0.28.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce5e73202a820a31f8a0ee32ada5e21029c81fd9e3ebf668a40832e4219d9d1" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "radix_trie" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c069c179fcdc6a2fe24d8d18305cf085fdbd4f922c041943e203685d6a1c58fd" +dependencies = [ + "endian-type", + "nibble_vec", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", + "rand_pcg", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.9", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "raw-cpuid" +version = "10.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c297679cb867470fa8c9f67dbba74a78d78e3e98d7cf2b08d6d71540f797332" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "raw-window-handle" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed7e3d950b66e19e0c372f3fa3fbbcf85b1746b571f74e0c2af6042a5c93420a" +dependencies = [ + "cty", +] + +[[package]] +name = "raw-window-handle" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cc3bcbdb1ddfc11e700e62968e6b4cc9c75bb466464ad28fb61c5b2c964418b" + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +dependencies = [ + "getrandom 0.2.9", + "redox_syscall 0.2.16", + "thiserror", +] + +[[package]] +name = "ref-cast" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f43faa91b1c8b36841ee70e97188a869d37ae21759da6846d4be66de5bf7b12c" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d2275aab483050ab2a7364c1a46604865ee7d6906684e08db0f090acf74f9e7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.61", +] + +[[package]] +name = "regex" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" +dependencies = [ + "aho-corasick 1.0.1", + "memchr", + "regex-syntax 0.7.1", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" + +[[package]] +name = "rend" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581008d2099240d37fb08d77ad713bcaec2c4d89d50b5b21a8bb1996bbab68ab" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "request-handlers" +version = "0.1.0" +source = "git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched#75852858f43e426c423b263f7e1473f49044f788" +dependencies = [ + "bigdecimal 0.3.0", + "connection-string", + "dmmf", + "futures", + "graphql-parser", + "indexmap 1.9.3", + "itertools", + "mongodb-query-connector", + "once_cell", + "prisma-models", + "psl", + "query-core", + "serde", + "serde_json", + "sql-query-connector", + "thiserror", + "tracing", + "url", + "user-facing-errors", +] + +[[package]] +name = "reqwest" +version = "0.11.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13293b639a097af28fc8a90f22add145a9c954e49d77da06263d58cf44d5fb91" +dependencies = [ + "base64 0.21.0", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http 0.2.9", + "http-body 0.4.5", + "hyper 0.14.26", + "hyper-tls", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg 0.10.1", +] + +[[package]] +name = "reqwest" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", + "hyper 1.3.1", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-util 0.7.8", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "winreg 0.52.0", +] + +[[package]] +name = "resolv-conf" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" +dependencies = [ + "hostname", + "quick-error 1.2.3", +] + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin 0.5.2", + "untrusted", + "web-sys", + "winapi", +] + +[[package]] +name = "rkyv" +version = "0.7.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21499ed91807f07ae081880aabb2ccc0235e9d88011867d984525e9a4c3cfa3e" +dependencies = [ + "bytecheck", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac1c672430eb41556291981f45ca900a0239ad007242d1cb4b4167af842db666" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "rocket" +version = "0.5.0-rc.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58734f7401ae5cfd129685b48f61182331745b357b96f2367f01aebaf1cc9cc9" +dependencies = [ + "async-stream", + "async-trait", + "atomic", + "binascii", + "bytes", + "either", + "figment", + "futures", + "indexmap 1.9.3", + "is-terminal", + "log", + "memchr", + "multer", + "num_cpus", + "parking_lot 0.12.1", + "pin-project-lite", + "rand 0.8.5", + "ref-cast", + "rocket_codegen", + "rocket_http", + "serde", + "serde_json", + "state 0.5.3", + "tempfile", + "time", + "tokio", + "tokio-stream", + "tokio-util 0.7.8", + "ubyte", + "version_check", + "yansi", +] + +[[package]] +name = "rocket-example" +version = "0.1.0" +dependencies = [ + "prisma-client-rust", + "rocket", + "serde", +] + +[[package]] +name = "rocket_codegen" +version = "0.5.0-rc.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7093353f14228c744982e409259fb54878ba9563d08214f2d880d59ff2fc508b" +dependencies = [ + "devise", + "glob", + "indexmap 1.9.3", + "proc-macro2", + "quote", + "rocket_http", + "syn 2.0.61", + "unicode-xid", +] + +[[package]] +name = "rocket_http" +version = "0.5.0-rc.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "936012c99162a03a67f37f9836d5f938f662e26f2717809761a9ac46432090f4" +dependencies = [ + "cookie 0.17.0", + "either", + "futures", + "http 0.2.9", + "hyper 0.14.26", + "indexmap 1.9.3", + "log", + "memchr", + "pear", + "percent-encoding", + "pin-project-lite", + "ref-cast", + "serde", + "smallvec", + "stable-pattern", + "state 0.5.3", + "time", + "tokio", + "uncased", +] + +[[package]] +name = "rspc" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c68477fb8c11280503aeab140c41b7a0eed57156a73185062ffb4782c18a918f" +dependencies = [ + "futures", + "serde", + "serde_json", + "specta 1.0.5", + "thiserror", + "tokio", +] + +[[package]] +name = "rspc-example" +version = "0.1.0" +dependencies = [ + "prisma-client-rust", + "rspc", + "serde", + "tokio", +] + +[[package]] +name = "rusqlite" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "549b9d036d571d42e6e85d1c1425e2ac83491075078ca9a15be021c56b1641f2" +dependencies = [ + "bitflags 2.5.0", + "chrono", + "fallible-iterator", + "fallible-streaming-iterator", + "hashlink", + "libsqlite3-sys", + "smallvec", +] + +[[package]] +name = "rust_decimal" +version = "1.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26bd36b60561ee1fb5ec2817f198b6fd09fa571c897a5e86d1487cfc2b096dfc" +dependencies = [ + "arrayvec", + "borsh", + "bytecheck", + "byteorder", + "bytes", + "num-traits", + "rand 0.8.5", + "rkyv", + "serde", + "serde_json", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc_version" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +dependencies = [ + "semver 0.9.0", +] + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver 1.0.17", +] + +[[package]] +name = "rustc_version_runtime" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d31b7153270ebf48bf91c65ae5b0c00e749c4cfad505f66530ac74950249582f" +dependencies = [ + "rustc_version 0.2.3", + "semver 0.9.0", +] + +[[package]] +name = "rustix" +version = "0.37.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bbfc1d1c7c40c01715f47d71444744a81669ca84e8b63e25a55e169b1f86433" +dependencies = [ + "bitflags 1.3.2", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustls" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" +dependencies = [ + "log", + "ring", + "sct", + "webpki", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b" +dependencies = [ + "base64 0.21.0", +] + +[[package]] +name = "rustversion" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" + +[[package]] +name = "rusty-fork" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +dependencies = [ + "fnv", + "quick-error 1.2.3", + "tempfile", + "wait-timeout", +] + +[[package]] +name = "ryu" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" + +[[package]] +name = "safemem" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "saturating" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ece8e78b2f38ec51c51f5d475df0a7187ba5111b2a28bdc761ee05b075d40a71" + +[[package]] +name = "schannel" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" +dependencies = [ + "windows-sys 0.42.0", +] + +[[package]] +name = "schema" +version = "0.1.0" +source = "git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched#75852858f43e426c423b263f7e1473f49044f788" +dependencies = [ + "once_cell", + "prisma-models", + "psl", + "rustc-hash", +] + +[[package]] +name = "schema-ast" +version = "0.1.0" +source = "git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched#75852858f43e426c423b263f7e1473f49044f788" +dependencies = [ + "diagnostics", + "pest", + "pest_derive", +] + +[[package]] +name = "schema-connector" +version = "0.1.0" +source = "git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched#75852858f43e426c423b263f7e1473f49044f788" +dependencies = [ + "chrono", + "enumflags2", + "psl", + "quaint", + "serde", + "serde_json", + "sha2 0.9.9", + "tracing", + "tracing-error", + "user-facing-errors", +] + +[[package]] +name = "schema-core" +version = "0.1.0" +source = "git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched#75852858f43e426c423b263f7e1473f49044f788" +dependencies = [ + "async-trait", + "chrono", + "enumflags2", + "json-rpc-api-build", + "jsonrpc-core", + "mongodb-schema-connector", + "psl", + "schema-connector", + "serde", + "serde_json", + "sql-schema-connector", + "tokio", + "tracing", + "tracing-futures", + "tracing-subscriber", + "url", + "user-facing-errors", +] + +[[package]] +name = "schemars" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6e7ed6919cb46507fb01ff1654309219f62b4d603822501b0b80d42f6f21ef" +dependencies = [ + "dyn-clone", + "indexmap 1.9.3", + "schemars_derive", + "serde", + "serde_json", + "url", +] + +[[package]] +name = "schemars_derive" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "185f2b7aa7e02d418e453790dde16890256bbd2bcd04b7dc5348811052b53f49" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.61", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scratch" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1792db035ce95be60c3f8853017b3999209281c24e2ba5bc8e59bf97a0c590c1" + +[[package]] +name = "sct" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "sdk-example-app" +version = "0.1.0" +dependencies = [ + "prisma-client-rust", + "sdk-example-lib", + "serde", + "tokio", +] + +[[package]] +name = "sdk-example-generator" +version = "0.1.0" +dependencies = [ + "prisma-client-rust-sdk", + "serde", + "thiserror", +] + +[[package]] +name = "sdk-example-lib" +version = "0.1.0" + +[[package]] +name = "sdk-example-prisma-cli" +version = "0.1.0" +dependencies = [ + "prisma-client-rust-cli", + "sdk-example-generator", +] + +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "security-framework" +version = "2.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "selectors" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" +dependencies = [ + "bitflags 1.3.2", + "cssparser", + "derive_more", + "fxhash", + "log", + "matches", + "phf 0.8.0", + "phf_codegen 0.8.0", + "precomputed-hash", + "servo_arc", + "smallvec", + "thin-slice", +] + +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" +dependencies = [ + "serde", +] + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + +[[package]] +name = "serde" +version = "1.0.201" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "780f1cebed1629e4753a1a38a3c72d30b97ec044f0aef68cb26650a3c5cf363c" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-value" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" +dependencies = [ + "ordered-float", + "serde", +] + +[[package]] +name = "serde_bytes" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "416bda436f9aab92e02c8e10d49a15ddd339cea90b6e340fe51ed97abb548294" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.201" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e405930b9796f1c00bee880d03fc7e0bb4b9a11afc776885ffe84320da2865" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.61", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330f01ce65a3a5fe59a60c82f3c9a024b573b8a6e875bd233fe5f934e71d54e3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.61", +] + +[[package]] +name = "serde_json" +version = "1.0.96" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" +dependencies = [ + "indexmap 1.9.3", + "itoa 1.0.6", + "ryu", + "serde", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7f05c1d5476066defcdfacce1f52fc3cae3af1d3089727100c02ae92e5abbe0" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcec881020c684085e55a25f7fd888954d56609ef363479dc5a1305eb0d40cab" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.61", +] + +[[package]] +name = "serde_spanned" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa 1.0.6", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff" +dependencies = [ + "serde", + "serde_with_macros 1.5.2", +] + +[[package]] +name = "serde_with" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad483d2ab0149d5a5ebcd9972a3852711e0153d863bf5a5d0391d28883c4a20" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.1.0", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros 3.8.1", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" +dependencies = [ + "darling 0.13.4", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "serde_with_macros" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65569b702f41443e8bc8bbb1c5779bd0450bbe723b56198980e80ec45780bce2" +dependencies = [ + "darling 0.20.1", + "proc-macro2", + "quote", + "syn 2.0.61", +] + +[[package]] +name = "serialize-to-javascript" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "servo_arc" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432" +dependencies = [ + "nodrop", + "stable_deref_trait", +] + +[[package]] +name = "sha-1" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.6", +] + +[[package]] +name = "sha1" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.6", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.6", +] + +[[package]] +name = "sha3" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54c2bb1a323307527314a36bfb73f24febb08ce2b8a554bf4ffd6f51ad15198c" +dependencies = [ + "digest 0.10.6", + "keccak", +] + +[[package]] +name = "sharded-slab" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" + +[[package]] +name = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + +[[package]] +name = "simd-adler32" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "238abfbb77c1915110ad968465608b68e869e0772622c9656714e73e5a1a522f" + +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + +[[package]] +name = "siphasher" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" + +[[package]] +name = "sketches-ddsketch" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04d2ecae5fcf33b122e2e6bd520a57ccf152d2dde3b38c71039df1a6867264ee" + +[[package]] +name = "slab" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "socket2" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "socket2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "softbuffer" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61d5d17f23326fe0d9b0af282f73f3af666699420fd5f42629efd9c6e7dc166f" +dependencies = [ + "bytemuck", + "cfg_aliases", + "cocoa", + "core-graphics", + "foreign-types 0.5.0", + "js-sys", + "log", + "objc", + "raw-window-handle 0.6.1", + "redox_syscall 0.5.1", + "wasm-bindgen", + "wayland-sys", + "web-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "soup3" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" +dependencies = [ + "futures-channel", + "gio", + "glib", + "libc", + "soup3-sys", +] + +[[package]] +name = "soup3-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "specta" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2240c3aa020aa61d2c569087d213baafbb212f4ceb9de9dd162376ea6aa0fe3" +dependencies = [ + "document-features", + "indoc 1.0.9", + "once_cell", + "paste", + "serde", + "serde_json", + "specta-macros 1.0.5", + "thiserror", +] + +[[package]] +name = "specta" +version = "2.0.0-rc.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3624a07cbde326fdf1ec37cbd39d06a224660fa0199b7db7316f2349583df981" +dependencies = [ + "bigdecimal 0.4.2", + "chrono", + "indexmap 2.1.0", + "once_cell", + "paste", + "serde", + "specta-macros 2.0.0-rc.10", + "thiserror", + "uuid", +] + +[[package]] +name = "specta-macros" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4605306321c356e03873b8ee71d7592a5e7c508add325c3ed0677c16fdf1bcfb" +dependencies = [ + "Inflector", + "itertools", + "proc-macro2", + "quote", + "syn 1.0.109", + "termcolor", +] + +[[package]] +name = "specta-macros" +version = "2.0.0-rc.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef33e9678ae36993fcbfc46aa29568ef10d32fd54428808759c6a450998c43ec" +dependencies = [ + "Inflector", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "sql-ddl" +version = "0.1.0" +source = "git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched#75852858f43e426c423b263f7e1473f49044f788" + +[[package]] +name = "sql-query-connector" +version = "0.1.0" +source = "git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched#75852858f43e426c423b263f7e1473f49044f788" +dependencies = [ + "anyhow", + "async-trait", + "bigdecimal 0.3.0", + "chrono", + "cuid", + "futures", + "itertools", + "once_cell", + "opentelemetry", + "prisma-models", + "prisma-value", + "psl", + "quaint", + "query-connector", + "rand 0.7.3", + "serde", + "serde_json", + "thiserror", + "tokio", + "tracing", + "tracing-futures", + "tracing-opentelemetry", + "user-facing-errors", + "uuid", +] + +[[package]] +name = "sql-schema-connector" +version = "0.1.0" +source = "git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched#75852858f43e426c423b263f7e1473f49044f788" +dependencies = [ + "chrono", + "connection-string", + "datamodel-renderer", + "either", + "enumflags2", + "indoc 2.0.5", + "once_cell", + "prisma-value", + "psl", + "quaint", + "regex", + "schema-connector", + "serde", + "serde_json", + "sql-ddl", + "sql-schema-describer", + "sqlformat", + "sqlparser", + "tokio", + "tracing", + "tracing-futures", + "url", + "user-facing-errors", + "uuid", +] + +[[package]] +name = "sql-schema-describer" +version = "0.1.0" +source = "git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched#75852858f43e426c423b263f7e1473f49044f788" +dependencies = [ + "async-trait", + "bigdecimal 0.3.0", + "either", + "enumflags2", + "indexmap 1.9.3", + "indoc 2.0.5", + "once_cell", + "prisma-value", + "psl", + "quaint", + "regex", + "serde", + "tracing", + "tracing-error", + "tracing-futures", +] + +[[package]] +name = "sqlformat" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c12bc9199d1db8234678b7051747c07f517cdcf019262d1847b94ec8b1aee3e" +dependencies = [ + "itertools", + "nom", + "unicode_categories", +] + +[[package]] +name = "sqlparser" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0366f270dbabb5cc2e4c88427dc4c08bba144f81e32fbd459a013f26a4d16aa0" +dependencies = [ + "log", +] + +[[package]] +name = "sqlserver-tests" +version = "0.1.0" +dependencies = [ + "prisma-client-rust", + "serde", + "tokio", +] + +[[package]] +name = "stable-pattern" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4564168c00635f88eaed410d5efa8131afa8d8699a612c80c455a0ba05c21045" +dependencies = [ + "memchr", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "state" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b" +dependencies = [ + "loom", +] + +[[package]] +name = "state" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b8c4a4445d81357df8b1a650d0d0d6fbbbfe99d064aa5e02f3e4022061476d8" +dependencies = [ + "loom", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "string_cache" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" +dependencies = [ + "new_debug_unreachable", + "once_cell", + "parking_lot 0.12.1", + "phf_shared 0.10.0", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache_codegen" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro2", + "quote", +] + +[[package]] +name = "stringprep" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee348cb74b87454fff4b551cbf727025810a004f88aeacae7f85b87f4e9a1c1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "subprocess" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c2e86926081dda636c546d8c5e641661049d7562a68f5488be4a1f7f66f6086" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + +[[package]] +name = "swift-rs" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bbdb58577b6301f8d17ae2561f32002a5bae056d444e0f69e611e504a276204" +dependencies = [ + "base64 0.21.0", + "serde", + "serde_json", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c993ed8ccba56ae856363b1845da7266a7cb78e1d146c8a32d54b45a8b831fc9" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "unicode-xid", +] + +[[package]] +name = "system-deps" +version = "6.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0fe581ad25d11420b873cf9aedaca0419c2b411487b134d4d21065f3d092055" +dependencies = [ + "cfg-expr", + "heck 0.4.1", + "pkg-config", + "toml 0.7.3", + "version-compare", +] + +[[package]] +name = "take_mut" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" + +[[package]] +name = "tao" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92bcf8885e147b56d6e26751263b45876284f32ca404703f6d3b8f80d16ff4dd" +dependencies = [ + "bitflags 2.5.0", + "cocoa", + "core-foundation", + "core-graphics", + "crossbeam-channel", + "dispatch", + "dlopen2", + "dpi", + "gdkwayland-sys", + "gdkx11-sys", + "gtk", + "instant", + "jni", + "lazy_static", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "objc", + "once_cell", + "parking_lot 0.12.1", + "raw-window-handle 0.6.1", + "scopeguard", + "tao-macros", + "unicode-segmentation", + "url", + "windows 0.56.0", + "windows-core", + "windows-version", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b27a4bcc5eb524658234589bdffc7e7bfb996dbae6ce9393bfd39cb4159b445" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "target-lexicon" +version = "0.12.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd1ba337640d60c3e96bc6f0638a939b9c9a7f2c316a1598c279828b3d1dc8c5" + +[[package]] +name = "tauri" +version = "2.0.0-beta.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fedd5490eddf117253945f0baedafded43474c971cba546a818f527d5c26266" +dependencies = [ + "anyhow", + "bytes", + "cocoa", + "dirs-next", + "dunce", + "embed_plist", + "futures-util", + "getrandom 0.2.9", + "glob", + "gtk", + "heck 0.5.0", + "http 1.1.0", + "jni", + "libc", + "log", + "mime", + "muda", + "objc", + "percent-encoding", + "raw-window-handle 0.6.1", + "reqwest 0.12.4", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "specta 2.0.0-rc.12", + "state 0.6.0", + "swift-rs", + "tauri-build", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "thiserror", + "tokio", + "tray-icon", + "url", + "urlpattern", + "webkit2gtk", + "webview2-com", + "window-vibrancy", + "windows 0.56.0", +] + +[[package]] +name = "tauri-build" +version = "2.0.0-beta.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6cf9e29e8b4f6be6e505b96196e31fc6ff7574af5405eb3f26507f9828f02f" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs-next", + "glob", + "heck 0.5.0", + "json-patch", + "schemars", + "semver 1.0.17", + "serde", + "serde_json", + "tauri-utils", + "tauri-winres", + "toml 0.8.2", + "walkdir", +] + +[[package]] +name = "tauri-codegen" +version = "2.0.0-beta.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2151dc8c8dbba5085905176539bab2c1cd2c64fed6ece258763ff2080c60c25" +dependencies = [ + "base64 0.22.1", + "brotli", + "ico", + "json-patch", + "plist", + "png", + "proc-macro2", + "quote", + "semver 1.0.17", + "serde", + "serde_json", + "sha2 0.10.6", + "syn 2.0.61", + "tauri-utils", + "thiserror", + "time", + "url", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "2.0.0-beta.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a85b73837b1c5ac218b08e624fa6daa58122199a80972baf0560f3834901b9" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.61", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-runtime" +version = "2.0.0-beta.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9316d393ecb73f9390c57637c169c6b7d06f287924fa275f59cdbcf484eb4580" +dependencies = [ + "dpi", + "gtk", + "http 1.1.0", + "jni", + "raw-window-handle 0.6.1", + "serde", + "serde_json", + "tauri-utils", + "thiserror", + "url", + "windows 0.56.0", +] + +[[package]] +name = "tauri-runtime-wry" +version = "2.0.0-beta.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6df23173f0df85d05184f397ba7129c3e5f2efd2f213cf8db43694143b3a2f29" +dependencies = [ + "cocoa", + "gtk", + "http 1.1.0", + "jni", + "log", + "percent-encoding", + "raw-window-handle 0.6.1", + "softbuffer", + "tao", + "tauri-runtime", + "tauri-utils", + "url", + "webkit2gtk", + "webview2-com", + "windows 0.56.0", + "wry", +] + +[[package]] +name = "tauri-specta" +version = "2.0.0-rc.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76354ea6fbcf5f547d9f41ea9bd16148ba468711c2ead7c8107c329823feb8b1" +dependencies = [ + "heck 0.5.0", + "indoc 2.0.5", + "serde", + "serde_json", + "specta 2.0.0-rc.12", + "tauri", + "tauri-specta-macros", + "thiserror", +] + +[[package]] +name = "tauri-specta-macros" +version = "2.0.0-rc.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6f9e90bf2012877e2c4029a1bf756277183e9c7c77b850ef965711553998012" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.61", +] + +[[package]] +name = "tauri-utils" +version = "2.0.0-beta.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d236b18d5e37df540e55c99ceec3868da9a861b4089189cca299d6607c9dcd9" +dependencies = [ + "brotli", + "cargo_metadata", + "ctor", + "dunce", + "glob", + "heck 0.5.0", + "html5ever", + "infer", + "json-patch", + "kuchikiki", + "log", + "memchr", + "phf 0.11.1", + "proc-macro2", + "quote", + "regex", + "schemars", + "semver 1.0.17", + "serde", + "serde_json", + "serde_with 3.8.1", + "swift-rs", + "thiserror", + "toml 0.8.2", + "url", + "urlpattern", + "walkdir", +] + +[[package]] +name = "tauri-winres" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5993dc129e544393574288923d1ec447c857f3f644187f4fbf7d9a875fbfc4fb" +dependencies = [ + "embed-resource", + "toml 0.7.3", +] + +[[package]] +name = "tempfile" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" +dependencies = [ + "cfg-if", + "fastrand", + "redox_syscall 0.3.5", + "rustix", + "windows-sys 0.45.0", +] + +[[package]] +name = "tendril" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" +dependencies = [ + "futf", + "mac", + "utf-8", +] + +[[package]] +name = "termcolor" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thin-slice" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" + +[[package]] +name = "thiserror" +version = "1.0.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.61", +] + +[[package]] +name = "thread_local" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "tiberius" +version = "0.11.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66303a42b7c5daffb95c10cd8f3007a9c29b3e90128cf42b3738f58102aa2516" +dependencies = [ + "async-native-tls", + "async-trait", + "asynchronous-codec", + "bigdecimal 0.3.0", + "byteorder", + "bytes", + "chrono", + "connection-string", + "encoding", + "enumflags2", + "futures", + "futures-sink", + "futures-util", + "num-traits", + "once_cell", + "opentls", + "pin-project-lite", + "pretty-hex", + "thiserror", + "tokio", + "tokio-util 0.7.8", + "tracing", + "uuid", + "winauth", +] + +[[package]] +name = "time" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d634a985c4d4238ec39cacaed2e7ae552fbd3c476b552c1deac3021b7d7eaf0c" +dependencies = [ + "itoa 1.0.6", + "libc", + "num_threads", + "serde", + "time-macros", +] + +[[package]] +name = "time-macros" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42657b1a6f4d817cda8e7a0ace261fe0cc946cf3a80314390b22cc61ae080792" + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3c786bf8134e5a3a166db9b29ab8f48134739014a3eca7bc6bfa95d673b136f" +dependencies = [ + "autocfg", + "bytes", + "libc", + "mio", + "num_cpus", + "parking_lot 0.12.1", + "pin-project-lite", + "signal-hook-registry", + "socket2 0.4.9", + "tokio-macros", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-macros" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.61", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-postgres" +version = "0.7.7" +source = "git+https://github.com/prisma/rust-postgres?rev=00d4815e58859261bdfca71c75be7dc657303f7d#00d4815e58859261bdfca71c75be7dc657303f7d" +dependencies = [ + "async-trait", + "byteorder", + "bytes", + "fallible-iterator", + "futures-channel", + "futures-util", + "log", + "parking_lot 0.12.1", + "percent-encoding", + "phf 0.11.1", + "pin-project-lite", + "postgres-protocol", + "postgres-types", + "socket2 0.4.9", + "tokio", + "tokio-util 0.7.8", +] + +[[package]] +name = "tokio-rustls" +version = "0.23.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" +dependencies = [ + "rustls", + "tokio", + "webpki", +] + +[[package]] +name = "tokio-stream" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f714dd15bead90401d77e04243611caec13726c2408afd5b31901dfcdcb3b181" +dependencies = [ + "futures-util", + "log", + "tokio", + "tungstenite", +] + +[[package]] +name = "tokio-util" +version = "0.6.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" +dependencies = [ + "bytes", + "futures-core", + "futures-io", + "futures-sink", + "log", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" +dependencies = [ + "bytes", + "futures-core", + "futures-io", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "toml" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b403acf6f2bb0859c93c7f0d967cb4a75a7ac552100f9322faf64dc047669b21" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.19.8", +] + +[[package]] +name = "toml" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.20.2", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "239410c8609e8125456927e6707163a3b1fdb40561e4b803bc041f466ccfdc13" +dependencies = [ + "indexmap 1.9.3", + "serde", + "serde_spanned", + "toml_datetime", + "winnow 0.4.1", +] + +[[package]] +name = "toml_edit" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap 2.1.0", + "serde", + "serde_spanned", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f873044bf02dd1e8239e9c1293ea39dad76dc594ec16185d0a1bf31d8dc8d858" +dependencies = [ + "bitflags 1.3.2", + "bytes", + "futures-core", + "futures-util", + "http 0.2.9", + "http-body 0.4.5", + "http-range-header", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +dependencies = [ + "cfg-if", + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.61", +] + +[[package]] +name = "tracing-core" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-error" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e" +dependencies = [ + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "tracing-futures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +dependencies = [ + "pin-project", + "tracing", +] + +[[package]] +name = "tracing-log" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +dependencies = [ + "lazy_static", + "log", + "tracing-core", +] + +[[package]] +name = "tracing-opentelemetry" +version = "0.17.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbbe89715c1dbbb790059e2565353978564924ee85017b5fff365c872ff6721f" +dependencies = [ + "once_cell", + "opentelemetry", + "tracing", + "tracing-core", + "tracing-log", + "tracing-subscriber", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "tray-icon" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39240037d755a1832e752d64f99078c3b0b21c09a71c12405070c75ef4e7cd3c" +dependencies = [ + "cocoa", + "core-graphics", + "crossbeam-channel", + "dirs-next", + "libappindicator", + "muda", + "objc", + "once_cell", + "png", + "serde", + "thiserror", + "windows-sys 0.52.0", +] + +[[package]] +name = "trust-dns-proto" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c31f240f59877c3d4bb3b3ea0ec5a6a0cff07323580ff8c7a605cd7d08b255d" +dependencies = [ + "async-trait", + "cfg-if", + "data-encoding", + "enum-as-inner", + "futures-channel", + "futures-io", + "futures-util", + "idna 0.2.3", + "ipnet", + "lazy_static", + "log", + "rand 0.8.5", + "smallvec", + "thiserror", + "tinyvec", + "tokio", + "url", +] + +[[package]] +name = "trust-dns-resolver" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4ba72c2ea84515690c9fcef4c6c660bb9df3036ed1051686de84605b74fd558" +dependencies = [ + "cfg-if", + "futures-util", + "ipconfig", + "lazy_static", + "log", + "lru-cache", + "parking_lot 0.12.1", + "resolv-conf", + "smallvec", + "thiserror", + "tokio", + "trust-dns-proto", +] + +[[package]] +name = "try-lock" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" + +[[package]] +name = "tungstenite" +version = "0.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e27992fd6a8c29ee7eef28fc78349aa244134e10ad447ce3b9f0ac0ed0fa4ce0" +dependencies = [ + "base64 0.13.1", + "byteorder", + "bytes", + "http 0.2.9", + "httparse", + "log", + "rand 0.8.5", + "sha-1", + "thiserror", + "url", + "utf-8", +] + +[[package]] +name = "twox-hash" +version = "1.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" +dependencies = [ + "cfg-if", + "rand 0.8.5", + "static_assertions", +] + +[[package]] +name = "typed-builder" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89851716b67b937e393b3daa8423e67ddfc4bbbf1654bcf05488e95e0828db0c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "typenum" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" + +[[package]] +name = "ubyte" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c81f0dae7d286ad0d9366d7679a77934cfc3cf3a8d67e82669794412b2368fe6" +dependencies = [ + "serde", +] + +[[package]] +name = "ucd-trie" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" + +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + +[[package]] +name = "uncased" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b01702b0fd0b3fadcf98e098780badda8742d4f4a7676615cad90e8ac73622" +dependencies = [ + "serde", + "version_check", +] + +[[package]] +name = "unic-char-property" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" +dependencies = [ + "unic-char-range", +] + +[[package]] +name = "unic-char-range" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" + +[[package]] +name = "unic-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" + +[[package]] +name = "unic-ucd-ident" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-version" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +dependencies = [ + "unic-common", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + +[[package]] +name = "unicode-ident" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" + +[[package]] +name = "unicode-width" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "unicode_categories" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" + +[[package]] +name = "unreachable" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +dependencies = [ + "void", +] + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "url" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +dependencies = [ + "form_urlencoded", + "idna 0.3.0", + "percent-encoding", + "serde", +] + +[[package]] +name = "urlpattern" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9bd5ff03aea02fa45b13a7980151fe45009af1980ba69f651ec367121a31609" +dependencies = [ + "derive_more", + "regex", + "serde", + "unic-ucd-ident", + "url", +] + +[[package]] +name = "user-facing-error-macros" +version = "0.1.0" +source = "git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched#75852858f43e426c423b263f7e1473f49044f788" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "user-facing-errors" +version = "0.1.0" +source = "git+https://github.com/Brendonovich/prisma-engines?branch=5.1.0-patched#75852858f43e426c423b263f7e1473f49044f788" +dependencies = [ + "backtrace", + "indoc 2.0.5", + "itertools", + "quaint", + "serde", + "serde_json", + "tracing", + "user-facing-error-macros", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "uuid" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" +dependencies = [ + "getrandom 0.2.9", + "serde", +] + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version-compare" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3b17ae1f6c8a2b28506cd96d412eebf83b4a0ff2cbefeeb952f2f9dfa44ba18" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "wait-timeout" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" +dependencies = [ + "libc", +] + +[[package]] +name = "walkdir" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log", + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.61", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.61", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + +[[package]] +name = "wasm-streams" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wayland-sys" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15a0c8eaff5216d07f226cb7a549159267f3467b289d9a2e52fd3ef5aae2b7af" +dependencies = [ + "dlib", + "log", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webkit2gtk" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76b1bc1e54c581da1e9f179d0b38512ba358fb1af2d634a1affe42e37172361a" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "soup3", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62daa38afc514d1f8f12b8693d30d5993ff77ced33ce30cd04deebc267a6d57c" +dependencies = [ + "bitflags 1.3.2", + "cairo-sys-rs", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pkg-config", + "soup3-sys", + "system-deps", +] + +[[package]] +name = "webpki" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "webpki-roots" +version = "0.22.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" +dependencies = [ + "webpki", +] + +[[package]] +name = "webview2-com" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c914dd492a52f0377bef56fd1b6e74a79090f9ee631d625d5b505a00e4538b6" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows 0.56.0", + "windows-core", + "windows-implement", + "windows-interface", +] + +[[package]] +name = "webview2-com-macros" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac1345798ecd8122468840bcdf1b95e5dc6d2206c5e4b0eafa078d061f59c9bc" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.61", +] + +[[package]] +name = "webview2-com-sys" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a46bcf03482ec28eeb764ca788f67998cde4213adfbbfa90462622058530f5e" +dependencies = [ + "thiserror", + "windows 0.56.0", + "windows-core", +] + +[[package]] +name = "widestring" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17882f045410753661207383517a6f62ec3dbeb6a4ed2acce01f0728238d1983" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "winauth" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f820cd208ce9c6b050812dc2d724ba98c6c1e9db5ce9b3f58d925ae5723a5e6" +dependencies = [ + "bitflags 1.3.2", + "byteorder", + "md5", + "rand 0.7.3", + "winapi", +] + +[[package]] +name = "window-vibrancy" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33082acd404763b315866e14a0d5193f3422c81086657583937a750cdd3ec340" +dependencies = [ + "cocoa", + "objc", + "raw-window-handle 0.6.1", + "windows-sys 0.52.0", + "windows-version", +] + +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets 0.48.0", +] + +[[package]] +name = "windows" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1de69df01bdf1ead2f4ac895dc77c9351aefff65b2f3db429a343f9cbf05e132" +dependencies = [ + "windows-core", + "windows-targets 0.52.5", +] + +[[package]] +name = "windows-core" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4698e52ed2d08f8658ab0c39512a7c00ee5fe2688c65f8c0a4f06750d729f2a6" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-result", + "windows-targets 0.52.5", +] + +[[package]] +name = "windows-implement" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.61", +] + +[[package]] +name = "windows-interface" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.61", +] + +[[package]] +name = "windows-result" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "749f0da9cc72d82e600d8d2e44cadd0b9eedb9038f71a1c58556ac1c5791813b" +dependencies = [ + "windows-targets 0.52.5", +] + +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.0", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.5", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +dependencies = [ + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", +] + +[[package]] +name = "windows-targets" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +dependencies = [ + "windows_aarch64_gnullvm 0.52.5", + "windows_aarch64_msvc 0.52.5", + "windows_i686_gnu 0.52.5", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.5", + "windows_x86_64_gnu 0.52.5", + "windows_x86_64_gnullvm 0.52.5", + "windows_x86_64_msvc 0.52.5", +] + +[[package]] +name = "windows-version" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6998aa457c9ba8ff2fb9f13e9d2a930dabcea28f1d0ab94d687d8b3654844515" +dependencies = [ + "windows-targets 0.52.5", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" + +[[package]] +name = "winnow" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae8970b36c66498d8ff1d66685dc86b91b29db0c7739899012f63a63814b4b28" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +dependencies = [ + "winapi", +] + +[[package]] +name = "winreg" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a1a57ff50e9b408431e8f97d5456f2807f8eb2a2cd79b06068fc87f8ecf189" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "winreg" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "wry" +version = "0.39.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f07f14ca279b6c2a797d93f82af8f04cb75c0d46bcb61752774c685bd666e152" +dependencies = [ + "base64 0.22.1", + "block", + "cocoa", + "core-graphics", + "crossbeam-channel", + "dpi", + "dunce", + "gdkx11", + "gtk", + "html5ever", + "http 1.1.0", + "javascriptcore-rs", + "jni", + "kuchikiki", + "libc", + "ndk", + "ndk-context", + "ndk-sys", + "objc", + "objc_id", + "once_cell", + "percent-encoding", + "raw-window-handle 0.6.1", + "sha2 0.10.6", + "soup3", + "tao-macros", + "thiserror", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows 0.56.0", + "windows-core", + "windows-version", + "x11-dl", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[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.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.61", +] + +[[package]] +name = "zstd" +version = "0.12.3+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76eea132fb024e0e13fd9c2f5d5d595d8a967aa72382ac2f9d39fcc95afd0806" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "6.0.5+zstd.1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56d9e60b4b1758206c238a10165fbcae3ca37b01744e394c463463f6529d23b" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.8+zstd.1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c" +dependencies = [ + "cc", + "libc", + "pkg-config", +] diff --git a/external/prisma-client-rust/Cargo.toml b/external/prisma-client-rust/Cargo.toml new file mode 100644 index 0000000..9f261ae --- /dev/null +++ b/external/prisma-client-rust/Cargo.toml @@ -0,0 +1,37 @@ +[workspace] +members = [ + "examples/*", + "examples/tauri/src-tauri", + "integration-tests", + "tests/*/*", + "crates/*", + "crates/sdk/example/*", + "prisma-cli", +] +exclude = ["examples/tauri"] +resolver = "2" + +[workspace.dependencies] +prisma-client-rust = { path = "crates/lib" } + +diagnostics = { git = "https://github.com/Brendonovich/prisma-engines", branch = "5.1.0-patched" } +dmmf = { git = "https://github.com/Brendonovich/prisma-engines", branch = "5.1.0-patched" } +prisma-models = { git = "https://github.com/Brendonovich/prisma-engines", branch = "5.1.0-patched" } +psl = { git = "https://github.com/Brendonovich/prisma-engines", branch = "5.1.0-patched" } +query-core = { git = "https://github.com/Brendonovich/prisma-engines", branch = "5.1.0-patched" } +schema-core = { git = "https://github.com/Brendonovich/prisma-engines", branch = "5.1.0-patched" } +request-handlers = { git = "https://github.com/Brendonovich/prisma-engines", branch = "5.1.0-patched" } +user-facing-errors = { git = "https://github.com/Brendonovich/prisma-engines", branch = "5.1.0-patched" } + +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" + +convert_case = "0.6.0" + +tauri-specta = { version = "2.0.0-rc.9" } + +# This is a deprecated feature so we don't really care about the verison +rspc = "*" + +# We don't lock version cause PCR only depends on `derive(Type)` so it should be fine. +specta = "^2.0.0-rc" diff --git a/external/prisma-client-rust/LICENSE b/external/prisma-client-rust/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/external/prisma-client-rust/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/external/prisma-client-rust/README.md b/external/prisma-client-rust/README.md new file mode 100644 index 0000000..0bd401b --- /dev/null +++ b/external/prisma-client-rust/README.md @@ -0,0 +1,68 @@ +## NOTICE + +This code is taken from [`prisma-client-rust`](https://github.com/Brendonovich/prisma-client-rust) at +commit `4f9ef9d38ca732162accff72b2eb684d2f120bab`, under the `Apache 2.0` License. Go check out the +original project! + +
+

Prisma Client Rust

+

Type-safe database access for Rust

+ Latest version of Prisma Client Rust is 0.6.11 + + Latest supported Prisma version is 4.8.0 + + Test Status + + Link to latest Documentation files + + + Prisma Client Rust uses Discord as a place to chat and ask questions + +
+ +
+ +Prisma Client Rust is an autogenerated query builder that provides simple and fully type-safe database access utilising the Prisma ecosystem. It is an alternative to ORMs like [Diesel](https://diesel.rs/) and [SeaORM](https://www.sea-ql.org/SeaORM/) and tools like [SQLx](https://github.com/launchbadge/sqlx). + +## Why Prisma Client Rust? + +For experienced Rust developers, Prisma Client Rust provides a consistent and understandable API on top of Prisma's powerful database technology. + +For developers looking to step away from NodeJS and create faster, more efficient applications, Prisma Client Rust harnesses existing tooling and terminology that Prisma Client JS users will be familiar with, making developing applications in Rust more approachable. + +Also - perhaps for the first time - using Prisma in a frontend application is easy. +Using Prisma Client Rust in a desktop application powered by [Tauri](https://tauri.studio/) allows the entire Prisma ecosystem to be used while developing desktop applications. + +## Getting Started + +Read the [installation instructions](https://prisma.brendonovich.dev/getting-started/installation) to get started and setup the CLI. + +For more general information about Prisma and its CLI, check out the [official Prisma docs](https://www.prisma.io/docs/). + +## Support + +If you have any questions, feel free to ask them in the Prisma Client Rust + [rspc](https://github.com/oscartbeaumont/rspc) [Discord server](https://discord.gg/5M6fpszrry). + +## Versioning + +Prisma Client Rust is not stable. + +Breaking changes will be documented and released under a new MINOR version following this format. + +`MAJOR`.`MINOR`.`PATCH` + +There is no release schedule, as I work on this alone and can't guarantee updates. + +## Affiliation + +Prisma Client Rust is not an official Prisma product, but has been [generously supported](https://twitter.com/prisma/status/1554855900124438529) as part of their FOSS Fund. + +## Acknowledgements + +- [steebchen](https://github.com/steebchen) and all other contributors to [Prisma Client Go](https://github.com/prisma/prisma-client-go) for writing a lot of code and documentation that Prisma Client Rust basically copies. + Without Prisma Client Go, this project would not have even been attempted. +- [seunlanlege](https://github.com/seunlanlege) for their work on [prisma-client-rs](https://github.com/polytope-labs/prisma-client-rs) which was used while integrating Prisma's query engine crates. +- [Prisma](https://prisma.io) for developing a brilliant and flexible open source ORM, and providing sponsorship. +- [Robert Craige](https://github.com/sponsors/RobertCraigie) for writing tests for [Prisma Client Python](https://github.com/RobertCraigie/prisma-client-py) that I have adapted. +- [Spacedrive](https://spacedrive.com) for hiring me and letting me work on this. + (sure I'm a founding member but thanks anyway!) diff --git a/external/prisma-client-rust/crates/cli/Cargo.toml b/external/prisma-client-rust/crates/cli/Cargo.toml new file mode 100644 index 0000000..f34154b --- /dev/null +++ b/external/prisma-client-rust/crates/cli/Cargo.toml @@ -0,0 +1,39 @@ +[package] +name = "prisma-client-rust-cli" +version = "0.6.8" +authors = ["Brendan Allan "] +edition = "2021" +rust-version = "1.62" + +[features] +specta = ["prisma-client-rust-generator/specta"] +# rspc = ["prisma-client-rust-generator/rspc"] +migrations = ["prisma-client-rust-generator/migrations"] +sqlite-create-many = ["prisma-client-rust-generator/sqlite-create-many"] +# mutation-callbacks = [] +mocking = ["prisma-client-rust-generator/mocking"] + +mysql = ["prisma-client-rust-generator/mysql"] +sqlite = ["prisma-client-rust-generator/sqlite"] +mssql = ["prisma-client-rust-generator/mssql"] +postgresql = ["prisma-client-rust-generator/postgresql"] +mongodb = ["prisma-client-rust-generator/mongodb"] + +[dependencies] +serde_json.workspace = true +serde.workspace = true +serde_path_to_error = "0.1.7" +quote = "1.0.18" +syn = "1.0.91" +proc-macro2 = "1.0.39" +http = "0.2.6" +directories = "4.0.1" +flate2 = "1.0.23" +reqwest = { version = "0.11.10", features = [ + "blocking", + "native-tls-vendored", +] } +regex = "1.5.5" +thiserror = "1.0.37" + +prisma-client-rust-generator = { path = "../generator", default-features = false } diff --git a/external/prisma-client-rust/crates/cli/src/binaries/mod.rs b/external/prisma-client-rust/crates/cli/src/binaries/mod.rs new file mode 100644 index 0000000..e634e46 --- /dev/null +++ b/external/prisma-client-rust/crates/cli/src/binaries/mod.rs @@ -0,0 +1,148 @@ +pub mod platform; + +use directories::BaseDirs; +use flate2::read::GzDecoder; +use http::StatusCode; +use reqwest::blocking as reqwest; +use std::fs::{copy, create_dir_all, metadata, File}; +use std::io; +use std::io::prelude::*; +use std::path::{Path, PathBuf}; +use std::process::Command; + +pub static PRISMA_CLI_VERSION: &str = "5.1.0"; +// commit hash of prisma/prisma-engines, not brendonovich/prisma-engines +pub static ENGINE_VERSION: &str = "a9b7003df90aa623086e4d6f4e43c72468e6339b"; +pub static BASE_DIR_NAME: &str = "prisma/binaries"; + +pub struct Engine<'a> { + pub name: &'a str, + pub env: &'a str, +} + +pub const ENGINES: [Engine; 2] = [ + Engine { + name: "query-engine", + env: "PRISMA_QUERY_ENGINE_BINARY", + }, + Engine { + name: "schema-engine", + env: "PRISMA_SCHEMA_ENGINE_BINARY", + }, +]; + +pub fn prisma_cli_name() -> String { + let variation = platform::name(); + let arch = platform::arch(); + + format!("prisma-cli-{variation}-{arch}") +} + +pub fn global_cache_dir() -> PathBuf { + let base_dirs = BaseDirs::new().unwrap(); + let cache_dir = base_dirs.cache_dir(); + + cache_dir + .join(BASE_DIR_NAME) + .join("cli") + .join(PRISMA_CLI_VERSION) +} + +pub fn download_cli(to_dir: &PathBuf) -> Result<(), String> { + let cli = prisma_cli_name(); + + let to = platform::check_for_extension(&platform::name(), &to_dir.join(cli).to_str().unwrap()); + + let url = platform::check_for_extension( + &platform::name(), + &format!( + "https://prisma-photongo.s3-eu-west-1.amazonaws.com/{}-{}-{}-{}.gz", + "prisma-cli", + PRISMA_CLI_VERSION, + platform::name(), + platform::arch() + ), + ); + + match metadata(&to) { + Err(_) => (), + Ok(_) => { + return Ok(()); + } + }; + + println!("Downloading {} to {}", url, to); + + download(url.clone(), to.clone()).expect(&format!("could not download {} to {}", url, to)); + + Ok(()) +} + +pub fn download_engine(engine_name: &str, to_dir: &PathBuf) -> Result<(), String> { + let os_name = platform::binary_platform_name(); + + let to = platform::check_for_extension( + &os_name.to_string(), + &to_dir + .join(ENGINE_VERSION) + .join(format!("prisma-{}-{}", engine_name, os_name)) + .into_os_string() + .into_string() + .unwrap(), + ); + + let url = platform::check_for_extension( + &os_name.to_string(), + &format!( + "https://binaries.prisma.sh/all_commits/{}/{}/{}.gz", + ENGINE_VERSION, &os_name, engine_name + ), + ); + + match metadata(&to) { + Err(_) => {} + Ok(_) => { + return Ok(()); + } + }; + + println!("Downloading {} to {}", url, to); + download(url.clone(), to.clone()).expect(&format!("could not download {} to {}", url, to)); + + Ok(()) +} + +fn download(url: String, to: String) -> Result<(), ()> { + create_dir_all(Path::new(&to).parent().unwrap()).unwrap(); + + let tmp = &(to.clone() + ".tmp"); + + let resp = reqwest::get(&url).unwrap(); + + if resp.status() != StatusCode::OK { + panic!("received code {} from {}", resp.status(), &url); + }; + + let mut tmp_file = File::create(tmp).expect(&format!("could not create {}", tmp)); + + if !cfg!(target_os = "windows") { + Command::new("chmod") + .arg("+x") + .arg(tmp) + .output() + .expect("failed to make file executable"); + } + + let mut buffer = Vec::new(); + io::BufReader::new(GzDecoder::new(resp)) + .read_to_end(&mut buffer) + .unwrap(); + + tmp_file + .write(buffer.as_slice()) + .expect("could not write to .tmp file"); + + copy(tmp, to).expect(&format!("could not copy file {}", url)); + + Ok(()) +} diff --git a/external/prisma-client-rust/crates/cli/src/binaries/platform.rs b/external/prisma-client-rust/crates/cli/src/binaries/platform.rs new file mode 100644 index 0000000..c239bbe --- /dev/null +++ b/external/prisma-client-rust/crates/cli/src/binaries/platform.rs @@ -0,0 +1,136 @@ +use regex::Regex; +use std::env; +use std::ops::Add; +use std::process::Command; + +pub fn binary_platform_name() -> String { + let platform = name(); + + let distro = match platform.as_str() { + "linux" => match arch().as_str() { + "arm64" => "linux-arm64".to_string(), + _ => match get_linux_distro().as_str() { + "alpine" => return "linux-musl".to_string(), + distro => distro.to_string(), + }, + }, + _ => return platform.to_string(), + }; + + let ssl = get_openssl(); + + let name = format!("{}-openssl-{}", distro, ssl); + + name +} + +pub fn arch() -> String { + match env::consts::ARCH { + "x86_64" => "x64".to_string(), + "aarch64" => "arm64".to_string(), + arch => panic!("Architecture {arch} is not yet supported"), + } +} + +fn get_linux_distro() -> String { + let out = Command::new("cat").arg("/etc/os-release").output().unwrap(); + + let stdout = String::from_utf8(out.stdout).unwrap(); + let stderr = String::from_utf8(out.stderr).unwrap(); + let combined_output = stdout + &stderr; + + parse_linux_distro(&combined_output) +} + +fn parse_linux_distro(output: &str) -> String { + let id = Regex::new("(?m)^ID=\"?([^\"\n]*)\"?") + .unwrap() + .captures(output) + .and_then(|matches| { + if matches.len() > 1 { + Some(matches[1].to_string()) + } else { + None + } + }); + + let id_like = Regex::new("(?m)^ID_LIKE=\"?([^\"\n]*)\"?") + .unwrap() + .captures(output) + .and_then(|matches| { + if matches.len() > 1 { + Some(matches[1].to_string()) + } else { + None + } + }); + + if let Some(id) = id { + if id == "alpine" { + return "alpine".to_string(); + } + + if let Some(id_like) = id_like { + if id_like.contains("centos") + || id_like.contains("fedora") + || id_like.contains("rhel") + || id == "fedora" + { + return "alpine".to_string(); + } + + if id_like.contains("debian") || id_like.contains("ubuntu") || id == "debian" { + return "debian".to_string(); + } + } + } + + "debian".to_string() +} + +pub fn name() -> String { + match env::consts::OS { + "macos" => "darwin".to_string(), + os => os.to_string(), + } +} + +pub fn check_for_extension(platform: &str, path: &str) -> String { + let path = path.to_string(); + + if platform == "windows" { + if path.contains(".gz") { + return path.replace(".gz", ".exe.gz"); + } + return path.add(".exe"); + } + + path +} + +fn get_openssl() -> String { + let out = Command::new("openssl") + .arg("version") + .arg("-v") + .output() + .expect("Unable to run determine openssl version; is the openssl binary installed?"); + + let stdout = String::from_utf8(out.stdout).unwrap(); + let stderr = String::from_utf8(out.stderr).unwrap(); + let combined = stdout + &stderr; + + parse_openssl_version(&combined) +} + +fn parse_openssl_version(v: &str) -> String { + let r = Regex::new(r"^OpenSSL\s(\d+\.\d+)\.\d"); + let matches = r.unwrap().captures(v).unwrap(); + if matches.len() > 0 { + match matches.get(1).unwrap().as_str() { + version if version.starts_with("3.") => "3.0.x".to_string(), + version => format!("{version}.x"), + } + } else { + "1.1.x".to_string() + } +} diff --git a/external/prisma-client-rust/crates/cli/src/lib.rs b/external/prisma-client-rust/crates/cli/src/lib.rs new file mode 100644 index 0000000..46242cc --- /dev/null +++ b/external/prisma-client-rust/crates/cli/src/lib.rs @@ -0,0 +1,17 @@ +mod binaries; +mod prisma_cli; + +use std::env; + +pub fn run() { + let args = env::args(); + + let args = args.skip(1).collect::>(); + + if std::env::var("PRISMA_GENERATOR_INVOCATION").is_err() { + prisma_cli::main(&args); + return; + } + + prisma_client_rust_generator::run(); +} diff --git a/external/prisma-client-rust/crates/cli/src/prisma_cli.rs b/external/prisma-client-rust/crates/cli/src/prisma_cli.rs new file mode 100644 index 0000000..bd41200 --- /dev/null +++ b/external/prisma-client-rust/crates/cli/src/prisma_cli.rs @@ -0,0 +1,41 @@ +use crate::binaries::{self, platform, ENGINES}; +use std::env; +use std::process::Command; + +pub fn main(args: &Vec) { + let dir = binaries::global_cache_dir(); + + binaries::download_cli(&dir).unwrap(); + let prisma = binaries::prisma_cli_name(); + let binary_name = + platform::check_for_extension(&platform::name(), &platform::binary_platform_name()); + + let mut cmd = Command::new(dir.join(prisma)); + + cmd.args(args); + + cmd.envs(env::vars()); + cmd.env("PRISMA_HIDE_UPDATE_MESSAGE", "true"); + cmd.env("PRISMA_CLI_QUERY_ENGINE_TYPE", "binary"); + + for e in ENGINES { + match env::var(e.env) { + Ok(path) => { + cmd.env(e.env, path); + } + Err(_) => { + binaries::download_engine(&e.name, &dir).unwrap(); + let path = dir + .join(binaries::ENGINE_VERSION) + .join(format!("prisma-{}-{}", e.name, binary_name)); + cmd.env(e.env, path); + } + } + } + + cmd.stdout(std::process::Stdio::inherit()); + cmd.stdin(std::process::Stdio::inherit()); + cmd.stderr(std::process::Stdio::inherit()); + + cmd.output().unwrap(); +} diff --git a/external/prisma-client-rust/crates/generator-macros/Cargo.toml b/external/prisma-client-rust/crates/generator-macros/Cargo.toml new file mode 100644 index 0000000..d98dadd --- /dev/null +++ b/external/prisma-client-rust/crates/generator-macros/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "prisma-client-rust-generator-macros" +version = "0.6.8" +edition = "2021" + +[lib] +proc-macro = true + +[features] +specta = [] + +[dependencies] +prisma-client-rust-generator-shared = { path = "../generator-shared" } +convert_case.workspace = true +proc-macro2 = "1.0.39" +quote = "1.0.18" +syn = "1.0.91" diff --git a/external/prisma-client-rust/crates/generator-macros/src/filter.rs b/external/prisma-client-rust/crates/generator-macros/src/filter.rs new file mode 100644 index 0000000..4b96a03 --- /dev/null +++ b/external/prisma-client-rust/crates/generator-macros/src/filter.rs @@ -0,0 +1,173 @@ +use prisma_client_rust_generator_shared::{select_include::SelectableFields, Arity}; +use proc_macro2::TokenStream; +use quote::{quote, quote_spanned}; +use syn::{ + braced, + parse::{Parse, ParseStream}, + parse_macro_input, + punctuated::Punctuated, + Ident, Path, Token, +}; + +struct Method { + name: Ident, + value: TokenStream, +} + +impl Parse for Method { + fn parse(input: ParseStream) -> syn::Result { + Ok(Self { + name: input.parse()?, + value: { + input.parse::()?; + input.parse()? + }, + }) + } +} + +struct Filter { + field: Ident, + methods: Punctuated, +} + +impl Parse for Filter { + fn parse(input: ParseStream) -> syn::Result { + Ok(Self { + field: input.parse()?, + methods: { + input.parse::()?; + + let content; + braced!(content in input); + + Punctuated::parse_terminated(&content)? + }, + }) + } +} + +struct Input { + dollar_crate: Ident, + module_path: Path, + fields: SelectableFields, + filter: Punctuated, +} + +impl Parse for Input { + fn parse(input: ParseStream) -> syn::Result { + Ok(Self { + dollar_crate: input.parse()?, + module_path: { + input.parse::()?; + input.parse()? + }, + fields: { + input.parse::()?; + input.parse()? + }, + filter: { + input.parse::()?; + + let content; + braced!(content in input); + + Punctuated::parse_terminated(&content)? + }, + }) + } +} + +pub fn proc_macro(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + let Input { + dollar_crate, + module_path: model_path, + fields, + filter, + } = parse_macro_input!(input as Input); + + let items = filter + .into_iter() + .map(|Filter { field, methods }| { + let Some(field) = fields + .iter() + .find(|schema_field| schema_field.name == field) + else { + let all_fields = fields + .iter() + .map(|field| format!("'{}'", field.name.to_string())) + .collect::>() + .join(", "); + + let error = + format!("Field '{field}' not found. Available fields are {all_fields}."); + + return quote_spanned!(field.span() => compile_error!(#error)); + }; + + let field_name = &field.name; + + match &field.arity { + Arity::Scalar => { + let methods = methods.into_iter().map(|Method { name, value }| { + quote! { + #dollar_crate::#model_path::#field_name::#name(#value) + } + }); + + quote!(#(#methods),*) + } + Arity::Relation(related_model_path, _) => { + let methods = methods.into_iter().map(|Method { name, value }| { + quote! { + #dollar_crate::#model_path::#field_name::#name( + #dollar_crate::#related_model_path::filter! #value + ) + } + }); + + quote!(#(#methods),*) + } + } + }) + .collect::>(); + + quote!(vec![#(#items),*]).into() +} + +// factory means rustfmt can work! +pub fn proc_macro_factory(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + struct FactoryInput { + name: Ident, + rest: TokenStream, + } + + impl Parse for FactoryInput { + fn parse(input: ParseStream) -> syn::Result { + Ok(Self { + name: input.parse()?, + rest: { + input.parse::()?; + input.parse()? + }, + }) + } + } + + let FactoryInput { name, rest } = parse_macro_input!(input as FactoryInput); + + quote! { + #[macro_export] + macro_rules! #name { + ($($inner:tt)+) => { + ::prisma_client_rust::macros::filter!( + $crate, + #rest, + { $($inner)+ } + ) + }; + } + pub use #name as filter; + } + .into() +} diff --git a/external/prisma-client-rust/crates/generator-macros/src/lib.rs b/external/prisma-client-rust/crates/generator-macros/src/lib.rs new file mode 100644 index 0000000..d756f61 --- /dev/null +++ b/external/prisma-client-rust/crates/generator-macros/src/lib.rs @@ -0,0 +1,52 @@ +#![allow(unused_imports, dead_code)] + +mod filter; +mod partial_unchecked; +mod select_include; + +#[proc_macro] +pub fn to_pascal_case(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + let converted = convert_case::Casing::to_case(&input.to_string(), convert_case::Case::Pascal); + + proc_macro::TokenTree::Literal(proc_macro::Literal::string(&converted)).into() +} + +#[proc_macro] +pub fn partial_unchecked(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + partial_unchecked::proc_macro(input) +} + +#[proc_macro] +pub fn partial_unchecked_factory(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + partial_unchecked::proc_macro_factory(input) +} + +#[proc_macro] +pub fn filter(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + filter::proc_macro(input) +} + +#[proc_macro] +pub fn filter_factory(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + filter::proc_macro_factory(input) +} + +#[proc_macro] +pub fn select(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + select_include::proc_macro(input, select_include::Variant::Select) +} + +#[proc_macro] +pub fn select_factory(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + select_include::proc_macro_factory(input, select_include::Variant::Select) +} + +#[proc_macro] +pub fn include(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + select_include::proc_macro(input, select_include::Variant::Include) +} + +#[proc_macro] +pub fn include_factory(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + select_include::proc_macro_factory(input, select_include::Variant::Include) +} diff --git a/external/prisma-client-rust/crates/generator-macros/src/partial_unchecked.rs b/external/prisma-client-rust/crates/generator-macros/src/partial_unchecked.rs new file mode 100644 index 0000000..ab81722 --- /dev/null +++ b/external/prisma-client-rust/crates/generator-macros/src/partial_unchecked.rs @@ -0,0 +1,138 @@ +use proc_macro2::{Ident, TokenStream}; +use quote::quote; +use syn::{ + bracketed, + parse::{Parse, ParseStream}, + parse_macro_input, + punctuated::Punctuated, + ItemStruct, Path, Token, +}; + +struct Input { + dollar_crate: Ident, + model_module: Path, + data_struct: ItemStruct, + struct_name: Ident, + selection: Punctuated, +} + +impl Parse for Input { + fn parse(input: ParseStream) -> syn::Result { + Ok(Self { + dollar_crate: input.parse()?, + model_module: { + input.parse::()?; + input.parse()? + }, + data_struct: { + input.parse::()?; + input.parse()? + }, + struct_name: { + input.parse::()?; + input.parse()? + }, + selection: { + input.parse::()?; + + let content; + bracketed!(content in input); + Punctuated::::parse_terminated(&content)? + }, + }) + } +} + +pub fn proc_macro(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + let Input { + dollar_crate, + model_module, + data_struct, + struct_name, + selection, + } = parse_macro_input!(input as Input); + + let fields = data_struct + .fields + .iter() + .filter(|f| selection.iter().any(|s| s == f.ident.as_ref().unwrap())) + .map(|field| { + let attrs = &field.attrs; + let ident = &field.ident; + let ty = &field.ty; + + let specta_attrs = cfg!(feature = "specta").then(|| quote!(#[specta(optional)])); + + quote! { + #(#attrs)* + #specta_attrs + pub #ident: Option<#dollar_crate::#ty> + } + }); + + let specta_attrs = cfg!(feature = "specta").then(|| { + quote! { + #[derive(::prisma_client_rust::specta::Type)] + #[specta(crate = prisma_client_rust::specta)] + } + }); + + let selection = selection.iter().collect::>(); + + quote! { + #[derive(serde::Deserialize)] + #specta_attrs + #[allow(unused)] + pub struct #struct_name { + #(#fields),* + } + + impl #struct_name { + pub fn to_params(self) -> Vec<#dollar_crate::#model_module::UncheckedSetParam> { + [ + #(self.#selection.map(#dollar_crate::#model_module::#selection::set)),* + ].into_iter().flatten().collect() + } + } + } + .into() +} + +pub fn proc_macro_factory(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + struct FactoryInput { + name: Ident, + rest: TokenStream, + } + + impl Parse for FactoryInput { + fn parse(input: ParseStream) -> syn::Result { + Ok(Self { + name: input.parse()?, + rest: { + input.parse::()?; + input.parse()? + }, + }) + } + } + + let FactoryInput { name, rest } = parse_macro_input!(input as FactoryInput); + + quote! { + #[macro_export] + macro_rules! #name { + ($struct_name:ident { + $($scalar_field:ident)+ + }) => { + ::prisma_client_rust::macros::partial_unchecked!( + $crate, + #rest, + $struct_name, + [$($scalar_field),+] + ); + } + } + pub use #name as partial_unchecked; + } + .into() +} diff --git a/external/prisma-client-rust/crates/generator-macros/src/select_include/definitions.rs b/external/prisma-client-rust/crates/generator-macros/src/select_include/definitions.rs new file mode 100644 index 0000000..4f117fd --- /dev/null +++ b/external/prisma-client-rust/crates/generator-macros/src/select_include/definitions.rs @@ -0,0 +1,107 @@ +use convert_case::Casing; +use prisma_client_rust_generator_shared::{Arity, RelationArity}; +use proc_macro2::TokenStream; +use quote::quote; +use syn::Field; + +use super::Input; + +pub fn definitions(input: &Input) -> TokenStream { + let Input { + dollar, + model_path, + schema_struct, + selectable_fields, + macro_rules, + .. + } = input; + + let mut attrs = quote! { + #[allow(warnings)] + #[derive(Debug, Clone, ::serde::Serialize, ::serde::Deserialize)] + }; + + if cfg!(feature = "specta") { + attrs.extend(quote! { + #[derive(::prisma_client_rust::specta::Type)] + #[specta(crate = prisma_client_rust::specta)] + }); + + attrs.extend(match ¯o_rules.name { + None => quote!(#[specta(inline)]), + Some(name) => { + let name_pascal = name.to_string().to_case(convert_case::Case::Pascal); + + quote! { + #[specta(rename = #name_pascal)] + } + } + }); + } + + let (fields, field_modules): (Vec<_>, Vec<_>) = schema_struct + .fields + .iter() + .filter_map(|field| { + let Field { + attrs, ty, ident, .. + } = &field; + + let field_in_selectables = selectable_fields + .iter() + .find(|item| Some(&item.name) == ident.as_ref()); + let field_in_selection = macro_rules + .selection + .iter() + .find(|item| Some(&item.name) == ident.as_ref()); + + if field_in_selectables.is_some() && field_in_selection.is_none() { + return None; + } + + let (field_type, field_module) = field_in_selectables + .zip(field_in_selection.and_then(|f| f.sub_selection.as_ref())) + .and_then(|(field_in_selectables, (variant, sub_selection))| { + let Arity::Relation(relation_model_path, arity) = &field_in_selectables.arity + else { + return None; + }; + + let value = quote! { + pub mod #ident { + #dollar::#relation_model_path::#variant! { + definitions @ #sub_selection + } + } + }; + + let base = quote!(#ident::Data); + + let typ = match arity { + RelationArity::One => base, + RelationArity::Many => quote!(Vec<#base>), + RelationArity::Optional => quote!(Option<#base>), + }; + + Some((typ, Some(value))) + }) + .unwrap_or_else(|| (quote!(#dollar::#model_path::#ty), None)); + + let field = quote! { + #(#attrs)* + pub #ident: #field_type + }; + + Some((field, field_module)) + }) + .unzip(); + + quote! { + #attrs + pub struct Data { + #(#fields),* + } + + #(#field_modules)* + } +} diff --git a/external/prisma-client-rust/crates/generator-macros/src/select_include/mod.rs b/external/prisma-client-rust/crates/generator-macros/src/select_include/mod.rs new file mode 100644 index 0000000..49eea15 --- /dev/null +++ b/external/prisma-client-rust/crates/generator-macros/src/select_include/mod.rs @@ -0,0 +1,244 @@ +mod definitions; +mod selection; + +use prisma_client_rust_generator_shared::select_include::SelectableFields; +use proc_macro2::TokenStream; +use quote::*; +use syn::{ + parse::{Parse, ParseStream}, + punctuated::Punctuated, + token::Paren, + *, +}; + +use definitions::*; +use selection::*; + +pub use prisma_client_rust_generator_shared::{ + select_include::Variant, Arity, FieldTuple, RelationArity, +}; + +#[derive(Debug)] +enum SectionOrName { + Section(Section), + Name(Ident), +} + +impl Parse for SectionOrName { + fn parse(input: ParseStream) -> syn::Result { + if input.peek2(Token![@]) { + let value = input.parse()?; + input.parse::()?; + + Ok(Self::Section(value)) + } else if input.peek(Ident) { + Ok(Self::Name(input.parse()?)) + } else { + Err(input.error("expected section or name")) + } + } +} + +#[derive(Debug)] +struct MacroRulesInput { + section: Option
, + // TODO: merge with name to have more accurate types + fn_args: Option>, + name: Option, + pub selection: Selection, +} + +impl Parse for MacroRulesInput { + fn parse(input: ParseStream) -> syn::Result { + Ok(Self { + section: { + if input.peek(Ident) && input.peek2(Token![@]) { + let value = input.parse()?; + input.parse::()?; + Some(value) + } else { + None + } + }, + fn_args: { + if input.peek(Paren) { + let content; + parenthesized!(content in input); + + let args = Punctuated::::parse_terminated(&content)? + .into_iter() + .collect(); + + input.parse::]>()?; + + Some(args) + } else { + None + } + }, + name: input.parse()?, + selection: input.parse()?, + }) + } +} + +#[derive(Debug)] +enum Section { + Definitions, + SelectionToParams, +} + +impl Parse for Section { + fn parse(input: ParseStream) -> syn::Result { + let value = input.parse::()?; + + match value.to_string().as_str() { + "definitions" => Ok(Self::Definitions), + "selection_to_params" => Ok(Self::SelectionToParams), + _ => Err(input.error("expected 'definitions' or 'selection_to_params'")), + } + } +} + +#[derive(Debug)] +pub struct Input { + dollar: Ident, + model_path: Path, + schema_struct: ItemStruct, + selectable_fields: SelectableFields, + macro_rules: MacroRulesInput, +} + +impl Parse for Input { + fn parse(input: ParseStream) -> syn::Result { + Ok(Self { + dollar: input.parse()?, + model_path: { + input.parse::()?; + input.parse()? + }, + schema_struct: { + input.parse::()?; + input.parse()? + }, + selectable_fields: { + input.parse::()?; + + input.parse()? + }, + macro_rules: { + input.parse::()?; + + let contents; + braced!(contents in input); + contents.parse()? + }, + }) + } +} + +pub fn proc_macro(input: proc_macro::TokenStream, variant: Variant) -> proc_macro::TokenStream { + let input = parse_macro_input!(input as Input); + + let Input { macro_rules, .. } = &input; + + match ¯o_rules.section { + Some(Section::Definitions) => definitions(&input), + Some(Section::SelectionToParams) => { + let params = selection_to_params(&input, variant); + quote!([#(#params),*]) + } + None => { + let definitions = definitions(&input); + let selection_struct = selection_struct(&input, variant); + let selection = selection(&input, variant); + + let variant_ident = format_ident!("{variant}"); + + match ¯o_rules.name { + Some(module_name) => { + let fn_args = macro_rules + .fn_args + .as_ref() + .map(|fn_args| { + let iter = fn_args.iter(); + quote!(#(#iter),*) + }) + .unwrap_or_default(); + + quote! { + #[allow(warnings)] + pub mod #module_name { + use super::*; + + #definitions + #selection_struct + + pub fn #variant_ident(#fn_args) -> Selection { + #selection + } + } + } + } + None => { + quote! {{ + #definitions + #selection_struct + #selection + }} + } + } + } + } + .into() +} + +struct FactoryInput { + internal_name: Ident, + public_name: Ident, + // model_path & fields + rest: TokenStream, +} + +impl Parse for FactoryInput { + fn parse(input: ParseStream) -> syn::Result { + Ok(Self { + internal_name: input.parse()?, + public_name: { + input.parse::()?; + input.parse()? + }, + rest: { + input.parse::()?; + input.parse()? + }, + }) + } +} + +// factory means rustfmt can work! +pub fn proc_macro_factory( + input: proc_macro::TokenStream, + variant: Variant, +) -> proc_macro::TokenStream { + let FactoryInput { + internal_name, + public_name, + rest, + } = parse_macro_input!(input as FactoryInput); + + quote! { + #[macro_export] + macro_rules! #internal_name { + ($($input:tt)+) => { + ::prisma_client_rust::macros::#variant! { + $crate, + #rest, + { $($input)+ } + } + }; + } + pub use #internal_name as #public_name; + } + .into() +} diff --git a/external/prisma-client-rust/crates/generator-macros/src/select_include/selection/arg.rs b/external/prisma-client-rust/crates/generator-macros/src/select_include/selection/arg.rs new file mode 100644 index 0000000..5098e7d --- /dev/null +++ b/external/prisma-client-rust/crates/generator-macros/src/select_include/selection/arg.rs @@ -0,0 +1,35 @@ +use proc_macro2::TokenStream; +use quote::*; +use syn::{ + parse::{Parse, ParseStream}, + *, +}; + +#[derive(Debug)] +pub struct SelectionArg { + name: Ident, + values: TokenStream, +} + +impl Parse for SelectionArg { + fn parse(input: ParseStream) -> syn::Result { + input.parse::()?; + + Ok(Self { + name: input.parse()?, + values: { + let content; + parenthesized!(content in input); + + content.parse()? + }, + }) + } +} + +impl ToTokens for SelectionArg { + fn to_tokens(&self, tokens: &mut TokenStream) { + let Self { name, values } = self; + tokens.extend(quote!(.#name(#values))) + } +} diff --git a/external/prisma-client-rust/crates/generator-macros/src/select_include/selection/filters.rs b/external/prisma-client-rust/crates/generator-macros/src/select_include/selection/filters.rs new file mode 100644 index 0000000..c1fb7eb --- /dev/null +++ b/external/prisma-client-rust/crates/generator-macros/src/select_include/selection/filters.rs @@ -0,0 +1,25 @@ +use proc_macro2::TokenStream; +use quote::*; +use syn::{ + parenthesized, + parse::{Parse, ParseStream}, +}; + +#[derive(Debug)] +pub struct SelectionFilters(TokenStream); + +impl Parse for SelectionFilters { + fn parse(input: ParseStream) -> syn::Result { + let content; + parenthesized!(content in input); + + Ok(Self(content.parse()?)) + } +} + +impl ToTokens for SelectionFilters { + fn to_tokens(&self, tokens: &mut TokenStream) { + let Self(inner) = self; + tokens.extend(quote!((#inner))) + } +} diff --git a/external/prisma-client-rust/crates/generator-macros/src/select_include/selection/item.rs b/external/prisma-client-rust/crates/generator-macros/src/select_include/selection/item.rs new file mode 100644 index 0000000..e79c869 --- /dev/null +++ b/external/prisma-client-rust/crates/generator-macros/src/select_include/selection/item.rs @@ -0,0 +1,60 @@ +use prisma_client_rust_generator_shared::select_include::Variant; +use proc_macro2::TokenStream; +use quote::*; +use syn::{ + parse::{Parse, ParseStream}, + token::Paren, + *, +}; + +use super::*; + +#[derive(Debug)] +pub struct SelectionItem { + pub name: Ident, + pub filters: Option, + pub args: Vec, + // We don't parse here as we don't care about subselection. + // That gets passed on to another macro invoction. + pub sub_selection: Option<(Variant, TokenStream)>, +} + +impl Parse for SelectionItem { + fn parse(input: ParseStream) -> syn::Result { + Ok(Self { + name: input.parse()?, + filters: { + if input.peek(Paren) { + Some(input.parse()?) + } else { + None + } + }, + args: { + let mut ret = vec![]; + + while input.peek(Token![.]) { + ret.push(input.parse()?); + } + + ret + }, + sub_selection: { + if input.peek(Token![:]) { + input.parse::()?; + + let variant = input.parse()?; + + let content; + braced!(content in input); + // parse separately to re-wrap in braces for Selection::parse + let content = content.parse::()?; + + Some((variant, quote!({ #content }))) + } else { + None + } + }, + }) + } +} diff --git a/external/prisma-client-rust/crates/generator-macros/src/select_include/selection/mod.rs b/external/prisma-client-rust/crates/generator-macros/src/select_include/selection/mod.rs new file mode 100644 index 0000000..145aecc --- /dev/null +++ b/external/prisma-client-rust/crates/generator-macros/src/select_include/selection/mod.rs @@ -0,0 +1,181 @@ +mod arg; +mod filters; +mod item; + +use convert_case::*; +use prisma_client_rust_generator_shared::{select_include::Variant, Arity, RelationArity}; +use proc_macro2::TokenStream; +use quote::*; +use syn::{ + braced, + parse::{Parse, ParseStream}, +}; + +pub use arg::*; +pub use filters::*; +pub use item::*; + +use super::Input; + +pub fn selection(input: &Input, variant: Variant) -> TokenStream { + let Input { + dollar, model_path, .. + } = input; + + let scalar_selections = matches!(variant, Variant::Include).then(|| { + quote! { + <#dollar::#model_path::Types as ::prisma_client_rust::ModelTypes>::scalar_selections() + } + }).unwrap_or_else(|| quote!(Vec::<::prisma_client_rust::Selection>::new())); + + let selected_selections = selection_to_params(input, variant); + + quote! { + Selection( + #scalar_selections + .into_iter() + .chain([#(#selected_selections),*].into_iter().map(Into::into)) + .collect() + ) + } +} + +pub fn selection_to_params(input: &Input, variant: Variant) -> Vec { + let Input { + dollar, + model_path, + macro_rules, + selectable_fields, + .. + } = input; + + let variant_param = variant.param(); + let variant_pascal = format_ident!("{}", variant.to_string().to_case(Case::Pascal)); + + macro_rules + .selection + .iter() + .map( + |SelectionItem { + name, + filters, + args, + sub_selection, + }| { + let Some(selectable_item) = selectable_fields + .iter() + .find(|field| &field.name == name) else { + return quote_spanned!(name.span() => compile_error!("Field not found in selectable fields")) + }; + + let into = quote!(Into::<#dollar::#model_path::#variant_param>::into); + let variant_type_path = quote!(#dollar::#model_path::#name::#variant_pascal); + + let filters = filters + .as_ref() + .map(|s| quote!(#s)) + .unwrap_or_else(|| quote!(vec![])); + + match &selectable_item.arity { + Arity::Scalar => quote! { + #into(#variant_type_path) + }, + Arity::Relation(relation_model_path, relation_arity) => { + match (relation_arity, sub_selection) { + (RelationArity::Many, None) => quote! { + #into( + #variant_type_path::Fetch( + #dollar::#relation_model_path::ManyArgs::new( + #filters + ) #(#args)* + ) + ) + }, + (RelationArity::Many, Some((selection_variant, selection))) => quote! { + #into( + #variant_type_path::#selection_variant( + #dollar::#relation_model_path::ManyArgs::new( + #filters + ) #(#args)*, + #dollar::#relation_model_path::#selection_variant! { + selection_to_params @ #selection + }.into_iter().collect() + ) + ) + }, + (RelationArity::One | RelationArity::Optional, None) => quote! { + #into(#variant_type_path::Fetch) + }, + ( + RelationArity::One | RelationArity::Optional, + Some((selection_variant, selection)), + ) => quote! { + #into( + #variant_type_path::#selection_variant( + #dollar::#relation_model_path::#selection_variant! { + selection_to_params @ #selection + }.into_iter().collect() + ) + ) + }, + } + } + } + }, + ) + .collect() +} + +pub fn selection_struct(input: &Input, variant: Variant) -> TokenStream { + let Input { + dollar, model_path, .. + } = input; + + let selection_type = variant.type_trait(); + + quote! { + pub struct Selection(Vec<::prisma_client_rust::Selection>); + + impl ::prisma_client_rust::#selection_type for Selection { + type Data = Data; + type ModelData = #dollar::#model_path::Data; + + fn to_selections(self) -> Vec<::prisma_client_rust::Selection> { + self.0 + } + } + } +} + +#[derive(Debug)] +pub struct Selection(Vec); + +impl Selection { + pub fn iter(&self) -> impl Iterator { + self.0.iter() + } +} + +impl IntoIterator for Selection { + type Item = SelectionItem; + type IntoIter = std::vec::IntoIter; + + fn into_iter(self) -> Self::IntoIter { + self.0.into_iter() + } +} + +impl Parse for Selection { + fn parse(input: ParseStream) -> syn::Result { + let contents; + braced!(contents in input); + + let mut ret = vec![]; + + while !contents.is_empty() { + ret.push(contents.parse()?); + } + + Ok(Self(ret)) + } +} diff --git a/external/prisma-client-rust/crates/generator-shared/Cargo.toml b/external/prisma-client-rust/crates/generator-shared/Cargo.toml new file mode 100644 index 0000000..aee6168 --- /dev/null +++ b/external/prisma-client-rust/crates/generator-shared/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "prisma-client-rust-generator-shared" +version = "0.1.0" +edition = "2021" + +[dependencies] +convert_case.workspace = true +proc-macro2 = "1.0.39" +quote = "1.0.18" +syn = { version = "1.0.91", features = ["extra-traits"] } + +prisma-client-rust-sdk = { path = "../sdk" } diff --git a/external/prisma-client-rust/crates/generator-shared/src/lib.rs b/external/prisma-client-rust/crates/generator-shared/src/lib.rs new file mode 100644 index 0000000..714349b --- /dev/null +++ b/external/prisma-client-rust/crates/generator-shared/src/lib.rs @@ -0,0 +1,149 @@ +use prisma_client_rust_sdk::{ + prelude::*, + prisma::prisma_models::{ + walkers::{FieldWalker, RefinedFieldWalker}, + FieldArity, + }, +}; +use proc_macro2::TokenStream; +use quote::{quote, ToTokens}; +use syn::{ + parenthesized, + parse::{Parse, ParseStream}, + parse_quote, Ident, Path, Token, +}; + +pub mod select_include; + +#[derive(Debug)] +pub enum RelationArity { + One, + Many, + Optional, +} + +impl Parse for RelationArity { + fn parse(input: ParseStream) -> syn::Result { + let ident = input.parse::()?; + + Ok(match ident.to_string().as_str() { + "One" => Self::One, + "Many" => Self::Many, + "Optional" => Self::Optional, + _ => { + return Err(syn::Error::new_spanned( + ident, + "expected `One`, `Many`, or `Optional`", + )) + } + }) + } +} + +impl ToTokens for RelationArity { + fn to_tokens(&self, tokens: &mut TokenStream) { + tokens.extend(match self { + Self::One => quote!(One), + Self::Many => quote!(Many), + Self::Optional => quote!(Optional), + }) + } +} + +#[derive(Debug)] +pub enum Arity { + Scalar, + Relation(Path, RelationArity), +} + +impl Parse for Arity { + fn parse(input: ParseStream) -> syn::Result { + let ident = input.parse::()?; + + Ok(match ident.to_string().as_str() { + "Scalar" => Self::Scalar, + "Relation" => { + let content; + parenthesized!(content in input); + + Self::Relation(content.parse()?, { + content.parse::()?; + content.parse()? + }) + } + _ => { + return Err(syn::Error::new_spanned( + ident, + "expected `Scalar` or `Relation`", + )) + } + }) + } +} + +impl ToTokens for Arity { + fn to_tokens(&self, tokens: &mut TokenStream) { + match self { + Self::Scalar => tokens.extend(quote!(Scalar)), + Self::Relation(path, arity) => tokens.extend(quote!(Relation(#path, #arity))), + } + } +} + +#[derive(Debug)] +pub struct FieldTuple { + pub name: Ident, + pub arity: Arity, +} + +impl FieldTuple { + pub fn new(field: FieldWalker, module_path: &TokenStream) -> Self { + let field_name_snake = snake_ident(field.name()); + + let arity = match field.refine() { + RefinedFieldWalker::Scalar(_) => Arity::Scalar, + RefinedFieldWalker::Relation(relation_field) => { + let related_model_name_snake = snake_ident(relation_field.related_model().name()); + + let relation_arity = match &field.ast_field().arity { + FieldArity::List => RelationArity::Many, + FieldArity::Optional => RelationArity::Optional, + FieldArity::Required => RelationArity::One, + }; + + Arity::Relation( + parse_quote!(#module_path #related_model_name_snake), + relation_arity, + ) + } + }; + + FieldTuple { + name: field_name_snake, + arity, + } + } +} + +impl Parse for FieldTuple { + fn parse(input: ParseStream) -> syn::Result { + let content; + parenthesized!(content in input); + + Ok(Self { + name: content.parse()?, + arity: { + content.parse::()?; + content.parse()? + }, + }) + } +} + +impl ToTokens for FieldTuple { + fn to_tokens(&self, tokens: &mut TokenStream) { + let Self { name, arity } = self; + + tokens.extend(quote!((#name, #arity))); + } +} diff --git a/external/prisma-client-rust/crates/generator-shared/src/select_include/mod.rs b/external/prisma-client-rust/crates/generator-shared/src/select_include/mod.rs new file mode 100644 index 0000000..5f48540 --- /dev/null +++ b/external/prisma-client-rust/crates/generator-shared/src/select_include/mod.rs @@ -0,0 +1,5 @@ +mod selectable_fields; +mod variant; + +pub use selectable_fields::*; +pub use variant::*; diff --git a/external/prisma-client-rust/crates/generator-shared/src/select_include/selectable_fields.rs b/external/prisma-client-rust/crates/generator-shared/src/select_include/selectable_fields.rs new file mode 100644 index 0000000..0209ac2 --- /dev/null +++ b/external/prisma-client-rust/crates/generator-shared/src/select_include/selectable_fields.rs @@ -0,0 +1,54 @@ +use prisma_client_rust_sdk::prisma::prisma_models::walkers::FieldWalker; +use proc_macro2::TokenStream; +use quote::*; +use syn::{ + bracketed, + parse::{Parse, ParseStream}, + punctuated::Punctuated, + Token, +}; + +use crate::FieldTuple; + +#[derive(Debug)] +pub struct SelectableFields(Vec); + +impl SelectableFields { + pub fn new<'a>( + fields: impl Iterator>, + module_path: &TokenStream, + ) -> Self { + Self( + fields + .map(|field| FieldTuple::new(field, module_path)) + .collect(), + ) + } +} + +impl Parse for SelectableFields { + fn parse(input: ParseStream) -> syn::Result { + let contents; + bracketed!(contents in input); + + Ok(Self( + Punctuated::::parse_terminated(&contents)? + .into_iter() + .collect(), + )) + } +} + +impl ToTokens for SelectableFields { + fn to_tokens(&self, tokens: &mut TokenStream) { + let Self(fields) = self; + + tokens.extend(quote!([#(#fields),*])) + } +} + +impl SelectableFields { + pub fn iter(&self) -> impl Iterator { + self.0.iter() + } +} diff --git a/external/prisma-client-rust/crates/generator-shared/src/select_include/variant.rs b/external/prisma-client-rust/crates/generator-shared/src/select_include/variant.rs new file mode 100644 index 0000000..9713e54 --- /dev/null +++ b/external/prisma-client-rust/crates/generator-shared/src/select_include/variant.rs @@ -0,0 +1,58 @@ +use convert_case::{Case, Casing}; +use proc_macro2::TokenStream; +use quote::*; +use syn::{ + parse::{Parse, ParseStream}, + Ident, +}; + +mod kw { + syn::custom_keyword!(select); + syn::custom_keyword!(include); +} + +#[derive(Debug, Clone, Copy)] +pub enum Variant { + Select, + Include, +} + +impl Variant { + pub fn type_trait(&self) -> Ident { + format_ident!("{}Type", self.to_string().to_case(Case::Pascal)) + } + + pub fn param(&self) -> Ident { + format_ident!("{}Param", self.to_string().to_case(Case::Pascal)) + } +} + +impl Parse for Variant { + fn parse(input: ParseStream) -> syn::Result { + if input.peek(kw::select) { + input.parse::().map(|_| Self::Select) + } else if input.peek(kw::include) { + input.parse::().map(|_| Self::Include) + } else { + Err(input.error("expected 'select' or 'include'")) + } + } +} + +impl core::fmt::Display for Variant { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let s = match self { + Self::Select => "select", + Self::Include => "include", + }; + + write!(f, "{}", s) + } +} + +impl ToTokens for Variant { + fn to_tokens(&self, tokens: &mut TokenStream) { + let ident = format_ident!("{self}"); + tokens.extend(quote!(#ident)); + } +} diff --git a/external/prisma-client-rust/crates/generator/Cargo.toml b/external/prisma-client-rust/crates/generator/Cargo.toml new file mode 100644 index 0000000..ed305b1 --- /dev/null +++ b/external/prisma-client-rust/crates/generator/Cargo.toml @@ -0,0 +1,41 @@ +[package] +name = "prisma-client-rust-generator" +version = "0.6.8" +authors = ["Brendan Allan "] +edition = "2021" +rust-version = "1.62" + +[features] +specta = [] +# rspc = ["specta"] +migrations = [] +sqlite-create-many = ["prisma-client-rust-sdk/sqlite-create-many"] +# mutation-callbacks = [] +mocking = [] + +mysql = ["prisma-client-rust-sdk/mysql"] +sqlite = ["prisma-client-rust-sdk/sqlite"] +mssql = ["prisma-client-rust-sdk/mssql"] +postgresql = ["prisma-client-rust-sdk/postgresql"] +mongodb = ["prisma-client-rust-sdk/mongodb"] + +[dependencies] +serde_json.workspace = true +serde.workspace = true +serde_path_to_error = "0.1.7" +quote = "1.0.18" +syn = { version = "1.0.91", features = ["full"] } +proc-macro2 = "1.0.39" +http = "0.2.6" +directories = "4.0.1" +flate2 = "1.0.23" +reqwest = { version = "0.11.10", features = [ + "blocking", + "native-tls-vendored", +] } +regex = "1.5.5" +thiserror = "1.0.37" +itertools = "0.13.0" + +prisma-client-rust-sdk = { path = "../sdk", default-features = false } +prisma-client-rust-generator-shared = { path = "../generator-shared" } diff --git a/external/prisma-client-rust/crates/generator/src/client.rs b/external/prisma-client-rust/crates/generator/src/client.rs new file mode 100644 index 0000000..30224d2 --- /dev/null +++ b/external/prisma-client-rust/crates/generator/src/client.rs @@ -0,0 +1,173 @@ +use prisma_client_rust_sdk::{prelude::*, GenerateArgs}; +use proc_macro2::TokenStream; +use quote::quote; + +pub fn generate(args: &GenerateArgs) -> TokenStream { + let model_actions = args + .schema + .db + .walk_models() + .map(|model| { + let model_name_snake = snake_ident(model.name()); + + quote! { + pub fn #model_name_snake(&self) -> super::#model_name_snake::Actions { + super::#model_name_snake::Actions { + client: &self.0, + } + } + } + }) + .collect::>(); + + let pcr = quote!(::prisma_client_rust); + + let migrate_fns = cfg!(feature = "migrations").then(|| { + quote! { + pub async fn _migrate_deploy(&self) -> Result<(), #pcr::migrations::MigrateDeployError> { + let res = #pcr::migrations::migrate_deploy(super::DATAMODEL_STR, super::MIGRATIONS_DIR, &self.0.url()).await; + + // don't ask, just accept. + // migration engine seems to want some time to process things + #pcr::tokio::time::sleep(core::time::Duration::from_millis(1)).await; + + res + } + + pub async fn _migrate_resolve(&self, migration: &str) -> Result<(), #pcr::migrations::MigrateResolveError> { + #pcr::migrations::migrate_resolve(migration, super::DATAMODEL_STR, super::MIGRATIONS_DIR, &self.0.url(),).await + } + + pub fn _db_push(&self) -> #pcr::migrations::DbPush { + #pcr::migrations::db_push(super::DATAMODEL_STR, &self.0.url()) + } + } + }); + + let callback_fn = cfg!(feature = "mutation-callbacks").then(|| { + quote! { + pub fn with_model_mutation_callback(mut self, callback: impl Fn(#pcr::ModelMutationCallbackData) + 'static + Send + Sync) -> Self { + self.action_notifier.model_mutation_callbacks.push(Box::new(callback)); + self + } + } + }); + + let mock_ctor = cfg!(feature = "mocking").then(|| { + quote! { + pub fn _mock() -> (Self, #pcr::MockStore) { + let (internals, store) = #pcr::PrismaClientInternals::new_mock(#pcr::ActionNotifier::new()); + + (Self(internals), store) + } + } + }); + + let raw_queries = match args.connector.name() { + name if psl::builtin_connectors::MONGODB.name() == name => { + quote! { + pub fn _run_command_raw(&self, command: #pcr::serde_json::Value) -> #pcr::RunCommandRaw { + #pcr::RunCommandRaw::new( + &self.0, + command + ) + } + } + } + _ => quote! { + pub fn _query_raw(&self, query: #pcr::Raw) -> #pcr::QueryRaw { + #pcr::QueryRaw::new( + &self.0, + query, + super::DATABASE_STR, + ) + } + + pub fn _execute_raw(&self, query: #pcr::Raw) -> #pcr::ExecuteRaw { + #pcr::ExecuteRaw::new( + &self.0, + query, + super::DATABASE_STR, + ) + } + }, + }; + + quote! { + pub struct PrismaClientBuilder { + url: Option, + action_notifier: #pcr::ActionNotifier, + } + + impl PrismaClientBuilder { + fn new() -> Self { + Self { + url: None, + action_notifier: #pcr::ActionNotifier::new() + } + } + + pub fn with_url(mut self, url: String) -> Self { + self.url = Some(url); + self + } + + #callback_fn + + pub async fn build(self) -> Result { + let internals = #pcr::PrismaClientInternals::new( + self.url, + self.action_notifier, + super::DATAMODEL_STR + ).await?; + + Ok(PrismaClient(internals)) + } + } + + pub struct PrismaClient(#pcr::PrismaClientInternals); + + impl ::std::fmt::Debug for PrismaClient { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + f.debug_struct("PrismaClient") + .finish() + } + } + + impl PrismaClient { + pub fn _builder() -> PrismaClientBuilder { + PrismaClientBuilder::new() + } + + #mock_ctor + + #raw_queries + + pub async fn _batch<'batch, T: #pcr::BatchContainer<'batch, Marker>, Marker>(&self, queries: T) -> #pcr::Result<>::ReturnType> { + #pcr::batch(queries, &self.0).await + } + + pub fn _transaction(&self) -> #pcr::TransactionBuilder { + #pcr::TransactionBuilder::_new(self, &self.0) + } + + #migrate_fns + + #(#model_actions)* + } + + impl #pcr::PrismaClient for PrismaClient { + fn internals(&self) -> &#pcr::PrismaClientInternals { + &self.0 + } + + fn internals_mut(&mut self) -> &mut #pcr::PrismaClientInternals { + &mut self.0 + } + + fn with_tx_id(&self, tx_id: Option<#pcr::query_core::TxId>) -> Self { + Self(self.0.with_tx_id(tx_id)) + } + } + } +} diff --git a/external/prisma-client-rust/crates/generator/src/composite_types/data.rs b/external/prisma-client-rust/crates/generator/src/composite_types/data.rs new file mode 100644 index 0000000..33ce829 --- /dev/null +++ b/external/prisma-client-rust/crates/generator/src/composite_types/data.rs @@ -0,0 +1,33 @@ +use prisma_client_rust_sdk::prisma::prisma_models::walkers::CompositeTypeWalker; + +use crate::prelude::*; + +pub fn struct_definition(ty: CompositeTypeWalker) -> TokenStream { + let fields = ty.fields().flat_map(|field| { + let field_name_str = field.name(); + let field_name_snake = snake_ident(field.name()); + let field_ty = field.type_tokens("e!())?; + + Some(quote! { + #[serde(rename = #field_name_str)] + pub #field_name_snake: #field_ty + }) + }); + + let specta_derive = cfg!(feature = "specta").then(|| { + let ty_name_pascal_str = pascal_ident(ty.name()).to_string(); + + quote! { + #[derive(::prisma_client_rust::specta::Type)] + #[specta(rename = #ty_name_pascal_str, crate = prisma_client_rust::specta)] + } + }); + + quote! { + #[derive(Debug, Clone, ::serde::Serialize, ::serde::Deserialize)] + #specta_derive + pub struct Data { + #(#fields),* + } + } +} diff --git a/external/prisma-client-rust/crates/generator/src/composite_types/mod.rs b/external/prisma-client-rust/crates/generator/src/composite_types/mod.rs new file mode 100644 index 0000000..e20b8e0 --- /dev/null +++ b/external/prisma-client-rust/crates/generator/src/composite_types/mod.rs @@ -0,0 +1,129 @@ +mod data; +mod order_by; +mod set_params; +mod where_params; + +use std::collections::BTreeMap; + +use prisma_client_rust_sdk::{ + prelude::*, + prisma::{prisma_models::walkers::CompositeTypeWalker, psl::parser_database::ScalarFieldType}, +}; + +pub fn scalar_selections_fn( + comp_type: CompositeTypeWalker, + module_path: &TokenStream, +) -> TokenStream { + let pcr = quote!(::prisma_client_rust); + + let selections = comp_type.fields().flat_map(|field| { + let field_name_snake = snake_ident(field.name()); + + Some(match field.r#type() { + ScalarFieldType::BuiltInScalar(_) | ScalarFieldType::Enum(_) => { + field.type_tokens(module_path)?; + quote!(#pcr::sel(#field_name_snake::NAME)) + } + ScalarFieldType::CompositeType(id) => { + let comp_type = comp_type.db.walk(id); + + let field_comp_type_snake = snake_ident(comp_type.name()); + + quote! { + #pcr::Selection::new( + #field_name_snake::NAME, + None, + [], + super::#field_comp_type_snake::scalar_selections() + ) + } + } + ScalarFieldType::Unsupported(_) => return None, + }) + }); + + quote! { + pub fn scalar_selections() -> Vec<::prisma_client_rust::Selection> { + vec![#(#selections),*] + } + } +} + +pub fn modules(args: &GenerateArgs, module_path: &TokenStream) -> Vec { + args.schema + .db + .walk_composite_types() + .map(|comp_type| { + let scalar_selections_fn = scalar_selections_fn(comp_type, module_path); + + let data_struct = data::struct_definition(comp_type); + let order_by_enum = order_by::enum_definition(comp_type, args); + let create_fn = set_params::create_fn(comp_type); + + let parts = CompositeTypeModulePart::combine(vec![ + set_params::module_part(comp_type), + where_params::module_part(comp_type), + ]); + + Module::new( + comp_type.name(), + quote! { + use super::*; + use super::_prisma::*; + + #scalar_selections_fn + + #parts + + #data_struct + + #create_fn + + #order_by_enum + }, + ) + }) + .collect() +} + +pub struct CompositeTypeModulePart { + data: TokenStream, + fields: BTreeMap, +} + +impl CompositeTypeModulePart { + pub fn combine(parts: Vec) -> TokenStream { + let (data, fields): (Vec<_>, Vec<_>) = + parts.into_iter().map(|p| (p.data, p.fields)).unzip(); + + let field_stuff = fields + .into_iter() + .flat_map(|p| p.into_iter()) + .fold(BTreeMap::new(), |mut acc, (k, v)| { + let entry = acc.entry(k).or_insert_with(|| vec![]); + entry.push(v); + acc + }) + .into_iter() + .map(|(field_name_str, data)| { + let field_name_snake = snake_ident(&field_name_str); + + quote! { + pub mod #field_name_snake { + use super::super::*; + use super::{SetParam, WhereParam}; + + pub const NAME: &str = #field_name_str; + + #(#data)* + } + } + }); + + quote! { + #(#data)* + + #(#field_stuff)* + } + } +} diff --git a/external/prisma-client-rust/crates/generator/src/composite_types/order_by.rs b/external/prisma-client-rust/crates/generator/src/composite_types/order_by.rs new file mode 100644 index 0000000..d0edc2a --- /dev/null +++ b/external/prisma-client-rust/crates/generator/src/composite_types/order_by.rs @@ -0,0 +1,154 @@ +use prisma_client_rust_sdk::prisma::{ + dmmf::TypeLocation, + prisma_models::{walkers::CompositeTypeWalker, FieldArity}, + psl::parser_database::ScalarFieldType, +}; + +use crate::prelude::*; + +pub fn enum_definition(comp_type: CompositeTypeWalker, args: &GenerateArgs) -> TokenStream { + let pcr = quote!(::prisma_client_rust); + + let (variants, into_pv_arms): (Vec<_>, Vec<_>) = comp_type + .fields() + .flat_map(|field| { + let field_name_snake = snake_ident(field.name()); + let field_name_pascal = pascal_ident(field.name()); + + if field.ast_field().arity.is_list() { + return None; + } + + Some(match field.r#type() { + ScalarFieldType::CompositeType(id) => { + let comp_type = field.db.walk(id); + + let composite_type_snake = snake_ident(comp_type.name()); + + ( + quote!(#field_name_pascal(Vec)), + quote! { + Self::#field_name_pascal(params) => ( + #field_name_snake::NAME, + #pcr::PrismaValue::Object( + params + .into_iter() + .map(Into::into) + .collect() + ) + ) + }, + ) + } + _ => ( + quote!(#field_name_pascal(SortOrder)), + quote! { + Self::#field_name_pascal(direction) => ( + #field_name_snake::NAME, + #pcr::PrismaValue::String(direction.to_string()) + ) + }, + ), + }) + }) + .unzip(); + + let _ = args + .dmmf + .schema + .find_input_type(&format!("{}OrderByInput", comp_type.name())) + .map(|input_type| { + let ((variants, into_pv_arms), field_stuff): ((Vec<_>, Vec<_>), Vec<_>) = input_type + .fields + .iter() + .flat_map(|field| { + let field_name_str = &field.name; + let field_name_pascal = pascal_ident(&field.name); + + let typ_ref = &field.input_types[0]; + let typ = typ_ref.to_tokens( + "e!(super::), + &FieldArity::Required, + &args.schema.db, + )?; + + let pv = match &typ_ref.location { + TypeLocation::EnumTypes | TypeLocation::Scalar => quote!(param.into()), + TypeLocation::InputObjectTypes => quote! { + #pcr::PrismaValue::Object( + param.into_iter().map(Into::into).collect() + ) + }, + _ => return None, + }; + + Some(( + ( + quote!(#field_name_pascal(#typ)), + quote! { + Self::#field_name_pascal(param) => ( + #field_name_str, + #pv + ) + }, + ), + ( + field_name_str, + ( + typ_ref.to_tokens( + "e!(), + &FieldArity::Required, + &args.schema.db, + )?, + quote! { + impl From for super::OrderByWithRelationParam { + fn from(Order(v): Order) -> Self { + Self::#field_name_pascal(v) + } + } + }, + ), + ), + )) + }) + .unzip(); + + ( + quote! { + #[derive(Debug, Clone)] + pub enum OrderByParam { + #(#variants),* + } + + impl Into<(String, #pcr::PrismaValue)> for OrderByParam { + fn into(self) -> (String, #pcr::PrismaValue) { + let (k, v) = match self { + #(#into_pv_arms),* + }; + + (k.to_string(), v) + } + } + }, + field_stuff, + ) + }) + .unwrap_or_default(); + + quote! { + #[derive(Debug, Clone)] + pub enum OrderByParam { + #(#variants),* + } + + impl Into<(String, #pcr::PrismaValue)> for OrderByParam { + fn into(self) -> (String, #pcr::PrismaValue) { + let (k, v) = match self { + #(#into_pv_arms),* + }; + + (k.to_string(), v) + } + } + } +} diff --git a/external/prisma-client-rust/crates/generator/src/composite_types/set_params.rs b/external/prisma-client-rust/crates/generator/src/composite_types/set_params.rs new file mode 100644 index 0000000..8b9160b --- /dev/null +++ b/external/prisma-client-rust/crates/generator/src/composite_types/set_params.rs @@ -0,0 +1,106 @@ +use prisma_client_rust_sdk::{prelude::*, prisma::prisma_models::walkers::CompositeTypeWalker}; + +use super::CompositeTypeModulePart; + +pub fn create_fn(comp_type: CompositeTypeWalker) -> Option { + comp_type + .fields() + .filter(|f| f.required_on_create()) + .map(|field| { + Some(( + snake_ident(field.name()), + field.type_tokens("e!(super::))?, + )) + }) + .collect::>>() + .map(|v| { + let (required_field_names, required_field_types): (Vec<_>, Vec<_>) = + v.into_iter().unzip(); + + let required_fields_wrapped = required_field_names + .iter() + .map(|name_snake| quote!(#name_snake::set(self.#name_snake))); + + quote! { + #[derive(Debug, Clone)] + pub struct Create { + #(pub #required_field_names: #required_field_types,)* + pub _params: Vec + } + + impl Create { + pub fn to_params(self) -> Vec { + let mut _params = self._params; + _params.extend([ + #(#required_fields_wrapped),* + ]); + _params + } + } + + pub fn create( + #(#required_field_names: #required_field_types,)* + _params: Vec + ) -> Create { + Create { + #(#required_field_names,)* + _params + }.into() + } + } + }) +} + +pub fn module_part(comp_type: CompositeTypeWalker) -> CompositeTypeModulePart { + let ((variants, into_pv_arms), fields): ((Vec<_>, Vec<_>), _) = comp_type + .fields() + .flat_map(|field| { + let field_name_snake = snake_ident(field.name()); + let field_name_pascal = pascal_ident(field.name()); + let field_type = field.type_tokens("e!(super::))?; + + let variant_name = format_ident!("Set{field_name_pascal}"); + let converter = field.type_prisma_value(&format_ident!("value"))?; + + Some(( + ( + quote!(#variant_name(#field_type)), + quote! { + SetParam::#variant_name(value) => ( + #field_name_snake::NAME, + #converter + ) + }, + ), + ( + field.name().to_string(), + quote! { + pub fn set(val: #field_type) -> SetParam { + SetParam::#variant_name(val) + } + }, + ), + )) + }) + .unzip(); + + CompositeTypeModulePart { + data: quote! { + #[derive(Debug, Clone)] + pub enum SetParam { + #(#variants),* + } + + impl From for (String, ::prisma_client_rust::PrismaValue) { + fn from(v: SetParam) -> Self { + let (k, v) = match v { + #(#into_pv_arms),* + }; + + (k.to_string(), v) + } + } + }, + fields, + } +} diff --git a/external/prisma-client-rust/crates/generator/src/composite_types/where_params.rs b/external/prisma-client-rust/crates/generator/src/composite_types/where_params.rs new file mode 100644 index 0000000..0ecee92 --- /dev/null +++ b/external/prisma-client-rust/crates/generator/src/composite_types/where_params.rs @@ -0,0 +1,63 @@ +use prisma_client_rust_sdk::prisma::prisma_models::walkers::CompositeTypeWalker; + +use crate::prelude::*; + +use super::CompositeTypeModulePart; + +pub fn module_part(comp_type: CompositeTypeWalker) -> CompositeTypeModulePart { + let pcr = quote!(::prisma_client_rust); + + let ((variants, match_arms), fields): ((Vec<_>, Vec<_>), _) = comp_type + .fields() + .map(|field| { + let field_name_snake = snake_ident(field.name()); + let field_name_pascal = pascal_ident(field.name()); + + let field_type = field.type_tokens("e!()); + let value_ident = format_ident!("value"); + let value_to_pv = field.type_prisma_value(&value_ident); + + let where_variant_name = format_ident!("{field_name_pascal}Equals"); + + ( + ( + quote!(#where_variant_name(#field_type)), + quote! { + Self::#where_variant_name(#value_ident) => ( + #field_name_snake::NAME, + #value_to_pv + ) + }, + ), + ( + field.name().to_string(), + quote! { + pub fn equals(val: #field_type) -> WhereParam { + WhereParam::#where_variant_name(val) + } + }, + ), + ) + }) + .unzip(); + + CompositeTypeModulePart { + data: quote! { + #[derive(Debug, Clone)] + pub enum WhereParam { + #(#variants),* + } + + impl #pcr::WhereInput for WhereParam { + fn serialize(self) -> #pcr::SerializedWhereInput { + let (name, value) = match self { + #(#match_arms),* + }; + + #pcr::SerializedWhereInput::new(name.to_string(), #pcr::SerializedWhereValue::Value(value)) + } + } + }, + fields, + } +} diff --git a/external/prisma-client-rust/crates/generator/src/enums.rs b/external/prisma-client-rust/crates/generator/src/enums.rs new file mode 100644 index 0000000..a88b791 --- /dev/null +++ b/external/prisma-client-rust/crates/generator/src/enums.rs @@ -0,0 +1,63 @@ +use prisma_client_rust_sdk::{prelude::pascal_ident, GenerateArgs}; +use proc_macro2::TokenStream; +use quote::quote; + +pub fn generate(args: &GenerateArgs) -> TokenStream { + let enums = args.dmmf.data_model.enums.iter().map(|e| { + let name = pascal_ident(&e.name); + + let variants = e + .values + .iter() + .map(|v| { + let name = &v.name; + let variant_name = pascal_ident(&v.name); + + quote! { + #[serde(rename=#name)] + #variant_name + } + }) + .collect::>(); + + let match_arms = e + .values + .iter() + .map(|v| { + let name = &v.name; + let variant_name = pascal_ident(&v.name); + + quote!(Self::#variant_name => #name.to_string()) + }) + .collect::>(); + + let specta_derive = cfg!(feature = "specta").then(|| { + let model_name_pascal_str = name.to_string(); + + quote! { + #[derive(::prisma_client_rust::specta::Type)] + #[specta(rename = #model_name_pascal_str, crate = prisma_client_rust::specta)] + } + }); + + quote! { + #specta_derive + #[derive(Debug, Clone, Copy, ::serde::Serialize, ::serde::Deserialize, PartialEq, Eq)] + pub enum #name { + #(#variants),* + } + + impl ToString for #name { + fn to_string(&self) -> String { + match self { + #(#match_arms),* + } + } + } + } + }); + + quote! { + #(#enums)* + } +} diff --git a/external/prisma-client-rust/crates/generator/src/header.rs b/external/prisma-client-rust/crates/generator/src/header.rs new file mode 100644 index 0000000..803ba0f --- /dev/null +++ b/external/prisma-client-rust/crates/generator/src/header.rs @@ -0,0 +1,44 @@ +use proc_macro2::TokenStream; +use quote::quote; +use std::path::*; + +use crate::GenerateArgs; + +fn find_migrations_path(schema_path: &PathBuf) -> PathBuf { + schema_path + .parent() + .map(|p| p.join("migrations")) + .filter(|p| p.exists()) + .expect("Migrations folder not found! Please create one in the same folder as your schema.prisma file.") +} + +pub fn generate(args: &GenerateArgs) -> TokenStream { + let database_string = &args.engine_dmmf.datasources[0].provider; + + let pcr = quote!(::prisma_client_rust); + + let schema_path_str = &args.engine_dmmf.schema_path; + let schema_path = schema_path_str + .parse() + .expect("Failed to parse schema path!"); + + let migrations_include = cfg!(feature = "migrations") + .then(|| { + let migrations_path = find_migrations_path(&schema_path); + let migrations_path = migrations_path.to_str().expect("Invalid migrations path"); + + quote!( + use #pcr::migrations::include_dir; + pub static MIGRATIONS_DIR: &#pcr::migrations::include_dir::Dir = + &#pcr::migrations::include_dir::include_dir!(#migrations_path); + ) + }) + .unwrap_or_default(); + + quote! { + pub static DATAMODEL_STR: &'static str = include_str!(#schema_path_str); + static DATABASE_STR: &'static str = #database_string; + + #migrations_include + } +} diff --git a/external/prisma-client-rust/crates/generator/src/internal_enums.rs b/external/prisma-client-rust/crates/generator/src/internal_enums.rs new file mode 100644 index 0000000..39c6a57 --- /dev/null +++ b/external/prisma-client-rust/crates/generator/src/internal_enums.rs @@ -0,0 +1,82 @@ +use prisma_client_rust_sdk::prelude::*; +use proc_macro2::TokenStream; +use quote::quote; + +fn sort_order_impl() -> TokenStream { + let pcr = quote!(::prisma_client_rust); + + quote! { + impl Into<#pcr::PrismaValue> for SortOrder { + fn into(self) -> #pcr::PrismaValue { + match self { + SortOrder::Asc => #pcr::PrismaValue::String("asc".to_string()), + SortOrder::Desc => #pcr::PrismaValue::String("desc".to_string()), + } + } + } + } +} +pub fn generate(args: &GenerateArgs) -> TokenStream { + let internal_enums = args + .dmmf + .schema + .enum_types + .get("prisma") + .unwrap() + .iter() + .map(|e| { + let name = pascal_ident(&e.name); + + let variants = e + .values + .iter() + .map(|v| { + let variant_name = pascal_ident(v); + + quote! { + #[serde(rename=#v)] + #variant_name + } + }) + .collect::>(); + + let match_arms = e + .values + .iter() + .map(|name| { + let variant_name = pascal_ident(name); + + quote!(Self::#variant_name => #name.to_string()) + }) + .collect::>(); + + let isolation_level_impl = (&e.name == "TransactionIsolationLevel").then(|| quote! { + impl ::prisma_client_rust::TransactionIsolationLevel for TransactionIsolationLevel {} + }); + + quote! { + #[derive(Debug, Clone, Copy, ::serde::Serialize, ::serde::Deserialize, PartialEq, Eq)] + pub enum #name { + #(#variants),* + } + + impl ToString for #name { + fn to_string(&self) -> String { + match self { + #(#match_arms),* + } + } + } + + #isolation_level_impl + } + }); + + let sort_order_impl = sort_order_impl(); + + quote! { + #(#internal_enums)* + + #sort_order_impl + } +} diff --git a/external/prisma-client-rust/crates/generator/src/lib.rs b/external/prisma-client-rust/crates/generator/src/lib.rs new file mode 100644 index 0000000..0e15034 --- /dev/null +++ b/external/prisma-client-rust/crates/generator/src/lib.rs @@ -0,0 +1,93 @@ +#![allow(unexpected_cfgs)] + +mod client; +mod composite_types; +mod enums; +mod header; +mod internal_enums; +mod models; +mod read_filters; +mod write_params; + +use prisma_client_rust_sdk::prelude::*; +use serde::Serialize; + +fn default_module_path() -> String { + "prisma".to_string() +} + +#[derive(serde::Deserialize)] +pub struct Generator { + #[serde(default = "default_module_path")] + module_path: String, +} + +#[derive(Debug, Serialize, thiserror::Error)] +pub enum Error { + #[error("Failed to parse module_path")] + InvalidModulePath, +} + +impl PrismaGenerator for Generator { + const NAME: &'static str = "Prisma Client Rust"; + const DEFAULT_OUTPUT: &'static str = "../src/prisma.rs"; + + type Error = Error; + + fn generate(self, args: GenerateArgs) -> Result { + let header = header::generate(&args); + + let module_path = { + let provided: TokenStream = self + .module_path + .parse() + .map_err(|_| Error::InvalidModulePath)?; + + quote!(#provided::) + }; + + let enums = enums::generate(&args); + + let mut module = Module::new( + "client", + quote! { + #header + + pub use _prisma::*; + use prisma_client_rust::scalar_types::*; + + #enums + }, + ); + + let client = client::generate(&args); + let internal_enums = internal_enums::generate(&args); + let read_filters_module = read_filters::generate_module(&args); + let write_params_module = write_params::generate_module(&args); + + module.add_submodule(Module::new( + "_prisma", + quote! { + use super::*; + + #client + #internal_enums + #read_filters_module + #write_params_module + }, + )); + + models::modules(&args, &module_path) + .into_iter() + .for_each(|model| module.add_submodule(model)); + composite_types::modules(&args, &module_path) + .into_iter() + .for_each(|ct| module.add_submodule(ct)); + + Ok(module) + } +} + +pub fn run() { + Generator::run(); +} diff --git a/external/prisma-client-rust/crates/generator/src/models/actions.rs b/external/prisma-client-rust/crates/generator/src/models/actions.rs new file mode 100644 index 0000000..aa9a3b3 --- /dev/null +++ b/external/prisma-client-rust/crates/generator/src/models/actions.rs @@ -0,0 +1,229 @@ +use crate::prelude::{prisma::psl::datamodel_connector, *}; +use prisma_client_rust_sdk::{ + prisma::{prisma_models::walkers::ModelWalker, psl::parser_database::ScalarFieldType}, + GenerateArgs, +}; + +use super::required_fields; + +pub fn create_fn(model: ModelWalker) -> Option { + let (names, (types, push_wrapper)): (Vec<_>, (Vec<_>, Vec<_>)) = required_fields(model)? + .into_iter() + .map(|field| { + ( + snake_ident(field.inner.name()), + (field.typ, field.push_wrapper), + ) + }) + .unzip(); + + Some(quote! { + pub fn create(self, #(#names: #types,)* mut _params: Vec) -> CreateQuery<'a> { + _params.extend([ + #(#names::#push_wrapper(#names)),* + ]); + + CreateQuery::new( + self.client, + _params + ) + } + }) +} + +pub fn create_unchecked_fn(model: ModelWalker) -> Option { + required_fields(model)?; + + let (names, types): (Vec<_>, Vec<_>) = model + .scalar_fields() + .filter_map(|field| { + let name_snake = snake_ident(field.name()); + + if !field.required_on_create() { + return None; + } + + Some(( + name_snake, + match field.scalar_field_type() { + ScalarFieldType::CompositeType(id) => { + let comp_type = model.db.walk(id); + + let comp_type_snake = snake_ident(comp_type.name()); + + quote!(super::#comp_type_snake::Create) + } + _ => field.type_tokens("e!(super::))?, + }, + )) + }) + .unzip(); + + Some(quote! { + pub fn create_unchecked(self, #(#names: #types,)* mut _params: Vec) -> CreateUncheckedQuery<'a> { + _params.extend([ + #(#names::set(#names)),* + ]); + + CreateUncheckedQuery::new( + self.client, + _params.into_iter().map(Into::into).collect() + ) + } + }) +} + +pub fn create_many_fn(model: ModelWalker) -> Option { + model + .scalar_fields() + .all(|scalar_field| !scalar_field.required_on_create() || !scalar_field.is_unsupported()) + .then(|| { + quote! { + pub fn create_many(self, data: Vec) -> CreateManyQuery<'a> { + let data = data.into_iter().map(CreateUnchecked::to_params).collect(); + + CreateManyQuery::new( + self.client, + data + ) + } + } + }) +} + +pub fn upsert_fn(model: ModelWalker) -> Option { + // necessary to check whether CreateData is even available + let _ = required_fields(model)?; + + Some(quote! { + pub fn upsert( + self, + _where: UniqueWhereParam, + _create: Create, + _update: Vec + ) -> UpsertQuery<'a> { + UpsertQuery::new( + self.client, + _where, + _create.to_params(), + _update + ) + } + }) +} + +pub fn mongo_raw_fns() -> Option { + cfg!(feature = "mongodb").then(|| { + quote! { + pub fn find_raw(self) -> FindRawQuery<'a, T> { + FindRawQuery::new(self.client) + } + + pub fn aggregate_raw(self) -> AggregateRawQuery<'a, T> { + AggregateRawQuery::new(self.client) + } + } + }) +} + +pub fn struct_definition(model: ModelWalker, args: &GenerateArgs) -> TokenStream { + let pcr = quote!(::prisma_client_rust); + + let create_fn = create_fn(model); + let create_unchecked_fn = create_unchecked_fn(model); + let upsert_fn = upsert_fn(model); + let monogo_raw_fns = mongo_raw_fns(); + + let create_many_fn = (args + .connector + .capabilities() + .contains(datamodel_connector::ConnectorCapability::CreateMany)) + .then(|| create_many_fn(model)); + + quote! { + #[derive(Clone)] + pub struct Actions<'a> { + pub client: &'a #pcr::PrismaClientInternals, + } + + impl<'a> Actions<'a> { + pub fn find_unique(self, _where: UniqueWhereParam) -> FindUniqueQuery<'a> { + FindUniqueQuery::new( + self.client, + _where + ) + } + + pub fn find_first(self, _where: Vec) -> FindFirstQuery<'a> { + FindFirstQuery::new( + self.client, + _where + ) + } + + pub fn find_many(self, _where: Vec) -> FindManyQuery<'a> { + FindManyQuery::new( + self.client, + _where + ) + } + + #create_fn + #create_unchecked_fn + + #create_many_fn + + pub fn update(self, _where: UniqueWhereParam, _params: Vec) -> UpdateQuery<'a> { + UpdateQuery::new( + self.client, + _where, + _params, + vec![] + ) + } + + pub fn update_unchecked(self, _where: UniqueWhereParam, _params: Vec) -> UpdateUncheckedQuery<'a> { + UpdateUncheckedQuery::new( + self.client, + _where, + _params.into_iter().map(Into::into).collect(), + vec![] + ) + } + + pub fn update_many(self, _where: Vec, _params: Vec) -> UpdateManyQuery<'a> { + UpdateManyQuery::new( + self.client, + _where, + _params, + ) + } + + #upsert_fn + + pub fn delete(self, _where: UniqueWhereParam) -> DeleteQuery<'a> { + DeleteQuery::new( + self.client, + _where, + vec![] + ) + } + + pub fn delete_many(self, _where: Vec) -> DeleteManyQuery<'a> { + DeleteManyQuery::new( + self.client, + _where + ) + } + + pub fn count(self, _where: Vec) -> CountQuery<'a> { + CountQuery::new( + self.client, + _where + ) + } + + #monogo_raw_fns + } + } +} diff --git a/external/prisma-client-rust/crates/generator/src/models/create.rs b/external/prisma-client-rust/crates/generator/src/models/create.rs new file mode 100644 index 0000000..7870637 --- /dev/null +++ b/external/prisma-client-rust/crates/generator/src/models/create.rs @@ -0,0 +1,149 @@ +use itertools::Itertools; +use prisma_client_rust_sdk::prisma::{ + prisma_models::walkers::ModelWalker, psl::parser_database::ScalarFieldType, +}; + +use super::required_fields; +use crate::prelude::*; + +fn create_unchecked(model: ModelWalker) -> Option { + required_fields(model)?; + + let model_name_snake = snake_ident(model.name()); + + let (names, serdes, types): (Vec<_>, Vec<_>, Vec<_>) = model + .scalar_fields() + .filter_map(|field| { + let field_name_str = field.name(); + let name_snake = snake_ident(field.name()); + let serde_str = quote!(#[serde(rename = #field_name_str)]); + + if !field.required_on_create() { + return None; + } + + Some(( + name_snake, + serde_str, + match field.scalar_field_type() { + ScalarFieldType::CompositeType(id) => { + let comp_type = model.db.walk(id); + + let comp_type_snake = snake_ident(comp_type.name()); + + quote!(super::#comp_type_snake::Create) + } + _ => field.type_tokens("e!(super::))?, + }, + )) + }) + .multiunzip(); + + let specta_derive = cfg!(feature = "specta").then(|| { + let model_name_pascal_str = format!("{}Creation", pascal_ident(model.name())); + + quote! { + #[derive(::prisma_client_rust::specta::Type)] + #[specta(rename = #model_name_pascal_str, crate = prisma_client_rust::specta)] + } + }); + + Some(quote! { + #[derive(Debug, Clone, ::serde::Serialize, ::serde::Deserialize)] + #specta_derive + pub struct CreateUnchecked { + #( + #serdes + pub #names: #types, + )* + + #[serde(skip)] + pub _params: Vec + } + + impl CreateUnchecked { + pub fn to_query<'a>(self, client: &'a PrismaClient) -> CreateUncheckedQuery<'a> { + client.#model_name_snake() + .create_unchecked( + #(self.#names,)* + self._params + ) + } + + pub fn to_params(mut self) -> Vec { + self._params.extend([ + #(#names::set(self.#names)),* + ]); + + self._params + } + } + + pub fn create_unchecked(#(#names: #types,)* _params: Vec) + -> CreateUnchecked { + CreateUnchecked { + #(#names,)* + _params + } + } + }) +} + +fn create(model: ModelWalker) -> Option { + let model_name_snake = snake_ident(model.name()); + + let (names, (types, push_wrappers)): (Vec<_>, (Vec<_>, Vec<_>)) = required_fields(model)? + .into_iter() + .map(|field| { + ( + snake_ident(field.inner.name()), + (field.typ, field.push_wrapper), + ) + }) + .unzip(); + + Some(quote! { + #[derive(Debug, Clone)] + pub struct Create { + #(pub #names: #types,)* + pub _params: Vec + } + + impl Create { + pub fn to_query<'a>(self, client: &'a PrismaClient) -> CreateQuery<'a> { + client.#model_name_snake() + .create( + #(self.#names,)* + self._params + ) + } + + pub fn to_params(mut self) -> Vec { + self._params.extend([ + #(#names::#push_wrappers(self.#names)),* + ]); + + self._params + } + } + + pub fn create(#(#names: #types,)* _params: Vec) + -> Create { + Create { + #(#names,)* + _params + } + } + }) +} + +pub fn types(model: ModelWalker) -> TokenStream { + let create_unchecked = create_unchecked(model); + let create = create(model); + + quote! { + #create + + #create_unchecked + } +} diff --git a/external/prisma-client-rust/crates/generator/src/models/data.rs b/external/prisma-client-rust/crates/generator/src/models/data.rs new file mode 100644 index 0000000..0d7b159 --- /dev/null +++ b/external/prisma-client-rust/crates/generator/src/models/data.rs @@ -0,0 +1,178 @@ +use prisma_client_rust_sdk::prisma::{ + prisma_models::{ + walkers::{ModelWalker, RefinedFieldWalker}, + FieldArity, + }, + psl::parser_database::ScalarFieldType, +}; + +use crate::prelude::*; + +use super::ModelModulePart; + +pub fn model_data(model: ModelWalker) -> ModelModulePart { + let fields = model + .fields() + .flat_map(|field| { + let arity = field.ast_field().arity; + + let name = field.name().to_string(); + let (typ, recursive_safe_typ) = match field.refine() { + RefinedFieldWalker::Relation(relation_field) => { + let relation_model_name_snake = + snake_ident(relation_field.related_model().name()); + + let base_data = quote!(#relation_model_name_snake::Data); + + let typ = match arity { + FieldArity::List => (quote!(Vec<#base_data>), None), + FieldArity::Optional => ( + quote!(Option<#base_data>), + Some(quote!(Option>)), + ), + FieldArity::Required => (quote!(#base_data), Some(quote!(Box<#base_data>))), + }; + + typ + } + RefinedFieldWalker::Scalar(scalar_field) => { + match scalar_field.scalar_field_type() { + ScalarFieldType::CompositeType(id) => { + let comp_type = field.db.walk(id); + + let comp_type = snake_ident(comp_type.name()); + + let base_data = quote!(#comp_type::Data); + + let typ = match arity { + FieldArity::List => (quote!(Vec<#base_data>), None), + FieldArity::Optional => ( + quote!(Option<#base_data>), + Some(quote!(Option>)), + ), + FieldArity::Required => { + (quote!(#base_data), Some(quote!(Box<#base_data>))) + } + }; + + typ + } + _ => (field.type_tokens("e!(super::super::))?, None), + } + } + }; + + let recursive_safe_typ = recursive_safe_typ.unwrap_or_else(|| quote!(Type)); + + Some(( + name, + quote! { + pub type Type = #typ; + pub type RecursiveSafeType = #recursive_safe_typ; + }, + )) + }) + .collect(); + + ModelModulePart { + data: quote! {}, + fields, + } +} + +pub fn r#struct(model: ModelWalker) -> TokenStream { + let pcr = quote!(::prisma_client_rust); + + let struct_fields = model + .fields() + .filter(|f| f.ast_field().field_type.as_unsupported().is_none()) + .map(|field| match field.refine() { + RefinedFieldWalker::Relation(field) => { + let field_name_str = field.name(); + let field_name_snake = snake_ident(field_name_str); + + let attrs = match field.ast_field().arity { + FieldArity::Optional => { + quote! { + #[serde( + rename = #field_name_str, + default, + skip_serializing_if = "Option::is_none", + with = "prisma_client_rust::serde::double_option" + )] + } + } + _ => quote! { + #[serde(rename = #field_name_str)] + }, + }; + + let specta_attrs = cfg!(feature = "specta").then(|| quote!(#[specta(skip)])); + + quote! { + #attrs + #specta_attrs + pub #field_name_snake: Option<#field_name_snake::RecursiveSafeType> + } + } + RefinedFieldWalker::Scalar(field) => { + let field_name_str = field.name(); + let field_name_snake = snake_ident(field_name_str); + + quote! { + #[serde(rename = #field_name_str)] + pub #field_name_snake: #field_name_snake::Type + } + } + }); + + let relation_accessors = model.fields().filter_map(|field| match field.refine() { + RefinedFieldWalker::Relation(relation_field) => { + let field_name_snake = snake_ident(field.name()); + let relation_model_name_snake = snake_ident(&relation_field.related_model().name()); + + let access_error = + quote!(#pcr::RelationNotFetchedError::new(stringify!(#field_name_snake))); + + let (typ, map) = match field.ast_field().arity { + FieldArity::List => (quote!(&#field_name_snake::Type), None), + FieldArity::Required => ( + quote!(&super::#relation_model_name_snake::Data), + Some(quote!(.map(|v| v.as_ref()))), + ), + FieldArity::Optional => ( + quote!(Option<&super::#relation_model_name_snake::Data>), + Some(quote!(.map(|v| v.as_ref().map(|v| v.as_ref())))), + ), + }; + + Some(quote! { + pub fn #field_name_snake(&self) -> Result<#typ, #pcr::RelationNotFetchedError> { + self.#field_name_snake.as_ref().ok_or(#access_error) #map + } + }) + } + _ => None, + }); + + let specta_derive = cfg!(feature = "specta").then(|| { + let model_name_pascal_str = pascal_ident(model.name()).to_string(); + + quote! { + #[derive(::prisma_client_rust::specta::Type)] + #[specta(rename = #model_name_pascal_str, crate = prisma_client_rust::specta)] + } + }); + + quote! { + #[derive(Debug, Clone, ::serde::Serialize, ::serde::Deserialize)] + #specta_derive + pub struct Data { + #(#struct_fields),* + } + + impl Data { + #(#relation_accessors)* + } + } +} diff --git a/external/prisma-client-rust/crates/generator/src/models/filter.rs b/external/prisma-client-rust/crates/generator/src/models/filter.rs new file mode 100644 index 0000000..794c903 --- /dev/null +++ b/external/prisma-client-rust/crates/generator/src/models/filter.rs @@ -0,0 +1,20 @@ +use prisma_client_rust_generator_shared::select_include::SelectableFields; +use prisma_client_rust_sdk::prisma::prisma_models::walkers::ModelWalker; + +use crate::prelude::*; + +pub fn r#macro(model: ModelWalker, module_path: &TokenStream) -> TokenStream { + let model_name_snake = snake_ident(model.name()); + + let name = format_ident!("_{}_filter", model.name().to_case(Case::Snake, true)); + + let selectable_fields = SelectableFields::new(model.fields(), module_path); + + quote! { + ::prisma_client_rust::macros::filter_factory!( + #name, + #module_path #model_name_snake, + #selectable_fields + ); + } +} diff --git a/external/prisma-client-rust/crates/generator/src/models/mod.rs b/external/prisma-client-rust/crates/generator/src/models/mod.rs new file mode 100644 index 0000000..43feb34 --- /dev/null +++ b/external/prisma-client-rust/crates/generator/src/models/mod.rs @@ -0,0 +1,192 @@ +mod actions; +mod create; +mod data; +mod filter; +mod order_by; +mod pagination; +mod partial_unchecked; +mod select_include; +mod set_params; +mod types; +mod update; +mod where_params; +mod with_params; + +use std::collections::BTreeMap; + +use prisma_client_rust_sdk::{ + prelude::*, + prisma::{ + prisma_models::walkers::{FieldWalker, ModelWalker, RefinedFieldWalker}, + psl::parser_database::ScalarFieldType, + }, +}; +use select_include::*; + +pub struct RequiredField<'a> { + pub push_wrapper: TokenStream, + pub typ: TokenStream, + pub inner: FieldWalker<'a>, +} + +pub fn required_fields<'a>(model: ModelWalker<'a>) -> Option>> { + model + .fields() + .filter(|field| match field.refine() { + RefinedFieldWalker::Scalar(scalar_field) => match scalar_field.scalar_field_type() { + ScalarFieldType::CompositeType(_) => field.required_on_create(), + _ => !model.scalar_field_has_relation(scalar_field) && field.required_on_create(), + }, + RefinedFieldWalker::Relation(_) => field.required_on_create(), + }) + .map(|field| { + Some({ + let typ = match field.refine() { + RefinedFieldWalker::Scalar(scalar_field) => { + match scalar_field.scalar_field_type() { + ScalarFieldType::CompositeType(id) => { + let comp_type = model.db.walk(id); + + let type_snake = snake_ident(comp_type.name()); + + quote!(super::#type_snake::Create) + } + _ => field.type_tokens("e!(super::))?, + } + } + RefinedFieldWalker::Relation(relation_field) => { + let relation_model_name_snake = + snake_ident(relation_field.related_model().name()); + + quote!(super::#relation_model_name_snake::UniqueWhereParam) + } + }; + + let push_wrapper = match field.refine() { + RefinedFieldWalker::Scalar(_) => quote!(set), + RefinedFieldWalker::Relation(_) => quote!(connect), + }; + + RequiredField { + inner: field, + push_wrapper, + typ, + } + }) + }) + .collect() +} + +pub fn modules(args: &GenerateArgs, module_path: &TokenStream) -> Vec { + let pcr = quote!(::prisma_client_rust); + + args.schema + .db + .walk_models() + .map(|model| { + let model_name = model.name(); + + let actions_struct = actions::struct_definition(model, args); + + let (field_stuff, field_modules) = ModelModulePart::combine(vec![ + data::model_data(model), + where_params::model_data(model, args, module_path), + order_by::model_data(model, args), + with_params::model_data(model), + set_params::model_data(model, args), + select::model_data(model, &module_path), + include::model_data(model, &module_path), + ]); + + let create_types = create::types(model); + let update_struct = update::r#struct(model); + let types_struct = types::r#struct(model, module_path); + let data_struct = data::r#struct(model); + let partial_unchecked_macro = partial_unchecked::r#macro(model, &module_path); + let filter_macro = filter::r#macro(model, module_path); + + let mongo_raw_types = cfg!(feature = "mongodb").then(|| quote! { + pub type FindRawQuery<'a, T: #pcr::Data> = #pcr::FindRaw<'a, Types, T>; + pub type AggregateRawQuery<'a, T: #pcr::Data> = #pcr::AggregateRaw<'a, Types, T>; + }); + + let mut module = Module::new( + model.name(), + quote! { + use super::{_prisma::*, *}; + + pub const NAME: &str = #model_name; + + #field_stuff + #create_types + #update_struct + #types_struct + #data_struct + #partial_unchecked_macro + #filter_macro + + pub type UniqueArgs = #pcr::UniqueArgs; + pub type ManyArgs = #pcr::ManyArgs; + + pub type CountQuery<'a> = #pcr::Count<'a, Types>; + pub type CreateQuery<'a> = #pcr::Create<'a, Types>; + pub type CreateUncheckedQuery<'a> = #pcr::CreateUnchecked<'a, Types>; + pub type CreateManyQuery<'a> = #pcr::CreateMany<'a, Types>; + pub type FindUniqueQuery<'a> = #pcr::FindUnique<'a, Types>; + pub type FindManyQuery<'a> = #pcr::FindMany<'a, Types>; + pub type FindFirstQuery<'a> = #pcr::FindFirst<'a, Types>; + pub type UpdateQuery<'a> = #pcr::Update<'a, Types>; + pub type UpdateUncheckedQuery<'a> = #pcr::UpdateUnchecked<'a, Types>; + pub type UpdateManyQuery<'a> = #pcr::UpdateMany<'a, Types>; + pub type UpsertQuery<'a> = #pcr::Upsert<'a, Types>; + pub type DeleteQuery<'a> = #pcr::Delete<'a, Types>; + pub type DeleteManyQuery<'a> = #pcr::DeleteMany<'a, Types>; + + #mongo_raw_types + + #actions_struct + }, + ); + + field_modules + .into_iter() + .for_each(|field| module.add_submodule(field)); + + module + }) + .collect() +} + +pub struct ModelModulePart { + data: TokenStream, + fields: BTreeMap, +} + +impl ModelModulePart { + pub fn combine(parts: Vec) -> (TokenStream, Vec) { + let (data, fields): (Vec<_>, Vec<_>) = + parts.into_iter().map(|p| (p.data, p.fields)).unzip(); + + let field_stuff = fields + .into_iter() + .flat_map(|p| p.into_iter()) + .fold(BTreeMap::new(), |mut acc, (k, v)| { + let entry = acc.entry(k).or_insert_with(|| vec![]); + entry.push(v); + acc + }) + .into_iter() + .map(|(field_name_str, data)| { + Module::new(&field_name_str, quote! { + use super::super::{_prisma::*, *}; + use super::{WhereParam, UniqueWhereParam, WithParam, SetParam, UncheckedSetParam}; + + pub const NAME: &str = #field_name_str; + + #(#data)* + }) + }).collect(); + + (quote!(#(#data)*), field_stuff) + } +} diff --git a/external/prisma-client-rust/crates/generator/src/models/order_by.rs b/external/prisma-client-rust/crates/generator/src/models/order_by.rs new file mode 100644 index 0000000..8bf6741 --- /dev/null +++ b/external/prisma-client-rust/crates/generator/src/models/order_by.rs @@ -0,0 +1,210 @@ +use std::collections::BTreeMap; + +use prisma_client_rust_sdk::prisma::{ + dmmf::TypeLocation, + prisma_models::{walkers::ModelWalker, FieldArity}, +}; + +use crate::prelude::*; + +use super::ModelModulePart; + +pub fn fetch_builder_fn(model_name_snake: &Ident) -> TokenStream { + quote! { + pub fn order_by(mut self, param: #model_name_snake::OrderByWithRelationParam) -> Self { + self.0 = self.0.order_by(param); + self + } + } +} + +pub fn model_data(model: ModelWalker, args: &GenerateArgs) -> ModelModulePart { + let pcr = quote!(::prisma_client_rust); + + let (order_by_relation_aggregate_param, aggregate_field_stuff) = args + .dmmf + .schema + .find_input_type(&format!("{}OrderByRelationAggregateInput", model.name())) + .map(|input_type| { + let ((variants, into_pv_arms), field_things): ((Vec<_>, Vec<_>), Vec<_>) = input_type + .fields + .iter() + .flat_map(|field| { + let field_name_str = &field.name; + let field_name_pascal = pascal_ident(&field.name); + + let typ = &field.input_types[0]; + let typ = + typ.to_tokens("e!(super::), &FieldArity::Required, &args.schema.db)?; + + Some(( + ( + quote!(#field_name_pascal(#typ)), + quote! { + Self::#field_name_pascal(param) => ( + #field_name_str, + param.into() + ) + }, + ), + ( + field_name_str, + ( + typ, + quote! { + impl From for super::OrderByRelationAggregateParam { + fn from(Order(v): Order) -> Self { + Self::#field_name_pascal(v) + } + } + }, + ), + ), + )) + }) + .unzip(); + + ( + quote! { + #[derive(Debug, Clone)] + pub enum OrderByRelationAggregateParam { + #(#variants),* + } + + impl Into<(String, #pcr::PrismaValue)> for OrderByRelationAggregateParam { + fn into(self) -> (String, #pcr::PrismaValue) { + let (k, v) = match self { + #(#into_pv_arms),* + }; + + (k.to_string(), v) + } + } + }, + field_things, + ) + }) + .unwrap_or_default(); + + let (order_by_with_relation_param, relation_field_stuff) = args + .dmmf + .schema + .find_input_type(&format!("{}OrderByWithRelationInput", model.name())) + .map(|input_type| { + let ((variants, into_pv_arms), field_stuff): ((Vec<_>, Vec<_>), Vec<_>) = input_type + .fields + .iter() + .flat_map(|field| { + let field_name_str = &field.name; + let field_name_pascal = pascal_ident(&field.name); + + let typ_ref = &field.input_types[0]; + let typ = typ_ref.to_tokens( + "e!(super::), + &FieldArity::Required, + &args.schema.db, + )?; + + let pv = match &typ_ref.location { + TypeLocation::EnumTypes | TypeLocation::Scalar => quote!(param.into()), + TypeLocation::InputObjectTypes => quote! { + #pcr::PrismaValue::Object( + param.into_iter().map(Into::into).collect() + ) + }, + _ => return None, + }; + + Some(( + ( + quote!(#field_name_pascal(#typ)), + quote! { + Self::#field_name_pascal(param) => ( + #field_name_str, + #pv + ) + }, + ), + ( + field_name_str, + ( + typ_ref.to_tokens( + "e!(), + &FieldArity::Required, + &args.schema.db, + )?, + quote! { + impl From for super::OrderByWithRelationParam { + fn from(Order(v): Order) -> Self { + Self::#field_name_pascal(v) + } + } + }, + ), + ), + )) + }) + .unzip(); + + ( + quote! { + #[derive(Debug, Clone)] + pub enum OrderByWithRelationParam { + #(#variants),* + } + + impl Into<(String, #pcr::PrismaValue)> for OrderByWithRelationParam { + fn into(self) -> (String, #pcr::PrismaValue) { + let (k, v) = match self { + #(#into_pv_arms),* + }; + + (k.to_string(), v) + } + } + }, + field_stuff, + ) + }) + .unwrap_or_default(); + + ModelModulePart { + data: quote! { + #order_by_with_relation_param + #order_by_relation_aggregate_param + }, + fields: aggregate_field_stuff + .into_iter() + .chain(relation_field_stuff) + .fold(BTreeMap::new(), |mut acc, (name, data)| { + let entry = acc.entry(name.to_string()).or_insert_with(|| vec![]); + entry.push(data); + acc + }) + .into_iter() + .map(|(name, data)| { + let Some(typ) = data + .iter() + .find_map(|(typ, _)| (typ.to_string() == data[0].0.to_string()).then_some(typ)) + else { + panic!(); + }; + + let impls = data.iter().map(|(_, impls)| impls); + + ( + name, + quote! { + pub struct Order(#typ); + + pub fn order>(v: #typ) -> T { + Order(v).into() + } + + #(#impls)* + }, + ) + }) + .collect(), + } +} diff --git a/external/prisma-client-rust/crates/generator/src/models/pagination.rs b/external/prisma-client-rust/crates/generator/src/models/pagination.rs new file mode 100644 index 0000000..4551d52 --- /dev/null +++ b/external/prisma-client-rust/crates/generator/src/models/pagination.rs @@ -0,0 +1,20 @@ +use crate::prelude::*; + +pub fn fetch_builder_fns(model_name_snake: &Ident) -> TokenStream { + quote! { + pub fn skip(mut self, value: i64) -> Self { + self.0 = self.0.skip(value); + self + } + + pub fn take(mut self, value: i64) -> Self { + self.0 = self.0.take(value); + self + } + + pub fn cursor(mut self, value: #model_name_snake::UniqueWhereParam) -> Self { + self.0 = self.0.cursor(value.into()); + self + } + } +} diff --git a/external/prisma-client-rust/crates/generator/src/models/partial_unchecked.rs b/external/prisma-client-rust/crates/generator/src/models/partial_unchecked.rs new file mode 100644 index 0000000..3c8045f --- /dev/null +++ b/external/prisma-client-rust/crates/generator/src/models/partial_unchecked.rs @@ -0,0 +1,40 @@ +use prisma_client_rust_sdk::prisma::prisma_models::walkers::ModelWalker; + +use crate::prelude::*; + +pub fn r#macro(model: ModelWalker, module_path: &TokenStream) -> TokenStream { + let model_name_snake = snake_ident(model.name()); + let model_name_snake_raw = snake_ident_raw(model.name()); + let macro_name = format_ident!("_partial_unchecked_{model_name_snake_raw}"); + + let model_module = quote!(#module_path #model_name_snake); + + let struct_fields = model.scalar_fields().map(|scalar_field| { + let field_name_str = scalar_field.name(); + let field_name_snake = snake_ident(field_name_str); + + let arity = scalar_field.ast_field().arity; + + let double_option_attrs = arity.is_optional().then(|| { + quote! { + #[serde(default, with = "::prisma_client_rust::serde::double_option")] + } + }); + + quote! { + #[serde(rename = #field_name_str)] + #double_option_attrs + pub #field_name_snake: #module_path #model_name_snake::#field_name_snake::Type + } + }); + + quote! { + ::prisma_client_rust::macros::partial_unchecked_factory!( + #macro_name, + #model_module, + struct Data { + #(#struct_fields),* + } + ); + } +} diff --git a/external/prisma-client-rust/crates/generator/src/models/select_include.rs b/external/prisma-client-rust/crates/generator/src/models/select_include.rs new file mode 100644 index 0000000..901fdcb --- /dev/null +++ b/external/prisma-client-rust/crates/generator/src/models/select_include.rs @@ -0,0 +1,293 @@ +use prisma_client_rust_generator_shared::select_include::{SelectableFields, Variant}; +use prisma_client_rust_sdk::prisma::prisma_models::{ + walkers::{FieldWalker, ModelWalker, RefinedFieldWalker}, + FieldArity, +}; +use syn::{parse_quote, ItemStruct}; + +use crate::prelude::*; + +fn model_macro<'a>( + model: ModelWalker<'a>, + module_path: &TokenStream, + variant: Variant, + // Fields that can be picked from + selection_fields: impl Iterator>, +) -> TokenStream { + let model_name_snake = snake_ident(model.name()); + let model_name_snake_raw = snake_ident_raw(model.name()); + let macro_name = format_ident!("_{variant}_{model_name_snake_raw}"); + + let factory_name = format_ident!("{variant}_factory"); + + let data_struct: ItemStruct = { + let fields = model.fields().map(|field| { + let field_name_str = field.name(); + let field_name_snake = snake_ident(field_name_str); + + quote! { + #[serde(rename = #field_name_str)] + #field_name_snake: #field_name_snake::Type + } + }); + + parse_quote! { + struct Data { + #(#fields),* + } + } + }; + + let selectable_fields = SelectableFields::new(selection_fields, module_path); + + quote! { + ::prisma_client_rust::macros::#factory_name!( + #macro_name, + #variant, + #module_path #model_name_snake, + #data_struct, + #selectable_fields + ); + } +} + +fn field_module_enum(field: FieldWalker, variant: Variant) -> Option { + let pcr = quote!(::prisma_client_rust); + + let field_name_pascal = pascal_ident(field.name()); + let field_name_str = field.name(); + + let variant_pascal = pascal_ident(&variant.to_string()); + let variant_param = variant.param(); + + Some(match field.refine() { + RefinedFieldWalker::Relation(relation_field) => { + let relation_model_name_snake = snake_ident(relation_field.related_model().name()); + + let initial_nested_selections = match variant { + Variant::Include => { + quote!(<#relation_model_name_snake::Types as #pcr::ModelTypes>::scalar_selections()) + } + Variant::Select => quote!(vec![]), + }; + + match field.ast_field().arity { + FieldArity::List => quote! { + pub enum #variant_pascal { + Select(#relation_model_name_snake::ManyArgs, Vec<#relation_model_name_snake::SelectParam>), + Include(#relation_model_name_snake::ManyArgs, Vec<#relation_model_name_snake::IncludeParam>), + Fetch(#relation_model_name_snake::ManyArgs) + } + + impl Into for #variant_pascal { + fn into(self) -> super::#variant_param { + super::#variant_param::#field_name_pascal(self) + } + } + + impl #variant_pascal { + pub fn select(args: #relation_model_name_snake::ManyArgs, nested_selections: Vec<#relation_model_name_snake::SelectParam>) -> Self { + Self::Select(args, nested_selections) + } + + pub fn include(args: #relation_model_name_snake::ManyArgs, nested_selections: Vec<#relation_model_name_snake::IncludeParam>) -> Self { + Self::Include(args, nested_selections) + } + } + + impl Into<#pcr::Selection> for #variant_pascal { + fn into(self) -> #pcr::Selection { + let (args, selections) = match self { + Self::Select(args, selections) => ( + args.to_graphql().0, + selections.into_iter().map(Into::into).collect() + ), + Self::Include(args, selections) => ( + args.to_graphql().0, + { + let mut nested_selections = #initial_nested_selections; + nested_selections.extend(selections.into_iter().map(Into::into)); + nested_selections + } + ), + Self::Fetch(args) => ( + args.to_graphql().0, + <#relation_model_name_snake::Types as #pcr::ModelTypes>::scalar_selections() + ) + }; + + #pcr::Selection::new(NAME, None, args, selections) + } + } + }, + _ => quote! { + pub enum #variant_pascal { + Select(Vec<#relation_model_name_snake::SelectParam>), + Include(Vec<#relation_model_name_snake::IncludeParam>), + Fetch + } + + impl Into for #variant_pascal { + fn into(self) -> super::#variant_param { + super::#variant_param::#field_name_pascal(self) + } + } + + impl #variant_pascal { + pub fn select(nested_selections: Vec<#relation_model_name_snake::SelectParam>) -> Self { + Self::Select(nested_selections) + } + + pub fn include(nested_selections: Vec<#relation_model_name_snake::IncludeParam>) -> Self { + Self::Include(nested_selections) + } + } + + impl Into<#pcr::Selection> for #variant_pascal { + fn into(self) -> #pcr::Selection { + let selections = match self { + Self::Select(selections) => { + selections.into_iter().map(Into::into).collect() + }, + Self::Include(selections) => { + let mut nested_selections = #initial_nested_selections; + nested_selections.extend(selections.into_iter().map(Into::into)); + nested_selections + }, + Self::Fetch => { + <#relation_model_name_snake::Types as #pcr::ModelTypes>::scalar_selections() + } + }; + + #pcr::Selection::new(#field_name_str, None, [], selections) + } + } + }, + } + } + RefinedFieldWalker::Scalar(_) => quote! { + pub struct #variant_pascal; + + impl Into for #variant_pascal { + fn into(self) -> super::#variant_param { + super::#variant_param::#field_name_pascal(self) + } + } + + impl Into<#pcr::Selection> for #variant_pascal { + fn into(self) -> #pcr::Selection { + #pcr::sel(NAME) + } + } + }, + }) +} + +fn model_module_enum(model: ModelWalker, variant: Variant) -> TokenStream { + let pcr = quote!(::prisma_client_rust); + + let variant_pascal = pascal_ident(&variant.to_string()); + + let variants = model + .fields() + .filter(|f| !f.ast_field().field_type.as_unsupported().is_some()) + .map(|field| { + let field_name_snake = snake_ident(field.name()); + let field_name_pascal = pascal_ident(field.name()); + + quote!(#field_name_pascal(#field_name_snake::#variant_pascal)) + }); + + let field_names_pascal = model + .fields() + .filter(|f| !f.ast_field().field_type.as_unsupported().is_some()) + .map(|field| pascal_ident(field.name())); + + let variant_param = variant.param(); + + quote! { + pub enum #variant_param { + #(#variants),* + } + + impl Into<#pcr::Selection> for #variant_param { + fn into(self) -> #pcr::Selection { + match self { + #(Self::#field_names_pascal(data) => data.into()),* + } + } + } + } +} + +pub mod include { + use prisma_client_rust_sdk::prisma::prisma_models::walkers::{ModelWalker, RefinedFieldWalker}; + + use crate::models::ModelModulePart; + + use super::*; + + pub fn model_data(model: ModelWalker, module_path: &TokenStream) -> ModelModulePart { + let r#macro = super::model_macro( + model, + module_path, + Variant::Include, + model + .fields() + .filter(|f| matches!(f.refine(), RefinedFieldWalker::Relation(_))), + ); + + let r#enum = super::model_module_enum(model, Variant::Include); + + ModelModulePart { + data: quote! { + #r#macro + #r#enum + }, + fields: model + .fields() + .filter(|f| f.ast_field().field_type.as_unsupported().is_none()) + .flat_map(|field| { + super::field_module_enum(field, Variant::Include) + .map(|e| (field.name().to_string(), e)) + }) + .collect(), + } + } +} + +pub mod select { + use prisma_client_rust_sdk::prisma::prisma_models::walkers::ModelWalker; + + use crate::models::ModelModulePart; + + use super::*; + + pub fn model_data(model: ModelWalker, module_path: &TokenStream) -> ModelModulePart { + let r#macro = super::model_macro( + model, + module_path, + Variant::Select, + model + .fields() + .filter(|f| f.ast_field().field_type.as_unsupported().is_none()), + ); + + let r#enum = super::model_module_enum(model, Variant::Select); + + ModelModulePart { + data: quote! { + #r#macro + #r#enum + }, + fields: model + .fields() + .filter(|f| f.ast_field().field_type.as_unsupported().is_none()) + .flat_map(|field| { + super::field_module_enum(field, Variant::Select) + .map(|e| (field.name().to_string(), e)) + }) + .collect(), + } + } +} diff --git a/external/prisma-client-rust/crates/generator/src/models/set_params.rs b/external/prisma-client-rust/crates/generator/src/models/set_params.rs new file mode 100644 index 0000000..7d37577 --- /dev/null +++ b/external/prisma-client-rust/crates/generator/src/models/set_params.rs @@ -0,0 +1,735 @@ +use std::collections::BTreeMap; + +use prisma_client_rust_sdk::prisma::{ + prisma_models::{ + walkers::{FieldWalker, ModelWalker, RefinedFieldWalker, RelationFieldWalker}, + FieldArity, + }, + psl::parser_database::ScalarFieldType, +}; + +use crate::{prelude::*, write_params}; + +use super::ModelModulePart; + +pub struct RelationSetParamConfig { + pub action: &'static str, + pub typ: RelationSetParamType, +} + +pub enum RelationSetParamType { + /// Arguments are Vec of UniqueWhereParams + Many, + /// Arguments is a single WhereParam + Single, + /// No arguments, value is Boolean(true) + True, +} + +fn relation_field_set_params(field: RelationFieldWalker) -> Vec { + let arity = field.ast_field().arity; + + match arity.is_list() { + true => ["connect", "disconnect", "set"] + .iter() + .map(|action| RelationSetParamConfig { + action, + typ: RelationSetParamType::Many, + }) + .collect(), + false => { + let mut params = vec![RelationSetParamConfig { + action: "connect", + typ: RelationSetParamType::Single, + }]; + + if arity.is_optional() { + params.push(RelationSetParamConfig { + action: "disconnect", + typ: RelationSetParamType::True, + }); + } + + params + } + } +} + +fn field_set_params( + field: FieldWalker, + args: &GenerateArgs, +) -> Option<(Vec, Vec, (String, TokenStream))> { + let field_name_pascal = pascal_ident(field.name()); + let field_name_snake = snake_ident(field.name()); + let field_type = field.type_tokens("e!()); + + let pcr = quote!(::prisma_client_rust); + + let arity = field.ast_field().arity; + + let mut variants = vec![]; + let mut functions = vec![]; + + let field_module_contents = match field.refine() { + RefinedFieldWalker::Scalar(scalar_field) => match scalar_field.scalar_field_type() { + ScalarFieldType::CompositeType(id) => { + let comp_type = field.db.walk(id); + let comp_type_snake = snake_ident(comp_type.name()); + + let field_type_snake = snake_ident(comp_type.name()); + + let set_variant = comp_type + .fields() + .filter(|f| f.required_on_create()) + .map(|field| { + field.type_tokens("e!())?; + Some(field) + }) + .collect::>>() + .map(|_| { + let variant_name = format_ident!("Set{field_name_pascal}"); + + let value_ident = format_ident!("value"); + let value = arity.wrap_pv( + &value_ident, + quote! { + #pcr::PrismaValue::Object(value + .to_params() + .into_iter() + .map(Into::into) + .collect() + ) + }, + ); + + let base_type = quote!(#comp_type_snake::Create); + + let model_type = arity.wrap_type("e!(super::#base_type)); + let field_type = arity.wrap_type(&base_type); + + ( + ( + quote!(#variant_name(#model_type)), + quote! { + Self::#variant_name(#value_ident) => + (#field_name_snake::NAME, #value) + }, + ), + quote! { + pub struct Set(#field_type); + + pub fn set>(create: #field_type) -> T { + Set(create).into() + } + + impl From for SetParam { + fn from(Set(create): Set) -> Self { + SetParam::#variant_name(create) + } + } + }, + ) + }); + + let unset_variant = arity.is_optional().then(|| { + let variant_name = format_ident!("Unset{field_name_pascal}"); + + ( + ( + quote!(#variant_name), + quote! { + Self::#variant_name => ( + #field_name_snake::NAME, + #pcr::PrismaValue::Object(vec![( + "unset".to_string(), + #pcr::PrismaValue::Boolean(true) + )]) + ) + }, + ), + quote! { + pub fn unset() -> SetParam { + SetParam::#variant_name + } + }, + ) + }); + + let update_variant = (!arity.is_list()).then(|| { + let variant_name = format_ident!("Update{field_name_pascal}"); + + ( + ( + quote!(#variant_name(Vec)), + quote! { + Self::#variant_name(value) => + (#field_name_snake::NAME, + #pcr::PrismaValue::Object(vec![( + "update".to_string(), + #pcr::PrismaValue::Object(value + .into_iter() + .map(Into::into) + .collect() + ) + )]) + ) + }, + ), + quote! { + pub fn update(params: Vec<#comp_type_snake::SetParam>) -> SetParam { + SetParam::#variant_name(params) + } + }, + ) + }); + + let upsert_variant = arity.is_optional().then(|| { + let variant_name = format_ident!("Upsert{field_name_pascal}"); + + ( + ( + quote!(#variant_name( + super::#field_type_snake::Create, + Vec + )), + quote! { + Self::#variant_name(create, update) => + (#field_name_snake::NAME, + #pcr::PrismaValue::Object(vec![( + "upsert".to_string(), + #pcr::PrismaValue::Object(vec![ + ( + "set".to_string(), + #pcr::PrismaValue::Object( + create + .to_params() + .into_iter() + .map(Into::into) + .collect() + ) + ), + ( + "update".to_string(), + #pcr::PrismaValue::Object( + update + .into_iter() + .map(Into::into) + .collect() + ) + ) + ]) + )]) + ) + }, + ), + quote! { + pub fn upsert( + create: #comp_type_snake::Create, + update: Vec<#comp_type_snake::SetParam> + ) -> SetParam { + SetParam::#variant_name(create, update) + } + }, + ) + }); + + let push_variant = arity.is_list().then(|| { + let variant_name = format_ident!("Push{field_name_pascal}"); + + ( + ( + quote!(#variant_name(Vec)), + quote! { + Self::#variant_name(creates) => ( + #field_name_snake::NAME, + #pcr::PrismaValue::Object(vec![( + "push".to_string(), + #pcr::PrismaValue::List( + creates + .into_iter() + .map(|create| #pcr::PrismaValue::Object( + create + .to_params() + .into_iter() + .map(Into::into) + .collect() + )) + .collect() + ) + )]) + ) + }, + ), + quote! { + pub fn push(creates: Vec<#comp_type_snake::Create>) -> SetParam { + SetParam::#variant_name(creates) + } + }, + ) + }); + + let update_many_variant = arity.is_list().then(|| { + let variant_name = format_ident!("UpdateMany{field_name_pascal}"); + + ( + ( + quote!(#variant_name( + Vec, + Vec + )), + quote! { + Self::#variant_name(_where, updates) => ( + #field_name_snake::NAME, + #pcr::PrismaValue::Object(vec![( + "updateMany".to_string(), + #pcr::PrismaValue::Object(vec![ + ( + "where".to_string(), + #pcr::PrismaValue::Object( + _where + .into_iter() + .map(#pcr::WhereInput::serialize) + .map(#pcr::SerializedWhereInput::transform_equals) + .collect() + ) + ), + ( + "data".to_string(), + #pcr::PrismaValue::Object( + updates + .into_iter() + .map(Into::into) + .collect() + ) + ) + ]) + )]) + ) + } + ), + quote! { + pub fn update_many( + _where: Vec<#comp_type_snake::WhereParam>, + update: Vec<#comp_type_snake::SetParam> + ) -> SetParam { + SetParam::#variant_name(_where, update) + } + } + ) + }); + + let delete_many_variant = arity.is_list().then(|| { + let variant_name = format_ident!("DeleteMany{field_name_pascal}"); + + ( + ( + quote!(#variant_name( + Vec + )), + quote! { + Self::#variant_name(_where) => ( + #field_name_snake::NAME, + #pcr::PrismaValue::Object(vec![( + "deleteMany".to_string(), + #pcr::PrismaValue::Object(vec![ + ( + "where".to_string(), + #pcr::PrismaValue::Object( + _where + .into_iter() + .map(#pcr::WhereInput::serialize) + .map(#pcr::SerializedWhereInput::transform_equals) + .collect() + ) + ), + ]) + )]) + ) + } + ), + quote! { + pub fn delete_many( + _where: Vec<#comp_type_snake::WhereParam>, + ) -> SetParam { + SetParam::#variant_name(_where) + } + } + ) + }); + + let params = [ + set_variant, + unset_variant, + update_variant, + upsert_variant, + push_variant, + update_many_variant, + delete_many_variant, + ]; + + let ((v, f), field_fns): ((Vec<_>, Vec<_>), TokenStream) = + params.into_iter().flatten().unzip(); + + variants.extend(v); + functions.extend(f); + + (field.name().to_string(), field_fns) + } + _ => { + if let Some(write_param) = args.write_param(scalar_field) { + let param_enum = write_params::enum_name(write_param); + + let param_enum_path = quote!(_prisma::write_params::#param_enum); + + let other_fns = write_param + .fields + .iter() + .flat_map(|field| { + if field.name == "set" { return None } + + let method_name_snake = snake_ident(&field.name); + let method_name_pascal = pascal_ident(&field.name); + + let typ = field.type_tokens("e!()); + + Some(quote! { + pub fn #method_name_snake>(value: #typ) -> T { + UpdateOperation(#param_enum_path::#method_name_pascal(value)).into() + } + }) + }) + .collect::(); + + variants.push( + quote!(#field_name_pascal(super::_prisma::write_params::#param_enum)), + ); + functions.push(quote! { + Self::#field_name_pascal(value) => ( + #field_name_snake::NAME, + value.into() + ) + }); + + ( + field.name().to_string(), + quote! { + pub struct Set(pub #field_type); + + impl From for SetParam { + fn from(Set(v): Set) -> Self { + Self::#field_name_pascal(#param_enum_path::Set(v)) + } + } + + pub fn set>(value: #field_type) -> T { + Set(value).into() + } + + pub struct UpdateOperation(pub #param_enum_path); + + impl From for SetParam { + fn from(UpdateOperation(v): UpdateOperation) -> Self { + Self::#field_name_pascal(v) + } + } + + #other_fns + }, + ) + } else { + return None; + } + } + }, + RefinedFieldWalker::Relation(relation_field) => { + let (v, f): (Vec<_>, Vec<_>) = relation_field_set_params(relation_field).iter().map(|param| { + let action = param.action; + let relation_model_name_snake = snake_ident(relation_field.related_model().name()); + let variant_name = format_ident!("{}{}", pascal_ident(action), &field_name_pascal); + + match param.typ { + RelationSetParamType::Many => { + ( + quote!(#variant_name(Vec)), + quote! { + Self::#variant_name(where_params) => ( + #field_name_snake::NAME, + #pcr::PrismaValue::Object( + vec![( + #action.to_string(), + #pcr::PrismaValue::List( + where_params + .into_iter() + .map(#pcr::WhereInput::serialize) + .map(#pcr::SerializedWhereInput::transform_equals) + .map(|v| #pcr::PrismaValue::Object(vec![v])) + .collect() + ) + )] + ) + ) + } + ) + } + RelationSetParamType::Single => { + (quote!(#variant_name(super::#relation_model_name_snake::UniqueWhereParam)), + quote! { + Self::#variant_name(where_param) => ( + #field_name_snake::NAME, + #pcr::PrismaValue::Object( + vec![( + #action.to_string(), + #pcr::PrismaValue::Object( + [where_param] + .into_iter() + .map(#pcr::WhereInput::serialize) + .map(#pcr::SerializedWhereInput::transform_equals) + .collect() + ) + )] + ) + ) + } + ) + } + RelationSetParamType::True => { + (quote!(#variant_name), + quote! { + Self::#variant_name => ( + #field_name_snake::NAME, + #pcr::PrismaValue::Object( + vec![( + #action.to_string(), + #pcr::PrismaValue::Boolean(true) + )] + ) + ) + } + ) + } + } + }).unzip(); + + let relation_model_name_snake = snake_ident(relation_field.related_model().name()); + + let connect_variant = format_ident!("Connect{field_name_pascal}"); + let disconnect_variant = format_ident!("Disconnect{field_name_pascal}"); + let set_variant = format_ident!("Set{field_name_pascal}"); + let is_null_variant = format_ident!("{field_name_pascal}IsNull"); + + let base = match arity { + FieldArity::List => { + quote! { + pub struct Connect(pub Vec<#relation_model_name_snake::UniqueWhereParam>); + + impl From for SetParam { + fn from(Connect(v): Connect) -> Self { + Self::#connect_variant(v) + } + } + + pub fn connect>(params: Vec<#relation_model_name_snake::UniqueWhereParam>) -> T { + Connect(params).into() + } + + pub fn disconnect(params: Vec<#relation_model_name_snake::UniqueWhereParam>) -> SetParam { + SetParam::#disconnect_variant(params) + } + + pub fn set(params: Vec<#relation_model_name_snake::UniqueWhereParam>) -> SetParam { + SetParam::#set_variant(params) + } + } + } + _ => { + let optional_fns = arity.is_optional().then(|| { + quote! { + pub fn disconnect() -> SetParam { + SetParam::#disconnect_variant + } + + pub fn is_null() -> WhereParam { + WhereParam::#is_null_variant + } + } + }); + + quote! { + pub struct Connect(#relation_model_name_snake::UniqueWhereParam); + + impl From for SetParam { + fn from(Connect(v): Connect) -> Self { + Self::#connect_variant(v) + } + } + + pub fn connect>(value: #relation_model_name_snake::UniqueWhereParam) -> T { + Connect(value).into() + } + + #optional_fns + } + } + }; + + variants.extend(v); + functions.extend(f); + + (field.name().to_string(), base) + } + }; + + Some((variants, functions, field_module_contents)) +} + +pub fn model_data(model: ModelWalker, args: &GenerateArgs) -> ModelModulePart { + let (variants, into_pv_arms, field_stuff) = + model.fields().flat_map(|f| field_set_params(f, args)).fold( + (vec![], vec![], BTreeMap::new()), + |(mut a, mut b, mut c), (d, e, f)| { + a.extend(d); + b.extend(e); + c.insert(f.0, f.1); + + (a, b, c) + }, + ); + + let pcr = quote!(::prisma_client_rust); + + let (unchecked_enum, unchecked_fields) = { + let ((variants, into_pv_arms), field_stuff): ((Vec<_>, Vec<_>), Vec<_>) = model + .scalar_fields() + .flat_map(|field| { + let field_name_str = field.name(); + let field_name_pascal = pascal_ident(field_name_str); + let field_name_snake = snake_ident(field_name_str); + + Some(match field.scalar_field_type() { + ScalarFieldType::CompositeType(id) => { + let comp_type = model.db.walk(id); + + let comp_type_snake = snake_ident(comp_type.name()); + + let base_type = quote!(#comp_type_snake::Create); + + let arity = &field.ast_field().arity; + + let model_type = arity + .wrap_type("e!(super::#base_type)); + + let value_ident = format_ident!("value"); + let value = arity.wrap_pv( + &value_ident, + quote! { + #pcr::PrismaValue::Object(value + .to_params() + .into_iter() + .map(Into::into) + .collect() + ) + }, + ); + + (( + quote!(#field_name_pascal(#model_type)), + quote! { + Self::#field_name_pascal(#value_ident) => + (#field_name_snake::NAME, #value) + }, + ), ( + field.name().to_string(), + quote! { + impl From for UncheckedSetParam { + fn from(Set(v): Set) -> Self { + Self::#field_name_pascal(v) + } + } + } + )) + } + ScalarFieldType::Unsupported(_) => return None, + _ => args.write_param(field).map(|write_param| { + let param_enum = write_params::enum_name(write_param); + let param_enum_path = quote!(_prisma::write_params::#param_enum); + + ( + ( + quote!(#field_name_pascal(super::_prisma::write_params::#param_enum)), + quote! { + Self::#field_name_pascal(value) => ( + #field_name_str, + value.into() + ) + }), + ( + field.name().to_string(), + quote! { + impl From for UncheckedSetParam { + fn from(Set(v): Set) -> Self { + Self::#field_name_pascal(#param_enum_path::Set(v)) + } + } + + impl From for UncheckedSetParam { + fn from(UpdateOperation(v): UpdateOperation) -> Self { + Self::#field_name_pascal(v) + } + } + }, + ), + ) + })?, + }) + }) + .unzip(); + + ( + quote! { + #[derive(Debug, Clone)] + pub enum UncheckedSetParam { + #(#variants),* + } + + impl Into<(String, #pcr::PrismaValue)> for UncheckedSetParam { + fn into(self) -> (String, #pcr::PrismaValue) { + let (k, v) = match self { + #(#into_pv_arms),* + }; + + (k.to_string(), v) + } + } + }, + field_stuff, + ) + }; + + ModelModulePart { + data: quote! { + #[derive(Debug, Clone)] + pub enum SetParam { + #(#variants),* + } + + impl Into<(String, #pcr::PrismaValue)> for SetParam { + fn into(self) -> (String, #pcr::PrismaValue) { + let (k, v) = match self { + #(#into_pv_arms),* + }; + + (k.to_string(), v) + } + } + + #unchecked_enum + }, + fields: unchecked_fields + .into_iter() + .fold(field_stuff, |mut acc, (k, v)| { + let entry = acc.entry(k).or_insert_with(|| quote!()); + entry.extend(v); + acc + }), + } +} diff --git a/external/prisma-client-rust/crates/generator/src/models/types.rs b/external/prisma-client-rust/crates/generator/src/models/types.rs new file mode 100644 index 0000000..c29a898 --- /dev/null +++ b/external/prisma-client-rust/crates/generator/src/models/types.rs @@ -0,0 +1,61 @@ +use prisma_client_rust_sdk::prisma::{ + prisma_models::walkers::ModelWalker, psl::parser_database::ScalarFieldType, +}; + +use crate::prelude::*; + +fn scalar_selections_fn(model: ModelWalker, module_path: &TokenStream) -> TokenStream { + let pcr = quote!(::prisma_client_rust); + + let selections = model.scalar_fields().flat_map(|field| { + let field_name_snake = snake_ident(field.name()); + + Some(match field.scalar_field_type() { + ScalarFieldType::CompositeType(id) => { + let comp_type = model.db.walk(id); + + let comp_type_name_snake = snake_ident(comp_type.name()); + + quote! { + #pcr::Selection::new(#field_name_snake::NAME, None, [], super::#comp_type_name_snake::scalar_selections()) + } + } + _ => { + field.type_tokens(module_path)?; + quote!(#pcr::sel(#field_name_snake::NAME)) + } + }) + }); + + quote! { + fn scalar_selections() -> Vec<::prisma_client_rust::Selection> { + vec![#(#selections),*] + } + } +} + +pub fn r#struct(model: ModelWalker, module_path: &TokenStream) -> TokenStream { + let pcr = quote!(::prisma_client_rust); + + let scalar_selections_fn = scalar_selections_fn(model, module_path); + + quote! { + #[derive(Debug, Clone)] + pub struct Types; + + impl #pcr::ModelTypes for Types { + type Data = Data; + type Where = WhereParam; + type WhereUnique = UniqueWhereParam; + type UncheckedSet = UncheckedSetParam; + type Set = SetParam; + type With = WithParam; + type OrderBy = OrderByWithRelationParam; + type Cursor = UniqueWhereParam; + + const MODEL: &'static str = NAME; + + #scalar_selections_fn + } + } +} diff --git a/external/prisma-client-rust/crates/generator/src/models/update.rs b/external/prisma-client-rust/crates/generator/src/models/update.rs new file mode 100644 index 0000000..a91dd91 --- /dev/null +++ b/external/prisma-client-rust/crates/generator/src/models/update.rs @@ -0,0 +1,108 @@ +use prisma_client_rust_sdk::prisma::prisma_models::{ + walkers::{ModelWalker, RefinedFieldWalker}, + FieldArity, +}; + +use crate::prelude::*; + +pub fn r#struct(model: ModelWalker) -> TokenStream { + let struct_fields = model + .fields() + .filter(|f| f.ast_field().field_type.as_unsupported().is_none()) + .filter_map(|field| match field.refine() { + RefinedFieldWalker::Scalar(field) => { + let pk = field.is_autoincrement() + || field.is_single_pk() + || field.is_part_of_a_compound_pk(); + + let field_name_str = field.name(); + let field_name_snake = snake_ident(field_name_str); + let optional = field.ast_field().arity == FieldArity::Optional; + + Some(if optional { + quote! { + #[serde( + rename = #field_name_str, + skip_serializing_if = "Option::is_none" + )] + pub #field_name_snake: #field_name_snake::Type + } + } else if pk { + quote! { + #[serde(rename = #field_name_str)] + pub #field_name_snake: #field_name_snake::Type + } + } else { + quote! { + #[serde( + rename = #field_name_str, + skip_serializing_if = "Option::is_none" + )] + pub #field_name_snake: Option<#field_name_snake::Type> + } + }) + } + _ => None, + }); + + let struct_set_params = model + .fields() + .filter(|f| f.ast_field().field_type.as_unsupported().is_none()) + .filter_map(|field| match field.refine() { + RefinedFieldWalker::Scalar(field) => { + let pk = field.is_autoincrement() + || field.is_single_pk() + || field.is_part_of_a_compound_pk(); + + let field_name_str = field.name(); + let field_name_snake = snake_ident(field_name_str); + let optional = field.ast_field().arity == FieldArity::Optional; + + if pk { + return None; + } + + Some(if optional { + quote! { + if let Some(field) = self.#field_name_snake { + params.push(#field_name_snake::set(Some(field))); + } + } + } else { + quote! { + if let Some(field) = self.#field_name_snake { + params.push(#field_name_snake::set(field)); + } + } + }) + } + _ => None, + }); + + let specta_derive = cfg!(feature = "specta").then(|| { + let model_name_pascal_str = format!("{}Update", pascal_ident(model.name())); + + quote! { + #[derive(::prisma_client_rust::specta::Type)] + #[specta(rename = #model_name_pascal_str, crate = prisma_client_rust::specta)] + } + }); + + quote! { + #[derive(Debug, Clone, ::serde::Serialize, ::serde::Deserialize)] + #specta_derive + pub struct Update { + #(#struct_fields),* + } + + impl Update { + pub fn as_params(self) -> Vec { + let mut params = Vec::new(); + + #(#struct_set_params)* + + params + } + } + } +} diff --git a/external/prisma-client-rust/crates/generator/src/models/where_params.rs b/external/prisma-client-rust/crates/generator/src/models/where_params.rs new file mode 100644 index 0000000..d553d72 --- /dev/null +++ b/external/prisma-client-rust/crates/generator/src/models/where_params.rs @@ -0,0 +1,735 @@ +use prisma_client_rust_sdk::prisma::{ + prisma_models::{ + walkers::{FieldWalker, ModelWalker, RefinedFieldWalker, ScalarFieldWalker}, + FieldArity, + }, + psl::parser_database::ScalarFieldType, +}; + +use crate::prelude::*; + +use super::ModelModulePart; + +pub struct Operator { + pub name: &'static str, + pub action: &'static str, + pub list: bool, +} + +static OPERATORS: &'static [Operator] = &[ + Operator { + name: "Not", + action: "NOT", + list: false, + }, + Operator { + name: "Or", + action: "OR", + list: true, + }, + Operator { + name: "And", + action: "AND", + list: false, + }, +]; + +#[derive(Debug)] +pub enum Variant { + BaseVariant { + definition: TokenStream, + match_arm: TokenStream, + }, + UniqueVariant { + field_name: String, + field_required_type: TokenStream, + read_filter_name: String, + optional: bool, + value: TokenStream, + }, + CompoundUniqueVariant { + field_names_string: String, + variant_data_types: Vec, + match_arm: TokenStream, + }, +} + +impl Variant { + pub fn unique( + field: ScalarFieldWalker, + read_filter: &Filter, + module_path: &TokenStream, + ) -> Self { + Self::UniqueVariant { + field_name: field.name().to_string(), + field_required_type: field + .scalar_field_type() + .to_tokens( + module_path, + &match field.ast_field().arity { + FieldArity::Optional => FieldArity::Required, + a => a, + }, + field.db, + ) + .unwrap(), + read_filter_name: read_filter.name.to_string(), + optional: field.ast_field().arity.is_optional(), + value: { + let value = field + .scalar_field_type() + .to_prisma_value( + &format_ident!("value"), + &match field.ast_field().arity { + FieldArity::Optional => FieldArity::Required, + a => a, + }, + ) + .unwrap(); + + quote!(::prisma_client_rust::SerializedWhereValue::Value(#value)) + }, + } + } +} + +pub fn collate_entries(entries: Vec) -> TokenStream { + let pcr = quote!(::prisma_client_rust); + + let (variants, to_serialized_where): (Vec<_>, Vec<_>) = entries + .iter() + .filter_map(|e| match e { + Variant::BaseVariant { + definition, + match_arm, + } => Some((definition.clone(), Some(match_arm))), + _ => None, + }) + .unzip(); + + let (optional_unique_impls, (unique_variants, unique_to_serialized_where)): ( + Vec<_>, + (Vec<_>, Vec<_>), + ) = entries + .iter() + .filter_map(|e| match e { + Variant::UniqueVariant { + field_name, + field_required_type, + read_filter_name, + optional, + value, + } => { + let field_pascal = pascal_ident(field_name); + let field_snake = snake_ident(field_name); + + let variant_name = format_ident!("{}Equals", &field_pascal); + let filter_enum = format_ident!("{}Filter", &read_filter_name); + + let optional_unique_impls = optional.then(|| { + quote! { + impl ::prisma_client_rust::FromOptionalUniqueArg<#field_snake::Equals> for WhereParam { + type Arg = Option<#field_required_type>; + + fn from_arg(arg: Self::Arg) -> Self where Self: Sized { + Self::#field_pascal(super::_prisma::read_filters::#filter_enum::Equals(arg)) + } + } + + impl ::prisma_client_rust::FromOptionalUniqueArg<#field_snake::Equals> for UniqueWhereParam { + type Arg = #field_required_type; + + fn from_arg(arg: Self::Arg) -> Self where Self: Sized { + Self::#variant_name(arg) + } + } + } + }); + + Some(( + optional_unique_impls, + ( + quote!(#variant_name(#field_required_type)), + quote!(UniqueWhereParam::#variant_name(value) => (#field_name, #value)), + ), + )) + } + Variant::CompoundUniqueVariant { + field_names_string, + variant_data_types, + match_arm, + } => { + let variant_name = format_ident!("{}Equals", field_names_string); + + Some(( + None, + ( + quote!(#variant_name(#(#variant_data_types),*)), + quote!(#match_arm), + ), + )) + } + _ => None, + }) + .unzip(); + + quote! { + #[derive(Debug, Clone)] + pub enum WhereParam { + #(#variants),* + } + + impl #pcr::WhereInput for WhereParam { + fn serialize(self) -> #pcr::SerializedWhereInput { + let (name, value) = match self { + #(#to_serialized_where),* + }; + + #pcr::SerializedWhereInput::new(name.to_string(), value.into()) + } + } + + #[derive(Debug, Clone)] + pub enum UniqueWhereParam { + #(#unique_variants),* + } + + impl #pcr::WhereInput for UniqueWhereParam { + fn serialize(self) -> #pcr::SerializedWhereInput { + let (name, value) = match self { + #(#unique_to_serialized_where),* + }; + + #pcr::SerializedWhereInput::new(name.to_string(), value.into()) + } + } + + #(#optional_unique_impls)* + + impl From<#pcr::Operator> for WhereParam { + fn from(op: #pcr::Operator) -> Self { + match op { + #pcr::Operator::Not(value) => Self::Not(value), + #pcr::Operator::And(value) => Self::And(value), + #pcr::Operator::Or(value) => Self::Or(value), + } + } + } + } +} + +pub fn model_data( + model: ModelWalker, + args: &GenerateArgs, + module_path: &TokenStream, +) -> ModelModulePart { + let pcr = quote!(::prisma_client_rust); + + let mut entries = vec![]; + + entries.extend(OPERATORS.iter().map(|op| { + let variant_name = pascal_ident(&op.name); + let op_action = &op.action; + + let value = match op.list { + true => quote! { + #pcr::SerializedWhereValue::List( + value + .into_iter() + .map(#pcr::WhereInput::serialize) + .map(|p| #pcr::PrismaValue::Object(vec![p.into()])) + .collect() + ) + }, + false => quote! { + #pcr::SerializedWhereValue::Object( + ::prisma_client_rust::merge_fields( + value + .into_iter() + .map(#pcr::WhereInput::serialize) + .map(Into::into) + .collect() + ) + ) + }, + }; + + Variant::BaseVariant { + definition: quote!(#variant_name(Vec)), + match_arm: quote! { + Self::#variant_name(value) => ( + #op_action, + #value, + ) + }, + } + })); + + let compound_field_accessors = unique_field_combos(model).iter().flat_map(|fields| { + if fields.len() == 1 { + let field = fields[0]; + + let read_filter = args.read_filter( + field + ).unwrap(); + + entries.push(Variant::unique(field, read_filter, module_path)); + + None + } else { + let variant_name_string = fields.iter().map(|f| pascal_ident(f.name()).to_string()).collect::(); + let variant_name = format_ident!("{}Equals", &variant_name_string); + + let variant_data_names = fields.iter().map(|f| snake_ident(f.name())).collect::>(); + + let ((field_defs, field_types), (prisma_values, field_names_snake)): + ((Vec<_>, Vec<_>), (Vec<_>, Vec<_>)) = fields.into_iter().map(|field| { + let field_type = match field.ast_field().arity { + FieldArity::List | FieldArity::Required => field.type_tokens(module_path), + FieldArity::Optional => field.scalar_field_type().to_tokens(module_path, &FieldArity::Required, field.db) + }.unwrap(); + + let field_name_snake = snake_ident(field.name()); + + ( + (quote!(#field_name_snake: #field_type), field_type), + (field.scalar_field_type().to_prisma_value(&field_name_snake, &FieldArity::Required), field_name_snake) + ) + }).unzip(); + + let field_names_joined = fields.iter().map(|f| f.name()).collect::>().join("_"); + + entries.extend([ + Variant::CompoundUniqueVariant { + field_names_string: variant_name_string.clone(), + variant_data_types: field_types, + match_arm: quote! { + Self::#variant_name(#(#field_names_snake),*) => ( + #field_names_joined, + #pcr::SerializedWhereValue::Object(vec![#((#variant_data_names::NAME.to_string(), #prisma_values)),*]) + ) + }, } + ]); + + let accessor_name = snake_ident(&variant_name_string); + + Some(quote! { + pub fn #accessor_name>(#(#field_defs),*) -> T { + UniqueWhereParam::#variant_name(#(#field_names_snake),*).into() + } + }) + } + }).collect::(); + + let (field_stuff, field_where_param_entries): (_, Vec<_>) = model + .fields() + .filter(|f| f.ast_field().field_type.as_unsupported().is_none()) + .map(|f| field_module(f, args, module_path)) + .unzip(); + + entries.extend(field_where_param_entries.into_iter().flatten()); + + let collated_entries = collate_entries(entries); + + ModelModulePart { + data: quote! { + #compound_field_accessors + #collated_entries + }, + fields: field_stuff, + } +} + +pub fn unique_field_combos(model: ModelWalker) -> Vec> { + let mut combos = model + .indexes() + .filter(|f| f.is_unique()) + .map(|unique| { + unique + .fields() + .filter_map(|field| { + model + .scalar_fields() + .find(|mf| mf.field_id() == field.field_id()) + }) + .collect() + }) + .collect::>(); + + if let Some(primary_key) = model.primary_key() { + let primary_key_is_also_unique = model.indexes().any(|i| { + primary_key.contains_exactly_fields( + i.fields() + .map(|f| f.as_scalar_field()) + .flatten() + .collect::>() + .into_iter(), + ) + }); + + if !primary_key_is_also_unique { + combos.push( + primary_key + .fields() + .filter_map(|field| { + model + .scalar_fields() + .find(|mf| mf.field_id() == field.field_id()) + }) + .collect(), + ); + } + } + + combos +} + +pub fn field_module( + field: FieldWalker, + args: &GenerateArgs, + module_path: &TokenStream, +) -> ((String, TokenStream), Vec) { + let pcr = quote!(::prisma_client_rust); + let mut where_param_entries = vec![]; + + let field_name = field.name(); + let field_name_pascal = pascal_ident(field_name); + let field_name_snake = snake_ident(field_name); + let field_type = field.type_tokens("e!()); + + let is_null_variant = format_ident!("{field_name_pascal}IsNull"); + let equals_variant = format_ident!("{field_name_pascal}Equals"); + + let arity = field.ast_field().arity; + + let field_module_contents = match field.refine() { + RefinedFieldWalker::Relation(relation_field) => { + let relation_model_name_snake = snake_ident(relation_field.related_model().name()); + + if let FieldArity::Optional = arity { + where_param_entries.push(Variant::BaseVariant { + definition: quote!(#is_null_variant), + match_arm: quote! { + Self::#is_null_variant => ( + #field_name_snake::NAME, + #pcr::SerializedWhereValue::Value(#pcr::PrismaValue::Null) + ) + }, + }); + }; + + let relation_methods = field.relation_methods().iter().map(|method| { + let method_action_string = method.to_case(Case::Camel, false); + let variant_name = format_ident!("{}{}", &field_name_pascal, pascal_ident(method)); + let method_name_snake = snake_ident(method); + + where_param_entries.push(Variant::BaseVariant { + definition: quote!(#variant_name(Vec)), + match_arm: quote! { + Self::#variant_name(where_params) => ( + #field_name_snake::NAME, + #pcr::SerializedWhereValue::Object(vec![( + #method_action_string.to_string(), + #pcr::PrismaValue::Object( + where_params + .into_iter() + .map(#pcr::WhereInput::serialize) + .map(#pcr::SerializedWhereInput::transform_equals) + .collect() + ), + )]) + ) + }, + }); + + quote! { + pub fn #method_name_snake(value: Vec<#relation_model_name_snake::WhereParam>) -> WhereParam { + WhereParam::#variant_name(value) + } + } + }).collect::(); + + quote! { + #relation_methods + } + } + RefinedFieldWalker::Scalar(scalar_field) => match scalar_field.scalar_field_type() { + ScalarFieldType::CompositeType(cf_id) => { + let comp_type = field.db.walk(cf_id); + + let comp_type_snake = snake_ident(comp_type.name()); + + // Filters + + let optional_filters = arity + .is_optional() + .then(|| { + let is_set_filter = { + let where_param_variant = format_ident!("{field_name_pascal}IsSet"); + + where_param_entries.push(Variant::BaseVariant { + definition: quote!(#where_param_variant), + match_arm: quote! { + Self::#where_param_variant => ( + #field_name_snake::NAME, + #pcr::SerializedWhereValue::Value( + #pcr::PrismaValue::Boolean(true) + ) + ) + }, + }); + + quote! { + pub fn is_set() -> WhereParam { + WhereParam::#where_param_variant + } + } + }; + + vec![is_set_filter] + }) + .unwrap_or(vec![]); + + let many_filters: Vec<_> = arity + .is_list() + .then(|| { + let equals_filter = { + let where_param_variant = format_ident!("{field_name_pascal}Equals"); + let content_type = + quote!(Vec<#module_path #comp_type_snake::WhereParam>); + + where_param_entries.push(Variant::BaseVariant { + definition: quote!(#where_param_variant(Vec<#content_type>)), + match_arm: quote! { + Self::#where_param_variant(where_params) => ( + #field_name_snake::NAME, + #pcr::SerializedWhereValue::Object(vec![( + "equals".to_string(), + #pcr::PrismaValue::List( + where_params + .into_iter() + .map(|params| + #pcr::PrismaValue::Object( + params + .into_iter() + .map(#pcr::WhereInput::serialize) + .map(#pcr::SerializedWhereInput::transform_equals) + .collect() + ) + ) + .collect() + ) + )]) + ) + }, + }); + + quote! { + pub fn equals(params: Vec<#content_type>) -> WhereParam { + WhereParam::#where_param_variant(params) + } + } + }; + + let is_empty_filter = { + let where_param_variant = format_ident!("{field_name_pascal}IsEmpty"); + + where_param_entries.push(Variant::BaseVariant { + definition: quote!(#where_param_variant), + match_arm: quote! { + Self::#where_param_variant => ( + #field_name_snake::NAME, + #pcr::SerializedWhereValue::Object(vec![( + "isEmpty".to_string(), + #pcr::PrismaValue::Boolean(true) + )]) + ) + }, + }); + + quote! { + pub fn is_empty() -> WhereParam { + WhereParam::#where_param_variant + } + } + }; + + let general_filters = ["every", "some", "none"].iter().map(|method| { + let method_snake = snake_ident(method); + let method_pascal = pascal_ident(method); + + let where_param_variant = + format_ident!("{field_name_pascal}{method_pascal}"); + let content_type = + quote!(Vec<#module_path #comp_type_snake::WhereParam>); + + where_param_entries.push(Variant::BaseVariant { + definition: quote!(#where_param_variant(#content_type)), + match_arm: quote! { + Self::#where_param_variant(where_params) => ( + #field_name_snake::NAME, + #pcr::SerializedWhereValue::Object(vec![( + #method.to_string(), + #pcr::PrismaValue::Object( + where_params + .into_iter() + .map(#pcr::WhereInput::serialize) + .map(#pcr::SerializedWhereInput::transform_equals) + .collect() + ) + )]) + ) + }, + }); + + quote! { + pub fn #method_snake(params: #content_type) -> WhereParam { + WhereParam::#where_param_variant(params) + } + } + }); + + general_filters + .chain([equals_filter, is_empty_filter]) + .collect() + }) + .unwrap_or_else(|| { + ["equals", "is", "isNot"] + .iter() + .map(|method| { + let method_snake = snake_ident(method); + let method_pascal = pascal_ident(method); + + let where_param_variant = + format_ident!("{field_name_pascal}{method_pascal}"); + let content_type = + quote!(Vec<#module_path #comp_type_snake::WhereParam>); + + where_param_entries.push(Variant::BaseVariant { + definition: quote!(#where_param_variant(#content_type)), + match_arm: quote! { + Self::#where_param_variant(where_params) => ( + #field_name_snake::NAME, + #pcr::SerializedWhereValue::Object(vec![( + #method.to_string(), + #pcr::PrismaValue::Object( + where_params + .into_iter() + .map(#pcr::WhereInput::serialize) + .map(#pcr::SerializedWhereInput::transform_equals) + .collect() + ) + )]) + ) + }, + }); + + quote! { + pub fn #method_snake(params: #content_type) -> WhereParam { + WhereParam::#where_param_variant(params) + } + } + }) + .collect() + }); + + quote! { + #(#optional_filters)* + #(#many_filters)* + } + } + _ => { + let read_fns = args.read_filter(scalar_field).map(|read_filter| { + let filter_enum = format_ident!("{}Filter", &read_filter.name); + + let model = field.model(); + + // Add equals query functions. Unique/Where enum variants are added in unique/primary key sections earlier on. + let equals = match ( + scalar_field.is_single_pk(), + model.indexes().any(|idx| { + let mut fields = idx.fields(); + idx.is_unique() && fields.len() == 1 && fields.next().map(|f| f.field_id()) == Some(scalar_field.field_id()) + }), + arity.is_optional() + ) { + (true, _, _) | (_, true, false) => quote! { + pub fn equals>(value: #field_type) -> T { + Equals(value).into() + } + + impl From for UniqueWhereParam { + fn from(Equals(v): Equals) -> Self { + UniqueWhereParam::#equals_variant(v) + } + } + }, + (_, true, true) => quote! { + pub fn equals>(value: T::Arg) -> T { + T::from_arg(value) + } + }, + (false, false, _) => quote! { + pub fn equals>(value: #field_type) -> T { + Equals(value).into() + } + } + }; + + where_param_entries.push(Variant::BaseVariant { + definition: quote!(#field_name_pascal(super::_prisma::read_filters::#filter_enum)), + match_arm: quote! { + Self::#field_name_pascal(value) => ( + #field_name_snake::NAME, + value.into() + ) + }, + }); + + let read_methods = read_filter.fields.iter().filter_map(|field| { + let name = match field.name.as_str() { + "equals" => return None, + "in" => "inVec", + "notIn" => "notInVec", + n => n + }; + + let method_name_snake = snake_ident(name); + let method_name_pascal = pascal_ident(name); + + let typ = field.type_tokens("e!()); + + Some(quote!(fn #method_name_snake(_: #typ) -> #method_name_pascal;)) + }); + + quote! { + pub struct Equals(pub #field_type); + + #equals + + impl From for WhereParam { + fn from(Equals(v): Equals) -> Self { + WhereParam::#field_name_pascal(_prisma::read_filters::#filter_enum::Equals(v)) + } + } + + #pcr::scalar_where_param_fns!( + _prisma::read_filters::#filter_enum, + #field_name_pascal, + { #(#read_methods)* } + ); + } + }); + + quote! { + #read_fns + } + } + }, + }; + + ( + (field_name.to_string(), field_module_contents), + where_param_entries, + ) +} diff --git a/external/prisma-client-rust/crates/generator/src/models/with_params.rs b/external/prisma-client-rust/crates/generator/src/models/with_params.rs new file mode 100644 index 0000000..25e00b6 --- /dev/null +++ b/external/prisma-client-rust/crates/generator/src/models/with_params.rs @@ -0,0 +1,153 @@ +use prisma_client_rust_sdk::prisma::prisma_models::{ + walkers::{ModelWalker, RelationFieldWalker}, + FieldArity, +}; + +use crate::prelude::*; + +use super::{order_by, pagination, ModelModulePart}; + +pub fn builder_fn(field: RelationFieldWalker) -> TokenStream { + let relation_model_name_snake = snake_ident(field.related_model().name()); + + quote! { + pub fn with(mut self, params: impl Into<#relation_model_name_snake::WithParam>) -> Self { + self.0 = self.0.with(params.into()); + self + } + } +} + +fn enum_variant(field: RelationFieldWalker) -> TokenStream { + let field_name_pascal = pascal_ident(field.name()); + let relation_model_name_snake = snake_ident(field.related_model().name()); + + let args = match field.ast_field().arity { + FieldArity::List => quote!(ManyArgs), + _ => quote!(UniqueArgs), + }; + + quote!(#field_name_pascal(super::#relation_model_name_snake::#args)) +} + +fn into_selection_arm(field: RelationFieldWalker) -> TokenStream { + let field_name_snake = snake_ident(field.name()); + let field_name_pascal = pascal_ident(field.name()); + let relation_model_name_snake = snake_ident(field.related_model().name()); + + let pcr = quote!(::prisma_client_rust); + + let body = match field.ast_field().arity { + FieldArity::List => quote! { + let (arguments, mut nested_selections) = args.to_graphql(); + nested_selections.extend(::scalar_selections()); + + #pcr::Selection::new( + #field_name_snake::NAME, + None, + arguments, + nested_selections + ) + }, + _ => quote! { + let mut selections = ::scalar_selections(); + selections.extend(args.with_params.into_iter().map(Into::<#pcr::Selection>::into)); + + #pcr::Selection::new( + #field_name_snake::NAME, + None, + [], + selections + ) + }, + }; + + quote! { + Self::#field_name_pascal(args) => { + #body + } + } +} + +pub fn model_data(model: ModelWalker) -> ModelModulePart { + let variants = model.relation_fields().map(enum_variant); + let into_selection_arms = model.relation_fields().map(into_selection_arm); + + let fields = model + .relation_fields() + .map(|field| { + let field_name_pascal = pascal_ident(field.name()); + + let relation_model_name_snake = snake_ident(field.related_model().name()); + + let order_by_fn = order_by::fetch_builder_fn(&relation_model_name_snake); + let pagination_fns = pagination::fetch_builder_fns(&relation_model_name_snake); + let with_fn = builder_fn(field); + + let body = match field.referential_arity() { + FieldArity::List => { + quote! { + pub struct Fetch(pub #relation_model_name_snake::ManyArgs); + + impl Fetch { + #with_fn + + #order_by_fn + + #pagination_fns + } + + impl From for WithParam { + fn from(Fetch(v): Fetch) -> Self { + WithParam::#field_name_pascal(v) + } + } + + pub fn fetch(params: Vec<#relation_model_name_snake::WhereParam>) -> Fetch { + Fetch(#relation_model_name_snake::ManyArgs::new(params)) + } + } + } + _ => { + quote! { + pub struct Fetch(pub #relation_model_name_snake::UniqueArgs); + + impl Fetch { + #with_fn + } + + impl From for WithParam { + fn from(Fetch(v): Fetch) -> Self { + WithParam::#field_name_pascal(v) + } + } + + pub fn fetch() -> Fetch { + Fetch(#relation_model_name_snake::UniqueArgs::new()) + } + } + } + }; + + (field.name().to_string(), body) + }) + .collect(); + + ModelModulePart { + data: quote! { + #[derive(Debug, Clone)] + pub enum WithParam { + #(#variants),* + } + + impl Into<::prisma_client_rust::Selection> for WithParam { + fn into(self) -> ::prisma_client_rust::Selection { + match self { + #(#into_selection_arms),* + } + } + } + }, + fields, + } +} diff --git a/external/prisma-client-rust/crates/generator/src/prelude.rs b/external/prisma-client-rust/crates/generator/src/prelude.rs new file mode 100644 index 0000000..570966e --- /dev/null +++ b/external/prisma-client-rust/crates/generator/src/prelude.rs @@ -0,0 +1,15 @@ +pub use prisma_client_rust_sdk::{ + prisma::{datamodel::dml, *}, + *, +}; +pub use proc_macro2::*; +pub use quote::*; +pub use syn::Ident; + +pub fn snake_ident(name: &str) -> Ident { + format_ident!("{}", name.to_case(Case::Snake)) +} + +pub fn pascal_ident(name: &str) -> Ident { + format_ident!("{}", name.to_case(Case::Pascal)) +} diff --git a/external/prisma-client-rust/crates/generator/src/read_filters.rs b/external/prisma-client-rust/crates/generator/src/read_filters.rs new file mode 100644 index 0000000..00abda6 --- /dev/null +++ b/external/prisma-client-rust/crates/generator/src/read_filters.rs @@ -0,0 +1,81 @@ +use super::prelude::*; + +pub fn generate_module(args: &GenerateArgs) -> TokenStream { + let read_filters = args.read_filters.iter().map(|filter| { + let name = format_ident!("{}Filter", &filter.name); + + let (method_variants, method_matches): (Vec<_>, Vec<_>) = filter + .fields + .iter() + .flat_map(|field| { + let action_str = &field.name; + let action_sanitised_str = match field.name.as_str() { + "in" => "inVec", + "notIn" => "notInVec", + n => n, + }; + + let variant_name = pascal_ident(&action_sanitised_str); + + let value_ident = format_ident!("value"); + + let value_as_prisma_value = field.to_prisma_value(&value_ident); + + let typ = field.type_tokens("e!(super::super::)); + + // https://github.com/Brendonovich/prisma-client-rust/issues/297 + if filter.name == "JsonNullable" && field.name == "equals" { + Some(( + quote!(#variant_name(Option<#typ>)), + quote! { + Self::#variant_name(#value_ident) => + ::prisma_client_rust::SerializedWhereValue::Object( + vec![( + #action_str.to_string(), + #value_ident.map(|#value_ident| #value_as_prisma_value) + .unwrap_or(::prisma_client_rust::PrismaValue::Null) + )] + ) + }, + )) + } else { + Some(( + quote!(#variant_name(#typ)), + quote! { + Self::#variant_name(#value_ident) => + ::prisma_client_rust::SerializedWhereValue::Object( + vec![( + #action_str.to_string(), + #value_as_prisma_value + )] + ) + }, + )) + } + }) + .unzip(); + + quote! { + #[derive(Debug, Clone)] + pub enum #name { + #(#method_variants),* + } + + impl Into<::prisma_client_rust::SerializedWhereValue> for #name { + fn into(self) -> ::prisma_client_rust::SerializedWhereValue { + match self { + #(#method_matches),* + } + } + } + } + }); + + quote! { + pub mod read_filters { + use super::*; + + #(#read_filters)* + } + } +} diff --git a/external/prisma-client-rust/crates/generator/src/write_params.rs b/external/prisma-client-rust/crates/generator/src/write_params.rs new file mode 100644 index 0000000..0344014 --- /dev/null +++ b/external/prisma-client-rust/crates/generator/src/write_params.rs @@ -0,0 +1,92 @@ +use std::collections::BTreeMap; + +use prisma_client_rust_sdk::prisma::psl::parser_database::ScalarType; + +use super::prelude::*; + +pub fn enum_name(filter: &Filter) -> Ident { + format_ident!("{}Param", &filter.name) +} + +pub fn generate_module(args: &GenerateArgs) -> TokenStream { + let write_params = { + let write_params_map = args + .write_params + .iter() + .map(|write_param| (&write_param.name, write_param)) + .collect::>(); + + write_params_map + .values() + .map(|write_param| { + let name = enum_name(write_param); + + let (method_variants, method_matches): (Vec<_>, Vec<_>) = { + if write_param.name == "Json" { + let var = format_ident!("value"); + let prisma_value = ScalarType::Json.to_prisma_value(&var); + + ( + vec![quote!(Set(::prisma_client_rust::serde_json::Value))], + vec![quote!(Self::Set(#var) => #prisma_value)], + ) + } else { + write_param + .fields + .iter() + .flat_map(|field| { + let typ = field.type_tokens("e!(super::super::)); + let action = &field.name; + + let prisma_value_converter = + field.to_prisma_value(&format_ident!("value")); + + let method_name_pascal = pascal_ident(&field.name); + + // Set doesn't use 'set' as the action name. + let prisma_value = if action == "set" { + prisma_value_converter + } else { + quote! { + ::prisma_client_rust::PrismaValue::Object(vec![( + #action.to_string(), + #prisma_value_converter + )]) + } + }; + + Some(( + quote!(#method_name_pascal(#typ)), + quote!(Self::#method_name_pascal(value) => #prisma_value), + )) + }) + .unzip() + } + }; + + quote! { + #[derive(Debug, Clone)] + pub enum #name { + #(#method_variants),* + } + + impl Into<::prisma_client_rust::PrismaValue> for #name { + fn into(self) -> ::prisma_client_rust::PrismaValue { + match self { + #(#method_matches),* + } + } + } + } + }) + .collect::>() + }; + + quote! { + pub mod write_params { + use super::*; + + #(#write_params)* + } + } +} diff --git a/external/prisma-client-rust/crates/lib/Cargo.toml b/external/prisma-client-rust/crates/lib/Cargo.toml new file mode 100644 index 0000000..4e6ca4c --- /dev/null +++ b/external/prisma-client-rust/crates/lib/Cargo.toml @@ -0,0 +1,70 @@ +[package] +name = "prisma-client-rust" +version = "0.6.8" +authors = ["Brendan Allan "] +edition = "2021" +description = "A prisma client for Rust" +rust-version = "1.62" + +[features] +default = [] +# rspc = ["dep:rspc", "specta"] +specta = ["dep:specta", "prisma-client-rust-generator-macros/specta"] +sqlite-create-many = ["psl/sqlite-create-many"] +migrations = [ + "schema-core", + "dep:include_dir", + "dep:tempfile", + "tokio/fs", + "dep:tracing", +] +mocking = ["tokio"] +# mutation-callbacks = [] + +mssql = ["schema-core/mssql", "request-handlers/mssql"] +mysql = ["schema-core/mysql", "request-handlers/mysql"] +postgresql = ["schema-core/postgresql", "request-handlers/postgresql"] +sqlite = ["schema-core/sqlite", "request-handlers/sqlite"] + +mongodb = ["schema-core/mongodb", "request-handlers/mongodb"] + +[dependencies] +serde.workspace = true +serde_json.workspace = true +chrono = { version = "0.4.19", features = ["serde"] } +thiserror = "1.0.30" +bigdecimal = { version = "0.4", features = ["serde"] } +bigdecimal_03 = { package = "bigdecimal", version = "0.3" } +uuid = { version = "1", features = ["serde"] } +indexmap = "1.8.2" +serde-value = "0.7.0" +base64 = "0.13.0" +tokio = { version = "1.21.0", optional = true } +futures = "0.3" +paste = "1.0.11" +prisma-client-rust-generator-macros = { path = "../generator-macros" } + +prisma-models = { workspace = true } +user-facing-errors = { workspace = true } +psl = { workspace = true } +diagnostics = { workspace = true } +request-handlers = { workspace = true } +query-core = { workspace = true } + +# features = "migrations" +schema-core = { workspace = true, optional = true } +include_dir = { version = "0.7.2", optional = true } +tempfile = { version = "3.5.0", optional = true } +tracing = { version = "0.1.36", optional = true } + +# features = "specta" +specta = { optional = true, workspace = true, features = [ + "indexmap", + "chrono", + "uuid", + "bigdecimal", +] } + +# features = "rspc" +# rspc = { optional = true, workspace = true } +dotenvy = "0.15.7" diff --git a/external/prisma-client-rust/crates/lib/src/actions.rs b/external/prisma-client-rust/crates/lib/src/actions.rs new file mode 100644 index 0000000..f11e7fd --- /dev/null +++ b/external/prisma-client-rust/crates/lib/src/actions.rs @@ -0,0 +1,31 @@ +use crate::{ModelWriteOperation, SerializedWhereInput}; + +pub trait WhereInput { + fn serialize(self) -> SerializedWhereInput; +} + +#[derive(Debug, PartialEq, Eq)] +pub struct ModelMutationCallbackData { + pub action: ModelWriteOperation, + pub model: &'static str, +} + +pub type ModelMutationCallback = Box; + +pub struct ActionNotifier { + pub model_mutation_callbacks: Vec, +} + +impl ActionNotifier { + pub fn new() -> Self { + Self { + model_mutation_callbacks: vec![], + } + } +} + +impl Default for ActionNotifier { + fn default() -> Self { + Self::new() + } +} diff --git a/external/prisma-client-rust/crates/lib/src/client.rs b/external/prisma-client-rust/crates/lib/src/client.rs new file mode 100644 index 0000000..11074e8 --- /dev/null +++ b/external/prisma-client-rust/crates/lib/src/client.rs @@ -0,0 +1,267 @@ +use crate::ActionNotifier; +use psl::Diagnostics; +use query_core::{ + protocol::EngineProtocol, + schema::{self, QuerySchema}, + BatchDocumentTransaction, CoreError, Operation, TxId, +}; + +use std::sync::Arc; +use thiserror::Error; + +use crate::{prisma_value, QueryError, Result}; + +pub type Executor = Box; + +pub trait PrismaClient { + fn internals(&self) -> &PrismaClientInternals; + fn internals_mut(&mut self) -> &mut PrismaClientInternals; + fn with_tx_id(&self, tx_id: Option) -> Self; +} + +pub struct ExecutorConnector { + pub executor: Executor, + pub query_schema: Arc, + pub url: String, +} + +#[derive(Clone)] +pub(crate) enum ExecutionEngine { + Real { + connector: Arc, + tx_id: Option, + }, + #[cfg(feature = "mocking")] + Mock(crate::MockStore), +} + +impl ExecutionEngine { + async fn execute(&self, op: Operation) -> Result { + match self { + Self::Real { connector, tx_id } => { + let response = connector + .executor + .execute( + tx_id.clone(), + op, + connector.query_schema.clone(), + None, + EngineProtocol::Json, + ) + .await + .map_err(|e| QueryError::Execute(e.into()))?; + + let data: prisma_value::Item = response.data.into(); + + let data = serde_value::to_value(data) + .map_err(|e| e.to_string()) + .map_err(QueryError::Deserialize)?; + + Ok(data) + } + #[cfg(feature = "mocking")] + Self::Mock(store) => Ok(store.get_op(&op).await.expect("Mock data not found")), + } + } + + pub async fn execute_all( + &self, + ops: Vec, + ) -> Result>> { + match self { + Self::Real { connector, .. } => { + let response = connector + .executor + .execute_all( + None, + ops, + Some(BatchDocumentTransaction::new(None)), + connector.query_schema.clone(), + None, + EngineProtocol::Json, + ) + .await + .map_err(|e| QueryError::Execute(e.into()))?; + + Ok(response + .into_iter() + .map(|result| { + let data: prisma_value::Item = result + .map_err(|e| QueryError::Execute(e.into()))? + .data + .into(); + + Ok(serde_value::to_value(data) + .map_err(|e| e.to_string()) + .map_err(QueryError::Deserialize)?) + }) + .collect()) + } + #[cfg(feature = "mocking")] + Self::Mock(store) => { + let mut ret = vec![]; + + for op in ops { + ret.push(Ok(store.get_op(&op).await.expect("Mock data not found"))) + } + + Ok(ret) + } + } + } + + fn with_tx_id(&self, tx_id: Option) -> Self { + match self { + Self::Real { connector, .. } => Self::Real { + connector: connector.clone(), + tx_id, + }, + #[cfg(feature = "mocking")] + _ => self.clone(), + } + } +} + +/// The data held by the generated PrismaClient +/// Do not use this in your own code! +#[derive(Clone)] +pub struct PrismaClientInternals { + pub(crate) engine: ExecutionEngine, + pub action_notifier: Arc, +} + +impl PrismaClientInternals { + pub(crate) async fn execute(&self, operation: Operation) -> Result { + self.engine.execute(operation).await + } + + // pub fn notify_model_mutation<'a, Action>(&self) + // where + // Action: ModelQuery<'a>, + // { + // match Action::TYPE { + // ModelOperation::Write(action) => { + // for callback in &self.action_notifier.model_mutation_callbacks { + // (callback)(ModelMutationCallbackData { + // model: Action::Types::MODEL, + // action, + // }) + // } + // } + // ModelOperation::Read(_) => { + // println!("notify_model_mutation only acceps mutations, not queries!") + // } + // } + // } + + pub async fn new( + url: Option, + action_notifier: ActionNotifier, + datamodel: &str, + ) -> std::result::Result { + let schema = Arc::new(psl::validate(datamodel.into())); + let config = &schema.configuration; + + let source = config + .datasources + .first() + .expect("Please supply a datasource in your schema.prisma file"); + + let url = match url { + Some(url) => url, + None => { + let url = match source.load_url(|key| dotenvy::var(key).ok()) { + Ok(url) => Some(url), + Err(_) => source.load_shadow_database_url()?, + } + .expect("Datasource could not be fetched, please check your schema.prisma file or your environment variables"); + + match url.starts_with("file:") { + true => { + let path = url.split(':').nth(1).unwrap(); + if std::path::Path::new("./prisma/schema.prisma").exists() { + format!("file:./prisma/{path}") + } else { + url + } + } + _ => url, + } + } + }; + + let executor = + request_handlers::load_executor(source, config.preview_features(), &url).await?; + + executor.primary_connector().get_connection().await?; + + Ok(Self { + engine: ExecutionEngine::Real { + connector: Arc::new(ExecutorConnector { + executor, + query_schema: Arc::new(schema::build(schema.clone(), true)), + url, + }), + tx_id: None, + }, + action_notifier: Arc::new(action_notifier), + }) + } + + #[cfg(feature = "mocking")] + pub fn new_mock(action_notifier: ActionNotifier) -> (Self, crate::MockStore) { + let mock_store = crate::MockStore::new(); + + ( + Self { + engine: ExecutionEngine::Mock(mock_store.clone()), + action_notifier: Arc::new(action_notifier), + }, + mock_store, + ) + } + + pub fn url(&self) -> &str { + match &self.engine { + #[cfg(feature = "mocking")] + ExecutionEngine::Mock(_) => "mock", + ExecutionEngine::Real { connector, .. } => &connector.url, + } + } + + pub fn with_tx_id(&self, tx_id: Option) -> Self { + Self { + engine: self.engine.with_tx_id(tx_id), + action_notifier: self.action_notifier.clone(), + } + } +} + +trait DiagnosticsToString { + fn to_string(&self) -> String; +} + +impl DiagnosticsToString for Diagnostics { + fn to_string(&self) -> String { + let strs: Vec<_> = self.errors().iter().map(|e| e.message()).collect(); + strs.join("\n") + } +} + +#[derive(Debug, Error)] +pub enum NewClientError { + #[error("Error configuring database connection: {}", .0.to_string())] + Configuration(Diagnostics), + + #[error("Error loading database executor: {0}")] + Executor(#[from] CoreError), + + #[error("Error getting database connection: {0}")] + Connection(#[from] query_core::ConnectorError), +} + +impl From for NewClientError { + fn from(diagnostics: Diagnostics) -> Self { + NewClientError::Configuration(diagnostics) + } +} diff --git a/external/prisma-client-rust/crates/lib/src/gen_macros.rs b/external/prisma-client-rust/crates/lib/src/gen_macros.rs new file mode 100644 index 0000000..3e69c29 --- /dev/null +++ b/external/prisma-client-rust/crates/lib/src/gen_macros.rs @@ -0,0 +1,12 @@ +#[macro_export] +macro_rules! scalar_where_param_fns { + ( + $filter_enum:ty, + $variant:ident, + { $(fn $name:ident(_: $typ:ty $(,)?) -> $filter_variant:ident;)+ } + ) => { $( + pub fn $name(value: $typ) -> WhereParam { + WhereParam::$variant(<$filter_enum>::$filter_variant(value)) + } + )+} +} diff --git a/external/prisma-client-rust/crates/lib/src/lib.rs b/external/prisma-client-rust/crates/lib/src/lib.rs new file mode 100644 index 0000000..9a96634 --- /dev/null +++ b/external/prisma-client-rust/crates/lib/src/lib.rs @@ -0,0 +1,143 @@ +#![allow(unexpected_cfgs, unreachable_patterns, dead_code)] + +#[cfg(not(any( + feature = "sqlite", + feature = "mssql", + feature = "mysql", + feature = "postgresql", + feature = "mongodb" +)))] +compile_error!("No connector feature enabled. Please enable a connector feature ('mssql', 'mysql', 'postgresql', 'sqlite', or 'mongodb')"); + +pub mod actions; +mod client; +mod gen_macros; +#[cfg(feature = "migrations")] +pub mod migrations; +#[cfg(feature = "mocking")] +mod mock; +pub mod operator; +mod prisma_value; +pub mod queries; +pub mod raw; +pub mod scalar_types; +pub mod serde; +mod traits; +mod transaction; + +use std::collections::HashMap; + +pub use bigdecimal; +pub use chrono; +pub use prisma_models; +pub use prisma_value::PrismaValue; +pub use psl; +pub use query_core; +pub use query_core::{schema, Selection}; +pub use serde_json; +use thiserror::Error; +#[cfg(feature = "migrations")] +pub use tokio; +pub use user_facing_errors as prisma_errors; + +pub use actions::*; +pub use client::*; +#[cfg(feature = "mocking")] +pub use mock::*; +pub use operator::Operator; +pub use queries::*; +pub use raw::*; +pub use traits::*; +pub use transaction::*; + +pub use prisma_client_rust_generator_macros as macros; + +#[cfg(feature = "specta")] +pub use specta; + +#[cfg(feature = "rspc")] +pub use rspc; + +use ::serde::Deserialize; + +/// The return type of `findMany` queries. +#[derive(Deserialize)] +pub struct BatchResult { + pub count: i64, +} + +impl BatchResult { + pub fn selection() -> Selection { + Selection::new("count", None, [], []) + } +} + +#[derive(Error, Debug)] +pub struct RelationNotFetchedError { + field: &'static str, +} + +impl RelationNotFetchedError { + pub fn new(field: &'static str) -> Self { + RelationNotFetchedError { field } + } +} + +impl std::fmt::Display for RelationNotFetchedError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "Attempted to access field '{}' but did not fetch it using the .with() syntax", + self.field + ) + } +} + +#[macro_export] +macro_rules! not { + ($($x:expr),+ $(,)?) => { + $crate::operator::not(vec![$($x),+]) + }; +} + +#[macro_export] +macro_rules! and { + ($($x:expr),+ $(,)?) => { + $crate::operator::and(vec![$($x),+]) + }; +} + +#[macro_export] +macro_rules! or { + ($($x:expr),+ $(,)?) => { + $crate::operator::or(vec![$($x),+]) + }; +} + +pub type ObjectFields = Vec<(String, PrismaValue)>; + +/// Creates a PrismaValue::Object from a list of key-value pairs. +/// If a key has multiple values that are PrismaValue::Objects, they will be merged. +pub fn merge_fields(fields: Vec<(String, PrismaValue)>) -> Vec<(String, PrismaValue)> { + let mut merged = HashMap::new(); + + for el in fields { + match (merged.get_mut(&el.0), el.1) { + (Some(PrismaValue::Object(existing)), PrismaValue::Object(incoming)) => { + existing.extend(incoming); + } + (None, v) => { + merged.insert(el.0, v); + } + (Some(_), _) => { + unreachable!("Cannot merge values if both are not objects") + } + } + } + + merged.into_iter().collect() +} + +pub fn sel(name: &str) -> Selection { + Selection::new(name, None, [], []) +} diff --git a/external/prisma-client-rust/crates/lib/src/migrations.rs b/external/prisma-client-rust/crates/lib/src/migrations.rs new file mode 100644 index 0000000..dc621e4 --- /dev/null +++ b/external/prisma-client-rust/crates/lib/src/migrations.rs @@ -0,0 +1,275 @@ +use std::{future::Future, pin::Pin}; + +pub use include_dir; +pub use schema_core::CoreError; +use schema_core::{ + commands, + json_rpc::types::{ApplyMigrationsInput, MarkMigrationAppliedInput, SchemaPushInput}, + EngineState, GenericApi, +}; +use thiserror::Error; +use tokio::fs::remove_dir_all; + +type BoxedFuture = Pin + Send>>; + +fn format_error_array(arr: &[String]) -> String { + arr.join("\n") +} + +#[derive(Error, Debug)] +pub enum DbPushError { + #[error("Failed to reset database: ${0}")] + ResetFailed(CoreError), + #[error("Some changes could not be executed:\n {}", format_error_array(.0))] + UnexecutableChanges(Vec), + #[error("Data loss may occur:\n {}", format_error_array(.0))] + PossibleDataLoss(Vec), + #[error("An error occurred pushing schema to the database: ${0}")] + Other(#[from] CoreError), +} + +pub struct DbPush<'a> { + datamodel: &'a str, + url: &'a str, + force_reset: bool, + accept_data_loss: bool, + fut: Option>>, +} + +impl<'a> DbPush<'a> { + pub fn force_reset(mut self) -> Self { + self.force_reset = true; + self + } + + pub fn accept_data_loss(mut self) -> Self { + self.accept_data_loss = true; + self + } +} + +impl<'a> Future for DbPush<'a> { + type Output = Result; + + fn poll( + mut self: std::pin::Pin<&mut Self>, + cx: &mut std::task::Context<'_>, + ) -> std::task::Poll { + if self.fut.is_none() { + let datamodel = self.datamodel.to_string(); + let url = self.url.to_string(); + let force_reset = self.force_reset; + let accept_data_loss = self.accept_data_loss; + + self.fut = Some(Box::pin(async move { + let engine_state = EngineState::new(Some(datamodel.clone()), None); + + if force_reset { + engine_state + .reset() + .await + .map_err(DbPushError::ResetFailed)?; + } + + let input = SchemaPushInput { + force: accept_data_loss, + schema: datamodel, + }; + + let output = engine_state + .with_connector_for_url( + url.to_string(), + Box::new(|connector| Box::pin(commands::schema_push(input, connector))), + ) + .await?; + + if !output.unexecutable.is_empty() && !force_reset { + return Err(DbPushError::UnexecutableChanges(output.unexecutable)); + } + + if !output.warnings.is_empty() && !accept_data_loss { + return Err(DbPushError::PossibleDataLoss(output.warnings)); + } + + Ok(output.executed_steps) + })); + } + + self.fut.as_mut().unwrap().as_mut().poll(cx) + } +} + +pub fn db_push<'a>(datamodel: &'a str, url: &'a str) -> DbPush<'a> { + DbPush { + datamodel, + url, + force_reset: false, + accept_data_loss: false, + fut: None, + } +} + +#[derive(Error, Debug)] +pub enum MigrateDeployError { + #[error("The temporary file path for the database migrations is invalid.")] + InvalidDirectory, + #[error("An error occurred creating the temporary directory for the migrations: {0}")] + CreateDir(std::io::Error), + #[error("An error occurred extracting the migrations to the temporary directory: {0}")] + ExtractMigrations(std::io::Error), + #[error("An error occurred running the migrations: {0}")] + Connector(#[from] CoreError), + #[error("An error occurred removing the temporary directory for the migrations: {0}")] + RemoveDir(std::io::Error), +} + +pub struct MigrateDeploy<'a> { + datamodel: &'a str, + migrations: &'static include_dir::Dir<'static>, + url: &'a str, + temp_dir: Option, + fut: Option>>, +} + +impl<'a> MigrateDeploy<'a> { + pub fn with_temp_dir(mut self, dir: &str) -> Self { + self.temp_dir = Some(dir.to_string()); + self + } +} + +pub fn migrate_deploy<'a>( + datamodel: &'a str, + migrations: &'static include_dir::Dir<'static>, + url: &'a str, +) -> MigrateDeploy<'a> { + MigrateDeploy { + datamodel, + migrations, + url, + temp_dir: None, + fut: None, + } +} + +impl<'a> Future for MigrateDeploy<'a> { + type Output = Result<(), MigrateDeployError>; + + fn poll( + mut self: std::pin::Pin<&mut Self>, + cx: &mut std::task::Context<'_>, + ) -> std::task::Poll { + if self.fut.is_none() { + let datamodel = self.datamodel.to_string(); + let url = self.url.to_string(); + let migrations = self.migrations; + let temp_dir = self.temp_dir.clone(); + + self.fut = Some(Box::pin(async move { + let temp_dir = match temp_dir { + Some(d) => d.to_string(), + None => tempfile::Builder::new() + .prefix("prisma-client-rust-migrations") + .tempdir() + .map_err(MigrateDeployError::CreateDir)? + .into_path() + .to_str() + .unwrap() + .to_string(), + }; + + migrations + .extract(&temp_dir) + .map_err(MigrateDeployError::ExtractMigrations)?; + + let engine_state = EngineState::new(Some(datamodel.to_string()), None); + + let input = ApplyMigrationsInput { + migrations_directory_path: temp_dir.to_string(), + }; + + let output = engine_state + .with_connector_for_url( + url.to_string(), + Box::new(|connector| { + Box::pin(commands::apply_migrations(input, connector, None)) + }), + ) + .await; + + remove_dir_all(&temp_dir) + .await + .map_err(MigrateDeployError::RemoveDir)?; + + for migration in output?.applied_migration_names { + tracing::debug!("Applied migration '{}'", migration); + } + + // apparently migrate deploy needs some time + tokio::time::sleep(core::time::Duration::from_millis(1)).await; + + Ok(()) + })); + } + + self.fut.as_mut().unwrap().as_mut().poll(cx) + } +} + +#[derive(Error, Debug)] +pub enum MigrateResolveError { + #[error("The temporary file path for the database migrations is invalid.")] + InvalidDirectory, + #[error("An error occurred creating the temporary directory for the migrations: {0}")] + CreateDir(std::io::Error), + #[error("An error occurred extracting the migrations to the temporary directory: {0}")] + ExtractMigrations(std::io::Error), + #[error("An error occurred running the migrations: {0}")] + Connector(#[from] CoreError), + #[error("An error occurred removing the temporary directory for the migrations: {0}")] + RemoveDir(std::io::Error), +} + +pub async fn migrate_resolve( + migration: &str, + datamodel: &str, + migrations: &include_dir::Dir<'_>, + url: &str, +) -> Result<(), MigrateResolveError> { + let temp_dir = tempfile::Builder::new() + .prefix("prisma-client-rust-migrations") + .tempdir() + .map_err(MigrateResolveError::CreateDir)? + .into_path(); + + let temp_dir_str = match temp_dir.to_str() { + Some(p) => p.to_string(), + None => { + remove_dir_all(&temp_dir) + .await + .map_err(MigrateResolveError::RemoveDir)?; + + return Err(MigrateResolveError::InvalidDirectory); + } + }; + + migrations + .extract(&temp_dir) + .map_err(MigrateResolveError::ExtractMigrations)?; + + let engine_state = EngineState::new(Some(datamodel.to_string()), None); + + let input = MarkMigrationAppliedInput { + migration_name: migration.to_string(), + migrations_directory_path: temp_dir_str.to_string(), + }; + + engine_state + .with_connector_for_url( + url.to_string(), + Box::new(move |connector| Box::pin(commands::mark_migration_applied(input, connector))), + ) + .await?; + + Ok(()) +} diff --git a/external/prisma-client-rust/crates/lib/src/mock.rs b/external/prisma-client-rust/crates/lib/src/mock.rs new file mode 100644 index 0000000..f78594f --- /dev/null +++ b/external/prisma-client-rust/crates/lib/src/mock.rs @@ -0,0 +1,52 @@ +use std::sync::Arc; + +use query_core::{Operation, Selection}; + +use serde::Serialize; +use serde_value::Value; +use tokio::sync::Mutex; + +use crate::Query; + +#[derive(Default, Clone)] +pub struct MockStore { + read: Arc>>, + write: Arc>>, +} + +impl MockStore { + pub fn new() -> Self { + Default::default() + } + + // monomorphization optimisation moment + async fn add_op(&self, op: Operation, expected: Value) { + let (sel, mutex) = match op { + Operation::Read(sel) => (sel, &self.read), + Operation::Write(sel) => (sel, &self.write), + }; + + mutex.lock().await.push((sel, expected)) + } + pub async fn expect<'a, Q: Query<'a>>(&self, query: Q, expected: Q::ReturnValue) + where + Q::ReturnValue: Serialize, + { + self.add_op(query.graphql().0, serde_value::to_value(expected).unwrap()) + .await; + } + + pub(crate) async fn get_op(&self, op: &Operation) -> Option { + let (sel, mutex) = match op { + Operation::Read(sel) => (sel, &self.read), + Operation::Write(sel) => (sel, &self.write), + }; + + mutex + .lock() + .await + .iter() + .find(|(s, _)| s == sel) + .map(|(_, e)| e.clone()) + } +} diff --git a/external/prisma-client-rust/crates/lib/src/operator.rs b/external/prisma-client-rust/crates/lib/src/operator.rs new file mode 100644 index 0000000..efabe29 --- /dev/null +++ b/external/prisma-client-rust/crates/lib/src/operator.rs @@ -0,0 +1,17 @@ +pub enum Operator { + Not(Vec), + And(Vec), + Or(Vec), +} + +pub fn not>>(params: Vec) -> T { + Operator::Not(params).into() +} + +pub fn and>>(params: Vec) -> T { + Operator::And(params).into() +} + +pub fn or>>(params: Vec) -> T { + Operator::Or(params).into() +} diff --git a/external/prisma-client-rust/crates/lib/src/prisma_value.rs b/external/prisma-client-rust/crates/lib/src/prisma_value.rs new file mode 100644 index 0000000..bc7cca5 --- /dev/null +++ b/external/prisma-client-rust/crates/lib/src/prisma_value.rs @@ -0,0 +1,159 @@ +use std::{str::FromStr, sync::Arc}; + +use bigdecimal::{BigDecimal, FromPrimitive, ToPrimitive}; +use indexmap::IndexMap; +use query_core::{ + constants::custom_types::{self}, + response_ir::Item as PrismaItem, +}; +use serde::{Serialize, Serializer}; +use uuid::Uuid; + +use crate::scalar_types; + +/// A Rust-friendly version of Prisma's own PrismaValue. +/// +/// Prisma's PrismaValue has serialization overrides that make it suitable for JSON serialization, +/// but they lose some type information (eg. Bytes are encoded as base64), and can be less efficient +/// (eg. float values are encoded as strings). +/// +/// This implementation only has an override for `PrismaValue::Null`, which is serialized as `None` +#[derive(Debug, Clone, Serialize)] +#[serde(untagged)] +pub enum PrismaValue { + String(scalar_types::String), + Boolean(scalar_types::Boolean), + Enum(String), + Int(scalar_types::Int), + Uuid(Uuid), + List(Vec), + Json(scalar_types::Json), + Object(Vec<(String, PrismaValue)>), + #[serde(serialize_with = "serialize_null")] + Null, + DateTime(scalar_types::DateTime), + Float(scalar_types::Float), + // Special variant for distinguishing between Float and Decimal + Decimal(scalar_types::Decimal), + BigInt(scalar_types::BigInt), + Bytes(scalar_types::Bytes), +} + +/// A Rust-friendly version of Prisma's own Item. +/// Exists solely for nicer conversion of query results to our PrismaValue. +#[derive(Debug, Clone, Serialize)] +#[serde(untagged)] +pub enum Item { + Map(IndexMap), + List(Vec), + Value(PrismaValue), + Json(serde_json::Value), +} + +impl From for Item { + fn from(item: PrismaItem) -> Self { + match item { + PrismaItem::Map(map) => { + Item::Map(map.into_iter().map(|(k, v)| (k, v.into())).collect()) + } + PrismaItem::List(list) => Item::List(list.into_iter().map(|v| v.into()).collect()), + PrismaItem::Value(scalar) => Item::Value(scalar.into()), + PrismaItem::Json(json) => Item::Json(json), + PrismaItem::Ref(arc) => Arc::try_unwrap(arc) + .unwrap_or_else(|arc| (*arc).to_owned()) + .into(), + } + } +} + +fn serialize_null(serializer: S) -> Result +where + S: Serializer, +{ + Option::<()>::None.serialize(serializer) +} + +impl From for PrismaValue { + fn from(value: prisma_models::PrismaValue) -> Self { + match value { + prisma_models::PrismaValue::String(value) => Self::String(value), + prisma_models::PrismaValue::Boolean(value) => Self::Boolean(value), + prisma_models::PrismaValue::Enum(value) => Self::Enum(value), + prisma_models::PrismaValue::Int(value) => Self::Int(value as i32), + prisma_models::PrismaValue::Uuid(value) => Self::Uuid(value), + prisma_models::PrismaValue::List(value) => { + Self::List(value.into_iter().map(Into::into).collect()) + } + prisma_models::PrismaValue::Json(value) => { + Self::Json(serde_json::from_str(&value).unwrap()) + } + prisma_models::PrismaValue::Object(mut value) => { + let type_position = value.iter().position(|(k, _)| k == custom_types::TYPE); + + if let Some((_, prisma_models::PrismaValue::String(typ))) = + type_position.map(|pos| value.swap_remove(pos)) + { + let (_, value) = value.swap_remove( + value + .iter() + .position(|(k, _)| k == custom_types::VALUE) + .unwrap(), + ); + + match (typ.as_str(), value) { + (custom_types::DATETIME, prisma_models::PrismaValue::DateTime(dt)) => { + PrismaValue::DateTime(dt) + } + (custom_types::BIGINT, prisma_models::PrismaValue::BigInt(i)) => { + PrismaValue::BigInt(i) + } + (custom_types::DECIMAL, prisma_models::PrismaValue::String(s)) => { + PrismaValue::Decimal(BigDecimal::from_str(&s).unwrap()) + } + (custom_types::BYTES, prisma_models::PrismaValue::Bytes(b)) => { + PrismaValue::Bytes(b) + } + (custom_types::JSON, prisma_models::PrismaValue::Json(j)) => { + PrismaValue::Json(serde_json::from_str(&j).unwrap()) + } + _ => unreachable!("Incorrect PrismaValue for {typ}"), + } + } else { + Self::Object(value.into_iter().map(|(k, v)| (k, v.into())).collect()) + } + } + prisma_models::PrismaValue::Null => Self::Null, + prisma_models::PrismaValue::DateTime(value) => Self::DateTime(value), + prisma_models::PrismaValue::Float(value) => Self::Float(value.to_f64().unwrap()), + prisma_models::PrismaValue::BigInt(value) => Self::BigInt(value), + prisma_models::PrismaValue::Bytes(value) => Self::Bytes(value), + } + } +} + +impl From for prisma_models::PrismaValue { + fn from(val: PrismaValue) -> Self { + match val { + PrismaValue::String(value) => Self::String(value), + PrismaValue::Boolean(value) => Self::Boolean(value), + PrismaValue::Enum(value) => Self::Enum(value), + PrismaValue::Int(value) => Self::Int(value as i64), + PrismaValue::Uuid(value) => Self::Uuid(value), + PrismaValue::List(value) => Self::List(value.into_iter().map(Into::into).collect()), + PrismaValue::Json(value) => Self::Json(serde_json::to_string(&value).unwrap()), + PrismaValue::Object(value) => { + Self::Object(value.into_iter().map(|(k, v)| (k, v.into())).collect()) + } + PrismaValue::Null => Self::Null, + PrismaValue::DateTime(value) => Self::DateTime(value), + PrismaValue::Decimal(value) => { + Self::Float(bigdecimal_03::BigDecimal::from_str(&value.to_string()).unwrap()) + } + PrismaValue::Float(value) => { + Self::Float(bigdecimal_03::BigDecimal::from_f64(value).unwrap()) + } + PrismaValue::BigInt(value) => Self::BigInt(value), + PrismaValue::Bytes(value) => Self::Bytes(value), + } + } +} diff --git a/external/prisma-client-rust/crates/lib/src/queries/batch.rs b/external/prisma-client-rust/crates/lib/src/queries/batch.rs new file mode 100644 index 0000000..ca414e0 --- /dev/null +++ b/external/prisma-client-rust/crates/lib/src/queries/batch.rs @@ -0,0 +1,291 @@ +use std::{collections::VecDeque, num::NonZeroUsize}; + +use query_core::Operation; + +use crate::{PrismaClientInternals, Query, QueryConvert}; + +pub enum VecMeta { + Empty, + NotEmpty(NonZeroUsize, Box), +} + +pub enum BatchItemDataMeta { + Query, + Vec(VecMeta), + Tuple(Vec), +} + +pub enum BatchItemData { + Query(Operation), + Vec(Vec), + Tuple(Vec), +} + +impl BatchItemData { + fn meta(&self) -> BatchItemDataMeta { + match self { + Self::Query(_) => BatchItemDataMeta::Query, + Self::Vec(v) => BatchItemDataMeta::Vec({ + NonZeroUsize::new(v.len()) + .map(|size| VecMeta::NotEmpty(size, Box::new(v[0].meta()))) + .unwrap_or(VecMeta::Empty) + }), + Self::Tuple(v) => BatchItemDataMeta::Tuple(v.iter().map(BatchItemData::meta).collect()), + } + } + + fn operations(self, v: &mut Vec) { + match self { + Self::Query(op) => v.push(op), + Self::Vec(items) => items.into_iter().for_each(|i| i.operations(v)), + Self::Tuple(items) => items.into_iter().for_each(|i| i.operations(v)), + } + } +} + +pub enum BatchDataMeta { + Iterator(VecMeta), + Tuple(Vec), +} + +pub enum BatchData { + Iterator(Vec), + Tuple(Vec), +} + +impl BatchData { + fn meta(&self) -> BatchDataMeta { + match self { + Self::Iterator(v) => BatchDataMeta::Iterator( + NonZeroUsize::new(v.len()) + .map(|size| VecMeta::NotEmpty(size, Box::new(v[0].meta()))) + .unwrap_or(VecMeta::Empty), + ), + Self::Tuple(v) => BatchDataMeta::Tuple(v.iter().map(BatchItemData::meta).collect()), + } + } + + fn operations(self) -> Vec { + let items = match self { + Self::Tuple(items) => items, + Self::Iterator(items) => items, + }; + + let mut ops = vec![]; + + items.into_iter().for_each(|i| i.operations(&mut ops)); + + ops + } +} + +pub async fn batch<'batch, 'b, T: BatchContainer<'batch, Marker>, Marker>( + container: T, + client: &'b PrismaClientInternals, +) -> super::Result<>::ReturnType> { + let data = container.data(); + let meta = data.meta(); + + let operations = data.operations(); + + let values = client + .engine + .execute_all(operations) + .await? + .into_iter() + .collect::>>()?; + + T::resolve(meta, values) +} + +pub trait BatchItemParent { + type ReturnValue; +} + +pub trait BatchItem<'a>: BatchItemParent { + fn data(self) -> BatchItemData; + + fn resolve( + meta: &BatchItemDataMeta, + values: &mut VecDeque, + ) -> super::Result<::ReturnValue>; +} + +impl BatchItemParent for Q { + type ReturnValue = Q::ReturnValue; +} + +impl<'a, 'b, Q: Query<'a>> BatchItem<'b> for Q { + fn data(self) -> BatchItemData { + BatchItemData::Query(self.graphql().0) + } + + fn resolve( + _: &BatchItemDataMeta, + values: &mut VecDeque, + ) -> super::Result<::ReturnValue> { + Q::convert( + values + .pop_front() + .unwrap() + .deserialize_into::() + .unwrap(), + ) + } +} + +impl<'batch, I: BatchItemParent> BatchItemParent for Vec { + type ReturnValue = Vec<::ReturnValue>; +} + +impl<'batch, 'query, I: Query<'query>> BatchItem<'batch> for Vec { + fn data(self) -> BatchItemData { + BatchItemData::Vec(self.into_iter().map(BatchItem::data).collect()) + } + + fn resolve( + meta: &BatchItemDataMeta, + values: &mut VecDeque, + ) -> super::Result<::ReturnValue> { + Ok(match meta { + BatchItemDataMeta::Vec(meta) => match meta { + VecMeta::Empty => vec![], + VecMeta::NotEmpty(size, meta) => (0..size.get()) + .map(|_| ::resolve(meta.as_ref(), values)) + .collect::>>()?, + }, + _ => unreachable!(), + }) + } +} + +/// A container that can hold queries to batch into a transaction +pub trait BatchContainer<'batch, Marker> { + type ReturnType; + + fn data(self) -> BatchData; + + fn resolve( + meta: BatchDataMeta, + values: VecDeque, + ) -> super::Result; +} + +impl<'batch, 't: 'batch, T: BatchItem<'t>, I: IntoIterator> BatchContainer<'batch, ()> + for I +{ + type ReturnType = Vec<::ReturnValue>; + + fn data(self) -> BatchData { + BatchData::Iterator(self.into_iter().map(BatchItem::data).collect()) + } + + fn resolve( + meta: BatchDataMeta, + mut values: VecDeque, + ) -> super::Result { + Ok(match meta { + BatchDataMeta::Iterator(meta) => match meta { + VecMeta::Empty => vec![], + VecMeta::NotEmpty(size, meta) => (0..size.get()) + .map(|_| T::resolve(&meta, &mut values)) + .collect::>>()?, + }, + _ => unreachable!(), + }) + } +} + +pub enum TupleMarker {} + +macro_rules! impl_tuple { + ($generic_1: ident, $($generic:ident),+) => { + impl_tuple!(impl $generic_1 $(,$generic)+); + impl_tuple!($($generic),+); + }; + ($generic:ident) => {}; + (impl $generic:ident) => {}; + (impl $($generic:ident),+) => { + paste::paste! { + #[allow(warnings)] + impl<'batch, $( [< "'" $generic >]: 'batch),+, $($generic: BatchItem<[< "'" $generic >]>),+> BatchContainer<'batch, TupleMarker> for ($($generic),+) { + type ReturnType = ($(<$generic as BatchItemParent>::ReturnValue),+); + + fn data(self) -> BatchData { + let ($($generic),+) = self; + + BatchData::Tuple( + vec![$(BatchItem::data($generic)),+] + ) + } + + fn resolve(meta: BatchDataMeta, mut values: VecDeque) -> $crate::Result { + Ok(match meta { + BatchDataMeta::Tuple(metas) => { + let mut metas_iter = metas.iter(); + + ($(<$generic as BatchItem>::resolve(metas_iter.next().unwrap(), &mut values)?),+) + }, + _ => unreachable!() + }) + } + } + + #[allow(warnings)] + impl<$($generic: BatchItemParent),+> BatchItemParent for ($($generic),+) { + type ReturnValue = ($(<$generic as BatchItemParent>::ReturnValue),+); + } + + #[allow(warnings)] + impl<'batch, $( [< "'" $generic >]: 'batch),+, $($generic: BatchItem<[< "'" $generic >]>),+> BatchItem<'batch> for ($($generic),+) { + fn data(self) -> BatchItemData { + let ($($generic),+) = self; + + BatchItemData::Tuple( + vec![$(BatchItem::data($generic)),+] + ) + } + + fn resolve( + meta: &BatchItemDataMeta, + values: &mut VecDeque, + ) -> $crate::Result<::ReturnValue> { + Ok(match meta { + BatchItemDataMeta::Tuple(meta) => { + let mut meta = meta.iter(); + + ($($generic::resolve(meta.next().unwrap(), values)?),+) + }, + _ => unreachable!(), + }) + } + } + } + }; +} + +impl_tuple!(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17); + +/// TODO: remove this in 0.7.0 +#[allow(warnings)] +impl<'batch, 'query, Q: Query<'query>> BatchContainer<'batch, TupleMarker> for Q { + type ReturnType = Q::ReturnValue; + + fn data(self) -> BatchData { + BatchData::Tuple(vec![BatchItem::data(self)]) + } + + fn resolve( + meta: BatchDataMeta, + mut values: VecDeque, + ) -> super::Result { + Ok(match meta { + BatchDataMeta::Tuple(metas) => { + let mut metas_iter = metas.iter(); + + ::resolve(metas_iter.next().unwrap(), &mut values)? + } + _ => unreachable!(), + }) + } +} diff --git a/external/prisma-client-rust/crates/lib/src/queries/count.rs b/external/prisma-client-rust/crates/lib/src/queries/count.rs new file mode 100644 index 0000000..9b36afa --- /dev/null +++ b/external/prisma-client-rust/crates/lib/src/queries/count.rs @@ -0,0 +1,166 @@ +use query_core::{Operation, Selection}; +use serde::Deserialize; + +use crate::{ + merge_fields, ModelOperation, ModelQuery, ModelReadOperation, ModelTypes, OrderByQuery, + PaginatedQuery, PrismaClientInternals, PrismaValue, Query, QueryConvert, WhereInput, + WhereQuery, +}; + +pub struct Count<'a, Actions: ModelTypes> { + client: &'a PrismaClientInternals, + pub where_params: Vec, + pub order_by_params: Vec, + pub cursor_params: Vec, + pub skip: Option, + pub take: Option, +} + +impl<'a, Actions: ModelTypes> Count<'a, Actions> { + pub fn new(client: &'a PrismaClientInternals, where_params: Vec) -> Self { + Self { + client, + where_params, + order_by_params: vec![], + cursor_params: vec![], + skip: None, + take: None, + } + } + + pub fn order_by(mut self, param: Actions::OrderBy) -> Self { + self.order_by_params.push(param); + self + } + + pub fn cursor(mut self, param: Actions::Cursor) -> Self { + self.cursor_params.push(param); + self + } + + pub fn skip(mut self, skip: i64) -> Self { + self.skip = Some(skip); + self + } + + pub fn take(mut self, take: i64) -> Self { + self.take = Some(take); + self + } + + pub async fn exec(self) -> super::Result { + super::exec(self).await + } +} + +#[derive(Deserialize)] +pub struct CountAggregateResult { + _count: CountResult, +} + +#[derive(Deserialize)] +pub struct CountResult { + _all: i64, +} + +impl<'a, Actions: ModelTypes> QueryConvert for Count<'a, Actions> { + type RawType = CountAggregateResult; + type ReturnValue = i64; + + fn convert(raw: Self::RawType) -> super::Result { + Ok(raw._count._all) + } +} + +impl<'a, Actions: ModelTypes> Query<'a> for Count<'a, Actions> { + fn graphql(self) -> (Operation, &'a PrismaClientInternals) { + ( + Operation::Read(Self::base_selection( + [ + (!self.where_params.is_empty()).then(|| { + ( + "where".to_string(), + PrismaValue::Object(merge_fields( + self.where_params + .into_iter() + .map(WhereInput::serialize) + .map(|s| (s.field, s.value.into())) + .collect(), + )) + .into(), + ) + }), + (!self.order_by_params.is_empty()).then(|| { + ( + "orderBy".to_string(), + PrismaValue::List( + self.order_by_params + .into_iter() + .map(|p| PrismaValue::Object(vec![p.into()])) + .collect(), + ) + .into(), + ) + }), + (!self.cursor_params.is_empty()).then(|| { + ( + "cursor".to_string(), + PrismaValue::Object( + self.cursor_params + .into_iter() + .map(WhereInput::serialize) + .map(|s| (s.field, s.value.into())) + .collect(), + ), + ) + }), + self.skip + .map(|skip| ("skip".to_string(), PrismaValue::Int(skip as i32))), + self.take + .map(|take| ("take".to_string(), PrismaValue::Int(take as i32))), + ] + .into_iter() + .flatten(), + [Selection::new( + "_count", + None, + [], + [Selection::new("_all", None, [], [])], + )], + )), + self.client, + ) + } +} + +impl<'a, Actions: ModelTypes> ModelQuery<'a> for Count<'a, Actions> { + type Types = Actions; + + const TYPE: ModelOperation = ModelOperation::Read(ModelReadOperation::Count); +} + +impl<'a, Actions: ModelTypes> WhereQuery<'a> for Count<'a, Actions> { + fn add_where(&mut self, param: Actions::Where) { + self.where_params.push(param); + } +} + +impl<'a, Actions: ModelTypes> OrderByQuery<'a> for Count<'a, Actions> { + fn add_order_by(&mut self, param: Actions::OrderBy) { + self.order_by_params.push(param); + } +} + +impl<'a, Actions: ModelTypes> PaginatedQuery<'a> for Count<'a, Actions> { + fn add_cursor(&mut self, param: Actions::Cursor) { + self.cursor_params.push(param); + } + + fn set_skip(&mut self, skip: i64) { + self.skip = Some(skip); + } + + fn set_take(&mut self, take: i64) { + self.take = Some(take); + } +} diff --git a/external/prisma-client-rust/crates/lib/src/queries/create.rs b/external/prisma-client-rust/crates/lib/src/queries/create.rs new file mode 100644 index 0000000..4a58d16 --- /dev/null +++ b/external/prisma-client-rust/crates/lib/src/queries/create.rs @@ -0,0 +1,111 @@ +use query_core::{Operation, Selection}; + +use crate::{ + merge_fields, Include, IncludeType, ModelOperation, ModelQuery, ModelTypes, + ModelWriteOperation, PrismaClientInternals, PrismaValue, Query, QueryConvert, Select, + SelectType, SetQuery, WithQuery, +}; + +pub struct Create<'a, Actions: ModelTypes> { + client: &'a PrismaClientInternals, + pub set_params: Vec, + pub with_params: Vec, +} + +impl<'a, Actions: ModelTypes> Create<'a, Actions> { + pub fn new(client: &'a PrismaClientInternals, set_params: Vec) -> Self { + Self { + client, + set_params, + with_params: vec![], + } + } + + pub fn with(mut self, param: impl Into) -> Self { + self.with_params.push(param.into()); + self + } + + fn to_selection( + set_params: Vec, + nested_selections: impl IntoIterator, + ) -> Selection { + Self::base_selection( + [( + "data".to_string(), + PrismaValue::Object(merge_fields( + set_params.into_iter().map(Into::into).collect(), + )), + )] + .into_iter(), + nested_selections, + ) + } + + pub fn select>( + self, + select: S, + ) -> Select<'a, S::Data> { + Select::new( + self.client, + Operation::Write(Self::to_selection(self.set_params, select.to_selections())), + ) + } + + pub fn include>( + self, + include: I, + ) -> Include<'a, I::Data> { + Include::new( + self.client, + Operation::Write(Self::to_selection(self.set_params, include.to_selections())), + ) + } + + pub async fn exec(self) -> super::Result { + super::exec(self).await + } +} + +impl<'a, Actions: ModelTypes> QueryConvert for Create<'a, Actions> { + type RawType = Actions::Data; + type ReturnValue = Self::RawType; + + fn convert(raw: Self::RawType) -> super::Result { + Ok(raw) + } +} + +impl<'a, Actions: ModelTypes> Query<'a> for Create<'a, Actions> { + fn graphql(self) -> (Operation, &'a PrismaClientInternals) { + let mut scalar_selections = Actions::scalar_selections(); + + scalar_selections.extend(self.with_params.into_iter().map(Into::into)); + + ( + Operation::Write(Self::to_selection(self.set_params, scalar_selections)), + self.client, + ) + } +} + +impl<'a, Actions: ModelTypes> ModelQuery<'a> for Create<'a, Actions> { + type Types = Actions; + + const TYPE: ModelOperation = ModelOperation::Write(ModelWriteOperation::Create); +} + +impl<'a, Actions: ModelTypes> SetQuery<'a> for Create<'a, Actions> { + fn add_set(&mut self, param: Actions::Set) { + self.set_params.push(param); + } +} + +impl<'a, Actions: ModelTypes> WithQuery<'a> for Create<'a, Actions> { + fn add_with( + &mut self, + param: impl Into<<>::Types as ModelTypes>::With>, + ) { + self.with_params.push(param.into()); + } +} diff --git a/external/prisma-client-rust/crates/lib/src/queries/create_many.rs b/external/prisma-client-rust/crates/lib/src/queries/create_many.rs new file mode 100644 index 0000000..05e6f8a --- /dev/null +++ b/external/prisma-client-rust/crates/lib/src/queries/create_many.rs @@ -0,0 +1,96 @@ +use query_core::{Operation, Selection}; + +use crate::{ + merge_fields, BatchResult, ModelOperation, ModelQuery, ModelTypes, ModelWriteOperation, + PrismaClientInternals, PrismaValue, Query, QueryConvert, +}; + +pub struct CreateMany<'a, Actions: ModelTypes> { + client: &'a PrismaClientInternals, + pub set_params: Vec>, + pub skip_duplicates: bool, +} + +impl<'a, Actions: ModelTypes> CreateMany<'a, Actions> { + pub fn new( + client: &'a PrismaClientInternals, + set_params: Vec>, + ) -> Self { + Self { + client, + set_params, + skip_duplicates: false, + } + } + + #[cfg(any(feature = "mysql", feature = "sqlite", feature = "postgresql"))] + pub fn skip_duplicates(mut self) -> Self { + self.skip_duplicates = true; + self + } + + fn to_selection( + set_params: Vec>, + _skip_duplicates: bool, + nested_selections: impl IntoIterator, + ) -> Selection { + Self::base_selection( + [ + Some(( + "data".to_string(), + PrismaValue::List( + set_params + .into_iter() + .map(|fields| { + PrismaValue::Object(merge_fields( + fields.into_iter().map(Into::into).map(Into::into).collect(), + )) + }) + .collect(), + ), + )), + _skip_duplicates.then(|| { + ( + "skipDuplicates".to_string(), + PrismaValue::Boolean(_skip_duplicates).into(), + ) + }), + ] + .into_iter() + .flatten(), + nested_selections, + ) + } + + pub async fn exec(self) -> super::Result { + super::exec(self).await + } +} + +impl<'a, Actions: ModelTypes> QueryConvert for CreateMany<'a, Actions> { + type RawType = BatchResult; + type ReturnValue = i64; + + fn convert(raw: Self::RawType) -> super::Result { + Ok(raw.count) + } +} + +impl<'a, Actions: ModelTypes> Query<'a> for CreateMany<'a, Actions> { + fn graphql(self) -> (Operation, &'a PrismaClientInternals) { + ( + Operation::Write(Self::to_selection( + self.set_params, + self.skip_duplicates, + [BatchResult::selection()], + )), + self.client, + ) + } +} + +impl<'a, Actions: ModelTypes> ModelQuery<'a> for CreateMany<'a, Actions> { + type Types = Actions; + + const TYPE: ModelOperation = ModelOperation::Write(ModelWriteOperation::CreateMany); +} diff --git a/external/prisma-client-rust/crates/lib/src/queries/create_unchecked.rs b/external/prisma-client-rust/crates/lib/src/queries/create_unchecked.rs new file mode 100644 index 0000000..b9900da --- /dev/null +++ b/external/prisma-client-rust/crates/lib/src/queries/create_unchecked.rs @@ -0,0 +1,111 @@ +use query_core::{Operation, Selection}; + +use crate::{ + merge_fields, Include, IncludeType, ModelOperation, ModelQuery, ModelTypes, + ModelWriteOperation, PrismaClientInternals, PrismaValue, Query, QueryConvert, Select, + SelectType, UncheckedSetQuery, WithQuery, +}; + +pub struct CreateUnchecked<'a, Actions: ModelTypes> { + client: &'a PrismaClientInternals, + pub set_params: Vec, + pub with_params: Vec, +} + +impl<'a, Actions: ModelTypes> CreateUnchecked<'a, Actions> { + pub fn new(client: &'a PrismaClientInternals, set_params: Vec) -> Self { + Self { + client, + set_params, + with_params: vec![], + } + } + + pub fn with(mut self, param: impl Into) -> Self { + self.with_params.push(param.into()); + self + } + + fn to_selection( + set_params: Vec, + nested_selections: impl IntoIterator, + ) -> Selection { + Self::base_selection( + [( + "data".to_string(), + PrismaValue::Object(merge_fields( + set_params.into_iter().map(Into::into).collect(), + )), + )] + .into_iter(), + nested_selections, + ) + } + + pub fn select>( + self, + select: S, + ) -> Select<'a, S::Data> { + Select::new( + self.client, + Operation::Write(Self::to_selection(self.set_params, select.to_selections())), + ) + } + + pub fn include>( + self, + include: I, + ) -> Include<'a, I::Data> { + Include::new( + self.client, + Operation::Write(Self::to_selection(self.set_params, include.to_selections())), + ) + } + + pub async fn exec(self) -> super::Result { + super::exec(self).await + } +} + +impl<'a, Actions: ModelTypes> QueryConvert for CreateUnchecked<'a, Actions> { + type RawType = Actions::Data; + type ReturnValue = Self::RawType; + + fn convert(raw: Self::RawType) -> super::Result { + Ok(raw) + } +} + +impl<'a, Actions: ModelTypes> Query<'a> for CreateUnchecked<'a, Actions> { + fn graphql(self) -> (Operation, &'a PrismaClientInternals) { + let mut scalar_selections = Actions::scalar_selections(); + + scalar_selections.extend(self.with_params.into_iter().map(Into::into)); + + ( + Operation::Write(Self::to_selection(self.set_params, scalar_selections)), + self.client, + ) + } +} + +impl<'a, Actions: ModelTypes> ModelQuery<'a> for CreateUnchecked<'a, Actions> { + type Types = Actions; + + const TYPE: ModelOperation = ModelOperation::Write(ModelWriteOperation::Create); +} + +impl<'a, Actions: ModelTypes> UncheckedSetQuery<'a> for CreateUnchecked<'a, Actions> { + fn add_unchecked_set(&mut self, param: Actions::UncheckedSet) { + self.set_params.push(param); + } +} + +impl<'a, Actions: ModelTypes> WithQuery<'a> for CreateUnchecked<'a, Actions> { + fn add_with( + &mut self, + param: impl Into<<>::Types as ModelTypes>::With>, + ) { + self.with_params.push(param.into()); + } +} diff --git a/external/prisma-client-rust/crates/lib/src/queries/delete.rs b/external/prisma-client-rust/crates/lib/src/queries/delete.rs new file mode 100644 index 0000000..f8dab23 --- /dev/null +++ b/external/prisma-client-rust/crates/lib/src/queries/delete.rs @@ -0,0 +1,103 @@ +use query_core::{Operation, Selection}; + +use crate::{ + Include, IncludeType, ModelOperation, ModelQuery, ModelTypes, ModelWriteOperation, + PrismaClientInternals, PrismaValue, Query, QueryConvert, Select, SelectType, WhereInput, + WithQuery, +}; + +pub struct Delete<'a, Actions: ModelTypes> { + client: &'a PrismaClientInternals, + pub where_param: Actions::WhereUnique, + pub with_params: Vec, +} + +impl<'a, Actions: ModelTypes> Delete<'a, Actions> { + pub fn new( + client: &'a PrismaClientInternals, + where_param: Actions::WhereUnique, + with_params: Vec, + ) -> Self { + Self { + client, + where_param, + with_params, + } + } + + pub fn with(mut self, param: impl Into) -> Self { + self.with_params.push(param.into()); + self + } + + fn to_selection( + where_param: Actions::WhereUnique, + nested_selections: impl IntoIterator, + ) -> Selection { + Self::base_selection( + [( + "where".to_string(), + PrismaValue::Object(vec![where_param.serialize().transform_equals()]), + )], + nested_selections, + ) + } + + pub fn select>( + self, + select: S, + ) -> Select<'a, S::Data> { + Select::new( + self.client, + Operation::Write(Self::to_selection(self.where_param, select.to_selections())), + ) + } + + pub fn include>( + self, + select: I, + ) -> Include<'a, I::Data> { + Include::new( + self.client, + Operation::Write(Self::to_selection(self.where_param, select.to_selections())), + ) + } + + pub async fn exec(self) -> super::Result { + super::exec(self).await + } +} + +impl<'a, Actions: ModelTypes> QueryConvert for Delete<'a, Actions> { + type RawType = Actions::Data; + type ReturnValue = Actions::Data; + + fn convert(raw: Self::RawType) -> super::Result { + Ok(raw) + } +} + +impl<'a, Actions: ModelTypes> Query<'a> for Delete<'a, Actions> { + fn graphql(self) -> (Operation, &'a PrismaClientInternals) { + let mut scalar_selections = Actions::scalar_selections(); + + scalar_selections.extend(self.with_params.into_iter().map(Into::into)); + + ( + Operation::Write(Self::to_selection(self.where_param, scalar_selections)), + self.client, + ) + } +} + +impl<'a, Actions: ModelTypes> ModelQuery<'a> for Delete<'a, Actions> { + type Types = Actions; + + const TYPE: ModelOperation = ModelOperation::Write(ModelWriteOperation::Delete); +} + +impl<'a, Actions: ModelTypes> WithQuery<'a> for Delete<'a, Actions> { + fn add_with(&mut self, param: impl Into) { + self.with_params.push(param.into()); + } +} diff --git a/external/prisma-client-rust/crates/lib/src/queries/delete_many.rs b/external/prisma-client-rust/crates/lib/src/queries/delete_many.rs new file mode 100644 index 0000000..54a460f --- /dev/null +++ b/external/prisma-client-rust/crates/lib/src/queries/delete_many.rs @@ -0,0 +1,74 @@ +use query_core::Operation; + +use crate::{ + merge_fields, BatchResult, ModelOperation, ModelQuery, ModelTypes, ModelWriteOperation, + PrismaClientInternals, PrismaValue, Query, QueryConvert, WhereInput, WhereQuery, +}; + +pub struct DeleteMany<'a, Actions: ModelTypes> { + client: &'a PrismaClientInternals, + pub where_params: Vec, +} + +impl<'a, Actions: ModelTypes> DeleteMany<'a, Actions> { + pub fn new(client: &'a PrismaClientInternals, where_params: Vec) -> Self { + Self { + client, + where_params, + } + } + + pub(crate) fn convert(raw: BatchResult) -> i64 { + raw.count + } + + pub async fn exec(self) -> super::Result { + super::exec(self).await + } +} + +impl<'a, Actions: ModelTypes> QueryConvert for DeleteMany<'a, Actions> { + type RawType = BatchResult; + type ReturnValue = i64; + + fn convert(raw: Self::RawType) -> super::Result { + Ok(Self::convert(raw)) + } +} + +impl<'a, Actions: ModelTypes> Query<'a> for DeleteMany<'a, Actions> { + fn graphql(self) -> (Operation, &'a PrismaClientInternals) { + ( + Operation::Write(Self::base_selection( + [(!self.where_params.is_empty()).then(|| { + ( + "where".to_string(), + PrismaValue::Object(merge_fields( + self.where_params + .into_iter() + .map(WhereInput::serialize) + .map(|s| (s.field, s.value.into())) + .collect(), + )), + ) + })] + .into_iter() + .flatten(), + [BatchResult::selection()], + )), + self.client, + ) + } +} + +impl<'a, Actions: ModelTypes> ModelQuery<'a> for DeleteMany<'a, Actions> { + type Types = Actions; + + const TYPE: ModelOperation = ModelOperation::Write(ModelWriteOperation::DeleteMany); +} + +impl<'a, Actions: ModelTypes> WhereQuery<'a> for DeleteMany<'a, Actions> { + fn add_where(&mut self, param: Actions::Where) { + self.where_params.push(param); + } +} diff --git a/external/prisma-client-rust/crates/lib/src/queries/error.rs b/external/prisma-client-rust/crates/lib/src/queries/error.rs new file mode 100644 index 0000000..1ec9bb6 --- /dev/null +++ b/external/prisma-client-rust/crates/lib/src/queries/error.rs @@ -0,0 +1,40 @@ +use serde::Serialize; +use thiserror::Error; +use user_facing_errors::UserFacingError; + +#[derive(Debug, Error, Serialize)] +pub enum QueryError { + #[error("Error executing query: {} - {}", .0.as_known().map(|k| k.error_code.to_string()).unwrap_or("Unknown".to_string()), .0.message())] + Execute(user_facing_errors::Error), + + #[error("Error serializing query result: {0}")] + Serialize(String), + + #[error("Error deserializing query result into return type: {0}")] + Deserialize(String), +} + +impl QueryError { + pub fn is_prisma_error(&self) -> bool { + match self { + Self::Execute(error) => error + .as_known() + .map(|e| e.error_code == ::ERROR_CODE) + .unwrap_or(false), + _ => false, + } + } +} + +pub type Result = std::result::Result; + +#[cfg(feature = "rspc")] +impl From for rspc::Error { + fn from(err: QueryError) -> Self { + rspc::Error::with_cause( + rspc::ErrorCode::InternalServerError, + "Internal server error occurred while completing database operation!".into(), + err, + ) + } +} diff --git a/external/prisma-client-rust/crates/lib/src/queries/execute_raw.rs b/external/prisma-client-rust/crates/lib/src/queries/execute_raw.rs new file mode 100644 index 0000000..d81faf8 --- /dev/null +++ b/external/prisma-client-rust/crates/lib/src/queries/execute_raw.rs @@ -0,0 +1,56 @@ +use prisma_models::PrismaValue; +use query_core::{Operation, Selection}; +use serde_json::Value; + +use crate::{raw::Raw, PrismaClientInternals, Query, QueryConvert}; + +pub struct ExecuteRaw<'a> { + client: &'a PrismaClientInternals, + sql: String, + params: Vec, +} + +impl<'a> ExecuteRaw<'a> { + pub fn new(client: &'a PrismaClientInternals, query: Raw, database: &'static str) -> Self { + let (sql, params) = query.convert(database); + + Self { + client, + sql, + params, + } + } + + pub async fn exec(self) -> super::Result { + super::exec(self).await + } +} + +impl<'a> QueryConvert for ExecuteRaw<'a> { + type RawType = i64; + type ReturnValue = Self::RawType; + + fn convert(raw: Self::RawType) -> super::Result { + Ok(raw) + } +} + +impl<'a> Query<'a> for ExecuteRaw<'a> { + fn graphql(self) -> (Operation, &'a PrismaClientInternals) { + ( + Operation::Write(Selection::new( + "executeRaw".to_string(), + None, + [ + ("query".to_string(), PrismaValue::String(self.sql).into()), + ( + "parameters".to_string(), + PrismaValue::String(serde_json::to_string(&self.params).unwrap()).into(), + ), + ], + [], + )), + self.client, + ) + } +} diff --git a/external/prisma-client-rust/crates/lib/src/queries/find_first.rs b/external/prisma-client-rust/crates/lib/src/queries/find_first.rs new file mode 100644 index 0000000..db2366b --- /dev/null +++ b/external/prisma-client-rust/crates/lib/src/queries/find_first.rs @@ -0,0 +1,215 @@ +use query_core::{Operation, Selection}; + +use crate::{ + merge_fields, Include, IncludeType, ModelOperation, ModelQuery, ModelReadOperation, ModelTypes, + OrderByQuery, PaginatedQuery, PrismaClientInternals, PrismaValue, Query, QueryConvert, Select, + SelectType, WhereInput, WhereQuery, WithQuery, +}; + +pub struct FindFirst<'a, Actions: ModelTypes> { + client: &'a PrismaClientInternals, + pub where_params: Vec, + pub with_params: Vec, + pub order_by_params: Vec, + pub cursor_params: Vec, + pub skip: Option, + pub take: Option, +} + +impl<'a, Actions: ModelTypes> FindFirst<'a, Actions> { + pub fn new(client: &'a PrismaClientInternals, where_params: Vec) -> Self { + Self { + client, + where_params, + with_params: vec![], + order_by_params: vec![], + cursor_params: vec![], + skip: None, + take: None, + } + } + + pub fn with(mut self, param: impl Into) -> Self { + self.with_params.push(param.into()); + self + } + + pub fn order_by(mut self, param: Actions::OrderBy) -> Self { + self.order_by_params.push(param); + self + } + + pub fn cursor(mut self, param: Actions::Cursor) -> Self { + self.cursor_params.push(param); + self + } + + pub fn skip(mut self, skip: i64) -> Self { + self.skip = Some(skip); + self + } + + pub fn take(mut self, take: i64) -> Self { + self.take = Some(take); + self + } + + fn to_selection( + where_params: Vec, + order_by_params: Vec, + cursor_params: Vec, + skip: Option, + take: Option, + nested_selections: impl IntoIterator, + ) -> Selection { + Self::base_selection( + [ + (!where_params.is_empty()).then(|| { + ( + "where".to_string(), + PrismaValue::Object(merge_fields( + where_params + .into_iter() + .map(WhereInput::serialize) + .map(|s| (s.field, s.value.into())) + .collect(), + )), + ) + }), + (!order_by_params.is_empty()).then(|| { + ( + "orderBy".to_string(), + PrismaValue::List( + order_by_params + .into_iter() + .map(|p| PrismaValue::Object(vec![p.into()])) + .collect(), + ), + ) + }), + (!cursor_params.is_empty()).then(|| { + ( + "cursor".to_string(), + PrismaValue::Object( + cursor_params + .into_iter() + .map(WhereInput::serialize) + .map(|s| (s.field, s.value.into())) + .collect(), + ), + ) + }), + skip.map(|skip| ("skip".to_string(), PrismaValue::Int(skip as i32).into())), + take.map(|take| ("take".to_string(), PrismaValue::Int(take as i32).into())), + ] + .into_iter() + .flatten(), + nested_selections, + ) + } + + pub fn select>( + self, + select: S, + ) -> Select<'a, Option> { + Select::new( + self.client, + Operation::Read(Self::to_selection( + self.where_params, + self.order_by_params, + self.cursor_params, + self.skip, + self.take, + select.to_selections(), + )), + ) + } + + pub fn include>( + self, + include: I, + ) -> Include<'a, Option> { + Include::new( + self.client, + Operation::Read(Self::to_selection( + self.where_params, + self.order_by_params, + self.cursor_params, + self.skip, + self.take, + include.to_selections(), + )), + ) + } + + pub async fn exec(self) -> super::Result> { + super::exec(self).await + } +} + +impl<'a, Actions: ModelTypes> QueryConvert for FindFirst<'a, Actions> { + type RawType = Option; + type ReturnValue = Self::RawType; + + fn convert(raw: Self::RawType) -> super::Result { + Ok(raw) + } +} + +impl<'a, Actions: ModelTypes> Query<'a> for FindFirst<'a, Actions> { + fn graphql(self) -> (Operation, &'a PrismaClientInternals) { + let mut scalar_selections = Actions::scalar_selections(); + + scalar_selections.extend(self.with_params.into_iter().map(Into::into)); + + ( + Operation::Read(Self::to_selection( + self.where_params, + self.order_by_params, + self.cursor_params, + self.skip, + self.take, + scalar_selections, + )), + self.client, + ) + } +} + +impl<'a, Actions: ModelTypes> ModelQuery<'a> for FindFirst<'a, Actions> { + type Types = Actions; + + const TYPE: ModelOperation = ModelOperation::Read(ModelReadOperation::FindFirst); +} + +impl<'a, Actions: ModelTypes> WhereQuery<'a> for FindFirst<'a, Actions> { + fn add_where(&mut self, param: Actions::Where) { + self.where_params.push(param); + } +} + +impl<'a, Actions: ModelTypes> WithQuery<'a> for FindFirst<'a, Actions> { + fn add_with(&mut self, param: impl Into) { + self.with_params.push(param.into()); + } +} + +impl<'a, Actions: ModelTypes> OrderByQuery<'a> for FindFirst<'a, Actions> { + fn add_order_by(&mut self, param: Actions::OrderBy) { + self.order_by_params.push(param); + } +} + +impl<'a, Actions: ModelTypes> PaginatedQuery<'a> for FindFirst<'a, Actions> { + fn add_cursor(&mut self, param: Actions::Cursor) { + self.cursor_params.push(param); + } + + fn set_skip(&mut self, skip: i64) { + self.skip = Some(skip); + } + + fn set_take(&mut self, take: i64) { + self.take = Some(take); + } +} diff --git a/external/prisma-client-rust/crates/lib/src/queries/find_many.rs b/external/prisma-client-rust/crates/lib/src/queries/find_many.rs new file mode 100644 index 0000000..446524f --- /dev/null +++ b/external/prisma-client-rust/crates/lib/src/queries/find_many.rs @@ -0,0 +1,322 @@ +use query_core::{ArgumentValue, Operation, Selection}; + +use crate::{ + merge_fields, Include, IncludeType, ModelOperation, ModelQuery, ModelReadOperation, ModelTypes, + OrderByQuery, PaginatedQuery, PrismaClientInternals, PrismaValue, Query, QueryConvert, Select, + SelectType, WhereInput, WhereQuery, WithQuery, +}; + +pub struct FindMany<'a, Actions: ModelTypes> { + client: &'a PrismaClientInternals, + pub where_params: Vec, + pub with_params: Vec, + pub order_by_params: Vec, + pub cursor_params: Vec, + pub skip: Option, + pub take: Option, +} + +impl<'a, Actions: ModelTypes> FindMany<'a, Actions> { + pub fn new(client: &'a PrismaClientInternals, where_params: Vec) -> Self { + Self { + client, + where_params, + with_params: vec![], + order_by_params: vec![], + cursor_params: vec![], + skip: None, + take: None, + } + } + + pub fn with(mut self, param: impl Into) -> Self { + self.with_params.push(param.into()); + self + } + + pub fn order_by(mut self, param: Actions::OrderBy) -> Self { + self.order_by_params.push(param); + self + } + + pub fn cursor(mut self, param: Actions::Cursor) -> Self { + self.cursor_params.push(param); + self + } + + pub fn skip(mut self, skip: i64) -> Self { + self.skip = Some(skip); + self + } + + pub fn take(mut self, take: i64) -> Self { + self.take = Some(take); + self + } + + fn to_selection( + where_params: Vec, + order_by_params: Vec, + cursor_params: Vec, + skip: Option, + take: Option, + nested_selections: impl IntoIterator, + ) -> Selection { + Self::base_selection( + [ + (!where_params.is_empty()).then(|| { + ( + "where".to_string(), + PrismaValue::Object(merge_fields( + where_params + .into_iter() + .map(WhereInput::serialize) + .map(|s| (s.field, s.value.into())) + .collect(), + )) + .into(), + ) + }), + (!order_by_params.is_empty()).then(|| { + ( + "orderBy".to_string(), + PrismaValue::List( + order_by_params + .into_iter() + .map(|p| PrismaValue::Object(vec![p.into()])) + .collect(), + ) + .into(), + ) + }), + (!cursor_params.is_empty()).then(|| { + ( + "cursor".to_string(), + PrismaValue::Object( + cursor_params + .into_iter() + .map(WhereInput::serialize) + .map(|s| (s.field, s.value.into())) + .collect(), + ) + .into(), + ) + }), + skip.map(|skip| ("skip".to_string(), PrismaValue::Int(skip as i32).into())), + take.map(|take| ("take".to_string(), PrismaValue::Int(take as i32).into())), + ] + .into_iter() + .flatten(), + nested_selections, + ) + } + + pub fn select>( + self, + select: S, + ) -> Select<'a, Vec> { + Select::new( + self.client, + Operation::Read(Self::to_selection( + self.where_params, + self.order_by_params, + self.cursor_params, + self.skip, + self.take, + select.to_selections(), + )), + ) + } + + pub fn include>( + self, + include: I, + ) -> Include<'a, Vec> { + Include::new( + self.client, + Operation::Read(Self::to_selection( + self.where_params, + self.order_by_params, + self.cursor_params, + self.skip, + self.take, + include.to_selections(), + )), + ) + } + + pub async fn exec(self) -> super::Result> { + super::exec(self).await + } +} + +impl<'a, Actions: ModelTypes> QueryConvert for FindMany<'a, Actions> { + type RawType = Vec; + type ReturnValue = Self::RawType; + + fn convert(raw: Self::RawType) -> super::Result { + Ok(raw) + } +} + +impl<'a, Actions: ModelTypes> Query<'a> for FindMany<'a, Actions> { + fn graphql(self) -> (Operation, &'a PrismaClientInternals) { + let mut scalar_selections = Actions::scalar_selections(); + + scalar_selections.extend(self.with_params.into_iter().map(Into::into)); + + ( + Operation::Read(Self::to_selection( + self.where_params, + self.order_by_params, + self.cursor_params, + self.skip, + self.take, + scalar_selections, + )), + self.client, + ) + } +} + +impl<'a, Actions: ModelTypes> ModelQuery<'a> for FindMany<'a, Actions> { + type Types = Actions; + + const TYPE: ModelOperation = ModelOperation::Read(ModelReadOperation::FindMany); +} + +impl<'a, Actions: ModelTypes> WhereQuery<'a> for FindMany<'a, Actions> { + fn add_where(&mut self, param: Actions::Where) { + self.where_params.push(param); + } +} + +impl<'a, Actions: ModelTypes> WithQuery<'a> for FindMany<'a, Actions> { + fn add_with(&mut self, param: impl Into) { + self.with_params.push(param.into()); + } +} + +impl<'a, Actions: ModelTypes> OrderByQuery<'a> for FindMany<'a, Actions> { + fn add_order_by(&mut self, param: Actions::OrderBy) { + self.order_by_params.push(param); + } +} + +impl<'a, Actions: ModelTypes> PaginatedQuery<'a> for FindMany<'a, Actions> { + fn add_cursor(&mut self, param: Actions::Cursor) { + self.cursor_params.push(param); + } + + fn set_skip(&mut self, skip: i64) { + self.skip = Some(skip); + } + + fn set_take(&mut self, take: i64) { + self.take = Some(take); + } +} + +#[derive(Debug, Clone)] +pub struct ManyArgs { + pub where_params: Vec, + pub with_params: Vec, + pub order_by_params: Vec, + pub cursor_params: Vec, + pub skip: Option, + pub take: Option, +} + +impl ManyArgs { + pub fn new(where_params: Vec) -> Self { + Self { + where_params, + with_params: vec![], + order_by_params: vec![], + cursor_params: vec![], + skip: None, + take: None, + } + } + + pub fn with(mut self, param: impl Into) -> Self { + self.with_params.push(param.into()); + self + } + + pub fn order_by(mut self, param: Actions::OrderBy) -> Self { + self.order_by_params.push(param); + self + } + + pub fn cursor(mut self, param: Actions::Cursor) -> Self { + self.cursor_params.push(param); + self + } + + pub fn skip(mut self, skip: i64) -> Self { + self.skip = Some(skip); + self + } + + pub fn take(mut self, take: i64) -> Self { + self.take = Some(take); + self + } + + pub fn to_graphql(self) -> (Vec<(String, ArgumentValue)>, Vec) { + let arguments = [ + (!self.where_params.is_empty()).then(|| { + ( + "where".to_string(), + PrismaValue::Object( + self.where_params + .into_iter() + .map(WhereInput::serialize) + .map(Into::into) + .collect(), + ) + .into(), + ) + }), + (!self.order_by_params.is_empty()).then(|| { + ( + "orderBy".to_string(), + PrismaValue::List( + self.order_by_params + .into_iter() + .map(|p| PrismaValue::Object(vec![p.into()])) + .collect(), + ) + .into(), + ) + }), + (!self.cursor_params.is_empty()).then(|| { + ( + "cursor".to_string(), + PrismaValue::Object( + self.cursor_params + .into_iter() + .map(WhereInput::serialize) + .map(|s| (s.field, s.value.into())) + .collect(), + ), + ) + }), + self.skip + .map(|skip| ("skip".to_string(), PrismaValue::Int(skip as i32))), + self.take + .map(|take| ("take".to_string(), PrismaValue::Int(take as i32))), + ] + .into_iter() + .flatten() + .map(|(k, v)| (k, prisma_models::PrismaValue::from(v).into())) + .collect(); + + let nested_selections = (self.with_params.len() > 0) + .then(|| self.with_params.into_iter().map(Into::into).collect()) + .unwrap_or_default(); + + (arguments, nested_selections) + } +} diff --git a/external/prisma-client-rust/crates/lib/src/queries/find_unique.rs b/external/prisma-client-rust/crates/lib/src/queries/find_unique.rs new file mode 100644 index 0000000..3438602 --- /dev/null +++ b/external/prisma-client-rust/crates/lib/src/queries/find_unique.rs @@ -0,0 +1,130 @@ +use std::marker::PhantomData; + +use query_core::{Operation, Selection}; + +use crate::{ + Include, IncludeType, ModelOperation, ModelQuery, ModelReadOperation, ModelTypes, + PrismaClientInternals, PrismaValue, Query, QueryConvert, Select, SelectType, WhereInput, + WithQuery, +}; + +pub struct FindUnique<'a, Actions: ModelTypes> { + client: &'a PrismaClientInternals, + pub where_param: Actions::WhereUnique, + pub with_params: Vec, + _data: PhantomData<(Actions::Set, Actions::Data)>, +} + +impl<'a, Actions: ModelTypes> FindUnique<'a, Actions> { + pub fn new(client: &'a PrismaClientInternals, where_param: Actions::WhereUnique) -> Self { + Self { + client, + where_param, + with_params: vec![], + _data: PhantomData, + } + } + + pub fn with(mut self, param: impl Into) -> Self { + self.with_params.push(param.into()); + self + } + + fn to_selection( + where_param: Actions::WhereUnique, + nested_selections: impl IntoIterator, + ) -> Selection { + Self::base_selection( + [( + "where".to_string(), + PrismaValue::Object(vec![where_param.serialize().transform_equals()]), + )], + nested_selections, + ) + } + + pub fn select>( + self, + select: S, + ) -> Select<'a, Option> { + Select::new( + self.client, + Operation::Read(Self::to_selection(self.where_param, select.to_selections())), + ) + } + + pub fn include>( + self, + include: I, + ) -> Include<'a, Option> { + Include::new( + self.client, + Operation::Read(Self::to_selection( + self.where_param, + include.to_selections(), + )), + ) + } + + pub async fn exec(self) -> super::Result> { + super::exec(self).await + } +} + +impl<'a, Actions: ModelTypes> QueryConvert for FindUnique<'a, Actions> { + type RawType = Option; + type ReturnValue = Self::RawType; + + fn convert(raw: Self::RawType) -> super::Result { + Ok(raw) + } +} + +impl<'a, Actions: ModelTypes> Query<'a> for FindUnique<'a, Actions> { + fn graphql(self) -> (Operation, &'a PrismaClientInternals) { + let mut scalar_selections = Actions::scalar_selections(); + + scalar_selections.extend(self.with_params.into_iter().map(Into::into)); + + ( + Operation::Read(Self::to_selection(self.where_param, scalar_selections)), + self.client, + ) + } +} + +impl<'a, Actions: ModelTypes> ModelQuery<'a> for FindUnique<'a, Actions> { + type Types = Actions; + + const TYPE: ModelOperation = ModelOperation::Read(ModelReadOperation::FindUnique); +} + +impl<'a, Actions: ModelTypes> WithQuery<'a> for FindUnique<'a, Actions> { + fn add_with(&mut self, param: impl Into) { + self.with_params.push(param.into()); + } +} + +#[derive(Debug, Clone)] +pub struct UniqueArgs +where + Actions: ModelTypes, +{ + pub with_params: Vec, +} + +impl UniqueArgs +where + Actions: ModelTypes, +{ + pub fn new() -> Self { + Self { + with_params: vec![], + } + } + + pub fn with(mut self, with: impl Into) -> Self { + self.with_params.push(with.into()); + self + } +} diff --git a/external/prisma-client-rust/crates/lib/src/queries/include.rs b/external/prisma-client-rust/crates/lib/src/queries/include.rs new file mode 100644 index 0000000..c1f1d9f --- /dev/null +++ b/external/prisma-client-rust/crates/lib/src/queries/include.rs @@ -0,0 +1,49 @@ +use query_core::{Operation, Selection}; +use std::marker::PhantomData; + +use crate::{PrismaClientInternals, Query, QueryConvert}; + +use super::query; + +pub trait IncludeType { + // TODO: ModelActions + type Data: query::Data; + type ModelData; + + fn to_selections(self) -> Vec; +} + +pub struct Include<'a, Data> { + operation: Operation, + client: &'a PrismaClientInternals, + _data: PhantomData, +} + +impl<'a, Data: query::Data> Include<'a, Data> { + pub fn new(client: &'a PrismaClientInternals, operation: Operation) -> Self { + Self { + client, + operation, + _data: PhantomData {}, + } + } + + pub async fn exec(self) -> super::Result { + super::exec(self).await + } +} + +impl<'a, Data: query::Data> QueryConvert for Include<'a, Data> { + type RawType = Data; + type ReturnValue = Self::RawType; + + fn convert(raw: Self::RawType) -> super::Result { + Ok(raw) + } +} + +impl<'a, Data: query::Data> Query<'a> for Include<'a, Data> { + fn graphql(self) -> (Operation, &'a PrismaClientInternals) { + (self.operation, self.client) + } +} diff --git a/external/prisma-client-rust/crates/lib/src/queries/mod.rs b/external/prisma-client-rust/crates/lib/src/queries/mod.rs new file mode 100644 index 0000000..7db65a4 --- /dev/null +++ b/external/prisma-client-rust/crates/lib/src/queries/mod.rs @@ -0,0 +1,132 @@ +mod batch; +mod count; +mod create; +mod create_many; +mod create_unchecked; +mod delete; +mod delete_many; +mod error; +mod execute_raw; +mod find_first; +mod find_many; +mod find_unique; +mod include; +mod mongo_raw; +mod query; +mod query_raw; +mod select; +mod update; +mod update_many; +mod update_unchecked; +mod upsert; + +pub use batch::*; +pub use count::*; +pub use create::*; +pub use create_many::*; +pub use create_unchecked::*; +pub use delete::*; +pub use delete_many::*; +pub use error::*; +pub use execute_raw::*; +pub use find_first::*; +pub use find_many::*; +pub use find_unique::*; +pub use include::*; +pub use mongo_raw::*; +pub use query::*; +pub use query_raw::*; +pub use select::*; +pub use update::*; +pub use update_many::*; +pub use update_unchecked::*; +pub use upsert::*; + +use futures::FutureExt; +pub use query_core::{schema::QuerySchemaRef, Operation, Selection}; +use serde::de::IntoDeserializer; +use serde::Deserialize; +use std::future::Future; + +use crate::{ExecutionEngine, PrismaValue}; + +pub enum SerializedWhereValue { + Object(Vec<(String, PrismaValue)>), + List(Vec), + Value(PrismaValue), +} + +impl Into for SerializedWhereValue { + fn into(self) -> PrismaValue { + match self { + Self::Object(v) => PrismaValue::Object(v), + Self::List(v) => PrismaValue::List(v), + Self::Value(v) => v, + } + } +} + +pub struct SerializedWhereInput { + field: String, + value: SerializedWhereValue, +} + +impl SerializedWhereInput { + pub fn new(field: String, value: SerializedWhereValue) -> Self { + Self { + field, + value: value.into(), + } + } + + /// If the parameter is an 'equals' parameter, collapses the value provided directly + /// into the where clause. This is necessary for unique queries that have no filters, + /// only direct value comparisons. + pub fn transform_equals(self) -> (String, PrismaValue) { + let Self { field, value } = self; + + ( + field.to_string(), + match value { + SerializedWhereValue::Object(mut params) => match params + .iter() + .position(|(key, _)| key == "equals") + .map(|i| params.swap_remove(i)) + { + Some((_, value)) => value, + None => PrismaValue::Object(params), + }, + SerializedWhereValue::List(values) => PrismaValue::List(values), + SerializedWhereValue::Value(v) => v, + }, + ) + } +} + +impl Into<(String, PrismaValue)> for SerializedWhereInput { + fn into(self) -> (String, PrismaValue) { + let SerializedWhereInput { field, value } = self; + (field, value.into()) + } +} + +pub fn exec<'a, Q: Query<'a> + 'a>( + query: Q, +) -> impl Future::ReturnValue>> + 'a { + let (op, client) = query.graphql(); + + client.execute(op).map(|value| { + let value = value?; + + Ok(match client.engine { + ExecutionEngine::Real { .. } => Q::RawType::deserialize(value.into_deserializer()) + .map_err(|e| e.to_string()) + .map_err(QueryError::Deserialize) + .and_then(Q::convert)?, + #[cfg(feature = "mocking")] + ExecutionEngine::Mock(_) => Q::ReturnValue::deserialize(value.into_deserializer()) + .map_err(|e| e.to_string()) + .map_err(QueryError::Deserialize)?, + }) + }) +} diff --git a/external/prisma-client-rust/crates/lib/src/queries/mongo_raw.rs b/external/prisma-client-rust/crates/lib/src/queries/mongo_raw.rs new file mode 100644 index 0000000..149b029 --- /dev/null +++ b/external/prisma-client-rust/crates/lib/src/queries/mongo_raw.rs @@ -0,0 +1,245 @@ +use std::marker::PhantomData; + +use prisma_models::PrismaValue; +use query_core::{Operation, Selection}; +use serde::de::DeserializeOwned; +use serde_json::Value; + +use crate::{ModelTypes, PrismaClientInternals, Query, QueryConvert, QueryError}; + +pub struct RunCommandRaw<'a, Data> +where + Data: DeserializeOwned, +{ + client: &'a PrismaClientInternals, + command: Value, + _data: PhantomData, +} +impl<'a, Data> RunCommandRaw<'a, Data> +where + Data: DeserializeOwned + 'static, +{ + pub fn new(client: &'a PrismaClientInternals, command: Value) -> Self { + Self { + client, + command, + _data: PhantomData, + } + } + + pub(crate) fn convert(raw: serde_json::Value) -> super::Result { + serde_json::from_value(raw) + .map_err(|e| e.to_string()) + .map_err(QueryError::Deserialize) + } + + pub async fn exec(self) -> super::Result { + super::exec(self).await + } +} + +impl<'a, Data> QueryConvert for RunCommandRaw<'a, Data> +where + Data: DeserializeOwned + 'static, +{ + type RawType = serde_json::Value; + type ReturnValue = Data; + + fn convert(raw: Self::RawType) -> super::Result { + Self::convert(raw) + } +} + +impl<'a, Data> Query<'a> for RunCommandRaw<'a, Data> +where + Data: DeserializeOwned + 'static, +{ + fn graphql(self) -> (Operation, &'a PrismaClientInternals) { + ( + Operation::Write(Selection::new( + "runCommandRaw", + None, + [( + "command".to_string(), + PrismaValue::try_from(self.command).unwrap().into(), + )], + [], + )), + self.client, + ) + } +} + +pub struct FindRaw<'a, Types, Data> { + client: &'a PrismaClientInternals, + filter: Option, + options: Option, + _data: PhantomData<(Data, Types)>, +} +impl<'a, Types, Data> FindRaw<'a, Types, Data> +where + Types: ModelTypes, + Data: DeserializeOwned + 'static, +{ + pub fn new(client: &'a PrismaClientInternals) -> Self { + Self { + client, + filter: None, + options: None, + _data: PhantomData, + } + } + + pub fn filter(self, filter: Value) -> Self { + Self { + filter: Some(filter), + ..self + } + } + + pub fn options(self, options: Value) -> Self { + Self { + options: Some(options), + ..self + } + } + + pub async fn exec(self) -> super::Result { + super::exec(self).await + } +} + +impl<'a, Types, Data> QueryConvert for FindRaw<'a, Types, Data> +where + Data: DeserializeOwned + 'static, +{ + type RawType = serde_json::Value; + type ReturnValue = Data; + + fn convert(raw: Self::RawType) -> super::Result { + serde_json::from_value(raw) + .map_err(|e| e.to_string()) + .map_err(QueryError::Deserialize) + } +} + +impl<'a, Types, Data> Query<'a> for FindRaw<'a, Types, Data> +where + Types: ModelTypes, + Data: DeserializeOwned + 'static, +{ + fn graphql(self) -> (Operation, &'a PrismaClientInternals) { + ( + Operation::Read(Selection::new( + format!("find{}Raw", Types::MODEL), + None, + [ + self.filter.map(|filter| { + ( + "filter".to_string(), + PrismaValue::try_from(filter).unwrap().into(), + ) + }), + self.options.map(|options| { + ( + "options".to_string(), + PrismaValue::try_from(options).unwrap().into(), + ) + }), + ] + .into_iter() + .flatten() + .collect::>(), + [], + )), + self.client, + ) + } +} + +pub struct AggregateRaw<'a, Types, Data> { + client: &'a PrismaClientInternals, + pipeline: Option, + options: Option, + _data: PhantomData<(Data, Types)>, +} +impl<'a, Types, Data> AggregateRaw<'a, Types, Data> +where + Types: ModelTypes, + Data: DeserializeOwned + 'static, +{ + pub fn new(client: &'a PrismaClientInternals) -> Self { + Self { + client, + pipeline: None, + options: None, + _data: PhantomData, + } + } + + pub fn pipeline(self, pipeline: Value) -> Self { + Self { + pipeline: Some(pipeline), + ..self + } + } + + pub fn options(self, options: Value) -> Self { + Self { + options: Some(options), + ..self + } + } + + pub async fn exec(self) -> super::Result { + super::exec(self).await + } +} + +impl<'a, Types, Data> QueryConvert for AggregateRaw<'a, Types, Data> +where + Data: DeserializeOwned + 'static, +{ + type RawType = serde_json::Value; + type ReturnValue = Data; + + fn convert(raw: Self::RawType) -> super::Result { + serde_json::from_value(raw) + .map_err(|e| e.to_string()) + .map_err(QueryError::Deserialize) + } +} + +impl<'a, Types, Data> Query<'a> for AggregateRaw<'a, Types, Data> +where + Types: ModelTypes, + Data: DeserializeOwned + 'static, +{ + fn graphql(self) -> (Operation, &'a PrismaClientInternals) { + ( + Operation::Read(Selection::new( + format!("aggregate{}Raw", Types::MODEL), + None, + [ + self.pipeline.map(|filter| { + ( + "pipeline".to_string(), + PrismaValue::try_from(filter).unwrap().into(), + ) + }), + self.options.map(|options| { + ( + "options".to_string(), + PrismaValue::try_from(options).unwrap().into(), + ) + }), + ] + .into_iter() + .flatten() + .collect::>(), + [], + )), + self.client, + ) + } +} diff --git a/external/prisma-client-rust/crates/lib/src/queries/query.rs b/external/prisma-client-rust/crates/lib/src/queries/query.rs new file mode 100644 index 0000000..8ff5307 --- /dev/null +++ b/external/prisma-client-rust/crates/lib/src/queries/query.rs @@ -0,0 +1,145 @@ +use query_core::{Operation, Selection}; +use serde::de::DeserializeOwned; + +use crate::{PrismaClientInternals, PrismaValue, WhereInput}; + +pub trait QueryConvert { + type RawType: Data; + type ReturnValue: Data; + + /// Function for converting between raw database data and the type expected by the user. + /// Necessary for things like raw queries + fn convert(raw: Self::RawType) -> super::Result; +} + +pub trait Query<'a>: QueryConvert { + fn graphql(self) -> (Operation, &'a PrismaClientInternals); +} + +pub trait ModelTypes { + type Data: Data; + type Where: WhereInput; + type WhereUnique: WhereInput; + type UncheckedSet: Into<(String, PrismaValue)>; + type Set: Into<(String, PrismaValue)>; + type With: Into; + type OrderBy: Into<(String, PrismaValue)>; + type Cursor: WhereInput; + + const MODEL: &'static str; + + fn scalar_selections() -> Vec; +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum ModelReadOperation { + FindUnique, + FindFirst, + FindMany, + Count, +} + +impl ModelReadOperation { + pub fn name(&self) -> &'static str { + match self { + Self::FindUnique => "findUnique", + Self::FindFirst => "findFirst", + Self::FindMany => "findMany", + Self::Count => "aggregate", + } + } +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum ModelWriteOperation { + Create, + CreateMany, + Update, + UpdateMany, + Delete, + DeleteMany, + Upsert, +} + +impl ModelWriteOperation { + pub fn name(&self) -> &'static str { + match self { + Self::Create => "createOne", + Self::CreateMany => "createMany", + Self::Update => "updateOne", + Self::UpdateMany => "updateMany", + Self::Delete => "deleteOne", + Self::DeleteMany => "deleteMany", + Self::Upsert => "upsertOne", + } + } +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum ModelOperation { + Read(ModelReadOperation), + Write(ModelWriteOperation), +} + +impl ModelOperation { + pub fn name(&self) -> &'static str { + match self { + Self::Read(q) => q.name(), + Self::Write(q) => q.name(), + } + } +} + +pub trait ModelQuery<'a>: Query<'a> { + type Types: ModelTypes; + + const TYPE: ModelOperation; + + fn base_selection( + arguments: impl IntoIterator, + nested_selections: impl IntoIterator, + ) -> Selection { + Selection::new( + format!("{}{}", Self::TYPE.name(), Self::Types::MODEL), + None, + arguments + .into_iter() + .map(|(k, v)| (k, prisma_models::PrismaValue::from(v).into())) + .collect::>(), + nested_selections.into_iter().collect::>(), + ) + } +} + +pub trait WhereQuery<'a>: ModelQuery<'a> { + fn add_where(&mut self, param: <>::Types as ModelTypes>::Where); +} + +pub trait WithQuery<'a>: ModelQuery<'a> { + fn add_with(&mut self, param: impl Into<<>::Types as ModelTypes>::With>); +} + +pub trait OrderByQuery<'a>: ModelQuery<'a> { + fn add_order_by(&mut self, param: <>::Types as ModelTypes>::OrderBy); +} + +pub trait PaginatedQuery<'a>: ModelQuery<'a> { + fn add_cursor(&mut self, param: <>::Types as ModelTypes>::Cursor); + fn set_skip(&mut self, skip: i64); + fn set_take(&mut self, take: i64); +} + +pub trait UncheckedSetQuery<'a>: ModelQuery<'a> { + fn add_unchecked_set( + &mut self, + param: <>::Types as ModelTypes>::UncheckedSet, + ); +} + +pub trait SetQuery<'a>: ModelQuery<'a> { + fn add_set(&mut self, param: <>::Types as ModelTypes>::Set); +} + +pub trait Data: DeserializeOwned + 'static {} + +impl Data for T {} diff --git a/external/prisma-client-rust/crates/lib/src/queries/query_raw.rs b/external/prisma-client-rust/crates/lib/src/queries/query_raw.rs new file mode 100644 index 0000000..2d152b6 --- /dev/null +++ b/external/prisma-client-rust/crates/lib/src/queries/query_raw.rs @@ -0,0 +1,101 @@ +use std::{collections::HashMap, marker::PhantomData}; + +use prisma_models::PrismaValue; +use query_core::{Operation, Selection}; +use serde::de::DeserializeOwned; +use serde_json::Value; + +use crate::{ + raw::{Raw, RawOperationData, RawPrismaValue}, + PrismaClientInternals, Query, QueryConvert, QueryError, +}; + +pub struct QueryRaw<'a, Data> +where + Data: DeserializeOwned, +{ + client: &'a PrismaClientInternals, + sql: String, + params: Vec, + _data: PhantomData, +} + +impl<'a, Data> QueryRaw<'a, Data> +where + Data: DeserializeOwned + 'static, +{ + pub fn new(client: &'a PrismaClientInternals, query: Raw, database: &'static str) -> Self { + let (sql, params) = query.convert(database); + + Self { + client, + sql, + params, + _data: PhantomData, + } + } + + pub(crate) fn convert(raw: RawOperationData) -> super::Result> { + let typed_data: Vec> = raw + .into_iter() + .map(|row| { + row.into_iter() + .map(|(column_name, cell)| (column_name, cell.into())) + .collect() + }) + .collect(); + + typed_data + .into_iter() + .map(|row| { + let v = serde_value::to_value(&row) + .map_err(|e| e.to_string()) + .map_err(QueryError::Deserialize)?; + + v.deserialize_into::() + .map_err(|e| e.to_string()) + .map_err(QueryError::Deserialize) + }) + .collect::>() + .map_err(Into::into) + } + + pub async fn exec(self) -> super::Result> { + super::exec(self).await + } +} + +impl<'a, Data> QueryConvert for QueryRaw<'a, Data> +where + Data: DeserializeOwned + 'static, +{ + type RawType = RawOperationData; + type ReturnValue = Vec; + + fn convert(raw: Self::RawType) -> super::Result { + Self::convert(raw) + } +} + +impl<'a, Data> Query<'a> for QueryRaw<'a, Data> +where + Data: DeserializeOwned + 'static, +{ + fn graphql(self) -> (Operation, &'a PrismaClientInternals) { + ( + Operation::Write(Selection::new( + "queryRaw".to_string(), + None, + [ + ("query".to_string(), PrismaValue::String(self.sql).into()), + ( + "parameters".to_string(), + PrismaValue::String(serde_json::to_string(&self.params).unwrap()).into(), + ), + ], + [], + )), + self.client, + ) + } +} diff --git a/external/prisma-client-rust/crates/lib/src/queries/select.rs b/external/prisma-client-rust/crates/lib/src/queries/select.rs new file mode 100644 index 0000000..ef55cf1 --- /dev/null +++ b/external/prisma-client-rust/crates/lib/src/queries/select.rs @@ -0,0 +1,49 @@ +use std::marker::PhantomData; + +use query_core::{Operation, Selection}; +use serde::de::DeserializeOwned; + +use crate::{Data, PrismaClientInternals, Query, QueryConvert}; + +pub trait SelectType { + // TODO: ModelActions + type Data: Data; + type ModelData; + + fn to_selections(self) -> Vec; +} + +pub struct Select<'a, Data: DeserializeOwned> { + operation: Operation, + client: &'a PrismaClientInternals, + _data: PhantomData, +} + +impl<'a, Data: crate::Data> Select<'a, Data> { + pub fn new(client: &'a PrismaClientInternals, operation: Operation) -> Self { + Self { + client, + operation, + _data: PhantomData {}, + } + } + + pub async fn exec(self) -> super::Result { + super::exec(self).await + } +} + +impl<'a, Data: DeserializeOwned + 'static> QueryConvert for Select<'a, Data> { + type RawType = Data; + type ReturnValue = Self::RawType; + + fn convert(raw: Self::RawType) -> super::Result { + Ok(raw) + } +} + +impl<'a, Data: DeserializeOwned + 'static> Query<'a> for Select<'a, Data> { + fn graphql(self) -> (Operation, &'a PrismaClientInternals) { + (self.operation, self.client) + } +} diff --git a/external/prisma-client-rust/crates/lib/src/queries/update.rs b/external/prisma-client-rust/crates/lib/src/queries/update.rs new file mode 100644 index 0000000..51a3623 --- /dev/null +++ b/external/prisma-client-rust/crates/lib/src/queries/update.rs @@ -0,0 +1,133 @@ +use query_core::{Operation, Selection}; + +use crate::{ + merge_fields, Include, IncludeType, ModelOperation, ModelQuery, ModelTypes, + ModelWriteOperation, PrismaClientInternals, PrismaValue, Query, QueryConvert, Select, + SelectType, SetQuery, WhereInput, WithQuery, +}; + +pub struct Update<'a, Actions: ModelTypes> { + client: &'a PrismaClientInternals, + pub where_param: Actions::WhereUnique, + pub set_params: Vec, + pub with_params: Vec, +} + +impl<'a, Actions: ModelTypes> Update<'a, Actions> { + pub fn new( + client: &'a PrismaClientInternals, + where_param: Actions::WhereUnique, + set_params: Vec, + with_params: Vec, + ) -> Self { + Self { + client, + where_param, + set_params, + with_params, + } + } + + pub fn with(mut self, param: impl Into) -> Self { + self.with_params.push(param.into()); + self + } + + fn to_selection( + where_param: Actions::WhereUnique, + set_params: Vec, + nested_selections: impl IntoIterator, + ) -> Selection { + Self::base_selection( + [ + ( + "where".to_string(), + PrismaValue::Object(vec![where_param.serialize().transform_equals()]), + ), + ( + "data".to_string(), + PrismaValue::Object(merge_fields( + set_params.into_iter().map(Into::into).collect(), + )), + ), + ], + nested_selections, + ) + } + + pub fn select>( + self, + select: S, + ) -> Select<'a, S::Data> { + Select::new( + self.client, + Operation::Write(Self::to_selection( + self.where_param, + self.set_params, + select.to_selections(), + )), + ) + } + + pub fn include>( + self, + include: I, + ) -> Include<'a, I::Data> { + Include::new( + self.client, + Operation::Write(Self::to_selection( + self.where_param, + self.set_params, + include.to_selections(), + )), + ) + } + + pub async fn exec(self) -> super::Result { + super::exec(self).await + } +} + +impl<'a, Actions: ModelTypes> QueryConvert for Update<'a, Actions> { + type RawType = Actions::Data; + type ReturnValue = Self::RawType; + + fn convert(raw: Self::RawType) -> super::Result { + Ok(raw) + } +} + +impl<'a, Actions: ModelTypes> Query<'a> for Update<'a, Actions> { + fn graphql(self) -> (Operation, &'a PrismaClientInternals) { + let mut scalar_selections = Actions::scalar_selections(); + + scalar_selections.extend(self.with_params.into_iter().map(Into::into)); + + ( + Operation::Write(Self::to_selection( + self.where_param, + self.set_params, + scalar_selections, + )), + self.client, + ) + } +} + +impl<'a, Actions: ModelTypes> ModelQuery<'a> for Update<'a, Actions> { + type Types = Actions; + + const TYPE: ModelOperation = ModelOperation::Write(ModelWriteOperation::Update); +} + +impl<'a, Actions: ModelTypes> SetQuery<'a> for Update<'a, Actions> { + fn add_set(&mut self, param: Actions::Set) { + self.set_params.push(param); + } +} + +impl<'a, Actions: ModelTypes> WithQuery<'a> for Update<'a, Actions> { + fn add_with(&mut self, param: impl Into) { + self.with_params.push(param.into()); + } +} diff --git a/external/prisma-client-rust/crates/lib/src/queries/update_many.rs b/external/prisma-client-rust/crates/lib/src/queries/update_many.rs new file mode 100644 index 0000000..eba87df --- /dev/null +++ b/external/prisma-client-rust/crates/lib/src/queries/update_many.rs @@ -0,0 +1,94 @@ +use query_core::Operation; + +use crate::{ + merge_fields, BatchResult, ModelOperation, ModelQuery, ModelTypes, ModelWriteOperation, + PrismaClientInternals, PrismaValue, Query, QueryConvert, SetQuery, WhereInput, WhereQuery, +}; + +pub struct UpdateMany<'a, Actions: ModelTypes> { + client: &'a PrismaClientInternals, + pub where_params: Vec, + pub set_params: Vec, +} + +impl<'a, Actions: ModelTypes> UpdateMany<'a, Actions> { + pub fn new( + client: &'a PrismaClientInternals, + where_params: Vec, + set_params: Vec, + ) -> Self { + Self { + client, + where_params, + set_params, + } + } + + pub async fn exec(self) -> super::Result { + super::exec(self).await + } +} + +impl<'a, Actions: ModelTypes> QueryConvert for UpdateMany<'a, Actions> { + type RawType = BatchResult; + type ReturnValue = i64; + + fn convert(raw: Self::RawType) -> super::Result { + Ok(raw.count) + } +} + +impl<'a, Actions: ModelTypes> Query<'a> for UpdateMany<'a, Actions> { + fn graphql(self) -> (Operation, &'a PrismaClientInternals) { + ( + Operation::Write(Self::base_selection( + [ + Some(( + "data".to_string(), + PrismaValue::Object(merge_fields( + self.set_params + .into_iter() + .map(Into::into) + .map(Into::into) + .collect(), + )), + )), + (!self.where_params.is_empty()).then(|| { + ( + "where".to_string(), + PrismaValue::Object(merge_fields( + self.where_params + .into_iter() + .map(WhereInput::serialize) + .map(|s| (s.field, s.value.into())) + .collect(), + )), + ) + }), + ] + .into_iter() + .flatten(), + [BatchResult::selection()], + )), + self.client, + ) + } +} + +impl<'a, Actions: ModelTypes> ModelQuery<'a> for UpdateMany<'a, Actions> { + type Types = Actions; + + const TYPE: ModelOperation = ModelOperation::Write(ModelWriteOperation::UpdateMany); +} + +impl<'a, Actions: ModelTypes> WhereQuery<'a> for UpdateMany<'a, Actions> { + fn add_where(&mut self, param: Actions::Where) { + self.where_params.push(param); + } +} + +impl<'a, Actions: ModelTypes> SetQuery<'a> for UpdateMany<'a, Actions> { + fn add_set(&mut self, param: Actions::Set) { + self.set_params.push(param); + } +} diff --git a/external/prisma-client-rust/crates/lib/src/queries/update_unchecked.rs b/external/prisma-client-rust/crates/lib/src/queries/update_unchecked.rs new file mode 100644 index 0000000..57d2941 --- /dev/null +++ b/external/prisma-client-rust/crates/lib/src/queries/update_unchecked.rs @@ -0,0 +1,134 @@ +use crate::PrismaValue; +use query_core::{Operation, Selection}; + +use crate::{ + merge_fields, Include, IncludeType, ModelOperation, ModelQuery, ModelTypes, + ModelWriteOperation, PrismaClientInternals, Query, QueryConvert, Select, SelectType, + UncheckedSetQuery, WhereInput, WithQuery, +}; + +pub struct UpdateUnchecked<'a, Actions: ModelTypes> { + client: &'a PrismaClientInternals, + pub where_param: Actions::WhereUnique, + pub set_params: Vec, + pub with_params: Vec, +} + +impl<'a, Actions: ModelTypes> UpdateUnchecked<'a, Actions> { + pub fn new( + client: &'a PrismaClientInternals, + where_param: Actions::WhereUnique, + set_params: Vec, + with_params: Vec, + ) -> Self { + Self { + client, + where_param, + set_params, + with_params, + } + } + + pub fn with(mut self, param: impl Into) -> Self { + self.with_params.push(param.into()); + self + } + + fn to_selection( + where_param: Actions::WhereUnique, + set_params: Vec, + nested_selections: impl IntoIterator, + ) -> Selection { + Self::base_selection( + [ + ( + "where".to_string(), + PrismaValue::Object(vec![where_param.serialize().transform_equals()]), + ), + ( + "data".to_string(), + PrismaValue::Object(merge_fields( + set_params.into_iter().map(Into::into).collect(), + )), + ), + ], + nested_selections, + ) + } + + pub fn select>( + self, + select: S, + ) -> Select<'a, S::Data> { + Select::new( + self.client, + Operation::Write(Self::to_selection( + self.where_param, + self.set_params, + select.to_selections(), + )), + ) + } + + pub fn include>( + self, + include: I, + ) -> Include<'a, I::Data> { + Include::new( + self.client, + Operation::Write(Self::to_selection( + self.where_param, + self.set_params, + include.to_selections(), + )), + ) + } + + pub async fn exec(self) -> super::Result { + super::exec(self).await + } +} + +impl<'a, Actions: ModelTypes> QueryConvert for UpdateUnchecked<'a, Actions> { + type RawType = Actions::Data; + type ReturnValue = Self::RawType; + + fn convert(raw: Self::RawType) -> super::Result { + Ok(raw) + } +} + +impl<'a, Actions: ModelTypes> Query<'a> for UpdateUnchecked<'a, Actions> { + fn graphql(self) -> (Operation, &'a PrismaClientInternals) { + let mut scalar_selections = Actions::scalar_selections(); + + scalar_selections.extend(self.with_params.into_iter().map(Into::into)); + + ( + Operation::Write(Self::to_selection( + self.where_param, + self.set_params, + scalar_selections, + )), + self.client, + ) + } +} + +impl<'a, Actions: ModelTypes> ModelQuery<'a> for UpdateUnchecked<'a, Actions> { + type Types = Actions; + + const TYPE: ModelOperation = ModelOperation::Write(ModelWriteOperation::Update); +} + +impl<'a, Actions: ModelTypes> UncheckedSetQuery<'a> for UpdateUnchecked<'a, Actions> { + fn add_unchecked_set(&mut self, param: Actions::UncheckedSet) { + self.set_params.push(param); + } +} + +impl<'a, Actions: ModelTypes> WithQuery<'a> for UpdateUnchecked<'a, Actions> { + fn add_with(&mut self, param: impl Into) { + self.with_params.push(param.into()); + } +} diff --git a/external/prisma-client-rust/crates/lib/src/queries/upsert.rs b/external/prisma-client-rust/crates/lib/src/queries/upsert.rs new file mode 100644 index 0000000..926773b --- /dev/null +++ b/external/prisma-client-rust/crates/lib/src/queries/upsert.rs @@ -0,0 +1,135 @@ +use query_core::{Operation, Selection}; + +use crate::{ + Include, IncludeType, ModelOperation, ModelQuery, ModelTypes, ModelWriteOperation, + PrismaClientInternals, PrismaValue, Query, QueryConvert, Select, SelectType, WhereInput, + WithQuery, +}; + +pub struct Upsert<'a, Actions: ModelTypes> { + client: &'a PrismaClientInternals, + pub where_param: Actions::WhereUnique, + pub create_params: Vec, + pub update_params: Vec, + pub with_params: Vec, +} + +impl<'a, Actions: ModelTypes> Upsert<'a, Actions> { + pub fn new( + client: &'a PrismaClientInternals, + where_param: Actions::WhereUnique, + create_params: Vec, + update_params: Vec, + ) -> Self { + Self { + client, + where_param, + create_params, + update_params, + with_params: vec![], + } + } + + pub fn with(mut self, param: impl Into) -> Self { + self.with_params.push(param.into()); + self + } + + fn to_selection( + where_param: Actions::WhereUnique, + create_params: Vec, + update_params: Vec, + nested_selections: impl IntoIterator, + ) -> Selection { + Self::base_selection( + [ + ( + "where".to_string(), + PrismaValue::Object(vec![where_param.serialize().transform_equals()]), + ), + ( + "create".to_string(), + PrismaValue::Object(create_params.into_iter().map(Into::into).collect()), + ), + ( + "update".to_string(), + PrismaValue::Object(update_params.into_iter().map(Into::into).collect()), + ), + ], + nested_selections, + ) + } + + pub fn select>( + self, + select: S, + ) -> Select<'a, S::Data> { + Select::new( + self.client, + Operation::Write(Self::to_selection( + self.where_param, + self.create_params, + self.update_params, + select.to_selections(), + )), + ) + } + + pub fn include>( + self, + select: I, + ) -> Include<'a, I::Data> { + Include::new( + self.client, + Operation::Write(Self::to_selection( + self.where_param, + self.create_params, + self.update_params, + select.to_selections(), + )), + ) + } + + pub async fn exec(self) -> super::Result { + super::exec(self).await + } +} + +impl<'a, Actions: ModelTypes> QueryConvert for Upsert<'a, Actions> { + type RawType = Actions::Data; + type ReturnValue = Self::RawType; + + fn convert(raw: Self::RawType) -> super::Result { + Ok(raw) + } +} + +impl<'a, Actions: ModelTypes> Query<'a> for Upsert<'a, Actions> { + fn graphql(self) -> (Operation, &'a PrismaClientInternals) { + let mut scalar_selections = Actions::scalar_selections(); + + scalar_selections.extend(self.with_params.into_iter().map(Into::into)); + + ( + Operation::Write(Self::to_selection( + self.where_param, + self.create_params, + self.update_params, + scalar_selections, + )), + self.client, + ) + } +} + +impl<'a, Actions: ModelTypes> ModelQuery<'a> for Upsert<'a, Actions> { + type Types = Actions; + + const TYPE: ModelOperation = ModelOperation::Write(ModelWriteOperation::Upsert); +} + +impl<'a, Actions: ModelTypes> WithQuery<'a> for Upsert<'a, Actions> { + fn add_with(&mut self, param: impl Into) { + self.with_params.push(param.into()); + } +} diff --git a/external/prisma-client-rust/crates/lib/src/raw.rs b/external/prisma-client-rust/crates/lib/src/raw.rs new file mode 100644 index 0000000..27b78d7 --- /dev/null +++ b/external/prisma-client-rust/crates/lib/src/raw.rs @@ -0,0 +1,145 @@ +use std::collections::HashMap; + +use crate::PrismaValue; +use chrono::SecondsFormat; +use serde::{Deserialize, Serialize, Serializer}; +use serde_json::{json, Value}; +use std::str::FromStr; + +#[macro_export] +macro_rules! raw { + ($e: expr) => { + $crate::Raw::new($e, vec![]); + }; + ($e: expr, $($params:expr),+) => { + $crate::Raw::new($e, vec![$($params),+]) + }; +} + +pub struct Raw { + pub(crate) query: String, + pub values: Vec, +} + +impl Raw { + pub fn new(query: &str, values: Vec) -> Self { + Self { + query: query.to_string(), + values: values + .into_iter() + .map(|v| match v.into() { + prisma_models::PrismaValue::DateTime(dt) => json!({ + "prisma__type": "date", + "prisma__value": dt.to_rfc3339_opts(SecondsFormat::Millis, true) + }), + v => serde_json::to_value(v).unwrap(), + }) + .collect(), + } + } + + pub fn convert(self, database: &'static str) -> (String, Vec) { + let Self { mut query, values } = self; + + for i in 1..=values.len() { + let variable_indicator = match database { + "postgresql" | "cockroachdb" => format!("${i}"), + "sqlite" | "mysql" => "?".to_string(), + _ => panic!("Raw queries are not supported with database '{database}'"), + }; + + query = query.replacen("{}", &variable_indicator, 1); + } + + // TODO: do this at compile time + if query.contains("{}") { + panic!("Raw query has not been given enough parameters"); + } + + (query, values) + } +} + +pub type RawOperationData = Vec>; + +#[derive(Deserialize)] +pub struct RawTypedJson { + #[serde(rename = "prisma__type")] + typ: String, + #[serde(rename = "prisma__value")] + value: serde_json::Value, +} + +impl From for RawPrismaValue { + fn from(json: RawTypedJson) -> Self { + use serde_json::Value::*; + + match (json.typ.as_str(), json.value) { + ("int", Number(n)) => RawPrismaValue::Int(n.as_i64().unwrap() as i32), + ("bigint", String(s)) => RawPrismaValue::BigInt(s.parse().unwrap()), + ("float", Number(n)) => RawPrismaValue::Float(n.as_f64().unwrap() as f32), + ("double", Number(n)) => RawPrismaValue::Double(n.as_f64().unwrap()), + ("string", String(s)) => RawPrismaValue::String(s), + ("enum", String(s)) => RawPrismaValue::Enum(s), + ("bytes", String(b64)) => RawPrismaValue::Bytes(base64::decode(b64).unwrap()), + ("bool", Bool(b)) => RawPrismaValue::Bool(b), + ("char", String(s)) => RawPrismaValue::Char(s.chars().next().unwrap()), + ("decimal", String(n)) => { + RawPrismaValue::Decimal(bigdecimal::BigDecimal::from_str(n.as_str()).unwrap()) + } + ("json", v) => RawPrismaValue::Json(v), + ("xml", String(s)) => RawPrismaValue::Xml(s), + ("uuid", String(s)) => RawPrismaValue::Uuid(uuid::Uuid::from_str(&s).unwrap()), + ("datetime", String(s)) => { + RawPrismaValue::DateTime(chrono::DateTime::parse_from_rfc3339(&s).unwrap().into()) + } + ("date", String(s)) => { + RawPrismaValue::Date(serde_json::from_slice(s.as_bytes()).unwrap()) + } + ("time", String(s)) => { + RawPrismaValue::Time(serde_json::from_slice(s.as_bytes()).unwrap()) + } + ("array", Array(arr)) => RawPrismaValue::Array( + arr.into_iter() + .map(serde_json::from_value::) + .map(Result::unwrap) + .map(Into::into) + .collect(), + ), + ("null", _) => RawPrismaValue::Null, + _ => unreachable!("Invalid value for raw type {}", &json.typ), + } + } +} + +// See quaint::ast::Value & IntoTypedJsonExtension +#[derive(Serialize)] +#[serde(untagged)] +pub(crate) enum RawPrismaValue { + Int(i32), + BigInt(i64), + Float(f32), + Double(f64), + String(String), + Enum(String), + Bytes(Vec), + Bool(bool), + Char(char), + Decimal(bigdecimal::BigDecimal), + Json(serde_json::Value), + Xml(String), + Uuid(uuid::Uuid), + DateTime(chrono::DateTime), + Date(chrono::NaiveDate), + Time(chrono::NaiveTime), + Array(Vec), + #[serde(serialize_with = "serialize_null")] + Null, +} + +fn serialize_null(serializer: S) -> Result +where + S: Serializer, +{ + Option::<()>::None.serialize(serializer) +} diff --git a/external/prisma-client-rust/crates/lib/src/scalar_types.rs b/external/prisma-client-rust/crates/lib/src/scalar_types.rs new file mode 100644 index 0000000..a69db41 --- /dev/null +++ b/external/prisma-client-rust/crates/lib/src/scalar_types.rs @@ -0,0 +1,9 @@ +pub type Int = i32; +pub type BigInt = i64; +pub type Decimal = bigdecimal::BigDecimal; +pub type Boolean = bool; +pub type DateTime = chrono::DateTime; +pub type Float = f64; +pub type String = std::string::String; +pub type Json = serde_json::Value; +pub type Bytes = Vec; diff --git a/external/prisma-client-rust/crates/lib/src/serde.rs b/external/prisma-client-rust/crates/lib/src/serde.rs new file mode 100644 index 0000000..6387891 --- /dev/null +++ b/external/prisma-client-rust/crates/lib/src/serde.rs @@ -0,0 +1,23 @@ +// From serde_with +pub mod double_option { + use serde::{Deserialize, Deserializer, Serialize, Serializer}; + + pub fn deserialize<'de, T, D>(deserializer: D) -> Result>, D::Error> + where + T: Deserialize<'de>, + D: Deserializer<'de>, + { + serde::Deserialize::deserialize(deserializer).map(Some) + } + pub fn serialize(values: &Option>, serializer: S) -> Result + where + S: Serializer, + T: Serialize, + { + match values { + None => serializer.serialize_unit(), + Some(None) => serializer.serialize_none(), + Some(Some(v)) => serializer.serialize_some(&v), + } + } +} diff --git a/external/prisma-client-rust/crates/lib/src/traits.rs b/external/prisma-client-rust/crates/lib/src/traits.rs new file mode 100644 index 0000000..5705386 --- /dev/null +++ b/external/prisma-client-rust/crates/lib/src/traits.rs @@ -0,0 +1,7 @@ +pub trait FromOptionalUniqueArg { + type Arg; + + fn from_arg(arg: Self::Arg) -> Self + where + Self: Sized; +} diff --git a/external/prisma-client-rust/crates/lib/src/transaction.rs b/external/prisma-client-rust/crates/lib/src/transaction.rs new file mode 100644 index 0000000..ddc90f8 --- /dev/null +++ b/external/prisma-client-rust/crates/lib/src/transaction.rs @@ -0,0 +1,140 @@ +use std::{future::Future, marker::PhantomData}; + +use query_core::{protocol::EngineProtocol, TransactionOptions, TxId}; + +use crate::{ExecutionEngine, PrismaClient, PrismaClientInternals, QueryError}; + +pub struct TransactionBuilder<'a, TClient> { + client: &'a TClient, + internals: &'a PrismaClientInternals, + timeout: u64, + max_wait: u64, + isolation_level: Option, +} + +impl<'a, TClient: PrismaClient> TransactionBuilder<'a, TClient> { + pub fn _new(client: &'a TClient, internals: &'a PrismaClientInternals) -> Self { + Self { + client, + internals, + timeout: 5000, + max_wait: 2000, + isolation_level: None, + } + } + + pub fn with_timeout(self, timeout: u64) -> Self { + Self { timeout, ..self } + } + + pub fn with_max_wait(self, max_wait: u64) -> Self { + Self { max_wait, ..self } + } + + pub fn with_isolation_level(self, isolation_level: impl TransactionIsolationLevel) -> Self { + Self { + isolation_level: Some(isolation_level.to_string()), + ..self + } + } + + pub async fn run(self, tx: TFn) -> Result + where + TFut: Future>, + TFn: FnOnce(TClient) -> TFut, + TErr: From, + { + match &self.internals.engine { + ExecutionEngine::Real { connector, .. } => { + let new_tx_id = connector + .executor + .start_tx( + connector.query_schema.clone(), + EngineProtocol::Graphql, + TransactionOptions::new(self.max_wait, self.timeout, self.isolation_level), + ) + .await + .map_err(|e| QueryError::Execute(e.into()))?; + + match tx(self.client.with_tx_id(Some(new_tx_id.clone()))).await { + result @ Ok(_) => { + connector + .executor + .commit_tx(new_tx_id) + .await + .map_err(|e| QueryError::Execute(e.into()))?; + + result + } + err @ Err(_) => { + connector.executor.rollback_tx(new_tx_id).await.ok(); + + err + } + } + } + _ => tx(self.client.with_tx_id(None)).await, + } + } + + pub async fn begin(self) -> super::Result<(TransactionController, TClient)> { + Ok(match &self.internals.engine { + ExecutionEngine::Real { connector, .. } => { + let new_tx_id = connector + .executor + .start_tx( + connector.query_schema.clone(), + EngineProtocol::Graphql, + TransactionOptions::new(self.max_wait, self.timeout, self.isolation_level), + ) + .await + .map_err(|e| QueryError::Execute(e.into()))?; + + ( + TransactionController::new(new_tx_id.clone()), + self.client.with_tx_id(Some(new_tx_id)), + ) + } + _ => ( + TransactionController::new("".to_string().into()), + self.client.with_tx_id(None), + ), + }) + } +} + +pub struct TransactionController { + tx_id: TxId, + _client: PhantomData, +} + +impl TransactionController { + fn new(tx_id: TxId) -> Self { + Self { + tx_id, + _client: Default::default(), + } + } + + pub async fn commit(self, client: TClient) -> super::Result<()> { + Ok(match &client.internals().engine { + ExecutionEngine::Real { connector, .. } => connector + .executor + .commit_tx(self.tx_id) + .await + .map_err(|e| QueryError::Execute(e.into()))?, + _ => {} + }) + } + + pub async fn rollback(self, client: TClient) -> super::Result<()> { + Ok(match &client.internals().engine { + ExecutionEngine::Real { connector, .. } => { + connector.executor.rollback_tx(self.tx_id).await.ok(); + } + _ => {} + }) + } +} + +pub trait TransactionIsolationLevel: ToString {} diff --git a/external/prisma-client-rust/crates/sdk/Cargo.toml b/external/prisma-client-rust/crates/sdk/Cargo.toml new file mode 100644 index 0000000..203ff61 --- /dev/null +++ b/external/prisma-client-rust/crates/sdk/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "prisma-client-rust-sdk" +version = "0.6.8" +authors = ["Brendan Allan "] +edition = "2021" +rust-version = "1.62" + +[features] +mysql = ["request-handlers/mysql"] +sqlite = ["request-handlers/sqlite"] +mssql = ["request-handlers/mssql"] +postgresql = ["request-handlers/postgresql"] + +mongodb = ["request-handlers/mongodb"] + +sqlite-create-many = ["psl/sqlite-create-many"] + +[dependencies] +serde_json.workspace = true +serde.workspace = true +convert_case = "0.5.0" +serde_path_to_error = "0.1.7" +quote = "1.0.18" +syn = "1.0.91" +proc-macro2 = "1.0.39" +thiserror = "1.0.37" + +prisma-models = { workspace = true } +request-handlers = { workspace = true } +query-core = { workspace = true } +dmmf = { workspace = true } +psl = { workspace = true } diff --git a/external/prisma-client-rust/crates/sdk/example/README.md b/external/prisma-client-rust/crates/sdk/example/README.md new file mode 100644 index 0000000..fecb5ca --- /dev/null +++ b/external/prisma-client-rust/crates/sdk/example/README.md @@ -0,0 +1,17 @@ +## Structure + +#### `lib` + +Library that generated client references to provide additional functionality. + +#### `generator` + +Generator that actually implements the client generation for the corresponding library. + +#### `prisma-cli` + +Binaries that Prisma runs to generate the clients. + +#### `app` + +Binary that consumes the generated clients and does database stuff. diff --git a/external/prisma-client-rust/crates/sdk/example/app/.cargo/config.toml b/external/prisma-client-rust/crates/sdk/example/app/.cargo/config.toml new file mode 100644 index 0000000..75ab991 --- /dev/null +++ b/external/prisma-client-rust/crates/sdk/example/app/.cargo/config.toml @@ -0,0 +1,3 @@ +[alias] +prisma = "run -p sdk-example-prisma-cli --bin sdk-example-prisma --" +custom-generator = "run -p sdk-example-prisma-cli --bin custom-generator --" diff --git a/external/prisma-client-rust/crates/sdk/example/app/Cargo.toml b/external/prisma-client-rust/crates/sdk/example/app/Cargo.toml new file mode 100644 index 0000000..5614158 --- /dev/null +++ b/external/prisma-client-rust/crates/sdk/example/app/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "sdk-example-app" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +prisma-client-rust = { workspace = true, features = ["migrations"] } +sdk-example-lib = { path = "../lib" } +serde = { version = "1.0.145", features = ["derive"] } +tokio = { version = "1.21.2", features = ["macros"] } diff --git a/external/prisma-client-rust/crates/sdk/example/app/prisma/migrations/.gitkeep b/external/prisma-client-rust/crates/sdk/example/app/prisma/migrations/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/external/prisma-client-rust/crates/sdk/example/app/prisma/schema.prisma b/external/prisma-client-rust/crates/sdk/example/app/prisma/schema.prisma new file mode 100644 index 0000000..84dd678 --- /dev/null +++ b/external/prisma-client-rust/crates/sdk/example/app/prisma/schema.prisma @@ -0,0 +1,30 @@ +datasource db { + provider = "sqlite" + url = "file:./dev.db" +} + +generator client { + provider = "cargo prisma" + output = "../src/db.rs" +} + +generator custom_generator { + provider = "cargo custom-generator" + output = "../src/db_custom_generator.rs" + client_path = "db" +} + +model User { + id String @id + displayName String + + posts Post[] +} + +model Post { + id String @id + content String + + user User @relation(fields: [userId], references: [id]) + userId String +} diff --git a/external/prisma-client-rust/crates/sdk/example/app/src/main.rs b/external/prisma-client-rust/crates/sdk/example/app/src/main.rs new file mode 100644 index 0000000..6f9c32e --- /dev/null +++ b/external/prisma-client-rust/crates/sdk/example/app/src/main.rs @@ -0,0 +1,10 @@ +#[allow(warnings, unused)] +mod db; +mod db_custom_generator; + +use db::*; + +#[tokio::main] +async fn main() { + PrismaClient::_builder().build().await.unwrap(); +} diff --git a/external/prisma-client-rust/crates/sdk/example/generator/Cargo.toml b/external/prisma-client-rust/crates/sdk/example/generator/Cargo.toml new file mode 100644 index 0000000..311e8e2 --- /dev/null +++ b/external/prisma-client-rust/crates/sdk/example/generator/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "sdk-example-generator" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at htps://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +prisma-client-rust-sdk = { path = "../.." } +serde = { version = "1.0.145", features = ["derive"] } +thiserror = "1.0.40" diff --git a/external/prisma-client-rust/crates/sdk/example/generator/src/lib.rs b/external/prisma-client-rust/crates/sdk/example/generator/src/lib.rs new file mode 100644 index 0000000..6b48b56 --- /dev/null +++ b/external/prisma-client-rust/crates/sdk/example/generator/src/lib.rs @@ -0,0 +1,72 @@ +use prisma_client_rust_sdk::prelude::*; + +#[derive(serde::Deserialize)] +struct ExampleGenerator { + client_path: String, +} + +#[derive(thiserror::Error, serde::Serialize, Debug)] +#[error("Example Generator Error")] +struct Error; + +impl PrismaGenerator for ExampleGenerator { + const NAME: &'static str = "Example Generator"; + const DEFAULT_OUTPUT: &'static str = "./prisma-example-generator.rs"; + + type Error = Error; + + fn generate(self, args: GenerateArgs) -> Result { + let client_path = ident(&self.client_path); + + let mut module = Module::new( + "", + quote! { + use crate::#client_path as prisma; + }, + ); + + args.schema + .db + .walk_models() + .map(|model| { + let model_name_snake = snake_ident(model.name()); + + let scalar_fields = model + .scalar_fields() + .map(|sf| snake_ident(sf.name()).to_string()); + let relation_fields = model + .relation_fields() + .map(|rf| snake_ident(rf.name()).to_string()); + let id_fields = model + .primary_key() + .map(|pk| pk.fields().map(|f| snake_ident(f.name()).to_string())) + .unwrap(); + + Module::new( + model.name(), + quote! { + use super::prisma; + + impl sdk_example_lib::ExampleTrait for prisma::#model_name_snake::Data { + fn scalar_fields() -> Vec<&'static str> { + vec![#(#scalar_fields),*] + } + fn relation_fields() -> Vec<&'static str> { + vec![#(#relation_fields),*] + } + fn id_fields() -> Vec<&'static str> { + vec![#(#id_fields),*] + } + } + }, + ) + }) + .for_each(|model| module.add_submodule(model)); + + Ok(module) + } +} + +pub fn run() { + ExampleGenerator::run(); +} diff --git a/external/prisma-client-rust/crates/sdk/example/lib/Cargo.toml b/external/prisma-client-rust/crates/sdk/example/lib/Cargo.toml new file mode 100644 index 0000000..3297612 --- /dev/null +++ b/external/prisma-client-rust/crates/sdk/example/lib/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "sdk-example-lib" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/external/prisma-client-rust/crates/sdk/example/lib/src/lib.rs b/external/prisma-client-rust/crates/sdk/example/lib/src/lib.rs new file mode 100644 index 0000000..e3c11f7 --- /dev/null +++ b/external/prisma-client-rust/crates/sdk/example/lib/src/lib.rs @@ -0,0 +1,5 @@ +pub trait ExampleTrait { + fn scalar_fields() -> Vec<&'static str>; + fn relation_fields() -> Vec<&'static str>; + fn id_fields() -> Vec<&'static str>; +} diff --git a/external/prisma-client-rust/crates/sdk/example/prisma-cli/Cargo.toml b/external/prisma-client-rust/crates/sdk/example/prisma-cli/Cargo.toml new file mode 100644 index 0000000..bcbc349 --- /dev/null +++ b/external/prisma-client-rust/crates/sdk/example/prisma-cli/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "sdk-example-prisma-cli" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +prisma-client-rust-cli = { path = "../../../cli", features = [ + "sqlite", + "migrations", +] } +sdk-example-generator = { path = "../generator" } diff --git a/external/prisma-client-rust/crates/sdk/example/prisma-cli/src/bin/custom-generator.rs b/external/prisma-client-rust/crates/sdk/example/prisma-cli/src/bin/custom-generator.rs new file mode 100644 index 0000000..6a8f929 --- /dev/null +++ b/external/prisma-client-rust/crates/sdk/example/prisma-cli/src/bin/custom-generator.rs @@ -0,0 +1,3 @@ +pub fn main() { + sdk_example_generator::run(); +} diff --git a/external/prisma-client-rust/crates/sdk/example/prisma-cli/src/bin/sdk-example-prisma.rs b/external/prisma-client-rust/crates/sdk/example/prisma-cli/src/bin/sdk-example-prisma.rs new file mode 100644 index 0000000..2870f4a --- /dev/null +++ b/external/prisma-client-rust/crates/sdk/example/prisma-cli/src/bin/sdk-example-prisma.rs @@ -0,0 +1,3 @@ +pub fn main() { + prisma_client_rust_cli::run(); +} diff --git a/external/prisma-client-rust/crates/sdk/src/args.rs b/external/prisma-client-rust/crates/sdk/src/args.rs new file mode 100644 index 0000000..1938ecb --- /dev/null +++ b/external/prisma-client-rust/crates/sdk/src/args.rs @@ -0,0 +1,437 @@ +use prisma_models::{walkers::ScalarFieldWalker, FieldArity}; +use psl::{ + builtin_connectors, + datamodel_connector::Connector, + parser_database::{ScalarFieldType, ScalarType}, + ValidatedSchema, +}; +use std::collections::HashSet; + +use dmmf::{DataModelMetaFormat, DmmfInputField, DmmfInputType, DmmfSchema, TypeLocation}; +use proc_macro2::TokenStream; + +use crate::{dmmf::EngineDMMF, prelude::*}; + +pub struct GenerateArgs<'a> { + pub schema: &'a ValidatedSchema, + pub engine_dmmf: EngineDMMF, + pub dmmf: &'a DataModelMetaFormat, + pub read_filters: Vec>, + pub write_params: Vec>, + pub connector: &'static dyn Connector, +} + +impl<'a> GenerateArgs<'a> { + pub fn new( + schema: &'a ValidatedSchema, + dmmf: &'a DataModelMetaFormat, + engine_dmmf: EngineDMMF, + ) -> Self { + let scalars = dmmf + .schema + .input_object_types + .get("prisma") + .unwrap() + .iter() + .flat_map(|scalar| { + scalar.fields.iter().flat_map(|field| { + field.input_types.iter().flat_map(|input| { + matches!(input.location, TypeLocation::Scalar) + .then(|| ScalarType::try_from_str(&input.typ)) + .flatten() + }) + }) + }) + .collect::>(); + + let read_filters = { + let mut filters = vec![]; + + for scalar in &scalars { + let possible_filters = [ + scalar.to_dmmf_string() + "ListFilter", + scalar.to_dmmf_string() + "NullableListFilter", + scalar.to_dmmf_string() + "Filter", + scalar.to_dmmf_string() + "NullableFilter", + ]; + + filters.extend(possible_filters.iter().filter_map(|filter| { + let filter_type = dmmf.schema.find_input_type(&filter)?; + + let mut s = scalar.as_str().to_string(); + + // checking for both is invalid - fields can be list or null but not both + // TODO: make this more typesafe to correspond with fields + if filter_type.name.contains("List") { + s += "List"; + } else if filter_type.name.contains("Nullable") { + s += "Nullable"; + } + + Some(Filter { + name: s, + fields: filter_type.fields.iter().collect(), + }) + })); + } + + for enm in schema.db.walk_enums() { + let possible_filters = [ + "Enum".to_string() + &enm.ast_enum().name.name + "Filter", + "Enum".to_string() + &enm.ast_enum().name.name + "NullableFilter", + ]; + + filters.extend(possible_filters.iter().filter_map(|filter| { + let filter_type = dmmf.schema.find_input_type(&filter)?; + + let mut name = enm.ast_enum().name.name.clone(); + + // checking for both is invalid - fields can be list or null but not both + // TODO: make this more typesafe to correspond with fields + if filter_type.name.contains("List") { + name += "List"; + } else if filter_type.name.contains("Nullable") { + name += "Nullable"; + } + + Some(Filter { + name, + fields: filter_type.fields.iter().collect(), + }) + })); + } + + // for i in 0..dml.models.len() { + // let m = &dml.models[i]; + // let p = + // match schema.find_input_type(&(m.name.to_string() + "OrderByRelevanceInput")) { + // Some(p) => p, + // None => continue, + // }; + + // let mut methods = vec![]; + + // for field in &p.fields { + // if let Some(method) = input_field_as_method(field) { + // methods.push(method); + // } + // } + + // filters.push(Filter { + // name: m.name.clone(), + // methods, + // }); + + // dml.models[i] + // .fields + // .push(Field::ScalarField(ScalarField::new( + // "relevance", + // FieldArity::Optional, + // FieldType::Enum(p.name.clone()), + // ))); + // } + + filters + }; + + let write_filters = { + let mut filters = vec![]; + + filters.extend(scalars.iter().flat_map(|scalar| { + if matches!(scalar, ScalarType::Json) { + return vec![Filter { + name: "Json".to_string(), + fields: vec![], + }]; + } + + let possible_inputs = [ + format!("{}FieldUpdateOperationsInput", scalar.to_dmmf_string()), + format!( + "Nullable{}FieldUpdateOperationsInput", + scalar.to_dmmf_string() + ), + ]; + + possible_inputs + .into_iter() + .filter_map(|input| { + let input_type = dmmf.schema.find_input_type(&input)?; + + let mut s = scalar.as_str().to_string(); + + if input_type.name.contains("List") { + s += "List"; + } else if input_type.name.contains("Nullable") { + s += "Nullable"; + } + + Some(Filter { + name: s, + fields: input_type + .fields + .iter() + .filter_map(|field| { + field.input_types.iter().find(|input_type| match input_type + .location + { + TypeLocation::Scalar if input_type.typ != "Null" => true, + _ => false, + })?; + + Some(field) + }) + .collect(), + }) + }) + .collect() + })); + + filters.extend(schema.db.walk_enums().flat_map(|enm| { + let possible_inputs = [ + format!("Enum{}FieldUpdateOperationsInput", enm.name()), + format!("NullableEnum{}FieldUpdateOperationsInput", enm.name()), + ]; + + possible_inputs.into_iter().filter_map(move |input| { + let input_type = dmmf.schema.find_input_type(&input)?; + + let mut name = enm.name().to_string(); + + if input_type.name.contains("List") { + name += "List"; + } else if input_type.name.contains("Nullable") { + name += "Nullable"; + } + + Some(Filter { + name, + fields: input_type + .fields + .iter() + .filter_map(|field| { + field.input_types.iter().find(|input_type| { + match input_type.location { + TypeLocation::Scalar if input_type.typ != "Null" => true, + _ => true, + } + })?; + + Some(field) + }) + .collect(), + }) + }) + })); + + filters.extend(schema.db.walk_models().flat_map(|model| { + model + .fields() + .filter_map(|field| { + let input_type = dmmf.schema.find_input_type(&format!( + "{}Update{}Input", + model.name(), + field.name() + ))?; + + let mut fields = vec![]; + + let scalar_name = { + let mut scalar_name = None; + + fields.extend(input_type.fields.iter().filter_map(|field| { + if field.name == "set" { + for input_type in &field.input_types { + match input_type.location { + TypeLocation::Scalar if input_type.typ != "null" => { + scalar_name = Some(input_type.typ.clone() + "List"); + } + _ => {} + } + } + } + + field + .input_types + .iter() + .find(|input_type| match input_type.location { + TypeLocation::Scalar if input_type.typ != "null" => true, + _ => false, + }) + .map(|_| field) + })); + + scalar_name + }?; + + Some(Filter { + name: scalar_name, + fields, + }) + }) + .collect::>() + })); + + filters + }; + + use builtin_connectors::*; + let connector = match &engine_dmmf.datasources[0].provider { + #[cfg(feature = "sqlite")] + p if SQLITE.is_provider(p) => SQLITE, + #[cfg(feature = "postgresql")] + p if POSTGRES.is_provider(p) => POSTGRES, + #[cfg(feature = "postgresql")] + p if COCKROACH.is_provider(p) => COCKROACH, + #[cfg(feature = "mssql")] + p if MSSQL.is_provider(p) => MSSQL, + #[cfg(feature = "mysql")] + p if MYSQL.is_provider(p) => MYSQL, + #[cfg(feature = "mongodb")] + p if MONGODB.is_provider(p) => MONGODB, + p => panic!( + "Database provider {p} is not available. Have you enabled its Cargo.toml feature?" + ), + }; + + Self { + schema, + dmmf, + engine_dmmf, + read_filters, + write_params: write_filters, + connector, + } + } + + pub fn read_filter(&self, field: ScalarFieldWalker) -> Option<&Filter> { + let postfix = match field.ast_field().arity { + FieldArity::List => "List", + FieldArity::Optional => "Nullable", + _ => "", + }; + + let base = match field.scalar_field_type() { + ScalarFieldType::BuiltInScalar(typ) => typ.as_str(), + ScalarFieldType::Enum(e) => field.db.walk(e).name(), + _ => return None, + }; + + self.read_filters + .iter() + .find(|f| f.name == format!("{base}{postfix}")) + } + + pub fn write_param(&self, field: ScalarFieldWalker) -> Option<&Filter> { + let postfix = match field.ast_field().arity { + FieldArity::List => "List", + FieldArity::Optional => "Nullable", + _ => "", + }; + + let base = match field.scalar_field_type() { + ScalarFieldType::BuiltInScalar(typ) => typ.as_str(), + ScalarFieldType::Enum(e) => field.db.walk(e).name(), + _ => return None, + }; + + self.write_params + .iter() + .find(|f| f.name == format!("{base}{postfix}")) + } +} + +pub trait DmmfSchemaExt { + fn find_input_type(&self, name: &str) -> Option<&DmmfInputType>; +} + +impl DmmfSchemaExt for DmmfSchema { + fn find_input_type(&self, name: &str) -> Option<&DmmfInputType> { + self.input_object_types + .get("prisma") + .and_then(|t| t.iter().find(|i| i.name == name)) + } +} + +pub trait DmmfInputFieldExt { + fn arity(&self) -> FieldArity; + fn type_tokens(&self, prefix: &TokenStream) -> TokenStream; + fn to_prisma_value(&self, var: &Ident) -> TokenStream; +} + +impl DmmfInputFieldExt for DmmfInputField { + fn arity(&self) -> FieldArity { + let input_type = self + .input_types + .iter() + .find(|typ| !matches!(typ.location, TypeLocation::Scalar if typ.typ == "Null")) + .expect(&format!("No type found for field {}", self.name)); + + if input_type.is_list { + FieldArity::List + } else if self.is_nullable { + FieldArity::Optional + } else { + FieldArity::Required + } + } + + fn type_tokens(&self, prefix: &TokenStream) -> TokenStream { + let input_type = self + .input_types + .iter() + .find(|typ| !matches!(typ.location, TypeLocation::Scalar if typ.typ == "Null")) + .expect(&format!("No type found for field {}", self.name)); + + let arity = self.arity(); + + match input_type.location { + TypeLocation::Scalar => arity.wrap_type( + &ScalarType::try_from_str(&input_type.typ) + .unwrap() + .to_tokens(), + ), + TypeLocation::EnumTypes => { + let typ: TokenStream = input_type.typ.parse().unwrap(); + arity.wrap_type("e!(#prefix #typ)) + } + TypeLocation::InputObjectTypes => { + let typ: TokenStream = input_type.typ.parse().unwrap(); + quote!(Vec<#prefix #typ>) + } + _ => todo!(), + } + } + + fn to_prisma_value(&self, var: &Ident) -> TokenStream { + let pv = quote!(::prisma_client_rust::PrismaValue); + + let input_type = self + .input_types + .iter() + .find(|typ| !matches!(typ.location, TypeLocation::Scalar if typ.typ == "Null")) + .expect(&format!("No type found for field {}", self.name)); + + let arity = self.arity(); + + match input_type.location { + TypeLocation::Scalar => arity.wrap_pv( + var, + ScalarType::try_from_str(&input_type.typ) + .unwrap() + .to_prisma_value(var), + ), + TypeLocation::EnumTypes => arity.wrap_pv(var, quote!(#pv::Enum(#var.to_string()))), + TypeLocation::InputObjectTypes => { + quote!(#pv::Object(#var.into_iter().map(Into::into).collect())) + } + _ => todo!(), + } + } +} + +#[derive(Debug)] +pub struct Filter<'a> { + pub name: String, + pub fields: Vec<&'a DmmfInputField>, +} diff --git a/external/prisma-client-rust/crates/sdk/src/casing.rs b/external/prisma-client-rust/crates/sdk/src/casing.rs new file mode 100644 index 0000000..6c948ae --- /dev/null +++ b/external/prisma-client-rust/crates/sdk/src/casing.rs @@ -0,0 +1,34 @@ +pub use convert_case::Case; + +use crate::keywords::KEYWORDS; + +pub trait Casing { + fn to_case(&self, case: Case, raw: bool) -> String; +} + +impl + convert_case::Casing> Casing for T +where + String: PartialEq, +{ + fn to_case(&self, case: Case, raw: bool) -> String { + let this = self.as_ref(); + + let starts_with_underscore = this.starts_with('_'); + let ends_with_underscore = this.ends_with('_') && this.len() >= 2; + + let body = &this[0..this.len() - if ends_with_underscore { 1 } else { 0 }]; + + let cased = format!( + "{}{}{}", + if starts_with_underscore { "_" } else { "" }, + convert_case::Casing::to_case(&body, case), + if ends_with_underscore { "_" } else { "" } + ); + + if !raw && KEYWORDS.iter().any(|k| k == &cased) { + format!("r#{cased}") + } else { + cased + } + } +} diff --git a/external/prisma-client-rust/crates/sdk/src/dmmf.rs b/external/prisma-client-rust/crates/sdk/src/dmmf.rs new file mode 100644 index 0000000..3396f28 --- /dev/null +++ b/external/prisma-client-rust/crates/sdk/src/dmmf.rs @@ -0,0 +1,54 @@ +use serde::{Deserialize, Serialize}; +use serde_json::Map; + +/// Provided by Prisma CLI to generators +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct EngineDMMF { + pub generator: Generator, + pub schema_path: String, + pub datamodel: String, + pub datasources: Vec, +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct Generator { + pub provider: EnvValue, + pub output: EnvValue, + pub name: String, + #[serde(default)] + pub is_custom_output: bool, + pub preview_features: Vec, + pub config: Map, +} + +#[derive(Serialize, Deserialize, Debug)] +#[serde(rename_all = "camelCase")] +pub struct Datasource { + pub name: String, + pub provider: String, + pub url: EnvValue, +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct EnvValue { + from_env_var: Option, + value: Option, +} + +impl EnvValue { + pub fn get_value(&self) -> String { + self.from_env_var + .as_ref() + .and_then(|o| match o.as_str() { + // dmmf is cringe apparently? + "null" => None, + env_var => { + Some(std::env::var(env_var).expect(&format!("env var {env_var} not found"))) + } + }) + .unwrap_or_else(|| self.value.clone().expect("value not found")) + } +} diff --git a/external/prisma-client-rust/crates/sdk/src/extensions.rs b/external/prisma-client-rust/crates/sdk/src/extensions.rs new file mode 100644 index 0000000..80d9ba6 --- /dev/null +++ b/external/prisma-client-rust/crates/sdk/src/extensions.rs @@ -0,0 +1,311 @@ +use dmmf::{DmmfTypeReference, TypeLocation}; +use prisma_models::walkers::{ + CompositeTypeFieldWalker, FieldWalker, ModelWalker, RefinedFieldWalker, ScalarFieldWalker, +}; +use prisma_models::FieldArity; +use psl::parser_database::{ParserDatabase, ScalarFieldType, ScalarType}; + +use crate::prelude::*; + +pub trait ModelExt<'a> { + fn scalar_field_has_relation(self, scalar: ScalarFieldWalker) -> bool; + fn required_scalar_fields(self) -> Vec>; +} + +impl<'a> ModelExt<'a> for ModelWalker<'a> { + fn scalar_field_has_relation(self, scalar: ScalarFieldWalker) -> bool { + self.relation_fields().any(|relation_field| { + relation_field + .fields() + .map(|mut fields| fields.any(|f| f.field_id() == scalar.field_id())) + .unwrap_or(false) + }) + } + + fn required_scalar_fields(self) -> Vec> { + self.fields() + .filter(|&f| { + f.required_on_create() && matches!(f.refine(), RefinedFieldWalker::Relation(_)) + }) + .collect() + } +} + +pub trait FieldExt<'a> { + fn type_tokens(self, prefix: &TokenStream) -> Option; + + fn type_prisma_value(self, var: &Ident) -> Option; + + fn relation_methods(self) -> &'static [&'static str]; + + fn required_on_create(self) -> bool; +} + +impl<'a> FieldExt<'a> for FieldWalker<'a> { + fn type_tokens(self, prefix: &TokenStream) -> Option { + match self.refine() { + RefinedFieldWalker::Scalar(scalar_field) => scalar_field.scalar_field_type().to_tokens( + prefix, + &self.ast_field().arity, + &self.db, + ), + RefinedFieldWalker::Relation(relation_field) => { + let related_model_name_snake = snake_ident(relation_field.related_model().name()); + + Some( + self.ast_field() + .arity + .wrap_type("e!(#prefix::#related_model_name_snake::Data)), + ) + } + } + } + + fn type_prisma_value(self, var: &Ident) -> Option { + match self.refine() { + RefinedFieldWalker::Scalar(scalar_field) => scalar_field.type_prisma_value(var), + RefinedFieldWalker::Relation(_) => None, + } + } + + fn relation_methods(self) -> &'static [&'static str] { + if self.ast_field().arity.is_list() { + &["some", "every", "none"] + } else { + &["is", "is_not"] + } + } + + fn required_on_create(self) -> bool { + self.ast_field().arity.is_required() + && match self.refine() { + RefinedFieldWalker::Scalar(scalar_field) => scalar_field.required_on_create(), + RefinedFieldWalker::Relation(_) => true, + } + } +} + +impl<'a> FieldExt<'a> for CompositeTypeFieldWalker<'a> { + fn type_tokens(self, prefix: &TokenStream) -> Option { + self.r#type().to_tokens(prefix, &self.arity(), &self.db) + } + + fn type_prisma_value(self, var: &Ident) -> Option { + self.r#type().to_prisma_value(var, &self.arity()) + } + + fn relation_methods(self) -> &'static [&'static str] { + todo!() + } + + fn required_on_create(self) -> bool { + self.ast_field().arity.is_required() && self.default_value().is_none() + } +} + +pub trait FieldArityExt { + fn wrap_type(&self, ty: &TokenStream) -> TokenStream; + + fn wrap_pv(&self, var: &Ident, pv: TokenStream) -> TokenStream; +} + +impl FieldArityExt for FieldArity { + fn wrap_type(&self, ty: &TokenStream) -> TokenStream { + match self { + FieldArity::List => quote!(Vec<#ty>), + FieldArity::Optional => quote!(Option<#ty>), + FieldArity::Required => quote!(#ty), + } + } + + fn wrap_pv(&self, var: &Ident, value: TokenStream) -> TokenStream { + let pv = quote!(::prisma_client_rust::PrismaValue); + + match self { + FieldArity::List => { + quote!(#pv::List(#var.into_iter().map(|#var| #value).collect())) + } + FieldArity::Optional => { + quote!(#var.map(|#var| #value).unwrap_or_else(|| #pv::Null)) + } + FieldArity::Required => value, + } + } +} + +pub trait ScalarFieldWalkerExt { + fn is_in_required_relation(&self) -> bool; +} + +impl<'a> ScalarFieldWalkerExt for ScalarFieldWalker<'a> { + fn is_in_required_relation(&self) -> bool { + self.model().relation_fields().any(|relation_field| { + relation_field + .fields() + .map(|mut fields| fields.any(|sf| sf.field_id() == self.field_id())) + .unwrap_or(false) + }) + } +} + +impl<'a> FieldExt<'a> for ScalarFieldWalker<'a> { + fn type_tokens(self, prefix: &TokenStream) -> Option { + self.scalar_field_type() + .to_tokens(prefix, &self.ast_field().arity, self.db) + } + + fn type_prisma_value(self, var: &Ident) -> Option { + self.scalar_field_type() + .to_prisma_value(var, &self.ast_field().arity) + } + + fn relation_methods(self) -> &'static [&'static str] { + &[] + } + + fn required_on_create(self) -> bool { + self.ast_field().arity.is_required() + && !self.is_updated_at() + && self.default_value().is_none() + } +} + +pub trait ScalarFieldTypeExt { + fn to_tokens( + &self, + prefix: &TokenStream, + arity: &FieldArity, + db: &ParserDatabase, + ) -> Option; + fn to_prisma_value(&self, var: &Ident, arity: &FieldArity) -> Option; +} + +impl ScalarFieldTypeExt for ScalarFieldType { + fn to_tokens( + &self, + prefix: &TokenStream, + arity: &FieldArity, + db: &ParserDatabase, + ) -> Option { + let base = match *self { + Self::Enum(id) => { + let name = pascal_ident(db.walk(id).name()); + quote!(#prefix #name) + } + Self::BuiltInScalar(typ) => typ.to_tokens(), + Self::Unsupported(_) => return None, + Self::CompositeType(id) => { + let name = snake_ident(db.walk(id).name()); + quote!(#prefix #name::Data) + } + }; + + Some(arity.wrap_type(&base)) + } + + fn to_prisma_value(&self, var: &Ident, arity: &FieldArity) -> Option { + let pv = quote!(::prisma_client_rust::PrismaValue); + + let scalar_converter = match self { + Self::BuiltInScalar(typ) => typ.to_prisma_value(&var), + Self::Enum(_) => quote!(#pv::Enum(#var.to_string())), + Self::Unsupported(_) => return None, + Self::CompositeType(_) => quote!(#pv::Object(vec![])), + }; + + Some(arity.wrap_pv(&var, scalar_converter)) + } +} + +pub trait ScalarTypeExt { + fn to_tokens(&self) -> TokenStream; + fn to_prisma_value(&self, var: &Ident) -> TokenStream; + fn to_dmmf_string(&self) -> String; +} + +impl ScalarTypeExt for ScalarType { + fn to_tokens(&self) -> TokenStream { + let ident = format_ident!("{}", self.as_str()); + + quote!(#ident) + } + + fn to_prisma_value(&self, var: &Ident) -> TokenStream { + let pcr = quote!(::prisma_client_rust); + let v = quote!(#pcr::PrismaValue); + + match self { + ScalarType::Int => quote!(#v::Int(#var)), + ScalarType::BigInt => quote!(#v::BigInt(#var)), + ScalarType::Float => quote!(#v::Float(#var)), + ScalarType::Decimal => quote!(#v::String(#var.to_string())), + ScalarType::Boolean => quote!(#v::Boolean(#var)), + ScalarType::String => quote!(#v::String(#var)), + ScalarType::Json => quote!(#v::Json(#pcr::serde_json::to_string(&#var).unwrap())), + ScalarType::DateTime => quote!(#v::DateTime(#var)), + ScalarType::Bytes => quote!(#v::Bytes(#var)), + } + } + + fn to_dmmf_string(&self) -> String { + match self { + Self::Boolean => "Bool".to_string(), + _ => self.as_str().to_string(), + } + } +} + +pub trait DmmfTypeReferenceExt { + fn to_tokens( + &self, + prefix: &TokenStream, + arity: &FieldArity, + db: &ParserDatabase, + ) -> Option; +} + +impl DmmfTypeReferenceExt for DmmfTypeReference { + fn to_tokens( + &self, + prefix: &TokenStream, + arity: &FieldArity, + db: &ParserDatabase, + ) -> Option { + Some(match self.location { + TypeLocation::Scalar => { + ScalarFieldType::BuiltInScalar(ScalarType::try_from_str(&self.typ).unwrap()) + .to_tokens(prefix, arity, db)? + } + TypeLocation::EnumTypes => { + let enum_name_pascal = pascal_ident(&self.typ); + quote!(#prefix #enum_name_pascal) + } + TypeLocation::InputObjectTypes => { + let typ = match &self.typ { + t if t.ends_with("OrderByWithRelationInput") => { + let model_name = t.replace("OrderByWithRelationInput", ""); + let model_name_snake = snake_ident(&model_name); + + quote!(#model_name_snake::OrderByWithRelationParam) + } + t if t.ends_with("OrderByRelationAggregateInput") => { + let model_name = t.replace("OrderByRelationAggregateInput", ""); + let model_name_snake = snake_ident(&model_name); + + quote!(#model_name_snake::OrderByRelationAggregateParam) + } + t if t.ends_with("OrderByInput") => { + let model_name = t.replace("OrderByInput", ""); + let model_name_snake = snake_ident(&model_name); + + quote!(#model_name_snake::OrderByParam) + } + _ => return None, + }; + + quote!(Vec<#prefix #typ>) + } + _ => return None, + }) + } +} diff --git a/external/prisma-client-rust/crates/sdk/src/jsonrpc.rs b/external/prisma-client-rust/crates/sdk/src/jsonrpc.rs new file mode 100644 index 0000000..b4cc755 --- /dev/null +++ b/external/prisma-client-rust/crates/sdk/src/jsonrpc.rs @@ -0,0 +1,41 @@ +use serde::{Deserialize, Serialize}; +use serde_json::Value; +use std::default::Default; + +#[derive(Serialize, Deserialize, Default)] +#[serde(rename_all = "camelCase")] +pub struct Manifest { + pub pretty_name: String, + pub default_output: String, + pub denylist: Option>, + pub requires_generators: Option>, + pub requires_engines: Option>, +} + +#[derive(Serialize, Deserialize)] +pub struct ManifestResponse { + pub manifest: Manifest, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct Request { + pub jsonrpc: String, + pub id: i32, + pub method: String, + pub params: Value, +} + +#[derive(Serialize, Deserialize, Debug)] +#[serde(rename_all = "camelCase")] +pub enum ResponseData { + Result(Value), + Error { code: i32, message: String }, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct Response { + pub jsonrpc: String, + pub id: i32, + #[serde(flatten)] + pub data: ResponseData, +} diff --git a/external/prisma-client-rust/crates/sdk/src/keywords.rs b/external/prisma-client-rust/crates/sdk/src/keywords.rs new file mode 100644 index 0000000..8cad681 --- /dev/null +++ b/external/prisma-client-rust/crates/sdk/src/keywords.rs @@ -0,0 +1,57 @@ +pub const KEYWORDS: &'static [&'static str] = &[ + "as", + "break", + "const", + "continue", + "crate", + "else", + "enum", + "extern", + "false", + "fn", + "for", + "if", + "impl", + "in", + "let", + "loop", + "match", + "mod", + "move", + "mut", + "pub", + "ref", + "return", + "self", + "Self", + "static", + "struct", + "super", + "trait", + "true", + "type", + "unsafe", + "use", + "where", + "while", + "async", + "await", + "dyn", + "abstract", + "become", + "box", + "do", + "final", + "macro", + "override", + "priv", + "typeof", + "unsized", + "virtual", + "yield", + "try", + "macro_rules", + "union", + "'static", + "dyn", +]; diff --git a/external/prisma-client-rust/crates/sdk/src/lib.rs b/external/prisma-client-rust/crates/sdk/src/lib.rs new file mode 100644 index 0000000..2260b4b --- /dev/null +++ b/external/prisma-client-rust/crates/sdk/src/lib.rs @@ -0,0 +1,170 @@ +#![allow( + ambiguous_glob_reexports, + ambiguous_glob_imports, + unused_variables, + unreachable_code, + unused_imports +)] + +mod args; +mod casing; +pub mod dmmf; +mod extensions; +mod jsonrpc; +mod keywords; +mod runtime; +mod shared_config; +mod utils; + +use std::path::{Path, PathBuf}; + +use proc_macro2::TokenStream; +use serde::{de::DeserializeOwned, Serialize}; +use serde_json::{Map, Value}; +use thiserror::Error; + +use runtime::GeneratorMetadata; + +pub use args::GenerateArgs; +pub use casing::*; +pub use extensions::*; +pub use quote::quote; + +use crate::prelude::snake_ident; + +pub mod prisma { + pub use dmmf; + pub use prisma_models; + pub use psl; + pub use query_core; + pub use request_handlers; +} + +pub mod prelude { + pub use super::{args::*, prisma::*, *}; + pub use proc_macro2::*; + pub use quote::*; + pub use syn::{ + parse::{Parse, ParseStream}, + Ident, + }; + + pub fn ident(name: &str) -> Ident { + format_ident!("{name}") + } + + pub fn snake_ident(name: &str) -> Ident { + format_ident!("{}", name.to_case(Case::Snake, false)) + } + + pub fn snake_ident_raw(name: &str) -> Ident { + format_ident!("{}", name.to_case(Case::Snake, true)) + } + + pub fn pascal_ident(name: &str) -> Ident { + format_ident!("{}", name.to_case(Case::Pascal, false)) + } +} + +pub type GenerateFn = fn(GenerateArgs, Map) -> GenerateResult; +pub type GenerateResult = Result; + +#[derive(Debug, Error)] +pub enum GeneratorError { + #[error("Schema contains invalid names \n{0}")] + ReservedNames(String), + #[error("Failed to create client file: {0}")] + FileCreate(std::io::Error), + #[error("Failed to write generated client to file: {0}")] + FileWrite(std::io::Error), + #[error("Failed to deserialize generator arguments: {0}")] + ArgDeserialize(serde_json::Error), + #[error("Generator {name} failed: \n{message}")] + InternalError { name: &'static str, message: String }, +} + +pub struct Module { + pub name: String, + pub contents: TokenStream, + pub submodules: Vec, +} + +impl Module { + pub fn new(name: &str, contents: TokenStream) -> Self { + Self { + name: name.to_string(), + contents, + submodules: vec![], + } + } + + pub fn add_submodule(&mut self, submodule: Module) { + self.submodules.push(submodule); + } + + pub fn flatten(&self) -> TokenStream { + let contents = &self.contents; + + let submodule_contents = self + .submodules + .iter() + .map(|sm| { + let name = snake_ident(&sm.name); + let contents = sm.flatten(); + + quote! { + pub mod #name { + #contents + } + } + }) + .collect::>(); + + quote! { + #contents + + #(#submodule_contents)* + } + } + + pub fn get_all_paths(&self, parent_path: &Path) -> Vec { + if self.submodules.len() > 0 { + [parent_path.join("mod.rs")] + .into_iter() + .chain(self.submodules.iter().flat_map(|sm| { + sm.get_all_paths(&parent_path.join(&sm.name.to_case(Case::Snake, true))) + })) + .collect() + } else { + vec![parent_path.with_extension("rs")] + } + } +} + +pub trait PrismaGenerator: DeserializeOwned { + const NAME: &'static str; + const DEFAULT_OUTPUT: &'static str; + + type Error: Serialize + std::error::Error; + + fn generate(self, args: GenerateArgs) -> Result; + + fn erased_generate(args: GenerateArgs, config: Map) -> GenerateResult + where + Self: Sized, + { + let generator = serde_json::from_value::(Value::Object(config)) + .map_err(GeneratorError::ArgDeserialize)?; + + generator + .generate(args) + .map_err(|e| GeneratorError::InternalError { + name: Self::NAME, + message: e.to_string(), + }) + } + + fn run() { + GeneratorMetadata::new(Self::erased_generate, Self::NAME, Self::DEFAULT_OUTPUT).run(); + } +} diff --git a/external/prisma-client-rust/crates/sdk/src/runtime.rs b/external/prisma-client-rust/crates/sdk/src/runtime.rs new file mode 100644 index 0000000..d260c8f --- /dev/null +++ b/external/prisma-client-rust/crates/sdk/src/runtime.rs @@ -0,0 +1,189 @@ +use std::{ + fs::{self, remove_dir_all, File}, + io::{stderr, stdin, BufRead, BufReader, Write}, + path::Path, + sync::Arc, +}; + +use crate::{ + prelude::*, + shared_config::{ClientFormat, SharedConfig}, +}; + +use dmmf::from_precomputed_parts; +use query_core::schema; + +use crate::{ + args::GenerateArgs, dmmf::EngineDMMF, jsonrpc, utils::rustfmt, GenerateFn, GeneratorError, +}; + +pub struct GeneratorMetadata { + generate_fn: GenerateFn, + name: &'static str, + default_output: &'static str, +} + +impl GeneratorMetadata { + pub fn new(generate_fn: GenerateFn, name: &'static str, default_output: &'static str) -> Self { + Self { + generate_fn, + name, + default_output, + } + } + + pub fn run(self) { + loop { + let mut content = String::new(); + BufReader::new(stdin()) + .read_line(&mut content) + .expect("Failed to read engine output"); + + let input: jsonrpc::Request = + serde_json::from_str(&content).expect("Failed to marshal jsonrpc input"); + + let data = match input.method.as_str() { + "getManifest" => jsonrpc::ResponseData::Result( + serde_json::to_value(jsonrpc::ManifestResponse { + manifest: jsonrpc::Manifest { + default_output: self.default_output.to_string(), + pretty_name: self.name.to_string(), + ..Default::default() + }, + }) + .expect("Failed to convert manifest to json"), // literally will never fail + ), + "generate" => { + let params_str = input.params.to_string(); + + let deserializer = &mut serde_json::Deserializer::from_str(¶ms_str); + + let dmmf = serde_path_to_error::deserialize(deserializer) + .expect("Failed to deserialize DMMF from Prisma engines"); + + match self.generate(dmmf) { + Ok(_) => jsonrpc::ResponseData::Result(serde_json::Value::Null), + Err(e) => jsonrpc::ResponseData::Error { + code: 0, + message: e.to_string(), + }, + } + } + method => jsonrpc::ResponseData::Error { + code: 0, + message: format!("{} cannot handle method {}", self.name, method), + }, + }; + + let response = jsonrpc::Response { + jsonrpc: "2.0".to_string(), + id: input.id, + data, + }; + + let mut bytes = + serde_json::to_vec(&response).expect("Failed to marshal json data for reply"); + + bytes.push(b'\n'); + + stderr() + .by_ref() + .write(bytes.as_ref()) + .expect("Failed to write output to stderr for Prisma engines"); + + if input.method.as_str() == "generate" { + break; + } + } + } + + fn generate(&self, engine_dmmf: EngineDMMF) -> Result<(), GeneratorError> { + let schema = Arc::new( + psl::parse_schema(engine_dmmf.datamodel.as_str()) + .expect("Datamodel is invalid after being verified by CLI?!"), + ); + let query_schema = Arc::new(schema::build(schema.clone(), true)); + let dmmf = from_precomputed_parts(&query_schema); + + let output_str = engine_dmmf.generator.output.get_value(); + let root_output_path = Path::new(&output_str); + + let config = engine_dmmf.generator.config.clone(); + + let shared_config: SharedConfig = + serde_json::from_value(serde_json::Value::Object(config.clone())).unwrap(); + + match shared_config.client_format { + ClientFormat::Folder if root_output_path.extension().is_some() => { + panic!("The output path must be a directory when using the folder format.") + } + ClientFormat::File if root_output_path.extension().is_none() => { + panic!("The output path must be a file when using the file format.") + } + _ => {} + } + + let root_module = + (self.generate_fn)(GenerateArgs::new(&schema, &dmmf, engine_dmmf), config)?; + + remove_dir_all(root_output_path).ok(); + + let header = format!("// File generated by {}. DO NOT EDIT\n\n", self.name); + + match shared_config.client_format { + ClientFormat::Folder => { + write_module_to_file(&root_module, root_output_path, &header); + } + ClientFormat::File => write_to_file(&root_module.flatten(), root_output_path, &header), + } + + rustfmt(&root_module.get_all_paths(root_output_path)); + + Ok(()) + } +} + +fn write_module_to_file(module: &Module, parent_path: &Path, header: &str) { + if module.submodules.len() > 0 { + for child in &module.submodules { + write_module_to_file( + child, + &parent_path.join(&child.name.to_case(Case::Snake, true)), + header, + ); + } + + let contents = &module.contents; + let submodule_decls = module.submodules.iter().map(|sm| { + let name = snake_ident(&sm.name); + quote!(pub mod #name;) + }); + + write_to_file( + "e! { + #(#submodule_decls)* + + #contents + }, + &parent_path.join("mod.rs"), + header, + ); + } else { + write_to_file(&module.contents, &parent_path.with_extension("rs"), header); + } +} + +fn write_to_file(contents: &TokenStream, path: &Path, header: &str) { + let mut file = create_generated_file(path).unwrap(); + + file.write((header.to_string() + &contents.to_string()).as_bytes()) + .unwrap(); +} + +fn create_generated_file(path: &Path) -> Result { + if let Some(parent) = path.parent() { + fs::create_dir_all(parent).map_err(GeneratorError::FileCreate)?; + } + + File::create(&path).map_err(GeneratorError::FileCreate) +} diff --git a/external/prisma-client-rust/crates/sdk/src/shared_config.rs b/external/prisma-client-rust/crates/sdk/src/shared_config.rs new file mode 100644 index 0000000..4b41adc --- /dev/null +++ b/external/prisma-client-rust/crates/sdk/src/shared_config.rs @@ -0,0 +1,15 @@ +use serde::Deserialize; + +#[derive(Default, Deserialize)] +#[serde(rename_all = "camelCase")] +pub enum ClientFormat { + #[default] + File, + Folder, +} + +#[derive(Deserialize)] +pub struct SharedConfig { + #[serde(default)] + pub client_format: ClientFormat, +} diff --git a/external/prisma-client-rust/crates/sdk/src/utils.rs b/external/prisma-client-rust/crates/sdk/src/utils.rs new file mode 100644 index 0000000..9f6e6eb --- /dev/null +++ b/external/prisma-client-rust/crates/sdk/src/utils.rs @@ -0,0 +1,9 @@ +use std::{path::PathBuf, process::Command}; + +pub fn rustfmt(paths: &[PathBuf]) { + Command::new("rustfmt") + .arg("--edition=2021") + .args(paths.iter().map(|p| p.to_str().unwrap())) + .output() + .ok(); +} diff --git a/external/prisma-client-rust/docs/next-env.d.ts b/external/prisma-client-rust/docs/next-env.d.ts new file mode 100644 index 0000000..4f11a03 --- /dev/null +++ b/external/prisma-client-rust/docs/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/external/prisma-client-rust/docs/next.config.js b/external/prisma-client-rust/docs/next.config.js new file mode 100644 index 0000000..2b9220a --- /dev/null +++ b/external/prisma-client-rust/docs/next.config.js @@ -0,0 +1,6 @@ +const withNextra = require("nextra")({ + theme: "nextra-theme-docs", + themeConfig: "./theme.config.tsx", +}); + +module.exports = withNextra(); diff --git a/external/prisma-client-rust/docs/package.json b/external/prisma-client-rust/docs/package.json new file mode 100644 index 0000000..475bbef --- /dev/null +++ b/external/prisma-client-rust/docs/package.json @@ -0,0 +1,28 @@ +{ + "name": "docs-new", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "vercel-build": "next build", + "dev": "next" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "next": "^13.4.13", + "nextra": "^2.10.0", + "nextra-theme-docs": "^2.10.0", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/node": "^18.17.4", + "autoprefixer": "^10.4.14", + "postcss": "^8.4.27", + "tailwindcss": "^3.3.3", + "typescript": "4.9.5" + } +} diff --git a/external/prisma-client-rust/docs/pages/0.6.0-migration.md b/external/prisma-client-rust/docs/pages/0.6.0-migration.md new file mode 100644 index 0000000..17a5e06 --- /dev/null +++ b/external/prisma-client-rust/docs/pages/0.6.0-migration.md @@ -0,0 +1,113 @@ +# 0.6.0 Migration + +Version 0.6.0 introduced a number of [breaking changes](https://github.com/Brendonovich/prisma-client-rust/releases/tag/0.6.0#breaking-changes), +here's how to update your project to work properly. + +## Remove required field specifiers in `create` + +```rust +// Before +client + .user() + .create(user::name::set("Brendan".to_string()), vec![]) +client + .post() + .create(post::author::link(user::id::equals(0)), vec![]) + +// After +client + .user() + .create("Brendan".to_string(), vec![]) +client + .post() + .create(user::id::equals(0), vec![]) +``` + +## Use dedicated `update` and `delete` actions + +```rust +// Before +client + .user() + .find_unique(user::id::equals(0)) + .update(vec![]) +client + .user() + .find_unique(user::id::equals(0)) + .delete() + +// After +client + .user() + .update(user::id::equals(0), vec![]) +client + .user() + .delete(user::id::equals(0)) +``` + +The pattern also applies to `update_many` and `delete_many`: + +```rust +// Before +client + .user() + .find_many(vec![user::name::contains("Brendan".to_string())]) + .update(vec![]) +client + .user() + .find_many(vec![user::name::contains("Brendan".to_string())]) + .delete() + +// After +client + .user() + .update_many(vec![user::name::contains("Brendan".to_string())], vec![]) +client + .user() + .delete_many(vec![user::name::contains("Brendan".to_string())]) +``` + +## Use `connect`/`disconnect` + +The `link` and `unlink` relation field functions have been renamed to `connect` and `disconnect` respectively. + +## Use `equals` instead of `cursor` field function + +The `cursor` builder function now accepts a `UniqueWhereParam`, +so anywhere that the `cursor` field function was used can be replaced with `equals`. + +```rust +// Before +client + .user() + .find_many(vec![]) + .cursor(user::id::cursor(0)) + +// After +client + .user() + .find_many(vec![]) + .cursor(user::id::equals(0)) +``` + +## Use `QueryError` type + +`prisma_client_rust::queries::Error` has been renamed and made accessible as `prisma_client_rust::QueryError`. +Additionally, the `error_is_type` function has been moved to `QueryError::is_prisma_error`. + +## Remove `Option` handling for `update` and `delete` + +`update` and `delete` now return an error instead of an `Option` if no record is found. +This behaviour is inline with the official Prisma client. + +## Update error handling for relation accessors + +Relation accessors no longer produce string errors, but have a dedicated `prisma_client_rust::RelationNotFetchedError` type. + +## Use feature resolver version 2 + +If you are not using a workspace, set `edition = "2021"` in your `Cargo.toml`. + +If you are using a workspace, set `resolver = "2"` in your root `Cargo.toml`. + +More information is available in the [release notes](https://github.com/Brendonovich/prisma-client-rust/releases/tag/0.6.0). diff --git a/external/prisma-client-rust/docs/pages/_app.mdx b/external/prisma-client-rust/docs/pages/_app.mdx new file mode 100644 index 0000000..465ec63 --- /dev/null +++ b/external/prisma-client-rust/docs/pages/_app.mdx @@ -0,0 +1,5 @@ +import '../style.css' + +export default function App({ Component, pageProps }) { + return +} diff --git a/external/prisma-client-rust/docs/pages/_meta.json b/external/prisma-client-rust/docs/pages/_meta.json new file mode 100644 index 0000000..3ec288f --- /dev/null +++ b/external/prisma-client-rust/docs/pages/_meta.json @@ -0,0 +1,8 @@ +{ + "index": "Introduction", + "getting-started": "Getting Started", + "reading-data": "Reading Data", + "writing-data": "Writing Data", + "extra": "Extra", + "0.6.0-migration": "0.6.0 Migration" +} diff --git a/external/prisma-client-rust/docs/pages/extra/_meta.json b/external/prisma-client-rust/docs/pages/extra/_meta.json new file mode 100644 index 0000000..0e5f4d9 --- /dev/null +++ b/external/prisma-client-rust/docs/pages/extra/_meta.json @@ -0,0 +1,12 @@ +{ + "raw": "Raw Queries", + "batching": "Batching Queries", + "transactions": "Transactions", + "composite-types": "Composite Types", + "partial-types": "Partial Types", + "mocking": "Mocking Queries", + "error-handling": "Error Handling", + "migrations": "Migrations", + "rspc": "rspc Integration", + "traits": "Query Traits" +} diff --git a/external/prisma-client-rust/docs/pages/extra/batching.md b/external/prisma-client-rust/docs/pages/extra/batching.md new file mode 100644 index 0000000..d83a1a8 --- /dev/null +++ b/external/prisma-client-rust/docs/pages/extra/batching.md @@ -0,0 +1,130 @@ +# Batching + +`PrismaClient::_batch` allows you to sequentially execute multiple queries in a single transaction. +If one of the queries fails, all changes will be rolled back. + +Data provided to `_batch` falls under two categories: + +- Containers: Root level collections that contain all items in the batch. +Can be either a tuple or a type implementing `IntoIter`. + +- Items: Either a query or a collection (`Vec` or tuple) of nested queries. + +## Containers + +Even if your batch doesn't include nested items, +you still need to put queries inside some sort of container. + +### Tuple + +Using a tuple allows for multiple types of queries to be used at once. +The return type of `_batch` will be a tuple of the results of each item. + +```rust +use prisma::user; + +let (user_one, user_two, user_count): (user::Data, user::Data, i64) = client + ._batch(( + client.user().create(..), + client.user().create(..), + client.user().count(vec![]), + )) + .await?; + +assert_eq!(user_count, 2); +``` + +### Iterator + +Using a type that implements `IntoIter` such as `Vec` allows for +a dynamic number of items to be batched together. +The return type will be a `Vec` of the result of the item. + +```rust +use prisma::user; + +let users: Vec = client + ._batch(vec![ + client.user().create(..), + client.user().create(..), + client.user().create(..) + ]) + .await?; + +assert_eq!(users.len(), 3); +``` + +`IntoIter` includes regular iterators, +so you can pass them straight into `_batch` and +`collect` will be called internally. + +```rust +use prisma::user; + +let user_ids = vec![1, 2, 3, 4, 5]; + +let user_creates = user_ids + .into_iter() + .map(|id| client + .user() + .create(..) + ); // _batch will collect internally! + +let users: Vec = client + ._batch(user_creates) + .await?; + +assert_eq!(users.len(), 5); +``` + +## Items + +Items can be either individual queries or a collection. + +### Tuple + +The same logic applies to a tuple item as a tuple container, +with the item's result being a 1-1 mapping of each query to its result type. + +```rust +let data: Vec<(user::Data, post::Data)> = client + ._batch(vec![ + (client.user().create(..), client.post().create(..)), + (client.user().create(..), client.post().create(..)), + ]) + .await?; +``` + +### Vec + +Unlike containers, only `Vec` can be used for dynamic collections of queries. +Apart from that, the behaviour is the same. + +```rust +let data: (Vec, Vec) = client + ._batch(( + vec![client.user().create(..), client.user().create(..)], + vec![client.post().create(..), client.post().create(..)], + )) + .await?; +``` + +### Nesting + +Any combination and nesting of items can be put inside a container, +allowing for heavily nested return types. + +This example isn't really practical, but it's possible. + +```rust +let data: Vec<( + Vec<(user::Data, post::data)>, + (Vec, Vec), +)> = client._batch(vec![( + vec![ + (client.user().create(..), client.post().create(..)), + (client.user().create(..), client.post().create(..)), + ], + (vec![client.user().create(..)], vec![client.post().create(..)]), +)]); +``` diff --git a/external/prisma-client-rust/docs/pages/extra/composite-types.md b/external/prisma-client-rust/docs/pages/extra/composite-types.md new file mode 100644 index 0000000..5f7d98a --- /dev/null +++ b/external/prisma-client-rust/docs/pages/extra/composite-types.md @@ -0,0 +1,184 @@ +# Composite Types + +_Available since v0.6.7_ + +When using MongoDB you will likely need to use [`embedded documents`](https://www.mongodb.com/docs/manual/core/data-model-design/#std-label-data-modeling-embedding), +which Prisma calls 'Composite Types'. +Prisma Client Rust will generate field & type modules whenever you use composite types, +allowing you to perform CRUD operations on them. + +These docs will only focus on Rust-specific details, +checkout [Prisma's documentation](https://www.prisma.io/docs/concepts/components/prisma-client/composite-types#changing-a-single-composite-type) +for a comprehensive guide including a list of all available operations, filters, +and some caveats to keep in mind. + +All examples will use the following schema: + +```prisma +model Product { + id String @id @default(auto()) @map("_id") @db.ObjectId + name String @unique + price Float + colors Color[] + sizes Size[] + photos Photo[] + orders Order[] +} + +model Order { + id String @id @default(auto()) @map("_id") @db.ObjectId + product Product @relation(fields: [productId], references: [id]) + color Color + size Size + shippingAddress Address + billingAddress Address? + productId String @db.ObjectId +} + +enum Color { + Red + Green + Blue +} + +enum Size { + Small + Medium + Large + XLarge +} + +type Photo { + height Int @default(200) + width Int @default(100) + url String +} + +type Address { + street String + city String + zip String +} +``` + +## Filtering + +To find records with matching composite types, +use the field's filter functions in combination with the type's field modules' `equals` functions. + +```rust +let orders = client + .order() + .find_many(vec![ + order::shipping_adress::is(vec![ + address::street::equals("555 Candy Cane Lane".to_string()), + address::city::equals("Wonderland".to_string()), + address::street::equals("52337".to_string()), + ]) + ]) + .exec() + .await?; +``` + +## Create + +To create a new composite type, use its `create` type module function. + +```rust +let order = client + .order() + .create( + .., + vec![ + order::shipping_adress::set( + address::create( + "1084 Candycane Lane".to_string(), + "Silverlake".to_string(), + "84323".to_string(), + vec![] + ) + ), + order::billing_address::set(None), + order::photos::set(vec![ + photo::create(100, 200, "photo.jpg".to_string()); + 3 + ]) + ] + ) +``` + +## Update + +To update an existing composite type, there are a few type module functions available. + +### Single Fields + +```rust +// overwrite entire type +order::shipping_address::set(address::create( + .. +)) + +// update certain fields +order::shipping_address::update(vec![ + address::zip::set("41232".to_string()) +]) + +// attempt to update certain fields, +// creating a new type if one doesn't exist +order::billing_address::upsert( + address::create(..), + // list of updates to attempt to apply + vec![address::zip::set("41232".to_string())] +) + +// removes the field entirely +order::billing_address::unset() +``` + +### List Fields + +```rust +// overwrite entire list +product::photos::set(vec![ + photo::create(..), + photo::create(..), +]) + +// push values to the end of the list +product::photos::push(vec![ + photo::create(..), + photo::create(..), +]) + +// update multiple values in the list +product::photos::update_many( + // filter + vec![photo::url::equals("1.jpg".to_string())], + // updates + vec![photo::url::set("2.jpg".to_string())] +) + +// update multiple values from the list +product::photos::delete_many( + // filter + vec![photo::url::equals("1.jpg".to_string())], +) +``` + +## Ordering + +It is possible to sort results based on the order of fields in composite types. + +```rust +use prisma_client_rust::Direction; + +let orders = client + .order() + .find_many(vec![]) + .order_by(order::shipping_address::order( + address::city::order(SortOrder::Asc) + )) + .exec() + .await?; +``` diff --git a/external/prisma-client-rust/docs/pages/extra/error-handling.md b/external/prisma-client-rust/docs/pages/extra/error-handling.md new file mode 100644 index 0000000..5434296 --- /dev/null +++ b/external/prisma-client-rust/docs/pages/extra/error-handling.md @@ -0,0 +1,60 @@ +# Error Handling + +The errors produced by executing queries can be confusing, containing very Prisma-specific types. For this reason, some utilities and explanation are provided. + +Query errors resemble the following: + +```rust +pub enum Error { + Execute(user_facing_errors::Error), + Serialize(serde_json::Error), + Deserialize(serde_json::Error) +} +``` + +`Serialize` and `Deserialize` errors are fairly self-explanatory, and occur while converting the data returned from Prisma into its appropriate structs. +[The serde documentation](https://serde.rs/error-handling.html) can be helpful in handling serde errors. + +`Execute` errors take place when sending a query to the Prisma engines, executing it, and receiving the results. The data contained inside them are an error type provided by Prisma, which contain a lot of deeply nested - and likely not useful - data about the specific error that occurred. + +To handle this error type nicely, query errors have an `is_prisma_error` function to check if the error is a particular `UserFacingError`. + +#### Examples + +This example attempts to create a record and checks if a unique key constraint is violated. + +```rust +use prisma_client_rust::prisma_errors::query_engine::UniqueKeyViolation; + +let user = client + .user() + .create(..) + .exec() + .await; + +match user { + Ok(user) => println!("User created"), + Err(error) if error.is_prisma_error::() => + println!("Unique key violated") + Err(error) => println!("Other error occurred") +} +``` + +This example attempts to update a record and checks if the record being updated does not exist. + +```rust +use prisma_client_rust::prisma_errors::query_engine::RecordNotFound; + +let user = client + .user() + .update(..) + .exec() + .await; + +match user { + Ok(user) => println!("User updated"), + Err(error) if error.is_prisma_error::() => + println!("User doesn't exist") + Err(error) => println!("Other error occurred") +} +``` diff --git a/external/prisma-client-rust/docs/pages/extra/migrations.md b/external/prisma-client-rust/docs/pages/extra/migrations.md new file mode 100644 index 0000000..0e8accc --- /dev/null +++ b/external/prisma-client-rust/docs/pages/extra/migrations.md @@ -0,0 +1,91 @@ +# Migrations + +Enabling the `migrations` feature for `prisma-client-rust` and `prisma-client-rust-cli` +will cause the generated client to expose some methods for using Prisma's +[migration engine](https://www.prisma.io/docs/concepts/components/prisma-migrate). +Specifically, the Prisma CLI's `db push`, `migrate deploy` and `migrate resolve` functions will have equivalent functions in the client. + +Using the migration engine in this way is not recommended unless you can't use the Prisma CLI, +such as for desktop apps (like those built with [Tauri](https://tauri.app/)) +and server deployments where the CLI is not available. +When the CLI is available, use it manually or in CI to deploy migrations. + +## In Development + +While modifying your Prisma schema use `PrismaClient::_db_push` to synchronize your database and schema. +As explained in [Prisma's docs](https://www.prisma.io/docs/reference/api-reference/command-reference#db-push), this does not use migrations, +instead it pushes the state of your schema directly to the database. + +`_db_push` returns a builder than has additional functions specifying additional options that are available in the CLI: + +```rust +client + ._db_push() + .accept_data_loss() // --accept-data-loss in CLI + .force_reset() // --force-reset in CLI + .await?; +``` + +## In Production + +After you have finalised your schema changes and generated migrations via the CLI, +use `PrismaClient::_migrate_deploy` to apply all pending migrations with the migration engine +([Prisma docs](https://www.prisma.io/docs/reference/api-reference/command-reference#migrate-deploy)). + +## Baselining + +Prisma provides the ability to baseline existing database in order to make them compatible with Prisma migrate. +The baselining process will not be detailed here as +[the Prisma docs](https://www.prisma.io/docs/guides/database/developing-with-prisma-migrate/baselining) +already do a great job explaining it. + +`PrismaClient::_migrate_resolve` is available as an in-code alternative to the CLI's `migrate resolve` command. It requires specifying a migration name as its first argument. + +```rust +client + ._migrate_resolve("20210426141759_initial-migration-for-db") + .await?; +``` + + +## Examples + +### New Project + +The following migration setup may be used in a new application using Prisma Client Rust. +Baselining is not necessary as the database will not have existing migrations. + +During development, `_db_push` will be used to synchronize the schema and database without generating migrations. +It may be necessary to occasionally add `accept_data_loss` or `force_reset` if major changes are made to your schema. +It is necessary to generate migrations using the CLI's `migrate dev` command once schema changes are finalized + +When the application is ran in release mode, +`_migrate_deploy` will be used to apply all migrations generated by `migrate dev`. + +```rust +#[cfg(debug_assertions)] +client._db_push().await?; +#[cfg(not(debug_assertions))] +client._migrate_deploy().await?; +``` + + +### Existing Project + +For a project switching from using another ORM or raw SQL a similar approach to new projects can be taken, +but [baselining](https://www.prisma.io/docs/guides/database/developing-with-prisma-migrate/baselining) must be done. + +After introspecting your database schema into a `schema.prisma` file, +generate the initial migration with `migrate dev`, +then use that migration's name in `_migrate_resolve` before applying further migrations. + +```rust +client + ._migrate_resolve("INITIAL MIGRATION NAME") + .await?; + +#[cfg(debug_assertions)] +client._db_push().await?; +#[cfg(not(debug_assertions))] +client._migrate_deploy().await?; +``` diff --git a/external/prisma-client-rust/docs/pages/extra/mocking.md b/external/prisma-client-rust/docs/pages/extra/mocking.md new file mode 100644 index 0000000..f64b5e7 --- /dev/null +++ b/external/prisma-client-rust/docs/pages/extra/mocking.md @@ -0,0 +1,72 @@ +# Mocking + +_Available since v0.6.4_ + +When writing tests for function which use the Prisma client, +it can be difficult to have a real database running to test with. +To combat this, you can enable the `mocking` feature on `prisma-client-rust` and `prisma-client-rust-cli` +and create a 'mock' client that runs queries using data you provide beforehand. +This allows you to define the expected result of a query and then perform tests using those expected results. + +The examples use the following Prisma schema: + +```prisma +model Post { + id String @default(cuid()) @id + title String +} +``` + +Say you have a function `get_post_title`: + +```rust +use prisma::{PrismaClient, post}; +use prisma_client_rust::queries; + +async fn get_post_title( + client: &PrismaClient, + post_id: String, +) -> queries::Result> { + let post = client.post().find_unique(post::id::equals(post_id)).await?; + + post.map(|post| post.title) +} +``` + +To write a unit test, +first create a mock client and mock store with `PrismaClient::_mock`, +define your expectations via the mock store, +and run the test. +The mock client will use data from the mock store to resolve queries. + +```rust +#[cfg(test)] +mod test { + use super::*; + + #[tokio::test] + async fn gets_title() -> queries::Result<()> { + let (client, mock) = PrismaClient::_mock().await; + + let id = "123".to_string(); + let expected_title = "Test".to_string(); + + mock.expect( + // First argument is query without calling 'exec' + client.post().find_unique(post::id::equals(post_id)), + // Second argument is expected return type. + // This will fail to compile if it does not match + // the return type of the query + post::Data { + id: id.clone(), + title: expected_title.to_string(), + }, + ) + .await; + + let title = get_post_title(&client, id).await?; + + assert_eq!(title, Some(expected_title)); + } +} +``` diff --git a/external/prisma-client-rust/docs/pages/extra/partial-types.md b/external/prisma-client-rust/docs/pages/extra/partial-types.md new file mode 100644 index 0000000..36e2062 --- /dev/null +++ b/external/prisma-client-rust/docs/pages/extra/partial-types.md @@ -0,0 +1,72 @@ +# Partial Types + +_Available since v0.6.7_ + +The `partial_unchecked!` macro can be found in all model modules, +and allows structs to be defined that have a `to_params` function which converts them for use inside `update_unchecked`. +Each field of the generated structs has the same type as the equivalent field in the module's `Data` struct, +just wrapped inside `Option`. + +This can be useful for thing like web APIs built with +[`axum`](https://github.com/tokio-rs/axum) or +[`rspc`](https://www.rspc.dev/), +where receiving updates is more ergonomic as structs rather than a list of changes. + +A more general `partial!` does not yet exist, +as supporting relations is not possible until [nested writes](https://github.com/Brendonovich/prisma-client-rust/issues/44) +are supported. + +## Setup + +Using partial macros requires the same setup as [Select & Include](/reading-data/select-include#setup), +as `module_path` must be provided. + +## Example + +Given the following schema: + +```prisma +model Post { + id Int @id @default(autoincrement()) + title String + content String +} +``` + +An updater function can be written like so: + +```rust +post::partial_unchecked!(PostUpdateData { + title + content +}) + +pub async fn update_post( + db: &PrismaClient, + id: i32, + data: PostUpdateData +) { + db.post() + .update_unchecked(post::id::equals(id), data.to_params()) + .exec() + .await; +} +``` + +The above use of `partial_unchecked!` generates something like the following: + +```rust +pub struct PostUpdateData { + title: Option, + content: Option +} + +impl PostUpdateData { + pub fn to_params(self) -> Vec { + [ + self.title.map(post::title::set), + self.content.map(post::content::set) + ].into_iter().flatten().collect() + } +} +``` diff --git a/external/prisma-client-rust/docs/pages/extra/raw.md b/external/prisma-client-rust/docs/pages/extra/raw.md new file mode 100644 index 0000000..d13b090 --- /dev/null +++ b/external/prisma-client-rust/docs/pages/extra/raw.md @@ -0,0 +1,165 @@ +# Raw Queries + +Sometimes the methods exposed by Prisma Client Rust cannot express the query you need. In this case, you can use the client's raw query capabilities to send arbitrary queries to your database. + +## Relational Databases + +`_query_raw` and `_execute_raw` can be used to send raw SQL to your database with fully sanitised arguments. + +The `prisma_client_rust::raw` macro takes an SQL query as its first argument, followed by query variables of type `prisma_client_rust::PrismaValue`. +To specify where in the query the variables should be inserted, use `{}`. +Prisma Client Rust will take care of inserting the correct database specific variable identifier for you. + +Even though `raw` appears similar to `format` and `print`, it will not compile-time validate that the number of variables you provide matches the number of `{}` in the query. That will only happen at runtime. + +If the arguments you want to provide are constructed dynamically, and as such cannot be specified in the `raw` macro, you can import the `Raw` struct and create one manually by calling `new` with the SQL query and a `Vec` of `PrismaValue`s. + +The examples use the following Prisma schema and assume a SQLite database: + +```prisma +model Post { + id String @id @default(cuid()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + published Boolean + title String + content String? + views Int @default(0) +} +``` + +### `_query_raw` + +Use `_query_raw` for reading data. +The return type is a `Vec` of a generic you specify, which must implement +[`serde::Deserialize`](https://docs.rs/serde/latest/serde/trait.Deserialize.html). +The generic represents the shape of a row returned by the query. + +See this enum for a reference of how database types map to Rust types. + +```rust +use prisma_client_rust::{raw, PrismaValue}; +use serde::Deserialize; + +#[derive(Deserialize)] +struct QueryReturnType { + id: String, + title: String +} + +let data: Vec = client + ._query_raw(raw!( + "SELECT id, title FROM Post WHERE id != {}", + PrismaValue::String("NotThisID".to_string()) + )) + .exec() + .await?; +``` + +### `_execute_raw` + +Use `_execute_raw` for writing data. It returns the number of rows that were modified. + +```rust +use prisma_client_rust::{raw, PrismaValue}; + +let count = client + ._execute_raw(raw!( + "INSERT INTO Post (published, title) VALUES ({}, {})", + PrismaValue::Boolean(false), + PrismaValue::String("A Title".to_string()) + )) + .exec() + .await?; + +assert_eq!(count, 1); +``` + +## MongoDB + +_Available since v0.6.7_ + +When using MongDB, +the client exposes multiple functions for performing raw queries that use [`serde_json::Value`](https://docs.rs/serde_json/latest/serde_json/value/enum.Value.html) +as arguments. + +All of them return a generic type that must implement +[serde::Deserialize](https://docs.rs/serde/latest/serde/trait.Deserialize.html). + +### `_run_command_raw` + +Runs an arbitrary command against the database, +accepting all +[MongoDB database commands](https://www.mongodb.com/docs/manual/reference/command/) +except for: + +- `find` (use [`find_raw`](#find_raw) instead) +- `aggregate` (use [`aggregate_raw`](#aggregate_raw) instead) + +There are a few rules around using this query, +which are documented in [Prisma's documentation](https://www.prisma.io/docs/concepts/components/prisma-client/raw-database-access#runcommandraw) +(their equivalent is `$runCommandRaw`). + +```rust +use serde_json::{json, Value}; + +let data = client + ._run_command_raw::>(json!({ + "insert": "Post", + "documents": [{ + "_id": "1", + "title": "Post One" + }] + })) + .exec() + .await?; + +assert_eq!(data.len(), 1); +``` + +### `find_raw` + +Returns actual database records for a given model. + +**Methods** + +- `filter` - Provides the query predicate filter +- `options` - Additional options to pass to the +[`find` command](https://www.mongodb.com/docs/manual/reference/command/find/#command-fields) + + +```rust +use serde_json::{json, Value}; + +let res = client + .post() + .find_raw::>() + .filter(json!({ "title": { "$eq": "Some Title" } })) + .options(json!({ "projection": { "_id": false } })) + .exec() + .await?; +``` + +### `aggregate_raw` + +Returns aggregated database records for a given model. + +**Methods** + +- `pipeline` - An [aggregation pipeline](https://www.mongodb.com/docs/manual/reference/operator/aggregation-pipeline/) +- `options` - Additional options to pass to the +[`aggregate` command](https://www.mongodb.com/docs/manual/reference/command/aggregate/#command-fields) + +```rust +use serde_json::{json, Value}; + +let res = client + .post() + .aggregate_raw::>() + .pipeline(json!([ + { "$match": { "title": "Title" } }, + { "$group": { "_id": "$title" } } + ])) + .exec() + .await?; +``` diff --git a/external/prisma-client-rust/docs/pages/extra/rspc.md b/external/prisma-client-rust/docs/pages/extra/rspc.md new file mode 100644 index 0000000..e0f94d1 --- /dev/null +++ b/external/prisma-client-rust/docs/pages/extra/rspc.md @@ -0,0 +1,161 @@ +# rspc Integration + +Prisma Client Rust has first-class support for [rspc](https://github.com/oscartbeaumont/rspc), +a server-agnostic router that can automatically generate TypeScript bindings. + +The examples use the following schema: + +```prisma +model Post { + id String @id @default(cuid()) + title String + + comments Comment[] +} + +model Comment { + id String @id @default(cuid()) + content String + + post Post @relation(fields: [postID], references: [id]) + postID String +} +``` + +## Setup + +When the `rspc` feature is enabled for both `prisma-client-rust` and `prisma-client-rust-cli`, +all data types generated by PCR will implement `specta::Type`, +and a `From` implementation is generated for `rspc::Error`. + +## Queries + +The following is possible when combining PCR and rspc: + +```rust +use rspc::Router; + +fn main() -> Router { + Router::::new() + .query("posts", |db, _: ()| async move { + let posts = db + .post() + .find_many(vec![]) + .exec() + .await?; + + Ok(posts) + }) + .build() +} +``` + +When TypeScript is generated it will look something like this: + +```ts +export type Operations = { + queries: { key: ["posts"], result: Array } +}; + +export interface Post { id: string, title: string } +``` + +This also works for [select & include](/select-include): + +```rust +use rspc::Router; + +fn main() -> Router { + Router::::new() + .query("posts", |db, _: ()| async move { + let posts = db + .post() + .find_many(vec![]) + .select(post::select!({ + id + title + })) + .exec() + .await?; + + Ok(posts) + }) + .build() +} +``` + +The generated TypeScript will look something like this: + +```ts +export type Operations = { + queries: { key: ["posts"], result: Array<{ id: string, title: string}> } +}; +``` + +As of 0.6.4, dedicated types will be generated for named include/selects. +These are only provided for extenuating cirsumstances though, +and it is instead recommended that you use helpers from `rspc` +such as `rspc.inferProcedureResult` to access procedure results +instead of relying on the named types. + + +### Relation types + +It is important to note that the types generated for models do not have fields for relations. +This is done to provide a better experience when using `include`, +at the expense of a worse experience using `with`/`fetch` for fetching relations. + +This tradeoff was made as a result of our experience building [Spacedrive](https://spacedrive.com). +Instead of all our TypeScript functions having to verify at runtime whether a relation had been loaded or not, +as is the case when using `with/fetch`, +each function has to explicitly specify the relations it wants loaded: + +```ts +import { User, Post } from "./exported-types" + +// Only recieves scalar fields of User +function needsOneUser(user: User) {} + +// Receives scalar fields + posts relation of User +function needsOneUserWithPosts(user: User & { posts: Post[] }) {} +``` + +There are a few downsides to this approach: +- It is necessary to know the name and type of the relation you are including in TypeScript + (though this is being worked on) +- `with/fetch` can be modified dynamically +- `with/fetch` provides better editor autocomplete + +However, we've found that these downsides are outweighed by the benefits of having full type-safety across your backend and frontend. + +## Error Handling + +Since `rspc::Error` can implement `From`, +all of Rust's regular error handling conventions are available. + +The `?` operator can be used to extract success values and return early if an error is encountered, +automatically converting the Prisma error to an rspc error. +This has the problem of needing to wrap the extracted value in `Ok` before return from a resolver. + +Another approach is adding `.map_err(Into::into)` before returning from a resolver. +This causes the Prisma error to be converted to an rspc error while keeping the Result intact, +as demonstrated below: + +```rust +use rspc::Router; + +fn main() -> Router { + Router::::new() + .query("posts", |db, _: ()| async move { + db + .post() + .find_many(vec![]) + .exec() + .await + .map_err(Into::into) + }) + .build() +} +``` + +For specifics on error handling in rpsc, see [the documentation](https://rspc.dev/server/error-handling/). diff --git a/external/prisma-client-rust/docs/pages/extra/traits.md b/external/prisma-client-rust/docs/pages/extra/traits.md new file mode 100644 index 0000000..77aefad --- /dev/null +++ b/external/prisma-client-rust/docs/pages/extra/traits.md @@ -0,0 +1,63 @@ +# Query Traits + +_Available since 0.6.4_ + +As your app grows, you may find yourself writing repetitive queries or conditions. +A common way to reduce this repetition is by putting queries inside functions to use elsewhere. +This is a bit limiting, though, as it requires a new function per query type, +and isn't very extensible. + +To aid with this, +PCR's query builders implement a set of traits that allow modification in a way that is typesafe, +but also decoupled from the specific query you're creating. + +## Base Traits + +### `Query` + +This probably won't be very useful, +it is the core trait implemented by every query builder. + +### `ModelQuery` + +This is implemented by all query builders that operate on a specific model, +ie. every query except raw queries. + +It is used to hold types and data corresponding to each model, +and is implemented for each model module's `Types` struct. + +## Specific Traits + +Each of these traits expose functions for adding additional parameters. + +### `WhereQuery` + +- `add_where`: adds one `WhereParam` + +Implemented for `Count`, `FindMany`, `FindFirst`, `UpdateMany`, and `DeleteMany` + +### `WithQuery` + +- `add_with`: adds one `WithParam` + +Implemented for `FindUnique`, `FindMany`, `FindFirst`, `Create`, `Update`, `Upsert`, and `Delete` + +### `OrderByQuery` + +- `add_with`: adds one `OrderByParam` + +Implemented for `FindMany`, `FindFirst`, and `Count` + +### `PaginatedQuery` + +- `add_cursor`: adds one `UniqueWhereParam` as a cursor +- `set_skip`: sets the number of records to skip +- `set_take`: sets the number of records to take + +Implemented for `Count`, `FindFirst` and `FindMany`. + +### `SetQuery` + +- `add_set`: adds one `SetParam` + +Implemented for `Create`, `Update`, and `Upsert` diff --git a/external/prisma-client-rust/docs/pages/extra/transactions.md b/external/prisma-client-rust/docs/pages/extra/transactions.md new file mode 100644 index 0000000..7df88d1 --- /dev/null +++ b/external/prisma-client-rust/docs/pages/extra/transactions.md @@ -0,0 +1,206 @@ +# Transactions + +_Available since v0.6.4_ + +While batching can cover most use cases where queries need to succeed or fail together, +it doesn't allow you to run code that executes between each query. +Instead, you can use `PrismaClient::_transaction`, +which provides both closure-based and manual methods of executing individual queries and arbitrary code inside a transaction. + +Both methods provide the ability to commit and roll back a transaction, +and produce a dedicated instance of `PrismaClient` that must be used while executing the transaction. + +## Transaction Closures + +Running your transaction in a closure is the approach used by the official +[Prisma client](https://www.prisma.io/docs/concepts/components/prisma-client/transactions#interactive-transactions). +It can be nice as all of your transaction's code can be kept in one place, +but it has the downside that closures can be tricky to work with. + +To perform a transaction this way, +just call `client._transaction().run(..)` +and provide a closure returning an `async move` block to `run()`. +The closure should accept one argument (the dedicated `PrismaClient` instance), +and return a `Result`. + +If the closure returns `Ok`, +the transaction will attempt to commit itself, +and if it returns `Err` it will attempt to roll back. + +```rust +let (user, post) = client + ._transaction() + .run(|client| async move { + let user = client + .user() + .create("brendan".to_string(), vec![]) + .exec() + .await?; + + client + .post() + .create( + "test".to_string(), + true, + vec![post::author::connect( + user::id::equals(user.id.clone()) + )], + ) + .exec() + .await + // if query succeeds, return user + post from transaction + .map(|post| (user, post)) + }) + .await?; +``` + +### Error Types + +Transaction closures must return a `Result`, +but the `Err` generic can be almost anything, +and the `Ok` generic is not restricted at all. + +To allow using `?` inside transaction closures, +error types must implement `From` +(this includes `QueryError` itself if you don't need a custom error type). +This can be done either with a manual implementation: + +```rust +use prisma_client_rust::QueryError; + +enum CustomError { + QueryError(QueryError) +} + +impl From for CustomError { + fn from(e: QueryError) { ... } +} +``` + +or via a library like [`thiserror`](https://docs.rs/thiserror/latest/thiserror/) with its `#[from]` attribute: + +```rust +#[derive(thiserror::Error)] + +enum CustomError { + #[error("Database error occurred")] + QueryError(prisma_client_rust::QueryError), + ... +} +``` + +### Specifying The Error Type + +1. Use the generic parameter directly. This works, +but requires `_` for the rest of the `run`'s generic parameters, +which probably isn't desirable. + +```rust +cilent + ._transaction() + .run::(..) + .await?; +``` +2. Type casting. If your closure returns `Ok`, +you can cast it to a `Result` with the appropriate error type. + +```rust +client + ._transaction() + .run(|client| async move { + let user = client + .user() + .create("brendan".to_string(), vec![]) + .exec() + .await?; + + Ok(user) as Result<_, CustomError>; + }) + .await? +``` + +3. Returning a query's `Result` - +this is probably the nicest looking solution. +If you are using a custom error type, +use `map_err` after `await` to transform the `QueryError` into your custom error type. + +```rust +client + ._transaction() + .run(|client| async move { + client + .user() + .create("brendan".to_string(), vec![]) + .exec() + // No `?` so that `Result` with error type is returned + .await + }) + .await? +``` + + +## Manual Transactions + +If you'd prefer to manually control when the transaction commits and rolls back, +use `client._transaction().begin()` to not only get a dedicated `PrismaClient`, +but also a `TransactionManger` instance that you can `commit` and `rollback` with: + +```rust +let (tx, client) = client + ._transaction() + .begin() + .await?; +``` + +The above example names the client instance `client`, +meaning that it would shadow the original client it was created from, +making it inaccessible. +You could give the client instance a name like `tx_client`, +or put all transaction logic inside a block so that the original `client` variable +isn't shadowed in the rest of your code. + +`commit` and `rollback` consume the client created by `begin` as their only argument. +This is done because those functions need to do things with the client, +and as an extra precaution against the transaction-specific client being used once the transaction is complete. + +```rust +tx.commit(client).await?; +// or +tx.rollback(client).await?; +``` + + +### Error Handling + +Care must be taken when handling errors using this method. +Simply using `?` could result in your code returning before `commit` or `rollback` is ran. +An easy way to avoid this is to put your transaction logic in a function where it is safe to use `?`, +and then `commit` or `rollback` based on the result of the function. +```rust +let (tx, client) = client + ._transaction() + .begin() + .await?; + +async fn do_stuff(client: &PrismaClient) -> ... { + let user = client + .user() + .create("brendan".to_string(), vec![]) + .exec() + .await?; // Early return won't escape transaction + + ... +} + +// This is very similar to the closure method's internals +let result = match do_stuff(client).await { + Ok(v) => { + tx.commit(client).await?; + Ok(v) + }, + Err(e) => { + tx.rollback(client).await?; + Err(e) + } +}; +``` diff --git a/external/prisma-client-rust/docs/pages/getting-started/_meta.json b/external/prisma-client-rust/docs/pages/getting-started/_meta.json new file mode 100644 index 0000000..01c9a8e --- /dev/null +++ b/external/prisma-client-rust/docs/pages/getting-started/_meta.json @@ -0,0 +1,5 @@ +{ + "installation": "Installation", + "setup": "Setup", + "structure": "Structure" +} diff --git a/external/prisma-client-rust/docs/pages/getting-started/installation.mdx b/external/prisma-client-rust/docs/pages/getting-started/installation.mdx new file mode 100644 index 0000000..e6616df --- /dev/null +++ b/external/prisma-client-rust/docs/pages/getting-started/installation.mdx @@ -0,0 +1,146 @@ +# Installation + +Prisma Client Rust's installation operates in a different way to most Rust projects. + +`prisma-client-rust` contains the query builders, traits, and type definitions. Some of these - eg. `Direction` - may be used in your own code. + +`prisma-client-rust-cli` contains the Prisma generator and access to the Prisma CLI, but does not provide an executable binary - this must be created yourself. + +Prisma Client Rust requires a minimum Rust version of v1.62.0. + +## Creating a CLI Binary + +### Inside Your Crate + +First, the main library and CLI package must be added to your project's Cargo.toml: + +```toml +[dependencies] +prisma-client-rust = { git = "https://github.com/Brendonovich/prisma-client-rust", tag = "0.6.11" } +prisma-client-rust-cli = { git = "https://github.com/Brendonovich/prisma-client-rust", tag = "0.6.11" } +``` + +The generated client will need `serde`, so run `cargo add` to install it: + +``` +cargo add serde +``` + +You'll also need to make sure you're using edition 2021 of Rust. +```toml +[package] +# ... package stuff +edition = "2021" +``` + +The easiest way to create a binary to access the CLI through is by creating a `src/bin` folder if you don't already have one, +and inside it creating a file called something like `prisma.rs` (This will determine the name of your binary). +Inside this file put the following: + +```rust +fn main() { + prisma_client_rust_cli::run(); +} +``` + +Technically, this is all that is required! Just run the following to access the CLI: + +```bash +$ cargo run --bin -- +``` + +import { Callout } from "nextra/components" + + +If using Apple Silicon it is recommended to ensure Rosetta is installed, **even if you have installed it previously**. +Run `softwareupdate --install-rosetta --agree-to-license` to install it. +Not doing so may result in nondescript errors from Prisma's `query-engine` binary. + + +This isn't a very friendly command to run, though. Luckily Cargo allows us to define project-wide aliases for running commands! Create a folder at the root of your project called `.cargo` and inside it create a file `config.toml` containing the following: + +```toml +[alias] +prisma = "run --bin --" +``` + +Now you can run `cargo prisma ` anywhere in your project to access the CLI! + +This approach has some problems though: +1. `prisma-client-rust-cli` is included as a dependency in your crate, which is likely not desirable. +2. If your crate has errors during compilation then you aren't able to generate the client, since the CLI will also fail to compile! + +Thankfully, there's a more reliable method: + +### As a Workspace Crate + +Move the CLI binary to a separate crate and configure your project to use +[Cargo workspaces](https://doc.rust-lang.org/book/ch14-03-cargo-workspaces.html). +Below is a sample project structure that has one binary target in `src/main.rs`, +and a separate crate for the CLI named `prisma-cli` which is included in the workspace members of `Cargo.toml`. + +``` +Cargo.toml +.cargo/ + config.toml +src/ + main.rs +prisma-cli/ + Cargo.toml + src/ + main.rs +``` + +For the above example, +`Cargo.toml` would include `prisma-client-rust` as a dependency as it is required by the generated file, +whereas `prisma-cli/Cargo.toml` would include `prisma-client-rust-cli` as a dependency, +and so the binary in `src/main.rs` would not be bundled with all the CLI code, +only the required library code. + +You will also need to update the `cargo prisma` alias to run the new crate: + +```toml +[alias] +prisma = "run -p --" +``` + +#### A Note on Virtual Workspaces + +If the root `Cargo.toml` of your workspace has no `[package]` section (only a `[workspace]` section) then you are using a virtual workspace. + +For Prisma Client Rust to compile properly, you'll need to instruct Cargo to use version 2 of the [feature resolver](https://doc.rust-lang.org/edition-guide/rust-2021/default-cargo-resolver.html). + +```toml +[workspace] +# ... workspace stuff +resolver = "2" +``` + +This is not necessary for regular workspaces & single packages since they can use `edition = "2021"`, but virtual workspaces are special for some reason. + +## Specifying Your Database + +As of version 0.6.3, +Prisma Client Rust allows you to specify precisely which database connectors your project uses, +in order to avoid compiling the other connectors that Prisma supports. +This reduces compile times and binary sizes. + +To start, set `default-features = false` for both `prisma-client-rust` and `prisma-client-rust-cli`. +Then add each database you would like to support as a feature for both crates. +The possible values are `postgresql`, `mysql`, `sqlite`, `mssql` and `mongodb`. + +## Why is a CLI Binary Not Provided? + +In older versions of Prisma Client Rust, +it was possible to `cargo install prisma-client-rust-cli` and have a global install of the CLI available to use at any time. +This had a major problem though: Versioning. Managing multiple projects that used different versions of Prisma Client Rust got very annoying very quickly, +plus it went against the recommmended installation instructions of Prisma Client +[JS](https://www.prisma.io/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases-typescript-postgres), +[Go](https://github.com/prisma/prisma-client-go/blob/main/docs/quickstart.md), +and [Python](https://prisma-client-py.readthedocs.io/en/stable/#installing-prisma-client-python). + +Unlike these three languages, +Rust (or more specifically Cargo) does not provide a method for executing binaries available inside dependencies. +Since installing a globally available binary was ruled out, +providing the CLI as a library was seen as the only other option, +plus personally I think that being able to run `cargo prisma ` is quite a nice experience and matches with clients in other languages. diff --git a/external/prisma-client-rust/docs/pages/getting-started/setup.mdx b/external/prisma-client-rust/docs/pages/getting-started/setup.mdx new file mode 100644 index 0000000..1081a32 --- /dev/null +++ b/external/prisma-client-rust/docs/pages/getting-started/setup.mdx @@ -0,0 +1,84 @@ +# Setup + +If you have completed the [installation steps](installation) and setup the `cargo prisma ` alias, +you are ready to add the Prisma Client Rust generator to your [Prisma schema](https://www.prisma.io/docs/concepts/components/prisma-schema). + +A common file layout is to give the schema and migrations their own folder: + +``` +Cargo.toml +src/ + main.rs +prisma/ + schema.prisma + migrations/ +``` + +Below is an example of a schema located at `prisma/schema.prisma`. +It uses a SQLite database and generates the client at `src/prisma.rs`: + +```prisma filename="prisma/schema.prisma" +datasource db { + provider = "sqlite" + url = "file:dev.db" +} + +generator client { + // Corresponds to the cargo alias created earlier + provider = "cargo prisma" + // The location to generate the client. Is relative to the position of the schema + output = "../src/prisma.rs" +} + +model User { + id String @id + displayName String +} +``` + +Next, run `cargo prisma generate` to generate the client that will be used in your Rust code. +If you have `rustfmt` installed, +the generated code will be formatted for easier exploration and debugging. + +import { Callout } from "nextra/components" + + + The generated client must not be checked into source control. + It cannot be transferred between devices or operating systems. + You will need to re-generate it wherever you build your project. + If using git, add it to your `.gitignore` file. + + +## Creating the Client + +First, make sure you are using the [Tokio](https://github.com/tokio-rs/tokio) async runtime. +Other runtimes have not been tested, but since the [Prisma Engines](https://github.com/prisma/prisma-engines) use it there is likely no other option. + +`PrismaClient::_builder()` provides a builder API for customising the generated client. +The simplest use of this is calling `.build()` directly on the builder. +Using the above schema for reference, +this builder creates a client in a `main.rs` file right next to `prisma.rs`: + +```rust filename="src/main.rs" +// Stops the client from outputting a huge number of warnings during compilation. +#[allow(warnings, unused)] +mod prisma; + +use prisma::PrismaClient; +use prisma_client_rust::NewClientError; + +#[tokio::main] +async fn main() { + let client: Result = PrismaClient::_builder().build().await; +} +``` + +The `with_url` builder method can be used to customise which database the client connects to. +In most cases it is recommended to control this with an environment variable in your schema, +but for some cases (eg. desktop apps with multiple databases) environment variables cannot be customised. + +## Naming Clashes + +Rust has a [reserved set of keywords](https://doc.rust-lang.org/reference/keywords.html) that cannot be used as names in your code. +If you name a model or field something that after conversion to `snake_case` will be a restricted keyword, +it will be prefixed with `r#` in the generated client instead of just failing to generate. diff --git a/external/prisma-client-rust/docs/pages/getting-started/structure.md b/external/prisma-client-rust/docs/pages/getting-started/structure.md new file mode 100644 index 0000000..e250d73 --- /dev/null +++ b/external/prisma-client-rust/docs/pages/getting-started/structure.md @@ -0,0 +1,35 @@ +# Structure + +## Syntax + +After creating an instance of `PrismaClient`, queries can be made like the following: + +```rust +client + .post() // Model to query on + .find_many(vec![]) // Query to execute + .exec() // Ends query + .await; // All queries are async and return Result +``` + +Queries can be filtered and extended using the generated modifiers. +Each model in your schema gets a corresponding Rust module, with corresponding modules for their fields inside. +Field modules contain functions for constructing modifiers based on each field. + + +```rust +use prisma::post; + +client + .post() + .find_many(vec![ +// model:: +// field:: +// method() + post::title::equals("Test".to_string()) + ]) + .exec() + .await; +``` + +All model and field module names are converted to `snake_case` as to be consistent with Rust's naming conventions. diff --git a/external/prisma-client-rust/docs/pages/index.md b/external/prisma-client-rust/docs/pages/index.md new file mode 100644 index 0000000..8de4b62 --- /dev/null +++ b/external/prisma-client-rust/docs/pages/index.md @@ -0,0 +1,26 @@ +# Prisma Client Rust + +Here you can find everything Rust-specific for setting up and using Prisma with your Rust projects. +It is expected that you are already familiar with the [Prisma documentation](https://www.prisma.io/docs/), +as a lot of concepts are shared from them and will not be explained here. + +Prisma Client Rust is not an official Prisma product, but has been [generously supported](https://twitter.com/prisma/status/1554855900124438529) as part of their FOSS Fund. + +## Examples + +- [Actix](https://github.com/Brendonovich/prisma-client-rust/tree/main/examples/actix) +- [Axum](https://github.com/Brendonovich/prisma-client-rust/tree/main/examples/axum-rest) +- [Axum + `async-graphql`](https://github.com/Brendonovich/prisma-client-rust/tree/main/examples/axum-graphql) +- [Rocket](https://github.com/Brendonovich/prisma-client-rust/tree/main/examples/rocket) +- [rspc](https://github.com/Brendonovich/prisma-client-rust/tree/main/examples/rspc) +- [Tauri](https://github.com/Brendonovich/prisma-client-rust/tree/main/examples/tauri) + +## In The Wild + +- [Spacedrive](https://spacedrive.com) - Prisma Client Rust wouldn't exist without Spacedrive (my employer), + and now runs on desktop, server and mobile devices! +- [Twidge](https://github.com/VarunPotti/twidge) - An open-source productivity app which helps you manage link embeds, tasks, calendars and many more + +Do you have a project using Prisma Client Rust you'd like featured? +[Open an issue!](https://github.com/Brendonovich/prisma-client-rust/issues/new) + diff --git a/external/prisma-client-rust/docs/pages/reading-data/_meta.json b/external/prisma-client-rust/docs/pages/reading-data/_meta.json new file mode 100644 index 0000000..6ebdc88 --- /dev/null +++ b/external/prisma-client-rust/docs/pages/reading-data/_meta.json @@ -0,0 +1,8 @@ +{ + "find": "Find Queries", + "fetch": "Fetching Relations", + "pagination": "Pagination", + "ordering": "Ordering", + "count": "Counting Records", + "select-include": "Select & Include" +} diff --git a/external/prisma-client-rust/docs/pages/reading-data/count.md b/external/prisma-client-rust/docs/pages/reading-data/count.md new file mode 100644 index 0000000..e8a41bc --- /dev/null +++ b/external/prisma-client-rust/docs/pages/reading-data/count.md @@ -0,0 +1,31 @@ +# Count + +`count` returns the number of records that fit a set of filters. + +The examples use the following schema: + +```prisma +model Post { + id String @id @default(cuid()) + title String + content String +} +``` + +```rust +use prisma::comment; + +// Passing no filters will count all records +let all_count: usize = client + .comment() + .count(vec![]) + .exec() + .await?; + +// Number of records whose title starts with "Post" +let filtered_count: usize = client + .comment() + .count(vec![comment::title::starts_with("Post".to_string())]) + .exec() + .await?; +``` diff --git a/external/prisma-client-rust/docs/pages/reading-data/fetch.md b/external/prisma-client-rust/docs/pages/reading-data/fetch.md new file mode 100644 index 0000000..c646d32 --- /dev/null +++ b/external/prisma-client-rust/docs/pages/reading-data/fetch.md @@ -0,0 +1,107 @@ +# Fetching Relations + +Relations can be fetched by calling a query builder's `with` function. +The field modules of relation fields will contain `fetch` functions, the results of which can be passed to `with`. +The `fetch` function of a many relation takes a `Vec` of `WhereParam`, while a single relation's `fetch` function takes no arguments. + +Once fetched, relation data can be accessed in two ways: +1. (Recommended) Use relation access functions on the parent struct. +These will give you a `Result` containing a reference to the relation data. +This is the recommended approach as the `Result` error type will inform you that the field hasn't been fetched using `with`. + +2. Use the data directly on the parent struct. +This gives you direct access to the relation data, where it is wrapped inside an `Option` to determine whether it has been fetched. +Doing this only recommended if you need to take ownership of the relation data, as dealing with nested options can be tricky and not as descriptive as the errors provided by accessor functions. + +Whether a relation has been loaded can only be guaranteed at compile time if the accessor's `Result` is not able to panic - ie. `unwrap`, `expect` etc are not called on it. +See [Select & Include](select-include) for completely type-safe ways of fetching relations. + +The examples use the following schema: + +```prisma +model Post { + id String @id @default(cuid()) + published Boolean + title String + content String? + desc String? + + comments Comment[] +} + +model Comment { + id String @id @default(cuid()) + content String + + post Post @relation(fields: [postID], references: [id]) + postID String +} +``` + +## Single Relations + +In this example, the `post` relation is loaded alongside a comment. + +```rust +use prisma::{comment, post}; + +let comment: Option = client + .comment() + .find_unique(comment::id::equals("0".to_string())) + .with(comment::post::fetch()) + .exec() + .await + .unwrap(); + +// Since the above query includes a with() call +// the result will be an Ok() +let post: Result = comment.post(); +``` + +## Many Relations + +In this example, a `post` and its `comments` are loaded. + +```rust +use prisma::{comment, post}; + +let post: Option = client + .post() + .find_unique(post::id::equals("0".to_string())) + // Many relation requires Vec of filters as argument + .with(post::comments::fetch(vec![])) + .exec() + .await + .unwrap(); + +let comments: Result, String> = post.comments(); +``` + +## Nested Relations + +`fetch` returns a query builder, so you can nest calls like `with` to fetch nested relations. + +In this example, a post is loaded with its comments, and each comment is loaded with the original post. + +```rust +use prisma::{comment, post}; + +let post: post::Data = client + .post() + .find_unique(post::id::equals("0".to_string())) + .with(post::comments::fetch(vec![]) + .with(comment::post::fetch()) + ) + .exec() + .await + .unwrap() + .unwrap(); + +// Safe since post::comments::fetch has been used +for comment in post.comments().unwrap() { + // Safe since comment::post::fetch has been used + let post = comment.post().unwrap(); + + assert_eq!(post.id, "0"); +} +``` diff --git a/external/prisma-client-rust/docs/pages/reading-data/find.md b/external/prisma-client-rust/docs/pages/reading-data/find.md new file mode 100644 index 0000000..87e061e --- /dev/null +++ b/external/prisma-client-rust/docs/pages/reading-data/find.md @@ -0,0 +1,167 @@ +# Find Queries + +The examples use the following schema: + +```prisma +generator client { + provider = "cargo prisma" + output = "src/prisma.rs" +} + +model Post { + id String @id @default(cuid()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + published Boolean + title String + content String? + desc String? + + comments Comment[] +} + +model Comment { + id String @id @default(cuid()) + createdAt DateTime @default(now()) + content String + + post Post @relation(fields: [postID], references: [id]) + postID String +} +``` + +## Find Many + +`find_many` searches for all records of a model matching the provided filters. + +```rust +use prisma::post; + +let posts: Vec = client + .post() + .find_many(vec![post::title::equals("Title".to_string())]) + .exec() + .await + .unwrap() +``` + +If no records are found, `find_many` will return an empty vector instead of an error. + +## Find First + +`find_first` searches for the first record of a model that matches the provided filters. Like `find_many`, it requires a list of filters. + +```rust +use prisma::post; + +let posts: Option = client + .post() + .find_first(vec![post::title::id("123".to_string())]) + .exec() + .await + .unwrap() +``` + +## Find Unique + +`find_unique` searches for a single record of a model matching the provided unique filter. A unique filter is an `equals()` filter of a unique field. + +If a matching record is not found, the result of the query will be `None` rather than throwing an error. + +```rust +use prisma::post; + +let posts: Option = client + .post() + .find_unique(post::id::equals("123".to_string())) + .exec() + .await + .unwrap() +``` + +## Filtering on Relations + +Filtering on relations can be done in a similar way to filtering on scalars, it just takes some extra functions. + +### Single Relations + +For single relations, there is the `is` and `is_not` filters. + +The following example gets all comments whose post has the title "My Title": + +```rust +use prisma::{comment, post}; + +let comments: Vec = client + .comment() + .find_many(vec![ + comment::post::is(vec![ + post::title::equals("My Title".to_string()) + ]) + ]) + .exec() + .await + .unwrap(); +``` + +### Many Relations + +For many relations, there are the `some`, `every` and `none` filters. + +The following example gets posts which have at least one comment with the content "My Content" and whose titles are all "My Title" + +```rust +use prisma::{post, comment}; + +let posts: Vec = client + .post() + .find_many(vec![ + post::title::equals("My Title".to_string()), + post::comments::some(vec![ + comment::content::equals("My Content".to_string()) + ]) + ]) + .exec() + .await + .unwrap(); +``` + +Note that an empty `some` filter will match every record with at least one linked record, and an empty `none` filter will match every record with no linked records. + +## Operator Filters + +The operators `and`, `or` and `not` can be used inside any query. The `prisma_client_rust` library exports the `Operator` enum and some helper functions from `prisma_client_rust::operator`, and are one way to use the operators: + +```rust +use prisma::post; +use prisma_client_rust::operator::not; + +let posts: Option = client + .post() + .find_first(vec![ + not(vec![post::title::id("123".to_string())) + ]) + .exec() + .await + .unwrap() +``` + +This syntax leaves something to be desired, however, since all the helper functions take a `Vec` of filters, leaving a bunch of `vec!` macros in the query. + +To aid this, `prisma_client_rust` also exports the `and!`, `or!` and `not!` macros from its root, which can be used in place of an operator and its `vec!`: + +```rust +use prisma::post; +use prisma_client_rust::not; + +let posts: Option = client + .post() + .find_first(vec![ + not![post::title::id("123".to_string())] + ]) + .exec() + .await + .unwrap() +``` + +Keep in mind that an operator macro must still be within a `vec!`, since it resolves to a single filter. diff --git a/external/prisma-client-rust/docs/pages/reading-data/order-by.md b/external/prisma-client-rust/docs/pages/reading-data/order-by.md new file mode 100644 index 0000000..2f5ce5b --- /dev/null +++ b/external/prisma-client-rust/docs/pages/reading-data/order-by.md @@ -0,0 +1,89 @@ +# Ordering + +Ordering can be performed on any field, though it is recommended to only order by indexed fields for improved performance. + +Order is defined using a field module's `order` function, which takes a `prisma_client_rust::Direction`. +It can be performed on `find_first` and `find_many` queries, as well as being chained onto `fetch` calls for many relations in a similar manner to [relation pagination](pagination#relation-pagination). + +The examples use the following schema: + +```prisma +generator client { + provider = "cargo prisma" + output = "src/prisma.rs" +} + +model Post { + id String @id @default(cuid()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + published Boolean + title String + content String? + desc String? + + comments Comment[] +} + +model Comment { + id String @id @default(cuid()) + createdAt DateTime @default(now()) + content String + + post Post @relation(fields: [postID], references: [id]) + postID String +} +``` + +## Indexed Fields + +The following exaple will be order `posts` by `id` from lowest to highest + +```rust +use prisma::post; +use prisma_client_rust::Direction; + +let posts: Vec = client + .post() + .find_many(vec![]) + .order_by(post::id::order(Direction::Asc)) + .exec() + .await + .unwrap(); +``` + +## Non-Indexed Fields + +The following example will be order `posts` by `created_at`, even though it is not an indexed field. + +```rust +use prisma::post; +use prisma_client_rust::Direction; + +let posts: Vec = client + .post() + .find_many(vec![]) + .order_by(post::created_at::order(Direction::Asc)) + .exec() + .await + .unwrap(); +``` + +## Combining With Pagination + +The following example will order all `post` records and then paginate a selection of them. + +```rust +use prisma::post; +use prisma_client_rust::Direction; + +let posts: Vec = client + .post() + .find_many() + .order_by(post::created_at::order(Direction::Desc)) + .cursor(post::id::equals("abc".to_string())) + .take(5) + .exec() + .await + .unwrap(); +``` diff --git a/external/prisma-client-rust/docs/pages/reading-data/pagination.md b/external/prisma-client-rust/docs/pages/reading-data/pagination.md new file mode 100644 index 0000000..6758f2e --- /dev/null +++ b/external/prisma-client-rust/docs/pages/reading-data/pagination.md @@ -0,0 +1,100 @@ +# Pagination + +Pagination allows you to specify what range of records are returned from `find_first` and `find_many` queries, and on many relations. + +The examples use the following schema: + +```prisma +generator client { + provider = "cargo prisma" + output = "src/prisma.rs" +} + +model Post { + id String @id @default(cuid()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + published Boolean + title String + content String? + desc String? + + comments Comment[] +} + +model Comment { + id String @id @default(cuid()) + createdAt DateTime @default(now()) + content String + + post Post @relation(fields: [postID], references: [id]) + postID String +} +``` + +## Take + +```rust +use prisma::post; + +let posts: Vec = client + .post() + .find_many(vec![post::title::contains("Title".to_string())]) + // Only the first 5 records will be returned + .take(5) + .exec() + .await?; + +``` + +## Skip + +```rust +use prisma::post; + +let posts: Vec = client + .post() + .find_many(vec![post::title::contains("Title".to_string())]) + // The first 2 records will be skipped + .skip(2) + .exec() + .await?; + +``` + +## Cursor + +`cursor` takes a [unique filter](structure#unique-filters) as its argument. + +```rust +use prisma::post; + +let posts: Vec = client + .post() + .find_many(vec![]) + .cursor(post::id::equals("abc".to_string())) + .exec() + .await?; +``` + +[`order_by`](order-by.md) can be very useful when combined with cursor pagination. + +## Relation Pagination + +The above methods can be chained to `fetch` calls for many relations. + +```rust +use prisma::post; + +let posts: Vec = client + .post() + .find_many(vec![]) + .with( + post::comments::fetch(vec![]) + .skip(10) + .take(5) + .cursor(comment::id::equals("abc".to_string())), + ) + .exec() + .await?; +``` diff --git a/external/prisma-client-rust/docs/pages/reading-data/select-include.md b/external/prisma-client-rust/docs/pages/reading-data/select-include.md new file mode 100644 index 0000000..a9a99e9 --- /dev/null +++ b/external/prisma-client-rust/docs/pages/reading-data/select-include.md @@ -0,0 +1,248 @@ +# Select & Include + +Using [with/fetch](fetch) for fetching relations is okay, but leaves something to be desired in terms of type safety. +The select & include query builder functions & macros can help with this, +providing an exact type for each field and relation you choose to fetch. + +Select also provides the ability to only fetch specific fields, whereas include will fetch all scalar fields and any specified relations. + +The examples use the following schema: +```prisma +model Post { + id String @id @default(cuid()) + title String + + comments Comment[] +} + +model Comment { + id String @id @default(cuid()) + content String + + post Post @relation(fields: [postID], references: [id]) + postID String +} +``` + +## Setup + +`select!` and `include!` rely on recursion and call each other internally, so they have to be aware of the module path of the generated client. +By default this is `crate::prisma`, which assumes your client is generated to a file named `prisma.rs` and sits at the root of the crate it is in. +If you have configured your client to have a different name or be located somewhere else, +you will need to provide this location through the `module_path` generator option. + +`module_path` is a Rust path relative to `crate` that points to your generated client. + +```prisma +generator client { + provider = "cargo prisma" + output = "./src/generated/db.rs" + // `select` macros will now point to `crate::generated::db` + // instead of `crate::prisma` + module_path = "generated::db" +} +``` + +## The Basics + +`select!` and `include!` are very similar in syntax, with their only difference being what they do and don't fetch. +Every model module contains `select!` and `include!` macros, +the result of which can be provided to their respective query builder functions. + +Fields to fetch can be specified as a space separated list inside `{}`: + +```rust +post::select!({ + id // select can pick individual fields + title +}) + +// Above will generate +struct Data { + id: String, + title: String, +} +``` + +```rust +post::include!({ + comments // include can only pick relations +}) + +// Above will generate +struct Data { + id: String, + title: String, + comments: Vec +} +``` + +## Nested Selections + +`select` and `include` can also be applied while fetching a relation, to any depth in fact. +Simply add a `:`, specify whether you want to select or include on the relation, and add your selection: + +```rust +// Nested include inside select +post::select!({ + comments: include { + post + } +}) + +// Above will generate +struct Data { + comments: comments::Data // refers to below module +} + +// Module + data struct generated for nested selection +mod comments { + pub struct Data { + post: post::Data + } +} +``` + +```rust +// Nested select inside include +post::include!({ + comments: select { + content + } +}) + +// Above will generate +struct Data { + id: String, + title: String, + comments: comments::Data // refers to below module +} + +// Module + data struct generated for nested selection +mod comments { + pub struct Data { + content: String + } +} +``` + +## Many Relation Options + +When fetching many-relations, the fetching statement can act as an equivalent call to `model::field::fetch`, +allowing for filtering, pagination and ordering to occur. +This works in `select!` and `include!`. + +```rust +post::select!({ + // Equivalent to post::comments::fetch(..) .. + comments(vec![comment::content::contains("prisma".to_string())]) + .skip(5) + .take(10): select { // You can add on nested selections too! + id + content + } +}) +``` + +## Usage in Queries + +Just pass the result of `select!` or `include!` to an equivalent query builder function: + +```rust +// Type is anonymous and does not exist outside of the call to `include` +let posts: Vec<_> = client + .post() + .find_many(vec![]) + .include(post::include!({ + comments: select { + id + } + })) + .exec() + .await?; + +// Generated type is equivalent to +struct Data { + id: String, + title: String, + comments: comments::Data +} + +mod comments { + pub struct Data { + id: String + } +} +``` + +## Using Types Outside Queries + +In some cases it can be useful to access the type generated by `select!` and `include!` outside of the call to the query builder functions, +for example if you want to return the result of a query from a function. + +This can be done by adding a name before the root selection. +This will cause a module to be generated with that name and will contain a `Data` struct as well as either an `include` or `select` function, depending on what macro you use. + +```rust +post::select!(post_only_title { + title +}) + +async fn do_query() -> Vec { + client + .post() + .find_many(vec![]) + .select(post_only_title::select()) + .exec() + .await + .unwrap() +} + +// Generated type is equivalent to +pub mod post_only_title { + pub struct Data { + title: String + } + + pub fn select() // return type is an internal detail +} +``` + +### Passing Arguments + +When performing a selection inline, outside values can be used as arguments just fine since they can be captured from outside the macro. +When a selection is declared outside of a query builder function, this context cannot be captured. +This is why the `select` and `include` functions aren't just structs, +they can be passed arguments defined within the macros using the following syntax: + +```rust + +post::include!((filters: Vec, skip: i64, take: i64) => post_with_comments { + comments(filters).skip(skip).take(take) +}) + +async fn do_query() -> Vec { + let filters = vec![comment::content::contains("prisma".to_string())]; + let skip = 5; + let take = 5; + + client + .post() + .find_many(vec![]) + .select(post_only_title::select(filters, skip, take)) + .exec() + .await + .unwrap() +} + +// Generated type is equivalent to +pub mod post_with_comments { + pub struct Data { + id: String, + title: String, + comments: Vec + } + + pub fn select(filters: Vec, skip: i64, take: i64) // return type is an internal detail +} +``` diff --git a/external/prisma-client-rust/docs/pages/writing-data/_meta.json b/external/prisma-client-rust/docs/pages/writing-data/_meta.json new file mode 100644 index 0000000..fa8bbc5 --- /dev/null +++ b/external/prisma-client-rust/docs/pages/writing-data/_meta.json @@ -0,0 +1,6 @@ +{ + "create": "Create Queries", + "update": "Update Queries", + "delete": "Delete Queries", + "upsert": "Upserting" +} diff --git a/external/prisma-client-rust/docs/pages/writing-data/create.mdx b/external/prisma-client-rust/docs/pages/writing-data/create.mdx new file mode 100644 index 0000000..52a6f26 --- /dev/null +++ b/external/prisma-client-rust/docs/pages/writing-data/create.mdx @@ -0,0 +1,177 @@ +# Create Queries + +`create` and `create_many` allow you to easily create one or many records. + +A model's required fields need to be provided as individual arguments to the arguments of `create` or in a tuple for `create_many', +whereas optional fields can be provided in a Vec after all the required fields. + +When providing the value of an optional field, it is necessary to wrap the value in a 'field identifier' so that the client +knows which field to set. These usually look like `model::field::set`. +This is not required for required fields as they get their own position in the argument list. + +Nested creates are not supported yet. + +The examples use the following schema: + +```prisma +generator client { + provider = "cargo prisma" + output = "src/prisma.rs" +} + +model Post { + id String @id @default(cuid()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + published Boolean + title String + content String? + desc String? + + comments Comment[] +} + +model Comment { + id String @id @default(cuid()) + createdAt DateTime @default(now()) + content String + + post Post @relation(fields: [postID], references: [id]) + postID String +} +``` + +## Create + +The following example creates a post and overwrites its autogenerated `id` field. + +```rust +use prisma::post; + +let post: post::Data = client + .post() + .create( + // Required fields are individual arguments. + // Wrapping their values is not necessary. + true, + "what up".to_string(), + // All other fields can be passed in the last argument + vec![ + // Generated fields can be overwritten like regular fields + post::id::set("id".to_string()), + // Non-required fields require being wrapped in an Option + post::content::set(Some("content".to_string())) + ] + ) + .exec() + .await?; +``` + +### Connecting Relations + +The `connect` function of a relation field module can be used to connect new records with existing ones. +It takes a single unique filter as an argument. + +The following example creates a new comment and links it to a post. + +```rust +use prisma::{comment, post}; + +let comment: comment::Data = client + .comment() + .create( + "content".to_string(), + // If post wasn't required, then this would need + // to be wrapped in comment::post::connect(..). + post::id::equals("id".to_string()) + vec![] + ) + .exec() + .await?; +``` + + +Connecting records like this is equivalent to directly setting the values of the relation's foreign keys, eg. +setting `post_id` from the above example with `comment::post_id::set()`. + + +## Create Unchecked + +_Available since v0.6.7_ + +`create_unchecked` is similar to `create` but only allows setting scalar fields using `UncheckedSetParam`. +`unchecked` is a Prisma term describing inputs that only accept a model's scalar fields. + +```rust +use prisma::{comment, post}; + +let comment: comment::Data = client + .comment() + .create_unchecked( + "content".to_string(), + // requires providing value for postID foreign key, + // rather than connecting a relation + 0, + vec![] + ) + .exec() + .await?; +``` + +## Create Many + +`create_many` can be used to create many records of a single model type. +It accepts a `Vec` of tuples with the same shape as `create_unchecked`, +so only scalar fields can be set. + +import { Callout } from "nextra/components" + + + SQLite support for `create_many` is **UNSTABLE**, + but can be enabled by adding the `sqlite-create-many` feature to `prisma-client-rust` and `prisma-client-rust-cli` in your `Cargo.toml` files. + + +To assist in constructing tuples of the right shape, +each model module contains a `create_unchecked` function that accepts a model's scalar fields and returns the correct tuple. + +The following example iterates an array of titles, turns it into tuples and creates multiple posts. + +```rust +use prisma::post; + +let titles = [ + "Title 1", + "Title 2", + "Title 3" +] + +let posts: i64 = client + .post() + .create_many( + titles + .iter() + .map(|title| post::create_unchecked( + true, + title.to_string(), + vec![] + )) + .collect() // Necessary to create a Vec + ) + .exec() + .await?; +``` + +### Skip Duplicates + +The `create_many` builder has a `skip_duplicates` function which can be used to stop an +error from being thrown if a unique constraint is violated, +instead conflicting records will be ignored and the rest will be created. + +```rust +client + .post() + .create_many(..) + .skip_duplicates() // No error if unique violation is broken + .exec() + .await? +``` diff --git a/external/prisma-client-rust/docs/pages/writing-data/delete.md b/external/prisma-client-rust/docs/pages/writing-data/delete.md new file mode 100644 index 0000000..d71ac97 --- /dev/null +++ b/external/prisma-client-rust/docs/pages/writing-data/delete.md @@ -0,0 +1,59 @@ +# Delete Queries + +The examples use the following Prisma schema: + +```prisma +model Post { + id String @id @default(cuid()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + published Boolean + title String + content String? + + comments Comment[] +} + +model Comment { + id String @id @default(cuid()) + createdAt DateTime @default(now()) + content String + + post Post @relation(fields: [postID], references: [id]) + postID String +} +``` + +## Delete + +`delete` will delete the record referenced by a single unique filter and return it. + +The following example finds a single post and deletes it, returning the deleted post. + +```rust +use prisma::post; + +let deleted_post: post::Data = client + .post() + .delete(post::id::equals("id".to_string())) + .exec() + .await?; +``` + +## Delete Many + +`delete_many` will delete the records referenced by all of the filters in a `Vec` and return the number of deleted records. + +The following example finds a group of comments and deletes them, returning the number of deleted comments. + +```rust +use prisma::comment; + +let deleted_comments_count: i64 = client + .comment() + .delete_many(vec![ + comment::content::contains("some text".to_string()) + ]) + .exec() + .await; +``` diff --git a/external/prisma-client-rust/docs/pages/writing-data/update.md b/external/prisma-client-rust/docs/pages/writing-data/update.md new file mode 100644 index 0000000..32f1e93 --- /dev/null +++ b/external/prisma-client-rust/docs/pages/writing-data/update.md @@ -0,0 +1,134 @@ +# Update Queries + +The examples use the following schema: + +```prisma +generator client { + provider = "cargo prisma" + output = "src/prisma.rs" +} + +model Post { + id String @id @default(cuid()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + published Boolean + title String + content String? + desc String? + + comments Comment[] +} + +model Comment { + id String @id @default(cuid()) + createdAt DateTime @default(now()) + content String + + post Post @relation(fields: [postID], references: [id]) + postID String +} +``` + +## Update + +`update` accepts a single unique filter and a `Vec` of updates to apply, returning the data of the updated record. + +The following example finds and updates an existing post, with the resulting post data being returned. + +```rust +use prisma::post; + +let updated_post: post::Data = client + .post() + .update( + post::id::equals("id".to_string()), // Unique filter + vec![post::title::set("new title".to_string())] // Vec of updates + ) + .exec() + .await?; +``` + +## Update Unchecked + +_Available since v0.6.7_ + +`update_unchecked` is similar to `update` but only allows setting scalar fields using `UncheckedSetParam`. + +```rust +use prisma::{comment, post}; + +let comment: comment::Data = client + .comment() + .update_unchecked( + comment::id::equals("some comment id".to_string()), + // can't `connect` relations, but can set foreign keys directly + vec![comment::post_id::set("some post id".to_string())] + ) + .exec() + .await?; +``` + +## Update Many + +`update_many` accepts a `Vec` of filters (not just unique filters), and a `Vec` of updates to apply to all records found. +It returns the number of records updated. + +The following example finds and updates a set of posts. The number of updated records is returned. + +```rust +use prisma::post; + +let updated_posts_count: i64 = client + .post() + .update_many( + vec![post::id::contains("id".to_string())], // Vec of filters + vec![post::content::set("new content".to_string())] // Updates to be applied to each record + ) + .exec() + .await?; +``` + +## Updating Relations + +Using `connect` and `disconnect`, relations can be modified inside `update` queries. + +IMPORTANT: Updating a relation this way with `update_many` will cause the query to always return an error. +To avoid this, set the relation's scalar fields directly. +An effort to create stricter types to avoid this is being [tracked](). + +### Single Record + +The following example find a comment and disconnects the post that it is related to. + +```rust +use prisma::{comment, post}; + +let updated_comment: comment::Data = client + .post() + .update( + comment::id::equals("id".to_string()), + vec![comment::post::disconnect()] + ) + .exec() + .await?; +``` + +### Many Records + +The following example finds all comments on a post and updates the post they are linked to, but does so by modifying the relation column directly. + +```rust +use prisma::{comment, post}; + +let updated_comments_count: i64 = client + .post() + .update_many( + vec![comment::post::is( + post::id::equals("id".to_string()) + )], + vec![comment::post_id::set("post".to_string())] + ) + .exec() + .await?; +``` diff --git a/external/prisma-client-rust/docs/pages/writing-data/upsert.md b/external/prisma-client-rust/docs/pages/writing-data/upsert.md new file mode 100644 index 0000000..aa624b1 --- /dev/null +++ b/external/prisma-client-rust/docs/pages/writing-data/upsert.md @@ -0,0 +1,50 @@ +# Upserting + +Upserting allows you to update a record if it exists, or create it if it does not. + +`upsert` takes three arguments: +1. A unique filter +2. A tuple of create arguments +3. A list of update data + +The example uses the following Prisma schema: + +```prisma +model Post { + id String @id @default(cuid()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + published Boolean + title String + content String? + views Int @default(0) +} +``` + +The following example searches for a post, updates it if it is found, and creates it if not. + +```rust +use prisma::post; + +let post: post::Data = client + .post() + .upsert( + // Unique filter + post::id::equals("upsert".to_string()), + // 'create' helper function for constructing a create argument tuple + post::create( + true, + "title".to_string(), + "upsert".to_string(), + vec![] + ), + // Vec of updates to apply if record already exists + vec![ + post::content::set(Some("new content".to_string())), + post::views::increment(1) + ] + ) + .exec() + .await + .unwrap(); +``` diff --git a/external/prisma-client-rust/docs/pnpm-lock.yaml b/external/prisma-client-rust/docs/pnpm-lock.yaml new file mode 100644 index 0000000..ec2f25d --- /dev/null +++ b/external/prisma-client-rust/docs/pnpm-lock.yaml @@ -0,0 +1,3302 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + next: + specifier: ^13.4.13 + version: 13.4.13(react-dom@18.2.0)(react@18.2.0) + nextra: + specifier: ^2.10.0 + version: 2.10.0(next@13.4.13)(react-dom@18.2.0)(react@18.2.0) + nextra-theme-docs: + specifier: ^2.10.0 + version: 2.10.0(next@13.4.13)(nextra@2.10.0)(react-dom@18.2.0)(react@18.2.0) + react: + specifier: ^18.2.0 + version: 18.2.0 + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + +devDependencies: + '@types/node': + specifier: ^18.17.4 + version: 18.17.4 + autoprefixer: + specifier: ^10.4.14 + version: 10.4.14(postcss@8.4.27) + postcss: + specifier: ^8.4.27 + version: 8.4.27 + tailwindcss: + specifier: ^3.3.3 + version: 3.3.3 + typescript: + specifier: 4.9.5 + version: 4.9.5 + +packages: + + /@alloc/quick-lru@5.2.0: + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + dev: true + + /@babel/runtime@7.22.10: + resolution: {integrity: sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.0 + dev: false + + /@braintree/sanitize-url@6.0.4: + resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} + dev: false + + /@headlessui/react@1.7.16(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-2MphIAZdSUacZBT6EXk8AJkj+EuvaaJbtCyHTJrPsz8inhzCl7qeNPI1uk1AUvCgWylVtdN8cVVmnhUDPxPy3g==} + engines: {node: '>=10'} + peerDependencies: + react: ^16 || ^17 || ^18 + react-dom: ^16 || ^17 || ^18 + dependencies: + client-only: 0.0.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.19 + dev: true + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@jridgewell/trace-mapping@0.3.19: + resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@mdx-js/mdx@2.3.0: + resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/mdx': 2.0.6 + estree-util-build-jsx: 2.2.2 + estree-util-is-identifier-name: 2.1.0 + estree-util-to-js: 1.2.0 + estree-walker: 3.0.3 + hast-util-to-estree: 2.3.3 + markdown-extensions: 1.1.1 + periscopic: 3.1.0 + remark-mdx: 2.3.0 + remark-parse: 10.0.2 + remark-rehype: 10.1.0 + unified: 10.1.2 + unist-util-position-from-estree: 1.1.2 + unist-util-stringify-position: 3.0.3 + unist-util-visit: 4.1.2 + vfile: 5.3.7 + transitivePeerDependencies: + - supports-color + dev: false + + /@mdx-js/react@2.3.0(react@18.2.0): + resolution: {integrity: sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==} + peerDependencies: + react: '>=16' + dependencies: + '@types/mdx': 2.0.6 + '@types/react': 18.2.20 + react: 18.2.0 + dev: false + + /@napi-rs/simple-git-android-arm-eabi@0.1.8: + resolution: {integrity: sha512-JJCejHBB1G6O8nxjQLT4quWCcvLpC3oRdJJ9G3MFYSCoYS8i1bWCWeU+K7Br+xT+D6s1t9q8kNJAwJv9Ygpi0g==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@napi-rs/simple-git-android-arm64@0.1.8: + resolution: {integrity: sha512-mraHzwWBw3tdRetNOS5KnFSjvdAbNBnjFLA8I4PwTCPJj3Q4txrigcPp2d59cJ0TC51xpnPXnZjYdNwwSI9g6g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@napi-rs/simple-git-darwin-arm64@0.1.8: + resolution: {integrity: sha512-ufy/36eI/j4UskEuvqSH7uXtp3oXeLDmjQCfKJz3u5Vx98KmOMKrqAm2H81AB2WOtCo5mqS6PbBeUXR8BJX8lQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@napi-rs/simple-git-darwin-x64@0.1.8: + resolution: {integrity: sha512-Vb21U+v3tPJNl+8JtIHHT8HGe6WZ8o1Tq3f6p+Jx9Cz71zEbcIiB9FCEMY1knS/jwQEOuhhlI9Qk7d4HY+rprA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@napi-rs/simple-git-linux-arm-gnueabihf@0.1.8: + resolution: {integrity: sha512-6BPTJ7CzpSm2t54mRLVaUr3S7ORJfVJoCk2rQ8v8oDg0XAMKvmQQxOsAgqKBo9gYNHJnqrOx3AEuEgvB586BuQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@napi-rs/simple-git-linux-arm64-gnu@0.1.8: + resolution: {integrity: sha512-qfESqUCAA/XoQpRXHptSQ8gIFnETCQt1zY9VOkplx6tgYk9PCeaX4B1Xuzrh3eZamSCMJFn+1YB9Ut8NwyGgAA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@napi-rs/simple-git-linux-arm64-musl@0.1.8: + resolution: {integrity: sha512-G80BQPpaRmQpn8dJGHp4I2/YVhWDUNJwcCrJAtAdbKFDCMyCHJBln2ERL/+IEUlIAT05zK/c1Z5WEprvXEdXow==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@napi-rs/simple-git-linux-x64-gnu@0.1.8: + resolution: {integrity: sha512-NI6o1sZYEf6vPtNWJAm9w8BxJt+LlSFW0liSjYe3lc3e4dhMfV240f0ALeqlwdIldRPaDFwZSJX5/QbS7nMzhw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@napi-rs/simple-git-linux-x64-musl@0.1.8: + resolution: {integrity: sha512-wljGAEOW41er45VTiU8kXJmO480pQKzsgRCvPlJJSCaEVBbmo6XXbFIXnZy1a2J3Zyy2IOsRB4PVkUZaNuPkZQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@napi-rs/simple-git-win32-arm64-msvc@0.1.8: + resolution: {integrity: sha512-QuV4QILyKPfbWHoQKrhXqjiCClx0SxbCTVogkR89BwivekqJMd9UlMxZdoCmwLWutRx4z9KmzQqokvYI5QeepA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@napi-rs/simple-git-win32-x64-msvc@0.1.8: + resolution: {integrity: sha512-UzNS4JtjhZhZ5hRLq7BIUq+4JOwt1ThIKv11CsF1ag2l99f0123XvfEpjczKTaa94nHtjXYc2Mv9TjccBqYOew==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@napi-rs/simple-git@0.1.8: + resolution: {integrity: sha512-BvOMdkkofTz6lEE35itJ/laUokPhr/5ToMGlOH25YnhLD2yN1KpRAT4blW9tT8281/1aZjW3xyi73bs//IrDKA==} + engines: {node: '>= 10'} + optionalDependencies: + '@napi-rs/simple-git-android-arm-eabi': 0.1.8 + '@napi-rs/simple-git-android-arm64': 0.1.8 + '@napi-rs/simple-git-darwin-arm64': 0.1.8 + '@napi-rs/simple-git-darwin-x64': 0.1.8 + '@napi-rs/simple-git-linux-arm-gnueabihf': 0.1.8 + '@napi-rs/simple-git-linux-arm64-gnu': 0.1.8 + '@napi-rs/simple-git-linux-arm64-musl': 0.1.8 + '@napi-rs/simple-git-linux-x64-gnu': 0.1.8 + '@napi-rs/simple-git-linux-x64-musl': 0.1.8 + '@napi-rs/simple-git-win32-arm64-msvc': 0.1.8 + '@napi-rs/simple-git-win32-x64-msvc': 0.1.8 + dev: false + + /@next/env@13.4.13: + resolution: {integrity: sha512-fwz2QgVg08v7ZL7KmbQBLF2PubR/6zQdKBgmHEl3BCyWTEDsAQEijjw2gbFhI1tcKfLdOOJUXntz5vZ4S0Polg==} + dev: false + + /@next/swc-darwin-arm64@13.4.13: + resolution: {integrity: sha512-ZptVhHjzUuivnXMNCJ6lER33HN7lC+rZ01z+PM10Ows21NHFYMvGhi5iXkGtBDk6VmtzsbqnAjnx4Oz5um0FjA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@next/swc-darwin-x64@13.4.13: + resolution: {integrity: sha512-t9nTiWCLApw8W4G1kqJyYP7y6/7lyal3PftmRturIxAIBlZss9wrtVN8nci50StDHmIlIDxfguYIEGVr9DbFTg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm64-gnu@13.4.13: + resolution: {integrity: sha512-xEHUqC8eqR5DHe8SOmMnDU1K3ggrJ28uIKltrQAwqFSSSmzjnN/XMocZkcVhuncuxYrpbri0iMQstRyRVdQVWg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm64-musl@13.4.13: + resolution: {integrity: sha512-sNf3MnLAm8rquSSAoeD9nVcdaDeRYOeey4stOWOyWIgbBDtP+C93amSgH/LPTDoUV7gNiU6f+ghepTjTjRgIUQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-x64-gnu@13.4.13: + resolution: {integrity: sha512-WhcRaJJSHyx9OWmKjjz+OWHumiPZWRqmM/09Bt7Up4UqUJFFhGExeztR4trtv3rflvULatu9IH/nTV8fUUgaMA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-x64-musl@13.4.13: + resolution: {integrity: sha512-+Y4LLhOWWZQIDKVwr2R17lq2KSN0F1c30QVgGIWfnjjHpH8nrIWHEndhqYU+iFuW8It78CiJjQKTw4f51HD7jA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-arm64-msvc@13.4.13: + resolution: {integrity: sha512-rWurdOR20uxjfqd1X9vDAgv0Jb26KjyL8akF9CBeFqX8rVaBAnW/Wf6A2gYEwyYY4Bai3T7p1kro6DFrsvBAAw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-ia32-msvc@13.4.13: + resolution: {integrity: sha512-E8bSPwRuY5ibJ3CzLQmJEt8qaWrPYuUTwnrwygPUEWoLzD5YRx9SD37oXRdU81TgGwDzCxpl7z5Nqlfk50xAog==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-x64-msvc@13.4.13: + resolution: {integrity: sha512-4KlyC6jWRubPnppgfYsNTPeWfGCxtWLh5vaOAW/kdzAk9widqho8Qb5S4K2vHmal1tsURi7Onk2MMCV1phvyqA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: true + + /@popperjs/core@2.11.8: + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + dev: false + + /@swc/helpers@0.5.1: + resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} + dependencies: + tslib: 2.6.1 + dev: false + + /@theguild/remark-mermaid@0.0.4(react@18.2.0): + resolution: {integrity: sha512-C1gssw07eURtCwzXqZZdvyV/eawQ/cXfARaXIgBU9orffox+/YQ+exxmNu9v16NSGzAVsGF4qEVHvCOcCR/FpQ==} + peerDependencies: + react: ^18.2.0 + dependencies: + mermaid: 10.3.0 + react: 18.2.0 + unist-util-visit: 5.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@theguild/remark-npm2yarn@0.1.1: + resolution: {integrity: sha512-ZKwd/bjQ9V+pESLnu8+q8jqn15alXzJOuVckraebsXwqVBTw53Gmupiw9zCdLNHU829KTYNycJYea6m9HRLuOg==} + dependencies: + npm-to-yarn: 2.0.0 + unist-util-visit: 5.0.0 + dev: false + + /@types/acorn@4.0.6: + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + dependencies: + '@types/estree': 1.0.1 + dev: false + + /@types/d3-scale-chromatic@3.0.0: + resolution: {integrity: sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==} + dev: false + + /@types/d3-scale@4.0.3: + resolution: {integrity: sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==} + dependencies: + '@types/d3-time': 3.0.0 + dev: false + + /@types/d3-time@3.0.0: + resolution: {integrity: sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==} + dev: false + + /@types/debug@4.1.8: + resolution: {integrity: sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==} + dependencies: + '@types/ms': 0.7.31 + dev: false + + /@types/estree-jsx@1.0.0: + resolution: {integrity: sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ==} + dependencies: + '@types/estree': 1.0.1 + dev: false + + /@types/estree@1.0.1: + resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} + dev: false + + /@types/hast@2.3.5: + resolution: {integrity: sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg==} + dependencies: + '@types/unist': 2.0.7 + dev: false + + /@types/js-yaml@4.0.5: + resolution: {integrity: sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==} + dev: false + + /@types/katex@0.14.0: + resolution: {integrity: sha512-+2FW2CcT0K3P+JMR8YG846bmDwplKUTsWgT2ENwdQ1UdVfRk3GQrh6Mi4sTopy30gI8Uau5CEqHTDZ6YvWIUPA==} + dev: false + + /@types/katex@0.16.2: + resolution: {integrity: sha512-dHsSjSlU/EWEEbeNADr3FtZZOAXPkFPUO457QCnoNqcZQXNqNEu/svQd0Nritvd3wNff4vvC/f4e6xgX3Llt8A==} + dev: false + + /@types/mdast@3.0.12: + resolution: {integrity: sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==} + dependencies: + '@types/unist': 2.0.7 + dev: false + + /@types/mdx@2.0.6: + resolution: {integrity: sha512-sVcwEG10aFU2KcM7cIA0M410UPv/DesOPyG8zMVk0QUDexHA3lYmGucpEpZ2dtWWhi2ip3CG+5g/iH0PwoW4Fw==} + dev: false + + /@types/ms@0.7.31: + resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} + dev: false + + /@types/node@18.17.4: + resolution: {integrity: sha512-ATL4WLgr7/W40+Sp1WnNTSKbgVn6Pvhc/2RHAdt8fl6NsQyp4oPCi2eKcGOvA494bwf1K/W6nGgZ9TwDqvpjdw==} + dev: true + + /@types/prop-types@15.7.5: + resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + dev: false + + /@types/react@18.2.20: + resolution: {integrity: sha512-WKNtmsLWJM/3D5mG4U84cysVY31ivmyw85dE84fOCk5Hx78wezB/XEjVPWl2JTZ5FkEeaTJf+VgUAUn3PE7Isw==} + dependencies: + '@types/prop-types': 15.7.5 + '@types/scheduler': 0.16.3 + csstype: 3.1.2 + dev: false + + /@types/scheduler@0.16.3: + resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} + dev: false + + /@types/unist@2.0.7: + resolution: {integrity: sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==} + dev: false + + /@types/unist@3.0.0: + resolution: {integrity: sha512-MFETx3tbTjE7Uk6vvnWINA/1iJ7LuMdO4fcq8UfF0pRbj01aGLduVvQcRyswuACJdpnHgg8E3rQLhaRdNEJS0w==} + dev: false + + /acorn-jsx@5.3.2(acorn@8.10.0): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.10.0 + dev: false + + /acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + + /ansi-sequence-parser@1.1.1: + resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==} + dev: false + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: false + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /arch@2.2.0: + resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} + dev: false + + /arg@1.0.0: + resolution: {integrity: sha512-Wk7TEzl1KqvTGs/uyhmHO/3XLd3t1UeU4IstvPXVzGPM522cTjqjNZ99esCkcL52sjqjo8e8CTBcWhkxvGzoAw==} + dev: false + + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: true + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: false + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: false + + /astring@1.8.6: + resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} + hasBin: true + dev: false + + /autoprefixer@10.4.14(postcss@8.4.27): + resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.21.10 + caniuse-lite: 1.0.30001519 + fraction.js: 4.2.0 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + dev: true + + /bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /browserslist@4.21.10: + resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001519 + electron-to-chromium: 1.4.489 + node-releases: 2.0.13 + update-browserslist-db: 1.0.11(browserslist@4.21.10) + dev: true + + /busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + dependencies: + streamsearch: 1.1.0 + dev: false + + /camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + dev: true + + /caniuse-lite@1.0.30001519: + resolution: {integrity: sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg==} + + /ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + dev: false + + /chalk@2.3.0: + resolution: {integrity: sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 4.5.0 + dev: false + + /character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + dev: false + + /character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + dev: false + + /character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + dev: false + + /character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + dev: false + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + dev: false + + /clipboardy@1.2.2: + resolution: {integrity: sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw==} + engines: {node: '>=4'} + dependencies: + arch: 2.2.0 + execa: 0.8.0 + dev: false + + /clsx@1.2.1: + resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} + engines: {node: '>=6'} + dev: false + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: false + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: false + + /comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + dev: false + + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: true + + /commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: false + + /commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + dev: false + + /compute-scroll-into-view@3.0.3: + resolution: {integrity: sha512-nadqwNxghAGTamwIqQSG433W6OADZx2vCo3UXHNrzTRHK/htu+7+L0zhjEoaeaQVNAi3YgqWDv8+tzf0hRfR+A==} + dev: false + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /cose-base@1.0.3: + resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + dependencies: + layout-base: 1.0.2 + dev: false + + /cose-base@2.2.0: + resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} + dependencies: + layout-base: 2.0.1 + dev: false + + /cross-spawn@5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + dependencies: + lru-cache: 4.1.5 + shebang-command: 1.2.0 + which: 1.3.1 + dev: false + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /csstype@3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + dev: false + + /cytoscape-cose-bilkent@4.1.0(cytoscape@3.26.0): + resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} + peerDependencies: + cytoscape: ^3.2.0 + dependencies: + cose-base: 1.0.3 + cytoscape: 3.26.0 + dev: false + + /cytoscape-fcose@2.2.0(cytoscape@3.26.0): + resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} + peerDependencies: + cytoscape: ^3.2.0 + dependencies: + cose-base: 2.2.0 + cytoscape: 3.26.0 + dev: false + + /cytoscape@3.26.0: + resolution: {integrity: sha512-IV+crL+KBcrCnVVUCZW+zRRRFUZQcrtdOPXki+o4CFUWLdAEYvuZLcBSJC9EBK++suamERKzeY7roq2hdovV3w==} + engines: {node: '>=0.10'} + dependencies: + heap: 0.2.7 + lodash: 4.17.21 + dev: false + + /d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + dependencies: + internmap: 1.0.1 + dev: false + + /d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + dependencies: + internmap: 2.0.3 + dev: false + + /d3-axis@3.0.0: + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} + engines: {node: '>=12'} + dev: false + + /d3-brush@3.0.0: + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} + engines: {node: '>=12'} + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + dev: false + + /d3-chord@3.0.1: + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} + engines: {node: '>=12'} + dependencies: + d3-path: 3.1.0 + dev: false + + /d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + dev: false + + /d3-contour@4.0.2: + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + dev: false + + /d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} + dependencies: + delaunator: 5.0.0 + dev: false + + /d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + dev: false + + /d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + dev: false + + /d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true + dependencies: + commander: 7.2.0 + iconv-lite: 0.6.3 + rw: 1.3.3 + dev: false + + /d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + dev: false + + /d3-fetch@3.0.1: + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} + dependencies: + d3-dsv: 3.0.1 + dev: false + + /d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + dev: false + + /d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + dev: false + + /d3-geo@3.1.0: + resolution: {integrity: sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + dev: false + + /d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + dev: false + + /d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + dependencies: + d3-color: 3.1.0 + dev: false + + /d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + dev: false + + /d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + dev: false + + /d3-polygon@3.0.1: + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} + dev: false + + /d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + dev: false + + /d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + dev: false + + /d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + dependencies: + d3-array: 2.12.1 + d3-shape: 1.3.7 + dev: false + + /d3-scale-chromatic@3.0.0: + resolution: {integrity: sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==} + engines: {node: '>=12'} + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + dev: false + + /d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + dev: false + + /d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + dev: false + + /d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + dependencies: + d3-path: 1.0.9 + dev: false + + /d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + dependencies: + d3-path: 3.1.0 + dev: false + + /d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + dependencies: + d3-time: 3.1.0 + dev: false + + /d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + dev: false + + /d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + dev: false + + /d3-transition@3.0.1(d3-selection@3.0.0): + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + dev: false + + /d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + dev: false + + /d3@7.8.5: + resolution: {integrity: sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + d3-axis: 3.0.0 + d3-brush: 3.0.0 + d3-chord: 3.0.1 + d3-color: 3.1.0 + d3-contour: 4.0.2 + d3-delaunay: 6.0.4 + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-dsv: 3.0.1 + d3-ease: 3.0.1 + d3-fetch: 3.0.1 + d3-force: 3.0.0 + d3-format: 3.1.0 + d3-geo: 3.1.0 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-polygon: 3.0.1 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.0.0 + d3-selection: 3.0.0 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + d3-timer: 3.0.1 + d3-transition: 3.0.1(d3-selection@3.0.0) + d3-zoom: 3.0.0 + dev: false + + /dagre-d3-es@7.0.10: + resolution: {integrity: sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==} + dependencies: + d3: 7.8.5 + lodash-es: 4.17.21 + dev: false + + /dayjs@1.11.9: + resolution: {integrity: sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==} + dev: false + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: false + + /decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + dependencies: + character-entities: 2.0.2 + dev: false + + /delaunator@5.0.0: + resolution: {integrity: sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==} + dependencies: + robust-predicates: 3.0.2 + dev: false + + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + dev: false + + /didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + dev: true + + /diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + engines: {node: '>=0.3.1'} + dev: false + + /dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dev: true + + /dompurify@3.0.5: + resolution: {integrity: sha512-F9e6wPGtY+8KNMRAVfxeCOHU0/NPWMSENNq4pQctuXRqqdEPW7q3CrLbR5Nse044WwacyjHGOMlvNsBe1y6z9A==} + dev: false + + /electron-to-chromium@1.4.489: + resolution: {integrity: sha512-QNx+cirm4ENixfdSk9rp/3HKpjlxHFsmDoHtU1IiXdkJcpkKrd/o20LT5h1f3Qz+yfTMb4Ji3YDT/IvJkNfEkA==} + dev: true + + /elkjs@0.8.2: + resolution: {integrity: sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==} + dev: false + + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: false + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: false + + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + dev: false + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /estree-util-attach-comments@2.1.1: + resolution: {integrity: sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==} + dependencies: + '@types/estree': 1.0.1 + dev: false + + /estree-util-build-jsx@2.2.2: + resolution: {integrity: sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==} + dependencies: + '@types/estree-jsx': 1.0.0 + estree-util-is-identifier-name: 2.1.0 + estree-walker: 3.0.3 + dev: false + + /estree-util-is-identifier-name@2.1.0: + resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==} + dev: false + + /estree-util-to-js@1.2.0: + resolution: {integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==} + dependencies: + '@types/estree-jsx': 1.0.0 + astring: 1.8.6 + source-map: 0.7.4 + dev: false + + /estree-util-value-to-estree@1.3.0: + resolution: {integrity: sha512-Y+ughcF9jSUJvncXwqRageavjrNPAI+1M/L3BI3PyLp1nmgYTGUXU6t5z1Y7OWuThoDdhPME07bQU+d5LxdJqw==} + engines: {node: '>=12.0.0'} + dependencies: + is-plain-obj: 3.0.0 + dev: false + + /estree-util-visit@1.2.1: + resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/unist': 2.0.7 + dev: false + + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.1 + dev: false + + /execa@0.8.0: + resolution: {integrity: sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==} + engines: {node: '>=4'} + dependencies: + cross-spawn: 5.1.0 + get-stream: 3.0.0 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.7 + strip-eof: 1.0.0 + dev: false + + /extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 0.1.1 + dev: false + + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: false + + /fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /flexsearch@0.7.31: + resolution: {integrity: sha512-XGozTsMPYkm+6b5QL3Z9wQcJjNYxp0CYn3U1gO7dwD6PAqU1SVWZxI9CCg3z+ml3YfqdPnrBehaBrnH2AGKbNA==} + dev: false + + /focus-visible@5.2.0: + resolution: {integrity: sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==} + dev: false + + /fraction.js@4.2.0: + resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /get-stream@3.0.0: + resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} + engines: {node: '>=4'} + dev: false + + /git-up@7.0.0: + resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} + dependencies: + is-ssh: 1.4.0 + parse-url: 8.1.0 + dev: false + + /git-url-parse@13.1.0: + resolution: {integrity: sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==} + dependencies: + git-up: 7.0.0 + dev: false + + /github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + dev: false + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + dev: false + + /glob@7.1.6: + resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: false + + /gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + dependencies: + js-yaml: 3.14.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + dev: false + + /has-flag@2.0.0: + resolution: {integrity: sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==} + engines: {node: '>=0.10.0'} + dev: false + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /hash-obj@4.0.0: + resolution: {integrity: sha512-FwO1BUVWkyHasWDW4S8o0ssQXjvyghLV2rfVhnN36b2bbcj45eGiuzdn9XOvOpjV3TKQD7Gm2BWNXdE9V4KKYg==} + engines: {node: '>=12'} + dependencies: + is-obj: 3.0.0 + sort-keys: 5.0.0 + type-fest: 1.4.0 + dev: false + + /hast-util-from-dom@4.2.0: + resolution: {integrity: sha512-t1RJW/OpJbCAJQeKi3Qrj1cAOLA0+av/iPFori112+0X7R3wng+jxLA+kXec8K4szqPRGI8vPxbbpEYvvpwaeQ==} + dependencies: + hastscript: 7.2.0 + web-namespaces: 2.0.1 + dev: false + + /hast-util-from-html-isomorphic@1.0.0: + resolution: {integrity: sha512-Yu480AKeOEN/+l5LA674a+7BmIvtDj24GvOt7MtQWuhzUwlaaRWdEPXAh3Qm5vhuthpAipFb2vTetKXWOjmTvw==} + dependencies: + '@types/hast': 2.3.5 + hast-util-from-dom: 4.2.0 + hast-util-from-html: 1.0.2 + unist-util-remove-position: 4.0.2 + dev: false + + /hast-util-from-html@1.0.2: + resolution: {integrity: sha512-LhrTA2gfCbLOGJq2u/asp4kwuG0y6NhWTXiPKP+n0qNukKy7hc10whqqCFfyvIA1Q5U5d0sp9HhNim9gglEH4A==} + dependencies: + '@types/hast': 2.3.5 + hast-util-from-parse5: 7.1.2 + parse5: 7.1.2 + vfile: 5.3.7 + vfile-message: 3.1.4 + dev: false + + /hast-util-from-parse5@7.1.2: + resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==} + dependencies: + '@types/hast': 2.3.5 + '@types/unist': 2.0.7 + hastscript: 7.2.0 + property-information: 6.2.0 + vfile: 5.3.7 + vfile-location: 4.1.0 + web-namespaces: 2.0.1 + dev: false + + /hast-util-is-element@2.1.3: + resolution: {integrity: sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA==} + dependencies: + '@types/hast': 2.3.5 + '@types/unist': 2.0.7 + dev: false + + /hast-util-parse-selector@3.1.1: + resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} + dependencies: + '@types/hast': 2.3.5 + dev: false + + /hast-util-to-estree@2.3.3: + resolution: {integrity: sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==} + dependencies: + '@types/estree': 1.0.1 + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.5 + '@types/unist': 2.0.7 + comma-separated-tokens: 2.0.3 + estree-util-attach-comments: 2.1.1 + estree-util-is-identifier-name: 2.1.0 + hast-util-whitespace: 2.0.1 + mdast-util-mdx-expression: 1.3.2 + mdast-util-mdxjs-esm: 1.3.1 + property-information: 6.2.0 + space-separated-tokens: 2.0.2 + style-to-object: 0.4.2 + unist-util-position: 4.0.4 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /hast-util-to-text@3.1.2: + resolution: {integrity: sha512-tcllLfp23dJJ+ju5wCCZHVpzsQQ43+moJbqVX3jNWPB7z/KFC4FyZD6R7y94cHL6MQ33YtMZL8Z0aIXXI4XFTw==} + dependencies: + '@types/hast': 2.3.5 + '@types/unist': 2.0.7 + hast-util-is-element: 2.1.3 + unist-util-find-after: 4.0.1 + dev: false + + /hast-util-whitespace@2.0.1: + resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} + dev: false + + /hastscript@7.2.0: + resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} + dependencies: + '@types/hast': 2.3.5 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 3.1.1 + property-information: 6.2.0 + space-separated-tokens: 2.0.2 + dev: false + + /heap@0.2.7: + resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} + dev: false + + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + dev: false + + /internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + dev: false + + /internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + dev: false + + /intersection-observer@0.12.2: + resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==} + dev: false + + /is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + dev: false + + /is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + dev: false + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + dev: false + + /is-core-module@2.13.0: + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + dependencies: + has: 1.0.3 + dev: true + + /is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + dev: false + + /is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + dev: false + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + dev: false + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-obj@3.0.0: + resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} + engines: {node: '>=12'} + dev: false + + /is-plain-obj@3.0.0: + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} + engines: {node: '>=10'} + dev: false + + /is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + dev: false + + /is-reference@3.0.1: + resolution: {integrity: sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w==} + dependencies: + '@types/estree': 1.0.1 + dev: false + + /is-ssh@1.4.0: + resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==} + dependencies: + protocols: 2.0.1 + dev: false + + /is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + dev: false + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: false + + /jiti@1.19.1: + resolution: {integrity: sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==} + hasBin: true + dev: true + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: false + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: false + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: false + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: false + + /katex@0.16.8: + resolution: {integrity: sha512-ftuDnJbcbOckGY11OO+zg3OofESlbR5DRl2cmN8HeWeeFIV7wTXvAOx8kEjZjobhA+9wh2fbKeO6cdcA9Mnovg==} + hasBin: true + dependencies: + commander: 8.3.0 + dev: false + + /khroma@2.0.0: + resolution: {integrity: sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==} + dev: false + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: false + + /kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + dev: false + + /layout-base@1.0.2: + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + dev: false + + /layout-base@2.0.1: + resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} + dev: false + + /lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + dev: true + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + dev: false + + /lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + dev: false + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: false + + /longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + dev: false + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: false + + /lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 + dev: false + + /markdown-extensions@1.1.1: + resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==} + engines: {node: '>=0.10.0'} + dev: false + + /markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + dev: false + + /match-sorter@6.3.1: + resolution: {integrity: sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==} + dependencies: + '@babel/runtime': 7.22.10 + remove-accents: 0.4.2 + dev: false + + /mdast-util-definitions@5.1.2: + resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} + dependencies: + '@types/mdast': 3.0.12 + '@types/unist': 2.0.7 + unist-util-visit: 4.1.2 + dev: false + + /mdast-util-find-and-replace@2.2.2: + resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} + dependencies: + '@types/mdast': 3.0.12 + escape-string-regexp: 5.0.0 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + dev: false + + /mdast-util-from-markdown@1.3.1: + resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} + dependencies: + '@types/mdast': 3.0.12 + '@types/unist': 2.0.7 + decode-named-character-reference: 1.0.2 + mdast-util-to-string: 3.2.0 + micromark: 3.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-decode-string: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-stringify-position: 3.0.3 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-autolink-literal@1.0.3: + resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} + dependencies: + '@types/mdast': 3.0.12 + ccount: 2.0.1 + mdast-util-find-and-replace: 2.2.2 + micromark-util-character: 1.2.0 + dev: false + + /mdast-util-gfm-footnote@1.0.2: + resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-to-markdown: 1.5.0 + micromark-util-normalize-identifier: 1.1.0 + dev: false + + /mdast-util-gfm-strikethrough@1.0.3: + resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-to-markdown: 1.5.0 + dev: false + + /mdast-util-gfm-table@1.0.7: + resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} + dependencies: + '@types/mdast': 3.0.12 + markdown-table: 3.0.3 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-task-list-item@1.0.2: + resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-to-markdown: 1.5.0 + dev: false + + /mdast-util-gfm@2.0.2: + resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} + dependencies: + mdast-util-from-markdown: 1.3.1 + mdast-util-gfm-autolink-literal: 1.0.3 + mdast-util-gfm-footnote: 1.0.2 + mdast-util-gfm-strikethrough: 1.0.3 + mdast-util-gfm-table: 1.0.7 + mdast-util-gfm-task-list-item: 1.0.2 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-math@2.0.2: + resolution: {integrity: sha512-8gmkKVp9v6+Tgjtq6SYx9kGPpTf6FVYRa53/DLh479aldR9AyP48qeVOgNZ5X7QUK7nOy4yw7vg6mbiGcs9jWQ==} + dependencies: + '@types/mdast': 3.0.12 + longest-streak: 3.1.0 + mdast-util-to-markdown: 1.5.0 + dev: false + + /mdast-util-mdx-expression@1.3.2: + resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.5 + '@types/mdast': 3.0.12 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx-jsx@2.1.4: + resolution: {integrity: sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.5 + '@types/mdast': 3.0.12 + '@types/unist': 2.0.7 + ccount: 2.0.1 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.3 + unist-util-remove-position: 4.0.2 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx@2.0.1: + resolution: {integrity: sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==} + dependencies: + mdast-util-from-markdown: 1.3.1 + mdast-util-mdx-expression: 1.3.2 + mdast-util-mdx-jsx: 2.1.4 + mdast-util-mdxjs-esm: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdxjs-esm@1.3.1: + resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.5 + '@types/mdast': 3.0.12 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-phrasing@3.0.1: + resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} + dependencies: + '@types/mdast': 3.0.12 + unist-util-is: 5.2.1 + dev: false + + /mdast-util-to-hast@12.3.0: + resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} + dependencies: + '@types/hast': 2.3.5 + '@types/mdast': 3.0.12 + mdast-util-definitions: 5.1.2 + micromark-util-sanitize-uri: 1.2.0 + trim-lines: 3.0.1 + unist-util-generated: 2.0.1 + unist-util-position: 4.0.4 + unist-util-visit: 4.1.2 + dev: false + + /mdast-util-to-markdown@1.5.0: + resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} + dependencies: + '@types/mdast': 3.0.12 + '@types/unist': 2.0.7 + longest-streak: 3.1.0 + mdast-util-phrasing: 3.0.1 + mdast-util-to-string: 3.2.0 + micromark-util-decode-string: 1.1.0 + unist-util-visit: 4.1.2 + zwitch: 2.0.4 + dev: false + + /mdast-util-to-string@3.2.0: + resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + dependencies: + '@types/mdast': 3.0.12 + dev: false + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /mermaid@10.3.0: + resolution: {integrity: sha512-H5quxuQjwXC8M1WuuzhAp2TdqGg74t5skfDBrNKJ7dt3z8Wprl5S6h9VJsRhoBUTSs1TMtHEdplLhCqXleZZLw==} + dependencies: + '@braintree/sanitize-url': 6.0.4 + '@types/d3-scale': 4.0.3 + '@types/d3-scale-chromatic': 3.0.0 + cytoscape: 3.26.0 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.26.0) + cytoscape-fcose: 2.2.0(cytoscape@3.26.0) + d3: 7.8.5 + d3-sankey: 0.12.3 + dagre-d3-es: 7.0.10 + dayjs: 1.11.9 + dompurify: 3.0.5 + elkjs: 0.8.2 + khroma: 2.0.0 + lodash-es: 4.17.21 + mdast-util-from-markdown: 1.3.1 + non-layered-tidy-tree-layout: 2.0.2 + stylis: 4.3.0 + ts-dedent: 2.2.0 + uuid: 9.0.0 + web-worker: 1.2.0 + transitivePeerDependencies: + - supports-color + dev: false + + /micromark-core-commonmark@1.1.0: + resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-factory-destination: 1.1.0 + micromark-factory-label: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-factory-title: 1.1.0 + micromark-factory-whitespace: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-html-tag-name: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm-autolink-literal@1.0.5: + resolution: {integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-extension-gfm-footnote@1.1.2: + resolution: {integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==} + dependencies: + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm-strikethrough@1.0.7: + resolution: {integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==} + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm-table@1.0.7: + resolution: {integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm-tagfilter@1.0.2: + resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==} + dependencies: + micromark-util-types: 1.1.0 + dev: false + + /micromark-extension-gfm-task-list-item@1.0.5: + resolution: {integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm@2.0.3: + resolution: {integrity: sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==} + dependencies: + micromark-extension-gfm-autolink-literal: 1.0.5 + micromark-extension-gfm-footnote: 1.1.2 + micromark-extension-gfm-strikethrough: 1.0.7 + micromark-extension-gfm-table: 1.0.7 + micromark-extension-gfm-tagfilter: 1.0.2 + micromark-extension-gfm-task-list-item: 1.0.5 + micromark-util-combine-extensions: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-extension-math@2.1.2: + resolution: {integrity: sha512-es0CcOV89VNS9wFmyn+wyFTKweXGW4CEvdaAca6SWRWPyYCbBisnjaHLjWO4Nszuiud84jCpkHsqAJoa768Pvg==} + dependencies: + '@types/katex': 0.16.2 + katex: 0.16.8 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-extension-mdx-expression@1.0.8: + resolution: {integrity: sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==} + dependencies: + '@types/estree': 1.0.1 + micromark-factory-mdx-expression: 1.0.9 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-extension-mdx-jsx@1.0.5: + resolution: {integrity: sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==} + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.1 + estree-util-is-identifier-name: 2.1.0 + micromark-factory-mdx-expression: 1.0.9 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + vfile-message: 3.1.4 + dev: false + + /micromark-extension-mdx-md@1.0.1: + resolution: {integrity: sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==} + dependencies: + micromark-util-types: 1.1.0 + dev: false + + /micromark-extension-mdxjs-esm@1.0.5: + resolution: {integrity: sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==} + dependencies: + '@types/estree': 1.0.1 + micromark-core-commonmark: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-position-from-estree: 1.1.2 + uvu: 0.5.6 + vfile-message: 3.1.4 + dev: false + + /micromark-extension-mdxjs@1.0.1: + resolution: {integrity: sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==} + dependencies: + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) + micromark-extension-mdx-expression: 1.0.8 + micromark-extension-mdx-jsx: 1.0.5 + micromark-extension-mdx-md: 1.0.1 + micromark-extension-mdxjs-esm: 1.0.5 + micromark-util-combine-extensions: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-factory-destination@1.1.0: + resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-factory-label@1.1.0: + resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-factory-mdx-expression@1.0.9: + resolution: {integrity: sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==} + dependencies: + '@types/estree': 1.0.1 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-position-from-estree: 1.1.2 + uvu: 0.5.6 + vfile-message: 3.1.4 + dev: false + + /micromark-factory-space@1.1.0: + resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-factory-title@1.1.0: + resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-factory-whitespace@1.1.0: + resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-util-character@1.2.0: + resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-util-chunked@1.1.0: + resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} + dependencies: + micromark-util-symbol: 1.1.0 + dev: false + + /micromark-util-classify-character@1.1.0: + resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-util-combine-extensions@1.1.0: + resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-util-decode-numeric-character-reference@1.1.0: + resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} + dependencies: + micromark-util-symbol: 1.1.0 + dev: false + + /micromark-util-decode-string@1.1.0: + resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 1.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-symbol: 1.1.0 + dev: false + + /micromark-util-encode@1.1.0: + resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + dev: false + + /micromark-util-events-to-acorn@1.2.3: + resolution: {integrity: sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==} + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.1 + '@types/unist': 2.0.7 + estree-util-visit: 1.2.1 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + vfile-message: 3.1.4 + dev: false + + /micromark-util-html-tag-name@1.2.0: + resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + dev: false + + /micromark-util-normalize-identifier@1.1.0: + resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} + dependencies: + micromark-util-symbol: 1.1.0 + dev: false + + /micromark-util-resolve-all@1.1.0: + resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} + dependencies: + micromark-util-types: 1.1.0 + dev: false + + /micromark-util-sanitize-uri@1.2.0: + resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-encode: 1.1.0 + micromark-util-symbol: 1.1.0 + dev: false + + /micromark-util-subtokenize@1.1.0: + resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-util-symbol@1.1.0: + resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + dev: false + + /micromark-util-types@1.1.0: + resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + dev: false + + /micromark@3.2.0: + resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} + dependencies: + '@types/debug': 4.1.8 + debug: 4.3.4 + decode-named-character-reference: 1.0.2 + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-combine-extensions: 1.1.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-encode: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + dev: false + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + dev: false + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: false + + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: true + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + /next-mdx-remote@4.4.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-1BvyXaIou6xy3XoNF4yaMZUCb6vD2GTAa5ciOa6WoO+gAUTYsb1K4rI/HSC2ogAWLrb/7VSV52skz07vOzmqIQ==} + engines: {node: '>=14', npm: '>=7'} + peerDependencies: + react: '>=16.x <=18.x' + react-dom: '>=16.x <=18.x' + dependencies: + '@mdx-js/mdx': 2.3.0 + '@mdx-js/react': 2.3.0(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + vfile: 5.3.7 + vfile-matter: 3.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /next-seo@6.1.0(next@13.4.13)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-iMBpFoJsR5zWhguHJvsoBDxDSmdYTHtnVPB1ij+CD0NReQCP78ZxxbdL9qkKIf4oEuZEqZkrjAQLB0bkII7RYA==} + peerDependencies: + next: ^8.1.1-canary.54 || >=9.0.0 + react: '>=16.0.0' + react-dom: '>=16.0.0' + dependencies: + next: 13.4.13(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /next-themes@0.2.1(next@13.4.13)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==} + peerDependencies: + next: '*' + react: '*' + react-dom: '*' + dependencies: + next: 13.4.13(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /next@13.4.13(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-A3YVbVDNeXLhWsZ8Nf6IkxmNlmTNz0yVg186NJ97tGZqPDdPzTrHotJ+A1cuJm2XfuWPrKOUZILl5iBQkIf8Jw==} + engines: {node: '>=16.8.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + sass: + optional: true + dependencies: + '@next/env': 13.4.13 + '@swc/helpers': 0.5.1 + busboy: 1.6.0 + caniuse-lite: 1.0.30001519 + postcss: 8.4.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + styled-jsx: 5.1.1(react@18.2.0) + watchpack: 2.4.0 + zod: 3.21.4 + optionalDependencies: + '@next/swc-darwin-arm64': 13.4.13 + '@next/swc-darwin-x64': 13.4.13 + '@next/swc-linux-arm64-gnu': 13.4.13 + '@next/swc-linux-arm64-musl': 13.4.13 + '@next/swc-linux-x64-gnu': 13.4.13 + '@next/swc-linux-x64-musl': 13.4.13 + '@next/swc-win32-arm64-msvc': 13.4.13 + '@next/swc-win32-ia32-msvc': 13.4.13 + '@next/swc-win32-x64-msvc': 13.4.13 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + dev: false + + /nextra-theme-docs@2.10.0(next@13.4.13)(nextra@2.10.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-uXoqRoewbu0JoqQ1m67aIztWe9/nEhcSeHMimhLxZghKZxkYN0kTR5y5jmrwOHRPuJUTLL2YFwy1rvWJIZS2lw==} + peerDependencies: + next: '>=9.5.3' + nextra: 2.10.0 + react: '>=16.13.1' + react-dom: '>=16.13.1' + dependencies: + '@headlessui/react': 1.7.16(react-dom@18.2.0)(react@18.2.0) + '@popperjs/core': 2.11.8 + clsx: 1.2.1 + flexsearch: 0.7.31 + focus-visible: 5.2.0 + git-url-parse: 13.1.0 + intersection-observer: 0.12.2 + match-sorter: 6.3.1 + next: 13.4.13(react-dom@18.2.0)(react@18.2.0) + next-seo: 6.1.0(next@13.4.13)(react-dom@18.2.0)(react@18.2.0) + next-themes: 0.2.1(next@13.4.13)(react-dom@18.2.0)(react@18.2.0) + nextra: 2.10.0(next@13.4.13)(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + scroll-into-view-if-needed: 3.0.10 + zod: 3.21.4 + dev: false + + /nextra@2.10.0(next@13.4.13)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-euv93UnWpdth8slMRJLqMrWvCCzR/VTVH6DPrn1JW7hZS03c2lzG2q+fsiYULGiy/kFyysmlxd4Nx5KGB1Txwg==} + engines: {node: '>=16'} + peerDependencies: + next: '>=9.5.3' + react: '>=16.13.1' + react-dom: '>=16.13.1' + dependencies: + '@headlessui/react': 1.7.16(react-dom@18.2.0)(react@18.2.0) + '@mdx-js/mdx': 2.3.0 + '@mdx-js/react': 2.3.0(react@18.2.0) + '@napi-rs/simple-git': 0.1.8 + '@theguild/remark-mermaid': 0.0.4(react@18.2.0) + '@theguild/remark-npm2yarn': 0.1.1 + clsx: 1.2.1 + github-slugger: 2.0.0 + graceful-fs: 4.2.11 + gray-matter: 4.0.3 + katex: 0.16.8 + lodash.get: 4.4.2 + next: 13.4.13(react-dom@18.2.0)(react@18.2.0) + next-mdx-remote: 4.4.1(react-dom@18.2.0)(react@18.2.0) + p-limit: 3.1.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + rehype-katex: 6.0.3 + rehype-pretty-code: 0.9.11(shiki@0.14.3) + remark-gfm: 3.0.1 + remark-math: 5.1.1 + remark-reading-time: 2.0.1 + shiki: 0.14.3 + slash: 3.0.0 + title: 3.5.3 + unist-util-remove: 4.0.0 + unist-util-visit: 5.0.0 + zod: 3.21.4 + transitivePeerDependencies: + - supports-color + dev: false + + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + dev: true + + /non-layered-tidy-tree-layout@2.0.2: + resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} + dev: false + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: true + + /npm-run-path@2.0.2: + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} + engines: {node: '>=4'} + dependencies: + path-key: 2.0.1 + dev: false + + /npm-to-yarn@2.0.0: + resolution: {integrity: sha512-/IbjiJ7vqbxfxJxAZ+QI9CCRjnIbvGxn5KQcSY9xHh0lMKc/Sgqmm7yp7KPmd6TiTZX5/KiSBKlkGHo59ucZbg==} + engines: {node: '>=6.0.0'} + dev: false + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + + /object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + dev: false + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: false + + /parse-entities@4.0.1: + resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + dependencies: + '@types/unist': 2.0.7 + character-entities: 2.0.2 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + dev: false + + /parse-numeric-range@1.3.0: + resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} + dev: false + + /parse-path@7.0.0: + resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} + dependencies: + protocols: 2.0.1 + dev: false + + /parse-url@8.1.0: + resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} + dependencies: + parse-path: 7.0.0 + dev: false + + /parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + dependencies: + entities: 4.5.0 + dev: false + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + dev: false + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /periscopic@3.1.0: + resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + dependencies: + '@types/estree': 1.0.1 + estree-walker: 3.0.3 + is-reference: 3.0.1 + dev: false + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: true + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: true + + /postcss-import@15.1.0(postcss@8.4.27): + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.4 + dev: true + + /postcss-js@4.0.1(postcss@8.4.27): + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.27 + dev: true + + /postcss-load-config@4.0.1(postcss@8.4.27): + resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 2.1.0 + postcss: 8.4.27 + yaml: 2.3.1 + dev: true + + /postcss-nested@6.0.1(postcss@8.4.27): + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.27 + postcss-selector-parser: 6.0.13 + dev: true + + /postcss-selector-parser@6.0.13: + resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: true + + /postcss@8.4.14: + resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: false + + /postcss@8.4.27: + resolution: {integrity: sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /property-information@6.2.0: + resolution: {integrity: sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==} + dev: false + + /protocols@2.0.1: + resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} + dev: false + + /pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + dev: false + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /react-dom@18.2.0(react@18.2.0): + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + dev: false + + /react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + dev: false + + /read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + dev: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /reading-time@1.5.0: + resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} + dev: false + + /regenerator-runtime@0.14.0: + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + dev: false + + /rehype-katex@6.0.3: + resolution: {integrity: sha512-ByZlRwRUcWegNbF70CVRm2h/7xy7jQ3R9LaY4VVSvjnoVWwWVhNL60DiZsBpC5tSzYQOCvDbzncIpIjPZWodZA==} + dependencies: + '@types/hast': 2.3.5 + '@types/katex': 0.14.0 + hast-util-from-html-isomorphic: 1.0.0 + hast-util-to-text: 3.1.2 + katex: 0.16.8 + unist-util-visit: 4.1.2 + dev: false + + /rehype-pretty-code@0.9.11(shiki@0.14.3): + resolution: {integrity: sha512-Eq90eCYXQJISktfRZ8PPtwc5SUyH6fJcxS8XOMnHPUQZBtC6RYo67gGlley9X2nR8vlniPj0/7oCDEYHKQa/oA==} + engines: {node: '>=16'} + peerDependencies: + shiki: '*' + dependencies: + '@types/hast': 2.3.5 + hash-obj: 4.0.0 + parse-numeric-range: 1.3.0 + shiki: 0.14.3 + dev: false + + /remark-gfm@3.0.1: + resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-gfm: 2.0.2 + micromark-extension-gfm: 2.0.3 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-math@5.1.1: + resolution: {integrity: sha512-cE5T2R/xLVtfFI4cCePtiRn+e6jKMtFDR3P8V3qpv8wpKjwvHoBA4eJzvX+nVrnlNy0911bdGmuspCSwetfYHw==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-math: 2.0.2 + micromark-extension-math: 2.1.2 + unified: 10.1.2 + dev: false + + /remark-mdx@2.3.0: + resolution: {integrity: sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==} + dependencies: + mdast-util-mdx: 2.0.1 + micromark-extension-mdxjs: 1.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-parse@10.0.2: + resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-from-markdown: 1.3.1 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-reading-time@2.0.1: + resolution: {integrity: sha512-fy4BKy9SRhtYbEHvp6AItbRTnrhiDGbqLQTSYVbQPGuRCncU1ubSsh9p/W5QZSxtYcUXv8KGL0xBgPLyNJA1xw==} + dependencies: + estree-util-is-identifier-name: 2.1.0 + estree-util-value-to-estree: 1.3.0 + reading-time: 1.5.0 + unist-util-visit: 3.1.0 + dev: false + + /remark-rehype@10.1.0: + resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} + dependencies: + '@types/hast': 2.3.5 + '@types/mdast': 3.0.12 + mdast-util-to-hast: 12.3.0 + unified: 10.1.2 + dev: false + + /remove-accents@0.4.2: + resolution: {integrity: sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==} + dev: false + + /resolve@1.22.4: + resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} + hasBin: true + dependencies: + is-core-module: 2.13.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + dev: false + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + dev: false + + /sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + dependencies: + mri: 1.2.0 + dev: false + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: false + + /scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /scroll-into-view-if-needed@3.0.10: + resolution: {integrity: sha512-t44QCeDKAPf1mtQH3fYpWz8IM/DyvHLjs8wUvvwMYxk5moOqCzrMSxK6HQVD0QVmVjXFavoFIPRVrMuJPKAvtg==} + dependencies: + compute-scroll-into-view: 3.0.3 + dev: false + + /section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + dev: false + + /shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + dependencies: + shebang-regex: 1.0.0 + dev: false + + /shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + dev: false + + /shiki@0.14.3: + resolution: {integrity: sha512-U3S/a+b0KS+UkTyMjoNojvTgrBHjgp7L6ovhFVZsXmBGnVdQ4K4U9oK0z63w538S91ATngv1vXigHCSWOwnr+g==} + dependencies: + ansi-sequence-parser: 1.1.1 + jsonc-parser: 3.2.0 + vscode-oniguruma: 1.7.0 + vscode-textmate: 8.0.0 + dev: false + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: false + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: false + + /sort-keys@5.0.0: + resolution: {integrity: sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw==} + engines: {node: '>=12'} + dependencies: + is-plain-obj: 4.1.0 + dev: false + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + dev: false + + /space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + dev: false + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: false + + /streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + dev: false + + /stringify-entities@4.0.3: + resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + dev: false + + /strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + dev: false + + /strip-eof@1.0.0: + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} + engines: {node: '>=0.10.0'} + dev: false + + /style-to-object@0.4.2: + resolution: {integrity: sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA==} + dependencies: + inline-style-parser: 0.1.1 + dev: false + + /styled-jsx@5.1.1(react@18.2.0): + resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + dependencies: + client-only: 0.0.1 + react: 18.2.0 + dev: false + + /stylis@4.3.0: + resolution: {integrity: sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==} + dev: false + + /sucrase@3.34.0: + resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} + engines: {node: '>=8'} + hasBin: true + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + commander: 4.1.1 + glob: 7.1.6 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + dev: true + + /supports-color@4.5.0: + resolution: {integrity: sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw==} + engines: {node: '>=4'} + dependencies: + has-flag: 2.0.0 + dev: false + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /tailwindcss@3.3.3: + resolution: {integrity: sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.5.3 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.1 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.19.1 + lilconfig: 2.1.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.27 + postcss-import: 15.1.0(postcss@8.4.27) + postcss-js: 4.0.1(postcss@8.4.27) + postcss-load-config: 4.0.1(postcss@8.4.27) + postcss-nested: 6.0.1(postcss@8.4.27) + postcss-selector-parser: 6.0.13 + resolve: 1.22.4 + sucrase: 3.34.0 + transitivePeerDependencies: + - ts-node + dev: true + + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: true + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: true + + /title@3.5.3: + resolution: {integrity: sha512-20JyowYglSEeCvZv3EZ0nZ046vLarO37prvV0mbtQV7C8DJPGgN967r8SJkqd3XK3K3lD3/Iyfp3avjfil8Q2Q==} + hasBin: true + dependencies: + arg: 1.0.0 + chalk: 2.3.0 + clipboardy: 1.2.2 + titleize: 1.0.0 + dev: false + + /titleize@1.0.0: + resolution: {integrity: sha512-TARUb7z1pGvlLxgPk++7wJ6aycXF3GJ0sNSBTAsTuJrQG5QuZlkUQP+zl+nbjAh4gMX9yDw9ZYklMd7vAfJKEw==} + engines: {node: '>=0.10.0'} + dev: false + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + dev: false + + /trough@2.1.0: + resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} + dev: false + + /ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + dev: false + + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + dev: true + + /tslib@2.6.1: + resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} + dev: false + + /type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + dev: false + + /typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + + /unified@10.1.2: + resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + dependencies: + '@types/unist': 2.0.7 + bail: 2.0.2 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 4.1.0 + trough: 2.1.0 + vfile: 5.3.7 + dev: false + + /unist-util-find-after@4.0.1: + resolution: {integrity: sha512-QO/PuPMm2ERxC6vFXEPtmAutOopy5PknD+Oq64gGwxKtk4xwo9Z97t9Av1obPmGU0IyTa6EKYUfTrK2QJS3Ozw==} + dependencies: + '@types/unist': 2.0.7 + unist-util-is: 5.2.1 + dev: false + + /unist-util-generated@2.0.1: + resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} + dev: false + + /unist-util-is@5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + dependencies: + '@types/unist': 2.0.7 + dev: false + + /unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + dependencies: + '@types/unist': 3.0.0 + dev: false + + /unist-util-position-from-estree@1.1.2: + resolution: {integrity: sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==} + dependencies: + '@types/unist': 2.0.7 + dev: false + + /unist-util-position@4.0.4: + resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} + dependencies: + '@types/unist': 2.0.7 + dev: false + + /unist-util-remove-position@4.0.2: + resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==} + dependencies: + '@types/unist': 2.0.7 + unist-util-visit: 4.1.2 + dev: false + + /unist-util-remove@4.0.0: + resolution: {integrity: sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg==} + dependencies: + '@types/unist': 3.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + dev: false + + /unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + dependencies: + '@types/unist': 2.0.7 + dev: false + + /unist-util-visit-parents@4.1.1: + resolution: {integrity: sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==} + dependencies: + '@types/unist': 2.0.7 + unist-util-is: 5.2.1 + dev: false + + /unist-util-visit-parents@5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + dependencies: + '@types/unist': 2.0.7 + unist-util-is: 5.2.1 + dev: false + + /unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + dependencies: + '@types/unist': 3.0.0 + unist-util-is: 6.0.0 + dev: false + + /unist-util-visit@3.1.0: + resolution: {integrity: sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==} + dependencies: + '@types/unist': 2.0.7 + unist-util-is: 5.2.1 + unist-util-visit-parents: 4.1.1 + dev: false + + /unist-util-visit@4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + dependencies: + '@types/unist': 2.0.7 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + dev: false + + /unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + dependencies: + '@types/unist': 3.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + dev: false + + /update-browserslist-db@1.0.11(browserslist@4.21.10): + resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.10 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /uuid@9.0.0: + resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} + hasBin: true + dev: false + + /uvu@0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + dequal: 2.0.3 + diff: 5.1.0 + kleur: 4.1.5 + sade: 1.8.1 + dev: false + + /vfile-location@4.1.0: + resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} + dependencies: + '@types/unist': 2.0.7 + vfile: 5.3.7 + dev: false + + /vfile-matter@3.0.1: + resolution: {integrity: sha512-CAAIDwnh6ZdtrqAuxdElUqQRQDQgbbIrYtDYI8gCjXS1qQ+1XdLoK8FIZWxJwn0/I+BkSSZpar3SOgjemQz4fg==} + dependencies: + '@types/js-yaml': 4.0.5 + is-buffer: 2.0.5 + js-yaml: 4.1.0 + dev: false + + /vfile-message@3.1.4: + resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + dependencies: + '@types/unist': 2.0.7 + unist-util-stringify-position: 3.0.3 + dev: false + + /vfile@5.3.7: + resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} + dependencies: + '@types/unist': 2.0.7 + is-buffer: 2.0.5 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + dev: false + + /vscode-oniguruma@1.7.0: + resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} + dev: false + + /vscode-textmate@8.0.0: + resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} + dev: false + + /watchpack@2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + dev: false + + /web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + dev: false + + /web-worker@1.2.0: + resolution: {integrity: sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==} + dev: false + + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: false + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + dev: false + + /yaml@2.3.1: + resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} + engines: {node: '>= 14'} + dev: true + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: false + + /zod@3.21.4: + resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} + dev: false + + /zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + dev: false diff --git a/external/prisma-client-rust/docs/postcss.config.js b/external/prisma-client-rust/docs/postcss.config.js new file mode 100644 index 0000000..c7399ce --- /dev/null +++ b/external/prisma-client-rust/docs/postcss.config.js @@ -0,0 +1,9 @@ +// If you want to use other PostCSS plugins, see the following: +// https://tailwindcss.com/docs/using-with-preprocessors +/** @type {import('postcss').Postcss} */ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/external/prisma-client-rust/docs/style.css b/external/prisma-client-rust/docs/style.css new file mode 100644 index 0000000..b5c61c9 --- /dev/null +++ b/external/prisma-client-rust/docs/style.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/external/prisma-client-rust/docs/tailwind.config.js b/external/prisma-client-rust/docs/tailwind.config.js new file mode 100644 index 0000000..4ad6ef3 --- /dev/null +++ b/external/prisma-client-rust/docs/tailwind.config.js @@ -0,0 +1,13 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + "./pages/**/*.{js,ts,jsx,tsx,mdx}", + "./components/**/*.{js,ts,jsx,tsx}", + "./theme.config.tsx", + ], + theme: { + extend: {}, + }, + plugins: [], + darkMode: "class", +}; diff --git a/external/prisma-client-rust/docs/theme.config.tsx b/external/prisma-client-rust/docs/theme.config.tsx new file mode 100644 index 0000000..f1d0f39 --- /dev/null +++ b/external/prisma-client-rust/docs/theme.config.tsx @@ -0,0 +1,100 @@ +import Link from "next/link"; +import { useRouter } from "next/router"; +import { type DocsThemeConfig, useConfig } from "nextra-theme-docs"; + +const NAME = "Prisma Client Rust"; + +export default { + logo: ( + <> + + + + {NAME} + + ), + project: { + link: "https://github.com/Brendonovich/prisma-client-rust", + }, + docsRepositoryBase: + "https://github.com/Brendonovich/prisma-client-rust/tree/main/docs", + useNextSeoProps() { + const { asPath } = useRouter(); + if (asPath !== "/") { + return { + titleTemplate: `%s – ${NAME}`, + }; + } + }, + footer: { + text: ( + + Apache 2.0 {new Date().getFullYear()} ©{" "} + + Brendonovich + + + ), + }, + navbar: { + extraContent: ( + <> + + + + + + + + + + + + + + ), + }, + head: () => { + const { title } = useConfig(); + const { route } = useRouter(); + + const ogTitle = route === "/" ? NAME : title ? `${title} – ${NAME}` : NAME; + + return ( + <> + + + + + + + + + + + ); + }, + // ... +} as DocsThemeConfig; diff --git a/external/prisma-client-rust/docs/tsconfig.json b/external/prisma-client-rust/docs/tsconfig.json new file mode 100644 index 0000000..4e224ad --- /dev/null +++ b/external/prisma-client-rust/docs/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "strict": false, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "incremental": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve" + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx" + ], + "exclude": [ + "node_modules" + ] +} diff --git a/external/prisma-client-rust/examples/actix/.cargo/config.toml b/external/prisma-client-rust/examples/actix/.cargo/config.toml new file mode 100644 index 0000000..399985d --- /dev/null +++ b/external/prisma-client-rust/examples/actix/.cargo/config.toml @@ -0,0 +1,2 @@ +[alias] +prisma = "run -p prisma-cli --features sqlite --" diff --git a/external/prisma-client-rust/examples/actix/Cargo.toml b/external/prisma-client-rust/examples/actix/Cargo.toml new file mode 100644 index 0000000..1f5fe45 --- /dev/null +++ b/external/prisma-client-rust/examples/actix/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "actix-example" +version = "0.1.0" +edition = "2021" + +[dependencies] +prisma-client-rust = { workspace = true, features = ["migrations", "sqlite"] } +serde = { version = "1.0", features = ["derive"] } +actix-web = "4" diff --git a/external/prisma-client-rust/examples/actix/README.md b/external/prisma-client-rust/examples/actix/README.md new file mode 100644 index 0000000..7066c35 --- /dev/null +++ b/external/prisma-client-rust/examples/actix/README.md @@ -0,0 +1,21 @@ +# Actix Web Example + +This is an example of using [Prisma Client Rust](https://github.com/Brendonovich/prisma-client-rust) with [Actix Web](https://actix.rs/). + +## Running + +Generate the client: + +```bash +cargo prisma generate +``` + +Then run the server: + +```bash +cargo run +``` + +The server will be on [http://localhost:3001](http://localhost:3001) + +Written by [spicyzboss](https://github.com/spicyzboss) diff --git a/external/prisma-client-rust/examples/actix/prisma/migrations/.gitkeep b/external/prisma-client-rust/examples/actix/prisma/migrations/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/external/prisma-client-rust/examples/actix/prisma/schema.prisma b/external/prisma-client-rust/examples/actix/prisma/schema.prisma new file mode 100644 index 0000000..72ee4a0 --- /dev/null +++ b/external/prisma-client-rust/examples/actix/prisma/schema.prisma @@ -0,0 +1,22 @@ +datasource db { + provider = "sqlite" + url = "file:./dev.db" +} + +generator client { + provider = "cargo prisma" + output = "../src/db.rs" +} + +model User { + id String @id @default(uuid()) + displayName String + posts Post[] +} + +model Post { + id String @id @default(uuid()) + content String + user User @relation(fields: [userId], references: [id]) + userId String +} diff --git a/external/prisma-client-rust/examples/actix/src/main.rs b/external/prisma-client-rust/examples/actix/src/main.rs new file mode 100644 index 0000000..5674642 --- /dev/null +++ b/external/prisma-client-rust/examples/actix/src/main.rs @@ -0,0 +1,86 @@ +use actix_web::{get, post, web, App, HttpResponse, HttpServer, Responder}; +use serde::Deserialize; + +#[allow(warnings, unused)] +mod db; + +use db::*; + +#[get("/users")] +async fn get_users(client: web::Data) -> impl Responder { + let users = client.user().find_many(vec![]).exec().await.unwrap(); + + HttpResponse::Ok().json(users) +} + +#[derive(Deserialize)] +struct CreateUserRequest { + display_name: String, +} + +#[post("/user")] +async fn create_user( + client: web::Data, + body: web::Json, +) -> impl Responder { + let user = client + .user() + .create(body.display_name.to_string(), vec![]) + .exec() + .await + .unwrap(); + + HttpResponse::Ok().json(user) +} + +#[get("/posts")] +async fn get_posts(client: web::Data) -> impl Responder { + let posts = client.post().find_many(vec![]).exec().await.unwrap(); + + HttpResponse::Ok().json(posts) +} + +#[derive(Deserialize)] +struct CreatePostRequest { + content: String, + user_id: String, +} + +#[post("/post")] +async fn create_post( + client: web::Data, + body: web::Json, +) -> impl Responder { + let post = client + .post() + .create( + body.content.to_string(), + user::id::equals(body.user_id.to_string()), + vec![], + ) + .exec() + .await + .unwrap(); + + HttpResponse::Ok().json(post) +} + +#[actix_web::main] +async fn main() -> std::io::Result<()> { + let client = web::Data::new(PrismaClient::_builder().build().await.unwrap()); + + #[cfg(debug_assertions)] + client._db_push().await.unwrap(); + + HttpServer::new(move || { + App::new() + .app_data(client.clone()) + .service(get_users) + .service(create_user) + .service(get_posts) + .service(create_post) + }) + .bind(("127.0.0.1", 3001))? + .run() + .await +} diff --git a/external/prisma-client-rust/examples/axum-graphql/.cargo/config.toml b/external/prisma-client-rust/examples/axum-graphql/.cargo/config.toml new file mode 100644 index 0000000..399985d --- /dev/null +++ b/external/prisma-client-rust/examples/axum-graphql/.cargo/config.toml @@ -0,0 +1,2 @@ +[alias] +prisma = "run -p prisma-cli --features sqlite --" diff --git a/external/prisma-client-rust/examples/axum-graphql/Cargo.toml b/external/prisma-client-rust/examples/axum-graphql/Cargo.toml new file mode 100644 index 0000000..677c690 --- /dev/null +++ b/external/prisma-client-rust/examples/axum-graphql/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "axum-graphql-example" +version = "0.1.0" +edition = "2021" + +[dependencies] +prisma-client-rust = { workspace = true, features = ["migrations", "sqlite"] } +tokio = { version = "1.0", features = ["full"] } +serde = { version = "1.0", features = ["derive"] } +axum = "0.5.1" +dotenvy = "0.15.7" +async-graphql = "3.0.12" +async-graphql-axum = "3.0.31" diff --git a/external/prisma-client-rust/examples/axum-graphql/README.md b/external/prisma-client-rust/examples/axum-graphql/README.md new file mode 100644 index 0000000..f1317bf --- /dev/null +++ b/external/prisma-client-rust/examples/axum-graphql/README.md @@ -0,0 +1,27 @@ +# Axum + GraphQL Example + +This is an example of how you could use Prisma Client Rust in a GraphQL backend, written by [Aaron Leopold](https://github.com/aaronleopold). + +## Running + +Generate the client: + +```bash +cargo prisma generate +``` + +Then run the server: + +```bash +cargo run +``` + +## Notes + +The simple use of `async_graphql` means that queries are done in a less efficient manner than could be, +since `with` is never utilised and relations are loaded separately. +Additionally, dataloader is not utilised because I can't be bothered. + +The requirement to redefine all your GraphQL models may be seen by some as a hassle and a downside, +but personally I believe it makes for cleaner separation of database and API as well as cleaner code, +since the model structs will not need to be annotated with GraphQL _and_ ORM attribute macros. diff --git a/external/prisma-client-rust/examples/axum-graphql/prisma/migrations/.gitkeep b/external/prisma-client-rust/examples/axum-graphql/prisma/migrations/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/external/prisma-client-rust/examples/axum-graphql/prisma/schema.prisma b/external/prisma-client-rust/examples/axum-graphql/prisma/schema.prisma new file mode 100644 index 0000000..9309b2e --- /dev/null +++ b/external/prisma-client-rust/examples/axum-graphql/prisma/schema.prisma @@ -0,0 +1,22 @@ +datasource db { + provider = "sqlite" + url = "file:dev.db" +} + +generator client { + provider = "cargo prisma" + output = "../src/db.rs" +} + +model User { + id String @id @default(uuid()) + displayName String + posts Post[] +} + +model Post { + id String @id @default(uuid()) + content String + user User @relation(fields: [userId], references: [id]) + userId String +} diff --git a/external/prisma-client-rust/examples/axum-graphql/src/graphql/mod.rs b/external/prisma-client-rust/examples/axum-graphql/src/graphql/mod.rs new file mode 100644 index 0000000..f6519cb --- /dev/null +++ b/external/prisma-client-rust/examples/axum-graphql/src/graphql/mod.rs @@ -0,0 +1,4 @@ +pub mod mutation; +pub mod query; +pub mod schema; +pub mod types; diff --git a/external/prisma-client-rust/examples/axum-graphql/src/graphql/mutation/mod.rs b/external/prisma-client-rust/examples/axum-graphql/src/graphql/mutation/mod.rs new file mode 100644 index 0000000..904e62c --- /dev/null +++ b/external/prisma-client-rust/examples/axum-graphql/src/graphql/mutation/mod.rs @@ -0,0 +1,10 @@ +pub mod post; +pub mod user; + +pub use post::PostMutation; +pub use user::UserMutation; + +// Add your other ones here to create a unified Mutation object +// e.x. Mutation(PostMutation, OtherMutation, OtherOtherMutation) +#[derive(async_graphql::MergedObject, Default)] +pub struct Mutation(PostMutation, UserMutation); diff --git a/external/prisma-client-rust/examples/axum-graphql/src/graphql/mutation/post.rs b/external/prisma-client-rust/examples/axum-graphql/src/graphql/mutation/post.rs new file mode 100644 index 0000000..6618954 --- /dev/null +++ b/external/prisma-client-rust/examples/axum-graphql/src/graphql/mutation/post.rs @@ -0,0 +1,34 @@ +use async_graphql::{Context, InputObject, Object, Result}; + +use crate::{ + db::{user, PrismaClient}, + graphql::types::Post, +}; + +// I normally separate the input types into separate files/modules, but this is just +// a quick example. + +#[derive(InputObject)] +pub struct CreatePostInput { + pub content: String, + // this really would be grabbed from session or something but just for demo + pub user_id: String, +} + +#[derive(Default)] +pub struct PostMutation; + +#[Object] +impl PostMutation { + pub async fn create_post(&self, ctx: &Context<'_>, input: CreatePostInput) -> Result { + let db = ctx.data::().unwrap(); + + let created = db + .post() + .create(input.content, user::id::equals(input.user_id), vec![]) + .exec() + .await?; + + Ok(created.into()) + } +} diff --git a/external/prisma-client-rust/examples/axum-graphql/src/graphql/mutation/user.rs b/external/prisma-client-rust/examples/axum-graphql/src/graphql/mutation/user.rs new file mode 100644 index 0000000..1bee1ce --- /dev/null +++ b/external/prisma-client-rust/examples/axum-graphql/src/graphql/mutation/user.rs @@ -0,0 +1,22 @@ +use async_graphql::{Context, InputObject, Object, Result}; + +use crate::{db::PrismaClient, graphql::types::User}; + +#[derive(InputObject)] +pub struct CreateUserInput { + pub display_name: String, +} + +#[derive(Default)] +pub struct UserMutation; + +#[Object] +impl UserMutation { + pub async fn create_user(&self, ctx: &Context<'_>, input: CreateUserInput) -> Result { + let db = ctx.data::().unwrap(); + + let created = db.user().create(input.display_name, vec![]).exec().await?; + + Ok(created.into()) + } +} diff --git a/external/prisma-client-rust/examples/axum-graphql/src/graphql/query/mod.rs b/external/prisma-client-rust/examples/axum-graphql/src/graphql/query/mod.rs new file mode 100644 index 0000000..2a347eb --- /dev/null +++ b/external/prisma-client-rust/examples/axum-graphql/src/graphql/query/mod.rs @@ -0,0 +1,10 @@ +pub mod post; +pub mod user; + +pub use post::PostQuery; +pub use user::UserQuery; + +// Add your other ones here to create a unified Query object +// e.x. Query(PostQuery, OtherQuery, OtherOtherQuery) +#[derive(async_graphql::MergedObject, Default)] +pub struct Query(PostQuery, UserQuery); diff --git a/external/prisma-client-rust/examples/axum-graphql/src/graphql/query/post.rs b/external/prisma-client-rust/examples/axum-graphql/src/graphql/query/post.rs new file mode 100644 index 0000000..2eea211 --- /dev/null +++ b/external/prisma-client-rust/examples/axum-graphql/src/graphql/query/post.rs @@ -0,0 +1,22 @@ +use async_graphql::{Context, Object, Result}; + +use crate::{db::PrismaClient, graphql::types::Post}; + +#[derive(Default)] +pub struct PostQuery; + +#[Object] +impl PostQuery { + async fn get_posts(&self, ctx: &Context<'_>) -> Result> { + let db = ctx.data::().unwrap(); + + Ok(db + .post() + .find_many(vec![]) + .exec() + .await? + .into_iter() + .map(|p| p.into()) + .collect()) + } +} diff --git a/external/prisma-client-rust/examples/axum-graphql/src/graphql/query/user.rs b/external/prisma-client-rust/examples/axum-graphql/src/graphql/query/user.rs new file mode 100644 index 0000000..c899deb --- /dev/null +++ b/external/prisma-client-rust/examples/axum-graphql/src/graphql/query/user.rs @@ -0,0 +1,36 @@ +use async_graphql::{Context, Object, Result}; + +use crate::{ + db::{user, PrismaClient}, + graphql::types::User, +}; + +#[derive(Default)] +pub struct UserQuery; + +#[Object] +impl UserQuery { + async fn get_users(&self, ctx: &Context<'_>) -> Result> { + let db = ctx.data::().unwrap(); + + Ok(db + .user() + .find_many(vec![]) + .exec() + .await? + .into_iter() + .map(|u| u.into()) + .collect()) + } + + async fn get_user(&self, ctx: &Context<'_>, id: String) -> Result> { + let db = ctx.data::().unwrap(); + + Ok(db + .user() + .find_unique(user::id::equals(id)) + .exec() + .await? + .map(|u| u.into())) + } +} diff --git a/external/prisma-client-rust/examples/axum-graphql/src/graphql/schema.rs b/external/prisma-client-rust/examples/axum-graphql/src/graphql/schema.rs new file mode 100644 index 0000000..48879cf --- /dev/null +++ b/external/prisma-client-rust/examples/axum-graphql/src/graphql/schema.rs @@ -0,0 +1,23 @@ +use async_graphql::{EmptySubscription, Schema}; + +use crate::{ + db, + graphql::{mutation::Mutation, query::Query}, +}; + +pub type AppSchema = Schema; + +/// Builds the GraphQL Schema, attaching the PrismaClient to the context +pub async fn build_schema() -> AppSchema { + let db = db::new_client() + .await + .expect("Failed to create Prisma client"); + + #[cfg(debug_assertions)] + db._db_push().await.unwrap(); + + // For more information about schema data, see: https://async-graphql.github.io/async-graphql/en/context.html#schema-data + Schema::build(Query::default(), Mutation::default(), EmptySubscription) + .data(db) + .finish() +} diff --git a/external/prisma-client-rust/examples/axum-graphql/src/graphql/types.rs b/external/prisma-client-rust/examples/axum-graphql/src/graphql/types.rs new file mode 100644 index 0000000..909c23d --- /dev/null +++ b/external/prisma-client-rust/examples/axum-graphql/src/graphql/types.rs @@ -0,0 +1,67 @@ +use async_graphql::{ComplexObject, Context, Result, SimpleObject}; + +use crate::db::{post, user, PrismaClient}; + +#[derive(SimpleObject)] +#[graphql(complex)] +pub struct User { + pub id: String, + pub display_name: String, +} + +#[ComplexObject] +impl User { + pub async fn posts(&self, ctx: &Context<'_>) -> Result> { + let db = ctx.data::().unwrap(); + + Ok(db + .post() + .find_many(vec![post::user_id::equals(self.id.clone())]) + .exec() + .await? + .into_iter() + .map(|p| p.into()) + .collect()) + } +} + +impl Into for user::Data { + fn into(self) -> User { + User { + id: self.id, + display_name: self.display_name, + } + } +} + +#[derive(SimpleObject)] +#[graphql(complex)] +pub struct Post { + pub id: String, + pub content: String, + pub user_id: String, +} + +#[ComplexObject] +impl Post { + pub async fn user(&self, ctx: &Context<'_>) -> Result>> { + let db = ctx.data::().unwrap(); + + Ok(db + .user() + .find_unique(user::id::equals(self.user_id.clone())) + .exec() + .await? + .map(|u| Box::new(u.into()))) + } +} + +impl Into for post::Data { + fn into(self) -> Post { + Post { + id: self.id, + content: self.content, + user_id: self.user_id, + } + } +} diff --git a/external/prisma-client-rust/examples/axum-graphql/src/main.rs b/external/prisma-client-rust/examples/axum-graphql/src/main.rs new file mode 100644 index 0000000..fbb9b2f --- /dev/null +++ b/external/prisma-client-rust/examples/axum-graphql/src/main.rs @@ -0,0 +1,49 @@ +use async_graphql::http::{playground_source, GraphQLPlaygroundConfig}; +use async_graphql_axum::{GraphQLRequest, GraphQLResponse}; +use axum::{ + extract::Extension, + response::{Html, IntoResponse}, + routing::get, + Router, +}; +use graphql::schema::{build_schema, AppSchema}; + +#[allow(warnings, unused)] +pub mod db; +pub mod graphql; + +async fn graphql_handler(schema: Extension, req: GraphQLRequest) -> GraphQLResponse { + schema.execute(req.into_inner()).await.into() +} + +async fn graphql_playground() -> impl IntoResponse { + Html(playground_source(GraphQLPlaygroundConfig::new( + "/api/graphql", + ))) +} + +// Note: This template uses Axum, but the bulk of the setup is for async_graphql. You should be able +// to easily swap out Axum for your preferred framework (e.g. Rocket, actix, etc). + +#[tokio::main] +async fn main() { + let schema = build_schema().await; + + let app = Router::new() + // I prefer to prefix my graphql endpoint with /api, but use whatever you like. + // just make sure it matches the path in graphql_playground() + .route( + "/api/graphql", + get(graphql_playground).post(graphql_handler), + ) + .layer(Extension(schema)); + + // macos Monterey i hate u so much for causing me so much headache to figure out + // port 5000 is now taken?? + println!("Playground: http://localhost:5001/api/graphql"); + + axum::Server::bind(&"0.0.0.0:5001".parse().unwrap()) + .serve(app.into_make_service()) + .await + .unwrap(); +} diff --git a/external/prisma-client-rust/examples/axum-rest/.cargo/config.toml b/external/prisma-client-rust/examples/axum-rest/.cargo/config.toml new file mode 100644 index 0000000..399985d --- /dev/null +++ b/external/prisma-client-rust/examples/axum-rest/.cargo/config.toml @@ -0,0 +1,2 @@ +[alias] +prisma = "run -p prisma-cli --features sqlite --" diff --git a/external/prisma-client-rust/examples/axum-rest/Cargo.toml b/external/prisma-client-rust/examples/axum-rest/Cargo.toml new file mode 100644 index 0000000..447ab1b --- /dev/null +++ b/external/prisma-client-rust/examples/axum-rest/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "axum-rest-example" +version = "0.1.1" +edition = "2021" + +[dependencies] +prisma-client-rust = { workspace = true, features = ["migrations", "sqlite"] } +tokio = { version = "1.0", features = ["full"] } +serde = { version = "1.0", features = ["derive"] } +axum = "0.6" diff --git a/external/prisma-client-rust/examples/axum-rest/README.md b/external/prisma-client-rust/examples/axum-rest/README.md new file mode 100644 index 0000000..fb04e99 --- /dev/null +++ b/external/prisma-client-rust/examples/axum-rest/README.md @@ -0,0 +1,53 @@ +# REST Axum Example + +This is an example of how you could use [Prisma Client Rust](https://github.com/Brendonovich/prisma-client-rust) in a REST API, written by [kr4xkan](https://github.com/kr4xkan). + +## Running + +Generate the client: + +```bash +cargo prisma generate +``` + +Then run the server: + +```bash +cargo run +``` + +## Notes + +In addition to showing you how to use this crate in a REST API backend, it also gives you a way too catch errors from Prisma in one single place. + +## Endpoints + +Base URL: `localhost:5000/api` + +`/user` : +- `GET` : Lists all users +- `POST` : Create a user + - ```json + INPUT + { + "username": string + "email": string + } +`/user/` : +- `PUT` : Update a user + - ```json + INPUT + { + "username": string + "email": string + } +- `DELETE` : Delete a user + +`/comment` : +- `POST` : Create a comment linked to a user + - ```json + INPUT + { + "user": int + "message": string + } diff --git a/external/prisma-client-rust/examples/axum-rest/prisma/migrations/.gitkeep b/external/prisma-client-rust/examples/axum-rest/prisma/migrations/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/external/prisma-client-rust/examples/axum-rest/prisma/schema.prisma b/external/prisma-client-rust/examples/axum-rest/prisma/schema.prisma new file mode 100644 index 0000000..38f3132 --- /dev/null +++ b/external/prisma-client-rust/examples/axum-rest/prisma/schema.prisma @@ -0,0 +1,23 @@ +datasource db { + provider = "sqlite" + url = "file:dev.db" +} + +generator client { + provider = "cargo prisma" + output = "../src/db.rs" +} + +model User { + id Int @id @default(autoincrement()) + username String @unique + email String + comments Comments[] +} + +model Comments { + id Int @id @default(autoincrement()) + message String + authorId Int + author User @relation(fields: [authorId], references: [id], onDelete: Cascade) +} diff --git a/external/prisma-client-rust/examples/axum-rest/src/main.rs b/external/prisma-client-rust/examples/axum-rest/src/main.rs new file mode 100644 index 0000000..27491ce --- /dev/null +++ b/external/prisma-client-rust/examples/axum-rest/src/main.rs @@ -0,0 +1,27 @@ +use axum::{extract::Extension, Router}; +use std::sync::Arc; + +use crate::db::*; + +#[allow(warnings, unused)] +mod db; +mod routes; + +#[tokio::main] +async fn main() { + let prisma_client = Arc::new(PrismaClient::_builder().build().await.unwrap()); + + #[cfg(debug_assertions)] + prisma_client._db_push().await.unwrap(); + + let app = Router::new() + .nest("/api", routes::create_route()) + .layer(Extension(prisma_client)); + + println!("Example Prisma x Axum running on http://127.0.0.1:5000"); + + axum::Server::bind(&"127.0.0.1:5000".parse().unwrap()) + .serve(app.into_make_service()) + .await + .unwrap(); +} diff --git a/external/prisma-client-rust/examples/axum-rest/src/routes.rs b/external/prisma-client-rust/examples/axum-rest/src/routes.rs new file mode 100644 index 0000000..cbcb293 --- /dev/null +++ b/external/prisma-client-rust/examples/axum-rest/src/routes.rs @@ -0,0 +1,145 @@ +use axum::{ + extract::{Json, Path}, + http::StatusCode, + response::{IntoResponse, Response}, + routing::{get, post, put}, + Extension, Router, +}; +use prisma_client_rust::{ + prisma_errors::query_engine::{RecordNotFound, UniqueKeyViolation}, + QueryError, +}; +use std::sync::Arc; + +use serde::Deserialize; + +use crate::db::*; + +type Database = Extension>; +type AppResult = Result; +type AppJsonResult = AppResult>; + +// Define all your requests schema +#[derive(Deserialize)] +struct UserRequest { + username: String, + email: String, +} + +#[derive(Deserialize)] +struct CommentRequest { + user: i32, + message: String, +} + +/* + +/api/user => GET, POST +/api/user/:username => PUT, DELETE +/api/comment => POST + +*/ +pub fn create_route() -> Router { + Router::new() + .route("/user", get(handle_user_get).post(handle_user_post)) + .route( + "/user/:username", + put(handle_user_put).delete(handle_user_delete), + ) + .route("/comment", post(handle_comment_post)) +} + +async fn handle_user_get(db: Database) -> AppJsonResult> { + let users = db + .user() + .find_many(vec![]) + .with(user::comments::fetch(vec![])) + .exec() + .await?; + + Ok(Json::from(users)) +} + +async fn handle_user_post( + db: Database, + Json(input): Json, +) -> AppJsonResult { + let data = db + .user() + .create(input.username, input.email, vec![]) + .exec() + .await?; + + Ok(Json::from(data)) +} + +async fn handle_user_put( + db: Database, + Path(username): Path, + Json(input): Json, +) -> AppJsonResult { + let updated_user = db + .user() + .update( + user::username::equals(username), + vec![ + user::username::set(input.username), + user::email::set(input.email), + ], + ) + .exec() + .await?; + + Ok(Json::from(updated_user)) +} + +async fn handle_user_delete(db: Database, Path(username): Path) -> AppResult { + db.user() + .delete(user::username::equals(username)) + .exec() + .await?; + + Ok(StatusCode::OK) +} + +async fn handle_comment_post( + db: Database, + Json(req): Json, +) -> AppJsonResult { + let comment = db + .comments() + .create(req.message, user::id::equals(req.user), vec![]) + .exec() + .await?; + + Ok(Json::from(comment)) +} + +enum AppError { + PrismaError(QueryError), + NotFound, +} + +impl From for AppError { + fn from(error: QueryError) -> Self { + match error { + e if e.is_prisma_error::() => AppError::NotFound, + e => AppError::PrismaError(e), + } + } +} + +// This centralizes all different errors from our app in one place +impl IntoResponse for AppError { + fn into_response(self) -> Response { + let status = match self { + AppError::PrismaError(error) if error.is_prisma_error::() => { + StatusCode::CONFLICT + } + AppError::PrismaError(_) => StatusCode::BAD_REQUEST, + AppError::NotFound => StatusCode::NOT_FOUND, + }; + + status.into_response() + } +} diff --git a/external/prisma-client-rust/examples/basic/.cargo/config.toml b/external/prisma-client-rust/examples/basic/.cargo/config.toml new file mode 100644 index 0000000..399985d --- /dev/null +++ b/external/prisma-client-rust/examples/basic/.cargo/config.toml @@ -0,0 +1,2 @@ +[alias] +prisma = "run -p prisma-cli --features sqlite --" diff --git a/external/prisma-client-rust/examples/basic/Cargo.toml b/external/prisma-client-rust/examples/basic/Cargo.toml new file mode 100644 index 0000000..7d10678 --- /dev/null +++ b/external/prisma-client-rust/examples/basic/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "basic-example" +version = "0.1.0" +edition = "2021" +default-run = "basic-example" + +[dependencies] +prisma-client-rust = { workspace = true, features = ["migrations", "sqlite"] } +serde = { version = "1.0", features = ["derive"] } +tokio = {features=["macros","rt-multi-thread"], version = "1.17.0"} +tracing = "0.1.36" diff --git a/external/prisma-client-rust/examples/basic/README.md b/external/prisma-client-rust/examples/basic/README.md new file mode 100644 index 0000000..79cb2b4 --- /dev/null +++ b/external/prisma-client-rust/examples/basic/README.md @@ -0,0 +1,17 @@ +# Basic Example + +This is an example of using Prisma Client Rust with a simple Prisma schema. It creates some records, fetches them with some relations, and then deletes them. + +## Running + +Generate the client: + +```bash +cargo prisma generate +``` + +Then run the example: + +```bash +cargo run +``` diff --git a/external/prisma-client-rust/examples/basic/prisma/migrations/.gitkeep b/external/prisma-client-rust/examples/basic/prisma/migrations/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/external/prisma-client-rust/examples/basic/prisma/schema.prisma b/external/prisma-client-rust/examples/basic/prisma/schema.prisma new file mode 100644 index 0000000..0c40963 --- /dev/null +++ b/external/prisma-client-rust/examples/basic/prisma/schema.prisma @@ -0,0 +1,24 @@ +datasource db { + provider = "sqlite" + url = "file:./dev.db" +} + +generator client { + provider = "cargo prisma" + output = "../src/db.rs" +} + +model User { + id String @id + displayName String + + posts Post[] +} + +model Post { + id String @id + content String + + user User @relation(fields: [userId], references: [id]) + userId String +} diff --git a/external/prisma-client-rust/examples/basic/src/main.rs b/external/prisma-client-rust/examples/basic/src/main.rs new file mode 100644 index 0000000..0d26d4d --- /dev/null +++ b/external/prisma-client-rust/examples/basic/src/main.rs @@ -0,0 +1,75 @@ +use crate::db::*; + +#[allow(warnings, unused)] +pub mod db; + +#[tokio::main] +pub async fn main() { + let client = PrismaClient::_builder().build().await.unwrap(); + + #[cfg(debug_assertions)] + client._db_push().await.unwrap(); + + client + .user() + .find_many(vec![]) + .with( + user::posts::fetch(vec![]) + .with(post::user::fetch().with(user::posts::fetch(vec![]))) + .skip(10) + .take(5), + ) + .exec() + .await + .unwrap(); + + let user = client + .user() + .create("user0".to_string(), "User 0".to_string(), vec![]) + .exec() + .await + .unwrap(); + + let post = client + .post() + .create( + "post0".to_string(), + "Some post content".to_string(), + user::id::equals(user.id.to_string()), + vec![], + ) + .exec() + .await + .unwrap(); + + println!("User: {:?}", user); + println!("Post: {:?}", post); + + let post_with_user = client + .post() + .find_unique(post::id::equals("post0".to_string())) + .with(post::user::fetch()) + .exec() + .await + .unwrap() + .unwrap(); + + println!("Post user: {:?}", post_with_user.user().unwrap()); + + let user_with_posts = client + .user() + .find_unique(user::id::equals("user0".to_string())) + .with(user::posts::fetch(vec![])) + .exec() + .await + .unwrap() + .unwrap(); + + println!("User posts: {:?}", user_with_posts.posts().unwrap()); + + let deleted_posts_count = client.post().delete_many(vec![]).exec().await.unwrap(); + println!("Deleted {} posts", deleted_posts_count); + + let deleted_users_count = client.user().delete_many(vec![]).exec().await.unwrap(); + println!("Deleted {} users", deleted_users_count); +} diff --git a/external/prisma-client-rust/examples/rocket/.cargo/config.toml b/external/prisma-client-rust/examples/rocket/.cargo/config.toml new file mode 100644 index 0000000..399985d --- /dev/null +++ b/external/prisma-client-rust/examples/rocket/.cargo/config.toml @@ -0,0 +1,2 @@ +[alias] +prisma = "run -p prisma-cli --features sqlite --" diff --git a/external/prisma-client-rust/examples/rocket/Cargo.toml b/external/prisma-client-rust/examples/rocket/Cargo.toml new file mode 100644 index 0000000..d880350 --- /dev/null +++ b/external/prisma-client-rust/examples/rocket/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "rocket-example" +version = "0.1.0" +edition = "2021" +# change to whatever you name your package +default-run = "rocket-example" + +[dependencies] +prisma-client-rust = { workspace = true, features = ["migrations", "sqlite"] } +serde = { version = "1.0", features = ["derive"] } +rocket = { version = "0.5.0-rc.2", features = ["json"] } diff --git a/external/prisma-client-rust/examples/rocket/README.md b/external/prisma-client-rust/examples/rocket/README.md new file mode 100644 index 0000000..ce892da --- /dev/null +++ b/external/prisma-client-rust/examples/rocket/README.md @@ -0,0 +1,69 @@ +# Rocket Example + +This is an example of using [Prisma Client Rust](https://github.com/Brendonovich/prisma-client-rust) with [Rocket](https://rocket.rs/). + +## Running + +Generate the client: + +```bash +cargo prisma generate +``` + +Then run the server: + +```bash +cargo run +``` + +Server is configured using `Rocket.toml` or environment variables. +By default, this server is configured for [http://localhost:8080](http://localhost:8080). +Read about Rocket configuration [here](https://rocket.rs/v0.5-rc/guide/configuration/). + +Written by [Aaron Leopold](https://github.com/aaronleopold) + +## Examples + +[http://localhost:8080/api/users](http://localhost:8080/api/users) + +```json +[ + { + "id": "5ab80953-c38c-4ec8-8b4b-3ecc4bc1196f", + "displayName": "oromei", + "posts": [ + { + "id": "f001144f-438f-4fdb-9ed7-23f2cc5fffa7", + "content": "Woah there!", + "user": null, + "userId": "5ab80953-c38c-4ec8-8b4b-3ecc4bc1196f" + } + ] + } +] +``` + +[http://localhost:8080/api/users?load_posts=false](http://localhost:8080/api/users?load_posts=false) + +```json +[ + { + "id": "5ab80953-c38c-4ec8-8b4b-3ecc4bc1196f", + "displayName": "oromei", + "posts": null + } +] +``` + +[http://localhost:8080/api/posts](http://localhost:8080/api/posts) + +```json +[ + { + "id": "f001144f-438f-4fdb-9ed7-23f2cc5fffa7", + "content": "Woah there!", + "user": null, + "userId": "5ab80953-c38c-4ec8-8b4b-3ecc4bc1196f" + } +] +``` diff --git a/external/prisma-client-rust/examples/rocket/Rocket.toml b/external/prisma-client-rust/examples/rocket/Rocket.toml new file mode 100644 index 0000000..6e4e909 --- /dev/null +++ b/external/prisma-client-rust/examples/rocket/Rocket.toml @@ -0,0 +1,15 @@ +# For more information take a look at https://rocket.rs/guide/configuration/ +[global] +ident="rocket" + +[debug] +address = "0.0.0.0" +port = 8080 +keep_alive = 5 +log_level = "normal" + +[release] +address = "0.0.0.0" +port = 8080 +keep_alive = 5 +log_level = "normal" \ No newline at end of file diff --git a/external/prisma-client-rust/examples/rocket/prisma/migrations/.gitkeep b/external/prisma-client-rust/examples/rocket/prisma/migrations/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/external/prisma-client-rust/examples/rocket/prisma/schema.prisma b/external/prisma-client-rust/examples/rocket/prisma/schema.prisma new file mode 100644 index 0000000..7e14945 --- /dev/null +++ b/external/prisma-client-rust/examples/rocket/prisma/schema.prisma @@ -0,0 +1,22 @@ +datasource db { + provider = "sqlite" + url = "file:dev.db" +} + +generator client { + provider = "cargo prisma" + output = "../src/db.rs" +} + +model User { + id String @id @default(uuid()) + displayName String + posts Post[] +} + +model Post { + id String @id @default(uuid()) + content String + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + userId String +} diff --git a/external/prisma-client-rust/examples/rocket/src/main.rs b/external/prisma-client-rust/examples/rocket/src/main.rs new file mode 100644 index 0000000..3dc50dc --- /dev/null +++ b/external/prisma-client-rust/examples/rocket/src/main.rs @@ -0,0 +1,59 @@ +use std::sync::Arc; + +use rocket::serde::json::Json; + +#[macro_use] +extern crate rocket; + +#[allow(warnings, unused)] +pub mod db; + +use db::{post, user}; + +// This is the struct that will hold the prisma client. This will be managed by +// Rocket, accessible in the routing functions using the type alias `Ctx` below. +// See https://rocket.rs/v0.5-rc/guide/state/ +#[derive(Clone)] +pub struct Context { + pub db: Arc, +} + +// Type alias not required, just personal preference for this in particular so I +// don't have to write `rocket::State` every single time. +pub type Ctx = rocket::State; + +/// Get all posts +#[get("/posts")] +async fn get_posts(ctx: &Ctx) -> Json> { + // Note: you should add some error handling :) + Json(ctx.db.post().find_many(vec![]).exec().await.unwrap()) +} + +/// Get all users. Simple demonstration for basic route params. +#[get("/users?")] +async fn get_users(ctx: &Ctx, load_posts: Option) -> Json> { + let mut query = ctx.db.user().find_many(vec![]); + + if load_posts.unwrap_or(true) { + query = query.with(user::posts::fetch(vec![])); + } + + // Note: you should add some error handling :) + Json(query.exec().await.unwrap()) +} + +#[launch] +async fn rocket() -> _ { + let db = Arc::new( + db::new_client() + .await + .expect("Failed to create Prisma client"), + ); + + #[cfg(debug_assert)] + db._db_push(false).await.unwrap(); + + rocket::build() + .manage(Context { db }) + .mount("/api", routes![get_posts, get_users]) +} diff --git a/external/prisma-client-rust/examples/rspc/.cargo/config.toml b/external/prisma-client-rust/examples/rspc/.cargo/config.toml new file mode 100644 index 0000000..7ed5047 --- /dev/null +++ b/external/prisma-client-rust/examples/rspc/.cargo/config.toml @@ -0,0 +1,2 @@ +[alias] +prisma = "run -p prisma-cli --features specta,sqlite --" diff --git a/external/prisma-client-rust/examples/rspc/Cargo.toml b/external/prisma-client-rust/examples/rspc/Cargo.toml new file mode 100644 index 0000000..002547b --- /dev/null +++ b/external/prisma-client-rust/examples/rspc/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "rspc-example" +version = "0.1.0" +edition = "2021" +default-run = "rspc-example" + +[dependencies] +prisma-client-rust = { features = ["rspc", "migrations", "sqlite", "mocking"], workspace = true } +serde = { version = "1.0", features = ["derive"] } +rspc.workspace = true +tokio = "1.20.1" diff --git a/external/prisma-client-rust/examples/rspc/README.md b/external/prisma-client-rust/examples/rspc/README.md new file mode 100644 index 0000000..fb7f721 --- /dev/null +++ b/external/prisma-client-rust/examples/rspc/README.md @@ -0,0 +1,20 @@ +# rspc Example + +This is an example of using Prisma Client Rust with [rspc](https://rspc.dev). + +## Running + +Generate the client: + +```bash +cargo prisma generate +``` + +Then run the example: + +```bash +cargo run +``` + +This example does not include a web server to make the router accessible, +it is just a demonstration of using Prisma inside resolvers and generating TypeScript bindings. diff --git a/external/prisma-client-rust/examples/rspc/bindings.ts b/external/prisma-client-rust/examples/rspc/bindings.ts new file mode 100644 index 0000000..a8c9e3e --- /dev/null +++ b/external/prisma-client-rust/examples/rspc/bindings.ts @@ -0,0 +1,18 @@ +// This file was generated by [rspc](https://github.com/oscartbeaumont/rspc). Do not edit this file manually. + +export type Procedures = { + queries: + { key: "namedUserType", input: never, result: NamedUserInclude[] } | + { key: "posts", input: never, result: Post[] } | + { key: "userNames", input: never, result: { displayName: string }[] } | + { key: "users", input: never, result: User[] } | + { key: "usersWithPosts", input: never, result: { id: string; displayName: string; posts: Post[] }[] }, + mutations: never, + subscriptions: never +}; + +export type NamedUserInclude = { id: string; displayName: string; posts: Post[] } + +export type Post = { id: string; content: string; userId: string } + +export type User = { id: string; displayName: string } diff --git a/external/prisma-client-rust/examples/rspc/prisma/migrations/.gitkeep b/external/prisma-client-rust/examples/rspc/prisma/migrations/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/external/prisma-client-rust/examples/rspc/prisma/schema.prisma b/external/prisma-client-rust/examples/rspc/prisma/schema.prisma new file mode 100644 index 0000000..e34b82d --- /dev/null +++ b/external/prisma-client-rust/examples/rspc/prisma/schema.prisma @@ -0,0 +1,23 @@ +datasource db { + provider = "sqlite" + url = "file:dev.db" +} + +generator client { + provider = "cargo prisma" + output = "../src/db.rs" + module_path = "db" +} + +model User { + id String @id @default(uuid()) + displayName String + posts Post[] +} + +model Post { + id String @id @default(uuid()) + content String + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + userId String +} diff --git a/external/prisma-client-rust/examples/rspc/src/main.rs b/external/prisma-client-rust/examples/rspc/src/main.rs new file mode 100644 index 0000000..14f89e7 --- /dev/null +++ b/external/prisma-client-rust/examples/rspc/src/main.rs @@ -0,0 +1,84 @@ +use std::sync::Arc; + +use rspc::{ExportConfig, Rspc}; + +#[allow(warnings, unused)] +mod db; + +type Ctx = Arc; + +const R: Rspc = Rspc::new(); + +db::user::include!(named_user_include { posts }); + +#[tokio::main] +async fn main() { + let client = db::new_client().await.unwrap(); + + #[cfg(debug_assertions)] + client._db_push().await.unwrap(); + + // A router doesn't do anything on its own, you need to use it with + // an integration to make it do anything: https://rspc.dev/ + + let router = R + .router() + .procedure( + "users", + R.query(|db, _: ()| async move { + db.user().find_many(vec![]).exec().await.map_err(Into::into) + }), + ) + .procedure( + "userNames", + R.query(|db, _: ()| async move { + db.user() + .find_many(vec![]) + .select(db::user::select!({ display_name })) + .exec() + .await + .map_err(Into::into) + }), + ) + .procedure( + "usersWithPosts", + R.query(|db, _: ()| async move { + db.user() + .find_many(vec![]) + .include(db::user::include!({ + posts(vec![]).skip(1): select { + id + content + user: select { + id + display_name + } + } + })) + .exec() + .await + .map_err(Into::into) + }), + ) + .procedure( + "namedUserType", + R.query(|db, _: ()| async move { + db.user() + .find_many(vec![]) + .include(named_user_include::include()) + .exec() + .await + .map_err(Into::into) + }), + ) + .procedure( + "posts", + R.query(|db, _: ()| async move { + db.post().find_many(vec![]).exec().await.map_err(Into::into) + }), + ) + .build() + .unwrap(); + + router.export_ts(ExportConfig::new("./bindings.ts")).ok(); +} diff --git a/external/prisma-client-rust/examples/tauri/.gitignore b/external/prisma-client-rust/examples/tauri/.gitignore new file mode 100644 index 0000000..bc50c80 --- /dev/null +++ b/external/prisma-client-rust/examples/tauri/.gitignore @@ -0,0 +1,3 @@ +node_modules +dist +!dist/.gitkeep diff --git a/external/prisma-client-rust/examples/tauri/.taurignore b/external/prisma-client-rust/examples/tauri/.taurignore new file mode 100644 index 0000000..85de9cf --- /dev/null +++ b/external/prisma-client-rust/examples/tauri/.taurignore @@ -0,0 +1 @@ +src diff --git a/external/prisma-client-rust/examples/tauri/README.md b/external/prisma-client-rust/examples/tauri/README.md new file mode 100644 index 0000000..88c4c83 --- /dev/null +++ b/external/prisma-client-rust/examples/tauri/README.md @@ -0,0 +1,21 @@ +# Tauri Example + +This example demonstrates how to combine Prisma Client Rust and Tauri, +with [`tauri-specta`](https://github.com/oscartbeaumont/tauri-specta) being used to provide end-to-end typesafety. + +[SolidJS](https://www.solidjs.com/) is being used to render the UI, +and [`pnpm`](https://pnpm.io/) is being used as a package manager (but using npm/yarn should work too). + +## Runing + +Generate the client: + +```bash +cd src-tauri && cargo prisma generate +``` + +Then run the app: + +```bash +pnpm tauri dev +``` diff --git a/external/prisma-client-rust/examples/tauri/index.html b/external/prisma-client-rust/examples/tauri/index.html new file mode 100644 index 0000000..7cb13f9 --- /dev/null +++ b/external/prisma-client-rust/examples/tauri/index.html @@ -0,0 +1,17 @@ + + + + + + + + Tauri + Solid + Typescript App + + + + +
+ + + + diff --git a/external/prisma-client-rust/examples/tauri/package.json b/external/prisma-client-rust/examples/tauri/package.json new file mode 100644 index 0000000..8f4a3e8 --- /dev/null +++ b/external/prisma-client-rust/examples/tauri/package.json @@ -0,0 +1,26 @@ +{ + "private": true, + "scripts": { + "start": "vite", + "dev": "vite", + "build": "vite build", + "serve": "vite preview", + "tauri": "tauri" + }, + "license": "MIT", + "dependencies": { + "@tauri-apps/api": ">=2.0.0-beta.0", + "@tauri-apps/plugin-shell": ">=2.0.0-beta.0", + "solid-js": "^1.4.7" + }, + "devDependencies": { + "@tauri-apps/cli": ">=2.0.0-beta.0", + "@types/node": "^18.7.10", + "autoprefixer": "^10.4.14", + "postcss": "^8.4.21", + "tailwindcss": "^3.2.7", + "typescript": "^4.7.4", + "vite": "^4.0.0", + "vite-plugin-solid": "^2.3.0" + } +} diff --git a/external/prisma-client-rust/examples/tauri/pnpm-lock.yaml b/external/prisma-client-rust/examples/tauri/pnpm-lock.yaml new file mode 100644 index 0000000..8938396 --- /dev/null +++ b/external/prisma-client-rust/examples/tauri/pnpm-lock.yaml @@ -0,0 +1,1889 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@tauri-apps/api': + specifier: '>=2.0.0-beta.0' + version: 2.0.0-beta.11 + '@tauri-apps/plugin-shell': + specifier: '>=2.0.0-beta.0' + version: 2.0.0-beta.3 + solid-js: + specifier: ^1.4.7 + version: 1.8.17 + devDependencies: + '@tauri-apps/cli': + specifier: '>=2.0.0-beta.0' + version: 2.0.0-beta.16 + '@types/node': + specifier: ^18.7.10 + version: 18.19.33 + autoprefixer: + specifier: ^10.4.14 + version: 10.4.19(postcss@8.4.38) + postcss: + specifier: ^8.4.21 + version: 8.4.38 + tailwindcss: + specifier: ^3.2.7 + version: 3.4.3 + typescript: + specifier: ^4.7.4 + version: 4.9.5 + vite: + specifier: ^4.0.0 + version: 4.5.3(@types/node@18.19.33) + vite-plugin-solid: + specifier: ^2.3.0 + version: 2.10.2(solid-js@1.8.17)(vite@4.5.3(@types/node@18.19.33)) + +packages: + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.24.2': + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.24.4': + resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.24.5': + resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.24.5': + resolution: {integrity: sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.23.6': + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-environment-visitor@7.22.20': + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-function-name@7.23.0': + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-hoist-variables@7.22.5': + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.18.6': + resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.24.3': + resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.24.5': + resolution: {integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.24.5': + resolution: {integrity: sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-simple-access@7.24.5': + resolution: {integrity: sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-split-export-declaration@7.24.5': + resolution: {integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.24.1': + resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.24.5': + resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.23.5': + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.24.5': + resolution: {integrity: sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.5': + resolution: {integrity: sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.24.5': + resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-jsx@7.24.1': + resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.24.0': + resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.24.5': + resolution: {integrity: sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.24.5': + resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} + engines: {node: '>=6.9.0'} + + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@tauri-apps/api@2.0.0-beta.11': + resolution: {integrity: sha512-wJRY+fBUm3KpqZDHMIz5HRv+1vlnvRJ/dFxiyY3NlINTx2qXqDou5qWYcP1CuZXsd39InWVPV3FAZvno/kGCkA==} + engines: {node: '>= 18', npm: '>= 6.6.0', yarn: '>= 1.19.1'} + + '@tauri-apps/cli-darwin-arm64@2.0.0-beta.16': + resolution: {integrity: sha512-5Gif4AvpJmnyLj3HO3AEl1RVrr4ast6mDQiXoLwe75bfWq1pj9VwsS5SuSrUKtB8YBSnnclcJwkqwa6soY/xkg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tauri-apps/cli-darwin-x64@2.0.0-beta.16': + resolution: {integrity: sha512-6Cia8lGSroyoXKvfRI+Dv8Xinr27lptDzGZnd8mT9V0xPg73xcWxPKiTkuxPmLQTrQKVAurfsX3DwwgK8m9kSw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-beta.16': + resolution: {integrity: sha512-1mQ0flIt0wrX4QLPwd8f1QFsuFjLPQtWuiObK63K0/YZmDS2yzKT6jnGqNCJsSiyXE2/36gKSyWh6OVpX8U7xg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tauri-apps/cli-linux-arm64-gnu@2.0.0-beta.16': + resolution: {integrity: sha512-CjgwOvaslvy06m36faZ40noQaBu37gcXtD0HlCgAMofDZz7fUWQJn3xE7r8fegXmY0oMKZ9ah8dgwd5KSk+L+Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tauri-apps/cli-linux-arm64-musl@2.0.0-beta.16': + resolution: {integrity: sha512-JMtryDJckutFzNpwFgh98o9Z4Vw1pwImYmJIDLpCPSqYIfd+mrBgPZFTaGl11ZsQnllqt4FNXlYR8T+ey7ZpfQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tauri-apps/cli-linux-x64-gnu@2.0.0-beta.16': + resolution: {integrity: sha512-3dQGCKsbjaIzk4UM7Jf5FzBJpBJ1OfwBOwkVv2M4O7EDLNZi9brDR+I41eqyFhTabEcHJoLhtURLbD25dJuiug==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tauri-apps/cli-linux-x64-musl@2.0.0-beta.16': + resolution: {integrity: sha512-t+wdk/VCn8l9y1fhRQPfvZyz3Or7QEPTxXNobbUzbtckFsf/LqTxjaajOBmSGnZpoTDFvwVOmalDaylILxuM5g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tauri-apps/cli-win32-arm64-msvc@2.0.0-beta.16': + resolution: {integrity: sha512-ouP0iiRMTNaKyz6c06LucMR5P585r2XJ3/GlzNWtUfP4EaP8mZAENB0ro9VZl10++7Z658MdWxSAf4+Qmkj0jQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tauri-apps/cli-win32-ia32-msvc@2.0.0-beta.16': + resolution: {integrity: sha512-BiBkv3IesPNGXVaampxpB+ub0tz2sGu+6OLzxSm1QTp+2ZSw/qeXi/icvJl5azmOyee4ZWBBiuBzdVY88QH+Vw==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@tauri-apps/cli-win32-x64-msvc@2.0.0-beta.16': + resolution: {integrity: sha512-rrJeC7eAT6diQpnI3aaflhvtKyTryywbhHLG/c1QyPhdxA7Or6nflo5KzWLd6q3GQqKRbvz5dDtxwFn+XLo+rQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tauri-apps/cli@2.0.0-beta.16': + resolution: {integrity: sha512-ELaPqTekAVfTU4lFf7k/Z422DKXk/uDWi7ppI8TuQOqcXjrxlXMvv/Y1eC2tem9vMeuOIU0Jg53pOhOu0w8JIQ==} + engines: {node: '>= 10'} + hasBin: true + + '@tauri-apps/plugin-shell@2.0.0-beta.3': + resolution: {integrity: sha512-iSFKUJzmdBE194J0q2O3nWgO86tApVsB9kKD4UkB4YNGTIz09hgeXsOIEo3bMfJEmQe54H/zPBzPo9TeuZZFGA==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.5': + resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + + '@types/node@18.19.33': + resolution: {integrity: sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + autoprefixer@10.4.19: + resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + babel-plugin-jsx-dom-expressions@0.37.20: + resolution: {integrity: sha512-0L3aC5EFyvCgIlEYIqJb4Ym29s1IDI/U5SntZ1ZK054xe0MqBmBi2GLK3f9AOklhdY7kCC3GsHD0bILh6u0Qsg==} + peerDependencies: + '@babel/core': ^7.20.12 + + babel-preset-solid@1.8.17: + resolution: {integrity: sha512-s/FfTZOeds0hYxYqce90Jb+0ycN2lrzC7VP1k1JIn3wBqcaexDKdYi6xjB+hMNkL+Q6HobKbwsriqPloasR9LA==} + peerDependencies: + '@babel/core': ^7.0.0 + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + + browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + caniuse-lite@1.0.30001617: + resolution: {integrity: sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA==} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + electron-to-chromium@1.4.761: + resolution: {integrity: sha512-PIbxpiJGx6Bb8dQaonNc6CGTRlVntdLg/2nMa1YhnrwYOORY9a3ZgGN0UQYE6lAcj/lkyduJN7BPt/JiY+jAQQ==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + + foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.3.12: + resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + html-entities@2.3.3: + resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + + jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + lilconfig@3.1.1: + resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + lru-cache@10.2.2: + resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} + engines: {node: 14 || >=16.14} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + merge-anything@5.1.7: + resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==} + engines: {node: '>=12.13'} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.0: + resolution: {integrity: sha512-oGZRv2OT1lO2UF1zUcwdTb3wqUwI0kBGTgt/T7OdSj6M6N5m3o5uPf0AIW6lVxGGoiWUR7e2AwTE+xiwK8WQig==} + engines: {node: '>=16 || 14 >=14.17'} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.10.2: + resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} + engines: {node: '>=16 || 14 >=14.17'} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.0.1: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-nested@6.0.1: + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.0.16: + resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rollup@3.29.4: + resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + seroval-plugins@1.0.5: + resolution: {integrity: sha512-8+pDC1vOedPXjKG7oz8o+iiHrtF2WswaMQJ7CKFpccvSYfrzmvKY9zOJWCg+881722wIHfwkdnRmiiDm9ym+zQ==} + engines: {node: '>=10'} + peerDependencies: + seroval: ^1.0 + + seroval@1.0.5: + resolution: {integrity: sha512-TM+Z11tHHvQVQKeNlOUonOWnsNM+2IBwZ4vwoi4j3zKzIpc5IDw8WPwCfcc8F17wy6cBcJGbZbFOR0UCuTZHQA==} + engines: {node: '>=10'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + solid-js@1.8.17: + resolution: {integrity: sha512-E0FkUgv9sG/gEBWkHr/2XkBluHb1fkrHywUgA6o6XolPDCJ4g1HaLmQufcBBhiF36ee40q+HpG/vCZu7fLpI3Q==} + + solid-refresh@0.6.3: + resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==} + peerDependencies: + solid-js: ^1.3 + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tailwindcss@3.4.3: + resolution: {integrity: sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==} + engines: {node: '>=14.0.0'} + hasBin: true + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + update-browserslist-db@1.0.15: + resolution: {integrity: sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + validate-html-nesting@1.2.2: + resolution: {integrity: sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==} + + vite-plugin-solid@2.10.2: + resolution: {integrity: sha512-AOEtwMe2baBSXMXdo+BUwECC8IFHcKS6WQV/1NEd+Q7vHPap5fmIhLcAzr+DUJ04/KHx/1UBU0l1/GWP+rMAPQ==} + peerDependencies: + '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.* + solid-js: ^1.7.2 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + '@testing-library/jest-dom': + optional: true + + vite@4.5.3: + resolution: {integrity: sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitefu@0.2.5: + resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + vite: + optional: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yaml@2.4.2: + resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} + engines: {node: '>= 14'} + hasBin: true + +snapshots: + + '@alloc/quick-lru@5.2.0': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.24.2': + dependencies: + '@babel/highlight': 7.24.5 + picocolors: 1.0.0 + + '@babel/compat-data@7.24.4': {} + + '@babel/core@7.24.5': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.5 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) + '@babel/helpers': 7.24.5 + '@babel/parser': 7.24.5 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.5 + '@babel/types': 7.24.5 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.24.5': + dependencies: + '@babel/types': 7.24.5 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + '@babel/helper-compilation-targets@7.23.6': + dependencies: + '@babel/compat-data': 7.24.4 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.23.0 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-environment-visitor@7.22.20': {} + + '@babel/helper-function-name@7.23.0': + dependencies: + '@babel/template': 7.24.0 + '@babel/types': 7.24.5 + + '@babel/helper-hoist-variables@7.22.5': + dependencies: + '@babel/types': 7.24.5 + + '@babel/helper-module-imports@7.18.6': + dependencies: + '@babel/types': 7.24.5 + + '@babel/helper-module-imports@7.24.3': + dependencies: + '@babel/types': 7.24.5 + + '@babel/helper-module-transforms@7.24.5(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.24.3 + '@babel/helper-simple-access': 7.24.5 + '@babel/helper-split-export-declaration': 7.24.5 + '@babel/helper-validator-identifier': 7.24.5 + + '@babel/helper-plugin-utils@7.24.5': {} + + '@babel/helper-simple-access@7.24.5': + dependencies: + '@babel/types': 7.24.5 + + '@babel/helper-split-export-declaration@7.24.5': + dependencies: + '@babel/types': 7.24.5 + + '@babel/helper-string-parser@7.24.1': {} + + '@babel/helper-validator-identifier@7.24.5': {} + + '@babel/helper-validator-option@7.23.5': {} + + '@babel/helpers@7.24.5': + dependencies: + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.5 + '@babel/types': 7.24.5 + transitivePeerDependencies: + - supports-color + + '@babel/highlight@7.24.5': + dependencies: + '@babel/helper-validator-identifier': 7.24.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.0 + + '@babel/parser@7.24.5': + dependencies: + '@babel/types': 7.24.5 + + '@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 + + '@babel/template@7.24.0': + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/parser': 7.24.5 + '@babel/types': 7.24.5 + + '@babel/traverse@7.24.5': + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.24.5 + '@babel/parser': 7.24.5 + '@babel/types': 7.24.5 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.24.5': + dependencies: + '@babel/helper-string-parser': 7.24.1 + '@babel/helper-validator-identifier': 7.24.5 + to-fast-properties: 2.0.0 + + '@esbuild/android-arm64@0.18.20': + optional: true + + '@esbuild/android-arm@0.18.20': + optional: true + + '@esbuild/android-x64@0.18.20': + optional: true + + '@esbuild/darwin-arm64@0.18.20': + optional: true + + '@esbuild/darwin-x64@0.18.20': + optional: true + + '@esbuild/freebsd-arm64@0.18.20': + optional: true + + '@esbuild/freebsd-x64@0.18.20': + optional: true + + '@esbuild/linux-arm64@0.18.20': + optional: true + + '@esbuild/linux-arm@0.18.20': + optional: true + + '@esbuild/linux-ia32@0.18.20': + optional: true + + '@esbuild/linux-loong64@0.18.20': + optional: true + + '@esbuild/linux-mips64el@0.18.20': + optional: true + + '@esbuild/linux-ppc64@0.18.20': + optional: true + + '@esbuild/linux-riscv64@0.18.20': + optional: true + + '@esbuild/linux-s390x@0.18.20': + optional: true + + '@esbuild/linux-x64@0.18.20': + optional: true + + '@esbuild/netbsd-x64@0.18.20': + optional: true + + '@esbuild/openbsd-x64@0.18.20': + optional: true + + '@esbuild/sunos-x64@0.18.20': + optional: true + + '@esbuild/win32-arm64@0.18.20': + optional: true + + '@esbuild/win32-ia32@0.18.20': + optional: true + + '@esbuild/win32-x64@0.18.20': + optional: true + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@tauri-apps/api@2.0.0-beta.11': {} + + '@tauri-apps/cli-darwin-arm64@2.0.0-beta.16': + optional: true + + '@tauri-apps/cli-darwin-x64@2.0.0-beta.16': + optional: true + + '@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-beta.16': + optional: true + + '@tauri-apps/cli-linux-arm64-gnu@2.0.0-beta.16': + optional: true + + '@tauri-apps/cli-linux-arm64-musl@2.0.0-beta.16': + optional: true + + '@tauri-apps/cli-linux-x64-gnu@2.0.0-beta.16': + optional: true + + '@tauri-apps/cli-linux-x64-musl@2.0.0-beta.16': + optional: true + + '@tauri-apps/cli-win32-arm64-msvc@2.0.0-beta.16': + optional: true + + '@tauri-apps/cli-win32-ia32-msvc@2.0.0-beta.16': + optional: true + + '@tauri-apps/cli-win32-x64-msvc@2.0.0-beta.16': + optional: true + + '@tauri-apps/cli@2.0.0-beta.16': + optionalDependencies: + '@tauri-apps/cli-darwin-arm64': 2.0.0-beta.16 + '@tauri-apps/cli-darwin-x64': 2.0.0-beta.16 + '@tauri-apps/cli-linux-arm-gnueabihf': 2.0.0-beta.16 + '@tauri-apps/cli-linux-arm64-gnu': 2.0.0-beta.16 + '@tauri-apps/cli-linux-arm64-musl': 2.0.0-beta.16 + '@tauri-apps/cli-linux-x64-gnu': 2.0.0-beta.16 + '@tauri-apps/cli-linux-x64-musl': 2.0.0-beta.16 + '@tauri-apps/cli-win32-arm64-msvc': 2.0.0-beta.16 + '@tauri-apps/cli-win32-ia32-msvc': 2.0.0-beta.16 + '@tauri-apps/cli-win32-x64-msvc': 2.0.0-beta.16 + + '@tauri-apps/plugin-shell@2.0.0-beta.3': + dependencies: + '@tauri-apps/api': 2.0.0-beta.11 + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.24.5 + '@babel/types': 7.24.5 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.5 + + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.24.5 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.24.5 + '@babel/types': 7.24.5 + + '@types/babel__traverse@7.20.5': + dependencies: + '@babel/types': 7.24.5 + + '@types/node@18.19.33': + dependencies: + undici-types: 5.26.5 + + ansi-regex@5.0.1: {} + + ansi-regex@6.0.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@5.0.2: {} + + autoprefixer@10.4.19(postcss@8.4.38): + dependencies: + browserslist: 4.23.0 + caniuse-lite: 1.0.30001617 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + + babel-plugin-jsx-dom-expressions@0.37.20(@babel/core@7.24.5): + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-module-imports': 7.18.6 + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.5) + '@babel/types': 7.24.5 + html-entities: 2.3.3 + validate-html-nesting: 1.2.2 + + babel-preset-solid@1.8.17(@babel/core@7.24.5): + dependencies: + '@babel/core': 7.24.5 + babel-plugin-jsx-dom-expressions: 0.37.20(@babel/core@7.24.5) + + balanced-match@1.0.2: {} + + binary-extensions@2.3.0: {} + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.2: + dependencies: + fill-range: 7.0.1 + + browserslist@4.23.0: + dependencies: + caniuse-lite: 1.0.30001617 + electron-to-chromium: 1.4.761 + node-releases: 2.0.14 + update-browserslist-db: 1.0.15(browserslist@4.23.0) + + camelcase-css@2.0.1: {} + + caniuse-lite@1.0.30001617: {} + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + commander@4.1.1: {} + + convert-source-map@2.0.0: {} + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + cssesc@3.0.0: {} + + csstype@3.1.3: {} + + debug@4.3.4: + dependencies: + ms: 2.1.2 + + didyoumean@1.2.2: {} + + dlv@1.1.3: {} + + eastasianwidth@0.2.0: {} + + electron-to-chromium@1.4.761: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + esbuild@0.18.20: + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + + escalade@3.1.2: {} + + escape-string-regexp@1.0.5: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fill-range@7.0.1: + dependencies: + to-regex-range: 5.0.1 + + foreground-child@3.1.1: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + fraction.js@4.3.7: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.3.12: + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.4 + minipass: 7.1.0 + path-scurry: 1.10.2 + + globals@11.12.0: {} + + has-flag@3.0.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + html-entities@2.3.3: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-core-module@2.13.1: + dependencies: + hasown: 2.0.2 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-what@4.1.16: {} + + isexe@2.0.0: {} + + jackspeak@2.3.6: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jiti@1.21.0: {} + + js-tokens@4.0.0: {} + + jsesc@2.5.2: {} + + json5@2.2.3: {} + + lilconfig@2.1.0: {} + + lilconfig@3.1.1: {} + + lines-and-columns@1.2.4: {} + + lru-cache@10.2.2: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + merge-anything@5.1.7: + dependencies: + is-what: 4.1.16 + + merge2@1.4.1: {} + + micromatch@4.0.5: + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + + minimatch@9.0.4: + dependencies: + brace-expansion: 2.0.1 + + minipass@7.1.0: {} + + ms@2.1.2: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.7: {} + + node-releases@2.0.14: {} + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.10.2: + dependencies: + lru-cache: 10.2.2 + minipass: 7.1.0 + + picocolors@1.0.0: {} + + picomatch@2.3.1: {} + + pify@2.3.0: {} + + pirates@4.0.6: {} + + postcss-import@15.1.0(postcss@8.4.38): + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + + postcss-js@4.0.1(postcss@8.4.38): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.38 + + postcss-load-config@4.0.2(postcss@8.4.38): + dependencies: + lilconfig: 3.1.1 + yaml: 2.4.2 + optionalDependencies: + postcss: 8.4.38 + + postcss-nested@6.0.1(postcss@8.4.38): + dependencies: + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 + + postcss-selector-parser@6.0.16: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.4.38: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.2.0 + + queue-microtask@1.2.3: {} + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + resolve@1.22.8: + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.0.4: {} + + rollup@3.29.4: + optionalDependencies: + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + semver@6.3.1: {} + + seroval-plugins@1.0.5(seroval@1.0.5): + dependencies: + seroval: 1.0.5 + + seroval@1.0.5: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} + + solid-js@1.8.17: + dependencies: + csstype: 3.1.3 + seroval: 1.0.5 + seroval-plugins: 1.0.5(seroval@1.0.5) + + solid-refresh@0.6.3(solid-js@1.8.17): + dependencies: + '@babel/generator': 7.24.5 + '@babel/helper-module-imports': 7.24.3 + '@babel/types': 7.24.5 + solid-js: 1.8.17 + + source-map-js@1.2.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.0.1 + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + commander: 4.1.1 + glob: 10.3.12 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + tailwindcss@3.4.3: + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.0 + lilconfig: 2.1.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.38 + postcss-import: 15.1.0(postcss@8.4.38) + postcss-js: 4.0.1(postcss@8.4.38) + postcss-load-config: 4.0.2(postcss@8.4.38) + postcss-nested: 6.0.1(postcss@8.4.38) + postcss-selector-parser: 6.0.16 + resolve: 1.22.8 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + to-fast-properties@2.0.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + ts-interface-checker@0.1.13: {} + + typescript@4.9.5: {} + + undici-types@5.26.5: {} + + update-browserslist-db@1.0.15(browserslist@4.23.0): + dependencies: + browserslist: 4.23.0 + escalade: 3.1.2 + picocolors: 1.0.0 + + util-deprecate@1.0.2: {} + + validate-html-nesting@1.2.2: {} + + vite-plugin-solid@2.10.2(solid-js@1.8.17)(vite@4.5.3(@types/node@18.19.33)): + dependencies: + '@babel/core': 7.24.5 + '@types/babel__core': 7.20.5 + babel-preset-solid: 1.8.17(@babel/core@7.24.5) + merge-anything: 5.1.7 + solid-js: 1.8.17 + solid-refresh: 0.6.3(solid-js@1.8.17) + vite: 4.5.3(@types/node@18.19.33) + vitefu: 0.2.5(vite@4.5.3(@types/node@18.19.33)) + transitivePeerDependencies: + - supports-color + + vite@4.5.3(@types/node@18.19.33): + dependencies: + esbuild: 0.18.20 + postcss: 8.4.38 + rollup: 3.29.4 + optionalDependencies: + '@types/node': 18.19.33 + fsevents: 2.3.3 + + vitefu@0.2.5(vite@4.5.3(@types/node@18.19.33)): + optionalDependencies: + vite: 4.5.3(@types/node@18.19.33) + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + yallist@3.1.1: {} + + yaml@2.4.2: {} diff --git a/external/prisma-client-rust/examples/tauri/postcss.config.js b/external/prisma-client-rust/examples/tauri/postcss.config.js new file mode 100644 index 0000000..33ad091 --- /dev/null +++ b/external/prisma-client-rust/examples/tauri/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/external/prisma-client-rust/examples/tauri/public/tauri.svg b/external/prisma-client-rust/examples/tauri/public/tauri.svg new file mode 100644 index 0000000..31b62c9 --- /dev/null +++ b/external/prisma-client-rust/examples/tauri/public/tauri.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/external/prisma-client-rust/examples/tauri/public/vite.svg b/external/prisma-client-rust/examples/tauri/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/external/prisma-client-rust/examples/tauri/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/external/prisma-client-rust/examples/tauri/src-tauri/.cargo/config.toml b/external/prisma-client-rust/examples/tauri/src-tauri/.cargo/config.toml new file mode 100644 index 0000000..7ed5047 --- /dev/null +++ b/external/prisma-client-rust/examples/tauri/src-tauri/.cargo/config.toml @@ -0,0 +1,2 @@ +[alias] +prisma = "run -p prisma-cli --features specta,sqlite --" diff --git a/external/prisma-client-rust/examples/tauri/src-tauri/.gitignore b/external/prisma-client-rust/examples/tauri/src-tauri/.gitignore new file mode 100644 index 0000000..f4dfb82 --- /dev/null +++ b/external/prisma-client-rust/examples/tauri/src-tauri/.gitignore @@ -0,0 +1,4 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ + diff --git a/external/prisma-client-rust/examples/tauri/src-tauri/Cargo.toml b/external/prisma-client-rust/examples/tauri/src-tauri/Cargo.toml new file mode 100644 index 0000000..57dbd91 --- /dev/null +++ b/external/prisma-client-rust/examples/tauri/src-tauri/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "prisma-client-rust-tauri-example" +version = "0.0.0" +description = "A Tauri App" +authors = ["you"] +license = "" +repository = "" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[build-dependencies] +tauri-build = { version = "^2.0.0-beta", features = [] } + +[dependencies] +tauri = { version = "^2.0.0-beta", features = [] } +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +prisma-client-rust = { workspace = true, features = [ + "sqlite", + "migrations", + "mocking", + "specta", +] } +specta = { workspace = true } +tauri-specta = { workspace = true, features = [ + "typescript", +] } # TODO: this will be broke +tokio = { version = "1.26.0", features = ["macros"] } + +[features] +# this feature is used for production builds or when `devPath` points to the filesystem +# DO NOT REMOVE!! +custom-protocol = ["tauri/custom-protocol"] diff --git a/external/prisma-client-rust/examples/tauri/src-tauri/build.rs b/external/prisma-client-rust/examples/tauri/src-tauri/build.rs new file mode 100644 index 0000000..d860e1e --- /dev/null +++ b/external/prisma-client-rust/examples/tauri/src-tauri/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build() +} diff --git a/external/prisma-client-rust/examples/tauri/src-tauri/gen/schemas/acl-manifests.json b/external/prisma-client-rust/examples/tauri/src-tauri/gen/schemas/acl-manifests.json new file mode 100644 index 0000000..c719d47 --- /dev/null +++ b/external/prisma-client-rust/examples/tauri/src-tauri/gen/schemas/acl-manifests.json @@ -0,0 +1 @@ +{"app":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-version","allow-name","allow-tauri-version"]},"permissions":{"allow-app-hide":{"identifier":"allow-app-hide","description":"Enables the app_hide command without any pre-configured scope.","commands":{"allow":["app_hide"],"deny":[]}},"allow-app-show":{"identifier":"allow-app-show","description":"Enables the app_show command without any pre-configured scope.","commands":{"allow":["app_show"],"deny":[]}},"allow-name":{"identifier":"allow-name","description":"Enables the name command without any pre-configured scope.","commands":{"allow":["name"],"deny":[]}},"allow-tauri-version":{"identifier":"allow-tauri-version","description":"Enables the tauri_version command without any pre-configured scope.","commands":{"allow":["tauri_version"],"deny":[]}},"allow-version":{"identifier":"allow-version","description":"Enables the version command without any pre-configured scope.","commands":{"allow":["version"],"deny":[]}},"deny-app-hide":{"identifier":"deny-app-hide","description":"Denies the app_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["app_hide"]}},"deny-app-show":{"identifier":"deny-app-show","description":"Denies the app_show command without any pre-configured scope.","commands":{"allow":[],"deny":["app_show"]}},"deny-name":{"identifier":"deny-name","description":"Denies the name command without any pre-configured scope.","commands":{"allow":[],"deny":["name"]}},"deny-tauri-version":{"identifier":"deny-tauri-version","description":"Denies the tauri_version command without any pre-configured scope.","commands":{"allow":[],"deny":["tauri_version"]}},"deny-version":{"identifier":"deny-version","description":"Denies the version command without any pre-configured scope.","commands":{"allow":[],"deny":["version"]}}},"permission_sets":{},"global_scope_schema":null},"event":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-listen","allow-unlisten","allow-emit","allow-emit-to"]},"permissions":{"allow-emit":{"identifier":"allow-emit","description":"Enables the emit command without any pre-configured scope.","commands":{"allow":["emit"],"deny":[]}},"allow-emit-to":{"identifier":"allow-emit-to","description":"Enables the emit_to command without any pre-configured scope.","commands":{"allow":["emit_to"],"deny":[]}},"allow-listen":{"identifier":"allow-listen","description":"Enables the listen command without any pre-configured scope.","commands":{"allow":["listen"],"deny":[]}},"allow-unlisten":{"identifier":"allow-unlisten","description":"Enables the unlisten command without any pre-configured scope.","commands":{"allow":["unlisten"],"deny":[]}},"deny-emit":{"identifier":"deny-emit","description":"Denies the emit command without any pre-configured scope.","commands":{"allow":[],"deny":["emit"]}},"deny-emit-to":{"identifier":"deny-emit-to","description":"Denies the emit_to command without any pre-configured scope.","commands":{"allow":[],"deny":["emit_to"]}},"deny-listen":{"identifier":"deny-listen","description":"Denies the listen command without any pre-configured scope.","commands":{"allow":[],"deny":["listen"]}},"deny-unlisten":{"identifier":"deny-unlisten","description":"Denies the unlisten command without any pre-configured scope.","commands":{"allow":[],"deny":["unlisten"]}}},"permission_sets":{},"global_scope_schema":null},"image":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-new","allow-from-bytes","allow-from-path","allow-rgba","allow-size"]},"permissions":{"allow-from-bytes":{"identifier":"allow-from-bytes","description":"Enables the from_bytes command without any pre-configured scope.","commands":{"allow":["from_bytes"],"deny":[]}},"allow-from-path":{"identifier":"allow-from-path","description":"Enables the from_path command without any pre-configured scope.","commands":{"allow":["from_path"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-rgba":{"identifier":"allow-rgba","description":"Enables the rgba command without any pre-configured scope.","commands":{"allow":["rgba"],"deny":[]}},"allow-size":{"identifier":"allow-size","description":"Enables the size command without any pre-configured scope.","commands":{"allow":["size"],"deny":[]}},"deny-from-bytes":{"identifier":"deny-from-bytes","description":"Denies the from_bytes command without any pre-configured scope.","commands":{"allow":[],"deny":["from_bytes"]}},"deny-from-path":{"identifier":"deny-from-path","description":"Denies the from_path command without any pre-configured scope.","commands":{"allow":[],"deny":["from_path"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-rgba":{"identifier":"deny-rgba","description":"Denies the rgba command without any pre-configured scope.","commands":{"allow":[],"deny":["rgba"]}},"deny-size":{"identifier":"deny-size","description":"Denies the size command without any pre-configured scope.","commands":{"allow":[],"deny":["size"]}}},"permission_sets":{},"global_scope_schema":null},"menu":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":[]},"permissions":{"allow-append":{"identifier":"allow-append","description":"Enables the append command without any pre-configured scope.","commands":{"allow":["append"],"deny":[]}},"allow-create-default":{"identifier":"allow-create-default","description":"Enables the create_default command without any pre-configured scope.","commands":{"allow":["create_default"],"deny":[]}},"allow-get":{"identifier":"allow-get","description":"Enables the get command without any pre-configured scope.","commands":{"allow":["get"],"deny":[]}},"allow-insert":{"identifier":"allow-insert","description":"Enables the insert command without any pre-configured scope.","commands":{"allow":["insert"],"deny":[]}},"allow-is-checked":{"identifier":"allow-is-checked","description":"Enables the is_checked command without any pre-configured scope.","commands":{"allow":["is_checked"],"deny":[]}},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]}},"allow-items":{"identifier":"allow-items","description":"Enables the items command without any pre-configured scope.","commands":{"allow":["items"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-popup":{"identifier":"allow-popup","description":"Enables the popup command without any pre-configured scope.","commands":{"allow":["popup"],"deny":[]}},"allow-prepend":{"identifier":"allow-prepend","description":"Enables the prepend command without any pre-configured scope.","commands":{"allow":["prepend"],"deny":[]}},"allow-remove":{"identifier":"allow-remove","description":"Enables the remove command without any pre-configured scope.","commands":{"allow":["remove"],"deny":[]}},"allow-remove-at":{"identifier":"allow-remove-at","description":"Enables the remove_at command without any pre-configured scope.","commands":{"allow":["remove_at"],"deny":[]}},"allow-set-accelerator":{"identifier":"allow-set-accelerator","description":"Enables the set_accelerator command without any pre-configured scope.","commands":{"allow":["set_accelerator"],"deny":[]}},"allow-set-as-app-menu":{"identifier":"allow-set-as-app-menu","description":"Enables the set_as_app_menu command without any pre-configured scope.","commands":{"allow":["set_as_app_menu"],"deny":[]}},"allow-set-as-help-menu-for-nsapp":{"identifier":"allow-set-as-help-menu-for-nsapp","description":"Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_help_menu_for_nsapp"],"deny":[]}},"allow-set-as-window-menu":{"identifier":"allow-set-as-window-menu","description":"Enables the set_as_window_menu command without any pre-configured scope.","commands":{"allow":["set_as_window_menu"],"deny":[]}},"allow-set-as-windows-menu-for-nsapp":{"identifier":"allow-set-as-windows-menu-for-nsapp","description":"Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_windows_menu_for_nsapp"],"deny":[]}},"allow-set-checked":{"identifier":"allow-set-checked","description":"Enables the set_checked command without any pre-configured scope.","commands":{"allow":["set_checked"],"deny":[]}},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-text":{"identifier":"allow-set-text","description":"Enables the set_text command without any pre-configured scope.","commands":{"allow":["set_text"],"deny":[]}},"allow-text":{"identifier":"allow-text","description":"Enables the text command without any pre-configured scope.","commands":{"allow":["text"],"deny":[]}},"deny-append":{"identifier":"deny-append","description":"Denies the append command without any pre-configured scope.","commands":{"allow":[],"deny":["append"]}},"deny-create-default":{"identifier":"deny-create-default","description":"Denies the create_default command without any pre-configured scope.","commands":{"allow":[],"deny":["create_default"]}},"deny-get":{"identifier":"deny-get","description":"Denies the get command without any pre-configured scope.","commands":{"allow":[],"deny":["get"]}},"deny-insert":{"identifier":"deny-insert","description":"Denies the insert command without any pre-configured scope.","commands":{"allow":[],"deny":["insert"]}},"deny-is-checked":{"identifier":"deny-is-checked","description":"Denies the is_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["is_checked"]}},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]}},"deny-items":{"identifier":"deny-items","description":"Denies the items command without any pre-configured scope.","commands":{"allow":[],"deny":["items"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-popup":{"identifier":"deny-popup","description":"Denies the popup command without any pre-configured scope.","commands":{"allow":[],"deny":["popup"]}},"deny-prepend":{"identifier":"deny-prepend","description":"Denies the prepend command without any pre-configured scope.","commands":{"allow":[],"deny":["prepend"]}},"deny-remove":{"identifier":"deny-remove","description":"Denies the remove command without any pre-configured scope.","commands":{"allow":[],"deny":["remove"]}},"deny-remove-at":{"identifier":"deny-remove-at","description":"Denies the remove_at command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_at"]}},"deny-set-accelerator":{"identifier":"deny-set-accelerator","description":"Denies the set_accelerator command without any pre-configured scope.","commands":{"allow":[],"deny":["set_accelerator"]}},"deny-set-as-app-menu":{"identifier":"deny-set-as-app-menu","description":"Denies the set_as_app_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_app_menu"]}},"deny-set-as-help-menu-for-nsapp":{"identifier":"deny-set-as-help-menu-for-nsapp","description":"Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_help_menu_for_nsapp"]}},"deny-set-as-window-menu":{"identifier":"deny-set-as-window-menu","description":"Denies the set_as_window_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_window_menu"]}},"deny-set-as-windows-menu-for-nsapp":{"identifier":"deny-set-as-windows-menu-for-nsapp","description":"Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_windows_menu_for_nsapp"]}},"deny-set-checked":{"identifier":"deny-set-checked","description":"Denies the set_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["set_checked"]}},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-text":{"identifier":"deny-set-text","description":"Denies the set_text command without any pre-configured scope.","commands":{"allow":[],"deny":["set_text"]}},"deny-text":{"identifier":"deny-text","description":"Denies the text command without any pre-configured scope.","commands":{"allow":[],"deny":["text"]}}},"permission_sets":{},"global_scope_schema":null},"path":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-resolve-directory","allow-resolve","allow-normalize","allow-join","allow-dirname","allow-extname","allow-basename","allow-is-absolute"]},"permissions":{"allow-basename":{"identifier":"allow-basename","description":"Enables the basename command without any pre-configured scope.","commands":{"allow":["basename"],"deny":[]}},"allow-dirname":{"identifier":"allow-dirname","description":"Enables the dirname command without any pre-configured scope.","commands":{"allow":["dirname"],"deny":[]}},"allow-extname":{"identifier":"allow-extname","description":"Enables the extname command without any pre-configured scope.","commands":{"allow":["extname"],"deny":[]}},"allow-is-absolute":{"identifier":"allow-is-absolute","description":"Enables the is_absolute command without any pre-configured scope.","commands":{"allow":["is_absolute"],"deny":[]}},"allow-join":{"identifier":"allow-join","description":"Enables the join command without any pre-configured scope.","commands":{"allow":["join"],"deny":[]}},"allow-normalize":{"identifier":"allow-normalize","description":"Enables the normalize command without any pre-configured scope.","commands":{"allow":["normalize"],"deny":[]}},"allow-resolve":{"identifier":"allow-resolve","description":"Enables the resolve command without any pre-configured scope.","commands":{"allow":["resolve"],"deny":[]}},"allow-resolve-directory":{"identifier":"allow-resolve-directory","description":"Enables the resolve_directory command without any pre-configured scope.","commands":{"allow":["resolve_directory"],"deny":[]}},"deny-basename":{"identifier":"deny-basename","description":"Denies the basename command without any pre-configured scope.","commands":{"allow":[],"deny":["basename"]}},"deny-dirname":{"identifier":"deny-dirname","description":"Denies the dirname command without any pre-configured scope.","commands":{"allow":[],"deny":["dirname"]}},"deny-extname":{"identifier":"deny-extname","description":"Denies the extname command without any pre-configured scope.","commands":{"allow":[],"deny":["extname"]}},"deny-is-absolute":{"identifier":"deny-is-absolute","description":"Denies the is_absolute command without any pre-configured scope.","commands":{"allow":[],"deny":["is_absolute"]}},"deny-join":{"identifier":"deny-join","description":"Denies the join command without any pre-configured scope.","commands":{"allow":[],"deny":["join"]}},"deny-normalize":{"identifier":"deny-normalize","description":"Denies the normalize command without any pre-configured scope.","commands":{"allow":[],"deny":["normalize"]}},"deny-resolve":{"identifier":"deny-resolve","description":"Denies the resolve command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve"]}},"deny-resolve-directory":{"identifier":"deny-resolve-directory","description":"Denies the resolve_directory command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve_directory"]}}},"permission_sets":{},"global_scope_schema":null},"resources":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-close"]},"permissions":{"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}}},"permission_sets":{},"global_scope_schema":null},"tray":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":[]},"permissions":{"allow-get-by-id":{"identifier":"allow-get-by-id","description":"Enables the get_by_id command without any pre-configured scope.","commands":{"allow":["get_by_id"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-remove-by-id":{"identifier":"allow-remove-by-id","description":"Enables the remove_by_id command without any pre-configured scope.","commands":{"allow":["remove_by_id"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-icon-as-template":{"identifier":"allow-set-icon-as-template","description":"Enables the set_icon_as_template command without any pre-configured scope.","commands":{"allow":["set_icon_as_template"],"deny":[]}},"allow-set-menu":{"identifier":"allow-set-menu","description":"Enables the set_menu command without any pre-configured scope.","commands":{"allow":["set_menu"],"deny":[]}},"allow-set-show-menu-on-left-click":{"identifier":"allow-set-show-menu-on-left-click","description":"Enables the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":["set_show_menu_on_left_click"],"deny":[]}},"allow-set-temp-dir-path":{"identifier":"allow-set-temp-dir-path","description":"Enables the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":["set_temp_dir_path"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-tooltip":{"identifier":"allow-set-tooltip","description":"Enables the set_tooltip command without any pre-configured scope.","commands":{"allow":["set_tooltip"],"deny":[]}},"allow-set-visible":{"identifier":"allow-set-visible","description":"Enables the set_visible command without any pre-configured scope.","commands":{"allow":["set_visible"],"deny":[]}},"deny-get-by-id":{"identifier":"deny-get-by-id","description":"Denies the get_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["get_by_id"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-remove-by-id":{"identifier":"deny-remove-by-id","description":"Denies the remove_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_by_id"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-icon-as-template":{"identifier":"deny-set-icon-as-template","description":"Denies the set_icon_as_template command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon_as_template"]}},"deny-set-menu":{"identifier":"deny-set-menu","description":"Denies the set_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_menu"]}},"deny-set-show-menu-on-left-click":{"identifier":"deny-set-show-menu-on-left-click","description":"Denies the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":[],"deny":["set_show_menu_on_left_click"]}},"deny-set-temp-dir-path":{"identifier":"deny-set-temp-dir-path","description":"Denies the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":[],"deny":["set_temp_dir_path"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-tooltip":{"identifier":"deny-set-tooltip","description":"Denies the set_tooltip command without any pre-configured scope.","commands":{"allow":[],"deny":["set_tooltip"]}},"deny-set-visible":{"identifier":"deny-set-visible","description":"Denies the set_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible"]}}},"permission_sets":{},"global_scope_schema":null},"webview":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-webview-position","allow-webview-size","allow-internal-toggle-devtools"]},"permissions":{"allow-create-webview":{"identifier":"allow-create-webview","description":"Enables the create_webview command without any pre-configured scope.","commands":{"allow":["create_webview"],"deny":[]}},"allow-create-webview-window":{"identifier":"allow-create-webview-window","description":"Enables the create_webview_window command without any pre-configured scope.","commands":{"allow":["create_webview_window"],"deny":[]}},"allow-internal-toggle-devtools":{"identifier":"allow-internal-toggle-devtools","description":"Enables the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":["internal_toggle_devtools"],"deny":[]}},"allow-print":{"identifier":"allow-print","description":"Enables the print command without any pre-configured scope.","commands":{"allow":["print"],"deny":[]}},"allow-reparent":{"identifier":"allow-reparent","description":"Enables the reparent command without any pre-configured scope.","commands":{"allow":["reparent"],"deny":[]}},"allow-set-webview-focus":{"identifier":"allow-set-webview-focus","description":"Enables the set_webview_focus command without any pre-configured scope.","commands":{"allow":["set_webview_focus"],"deny":[]}},"allow-set-webview-position":{"identifier":"allow-set-webview-position","description":"Enables the set_webview_position command without any pre-configured scope.","commands":{"allow":["set_webview_position"],"deny":[]}},"allow-set-webview-size":{"identifier":"allow-set-webview-size","description":"Enables the set_webview_size command without any pre-configured scope.","commands":{"allow":["set_webview_size"],"deny":[]}},"allow-set-webview-zoom":{"identifier":"allow-set-webview-zoom","description":"Enables the set_webview_zoom command without any pre-configured scope.","commands":{"allow":["set_webview_zoom"],"deny":[]}},"allow-webview-close":{"identifier":"allow-webview-close","description":"Enables the webview_close command without any pre-configured scope.","commands":{"allow":["webview_close"],"deny":[]}},"allow-webview-position":{"identifier":"allow-webview-position","description":"Enables the webview_position command without any pre-configured scope.","commands":{"allow":["webview_position"],"deny":[]}},"allow-webview-size":{"identifier":"allow-webview-size","description":"Enables the webview_size command without any pre-configured scope.","commands":{"allow":["webview_size"],"deny":[]}},"deny-create-webview":{"identifier":"deny-create-webview","description":"Denies the create_webview command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview"]}},"deny-create-webview-window":{"identifier":"deny-create-webview-window","description":"Denies the create_webview_window command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview_window"]}},"deny-internal-toggle-devtools":{"identifier":"deny-internal-toggle-devtools","description":"Denies the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_devtools"]}},"deny-print":{"identifier":"deny-print","description":"Denies the print command without any pre-configured scope.","commands":{"allow":[],"deny":["print"]}},"deny-reparent":{"identifier":"deny-reparent","description":"Denies the reparent command without any pre-configured scope.","commands":{"allow":[],"deny":["reparent"]}},"deny-set-webview-focus":{"identifier":"deny-set-webview-focus","description":"Denies the set_webview_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_focus"]}},"deny-set-webview-position":{"identifier":"deny-set-webview-position","description":"Denies the set_webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_position"]}},"deny-set-webview-size":{"identifier":"deny-set-webview-size","description":"Denies the set_webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_size"]}},"deny-set-webview-zoom":{"identifier":"deny-set-webview-zoom","description":"Denies the set_webview_zoom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_zoom"]}},"deny-webview-close":{"identifier":"deny-webview-close","description":"Denies the webview_close command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_close"]}},"deny-webview-position":{"identifier":"deny-webview-position","description":"Denies the webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_position"]}},"deny-webview-size":{"identifier":"deny-webview-size","description":"Denies the webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_size"]}}},"permission_sets":{},"global_scope_schema":null},"window":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-scale-factor","allow-inner-position","allow-outer-position","allow-inner-size","allow-outer-size","allow-is-fullscreen","allow-is-minimized","allow-is-maximized","allow-is-focused","allow-is-decorated","allow-is-resizable","allow-is-maximizable","allow-is-minimizable","allow-is-closable","allow-is-visible","allow-title","allow-current-monitor","allow-primary-monitor","allow-available-monitors","allow-cursor-position","allow-theme","allow-internal-toggle-maximize"]},"permissions":{"allow-available-monitors":{"identifier":"allow-available-monitors","description":"Enables the available_monitors command without any pre-configured scope.","commands":{"allow":["available_monitors"],"deny":[]}},"allow-center":{"identifier":"allow-center","description":"Enables the center command without any pre-configured scope.","commands":{"allow":["center"],"deny":[]}},"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"allow-create":{"identifier":"allow-create","description":"Enables the create command without any pre-configured scope.","commands":{"allow":["create"],"deny":[]}},"allow-current-monitor":{"identifier":"allow-current-monitor","description":"Enables the current_monitor command without any pre-configured scope.","commands":{"allow":["current_monitor"],"deny":[]}},"allow-cursor-position":{"identifier":"allow-cursor-position","description":"Enables the cursor_position command without any pre-configured scope.","commands":{"allow":["cursor_position"],"deny":[]}},"allow-destroy":{"identifier":"allow-destroy","description":"Enables the destroy command without any pre-configured scope.","commands":{"allow":["destroy"],"deny":[]}},"allow-hide":{"identifier":"allow-hide","description":"Enables the hide command without any pre-configured scope.","commands":{"allow":["hide"],"deny":[]}},"allow-inner-position":{"identifier":"allow-inner-position","description":"Enables the inner_position command without any pre-configured scope.","commands":{"allow":["inner_position"],"deny":[]}},"allow-inner-size":{"identifier":"allow-inner-size","description":"Enables the inner_size command without any pre-configured scope.","commands":{"allow":["inner_size"],"deny":[]}},"allow-internal-toggle-maximize":{"identifier":"allow-internal-toggle-maximize","description":"Enables the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":["internal_toggle_maximize"],"deny":[]}},"allow-is-closable":{"identifier":"allow-is-closable","description":"Enables the is_closable command without any pre-configured scope.","commands":{"allow":["is_closable"],"deny":[]}},"allow-is-decorated":{"identifier":"allow-is-decorated","description":"Enables the is_decorated command without any pre-configured scope.","commands":{"allow":["is_decorated"],"deny":[]}},"allow-is-focused":{"identifier":"allow-is-focused","description":"Enables the is_focused command without any pre-configured scope.","commands":{"allow":["is_focused"],"deny":[]}},"allow-is-fullscreen":{"identifier":"allow-is-fullscreen","description":"Enables the is_fullscreen command without any pre-configured scope.","commands":{"allow":["is_fullscreen"],"deny":[]}},"allow-is-maximizable":{"identifier":"allow-is-maximizable","description":"Enables the is_maximizable command without any pre-configured scope.","commands":{"allow":["is_maximizable"],"deny":[]}},"allow-is-maximized":{"identifier":"allow-is-maximized","description":"Enables the is_maximized command without any pre-configured scope.","commands":{"allow":["is_maximized"],"deny":[]}},"allow-is-minimizable":{"identifier":"allow-is-minimizable","description":"Enables the is_minimizable command without any pre-configured scope.","commands":{"allow":["is_minimizable"],"deny":[]}},"allow-is-minimized":{"identifier":"allow-is-minimized","description":"Enables the is_minimized command without any pre-configured scope.","commands":{"allow":["is_minimized"],"deny":[]}},"allow-is-resizable":{"identifier":"allow-is-resizable","description":"Enables the is_resizable command without any pre-configured scope.","commands":{"allow":["is_resizable"],"deny":[]}},"allow-is-visible":{"identifier":"allow-is-visible","description":"Enables the is_visible command without any pre-configured scope.","commands":{"allow":["is_visible"],"deny":[]}},"allow-maximize":{"identifier":"allow-maximize","description":"Enables the maximize command without any pre-configured scope.","commands":{"allow":["maximize"],"deny":[]}},"allow-minimize":{"identifier":"allow-minimize","description":"Enables the minimize command without any pre-configured scope.","commands":{"allow":["minimize"],"deny":[]}},"allow-outer-position":{"identifier":"allow-outer-position","description":"Enables the outer_position command without any pre-configured scope.","commands":{"allow":["outer_position"],"deny":[]}},"allow-outer-size":{"identifier":"allow-outer-size","description":"Enables the outer_size command without any pre-configured scope.","commands":{"allow":["outer_size"],"deny":[]}},"allow-primary-monitor":{"identifier":"allow-primary-monitor","description":"Enables the primary_monitor command without any pre-configured scope.","commands":{"allow":["primary_monitor"],"deny":[]}},"allow-request-user-attention":{"identifier":"allow-request-user-attention","description":"Enables the request_user_attention command without any pre-configured scope.","commands":{"allow":["request_user_attention"],"deny":[]}},"allow-scale-factor":{"identifier":"allow-scale-factor","description":"Enables the scale_factor command without any pre-configured scope.","commands":{"allow":["scale_factor"],"deny":[]}},"allow-set-always-on-bottom":{"identifier":"allow-set-always-on-bottom","description":"Enables the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":["set_always_on_bottom"],"deny":[]}},"allow-set-always-on-top":{"identifier":"allow-set-always-on-top","description":"Enables the set_always_on_top command without any pre-configured scope.","commands":{"allow":["set_always_on_top"],"deny":[]}},"allow-set-closable":{"identifier":"allow-set-closable","description":"Enables the set_closable command without any pre-configured scope.","commands":{"allow":["set_closable"],"deny":[]}},"allow-set-content-protected":{"identifier":"allow-set-content-protected","description":"Enables the set_content_protected command without any pre-configured scope.","commands":{"allow":["set_content_protected"],"deny":[]}},"allow-set-cursor-grab":{"identifier":"allow-set-cursor-grab","description":"Enables the set_cursor_grab command without any pre-configured scope.","commands":{"allow":["set_cursor_grab"],"deny":[]}},"allow-set-cursor-icon":{"identifier":"allow-set-cursor-icon","description":"Enables the set_cursor_icon command without any pre-configured scope.","commands":{"allow":["set_cursor_icon"],"deny":[]}},"allow-set-cursor-position":{"identifier":"allow-set-cursor-position","description":"Enables the set_cursor_position command without any pre-configured scope.","commands":{"allow":["set_cursor_position"],"deny":[]}},"allow-set-cursor-visible":{"identifier":"allow-set-cursor-visible","description":"Enables the set_cursor_visible command without any pre-configured scope.","commands":{"allow":["set_cursor_visible"],"deny":[]}},"allow-set-decorations":{"identifier":"allow-set-decorations","description":"Enables the set_decorations command without any pre-configured scope.","commands":{"allow":["set_decorations"],"deny":[]}},"allow-set-effects":{"identifier":"allow-set-effects","description":"Enables the set_effects command without any pre-configured scope.","commands":{"allow":["set_effects"],"deny":[]}},"allow-set-focus":{"identifier":"allow-set-focus","description":"Enables the set_focus command without any pre-configured scope.","commands":{"allow":["set_focus"],"deny":[]}},"allow-set-fullscreen":{"identifier":"allow-set-fullscreen","description":"Enables the set_fullscreen command without any pre-configured scope.","commands":{"allow":["set_fullscreen"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-ignore-cursor-events":{"identifier":"allow-set-ignore-cursor-events","description":"Enables the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":["set_ignore_cursor_events"],"deny":[]}},"allow-set-max-size":{"identifier":"allow-set-max-size","description":"Enables the set_max_size command without any pre-configured scope.","commands":{"allow":["set_max_size"],"deny":[]}},"allow-set-maximizable":{"identifier":"allow-set-maximizable","description":"Enables the set_maximizable command without any pre-configured scope.","commands":{"allow":["set_maximizable"],"deny":[]}},"allow-set-min-size":{"identifier":"allow-set-min-size","description":"Enables the set_min_size command without any pre-configured scope.","commands":{"allow":["set_min_size"],"deny":[]}},"allow-set-minimizable":{"identifier":"allow-set-minimizable","description":"Enables the set_minimizable command without any pre-configured scope.","commands":{"allow":["set_minimizable"],"deny":[]}},"allow-set-position":{"identifier":"allow-set-position","description":"Enables the set_position command without any pre-configured scope.","commands":{"allow":["set_position"],"deny":[]}},"allow-set-progress-bar":{"identifier":"allow-set-progress-bar","description":"Enables the set_progress_bar command without any pre-configured scope.","commands":{"allow":["set_progress_bar"],"deny":[]}},"allow-set-resizable":{"identifier":"allow-set-resizable","description":"Enables the set_resizable command without any pre-configured scope.","commands":{"allow":["set_resizable"],"deny":[]}},"allow-set-shadow":{"identifier":"allow-set-shadow","description":"Enables the set_shadow command without any pre-configured scope.","commands":{"allow":["set_shadow"],"deny":[]}},"allow-set-size":{"identifier":"allow-set-size","description":"Enables the set_size command without any pre-configured scope.","commands":{"allow":["set_size"],"deny":[]}},"allow-set-skip-taskbar":{"identifier":"allow-set-skip-taskbar","description":"Enables the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":["set_skip_taskbar"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-visible-on-all-workspaces":{"identifier":"allow-set-visible-on-all-workspaces","description":"Enables the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":["set_visible_on_all_workspaces"],"deny":[]}},"allow-show":{"identifier":"allow-show","description":"Enables the show command without any pre-configured scope.","commands":{"allow":["show"],"deny":[]}},"allow-start-dragging":{"identifier":"allow-start-dragging","description":"Enables the start_dragging command without any pre-configured scope.","commands":{"allow":["start_dragging"],"deny":[]}},"allow-start-resize-dragging":{"identifier":"allow-start-resize-dragging","description":"Enables the start_resize_dragging command without any pre-configured scope.","commands":{"allow":["start_resize_dragging"],"deny":[]}},"allow-theme":{"identifier":"allow-theme","description":"Enables the theme command without any pre-configured scope.","commands":{"allow":["theme"],"deny":[]}},"allow-title":{"identifier":"allow-title","description":"Enables the title command without any pre-configured scope.","commands":{"allow":["title"],"deny":[]}},"allow-toggle-maximize":{"identifier":"allow-toggle-maximize","description":"Enables the toggle_maximize command without any pre-configured scope.","commands":{"allow":["toggle_maximize"],"deny":[]}},"allow-unmaximize":{"identifier":"allow-unmaximize","description":"Enables the unmaximize command without any pre-configured scope.","commands":{"allow":["unmaximize"],"deny":[]}},"allow-unminimize":{"identifier":"allow-unminimize","description":"Enables the unminimize command without any pre-configured scope.","commands":{"allow":["unminimize"],"deny":[]}},"deny-available-monitors":{"identifier":"deny-available-monitors","description":"Denies the available_monitors command without any pre-configured scope.","commands":{"allow":[],"deny":["available_monitors"]}},"deny-center":{"identifier":"deny-center","description":"Denies the center command without any pre-configured scope.","commands":{"allow":[],"deny":["center"]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}},"deny-create":{"identifier":"deny-create","description":"Denies the create command without any pre-configured scope.","commands":{"allow":[],"deny":["create"]}},"deny-current-monitor":{"identifier":"deny-current-monitor","description":"Denies the current_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["current_monitor"]}},"deny-cursor-position":{"identifier":"deny-cursor-position","description":"Denies the cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["cursor_position"]}},"deny-destroy":{"identifier":"deny-destroy","description":"Denies the destroy command without any pre-configured scope.","commands":{"allow":[],"deny":["destroy"]}},"deny-hide":{"identifier":"deny-hide","description":"Denies the hide command without any pre-configured scope.","commands":{"allow":[],"deny":["hide"]}},"deny-inner-position":{"identifier":"deny-inner-position","description":"Denies the inner_position command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_position"]}},"deny-inner-size":{"identifier":"deny-inner-size","description":"Denies the inner_size command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_size"]}},"deny-internal-toggle-maximize":{"identifier":"deny-internal-toggle-maximize","description":"Denies the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_maximize"]}},"deny-is-closable":{"identifier":"deny-is-closable","description":"Denies the is_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_closable"]}},"deny-is-decorated":{"identifier":"deny-is-decorated","description":"Denies the is_decorated command without any pre-configured scope.","commands":{"allow":[],"deny":["is_decorated"]}},"deny-is-focused":{"identifier":"deny-is-focused","description":"Denies the is_focused command without any pre-configured scope.","commands":{"allow":[],"deny":["is_focused"]}},"deny-is-fullscreen":{"identifier":"deny-is-fullscreen","description":"Denies the is_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["is_fullscreen"]}},"deny-is-maximizable":{"identifier":"deny-is-maximizable","description":"Denies the is_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximizable"]}},"deny-is-maximized":{"identifier":"deny-is-maximized","description":"Denies the is_maximized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximized"]}},"deny-is-minimizable":{"identifier":"deny-is-minimizable","description":"Denies the is_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimizable"]}},"deny-is-minimized":{"identifier":"deny-is-minimized","description":"Denies the is_minimized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimized"]}},"deny-is-resizable":{"identifier":"deny-is-resizable","description":"Denies the is_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_resizable"]}},"deny-is-visible":{"identifier":"deny-is-visible","description":"Denies the is_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["is_visible"]}},"deny-maximize":{"identifier":"deny-maximize","description":"Denies the maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["maximize"]}},"deny-minimize":{"identifier":"deny-minimize","description":"Denies the minimize command without any pre-configured scope.","commands":{"allow":[],"deny":["minimize"]}},"deny-outer-position":{"identifier":"deny-outer-position","description":"Denies the outer_position command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_position"]}},"deny-outer-size":{"identifier":"deny-outer-size","description":"Denies the outer_size command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_size"]}},"deny-primary-monitor":{"identifier":"deny-primary-monitor","description":"Denies the primary_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["primary_monitor"]}},"deny-request-user-attention":{"identifier":"deny-request-user-attention","description":"Denies the request_user_attention command without any pre-configured scope.","commands":{"allow":[],"deny":["request_user_attention"]}},"deny-scale-factor":{"identifier":"deny-scale-factor","description":"Denies the scale_factor command without any pre-configured scope.","commands":{"allow":[],"deny":["scale_factor"]}},"deny-set-always-on-bottom":{"identifier":"deny-set-always-on-bottom","description":"Denies the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_bottom"]}},"deny-set-always-on-top":{"identifier":"deny-set-always-on-top","description":"Denies the set_always_on_top command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_top"]}},"deny-set-closable":{"identifier":"deny-set-closable","description":"Denies the set_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_closable"]}},"deny-set-content-protected":{"identifier":"deny-set-content-protected","description":"Denies the set_content_protected command without any pre-configured scope.","commands":{"allow":[],"deny":["set_content_protected"]}},"deny-set-cursor-grab":{"identifier":"deny-set-cursor-grab","description":"Denies the set_cursor_grab command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_grab"]}},"deny-set-cursor-icon":{"identifier":"deny-set-cursor-icon","description":"Denies the set_cursor_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_icon"]}},"deny-set-cursor-position":{"identifier":"deny-set-cursor-position","description":"Denies the set_cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_position"]}},"deny-set-cursor-visible":{"identifier":"deny-set-cursor-visible","description":"Denies the set_cursor_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_visible"]}},"deny-set-decorations":{"identifier":"deny-set-decorations","description":"Denies the set_decorations command without any pre-configured scope.","commands":{"allow":[],"deny":["set_decorations"]}},"deny-set-effects":{"identifier":"deny-set-effects","description":"Denies the set_effects command without any pre-configured scope.","commands":{"allow":[],"deny":["set_effects"]}},"deny-set-focus":{"identifier":"deny-set-focus","description":"Denies the set_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_focus"]}},"deny-set-fullscreen":{"identifier":"deny-set-fullscreen","description":"Denies the set_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["set_fullscreen"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-ignore-cursor-events":{"identifier":"deny-set-ignore-cursor-events","description":"Denies the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":[],"deny":["set_ignore_cursor_events"]}},"deny-set-max-size":{"identifier":"deny-set-max-size","description":"Denies the set_max_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_max_size"]}},"deny-set-maximizable":{"identifier":"deny-set-maximizable","description":"Denies the set_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_maximizable"]}},"deny-set-min-size":{"identifier":"deny-set-min-size","description":"Denies the set_min_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_min_size"]}},"deny-set-minimizable":{"identifier":"deny-set-minimizable","description":"Denies the set_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_minimizable"]}},"deny-set-position":{"identifier":"deny-set-position","description":"Denies the set_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_position"]}},"deny-set-progress-bar":{"identifier":"deny-set-progress-bar","description":"Denies the set_progress_bar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_progress_bar"]}},"deny-set-resizable":{"identifier":"deny-set-resizable","description":"Denies the set_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_resizable"]}},"deny-set-shadow":{"identifier":"deny-set-shadow","description":"Denies the set_shadow command without any pre-configured scope.","commands":{"allow":[],"deny":["set_shadow"]}},"deny-set-size":{"identifier":"deny-set-size","description":"Denies the set_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size"]}},"deny-set-skip-taskbar":{"identifier":"deny-set-skip-taskbar","description":"Denies the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_skip_taskbar"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-visible-on-all-workspaces":{"identifier":"deny-set-visible-on-all-workspaces","description":"Denies the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible_on_all_workspaces"]}},"deny-show":{"identifier":"deny-show","description":"Denies the show command without any pre-configured scope.","commands":{"allow":[],"deny":["show"]}},"deny-start-dragging":{"identifier":"deny-start-dragging","description":"Denies the start_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_dragging"]}},"deny-start-resize-dragging":{"identifier":"deny-start-resize-dragging","description":"Denies the start_resize_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_resize_dragging"]}},"deny-theme":{"identifier":"deny-theme","description":"Denies the theme command without any pre-configured scope.","commands":{"allow":[],"deny":["theme"]}},"deny-title":{"identifier":"deny-title","description":"Denies the title command without any pre-configured scope.","commands":{"allow":[],"deny":["title"]}},"deny-toggle-maximize":{"identifier":"deny-toggle-maximize","description":"Denies the toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["toggle_maximize"]}},"deny-unmaximize":{"identifier":"deny-unmaximize","description":"Denies the unmaximize command without any pre-configured scope.","commands":{"allow":[],"deny":["unmaximize"]}},"deny-unminimize":{"identifier":"deny-unminimize","description":"Denies the unminimize command without any pre-configured scope.","commands":{"allow":[],"deny":["unminimize"]}}},"permission_sets":{},"global_scope_schema":null}} \ No newline at end of file diff --git a/external/prisma-client-rust/examples/tauri/src-tauri/gen/schemas/capabilities.json b/external/prisma-client-rust/examples/tauri/src-tauri/gen/schemas/capabilities.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/external/prisma-client-rust/examples/tauri/src-tauri/gen/schemas/capabilities.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/external/prisma-client-rust/examples/tauri/src-tauri/gen/schemas/desktop-schema.json b/external/prisma-client-rust/examples/tauri/src-tauri/gen/schemas/desktop-schema.json new file mode 100644 index 0000000..6eca9fd --- /dev/null +++ b/external/prisma-client-rust/examples/tauri/src-tauri/gen/schemas/desktop-schema.json @@ -0,0 +1,2153 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "CapabilityFile", + "description": "Capability formats accepted in a capability file.", + "anyOf": [ + { + "description": "A single capability.", + "allOf": [ + { + "$ref": "#/definitions/Capability" + } + ] + }, + { + "description": "A list of capabilities.", + "type": "array", + "items": { + "$ref": "#/definitions/Capability" + } + }, + { + "description": "A list of capabilities.", + "type": "object", + "required": [ + "capabilities" + ], + "properties": { + "capabilities": { + "description": "The list of capabilities.", + "type": "array", + "items": { + "$ref": "#/definitions/Capability" + } + } + } + } + ], + "definitions": { + "Capability": { + "description": "a grouping and boundary mechanism developers can use to separate windows or plugins functionality from each other at runtime.\n\nIf a window is not matching any capability then it has no access to the IPC layer at all.\n\nThis can be done to create trust groups and reduce impact of vulnerabilities in certain plugins or windows. Windows can be added to a capability by exact name or glob patterns like *, admin-* or main-window.", + "type": "object", + "required": [ + "identifier", + "permissions" + ], + "properties": { + "identifier": { + "description": "Identifier of the capability.", + "type": "string" + }, + "description": { + "description": "Description of the capability.", + "default": "", + "type": "string" + }, + "remote": { + "description": "Configure remote URLs that can use the capability permissions.", + "anyOf": [ + { + "$ref": "#/definitions/CapabilityRemote" + }, + { + "type": "null" + } + ] + }, + "local": { + "description": "Whether this capability is enabled for local app URLs or not. Defaults to `true`.", + "default": true, + "type": "boolean" + }, + "windows": { + "description": "List of windows that uses this capability. Can be a glob pattern.\n\nOn multiwebview windows, prefer [`Self::webviews`] for a fine grained access control.", + "type": "array", + "items": { + "type": "string" + } + }, + "webviews": { + "description": "List of webviews that uses this capability. Can be a glob pattern.\n\nThis is only required when using on multiwebview contexts, by default all child webviews of a window that matches [`Self::windows`] are linked.", + "type": "array", + "items": { + "type": "string" + } + }, + "permissions": { + "description": "List of permissions attached to this capability. Must include the plugin name as prefix in the form of `${plugin-name}:${permission-name}`.", + "type": "array", + "items": { + "$ref": "#/definitions/PermissionEntry" + } + }, + "platforms": { + "description": "Target platforms this capability applies. By default all platforms are affected by this capability.", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Target" + } + } + } + }, + "CapabilityRemote": { + "description": "Configuration for remote URLs that are associated with the capability.", + "type": "object", + "required": [ + "urls" + ], + "properties": { + "urls": { + "description": "Remote domains this capability refers to using the [URLPattern standard](https://urlpattern.spec.whatwg.org/).\n\n# Examples\n\n- \"https://*.mydomain.dev\": allows subdomains of mydomain.dev - \"https://mydomain.dev/api/*\": allows any subpath of mydomain.dev/api", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "PermissionEntry": { + "description": "An entry for a permission value in a [`Capability`] can be either a raw permission [`Identifier`] or an object that references a permission and extends its scope.", + "anyOf": [ + { + "description": "Reference a permission or permission set by identifier.", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + }, + { + "description": "Reference a permission or permission set by identifier and extends its scope.", + "type": "object", + "required": [ + "identifier" + ], + "properties": { + "identifier": { + "description": "Identifier of the permission or permission set.", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + }, + "allow": { + "description": "Data that defines what is allowed by the scope.", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Value" + } + }, + "deny": { + "description": "Data that defines what is denied by the scope.", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Value" + } + } + } + } + ] + }, + "Identifier": { + "oneOf": [ + { + "description": "app:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "app:default" + ] + }, + { + "description": "app:allow-app-hide -> Enables the app_hide command without any pre-configured scope.", + "type": "string", + "enum": [ + "app:allow-app-hide" + ] + }, + { + "description": "app:allow-app-show -> Enables the app_show command without any pre-configured scope.", + "type": "string", + "enum": [ + "app:allow-app-show" + ] + }, + { + "description": "app:allow-name -> Enables the name command without any pre-configured scope.", + "type": "string", + "enum": [ + "app:allow-name" + ] + }, + { + "description": "app:allow-tauri-version -> Enables the tauri_version command without any pre-configured scope.", + "type": "string", + "enum": [ + "app:allow-tauri-version" + ] + }, + { + "description": "app:allow-version -> Enables the version command without any pre-configured scope.", + "type": "string", + "enum": [ + "app:allow-version" + ] + }, + { + "description": "app:deny-app-hide -> Denies the app_hide command without any pre-configured scope.", + "type": "string", + "enum": [ + "app:deny-app-hide" + ] + }, + { + "description": "app:deny-app-show -> Denies the app_show command without any pre-configured scope.", + "type": "string", + "enum": [ + "app:deny-app-show" + ] + }, + { + "description": "app:deny-name -> Denies the name command without any pre-configured scope.", + "type": "string", + "enum": [ + "app:deny-name" + ] + }, + { + "description": "app:deny-tauri-version -> Denies the tauri_version command without any pre-configured scope.", + "type": "string", + "enum": [ + "app:deny-tauri-version" + ] + }, + { + "description": "app:deny-version -> Denies the version command without any pre-configured scope.", + "type": "string", + "enum": [ + "app:deny-version" + ] + }, + { + "description": "event:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "event:default" + ] + }, + { + "description": "event:allow-emit -> Enables the emit command without any pre-configured scope.", + "type": "string", + "enum": [ + "event:allow-emit" + ] + }, + { + "description": "event:allow-emit-to -> Enables the emit_to command without any pre-configured scope.", + "type": "string", + "enum": [ + "event:allow-emit-to" + ] + }, + { + "description": "event:allow-listen -> Enables the listen command without any pre-configured scope.", + "type": "string", + "enum": [ + "event:allow-listen" + ] + }, + { + "description": "event:allow-unlisten -> Enables the unlisten command without any pre-configured scope.", + "type": "string", + "enum": [ + "event:allow-unlisten" + ] + }, + { + "description": "event:deny-emit -> Denies the emit command without any pre-configured scope.", + "type": "string", + "enum": [ + "event:deny-emit" + ] + }, + { + "description": "event:deny-emit-to -> Denies the emit_to command without any pre-configured scope.", + "type": "string", + "enum": [ + "event:deny-emit-to" + ] + }, + { + "description": "event:deny-listen -> Denies the listen command without any pre-configured scope.", + "type": "string", + "enum": [ + "event:deny-listen" + ] + }, + { + "description": "event:deny-unlisten -> Denies the unlisten command without any pre-configured scope.", + "type": "string", + "enum": [ + "event:deny-unlisten" + ] + }, + { + "description": "image:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "image:default" + ] + }, + { + "description": "image:allow-from-bytes -> Enables the from_bytes command without any pre-configured scope.", + "type": "string", + "enum": [ + "image:allow-from-bytes" + ] + }, + { + "description": "image:allow-from-path -> Enables the from_path command without any pre-configured scope.", + "type": "string", + "enum": [ + "image:allow-from-path" + ] + }, + { + "description": "image:allow-new -> Enables the new command without any pre-configured scope.", + "type": "string", + "enum": [ + "image:allow-new" + ] + }, + { + "description": "image:allow-rgba -> Enables the rgba command without any pre-configured scope.", + "type": "string", + "enum": [ + "image:allow-rgba" + ] + }, + { + "description": "image:allow-size -> Enables the size command without any pre-configured scope.", + "type": "string", + "enum": [ + "image:allow-size" + ] + }, + { + "description": "image:deny-from-bytes -> Denies the from_bytes command without any pre-configured scope.", + "type": "string", + "enum": [ + "image:deny-from-bytes" + ] + }, + { + "description": "image:deny-from-path -> Denies the from_path command without any pre-configured scope.", + "type": "string", + "enum": [ + "image:deny-from-path" + ] + }, + { + "description": "image:deny-new -> Denies the new command without any pre-configured scope.", + "type": "string", + "enum": [ + "image:deny-new" + ] + }, + { + "description": "image:deny-rgba -> Denies the rgba command without any pre-configured scope.", + "type": "string", + "enum": [ + "image:deny-rgba" + ] + }, + { + "description": "image:deny-size -> Denies the size command without any pre-configured scope.", + "type": "string", + "enum": [ + "image:deny-size" + ] + }, + { + "description": "menu:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "menu:default" + ] + }, + { + "description": "menu:allow-append -> Enables the append command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-append" + ] + }, + { + "description": "menu:allow-create-default -> Enables the create_default command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-create-default" + ] + }, + { + "description": "menu:allow-get -> Enables the get command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-get" + ] + }, + { + "description": "menu:allow-insert -> Enables the insert command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-insert" + ] + }, + { + "description": "menu:allow-is-checked -> Enables the is_checked command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-is-checked" + ] + }, + { + "description": "menu:allow-is-enabled -> Enables the is_enabled command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-is-enabled" + ] + }, + { + "description": "menu:allow-items -> Enables the items command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-items" + ] + }, + { + "description": "menu:allow-new -> Enables the new command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-new" + ] + }, + { + "description": "menu:allow-popup -> Enables the popup command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-popup" + ] + }, + { + "description": "menu:allow-prepend -> Enables the prepend command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-prepend" + ] + }, + { + "description": "menu:allow-remove -> Enables the remove command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-remove" + ] + }, + { + "description": "menu:allow-remove-at -> Enables the remove_at command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-remove-at" + ] + }, + { + "description": "menu:allow-set-accelerator -> Enables the set_accelerator command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-set-accelerator" + ] + }, + { + "description": "menu:allow-set-as-app-menu -> Enables the set_as_app_menu command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-set-as-app-menu" + ] + }, + { + "description": "menu:allow-set-as-help-menu-for-nsapp -> Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-set-as-help-menu-for-nsapp" + ] + }, + { + "description": "menu:allow-set-as-window-menu -> Enables the set_as_window_menu command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-set-as-window-menu" + ] + }, + { + "description": "menu:allow-set-as-windows-menu-for-nsapp -> Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-set-as-windows-menu-for-nsapp" + ] + }, + { + "description": "menu:allow-set-checked -> Enables the set_checked command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-set-checked" + ] + }, + { + "description": "menu:allow-set-enabled -> Enables the set_enabled command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-set-enabled" + ] + }, + { + "description": "menu:allow-set-icon -> Enables the set_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-set-icon" + ] + }, + { + "description": "menu:allow-set-text -> Enables the set_text command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-set-text" + ] + }, + { + "description": "menu:allow-text -> Enables the text command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-text" + ] + }, + { + "description": "menu:deny-append -> Denies the append command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-append" + ] + }, + { + "description": "menu:deny-create-default -> Denies the create_default command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-create-default" + ] + }, + { + "description": "menu:deny-get -> Denies the get command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-get" + ] + }, + { + "description": "menu:deny-insert -> Denies the insert command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-insert" + ] + }, + { + "description": "menu:deny-is-checked -> Denies the is_checked command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-is-checked" + ] + }, + { + "description": "menu:deny-is-enabled -> Denies the is_enabled command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-is-enabled" + ] + }, + { + "description": "menu:deny-items -> Denies the items command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-items" + ] + }, + { + "description": "menu:deny-new -> Denies the new command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-new" + ] + }, + { + "description": "menu:deny-popup -> Denies the popup command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-popup" + ] + }, + { + "description": "menu:deny-prepend -> Denies the prepend command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-prepend" + ] + }, + { + "description": "menu:deny-remove -> Denies the remove command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-remove" + ] + }, + { + "description": "menu:deny-remove-at -> Denies the remove_at command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-remove-at" + ] + }, + { + "description": "menu:deny-set-accelerator -> Denies the set_accelerator command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-set-accelerator" + ] + }, + { + "description": "menu:deny-set-as-app-menu -> Denies the set_as_app_menu command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-set-as-app-menu" + ] + }, + { + "description": "menu:deny-set-as-help-menu-for-nsapp -> Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-set-as-help-menu-for-nsapp" + ] + }, + { + "description": "menu:deny-set-as-window-menu -> Denies the set_as_window_menu command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-set-as-window-menu" + ] + }, + { + "description": "menu:deny-set-as-windows-menu-for-nsapp -> Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-set-as-windows-menu-for-nsapp" + ] + }, + { + "description": "menu:deny-set-checked -> Denies the set_checked command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-set-checked" + ] + }, + { + "description": "menu:deny-set-enabled -> Denies the set_enabled command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-set-enabled" + ] + }, + { + "description": "menu:deny-set-icon -> Denies the set_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-set-icon" + ] + }, + { + "description": "menu:deny-set-text -> Denies the set_text command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-set-text" + ] + }, + { + "description": "menu:deny-text -> Denies the text command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-text" + ] + }, + { + "description": "path:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "path:default" + ] + }, + { + "description": "path:allow-basename -> Enables the basename command without any pre-configured scope.", + "type": "string", + "enum": [ + "path:allow-basename" + ] + }, + { + "description": "path:allow-dirname -> Enables the dirname command without any pre-configured scope.", + "type": "string", + "enum": [ + "path:allow-dirname" + ] + }, + { + "description": "path:allow-extname -> Enables the extname command without any pre-configured scope.", + "type": "string", + "enum": [ + "path:allow-extname" + ] + }, + { + "description": "path:allow-is-absolute -> Enables the is_absolute command without any pre-configured scope.", + "type": "string", + "enum": [ + "path:allow-is-absolute" + ] + }, + { + "description": "path:allow-join -> Enables the join command without any pre-configured scope.", + "type": "string", + "enum": [ + "path:allow-join" + ] + }, + { + "description": "path:allow-normalize -> Enables the normalize command without any pre-configured scope.", + "type": "string", + "enum": [ + "path:allow-normalize" + ] + }, + { + "description": "path:allow-resolve -> Enables the resolve command without any pre-configured scope.", + "type": "string", + "enum": [ + "path:allow-resolve" + ] + }, + { + "description": "path:allow-resolve-directory -> Enables the resolve_directory command without any pre-configured scope.", + "type": "string", + "enum": [ + "path:allow-resolve-directory" + ] + }, + { + "description": "path:deny-basename -> Denies the basename command without any pre-configured scope.", + "type": "string", + "enum": [ + "path:deny-basename" + ] + }, + { + "description": "path:deny-dirname -> Denies the dirname command without any pre-configured scope.", + "type": "string", + "enum": [ + "path:deny-dirname" + ] + }, + { + "description": "path:deny-extname -> Denies the extname command without any pre-configured scope.", + "type": "string", + "enum": [ + "path:deny-extname" + ] + }, + { + "description": "path:deny-is-absolute -> Denies the is_absolute command without any pre-configured scope.", + "type": "string", + "enum": [ + "path:deny-is-absolute" + ] + }, + { + "description": "path:deny-join -> Denies the join command without any pre-configured scope.", + "type": "string", + "enum": [ + "path:deny-join" + ] + }, + { + "description": "path:deny-normalize -> Denies the normalize command without any pre-configured scope.", + "type": "string", + "enum": [ + "path:deny-normalize" + ] + }, + { + "description": "path:deny-resolve -> Denies the resolve command without any pre-configured scope.", + "type": "string", + "enum": [ + "path:deny-resolve" + ] + }, + { + "description": "path:deny-resolve-directory -> Denies the resolve_directory command without any pre-configured scope.", + "type": "string", + "enum": [ + "path:deny-resolve-directory" + ] + }, + { + "description": "resources:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "resources:default" + ] + }, + { + "description": "resources:allow-close -> Enables the close command without any pre-configured scope.", + "type": "string", + "enum": [ + "resources:allow-close" + ] + }, + { + "description": "resources:deny-close -> Denies the close command without any pre-configured scope.", + "type": "string", + "enum": [ + "resources:deny-close" + ] + }, + { + "description": "tray:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "tray:default" + ] + }, + { + "description": "tray:allow-get-by-id -> Enables the get_by_id command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:allow-get-by-id" + ] + }, + { + "description": "tray:allow-new -> Enables the new command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:allow-new" + ] + }, + { + "description": "tray:allow-remove-by-id -> Enables the remove_by_id command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:allow-remove-by-id" + ] + }, + { + "description": "tray:allow-set-icon -> Enables the set_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:allow-set-icon" + ] + }, + { + "description": "tray:allow-set-icon-as-template -> Enables the set_icon_as_template command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:allow-set-icon-as-template" + ] + }, + { + "description": "tray:allow-set-menu -> Enables the set_menu command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:allow-set-menu" + ] + }, + { + "description": "tray:allow-set-show-menu-on-left-click -> Enables the set_show_menu_on_left_click command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:allow-set-show-menu-on-left-click" + ] + }, + { + "description": "tray:allow-set-temp-dir-path -> Enables the set_temp_dir_path command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:allow-set-temp-dir-path" + ] + }, + { + "description": "tray:allow-set-title -> Enables the set_title command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:allow-set-title" + ] + }, + { + "description": "tray:allow-set-tooltip -> Enables the set_tooltip command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:allow-set-tooltip" + ] + }, + { + "description": "tray:allow-set-visible -> Enables the set_visible command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:allow-set-visible" + ] + }, + { + "description": "tray:deny-get-by-id -> Denies the get_by_id command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:deny-get-by-id" + ] + }, + { + "description": "tray:deny-new -> Denies the new command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:deny-new" + ] + }, + { + "description": "tray:deny-remove-by-id -> Denies the remove_by_id command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:deny-remove-by-id" + ] + }, + { + "description": "tray:deny-set-icon -> Denies the set_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:deny-set-icon" + ] + }, + { + "description": "tray:deny-set-icon-as-template -> Denies the set_icon_as_template command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:deny-set-icon-as-template" + ] + }, + { + "description": "tray:deny-set-menu -> Denies the set_menu command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:deny-set-menu" + ] + }, + { + "description": "tray:deny-set-show-menu-on-left-click -> Denies the set_show_menu_on_left_click command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:deny-set-show-menu-on-left-click" + ] + }, + { + "description": "tray:deny-set-temp-dir-path -> Denies the set_temp_dir_path command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:deny-set-temp-dir-path" + ] + }, + { + "description": "tray:deny-set-title -> Denies the set_title command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:deny-set-title" + ] + }, + { + "description": "tray:deny-set-tooltip -> Denies the set_tooltip command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:deny-set-tooltip" + ] + }, + { + "description": "tray:deny-set-visible -> Denies the set_visible command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:deny-set-visible" + ] + }, + { + "description": "webview:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "webview:default" + ] + }, + { + "description": "webview:allow-create-webview -> Enables the create_webview command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:allow-create-webview" + ] + }, + { + "description": "webview:allow-create-webview-window -> Enables the create_webview_window command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:allow-create-webview-window" + ] + }, + { + "description": "webview:allow-internal-toggle-devtools -> Enables the internal_toggle_devtools command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:allow-internal-toggle-devtools" + ] + }, + { + "description": "webview:allow-print -> Enables the print command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:allow-print" + ] + }, + { + "description": "webview:allow-reparent -> Enables the reparent command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:allow-reparent" + ] + }, + { + "description": "webview:allow-set-webview-focus -> Enables the set_webview_focus command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:allow-set-webview-focus" + ] + }, + { + "description": "webview:allow-set-webview-position -> Enables the set_webview_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:allow-set-webview-position" + ] + }, + { + "description": "webview:allow-set-webview-size -> Enables the set_webview_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:allow-set-webview-size" + ] + }, + { + "description": "webview:allow-set-webview-zoom -> Enables the set_webview_zoom command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:allow-set-webview-zoom" + ] + }, + { + "description": "webview:allow-webview-close -> Enables the webview_close command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:allow-webview-close" + ] + }, + { + "description": "webview:allow-webview-position -> Enables the webview_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:allow-webview-position" + ] + }, + { + "description": "webview:allow-webview-size -> Enables the webview_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:allow-webview-size" + ] + }, + { + "description": "webview:deny-create-webview -> Denies the create_webview command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:deny-create-webview" + ] + }, + { + "description": "webview:deny-create-webview-window -> Denies the create_webview_window command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:deny-create-webview-window" + ] + }, + { + "description": "webview:deny-internal-toggle-devtools -> Denies the internal_toggle_devtools command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:deny-internal-toggle-devtools" + ] + }, + { + "description": "webview:deny-print -> Denies the print command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:deny-print" + ] + }, + { + "description": "webview:deny-reparent -> Denies the reparent command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:deny-reparent" + ] + }, + { + "description": "webview:deny-set-webview-focus -> Denies the set_webview_focus command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:deny-set-webview-focus" + ] + }, + { + "description": "webview:deny-set-webview-position -> Denies the set_webview_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:deny-set-webview-position" + ] + }, + { + "description": "webview:deny-set-webview-size -> Denies the set_webview_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:deny-set-webview-size" + ] + }, + { + "description": "webview:deny-set-webview-zoom -> Denies the set_webview_zoom command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:deny-set-webview-zoom" + ] + }, + { + "description": "webview:deny-webview-close -> Denies the webview_close command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:deny-webview-close" + ] + }, + { + "description": "webview:deny-webview-position -> Denies the webview_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:deny-webview-position" + ] + }, + { + "description": "webview:deny-webview-size -> Denies the webview_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:deny-webview-size" + ] + }, + { + "description": "window:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "window:default" + ] + }, + { + "description": "window:allow-available-monitors -> Enables the available_monitors command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-available-monitors" + ] + }, + { + "description": "window:allow-center -> Enables the center command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-center" + ] + }, + { + "description": "window:allow-close -> Enables the close command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-close" + ] + }, + { + "description": "window:allow-create -> Enables the create command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-create" + ] + }, + { + "description": "window:allow-current-monitor -> Enables the current_monitor command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-current-monitor" + ] + }, + { + "description": "window:allow-cursor-position -> Enables the cursor_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-cursor-position" + ] + }, + { + "description": "window:allow-destroy -> Enables the destroy command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-destroy" + ] + }, + { + "description": "window:allow-hide -> Enables the hide command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-hide" + ] + }, + { + "description": "window:allow-inner-position -> Enables the inner_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-inner-position" + ] + }, + { + "description": "window:allow-inner-size -> Enables the inner_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-inner-size" + ] + }, + { + "description": "window:allow-internal-toggle-maximize -> Enables the internal_toggle_maximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-internal-toggle-maximize" + ] + }, + { + "description": "window:allow-is-closable -> Enables the is_closable command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-is-closable" + ] + }, + { + "description": "window:allow-is-decorated -> Enables the is_decorated command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-is-decorated" + ] + }, + { + "description": "window:allow-is-focused -> Enables the is_focused command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-is-focused" + ] + }, + { + "description": "window:allow-is-fullscreen -> Enables the is_fullscreen command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-is-fullscreen" + ] + }, + { + "description": "window:allow-is-maximizable -> Enables the is_maximizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-is-maximizable" + ] + }, + { + "description": "window:allow-is-maximized -> Enables the is_maximized command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-is-maximized" + ] + }, + { + "description": "window:allow-is-minimizable -> Enables the is_minimizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-is-minimizable" + ] + }, + { + "description": "window:allow-is-minimized -> Enables the is_minimized command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-is-minimized" + ] + }, + { + "description": "window:allow-is-resizable -> Enables the is_resizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-is-resizable" + ] + }, + { + "description": "window:allow-is-visible -> Enables the is_visible command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-is-visible" + ] + }, + { + "description": "window:allow-maximize -> Enables the maximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-maximize" + ] + }, + { + "description": "window:allow-minimize -> Enables the minimize command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-minimize" + ] + }, + { + "description": "window:allow-outer-position -> Enables the outer_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-outer-position" + ] + }, + { + "description": "window:allow-outer-size -> Enables the outer_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-outer-size" + ] + }, + { + "description": "window:allow-primary-monitor -> Enables the primary_monitor command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-primary-monitor" + ] + }, + { + "description": "window:allow-request-user-attention -> Enables the request_user_attention command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-request-user-attention" + ] + }, + { + "description": "window:allow-scale-factor -> Enables the scale_factor command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-scale-factor" + ] + }, + { + "description": "window:allow-set-always-on-bottom -> Enables the set_always_on_bottom command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-always-on-bottom" + ] + }, + { + "description": "window:allow-set-always-on-top -> Enables the set_always_on_top command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-always-on-top" + ] + }, + { + "description": "window:allow-set-closable -> Enables the set_closable command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-closable" + ] + }, + { + "description": "window:allow-set-content-protected -> Enables the set_content_protected command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-content-protected" + ] + }, + { + "description": "window:allow-set-cursor-grab -> Enables the set_cursor_grab command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-cursor-grab" + ] + }, + { + "description": "window:allow-set-cursor-icon -> Enables the set_cursor_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-cursor-icon" + ] + }, + { + "description": "window:allow-set-cursor-position -> Enables the set_cursor_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-cursor-position" + ] + }, + { + "description": "window:allow-set-cursor-visible -> Enables the set_cursor_visible command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-cursor-visible" + ] + }, + { + "description": "window:allow-set-decorations -> Enables the set_decorations command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-decorations" + ] + }, + { + "description": "window:allow-set-effects -> Enables the set_effects command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-effects" + ] + }, + { + "description": "window:allow-set-focus -> Enables the set_focus command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-focus" + ] + }, + { + "description": "window:allow-set-fullscreen -> Enables the set_fullscreen command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-fullscreen" + ] + }, + { + "description": "window:allow-set-icon -> Enables the set_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-icon" + ] + }, + { + "description": "window:allow-set-ignore-cursor-events -> Enables the set_ignore_cursor_events command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-ignore-cursor-events" + ] + }, + { + "description": "window:allow-set-max-size -> Enables the set_max_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-max-size" + ] + }, + { + "description": "window:allow-set-maximizable -> Enables the set_maximizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-maximizable" + ] + }, + { + "description": "window:allow-set-min-size -> Enables the set_min_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-min-size" + ] + }, + { + "description": "window:allow-set-minimizable -> Enables the set_minimizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-minimizable" + ] + }, + { + "description": "window:allow-set-position -> Enables the set_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-position" + ] + }, + { + "description": "window:allow-set-progress-bar -> Enables the set_progress_bar command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-progress-bar" + ] + }, + { + "description": "window:allow-set-resizable -> Enables the set_resizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-resizable" + ] + }, + { + "description": "window:allow-set-shadow -> Enables the set_shadow command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-shadow" + ] + }, + { + "description": "window:allow-set-size -> Enables the set_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-size" + ] + }, + { + "description": "window:allow-set-skip-taskbar -> Enables the set_skip_taskbar command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-skip-taskbar" + ] + }, + { + "description": "window:allow-set-title -> Enables the set_title command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-title" + ] + }, + { + "description": "window:allow-set-visible-on-all-workspaces -> Enables the set_visible_on_all_workspaces command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-visible-on-all-workspaces" + ] + }, + { + "description": "window:allow-show -> Enables the show command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-show" + ] + }, + { + "description": "window:allow-start-dragging -> Enables the start_dragging command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-start-dragging" + ] + }, + { + "description": "window:allow-start-resize-dragging -> Enables the start_resize_dragging command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-start-resize-dragging" + ] + }, + { + "description": "window:allow-theme -> Enables the theme command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-theme" + ] + }, + { + "description": "window:allow-title -> Enables the title command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-title" + ] + }, + { + "description": "window:allow-toggle-maximize -> Enables the toggle_maximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-toggle-maximize" + ] + }, + { + "description": "window:allow-unmaximize -> Enables the unmaximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-unmaximize" + ] + }, + { + "description": "window:allow-unminimize -> Enables the unminimize command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-unminimize" + ] + }, + { + "description": "window:deny-available-monitors -> Denies the available_monitors command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-available-monitors" + ] + }, + { + "description": "window:deny-center -> Denies the center command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-center" + ] + }, + { + "description": "window:deny-close -> Denies the close command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-close" + ] + }, + { + "description": "window:deny-create -> Denies the create command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-create" + ] + }, + { + "description": "window:deny-current-monitor -> Denies the current_monitor command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-current-monitor" + ] + }, + { + "description": "window:deny-cursor-position -> Denies the cursor_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-cursor-position" + ] + }, + { + "description": "window:deny-destroy -> Denies the destroy command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-destroy" + ] + }, + { + "description": "window:deny-hide -> Denies the hide command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-hide" + ] + }, + { + "description": "window:deny-inner-position -> Denies the inner_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-inner-position" + ] + }, + { + "description": "window:deny-inner-size -> Denies the inner_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-inner-size" + ] + }, + { + "description": "window:deny-internal-toggle-maximize -> Denies the internal_toggle_maximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-internal-toggle-maximize" + ] + }, + { + "description": "window:deny-is-closable -> Denies the is_closable command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-is-closable" + ] + }, + { + "description": "window:deny-is-decorated -> Denies the is_decorated command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-is-decorated" + ] + }, + { + "description": "window:deny-is-focused -> Denies the is_focused command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-is-focused" + ] + }, + { + "description": "window:deny-is-fullscreen -> Denies the is_fullscreen command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-is-fullscreen" + ] + }, + { + "description": "window:deny-is-maximizable -> Denies the is_maximizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-is-maximizable" + ] + }, + { + "description": "window:deny-is-maximized -> Denies the is_maximized command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-is-maximized" + ] + }, + { + "description": "window:deny-is-minimizable -> Denies the is_minimizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-is-minimizable" + ] + }, + { + "description": "window:deny-is-minimized -> Denies the is_minimized command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-is-minimized" + ] + }, + { + "description": "window:deny-is-resizable -> Denies the is_resizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-is-resizable" + ] + }, + { + "description": "window:deny-is-visible -> Denies the is_visible command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-is-visible" + ] + }, + { + "description": "window:deny-maximize -> Denies the maximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-maximize" + ] + }, + { + "description": "window:deny-minimize -> Denies the minimize command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-minimize" + ] + }, + { + "description": "window:deny-outer-position -> Denies the outer_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-outer-position" + ] + }, + { + "description": "window:deny-outer-size -> Denies the outer_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-outer-size" + ] + }, + { + "description": "window:deny-primary-monitor -> Denies the primary_monitor command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-primary-monitor" + ] + }, + { + "description": "window:deny-request-user-attention -> Denies the request_user_attention command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-request-user-attention" + ] + }, + { + "description": "window:deny-scale-factor -> Denies the scale_factor command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-scale-factor" + ] + }, + { + "description": "window:deny-set-always-on-bottom -> Denies the set_always_on_bottom command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-always-on-bottom" + ] + }, + { + "description": "window:deny-set-always-on-top -> Denies the set_always_on_top command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-always-on-top" + ] + }, + { + "description": "window:deny-set-closable -> Denies the set_closable command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-closable" + ] + }, + { + "description": "window:deny-set-content-protected -> Denies the set_content_protected command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-content-protected" + ] + }, + { + "description": "window:deny-set-cursor-grab -> Denies the set_cursor_grab command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-cursor-grab" + ] + }, + { + "description": "window:deny-set-cursor-icon -> Denies the set_cursor_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-cursor-icon" + ] + }, + { + "description": "window:deny-set-cursor-position -> Denies the set_cursor_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-cursor-position" + ] + }, + { + "description": "window:deny-set-cursor-visible -> Denies the set_cursor_visible command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-cursor-visible" + ] + }, + { + "description": "window:deny-set-decorations -> Denies the set_decorations command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-decorations" + ] + }, + { + "description": "window:deny-set-effects -> Denies the set_effects command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-effects" + ] + }, + { + "description": "window:deny-set-focus -> Denies the set_focus command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-focus" + ] + }, + { + "description": "window:deny-set-fullscreen -> Denies the set_fullscreen command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-fullscreen" + ] + }, + { + "description": "window:deny-set-icon -> Denies the set_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-icon" + ] + }, + { + "description": "window:deny-set-ignore-cursor-events -> Denies the set_ignore_cursor_events command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-ignore-cursor-events" + ] + }, + { + "description": "window:deny-set-max-size -> Denies the set_max_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-max-size" + ] + }, + { + "description": "window:deny-set-maximizable -> Denies the set_maximizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-maximizable" + ] + }, + { + "description": "window:deny-set-min-size -> Denies the set_min_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-min-size" + ] + }, + { + "description": "window:deny-set-minimizable -> Denies the set_minimizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-minimizable" + ] + }, + { + "description": "window:deny-set-position -> Denies the set_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-position" + ] + }, + { + "description": "window:deny-set-progress-bar -> Denies the set_progress_bar command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-progress-bar" + ] + }, + { + "description": "window:deny-set-resizable -> Denies the set_resizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-resizable" + ] + }, + { + "description": "window:deny-set-shadow -> Denies the set_shadow command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-shadow" + ] + }, + { + "description": "window:deny-set-size -> Denies the set_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-size" + ] + }, + { + "description": "window:deny-set-skip-taskbar -> Denies the set_skip_taskbar command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-skip-taskbar" + ] + }, + { + "description": "window:deny-set-title -> Denies the set_title command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-title" + ] + }, + { + "description": "window:deny-set-visible-on-all-workspaces -> Denies the set_visible_on_all_workspaces command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-visible-on-all-workspaces" + ] + }, + { + "description": "window:deny-show -> Denies the show command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-show" + ] + }, + { + "description": "window:deny-start-dragging -> Denies the start_dragging command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-start-dragging" + ] + }, + { + "description": "window:deny-start-resize-dragging -> Denies the start_resize_dragging command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-start-resize-dragging" + ] + }, + { + "description": "window:deny-theme -> Denies the theme command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-theme" + ] + }, + { + "description": "window:deny-title -> Denies the title command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-title" + ] + }, + { + "description": "window:deny-toggle-maximize -> Denies the toggle_maximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-toggle-maximize" + ] + }, + { + "description": "window:deny-unmaximize -> Denies the unmaximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-unmaximize" + ] + }, + { + "description": "window:deny-unminimize -> Denies the unminimize command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-unminimize" + ] + } + ] + }, + "Value": { + "description": "All supported ACL values.", + "anyOf": [ + { + "description": "Represents a null JSON value.", + "type": "null" + }, + { + "description": "Represents a [`bool`].", + "type": "boolean" + }, + { + "description": "Represents a valid ACL [`Number`].", + "allOf": [ + { + "$ref": "#/definitions/Number" + } + ] + }, + { + "description": "Represents a [`String`].", + "type": "string" + }, + { + "description": "Represents a list of other [`Value`]s.", + "type": "array", + "items": { + "$ref": "#/definitions/Value" + } + }, + { + "description": "Represents a map of [`String`] keys to [`Value`]s.", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Value" + } + } + ] + }, + "Number": { + "description": "A valid ACL number.", + "anyOf": [ + { + "description": "Represents an [`i64`].", + "type": "integer", + "format": "int64" + }, + { + "description": "Represents a [`f64`].", + "type": "number", + "format": "double" + } + ] + }, + "Target": { + "description": "Platform target.", + "oneOf": [ + { + "description": "MacOS.", + "type": "string", + "enum": [ + "macOS" + ] + }, + { + "description": "Windows.", + "type": "string", + "enum": [ + "windows" + ] + }, + { + "description": "Linux.", + "type": "string", + "enum": [ + "linux" + ] + }, + { + "description": "Android.", + "type": "string", + "enum": [ + "android" + ] + }, + { + "description": "iOS.", + "type": "string", + "enum": [ + "iOS" + ] + } + ] + } + } +} \ No newline at end of file diff --git a/external/prisma-client-rust/examples/tauri/src-tauri/gen/schemas/macOS-schema.json b/external/prisma-client-rust/examples/tauri/src-tauri/gen/schemas/macOS-schema.json new file mode 100644 index 0000000..6eca9fd --- /dev/null +++ b/external/prisma-client-rust/examples/tauri/src-tauri/gen/schemas/macOS-schema.json @@ -0,0 +1,2153 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "CapabilityFile", + "description": "Capability formats accepted in a capability file.", + "anyOf": [ + { + "description": "A single capability.", + "allOf": [ + { + "$ref": "#/definitions/Capability" + } + ] + }, + { + "description": "A list of capabilities.", + "type": "array", + "items": { + "$ref": "#/definitions/Capability" + } + }, + { + "description": "A list of capabilities.", + "type": "object", + "required": [ + "capabilities" + ], + "properties": { + "capabilities": { + "description": "The list of capabilities.", + "type": "array", + "items": { + "$ref": "#/definitions/Capability" + } + } + } + } + ], + "definitions": { + "Capability": { + "description": "a grouping and boundary mechanism developers can use to separate windows or plugins functionality from each other at runtime.\n\nIf a window is not matching any capability then it has no access to the IPC layer at all.\n\nThis can be done to create trust groups and reduce impact of vulnerabilities in certain plugins or windows. Windows can be added to a capability by exact name or glob patterns like *, admin-* or main-window.", + "type": "object", + "required": [ + "identifier", + "permissions" + ], + "properties": { + "identifier": { + "description": "Identifier of the capability.", + "type": "string" + }, + "description": { + "description": "Description of the capability.", + "default": "", + "type": "string" + }, + "remote": { + "description": "Configure remote URLs that can use the capability permissions.", + "anyOf": [ + { + "$ref": "#/definitions/CapabilityRemote" + }, + { + "type": "null" + } + ] + }, + "local": { + "description": "Whether this capability is enabled for local app URLs or not. Defaults to `true`.", + "default": true, + "type": "boolean" + }, + "windows": { + "description": "List of windows that uses this capability. Can be a glob pattern.\n\nOn multiwebview windows, prefer [`Self::webviews`] for a fine grained access control.", + "type": "array", + "items": { + "type": "string" + } + }, + "webviews": { + "description": "List of webviews that uses this capability. Can be a glob pattern.\n\nThis is only required when using on multiwebview contexts, by default all child webviews of a window that matches [`Self::windows`] are linked.", + "type": "array", + "items": { + "type": "string" + } + }, + "permissions": { + "description": "List of permissions attached to this capability. Must include the plugin name as prefix in the form of `${plugin-name}:${permission-name}`.", + "type": "array", + "items": { + "$ref": "#/definitions/PermissionEntry" + } + }, + "platforms": { + "description": "Target platforms this capability applies. By default all platforms are affected by this capability.", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Target" + } + } + } + }, + "CapabilityRemote": { + "description": "Configuration for remote URLs that are associated with the capability.", + "type": "object", + "required": [ + "urls" + ], + "properties": { + "urls": { + "description": "Remote domains this capability refers to using the [URLPattern standard](https://urlpattern.spec.whatwg.org/).\n\n# Examples\n\n- \"https://*.mydomain.dev\": allows subdomains of mydomain.dev - \"https://mydomain.dev/api/*\": allows any subpath of mydomain.dev/api", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "PermissionEntry": { + "description": "An entry for a permission value in a [`Capability`] can be either a raw permission [`Identifier`] or an object that references a permission and extends its scope.", + "anyOf": [ + { + "description": "Reference a permission or permission set by identifier.", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + }, + { + "description": "Reference a permission or permission set by identifier and extends its scope.", + "type": "object", + "required": [ + "identifier" + ], + "properties": { + "identifier": { + "description": "Identifier of the permission or permission set.", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + }, + "allow": { + "description": "Data that defines what is allowed by the scope.", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Value" + } + }, + "deny": { + "description": "Data that defines what is denied by the scope.", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Value" + } + } + } + } + ] + }, + "Identifier": { + "oneOf": [ + { + "description": "app:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "app:default" + ] + }, + { + "description": "app:allow-app-hide -> Enables the app_hide command without any pre-configured scope.", + "type": "string", + "enum": [ + "app:allow-app-hide" + ] + }, + { + "description": "app:allow-app-show -> Enables the app_show command without any pre-configured scope.", + "type": "string", + "enum": [ + "app:allow-app-show" + ] + }, + { + "description": "app:allow-name -> Enables the name command without any pre-configured scope.", + "type": "string", + "enum": [ + "app:allow-name" + ] + }, + { + "description": "app:allow-tauri-version -> Enables the tauri_version command without any pre-configured scope.", + "type": "string", + "enum": [ + "app:allow-tauri-version" + ] + }, + { + "description": "app:allow-version -> Enables the version command without any pre-configured scope.", + "type": "string", + "enum": [ + "app:allow-version" + ] + }, + { + "description": "app:deny-app-hide -> Denies the app_hide command without any pre-configured scope.", + "type": "string", + "enum": [ + "app:deny-app-hide" + ] + }, + { + "description": "app:deny-app-show -> Denies the app_show command without any pre-configured scope.", + "type": "string", + "enum": [ + "app:deny-app-show" + ] + }, + { + "description": "app:deny-name -> Denies the name command without any pre-configured scope.", + "type": "string", + "enum": [ + "app:deny-name" + ] + }, + { + "description": "app:deny-tauri-version -> Denies the tauri_version command without any pre-configured scope.", + "type": "string", + "enum": [ + "app:deny-tauri-version" + ] + }, + { + "description": "app:deny-version -> Denies the version command without any pre-configured scope.", + "type": "string", + "enum": [ + "app:deny-version" + ] + }, + { + "description": "event:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "event:default" + ] + }, + { + "description": "event:allow-emit -> Enables the emit command without any pre-configured scope.", + "type": "string", + "enum": [ + "event:allow-emit" + ] + }, + { + "description": "event:allow-emit-to -> Enables the emit_to command without any pre-configured scope.", + "type": "string", + "enum": [ + "event:allow-emit-to" + ] + }, + { + "description": "event:allow-listen -> Enables the listen command without any pre-configured scope.", + "type": "string", + "enum": [ + "event:allow-listen" + ] + }, + { + "description": "event:allow-unlisten -> Enables the unlisten command without any pre-configured scope.", + "type": "string", + "enum": [ + "event:allow-unlisten" + ] + }, + { + "description": "event:deny-emit -> Denies the emit command without any pre-configured scope.", + "type": "string", + "enum": [ + "event:deny-emit" + ] + }, + { + "description": "event:deny-emit-to -> Denies the emit_to command without any pre-configured scope.", + "type": "string", + "enum": [ + "event:deny-emit-to" + ] + }, + { + "description": "event:deny-listen -> Denies the listen command without any pre-configured scope.", + "type": "string", + "enum": [ + "event:deny-listen" + ] + }, + { + "description": "event:deny-unlisten -> Denies the unlisten command without any pre-configured scope.", + "type": "string", + "enum": [ + "event:deny-unlisten" + ] + }, + { + "description": "image:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "image:default" + ] + }, + { + "description": "image:allow-from-bytes -> Enables the from_bytes command without any pre-configured scope.", + "type": "string", + "enum": [ + "image:allow-from-bytes" + ] + }, + { + "description": "image:allow-from-path -> Enables the from_path command without any pre-configured scope.", + "type": "string", + "enum": [ + "image:allow-from-path" + ] + }, + { + "description": "image:allow-new -> Enables the new command without any pre-configured scope.", + "type": "string", + "enum": [ + "image:allow-new" + ] + }, + { + "description": "image:allow-rgba -> Enables the rgba command without any pre-configured scope.", + "type": "string", + "enum": [ + "image:allow-rgba" + ] + }, + { + "description": "image:allow-size -> Enables the size command without any pre-configured scope.", + "type": "string", + "enum": [ + "image:allow-size" + ] + }, + { + "description": "image:deny-from-bytes -> Denies the from_bytes command without any pre-configured scope.", + "type": "string", + "enum": [ + "image:deny-from-bytes" + ] + }, + { + "description": "image:deny-from-path -> Denies the from_path command without any pre-configured scope.", + "type": "string", + "enum": [ + "image:deny-from-path" + ] + }, + { + "description": "image:deny-new -> Denies the new command without any pre-configured scope.", + "type": "string", + "enum": [ + "image:deny-new" + ] + }, + { + "description": "image:deny-rgba -> Denies the rgba command without any pre-configured scope.", + "type": "string", + "enum": [ + "image:deny-rgba" + ] + }, + { + "description": "image:deny-size -> Denies the size command without any pre-configured scope.", + "type": "string", + "enum": [ + "image:deny-size" + ] + }, + { + "description": "menu:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "menu:default" + ] + }, + { + "description": "menu:allow-append -> Enables the append command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-append" + ] + }, + { + "description": "menu:allow-create-default -> Enables the create_default command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-create-default" + ] + }, + { + "description": "menu:allow-get -> Enables the get command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-get" + ] + }, + { + "description": "menu:allow-insert -> Enables the insert command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-insert" + ] + }, + { + "description": "menu:allow-is-checked -> Enables the is_checked command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-is-checked" + ] + }, + { + "description": "menu:allow-is-enabled -> Enables the is_enabled command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-is-enabled" + ] + }, + { + "description": "menu:allow-items -> Enables the items command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-items" + ] + }, + { + "description": "menu:allow-new -> Enables the new command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-new" + ] + }, + { + "description": "menu:allow-popup -> Enables the popup command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-popup" + ] + }, + { + "description": "menu:allow-prepend -> Enables the prepend command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-prepend" + ] + }, + { + "description": "menu:allow-remove -> Enables the remove command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-remove" + ] + }, + { + "description": "menu:allow-remove-at -> Enables the remove_at command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-remove-at" + ] + }, + { + "description": "menu:allow-set-accelerator -> Enables the set_accelerator command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-set-accelerator" + ] + }, + { + "description": "menu:allow-set-as-app-menu -> Enables the set_as_app_menu command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-set-as-app-menu" + ] + }, + { + "description": "menu:allow-set-as-help-menu-for-nsapp -> Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-set-as-help-menu-for-nsapp" + ] + }, + { + "description": "menu:allow-set-as-window-menu -> Enables the set_as_window_menu command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-set-as-window-menu" + ] + }, + { + "description": "menu:allow-set-as-windows-menu-for-nsapp -> Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-set-as-windows-menu-for-nsapp" + ] + }, + { + "description": "menu:allow-set-checked -> Enables the set_checked command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-set-checked" + ] + }, + { + "description": "menu:allow-set-enabled -> Enables the set_enabled command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-set-enabled" + ] + }, + { + "description": "menu:allow-set-icon -> Enables the set_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-set-icon" + ] + }, + { + "description": "menu:allow-set-text -> Enables the set_text command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-set-text" + ] + }, + { + "description": "menu:allow-text -> Enables the text command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:allow-text" + ] + }, + { + "description": "menu:deny-append -> Denies the append command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-append" + ] + }, + { + "description": "menu:deny-create-default -> Denies the create_default command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-create-default" + ] + }, + { + "description": "menu:deny-get -> Denies the get command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-get" + ] + }, + { + "description": "menu:deny-insert -> Denies the insert command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-insert" + ] + }, + { + "description": "menu:deny-is-checked -> Denies the is_checked command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-is-checked" + ] + }, + { + "description": "menu:deny-is-enabled -> Denies the is_enabled command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-is-enabled" + ] + }, + { + "description": "menu:deny-items -> Denies the items command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-items" + ] + }, + { + "description": "menu:deny-new -> Denies the new command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-new" + ] + }, + { + "description": "menu:deny-popup -> Denies the popup command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-popup" + ] + }, + { + "description": "menu:deny-prepend -> Denies the prepend command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-prepend" + ] + }, + { + "description": "menu:deny-remove -> Denies the remove command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-remove" + ] + }, + { + "description": "menu:deny-remove-at -> Denies the remove_at command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-remove-at" + ] + }, + { + "description": "menu:deny-set-accelerator -> Denies the set_accelerator command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-set-accelerator" + ] + }, + { + "description": "menu:deny-set-as-app-menu -> Denies the set_as_app_menu command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-set-as-app-menu" + ] + }, + { + "description": "menu:deny-set-as-help-menu-for-nsapp -> Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-set-as-help-menu-for-nsapp" + ] + }, + { + "description": "menu:deny-set-as-window-menu -> Denies the set_as_window_menu command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-set-as-window-menu" + ] + }, + { + "description": "menu:deny-set-as-windows-menu-for-nsapp -> Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-set-as-windows-menu-for-nsapp" + ] + }, + { + "description": "menu:deny-set-checked -> Denies the set_checked command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-set-checked" + ] + }, + { + "description": "menu:deny-set-enabled -> Denies the set_enabled command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-set-enabled" + ] + }, + { + "description": "menu:deny-set-icon -> Denies the set_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-set-icon" + ] + }, + { + "description": "menu:deny-set-text -> Denies the set_text command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-set-text" + ] + }, + { + "description": "menu:deny-text -> Denies the text command without any pre-configured scope.", + "type": "string", + "enum": [ + "menu:deny-text" + ] + }, + { + "description": "path:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "path:default" + ] + }, + { + "description": "path:allow-basename -> Enables the basename command without any pre-configured scope.", + "type": "string", + "enum": [ + "path:allow-basename" + ] + }, + { + "description": "path:allow-dirname -> Enables the dirname command without any pre-configured scope.", + "type": "string", + "enum": [ + "path:allow-dirname" + ] + }, + { + "description": "path:allow-extname -> Enables the extname command without any pre-configured scope.", + "type": "string", + "enum": [ + "path:allow-extname" + ] + }, + { + "description": "path:allow-is-absolute -> Enables the is_absolute command without any pre-configured scope.", + "type": "string", + "enum": [ + "path:allow-is-absolute" + ] + }, + { + "description": "path:allow-join -> Enables the join command without any pre-configured scope.", + "type": "string", + "enum": [ + "path:allow-join" + ] + }, + { + "description": "path:allow-normalize -> Enables the normalize command without any pre-configured scope.", + "type": "string", + "enum": [ + "path:allow-normalize" + ] + }, + { + "description": "path:allow-resolve -> Enables the resolve command without any pre-configured scope.", + "type": "string", + "enum": [ + "path:allow-resolve" + ] + }, + { + "description": "path:allow-resolve-directory -> Enables the resolve_directory command without any pre-configured scope.", + "type": "string", + "enum": [ + "path:allow-resolve-directory" + ] + }, + { + "description": "path:deny-basename -> Denies the basename command without any pre-configured scope.", + "type": "string", + "enum": [ + "path:deny-basename" + ] + }, + { + "description": "path:deny-dirname -> Denies the dirname command without any pre-configured scope.", + "type": "string", + "enum": [ + "path:deny-dirname" + ] + }, + { + "description": "path:deny-extname -> Denies the extname command without any pre-configured scope.", + "type": "string", + "enum": [ + "path:deny-extname" + ] + }, + { + "description": "path:deny-is-absolute -> Denies the is_absolute command without any pre-configured scope.", + "type": "string", + "enum": [ + "path:deny-is-absolute" + ] + }, + { + "description": "path:deny-join -> Denies the join command without any pre-configured scope.", + "type": "string", + "enum": [ + "path:deny-join" + ] + }, + { + "description": "path:deny-normalize -> Denies the normalize command without any pre-configured scope.", + "type": "string", + "enum": [ + "path:deny-normalize" + ] + }, + { + "description": "path:deny-resolve -> Denies the resolve command without any pre-configured scope.", + "type": "string", + "enum": [ + "path:deny-resolve" + ] + }, + { + "description": "path:deny-resolve-directory -> Denies the resolve_directory command without any pre-configured scope.", + "type": "string", + "enum": [ + "path:deny-resolve-directory" + ] + }, + { + "description": "resources:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "resources:default" + ] + }, + { + "description": "resources:allow-close -> Enables the close command without any pre-configured scope.", + "type": "string", + "enum": [ + "resources:allow-close" + ] + }, + { + "description": "resources:deny-close -> Denies the close command without any pre-configured scope.", + "type": "string", + "enum": [ + "resources:deny-close" + ] + }, + { + "description": "tray:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "tray:default" + ] + }, + { + "description": "tray:allow-get-by-id -> Enables the get_by_id command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:allow-get-by-id" + ] + }, + { + "description": "tray:allow-new -> Enables the new command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:allow-new" + ] + }, + { + "description": "tray:allow-remove-by-id -> Enables the remove_by_id command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:allow-remove-by-id" + ] + }, + { + "description": "tray:allow-set-icon -> Enables the set_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:allow-set-icon" + ] + }, + { + "description": "tray:allow-set-icon-as-template -> Enables the set_icon_as_template command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:allow-set-icon-as-template" + ] + }, + { + "description": "tray:allow-set-menu -> Enables the set_menu command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:allow-set-menu" + ] + }, + { + "description": "tray:allow-set-show-menu-on-left-click -> Enables the set_show_menu_on_left_click command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:allow-set-show-menu-on-left-click" + ] + }, + { + "description": "tray:allow-set-temp-dir-path -> Enables the set_temp_dir_path command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:allow-set-temp-dir-path" + ] + }, + { + "description": "tray:allow-set-title -> Enables the set_title command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:allow-set-title" + ] + }, + { + "description": "tray:allow-set-tooltip -> Enables the set_tooltip command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:allow-set-tooltip" + ] + }, + { + "description": "tray:allow-set-visible -> Enables the set_visible command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:allow-set-visible" + ] + }, + { + "description": "tray:deny-get-by-id -> Denies the get_by_id command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:deny-get-by-id" + ] + }, + { + "description": "tray:deny-new -> Denies the new command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:deny-new" + ] + }, + { + "description": "tray:deny-remove-by-id -> Denies the remove_by_id command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:deny-remove-by-id" + ] + }, + { + "description": "tray:deny-set-icon -> Denies the set_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:deny-set-icon" + ] + }, + { + "description": "tray:deny-set-icon-as-template -> Denies the set_icon_as_template command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:deny-set-icon-as-template" + ] + }, + { + "description": "tray:deny-set-menu -> Denies the set_menu command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:deny-set-menu" + ] + }, + { + "description": "tray:deny-set-show-menu-on-left-click -> Denies the set_show_menu_on_left_click command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:deny-set-show-menu-on-left-click" + ] + }, + { + "description": "tray:deny-set-temp-dir-path -> Denies the set_temp_dir_path command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:deny-set-temp-dir-path" + ] + }, + { + "description": "tray:deny-set-title -> Denies the set_title command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:deny-set-title" + ] + }, + { + "description": "tray:deny-set-tooltip -> Denies the set_tooltip command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:deny-set-tooltip" + ] + }, + { + "description": "tray:deny-set-visible -> Denies the set_visible command without any pre-configured scope.", + "type": "string", + "enum": [ + "tray:deny-set-visible" + ] + }, + { + "description": "webview:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "webview:default" + ] + }, + { + "description": "webview:allow-create-webview -> Enables the create_webview command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:allow-create-webview" + ] + }, + { + "description": "webview:allow-create-webview-window -> Enables the create_webview_window command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:allow-create-webview-window" + ] + }, + { + "description": "webview:allow-internal-toggle-devtools -> Enables the internal_toggle_devtools command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:allow-internal-toggle-devtools" + ] + }, + { + "description": "webview:allow-print -> Enables the print command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:allow-print" + ] + }, + { + "description": "webview:allow-reparent -> Enables the reparent command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:allow-reparent" + ] + }, + { + "description": "webview:allow-set-webview-focus -> Enables the set_webview_focus command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:allow-set-webview-focus" + ] + }, + { + "description": "webview:allow-set-webview-position -> Enables the set_webview_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:allow-set-webview-position" + ] + }, + { + "description": "webview:allow-set-webview-size -> Enables the set_webview_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:allow-set-webview-size" + ] + }, + { + "description": "webview:allow-set-webview-zoom -> Enables the set_webview_zoom command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:allow-set-webview-zoom" + ] + }, + { + "description": "webview:allow-webview-close -> Enables the webview_close command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:allow-webview-close" + ] + }, + { + "description": "webview:allow-webview-position -> Enables the webview_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:allow-webview-position" + ] + }, + { + "description": "webview:allow-webview-size -> Enables the webview_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:allow-webview-size" + ] + }, + { + "description": "webview:deny-create-webview -> Denies the create_webview command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:deny-create-webview" + ] + }, + { + "description": "webview:deny-create-webview-window -> Denies the create_webview_window command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:deny-create-webview-window" + ] + }, + { + "description": "webview:deny-internal-toggle-devtools -> Denies the internal_toggle_devtools command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:deny-internal-toggle-devtools" + ] + }, + { + "description": "webview:deny-print -> Denies the print command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:deny-print" + ] + }, + { + "description": "webview:deny-reparent -> Denies the reparent command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:deny-reparent" + ] + }, + { + "description": "webview:deny-set-webview-focus -> Denies the set_webview_focus command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:deny-set-webview-focus" + ] + }, + { + "description": "webview:deny-set-webview-position -> Denies the set_webview_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:deny-set-webview-position" + ] + }, + { + "description": "webview:deny-set-webview-size -> Denies the set_webview_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:deny-set-webview-size" + ] + }, + { + "description": "webview:deny-set-webview-zoom -> Denies the set_webview_zoom command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:deny-set-webview-zoom" + ] + }, + { + "description": "webview:deny-webview-close -> Denies the webview_close command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:deny-webview-close" + ] + }, + { + "description": "webview:deny-webview-position -> Denies the webview_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:deny-webview-position" + ] + }, + { + "description": "webview:deny-webview-size -> Denies the webview_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "webview:deny-webview-size" + ] + }, + { + "description": "window:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "window:default" + ] + }, + { + "description": "window:allow-available-monitors -> Enables the available_monitors command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-available-monitors" + ] + }, + { + "description": "window:allow-center -> Enables the center command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-center" + ] + }, + { + "description": "window:allow-close -> Enables the close command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-close" + ] + }, + { + "description": "window:allow-create -> Enables the create command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-create" + ] + }, + { + "description": "window:allow-current-monitor -> Enables the current_monitor command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-current-monitor" + ] + }, + { + "description": "window:allow-cursor-position -> Enables the cursor_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-cursor-position" + ] + }, + { + "description": "window:allow-destroy -> Enables the destroy command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-destroy" + ] + }, + { + "description": "window:allow-hide -> Enables the hide command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-hide" + ] + }, + { + "description": "window:allow-inner-position -> Enables the inner_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-inner-position" + ] + }, + { + "description": "window:allow-inner-size -> Enables the inner_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-inner-size" + ] + }, + { + "description": "window:allow-internal-toggle-maximize -> Enables the internal_toggle_maximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-internal-toggle-maximize" + ] + }, + { + "description": "window:allow-is-closable -> Enables the is_closable command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-is-closable" + ] + }, + { + "description": "window:allow-is-decorated -> Enables the is_decorated command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-is-decorated" + ] + }, + { + "description": "window:allow-is-focused -> Enables the is_focused command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-is-focused" + ] + }, + { + "description": "window:allow-is-fullscreen -> Enables the is_fullscreen command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-is-fullscreen" + ] + }, + { + "description": "window:allow-is-maximizable -> Enables the is_maximizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-is-maximizable" + ] + }, + { + "description": "window:allow-is-maximized -> Enables the is_maximized command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-is-maximized" + ] + }, + { + "description": "window:allow-is-minimizable -> Enables the is_minimizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-is-minimizable" + ] + }, + { + "description": "window:allow-is-minimized -> Enables the is_minimized command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-is-minimized" + ] + }, + { + "description": "window:allow-is-resizable -> Enables the is_resizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-is-resizable" + ] + }, + { + "description": "window:allow-is-visible -> Enables the is_visible command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-is-visible" + ] + }, + { + "description": "window:allow-maximize -> Enables the maximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-maximize" + ] + }, + { + "description": "window:allow-minimize -> Enables the minimize command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-minimize" + ] + }, + { + "description": "window:allow-outer-position -> Enables the outer_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-outer-position" + ] + }, + { + "description": "window:allow-outer-size -> Enables the outer_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-outer-size" + ] + }, + { + "description": "window:allow-primary-monitor -> Enables the primary_monitor command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-primary-monitor" + ] + }, + { + "description": "window:allow-request-user-attention -> Enables the request_user_attention command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-request-user-attention" + ] + }, + { + "description": "window:allow-scale-factor -> Enables the scale_factor command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-scale-factor" + ] + }, + { + "description": "window:allow-set-always-on-bottom -> Enables the set_always_on_bottom command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-always-on-bottom" + ] + }, + { + "description": "window:allow-set-always-on-top -> Enables the set_always_on_top command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-always-on-top" + ] + }, + { + "description": "window:allow-set-closable -> Enables the set_closable command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-closable" + ] + }, + { + "description": "window:allow-set-content-protected -> Enables the set_content_protected command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-content-protected" + ] + }, + { + "description": "window:allow-set-cursor-grab -> Enables the set_cursor_grab command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-cursor-grab" + ] + }, + { + "description": "window:allow-set-cursor-icon -> Enables the set_cursor_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-cursor-icon" + ] + }, + { + "description": "window:allow-set-cursor-position -> Enables the set_cursor_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-cursor-position" + ] + }, + { + "description": "window:allow-set-cursor-visible -> Enables the set_cursor_visible command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-cursor-visible" + ] + }, + { + "description": "window:allow-set-decorations -> Enables the set_decorations command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-decorations" + ] + }, + { + "description": "window:allow-set-effects -> Enables the set_effects command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-effects" + ] + }, + { + "description": "window:allow-set-focus -> Enables the set_focus command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-focus" + ] + }, + { + "description": "window:allow-set-fullscreen -> Enables the set_fullscreen command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-fullscreen" + ] + }, + { + "description": "window:allow-set-icon -> Enables the set_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-icon" + ] + }, + { + "description": "window:allow-set-ignore-cursor-events -> Enables the set_ignore_cursor_events command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-ignore-cursor-events" + ] + }, + { + "description": "window:allow-set-max-size -> Enables the set_max_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-max-size" + ] + }, + { + "description": "window:allow-set-maximizable -> Enables the set_maximizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-maximizable" + ] + }, + { + "description": "window:allow-set-min-size -> Enables the set_min_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-min-size" + ] + }, + { + "description": "window:allow-set-minimizable -> Enables the set_minimizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-minimizable" + ] + }, + { + "description": "window:allow-set-position -> Enables the set_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-position" + ] + }, + { + "description": "window:allow-set-progress-bar -> Enables the set_progress_bar command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-progress-bar" + ] + }, + { + "description": "window:allow-set-resizable -> Enables the set_resizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-resizable" + ] + }, + { + "description": "window:allow-set-shadow -> Enables the set_shadow command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-shadow" + ] + }, + { + "description": "window:allow-set-size -> Enables the set_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-size" + ] + }, + { + "description": "window:allow-set-skip-taskbar -> Enables the set_skip_taskbar command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-skip-taskbar" + ] + }, + { + "description": "window:allow-set-title -> Enables the set_title command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-title" + ] + }, + { + "description": "window:allow-set-visible-on-all-workspaces -> Enables the set_visible_on_all_workspaces command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-set-visible-on-all-workspaces" + ] + }, + { + "description": "window:allow-show -> Enables the show command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-show" + ] + }, + { + "description": "window:allow-start-dragging -> Enables the start_dragging command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-start-dragging" + ] + }, + { + "description": "window:allow-start-resize-dragging -> Enables the start_resize_dragging command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-start-resize-dragging" + ] + }, + { + "description": "window:allow-theme -> Enables the theme command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-theme" + ] + }, + { + "description": "window:allow-title -> Enables the title command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-title" + ] + }, + { + "description": "window:allow-toggle-maximize -> Enables the toggle_maximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-toggle-maximize" + ] + }, + { + "description": "window:allow-unmaximize -> Enables the unmaximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-unmaximize" + ] + }, + { + "description": "window:allow-unminimize -> Enables the unminimize command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:allow-unminimize" + ] + }, + { + "description": "window:deny-available-monitors -> Denies the available_monitors command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-available-monitors" + ] + }, + { + "description": "window:deny-center -> Denies the center command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-center" + ] + }, + { + "description": "window:deny-close -> Denies the close command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-close" + ] + }, + { + "description": "window:deny-create -> Denies the create command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-create" + ] + }, + { + "description": "window:deny-current-monitor -> Denies the current_monitor command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-current-monitor" + ] + }, + { + "description": "window:deny-cursor-position -> Denies the cursor_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-cursor-position" + ] + }, + { + "description": "window:deny-destroy -> Denies the destroy command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-destroy" + ] + }, + { + "description": "window:deny-hide -> Denies the hide command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-hide" + ] + }, + { + "description": "window:deny-inner-position -> Denies the inner_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-inner-position" + ] + }, + { + "description": "window:deny-inner-size -> Denies the inner_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-inner-size" + ] + }, + { + "description": "window:deny-internal-toggle-maximize -> Denies the internal_toggle_maximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-internal-toggle-maximize" + ] + }, + { + "description": "window:deny-is-closable -> Denies the is_closable command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-is-closable" + ] + }, + { + "description": "window:deny-is-decorated -> Denies the is_decorated command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-is-decorated" + ] + }, + { + "description": "window:deny-is-focused -> Denies the is_focused command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-is-focused" + ] + }, + { + "description": "window:deny-is-fullscreen -> Denies the is_fullscreen command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-is-fullscreen" + ] + }, + { + "description": "window:deny-is-maximizable -> Denies the is_maximizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-is-maximizable" + ] + }, + { + "description": "window:deny-is-maximized -> Denies the is_maximized command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-is-maximized" + ] + }, + { + "description": "window:deny-is-minimizable -> Denies the is_minimizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-is-minimizable" + ] + }, + { + "description": "window:deny-is-minimized -> Denies the is_minimized command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-is-minimized" + ] + }, + { + "description": "window:deny-is-resizable -> Denies the is_resizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-is-resizable" + ] + }, + { + "description": "window:deny-is-visible -> Denies the is_visible command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-is-visible" + ] + }, + { + "description": "window:deny-maximize -> Denies the maximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-maximize" + ] + }, + { + "description": "window:deny-minimize -> Denies the minimize command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-minimize" + ] + }, + { + "description": "window:deny-outer-position -> Denies the outer_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-outer-position" + ] + }, + { + "description": "window:deny-outer-size -> Denies the outer_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-outer-size" + ] + }, + { + "description": "window:deny-primary-monitor -> Denies the primary_monitor command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-primary-monitor" + ] + }, + { + "description": "window:deny-request-user-attention -> Denies the request_user_attention command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-request-user-attention" + ] + }, + { + "description": "window:deny-scale-factor -> Denies the scale_factor command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-scale-factor" + ] + }, + { + "description": "window:deny-set-always-on-bottom -> Denies the set_always_on_bottom command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-always-on-bottom" + ] + }, + { + "description": "window:deny-set-always-on-top -> Denies the set_always_on_top command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-always-on-top" + ] + }, + { + "description": "window:deny-set-closable -> Denies the set_closable command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-closable" + ] + }, + { + "description": "window:deny-set-content-protected -> Denies the set_content_protected command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-content-protected" + ] + }, + { + "description": "window:deny-set-cursor-grab -> Denies the set_cursor_grab command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-cursor-grab" + ] + }, + { + "description": "window:deny-set-cursor-icon -> Denies the set_cursor_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-cursor-icon" + ] + }, + { + "description": "window:deny-set-cursor-position -> Denies the set_cursor_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-cursor-position" + ] + }, + { + "description": "window:deny-set-cursor-visible -> Denies the set_cursor_visible command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-cursor-visible" + ] + }, + { + "description": "window:deny-set-decorations -> Denies the set_decorations command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-decorations" + ] + }, + { + "description": "window:deny-set-effects -> Denies the set_effects command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-effects" + ] + }, + { + "description": "window:deny-set-focus -> Denies the set_focus command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-focus" + ] + }, + { + "description": "window:deny-set-fullscreen -> Denies the set_fullscreen command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-fullscreen" + ] + }, + { + "description": "window:deny-set-icon -> Denies the set_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-icon" + ] + }, + { + "description": "window:deny-set-ignore-cursor-events -> Denies the set_ignore_cursor_events command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-ignore-cursor-events" + ] + }, + { + "description": "window:deny-set-max-size -> Denies the set_max_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-max-size" + ] + }, + { + "description": "window:deny-set-maximizable -> Denies the set_maximizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-maximizable" + ] + }, + { + "description": "window:deny-set-min-size -> Denies the set_min_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-min-size" + ] + }, + { + "description": "window:deny-set-minimizable -> Denies the set_minimizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-minimizable" + ] + }, + { + "description": "window:deny-set-position -> Denies the set_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-position" + ] + }, + { + "description": "window:deny-set-progress-bar -> Denies the set_progress_bar command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-progress-bar" + ] + }, + { + "description": "window:deny-set-resizable -> Denies the set_resizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-resizable" + ] + }, + { + "description": "window:deny-set-shadow -> Denies the set_shadow command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-shadow" + ] + }, + { + "description": "window:deny-set-size -> Denies the set_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-size" + ] + }, + { + "description": "window:deny-set-skip-taskbar -> Denies the set_skip_taskbar command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-skip-taskbar" + ] + }, + { + "description": "window:deny-set-title -> Denies the set_title command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-title" + ] + }, + { + "description": "window:deny-set-visible-on-all-workspaces -> Denies the set_visible_on_all_workspaces command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-set-visible-on-all-workspaces" + ] + }, + { + "description": "window:deny-show -> Denies the show command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-show" + ] + }, + { + "description": "window:deny-start-dragging -> Denies the start_dragging command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-start-dragging" + ] + }, + { + "description": "window:deny-start-resize-dragging -> Denies the start_resize_dragging command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-start-resize-dragging" + ] + }, + { + "description": "window:deny-theme -> Denies the theme command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-theme" + ] + }, + { + "description": "window:deny-title -> Denies the title command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-title" + ] + }, + { + "description": "window:deny-toggle-maximize -> Denies the toggle_maximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-toggle-maximize" + ] + }, + { + "description": "window:deny-unmaximize -> Denies the unmaximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-unmaximize" + ] + }, + { + "description": "window:deny-unminimize -> Denies the unminimize command without any pre-configured scope.", + "type": "string", + "enum": [ + "window:deny-unminimize" + ] + } + ] + }, + "Value": { + "description": "All supported ACL values.", + "anyOf": [ + { + "description": "Represents a null JSON value.", + "type": "null" + }, + { + "description": "Represents a [`bool`].", + "type": "boolean" + }, + { + "description": "Represents a valid ACL [`Number`].", + "allOf": [ + { + "$ref": "#/definitions/Number" + } + ] + }, + { + "description": "Represents a [`String`].", + "type": "string" + }, + { + "description": "Represents a list of other [`Value`]s.", + "type": "array", + "items": { + "$ref": "#/definitions/Value" + } + }, + { + "description": "Represents a map of [`String`] keys to [`Value`]s.", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Value" + } + } + ] + }, + "Number": { + "description": "A valid ACL number.", + "anyOf": [ + { + "description": "Represents an [`i64`].", + "type": "integer", + "format": "int64" + }, + { + "description": "Represents a [`f64`].", + "type": "number", + "format": "double" + } + ] + }, + "Target": { + "description": "Platform target.", + "oneOf": [ + { + "description": "MacOS.", + "type": "string", + "enum": [ + "macOS" + ] + }, + { + "description": "Windows.", + "type": "string", + "enum": [ + "windows" + ] + }, + { + "description": "Linux.", + "type": "string", + "enum": [ + "linux" + ] + }, + { + "description": "Android.", + "type": "string", + "enum": [ + "android" + ] + }, + { + "description": "iOS.", + "type": "string", + "enum": [ + "iOS" + ] + } + ] + } + } +} \ No newline at end of file diff --git a/external/prisma-client-rust/examples/tauri/src-tauri/icons/128x128.png b/external/prisma-client-rust/examples/tauri/src-tauri/icons/128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..6be5e50e9b9ae84d9e2ee433f32ef446495eaf3b GIT binary patch literal 3512 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 literal 0 HcmV?d00001 diff --git a/external/prisma-client-rust/examples/tauri/src-tauri/icons/128x128@2x.png b/external/prisma-client-rust/examples/tauri/src-tauri/icons/128x128@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e81becee571e96f76aa5667f9324c05e5e7a4479 GIT binary patch literal 7012 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 Sh@|Ye~|0>}wMPLT8jm@Y!H33Sz}5aFI6 zM9Lzqz|;A*0sGs=2A1uU!1nk2dGF7knQwr99SAFen)x(eCO;F8y2C~0FD1YxRTPcy zPWVxkUYmeuz}Tv?7&Fe-!UE{)ZW)Mb;H)^#eHDv$`dkZGguJz@^MA!ZNGAUqt{|0H zpZ7Ch9S`q5!>R%}>}62!+(T^evyO+ImSo2wpu)su4^3nw5(%)KD%gbSev^*HZZ&3( z#&c@Z0gH|}Ck)w6fh0&NBJ62ib%R}(3@$VFl*_#l2W$wQ-~4RmZZAt5O*^2Q5}Xr8Hy@c`#pM?kc?hFWxRXr*mUfUCXf4ka5DD~ zat6d85COB05l#(P9*cQZ3EC8fVdS~?&vN#rce(aF9@xp80O2{{FBvU+{X>Hoh;xI` z{$e^Nw1y*VbO8wv`8|-m?NwNaKGTGaF{P^JLB^DbOYWIbn%eT`*!^C1H36=O8Z-M> zkD~88ry`eSo`tEBN4>w7OWZwUzlh{WM1m8R6zepqGcGMaV7vWY9b?K4b6~|HVG)ec wi>I@ws#sZo7or4_*4M>7;p5{nr2pZ?Uu4>Krr0kU)&Kwi07*qoM6N<$f)&@lf&c&j literal 0 HcmV?d00001 diff --git a/external/prisma-client-rust/examples/tauri/src-tauri/icons/Square107x107Logo.png b/external/prisma-client-rust/examples/tauri/src-tauri/icons/Square107x107Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0ca4f27198838968bd60ed7d371bfa23496b7fe5 GIT binary patch literal 2863 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 Y2S8W#vM)6=T>t<807*qoM6N<$f*y@n<^TWy literal 0 HcmV?d00001 diff --git a/external/prisma-client-rust/examples/tauri/src-tauri/icons/Square284x284Logo.png b/external/prisma-client-rust/examples/tauri/src-tauri/icons/Square284x284Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c021d2ba76619c08969ab688db3b27f29257aa6f GIT binary patch literal 7737 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 literal 0 HcmV?d00001 diff --git a/external/prisma-client-rust/examples/tauri/src-tauri/icons/Square30x30Logo.png b/external/prisma-client-rust/examples/tauri/src-tauri/icons/Square30x30Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..621970023096ed9f494ba18ace15421a45cd65fa GIT binary patch literal 903 zcmV;219<$2P)2 z+CUKPMqaqGiH;zb!R4$B-WXS^YzQr=@UH>k4?*L)&R=zYjBrZenKdc9|JlS$SO*RJ zKt8FSTDAdk1g_WPAO!p^V!AuL;Lm;uQyV;zKq)J3i(;q*;k+pD%f3eltU`PYdy9(k0&%` zuWAPcV6|-y?|?7O1W!KSK}pbk8#~!|FA@(VJkt^V@0lio{afoAeo*f&$W2s6${5!1eKvAGD2$GZwSB98L2ZVS- zKn8ENRkZ*sb!@QugOrQNK3(sy1v%J#m|rpB+h|Nkqa3FRT>74xSs{#&saU2Lf!_Iq zKmuKAESh`gs!fneGWn+nf}l?7jE$HW!Af&vE5=G!QU)U2v&HLIBGXKk4nQx{hsHjL zLPMAo5=*uInFbq7(aa`Y2VX5wCmaeqvECOFv)a>0t>ZaEb*cJccER=BB?KFZhV$c^ znL*l8x*UYZv4WK|j?~Jt6~~F%{pk~z5A*>^M`?r5m9@RJ_x|uEtX(6Vk@Y()MVto* z93wr)%3m%|#OZ~srm>zF(JvDuTq*@;d&^>_BJm5hOU`3FjG70L#Vzv9I?`<7$T@

jU?lMi@tgxr7CqX_r3uw^y4tVU3Pm0sw;|1WSUO%?=bG`*Kmz6u4{#ti;T7AWIBAEh!(Y zz>O01&#X?Ds@L)Sb{CkG#Yz4$3o d@96)?#cz^xWoA}>B$xmI002ovPDHLkV1l3&k#zt7 literal 0 HcmV?d00001 diff --git a/external/prisma-client-rust/examples/tauri/src-tauri/icons/Square310x310Logo.png b/external/prisma-client-rust/examples/tauri/src-tauri/icons/Square310x310Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f9bc04839491e66c07b16ab03743c0c53b4109cc GIT binary patch literal 8591 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 JPDHLkV1lm|RXG3v literal 0 HcmV?d00001 diff --git a/external/prisma-client-rust/examples/tauri/src-tauri/icons/Square71x71Logo.png b/external/prisma-client-rust/examples/tauri/src-tauri/icons/Square71x71Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..63440d7984936a9caa89275928d8dce97e4d033b GIT binary patch literal 2011 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∓t$dRJGIadE?vc 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 Kx8Vjl{{H|h@<;Lj literal 0 HcmV?d00001 diff --git a/external/prisma-client-rust/examples/tauri/src-tauri/icons/icon.ico b/external/prisma-client-rust/examples/tauri/src-tauri/icons/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..b3636e4b22ba65db9061cd60a77b02c92022dfd6 GIT binary patch literal 86642 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 AKmY&$ literal 0 HcmV?d00001 diff --git a/external/prisma-client-rust/examples/tauri/src-tauri/icons/icon.png b/external/prisma-client-rust/examples/tauri/src-tauri/icons/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e1cd2619e0b5ec089cbba5ec7b03ddf2b1dfceb6 GIT binary patch literal 14183 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

5l#v3A#xI3*z~1~fvo9Q(N^(==!|_FZ z*duZ=+M1~)8E|otX8KNZlr?qels#x_1Xq@9IIw~@9uAREJVH)Xw^}UclF6327}E42 zT)E&?U%TK?(+K7%R!`H5oX0i)4Qn5??Iw3p5J~6_u+aWehY{DSn}3V2p$bgjnAu?o)v@iC254fXeMv50$9YrpU`N?u@QIWs)T?SP|fa}(|9 zqAX+!7`cx=4)cCBg5h~pu(?@9`)aCr#oyz$ld=#RFxYCNZCZls@4v2~*e-t6PEVvV z&bbK3b3wt(Coc!ufAbXXC<**#HQ%J9k`New6iG<5RjtO4XVO?dCvwxD{kJ#tfQr(X zg^NTwF-FwAeS_{V4bfel8l`~NbfrTR2s!G>WduFWxH(t~aK4q=6rEE^$+Uox>gJO2 z{L<;6Q6nHa5#ZEM>H58not!)z(6*_=^~8}jWf*IG$AUKVWOZ4?)GfF z+BM#*wKKmLFD7E~W3U!$IVm$k_k1f&Kz6WV8@55P?r~bcg-Za-!rvW?ns&)KOGT2~ zlkAyqhQj=P$Eg3w#K~}zH@J5bo-BfHjInKSz$@?+Z)NPD4pHj^_Qxmi`UqoTy=`sV zLVxrXGuBr=QRm|}wg75yetQQK4fY3#P_~J}zEfPnb2C4Wo!E(d*(cA;b?7$g2in<( zPn)ghX}nzJPmb6(3Dpeg_GW~Hc}Lt=lgsSZz z!5QXyz7KaR;D`3Ee}d`af{H>WWZ|Io1QI3~4Ll_`g1(cRnhLK73Ro)7zPCd={1W2x zRp%Xlvv4>!<2@}$hz|!V{T}_eHx2xkLl^hQoZTCnsjCl|W_@5Fx2(+j0ogy&Y+;L- z<)G$*CiN7hOm^s!{U>1F7U=iNk{+u~dAC!eDz%=|glFW0jEZU1&o(G_c#wTxUjnG} z#cg3>jEpUi#Mlq@t?Msg_#geK^Lx@DyHWf7=AS5vVyM7YOjvUVCfcpVR<(+5!H?9- zySI6s>o3m&*zr||=wcPGyBkQV`EWJl@bH8qobjOp+sXL*)=&yX)8aAbf~tGv?a2SN zu^Ddo-z?DWk9h9Yz#5p^NU#x~wYSd?H@w@!2Gb4G)6-utEMV~~M85Br5ff(v5O1|T z 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 = State<'a, Arc>; + +#[tauri::command] +#[specta::specta] +async fn get_posts(db: DbState<'_>) -> Result, ()> { + db.post().find_many(vec![]).exec().await.map_err(|_| ()) +} + +#[derive(Deserialize, Type)] +struct CreatePostData { + title: String, + content: String, +} + +#[tauri::command] +#[specta::specta] +async fn create_post(db: DbState<'_>, data: CreatePostData) -> Result { + db.post() + .create(data.title, data.content, vec![]) + .exec() + .await + .map_err(|_| ()) +} + +#[tokio::main] +async fn main() { + let db = PrismaClient::_builder().build().await.unwrap(); + + let invoke_handler = { + let builder = ts::builder().commands(collect_commands![get_posts, create_post]); + + #[cfg(debug_assertions)] + let builder = builder.path("../src/bindings.ts"); + + builder.build().unwrap() + }; + + #[cfg(debug_assertions)] + db._db_push().await.unwrap(); + + tauri::Builder::default() + .invoke_handler(invoke_handler) + .manage(Arc::new(db)) + .run(tauri::generate_context!()) + .expect("error while running tauri application"); +} diff --git a/external/prisma-client-rust/examples/tauri/src-tauri/tauri.conf.json b/external/prisma-client-rust/examples/tauri/src-tauri/tauri.conf.json new file mode 100644 index 0000000..d64ff3b --- /dev/null +++ b/external/prisma-client-rust/examples/tauri/src-tauri/tauri.conf.json @@ -0,0 +1,34 @@ +{ + "productName": "prisma-client-rust-tauri-example", + "version": "0.0.0", + "identifier": "com.tauri.dev", + "build": { + "beforeDevCommand": "pnpm dev", + "devUrl": "http://localhost:1420", + "beforeBuildCommand": "pnpm build", + "frontendDist": "../dist" + }, + "app": { + "windows": [ + { + "title": "wpeijf", + "width": 800, + "height": 600 + } + ], + "security": { + "csp": null + } + }, + "bundle": { + "active": true, + "targets": "all", + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico" + ] + } +} diff --git a/external/prisma-client-rust/examples/tauri/src/App.tsx b/external/prisma-client-rust/examples/tauri/src/App.tsx new file mode 100644 index 0000000..6617879 --- /dev/null +++ b/external/prisma-client-rust/examples/tauri/src/App.tsx @@ -0,0 +1,68 @@ +import { For, Suspense, createResource, createSignal } from "solid-js"; +import { createPost, getPosts, Post } from "./bindings"; + +interface PostCreatorProps { + onPostCreated(): void +} + +const PostCreator = (props: PostCreatorProps) => { + const [loading, setLoading] = createSignal(false); + + return

{ + e.preventDefault() + const data = new FormData(e.target as HTMLFormElement); + + setLoading(true) + + try { + await createPost({ + title: data.get("title") as string, + content: data.get("content") as string, + }); + + (e.target as HTMLFormElement).reset() + props.onPostCreated() + } + finally { + setLoading(false) + } + }}> + +