diff --git a/Cargo.lock b/Cargo.lock index 53b7e38623a..c9fb7e1e149 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1046,6 +1046,29 @@ dependencies = [ "similar", ] +[[package]] +name = "driver-adapters" +version = "0.1.0" +dependencies = [ + "async-trait", + "bigdecimal", + "chrono", + "expect-test", + "futures", + "metrics 0.18.1", + "napi", + "napi-derive", + "num-bigint", + "once_cell", + "psl", + "quaint", + "serde", + "serde_json", + "tokio", + "tracing", + "tracing-core", +] + [[package]] name = "either" version = "1.9.0" @@ -1869,29 +1892,6 @@ version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" -[[package]] -name = "js-connectors" -version = "0.1.0" -dependencies = [ - "async-trait", - "bigdecimal", - "chrono", - "expect-test", - "futures", - "metrics 0.18.1", - "napi", - "napi-derive", - "num-bigint", - "once_cell", - "psl", - "quaint", - "serde", - "serde_json", - "tokio", - "tracing", - "tracing-core", -] - [[package]] name = "js-sys" version = "0.3.61" @@ -3614,8 +3614,8 @@ dependencies = [ "anyhow", "async-trait", "connection-string", + "driver-adapters", "futures", - "js-connectors", "napi", "napi-build", "napi-derive", diff --git a/Cargo.toml b/Cargo.toml index 85fc54dfa75..02e1f7373d0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,8 +19,8 @@ members = [ "query-engine/core-tests", "query-engine/black-box-tests", "query-engine/dmmf", + "query-engine/driver-adapters", "query-engine/metrics", - "query-engine/js-connectors", "query-engine/prisma-models", "query-engine/query-engine", "query-engine/query-engine-node-api", diff --git a/psl/psl-core/src/common/preview_features.rs b/psl/psl-core/src/common/preview_features.rs index 4e7137b4544..93ddde63291 100644 --- a/psl/psl-core/src/common/preview_features.rs +++ b/psl/psl-core/src/common/preview_features.rs @@ -64,7 +64,7 @@ features!( NamedConstraints, NApi, NativeTypes, - JsConnectors, + DriverAdapters, OrderByAggregateGroup, OrderByNulls, OrderByRelation, @@ -124,7 +124,7 @@ pub const ALL_PREVIEW_FEATURES: FeatureMap = FeatureMap { | UncheckedScalarInputs }), hidden: enumflags2::make_bitflags!(PreviewFeature::{ - JsConnectors + DriverAdapters }), }; diff --git a/query-engine/connectors/sql-query-connector/Cargo.toml b/query-engine/connectors/sql-query-connector/Cargo.toml index 6557cc7bb9b..5fe3052f2e8 100644 --- a/query-engine/connectors/sql-query-connector/Cargo.toml +++ b/query-engine/connectors/sql-query-connector/Cargo.toml @@ -5,7 +5,7 @@ version = "0.1.0" [features] vendored-openssl = ["quaint/vendored-openssl"] -js-connectors = [] +driver-adapters = [] [dependencies] psl.workspace = true diff --git a/query-engine/connectors/sql-query-connector/src/database/js.rs b/query-engine/connectors/sql-query-connector/src/database/js.rs index dc876bb3b8d..1dced9453fa 100644 --- a/query-engine/connectors/sql-query-connector/src/database/js.rs +++ b/query-engine/connectors/sql-query-connector/src/database/js.rs @@ -16,39 +16,39 @@ use std::{ sync::{Arc, Mutex}, }; -/// Registry is the type for the global registry of Js connectors. -type Registry = HashMap; +/// Registry is the type for the global registry of driver adapters. +type Registry = HashMap; -/// REGISTRY is the global registry of JsConnectors +/// REGISTRY is the global registry of Driver Adapters. static REGISTRY: Lazy> = Lazy::new(|| Mutex::new(HashMap::new())); -fn registered_js_connector(provider: &str) -> connector::Result { +fn registered_driver_adapter(provider: &str) -> connector::Result { let lock = REGISTRY.lock().unwrap(); lock.get(provider) .ok_or(ConnectorError::from_kind(ErrorKind::UnsupportedConnector(format!( - "A Javascript connector proxy for {} was not registered", + "A driver adapter for {} was not registered", provider )))) .map(|conn_ref| conn_ref.to_owned()) } -pub fn register_js_connector(provider: &str, connector: Arc) -> Result<(), String> { +pub fn register_driver_adapter(provider: &str, connector: Arc) -> Result<(), String> { let mut lock = REGISTRY.lock().unwrap(); let entry = lock.entry(provider.to_string()); match entry { Entry::Occupied(_) => Err(format!( - "A Javascript connector proxy for {} was already registered, and cannot be overridden.", + "A driver adapter for {} was already registered, and cannot be overridden.", provider )), Entry::Vacant(v) => { - v.insert(JsConnector { connector }); + v.insert(DriverAdapter { connector }); Ok(()) } } } pub struct Js { - connector: JsConnector, + connector: DriverAdapter, connection_info: ConnectionInfo, features: psl::PreviewFeatures, } @@ -69,7 +69,7 @@ impl FromSource for Js { url: &str, features: psl::PreviewFeatures, ) -> connector_interface::Result { - let connector = registered_js_connector(source.active_provider)?; + let connector = registered_driver_adapter(source.active_provider)?; let connection_info = get_connection_info(url)?; Ok(Js { @@ -102,11 +102,11 @@ impl Connector for Js { // TODO: miguelff: I haven´t found a better way to do this, yet... please continue reading. // // There is a bug in NAPI-rs by wich compiling a binary crate that links code using napi-rs -// bindings breaks. We could have used a JsQueryable from the `js-connectors` crate directly, as the -// `connection` field of a `Js` connector, but that will imply using napi-rs transitively, and break +// bindings breaks. We could have used a JsQueryable from the `driver-adapters` crate directly, as the +// `connection` field of a driver adapter, but that will imply using napi-rs transitively, and break // the tests (which are compiled as binary creates) // -// To avoid the problem above I separated interface from implementation, making JsConnector +// To avoid the problem above I separated interface from implementation, making DriverAdapter // independent on napi-rs. Initially, I tried having a field Arc<&dyn TransactionCabable> to hold // JsQueryable at runtime. I did this, because TransactionCapable is the trait bounds required to // create a value of `SqlConnection` (see [SqlConnection::new])) to actually performt the queries. @@ -117,12 +117,12 @@ impl Connector for Js { // declaration, so finally I couldn't come up with anything better then wrapping a QuaintQueryable // in this object, and implementing TransactionCapable (and quaint::Queryable) explicitly for it. #[derive(Clone)] -struct JsConnector { +struct DriverAdapter { connector: Arc, } #[async_trait] -impl QuaintQueryable for JsConnector { +impl QuaintQueryable for DriverAdapter { async fn query(&self, q: Query<'_>) -> quaint::Result { self.connector.query(q).await } @@ -174,7 +174,7 @@ impl QuaintQueryable for JsConnector { } #[async_trait] -impl TransactionCapable for JsConnector { +impl TransactionCapable for DriverAdapter { async fn start_transaction<'a>( &'a self, isolation: Option, diff --git a/query-engine/connectors/sql-query-connector/src/database/mod.rs b/query-engine/connectors/sql-query-connector/src/database/mod.rs index 96ab66334c5..695db13b662 100644 --- a/query-engine/connectors/sql-query-connector/src/database/mod.rs +++ b/query-engine/connectors/sql-query-connector/src/database/mod.rs @@ -1,5 +1,5 @@ mod connection; -#[cfg(feature = "js-connectors")] +#[cfg(feature = "driver-adapters")] mod js; mod mssql; mod mysql; @@ -12,7 +12,7 @@ pub(crate) mod operations; use async_trait::async_trait; use connector_interface::{error::ConnectorError, Connector}; -#[cfg(feature = "js-connectors")] +#[cfg(feature = "driver-adapters")] pub use js::*; pub use mssql::*; pub use mysql::*; diff --git a/query-engine/connectors/sql-query-connector/src/lib.rs b/query-engine/connectors/sql-query-connector/src/lib.rs index fae5dff0f9f..06aa1e376c4 100644 --- a/query-engine/connectors/sql-query-connector/src/lib.rs +++ b/query-engine/connectors/sql-query-connector/src/lib.rs @@ -22,8 +22,8 @@ mod value_ext; use self::{column_metadata::*, context::Context, filter_conversion::*, query_ext::QueryExt, row::*}; use quaint::prelude::Queryable; -#[cfg(feature = "js-connectors")] -pub use database::{register_js_connector, Js}; +#[cfg(feature = "driver-adapters")] +pub use database::{register_driver_adapter, Js}; pub use database::{FromSource, Mssql, Mysql, PostgreSql, Sqlite}; pub use error::SqlError; diff --git a/query-engine/js-connectors/Cargo.toml b/query-engine/driver-adapters/Cargo.toml similarity index 96% rename from query-engine/js-connectors/Cargo.toml rename to query-engine/driver-adapters/Cargo.toml index 75273e9fa2b..39e6804eca2 100644 --- a/query-engine/js-connectors/Cargo.toml +++ b/query-engine/driver-adapters/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "js-connectors" +name = "driver-adapters" version = "0.1.0" edition = "2021" diff --git a/query-engine/js-connectors/js/.gitignore b/query-engine/driver-adapters/js/.gitignore similarity index 100% rename from query-engine/js-connectors/js/.gitignore rename to query-engine/driver-adapters/js/.gitignore diff --git a/query-engine/js-connectors/js/.npmrc b/query-engine/driver-adapters/js/.npmrc similarity index 100% rename from query-engine/js-connectors/js/.npmrc rename to query-engine/driver-adapters/js/.npmrc diff --git a/query-engine/js-connectors/js/.nvmrc b/query-engine/driver-adapters/js/.nvmrc similarity index 100% rename from query-engine/js-connectors/js/.nvmrc rename to query-engine/driver-adapters/js/.nvmrc diff --git a/query-engine/driver-adapters/js/README.md b/query-engine/driver-adapters/js/README.md new file mode 100644 index 00000000000..d4198f4c31f --- /dev/null +++ b/query-engine/driver-adapters/js/README.md @@ -0,0 +1,34 @@ +# Prisma Driver Adapters + +This TypeScript monorepo contains the following packages: +- `@jkomyno/prisma-driver-adapter-utils` (later: `@prisma/driver-adapter-utils`) + - Internal set of utilities and types for Prisma's driver adapters. +- `@jkomyno/prisma-adapter-neon` (later: `@prisma/adapter-neon`) + - Prisma's Driver Adapter that wraps the `@neondatabase/serverless` driver + - It uses `provider = "postgres"` + - It exposes debug logs via `DEBUG="prisma:driver-adapter:neon"` +- `@jkomyno/prisma-adapter-planetscale` (later: `@prisma/adapter-planetscale`) + - Prisma's Driver Adapter that wraps the `@planetscale/database` driver + - It uses `provider = "mysql"` + - It exposes debug logs via `DEBUG="prisma:driver-adapter:planetscale"` +- `@jkomyno/prisma-adapter-pg` (later: `@prisma/adapter-pg`) + - Prisma's Driver Adapter that wraps the `pg` driver + - It uses `provider = "postgres"` + - It exposes debug logs via `DEBUG="prisma:driver-adapter:pg"` + +## Get Started + +We assume Node.js `v18.16.1`+ is installed. If not, run `nvm use` in the current directory. +This is very important to double-check if you have multiple versions installed, as PlanetScale requires either Node.js `v18.16.1`+ or a custom `fetch` function. + +Install `pnpm` via: + +```sh +npm i -g pnpm +``` + +## Development + +- Install Node.js dependencies via `pnpm i` +- Build and link TypeScript packages via `pnpm build` +- Publish packages to `npm` via `pnpm publish -r` diff --git a/query-engine/js-connectors/js/neon-js-connector/README.md b/query-engine/driver-adapters/js/adapter-neon/README.md similarity index 54% rename from query-engine/js-connectors/js/neon-js-connector/README.md rename to query-engine/driver-adapters/js/adapter-neon/README.md index 6c43a6b4396..74e6fa91dc3 100644 --- a/query-engine/js-connectors/js/neon-js-connector/README.md +++ b/query-engine/driver-adapters/js/adapter-neon/README.md @@ -1,3 +1,3 @@ -# @prisma/neon-js-connector +# @prisma/adapter-neon **INTERNAL PACKAGE, DO NOT USE** diff --git a/query-engine/js-connectors/js/neon-js-connector/package.json b/query-engine/driver-adapters/js/adapter-neon/package.json similarity index 54% rename from query-engine/js-connectors/js/neon-js-connector/package.json rename to query-engine/driver-adapters/js/adapter-neon/package.json index 13d26e1fd13..52ee08f97be 100644 --- a/query-engine/js-connectors/js/neon-js-connector/package.json +++ b/query-engine/driver-adapters/js/adapter-neon/package.json @@ -1,7 +1,7 @@ { - "name": "@jkomyno/prisma-neon-js-connector", - "version": "0.0.8", - "description": "Prisma's JS Connector for \"@neondatabase/serverless\"", + "name": "@jkomyno/prisma-adapter-neon", + "version": "0.2.1", + "description": "Prisma's driver adapter for \"@neondatabase/serverless\"", "main": "dist/index.js", "module": "dist/index.mjs", "types": "dist/index.d.ts", @@ -18,8 +18,12 @@ "license": "Apache-2.0", "sideEffects": false, "dependencies": { - "@jkomyno/prisma-js-connector-utils": "workspace:*", - "@neondatabase/serverless": "^0.6.0", - "ws": "^8.13.0" + "@jkomyno/prisma-driver-adapter-utils": "workspace:*" + }, + "devDependencies": { + "@neondatabase/serverless": "^0.6.0" + }, + "peerDependencies": { + "@neondatabase/serverless": "^0.6.0" } } diff --git a/query-engine/js-connectors/js/neon-js-connector/src/conversion.ts b/query-engine/driver-adapters/js/adapter-neon/src/conversion.ts similarity index 98% rename from query-engine/js-connectors/js/neon-js-connector/src/conversion.ts rename to query-engine/driver-adapters/js/adapter-neon/src/conversion.ts index ef1237b0f97..ea91f57eefd 100644 --- a/query-engine/js-connectors/js/neon-js-connector/src/conversion.ts +++ b/query-engine/driver-adapters/js/adapter-neon/src/conversion.ts @@ -1,4 +1,4 @@ -import { ColumnTypeEnum, type ColumnType } from '@jkomyno/prisma-js-connector-utils' +import { ColumnTypeEnum, type ColumnType } from '@jkomyno/prisma-driver-adapter-utils' import { types } from '@neondatabase/serverless' const NeonColumnType = types.builtins diff --git a/query-engine/driver-adapters/js/adapter-neon/src/index.ts b/query-engine/driver-adapters/js/adapter-neon/src/index.ts new file mode 100644 index 00000000000..f160d413ade --- /dev/null +++ b/query-engine/driver-adapters/js/adapter-neon/src/index.ts @@ -0,0 +1 @@ +export { PrismaNeon, PrismaNeonHTTP } from './neon' diff --git a/query-engine/js-connectors/js/neon-js-connector/src/neon.ts b/query-engine/driver-adapters/js/adapter-neon/src/neon.ts similarity index 60% rename from query-engine/js-connectors/js/neon-js-connector/src/neon.ts rename to query-engine/driver-adapters/js/adapter-neon/src/neon.ts index a831e8fc9e8..ba17da3036b 100644 --- a/query-engine/js-connectors/js/neon-js-connector/src/neon.ts +++ b/query-engine/driver-adapters/js/adapter-neon/src/neon.ts @@ -1,26 +1,20 @@ -import { FullQueryResults, PoolClient, neon, neonConfig } from '@neondatabase/serverless' -import { NeonConfig, NeonQueryFunction, Pool, QueryResult } from '@neondatabase/serverless' -import ws from 'ws' -import { bindConnector, Debug } from '@jkomyno/prisma-js-connector-utils' -import type { Connector, ResultSet, Query, ConnectorConfig, Queryable, Transaction, Result, ErrorCapturingConnector, TransactionOptions } from '@jkomyno/prisma-js-connector-utils' +import type neon from '@neondatabase/serverless' +import { Debug } from '@jkomyno/prisma-driver-adapter-utils' +import type { DriverAdapter, ResultSet, Query, Queryable, Transaction, Result, TransactionOptions } from '@jkomyno/prisma-driver-adapter-utils' import { fieldToColumnType } from './conversion' -neonConfig.webSocketConstructor = ws - -const debug = Debug('prisma:js-connector:neon') - -export type PrismaNeonConfig = ConnectorConfig & Partial> & { httpMode?: boolean } +const debug = Debug('prisma:driver-adapter:neon') type ARRAY_MODE_DISABLED = false type FULL_RESULTS_ENABLED = true -type PerformIOResult = QueryResult | FullQueryResults +type PerformIOResult = neon.QueryResult | neon.FullQueryResults /** * Base class for http client, ws client and ws transaction */ abstract class NeonQueryable implements Queryable { - flavour = 'postgres' as const + readonly flavour = 'postgres' async queryRaw(query: Query): Promise> { const tag = '[js::query_raw]' @@ -43,7 +37,7 @@ abstract class NeonQueryable implements Queryable { debug(`${tag} %O`, query) const { rowCount: rowsAffected } = await this.performIO(query) - + // Note: `rowsAffected` can sometimes be null (e.g., when executing `"BEGIN"`) return { ok: true, value: rowsAffected ?? 0 } } @@ -54,7 +48,7 @@ abstract class NeonQueryable implements Queryable { /** * Base class for WS-based queryables: top-level client and transaction */ -class NeonWsQueryable extends NeonQueryable { +class NeonWsQueryable extends NeonQueryable { constructor(protected client: ClientT) { super() } @@ -72,8 +66,8 @@ class NeonWsQueryable extends NeonQueryable { } } -class NeonTransaction extends NeonWsQueryable implements Transaction { - constructor(client: PoolClient, readonly options: TransactionOptions) { +class NeonTransaction extends NeonWsQueryable implements Transaction { + constructor(client: neon.PoolClient, readonly options: TransactionOptions) { super(client) } @@ -92,21 +86,21 @@ class NeonTransaction extends NeonWsQueryable implements Transaction } } -class NeonWsConnector extends NeonWsQueryable implements Connector { +export class PrismaNeon extends NeonWsQueryable implements DriverAdapter { private isRunning = true - constructor(config: PrismaNeonConfig) { - const { url: connectionString, httpMode, ...rest } = config - super(new Pool({ connectionString, ...rest })) + + constructor(pool: neon.Pool) { + super(pool) } async startTransaction(): Promise> { const options: TransactionOptions = { usePhantomQuery: false, } - + const tag = '[js::startTransaction]' debug(`${tag} options: %O`, options) - + const connection = await this.client.connect() return { ok: true, value: new NeonTransaction(connection, options) } } @@ -120,18 +114,17 @@ class NeonWsConnector extends NeonWsQueryable implements Connector { } } -class NeonHttpConnector extends NeonQueryable implements Connector { - private client: NeonQueryFunction - - constructor(config: PrismaNeonConfig) { +export class PrismaNeonHTTP extends NeonQueryable implements DriverAdapter { + constructor(private client: neon.NeonQueryFunction< + ARRAY_MODE_DISABLED, + FULL_RESULTS_ENABLED + >) { super() - const { url: connectionString, httpMode, ...rest } = config - this.client = neon(connectionString, { fullResults: true, ...rest}) } override async performIO(query: Query): Promise { const { sql, args: values } = query - return await this.client(sql, values) + return await this.client(sql, values) } startTransaction(): Promise> { @@ -141,10 +134,4 @@ class NeonHttpConnector extends NeonQueryable implements Connector { async close() { return { ok: true as const, value: undefined } } - -} - -export const createNeonConnector = (config: PrismaNeonConfig): ErrorCapturingConnector => { - const db = config.httpMode ? new NeonHttpConnector(config) : new NeonWsConnector(config) - return bindConnector(db) } diff --git a/query-engine/js-connectors/js/neon-js-connector/tsconfig.build.json b/query-engine/driver-adapters/js/adapter-neon/tsconfig.build.json similarity index 100% rename from query-engine/js-connectors/js/neon-js-connector/tsconfig.build.json rename to query-engine/driver-adapters/js/adapter-neon/tsconfig.build.json diff --git a/query-engine/js-connectors/js/js-connector-utils/tsconfig.json b/query-engine/driver-adapters/js/adapter-neon/tsconfig.json similarity index 100% rename from query-engine/js-connectors/js/js-connector-utils/tsconfig.json rename to query-engine/driver-adapters/js/adapter-neon/tsconfig.json diff --git a/query-engine/js-connectors/js/js-connector-utils/README.md b/query-engine/driver-adapters/js/adapter-pg/README.md similarity index 53% rename from query-engine/js-connectors/js/js-connector-utils/README.md rename to query-engine/driver-adapters/js/adapter-pg/README.md index d2348fb4316..b8463742e25 100644 --- a/query-engine/js-connectors/js/js-connector-utils/README.md +++ b/query-engine/driver-adapters/js/adapter-pg/README.md @@ -1,3 +1,3 @@ -# @prisma/js-connectors-utils +# @prisma/adapter-pg **INTERNAL PACKAGE, DO NOT USE** diff --git a/query-engine/js-connectors/js/pg-js-connector/package.json b/query-engine/driver-adapters/js/adapter-pg/package.json similarity index 67% rename from query-engine/js-connectors/js/pg-js-connector/package.json rename to query-engine/driver-adapters/js/adapter-pg/package.json index 52fea53e4f8..3055976cb51 100644 --- a/query-engine/js-connectors/js/pg-js-connector/package.json +++ b/query-engine/driver-adapters/js/adapter-pg/package.json @@ -1,7 +1,7 @@ { - "name": "@jkomyno/prisma-pg-js-connector", - "version": "0.0.8", - "description": "Prisma's JS Connector for \"pg\"", + "name": "@jkomyno/prisma-adapter-pg", + "version": "0.2.1", + "description": "Prisma's driver adapter for \"pg\"", "main": "dist/index.js", "module": "dist/index.mjs", "types": "dist/index.d.ts", @@ -18,10 +18,13 @@ "license": "Apache-2.0", "sideEffects": false, "dependencies": { - "@jkomyno/prisma-js-connector-utils": "workspace:*", - "pg": "^8.11.3" + "@jkomyno/prisma-driver-adapter-utils": "workspace:*" }, "devDependencies": { + "pg": "^8.11.3", "@types/pg": "^8.10.2" + }, + "peerDependencies": { + "pg": "^8.11.3" } } diff --git a/query-engine/js-connectors/js/pg-js-connector/src/conversion.ts b/query-engine/driver-adapters/js/adapter-pg/src/conversion.ts similarity index 98% rename from query-engine/js-connectors/js/pg-js-connector/src/conversion.ts rename to query-engine/driver-adapters/js/adapter-pg/src/conversion.ts index 22d2686c768..fc9ad43e9f0 100644 --- a/query-engine/js-connectors/js/pg-js-connector/src/conversion.ts +++ b/query-engine/driver-adapters/js/adapter-pg/src/conversion.ts @@ -1,4 +1,4 @@ -import { ColumnTypeEnum, type ColumnType } from '@jkomyno/prisma-js-connector-utils' +import { ColumnTypeEnum, type ColumnType } from '@jkomyno/prisma-driver-adapter-utils' import { types } from 'pg' const PgColumnType = types.builtins diff --git a/query-engine/driver-adapters/js/adapter-pg/src/index.ts b/query-engine/driver-adapters/js/adapter-pg/src/index.ts new file mode 100644 index 00000000000..f8e51ac2685 --- /dev/null +++ b/query-engine/driver-adapters/js/adapter-pg/src/index.ts @@ -0,0 +1 @@ +export { PrismaPg } from './pg' diff --git a/query-engine/js-connectors/js/pg-js-connector/src/pg.ts b/query-engine/driver-adapters/js/adapter-pg/src/pg.ts similarity index 79% rename from query-engine/js-connectors/js/pg-js-connector/src/pg.ts rename to query-engine/driver-adapters/js/adapter-pg/src/pg.ts index e47aff8168e..a6a4ba4b58d 100644 --- a/query-engine/js-connectors/js/pg-js-connector/src/pg.ts +++ b/query-engine/driver-adapters/js/adapter-pg/src/pg.ts @@ -1,11 +1,9 @@ -import * as pg from 'pg' -import { bindConnector, Debug } from '@jkomyno/prisma-js-connector-utils' -import type { ErrorCapturingConnector, Connector, ConnectorConfig, Query, Queryable, Result, ResultSet, Transaction, TransactionOptions } from '@jkomyno/prisma-js-connector-utils' +import type pg from 'pg' +import { Debug } from '@jkomyno/prisma-driver-adapter-utils' +import type { DriverAdapter, Query, Queryable, Result, ResultSet, Transaction, TransactionOptions } from '@jkomyno/prisma-driver-adapter-utils' import { fieldToColumnType } from './conversion' -const debug = Debug('prisma:js-connector:pg') - -export type PrismaPgConfig = ConnectorConfig +const debug = Debug('prisma:driver-adapter:pg') type StdClient = pg.Pool type TransactionClient = pg.PoolClient @@ -91,14 +89,8 @@ class PgTransaction extends PgQueryable } } -class PrismaPg extends PgQueryable implements Connector { - constructor(config: PrismaPgConfig) { - const { url: connectionString } = config - - const client = new pg.Pool({ - connectionString, - }) - +export class PrismaPg extends PgQueryable implements DriverAdapter { + constructor(client: pg.Pool) { super(client) } @@ -118,8 +110,3 @@ class PrismaPg extends PgQueryable implements Connector { return { ok: true as const, value: undefined } } } - -export const createPgConnector = (config: PrismaPgConfig): ErrorCapturingConnector => { - const db = new PrismaPg(config) - return bindConnector(db) -} diff --git a/query-engine/driver-adapters/js/adapter-planetscale/README.md b/query-engine/driver-adapters/js/adapter-planetscale/README.md new file mode 100644 index 00000000000..61b8b1717c1 --- /dev/null +++ b/query-engine/driver-adapters/js/adapter-planetscale/README.md @@ -0,0 +1,3 @@ +# @prisma/adapter-planetscale + +**INTERNAL PACKAGE, DO NOT USE** diff --git a/query-engine/js-connectors/js/planetscale-js-connector/package.json b/query-engine/driver-adapters/js/adapter-planetscale/package.json similarity index 59% rename from query-engine/js-connectors/js/planetscale-js-connector/package.json rename to query-engine/driver-adapters/js/adapter-planetscale/package.json index 8121b8d6385..bdda6c0a5c9 100644 --- a/query-engine/js-connectors/js/planetscale-js-connector/package.json +++ b/query-engine/driver-adapters/js/adapter-planetscale/package.json @@ -1,7 +1,7 @@ { - "name": "@jkomyno/prisma-planetscale-js-connector", - "version": "0.0.8", - "description": "Prisma's JS Connector for \"@planetscale/database\"", + "name": "@jkomyno/prisma-adapter-planetscale", + "version": "0.2.1", + "description": "Prisma's driver adapter for \"@planetscale/database\"", "main": "dist/index.js", "module": "dist/index.mjs", "types": "dist/index.d.ts", @@ -18,7 +18,12 @@ "license": "Apache-2.0", "sideEffects": false, "dependencies": { - "@jkomyno/prisma-js-connector-utils": "workspace:*", + "@jkomyno/prisma-driver-adapter-utils": "workspace:*" + }, + "devDependencies": { + "@planetscale/database": "^1.11.0" + }, + "peerDependencies": { "@planetscale/database": "^1.11.0" } } diff --git a/query-engine/js-connectors/js/planetscale-js-connector/src/conversion.ts b/query-engine/driver-adapters/js/adapter-planetscale/src/conversion.ts similarity index 98% rename from query-engine/js-connectors/js/planetscale-js-connector/src/conversion.ts rename to query-engine/driver-adapters/js/adapter-planetscale/src/conversion.ts index db0cbba0c0b..2c79afdddd6 100644 --- a/query-engine/js-connectors/js/planetscale-js-connector/src/conversion.ts +++ b/query-engine/driver-adapters/js/adapter-planetscale/src/conversion.ts @@ -1,4 +1,4 @@ -import { ColumnTypeEnum, type ColumnType } from '@jkomyno/prisma-js-connector-utils' +import { ColumnTypeEnum, type ColumnType } from '@jkomyno/prisma-driver-adapter-utils' // See: https://github.com/planetscale/vitess-types/blob/06235e372d2050b4c0fff49972df8111e696c564/src/vitess/query/v16/query.proto#L108-L218 export type PlanetScaleColumnType diff --git a/query-engine/js-connectors/js/planetscale-js-connector/src/deferred.ts b/query-engine/driver-adapters/js/adapter-planetscale/src/deferred.ts similarity index 100% rename from query-engine/js-connectors/js/planetscale-js-connector/src/deferred.ts rename to query-engine/driver-adapters/js/adapter-planetscale/src/deferred.ts diff --git a/query-engine/driver-adapters/js/adapter-planetscale/src/index.ts b/query-engine/driver-adapters/js/adapter-planetscale/src/index.ts new file mode 100644 index 00000000000..5e8add856fb --- /dev/null +++ b/query-engine/driver-adapters/js/adapter-planetscale/src/index.ts @@ -0,0 +1 @@ +export { PrismaPlanetScale } from './planetscale' diff --git a/query-engine/js-connectors/js/planetscale-js-connector/src/planetscale.ts b/query-engine/driver-adapters/js/adapter-planetscale/src/planetscale.ts similarity index 79% rename from query-engine/js-connectors/js/planetscale-js-connector/src/planetscale.ts rename to query-engine/driver-adapters/js/adapter-planetscale/src/planetscale.ts index 939b8b7c176..8bd2610336b 100644 --- a/query-engine/js-connectors/js/planetscale-js-connector/src/planetscale.ts +++ b/query-engine/driver-adapters/js/adapter-planetscale/src/planetscale.ts @@ -1,13 +1,10 @@ -import * as planetScale from '@planetscale/database' -import type { Config as PlanetScaleConfig } from '@planetscale/database' -import { bindConnector, Debug } from '@jkomyno/prisma-js-connector-utils' -import type { Connector, ResultSet, Query, ConnectorConfig, Queryable, Transaction, Result, ErrorCapturingConnector, TransactionOptions } from '@jkomyno/prisma-js-connector-utils' +import type planetScale from '@planetscale/database' +import { Debug } from '@jkomyno/prisma-driver-adapter-utils' +import type { DriverAdapter, ResultSet, Query, Queryable, Transaction, Result, TransactionOptions } from '@jkomyno/prisma-driver-adapter-utils' import { type PlanetScaleColumnType, fieldToColumnType } from './conversion' import { createDeferred, Deferred } from './deferred' -const debug = Debug('prisma:js-connector:planetscale') - -export type PrismaPlanetScaleConfig = ConnectorConfig & Partial +const debug = Debug('prisma:driver-adapter:planetscale') class RollbackError extends Error { constructor() { @@ -15,7 +12,7 @@ class RollbackError extends Error { this.name = 'RollbackError' if (Error.captureStackTrace) { - Error.captureStackTrace(this, RollbackError); + Error.captureStackTrace(this, RollbackError) } } } @@ -97,17 +94,15 @@ class PlanetScaleTransaction extends PlanetScaleQueryable> { debug(`[js::rollback]`) - + this.txDeferred.reject(new RollbackError()) return Promise.resolve({ ok: true, value: await this.txResultPromise }) } } -class PrismaPlanetScale extends PlanetScaleQueryable implements Connector { - constructor(config: PrismaPlanetScaleConfig) { - const client = planetScale.connect(config) - +export class PrismaPlanetScale extends PlanetScaleQueryable implements DriverAdapter { + constructor(client: planetScale.Connection) { super(client) } @@ -115,7 +110,7 @@ class PrismaPlanetScale extends PlanetScaleQueryable imp const options: TransactionOptions = { usePhantomQuery: true, } - + const tag = '[js::startTransaction]' debug(`${tag} options: %O`, options) @@ -132,7 +127,7 @@ class PrismaPlanetScale extends PlanetScaleQueryable imp if (!(error instanceof RollbackError)) { return reject(error) } - + return undefined }) }) @@ -142,8 +137,3 @@ class PrismaPlanetScale extends PlanetScaleQueryable imp return { ok: true as const, value: undefined } } } - -export const createPlanetScaleConnector = (config: PrismaPlanetScaleConfig): ErrorCapturingConnector => { - const db = new PrismaPlanetScale(config) - return bindConnector(db) -} diff --git a/query-engine/js-connectors/js/planetscale-js-connector/tsconfig.build.json b/query-engine/driver-adapters/js/adapter-planetscale/tsconfig.build.json similarity index 100% rename from query-engine/js-connectors/js/planetscale-js-connector/tsconfig.build.json rename to query-engine/driver-adapters/js/adapter-planetscale/tsconfig.build.json diff --git a/query-engine/js-connectors/js/neon-js-connector/tsconfig.json b/query-engine/driver-adapters/js/adapter-planetscale/tsconfig.json similarity index 100% rename from query-engine/js-connectors/js/neon-js-connector/tsconfig.json rename to query-engine/driver-adapters/js/adapter-planetscale/tsconfig.json diff --git a/query-engine/driver-adapters/js/driver-adapter-utils/README.md b/query-engine/driver-adapters/js/driver-adapter-utils/README.md new file mode 100644 index 00000000000..78938e802bd --- /dev/null +++ b/query-engine/driver-adapters/js/driver-adapter-utils/README.md @@ -0,0 +1,3 @@ +# @prisma/driver-adapters-utils + +**INTERNAL PACKAGE, DO NOT USE** diff --git a/query-engine/js-connectors/js/js-connector-utils/package.json b/query-engine/driver-adapters/js/driver-adapter-utils/package.json similarity index 85% rename from query-engine/js-connectors/js/js-connector-utils/package.json rename to query-engine/driver-adapters/js/driver-adapter-utils/package.json index 5aef51b3422..524d59e551f 100644 --- a/query-engine/js-connectors/js/js-connector-utils/package.json +++ b/query-engine/driver-adapters/js/driver-adapter-utils/package.json @@ -1,7 +1,7 @@ { - "name": "@jkomyno/prisma-js-connector-utils", - "version": "0.0.8", - "description": "Internal set of utilities and types for Prisma's JS Connectors.", + "name": "@jkomyno/prisma-driver-adapter-utils", + "version": "0.2.1", + "description": "Internal set of utilities and types for Prisma's driver adapters.", "main": "dist/index.js", "module": "dist/index.mjs", "types": "dist/index.d.ts", diff --git a/query-engine/js-connectors/js/js-connector-utils/src/binder.ts b/query-engine/driver-adapters/js/driver-adapter-utils/src/binder.ts similarity index 56% rename from query-engine/js-connectors/js/js-connector-utils/src/binder.ts rename to query-engine/driver-adapters/js/driver-adapter-utils/src/binder.ts index bf989ce9344..9d399056f9a 100644 --- a/query-engine/js-connectors/js/js-connector-utils/src/binder.ts +++ b/query-engine/driver-adapters/js/driver-adapter-utils/src/binder.ts @@ -1,42 +1,40 @@ -import type { ErrorCapturingConnector, Connector, Transaction, ErrorRegistry, ErrorRecord, Result } from './types'; - +import type { ErrorCapturingDriverAdapter, DriverAdapter, Transaction, ErrorRegistry, ErrorRecord, Result } from './types' class ErrorRegistryInternal implements ErrorRegistry { private registeredErrors: ErrorRecord[] = [] consumeError(id: number): ErrorRecord | undefined { - return this.registeredErrors[id] + return this.registeredErrors[id] } registerNewError(error: unknown) { - let i=0; - while (this.registeredErrors[i] !== undefined) { - i++ - } - this.registeredErrors[i] = { error } - return i + let i = 0 + while (this.registeredErrors[i] !== undefined) { + i++ + } + this.registeredErrors[i] = { error } + return i } - } -// *.bind(connector) is required to preserve the `this` context of functions whose +// *.bind(adapter) is required to preserve the `this` context of functions whose // execution is delegated to napi.rs. -export const bindConnector = (connector: Connector): ErrorCapturingConnector => { +export const bindAdapter = (adapter: DriverAdapter): ErrorCapturingDriverAdapter => { const errorRegistry = new ErrorRegistryInternal() return { errorRegistry, - queryRaw: wrapAsync(errorRegistry, connector.queryRaw.bind(connector)), - executeRaw: wrapAsync(errorRegistry, connector.executeRaw.bind(connector)), - flavour: connector.flavour, + queryRaw: wrapAsync(errorRegistry, adapter.queryRaw.bind(adapter)), + executeRaw: wrapAsync(errorRegistry, adapter.executeRaw.bind(adapter)), + flavour: adapter.flavour, startTransaction: async (...args) => { - const result = await connector.startTransaction(...args); + const result = await adapter.startTransaction(...args) if (result.ok) { - return { ok: true, value: bindTransaction(errorRegistry, result.value)} + return { ok: true, value: bindTransaction(errorRegistry, result.value) } } return result }, - close: wrapAsync(errorRegistry, connector.close.bind(connector)) + close: wrapAsync(errorRegistry, adapter.close.bind(adapter)) } } @@ -55,11 +53,11 @@ const bindTransaction = (errorRegistry: ErrorRegistryInternal, transaction: Tran function wrapAsync(registry: ErrorRegistryInternal, fn: (...args: A) => Promise>): (...args: A) => Promise> { return async (...args) => { - try { - return await fn(...args) - } catch (error) { - const id = registry.registerNewError(error) - return { ok: false, error: { kind: 'GenericJsError', id } } - } + try { + return await fn(...args) + } catch (error) { + const id = registry.registerNewError(error) + return { ok: false, error: { kind: 'GenericJsError', id } } + } } } \ No newline at end of file diff --git a/query-engine/js-connectors/js/js-connector-utils/src/const.ts b/query-engine/driver-adapters/js/driver-adapter-utils/src/const.ts similarity index 88% rename from query-engine/js-connectors/js/js-connector-utils/src/const.ts rename to query-engine/driver-adapters/js/driver-adapter-utils/src/const.ts index 48fef04539a..f65104d5bf5 100644 --- a/query-engine/js-connectors/js/js-connector-utils/src/const.ts +++ b/query-engine/driver-adapters/js/driver-adapter-utils/src/const.ts @@ -1,4 +1,4 @@ -// Same order as in rust js-connectors' `ColumnType`. +// Same order as in rust driver-adapters' `ColumnType`. // Note: exporting const enums causes lots of problems with bundlers, so we emulate // them via regular dictionaries. // See: https://hackmd.io/@dzearing/Sk3xV0cLs diff --git a/query-engine/js-connectors/js/js-connector-utils/src/debug.ts b/query-engine/driver-adapters/js/driver-adapter-utils/src/debug.ts similarity index 100% rename from query-engine/js-connectors/js/js-connector-utils/src/debug.ts rename to query-engine/driver-adapters/js/driver-adapter-utils/src/debug.ts diff --git a/query-engine/js-connectors/js/js-connector-utils/src/index.ts b/query-engine/driver-adapters/js/driver-adapter-utils/src/index.ts similarity index 71% rename from query-engine/js-connectors/js/js-connector-utils/src/index.ts rename to query-engine/driver-adapters/js/driver-adapter-utils/src/index.ts index 704d996280e..ce04822473d 100644 --- a/query-engine/js-connectors/js/js-connector-utils/src/index.ts +++ b/query-engine/driver-adapters/js/driver-adapter-utils/src/index.ts @@ -1,4 +1,4 @@ -export { bindConnector } from './binder' +export { bindAdapter } from './binder' export { ColumnTypeEnum } from './const' export { Debug } from './debug' export type * from './types' diff --git a/query-engine/js-connectors/js/js-connector-utils/src/types.ts b/query-engine/driver-adapters/js/driver-adapter-utils/src/types.ts similarity index 89% rename from query-engine/js-connectors/js/js-connector-utils/src/types.ts rename to query-engine/driver-adapters/js/driver-adapter-utils/src/types.ts index 2d9522cf21f..826bc67acea 100644 --- a/query-engine/js-connectors/js/js-connector-utils/src/types.ts +++ b/query-engine/driver-adapters/js/driver-adapter-utils/src/types.ts @@ -66,7 +66,7 @@ export interface Queryable { executeRaw(params: Query): Promise> } -export interface Connector extends Queryable { +export interface DriverAdapter extends Queryable { /** * Starts new transation. */ @@ -97,20 +97,10 @@ export interface Transaction extends Queryable { rollback(): Promise> } -export interface ErrorCapturingConnector extends Connector { +export interface ErrorCapturingDriverAdapter extends DriverAdapter { readonly errorRegistry: ErrorRegistry } -/** - * Base configuration for a connector. - */ -export type ConnectorConfig = { - /** - * The connection string of the database server to connect to. - */ - url: string, -} - export interface ErrorRegistry { consumeError(id: number): ErrorRecord | undefined } diff --git a/query-engine/js-connectors/js/js-connector-utils/tsconfig.build.json b/query-engine/driver-adapters/js/driver-adapter-utils/tsconfig.build.json similarity index 100% rename from query-engine/js-connectors/js/js-connector-utils/tsconfig.build.json rename to query-engine/driver-adapters/js/driver-adapter-utils/tsconfig.build.json diff --git a/query-engine/js-connectors/js/planetscale-js-connector/tsconfig.json b/query-engine/driver-adapters/js/driver-adapter-utils/tsconfig.json similarity index 100% rename from query-engine/js-connectors/js/planetscale-js-connector/tsconfig.json rename to query-engine/driver-adapters/js/driver-adapter-utils/tsconfig.json diff --git a/query-engine/js-connectors/js/package.json b/query-engine/driver-adapters/js/package.json similarity index 100% rename from query-engine/js-connectors/js/package.json rename to query-engine/driver-adapters/js/package.json diff --git a/query-engine/js-connectors/js/pnpm-lock.yaml b/query-engine/driver-adapters/js/pnpm-lock.yaml similarity index 80% rename from query-engine/js-connectors/js/pnpm-lock.yaml rename to query-engine/driver-adapters/js/pnpm-lock.yaml index 33044059eb8..aec25fe0cce 100644 --- a/query-engine/js-connectors/js/pnpm-lock.yaml +++ b/query-engine/driver-adapters/js/pnpm-lock.yaml @@ -18,80 +18,94 @@ importers: specifier: ^5.1.6 version: 5.1.6 - js-connector-utils: + adapter-neon: dependencies: - debug: - specifier: ^4.3.4 - version: 4.3.4 - devDependencies: - '@types/debug': - specifier: ^4.1.8 - version: 4.1.8 - - neon-js-connector: - dependencies: - '@jkomyno/prisma-js-connector-utils': + '@jkomyno/prisma-driver-adapter-utils': specifier: workspace:* - version: link:../js-connector-utils + version: link:../driver-adapter-utils + devDependencies: '@neondatabase/serverless': specifier: ^0.6.0 version: 0.6.0 - ws: - specifier: ^8.13.0 - version: 8.13.0 - pg-js-connector: + adapter-pg: dependencies: - '@jkomyno/prisma-js-connector-utils': + '@jkomyno/prisma-driver-adapter-utils': specifier: workspace:* - version: link:../js-connector-utils - pg: - specifier: ^8.11.3 - version: 8.11.3 + version: link:../driver-adapter-utils devDependencies: '@types/pg': specifier: ^8.10.2 version: 8.10.2 + pg: + specifier: ^8.11.3 + version: 8.11.3 - planetscale-js-connector: + adapter-planetscale: dependencies: - '@jkomyno/prisma-js-connector-utils': + '@jkomyno/prisma-driver-adapter-utils': specifier: workspace:* - version: link:../js-connector-utils + version: link:../driver-adapter-utils + devDependencies: '@planetscale/database': specifier: ^1.11.0 version: 1.11.0 + driver-adapter-utils: + dependencies: + debug: + specifier: ^4.3.4 + version: 4.3.4 + devDependencies: + '@types/debug': + specifier: ^4.1.8 + version: 4.1.8 + smoke-test-js: dependencies: - '@jkomyno/prisma-js-connector-utils': + '@jkomyno/prisma-adapter-neon': specifier: workspace:* - version: link:../js-connector-utils - '@jkomyno/prisma-neon-js-connector': + version: link:../adapter-neon + '@jkomyno/prisma-adapter-pg': specifier: workspace:* - version: link:../neon-js-connector - '@jkomyno/prisma-pg-js-connector': + version: link:../adapter-pg + '@jkomyno/prisma-adapter-planetscale': specifier: workspace:* - version: link:../pg-js-connector - '@jkomyno/prisma-planetscale-js-connector': + version: link:../adapter-planetscale + '@jkomyno/prisma-driver-adapter-utils': specifier: workspace:* - version: link:../planetscale-js-connector + version: link:../driver-adapter-utils + '@neondatabase/serverless': + specifier: ^0.6.0 + version: 0.6.0 + '@planetscale/database': + specifier: ^1.11.0 + version: 1.11.0 '@prisma/client': - specifier: 5.3.0-integration-feat-js-connectors-in-client.13 - version: 5.3.0-integration-feat-js-connectors-in-client.13(prisma@5.3.0-integration-feat-js-connectors-in-client.13) + specifier: 5.3.0-integration-feat-js-connectors-in-client.14 + version: 5.3.0-integration-feat-js-connectors-in-client.14(prisma@5.3.0-integration-feat-js-connectors-in-client.14) + pg: + specifier: ^8.11.3 + version: 8.11.3 superjson: specifier: ^1.13.1 version: 1.13.1 + undici: + specifier: ^5.23.0 + version: 5.23.0 devDependencies: '@types/node': specifier: ^20.5.1 version: 20.5.1 + '@types/pg': + specifier: ^8.10.2 + version: 8.10.2 cross-env: specifier: ^7.0.3 version: 7.0.3 prisma: - specifier: 5.3.0-integration-feat-js-connectors-in-client.13 - version: 5.3.0-integration-feat-js-connectors-in-client.13 + specifier: 5.3.0-integration-feat-js-connectors-in-client.14 + version: 5.3.0-integration-feat-js-connectors-in-client.14 tsx: specifier: ^3.12.7 version: 3.12.7 @@ -101,33 +115,24 @@ packages: /@esbuild-kit/cjs-loader@2.4.2: resolution: {integrity: sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==} dependencies: - '@esbuild-kit/core-utils': 3.1.0 + '@esbuild-kit/core-utils': 3.2.2 get-tsconfig: 4.7.0 dev: true - /@esbuild-kit/core-utils@3.1.0: - resolution: {integrity: sha512-Uuk8RpCg/7fdHSceR1M6XbSZFSuMrxcePFuGgyvsBn+u339dk5OeL4jv2EojwTN2st/unJGsVm4qHWjWNmJ/tw==} + /@esbuild-kit/core-utils@3.2.2: + resolution: {integrity: sha512-Ub6LaRaAgF80dTSzUdXpFLM1pVDdmEVB9qb5iAzSpyDlX/mfJTFGOnZ516O05p5uWWteNviMKi4PAyEuRxI5gA==} dependencies: - esbuild: 0.17.19 + esbuild: 0.18.20 source-map-support: 0.5.21 dev: true /@esbuild-kit/esm-loader@2.5.5: resolution: {integrity: sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==} dependencies: - '@esbuild-kit/core-utils': 3.1.0 + '@esbuild-kit/core-utils': 3.2.2 get-tsconfig: 4.7.0 dev: true - /@esbuild/android-arm64@0.17.19: - resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm64@0.18.20: resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} @@ -137,15 +142,6 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.17.19: - resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm@0.18.20: resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} engines: {node: '>=12'} @@ -155,15 +151,6 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.17.19: - resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-x64@0.18.20: resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} engines: {node: '>=12'} @@ -173,15 +160,6 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.17.19: - resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-arm64@0.18.20: resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} engines: {node: '>=12'} @@ -191,15 +169,6 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.17.19: - resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-x64@0.18.20: resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} engines: {node: '>=12'} @@ -209,15 +178,6 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.17.19: - resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-arm64@0.18.20: resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} engines: {node: '>=12'} @@ -227,15 +187,6 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.17.19: - resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-x64@0.18.20: resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} engines: {node: '>=12'} @@ -245,15 +196,6 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.17.19: - resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm64@0.18.20: resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} engines: {node: '>=12'} @@ -263,15 +205,6 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.17.19: - resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm@0.18.20: resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} engines: {node: '>=12'} @@ -281,15 +214,6 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.17.19: - resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ia32@0.18.20: resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} engines: {node: '>=12'} @@ -299,15 +223,6 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.17.19: - resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-loong64@0.18.20: resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} engines: {node: '>=12'} @@ -317,15 +232,6 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.17.19: - resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-mips64el@0.18.20: resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} engines: {node: '>=12'} @@ -335,15 +241,6 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.17.19: - resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ppc64@0.18.20: resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} engines: {node: '>=12'} @@ -353,15 +250,6 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.17.19: - resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-riscv64@0.18.20: resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} engines: {node: '>=12'} @@ -371,15 +259,6 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.17.19: - resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-s390x@0.18.20: resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} engines: {node: '>=12'} @@ -389,15 +268,6 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.17.19: - resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-x64@0.18.20: resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} engines: {node: '>=12'} @@ -407,15 +277,6 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.17.19: - resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-x64@0.18.20: resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} engines: {node: '>=12'} @@ -425,15 +286,6 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.17.19: - resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.18.20: resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} engines: {node: '>=12'} @@ -443,15 +295,6 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.17.19: - resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - /@esbuild/sunos-x64@0.18.20: resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} engines: {node: '>=12'} @@ -461,15 +304,6 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.17.19: - resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-arm64@0.18.20: resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} engines: {node: '>=12'} @@ -479,15 +313,6 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.17.19: - resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.18.20: resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} engines: {node: '>=12'} @@ -497,15 +322,6 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.17.19: - resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.18.20: resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} engines: {node: '>=12'} @@ -549,7 +365,6 @@ packages: resolution: {integrity: sha512-qXxBRYN0m2v8kVQBfMxbzNGn2xFAhTXFibzQlE++NfJ56Shz3m7+MyBBtXDlEH+3Wfa6lToDXf1MElocY4sJ3w==} dependencies: '@types/pg': 8.6.6 - dev: false /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -575,10 +390,9 @@ packages: /@planetscale/database@1.11.0: resolution: {integrity: sha512-aWbU+D/IRHoDE9975y+Q4c+EwwAWxCPwFId+N1AhQVFXzbeJMkj6KN2iQtoi03elcLMRdfT+V3i9Z4WRw+/oIA==} engines: {node: '>=16'} - dev: false - /@prisma/client@5.3.0-integration-feat-js-connectors-in-client.13(prisma@5.3.0-integration-feat-js-connectors-in-client.13): - resolution: {integrity: sha512-jGfBWy89/dWm9crA4BxK6ET4oh49DZ1lpOrpRSAv3oGPm7hpISoUcW6GZ8dDhluIANQqSTA8NfIJyN6jSMm1DQ==} + /@prisma/client@5.3.0-integration-feat-js-connectors-in-client.14(prisma@5.3.0-integration-feat-js-connectors-in-client.14): + resolution: {integrity: sha512-aqjbrbyHKpLOn26bUb+tXTDmI9E7sHtETHYuPfcHY8EHE1QAVBul3TRyGWC2103EK95laHzj4u4tZhBpDqGpxg==} engines: {node: '>=16.13'} requiresBuild: true peerDependencies: @@ -587,16 +401,16 @@ packages: prisma: optional: true dependencies: - '@prisma/engines-version': 5.3.0-22.6473dadba8a7fff9689b35ad2ca9f9e5aff4d0d0 - prisma: 5.3.0-integration-feat-js-connectors-in-client.13 + '@prisma/engines-version': 5.3.0-26.d9219f681466628572cc39c0e41647dcf8b6c3b2 + prisma: 5.3.0-integration-feat-js-connectors-in-client.14 dev: false - /@prisma/engines-version@5.3.0-22.6473dadba8a7fff9689b35ad2ca9f9e5aff4d0d0: - resolution: {integrity: sha512-Osd1JsYW04EyLalEJemXArlSrmVo/Lod0xndl5yvB0D/aw36M0+wjbJFZSlOn5BnN8FyM5/yIIJGsXlx+LxEMg==} + /@prisma/engines-version@5.3.0-26.d9219f681466628572cc39c0e41647dcf8b6c3b2: + resolution: {integrity: sha512-XLBwUSx4JmvmlMvs25dZvx5CWCUjxL/aPRQ8AacWwVJdSprCbvDVQ6JVoQAVY+sEz1iQCO32opFprX1HN/xk2Q==} dev: false - /@prisma/engines@5.3.0-integration-feat-js-connectors-in-client.13: - resolution: {integrity: sha512-L9S4tBjlQvn92XNxK2W4ZMe3dN2kfKP/iWQ+h5TqYBHcOXFHBHCH2H8bLoN05h7+ba9tE7kBxPHLSCDkhxHayQ==} + /@prisma/engines@5.3.0-integration-feat-js-connectors-in-client.14: + resolution: {integrity: sha512-df3W2myjZoS6XuT/4pIqHvXM8AM8tFgYj4WosF1o5LmIodOqmxUctr9shOdxbyXkosL7Bj8z6cXRGvB0Yrv4VA==} requiresBuild: true /@types/debug@4.1.8: @@ -626,7 +440,6 @@ packages: '@types/node': 20.5.1 pg-protocol: 1.6.0 pg-types: 2.2.0 - dev: false /any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} @@ -675,7 +488,6 @@ packages: /buffer-writer@2.0.0: resolution: {integrity: sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==} engines: {node: '>=4'} - dev: false /bundle-require@4.0.1(esbuild@0.18.20): resolution: {integrity: sha512-9NQkRHlNdNpDBGmLpngF3EFDcwodhMUuLz9PaWYciVcQF9SE4LFjM2DB/xV1Li5JiuDMv7ZUWuC3rGbqR0MAXQ==} @@ -687,6 +499,13 @@ packages: load-tsconfig: 0.2.5 dev: true + /busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + dependencies: + streamsearch: 1.1.0 + dev: false + /cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -758,36 +577,6 @@ packages: path-type: 4.0.0 dev: true - /esbuild@0.17.19: - resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.17.19 - '@esbuild/android-arm64': 0.17.19 - '@esbuild/android-x64': 0.17.19 - '@esbuild/darwin-arm64': 0.17.19 - '@esbuild/darwin-x64': 0.17.19 - '@esbuild/freebsd-arm64': 0.17.19 - '@esbuild/freebsd-x64': 0.17.19 - '@esbuild/linux-arm': 0.17.19 - '@esbuild/linux-arm64': 0.17.19 - '@esbuild/linux-ia32': 0.17.19 - '@esbuild/linux-loong64': 0.17.19 - '@esbuild/linux-mips64el': 0.17.19 - '@esbuild/linux-ppc64': 0.17.19 - '@esbuild/linux-riscv64': 0.17.19 - '@esbuild/linux-s390x': 0.17.19 - '@esbuild/linux-x64': 0.17.19 - '@esbuild/netbsd-x64': 0.17.19 - '@esbuild/openbsd-x64': 0.17.19 - '@esbuild/sunos-x64': 0.17.19 - '@esbuild/win32-arm64': 0.17.19 - '@esbuild/win32-ia32': 0.17.19 - '@esbuild/win32-x64': 0.17.19 - dev: true - /esbuild@0.18.20: resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} engines: {node: '>=12'} @@ -1067,7 +856,6 @@ packages: /packet-reader@1.0.0: resolution: {integrity: sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==} - dev: false /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} @@ -1087,12 +875,10 @@ packages: /pg-cloudflare@1.1.1: resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} requiresBuild: true - dev: false optional: true /pg-connection-string@2.6.2: resolution: {integrity: sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==} - dev: false /pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} @@ -1109,7 +895,6 @@ packages: pg: '>=8.0' dependencies: pg: 8.11.3 - dev: false /pg-protocol@1.6.0: resolution: {integrity: sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==} @@ -1123,7 +908,6 @@ packages: postgres-bytea: 1.0.0 postgres-date: 1.0.7 postgres-interval: 1.2.0 - dev: false /pg-types@4.0.1: resolution: {integrity: sha512-hRCSDuLII9/LE3smys1hRHcu5QGcLs9ggT7I/TCs0IE+2Eesxi9+9RWAAwZ0yaGjxoWICF/YHLOEjydGujoJ+g==} @@ -1156,13 +940,11 @@ packages: pgpass: 1.0.5 optionalDependencies: pg-cloudflare: 1.1.1 - dev: false /pgpass@1.0.5: resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} dependencies: split2: 4.2.0 - dev: false /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -1193,7 +975,6 @@ packages: /postgres-array@2.0.0: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} engines: {node: '>=4'} - dev: false /postgres-array@3.0.2: resolution: {integrity: sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==} @@ -1203,7 +984,6 @@ packages: /postgres-bytea@1.0.0: resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} engines: {node: '>=0.10.0'} - dev: false /postgres-bytea@3.0.0: resolution: {integrity: sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==} @@ -1215,7 +995,6 @@ packages: /postgres-date@1.0.7: resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} engines: {node: '>=0.10.0'} - dev: false /postgres-date@2.0.1: resolution: {integrity: sha512-YtMKdsDt5Ojv1wQRvUhnyDJNSr2dGIC96mQVKz7xufp07nfuFONzdaowrMHjlAzY6GDLd4f+LUHHAAM1h4MdUw==} @@ -1227,7 +1006,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: xtend: 4.0.2 - dev: false /postgres-interval@3.0.0: resolution: {integrity: sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==} @@ -1238,13 +1016,13 @@ packages: resolution: {integrity: sha512-VdlZoocy5lCP0c/t66xAfclglEapXPCIVhqqJRncYpvbCgImF0w67aPKfbqUMr72tO2k5q0TdTZwCLjPTI6C9g==} dev: true - /prisma@5.3.0-integration-feat-js-connectors-in-client.13: - resolution: {integrity: sha512-X8s/HoMYv4WnK1w1Ce5ybplj5jWUmIUFBspoyGwpoJW3YUH7Z19f1/3UriSiQIZgnLI5PdpxWxTD42Z8pONUzQ==} + /prisma@5.3.0-integration-feat-js-connectors-in-client.14: + resolution: {integrity: sha512-Br/43izjbTSzYyrB1lOlPm2wwNoOTI/aNtAKlg2Q+YX1HrmXkogBbAiK2ZJ6P/HahZoa3DcGPURy1Fsxd7kaPA==} engines: {node: '>=16.13'} hasBin: true requiresBuild: true dependencies: - '@prisma/engines': 5.3.0-integration-feat-js-connectors-in-client.13 + '@prisma/engines': 5.3.0-integration-feat-js-connectors-in-client.14 /punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} @@ -1333,6 +1111,10 @@ packages: /split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} + + /streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} dev: false /strip-final-newline@2.0.0: @@ -1437,7 +1219,7 @@ packages: hasBin: true dependencies: '@esbuild-kit/cjs-loader': 2.4.2 - '@esbuild-kit/core-utils': 3.1.0 + '@esbuild-kit/core-utils': 3.2.2 '@esbuild-kit/esm-loader': 2.5.5 optionalDependencies: fsevents: 2.3.3 @@ -1449,6 +1231,13 @@ packages: hasBin: true dev: true + /undici@5.23.0: + resolution: {integrity: sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==} + engines: {node: '>=14.0'} + dependencies: + busboy: 1.6.0 + dev: false + /webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} dev: true @@ -1473,23 +1262,9 @@ packages: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true - /ws@8.13.0: - resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: false - /xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} - dev: false /yaml@2.3.1: resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} diff --git a/query-engine/driver-adapters/js/pnpm-workspace.yaml b/query-engine/driver-adapters/js/pnpm-workspace.yaml new file mode 100644 index 00000000000..6a17ebd231f --- /dev/null +++ b/query-engine/driver-adapters/js/pnpm-workspace.yaml @@ -0,0 +1,6 @@ +packages: + - './adapter-neon' + - './adapter-planetscale' + - './adapter-pg' + - './driver-adapter-utils' + - './smoke-test-js' diff --git a/query-engine/js-connectors/js/smoke-test-js/.envrc.example b/query-engine/driver-adapters/js/smoke-test-js/.envrc.example similarity index 100% rename from query-engine/js-connectors/js/smoke-test-js/.envrc.example rename to query-engine/driver-adapters/js/smoke-test-js/.envrc.example diff --git a/query-engine/js-connectors/js/smoke-test-js/README.md b/query-engine/driver-adapters/js/smoke-test-js/README.md similarity index 100% rename from query-engine/js-connectors/js/smoke-test-js/README.md rename to query-engine/driver-adapters/js/smoke-test-js/README.md diff --git a/query-engine/js-connectors/js/smoke-test-js/package.json b/query-engine/driver-adapters/js/smoke-test-js/package.json similarity index 66% rename from query-engine/js-connectors/js/smoke-test-js/package.json rename to query-engine/driver-adapters/js/smoke-test-js/package.json index cd46082f5bf..59682c5a96a 100644 --- a/query-engine/js-connectors/js/smoke-test-js/package.json +++ b/query-engine/driver-adapters/js/smoke-test-js/package.json @@ -10,8 +10,10 @@ "prisma:db:push:mysql": "prisma db push --schema ./prisma/mysql/schema.prisma --force-reset", "prisma:db:execute:mysql": "prisma db execute --schema ./prisma/mysql/schema.prisma --file ./prisma/mysql/commands/type_test/insert.sql", "prisma:neon": "cross-env-shell DATABASE_URL=\"${JS_NEON_DATABASE_URL}\" \"pnpm prisma:db:push:postgres && pnpm prisma:db:execute:postgres\"", - "neon": "cross-env-shell DATABASE_URL=\"${JS_NEON_DATABASE_URL}\" \"tsx ./src/libquery/neon.ts\"", - "neon:client": "DATABASE_URL=\"${JS_NEON_DATABASE_URL}\" node --test --loader=tsx ./src/client/neon.test.ts", + "neon:ws": "cross-env-shell DATABASE_URL=\"${JS_NEON_DATABASE_URL}\" \"tsx ./src/libquery/neon.ws.ts\"", + "neon:http": "cross-env-shell DATABASE_URL=\"${JS_NEON_DATABASE_URL}\" \"tsx ./src/libquery/neon.http.ts\"", + "neon:ws:client": "DATABASE_URL=\"${JS_NEON_DATABASE_URL}\" node --test --loader=tsx ./src/client/neon.ws.test.ts", + "neon:http:client": "DATABASE_URL=\"${JS_NEON_DATABASE_URL}\" node --test --loader=tsx ./src/client/neon.http.test.ts", "prisma:pg": "cross-env-shell DATABASE_URL=\"${JS_PG_DATABASE_URL}\" \"pnpm prisma:db:push:postgres && pnpm prisma:db:execute:postgres\"", "pg": "cross-env-shell DATABASE_URL=\"${JS_PG_DATABASE_URL}\" \"tsx ./src/libquery/pg.ts\"", "pg:client": "DATABASE_URL=\"${JS_PG_DATABASE_URL}\" node --test --loader=tsx ./src/client/pg.test.ts", @@ -24,17 +26,22 @@ "license": "Apache-2.0", "sideEffects": true, "dependencies": { - "@jkomyno/prisma-js-connector-utils": "workspace:*", - "@jkomyno/prisma-neon-js-connector": "workspace:*", - "@jkomyno/prisma-pg-js-connector": "workspace:*", - "@jkomyno/prisma-planetscale-js-connector": "workspace:*", - "@prisma/client": "5.3.0-integration-feat-js-connectors-in-client.13", - "superjson": "^1.13.1" + "@jkomyno/prisma-adapter-neon": "workspace:*", + "@jkomyno/prisma-adapter-planetscale": "workspace:*", + "@jkomyno/prisma-adapter-pg": "workspace:*", + "@jkomyno/prisma-driver-adapter-utils": "workspace:*", + "@neondatabase/serverless": "^0.6.0", + "@planetscale/database": "^1.11.0", + "@prisma/client": "5.3.0-integration-feat-js-connectors-in-client.14", + "pg": "^8.11.3", + "superjson": "^1.13.1", + "undici": "^5.23.0" }, "devDependencies": { "@types/node": "^20.5.1", + "@types/pg": "^8.10.2", "cross-env": "^7.0.3", - "prisma": "5.3.0-integration-feat-js-connectors-in-client.13", + "prisma": "5.3.0-integration-feat-js-connectors-in-client.14", "tsx": "^3.12.7" } } diff --git a/query-engine/js-connectors/js/smoke-test-js/prisma/mysql/commands/type_test/insert.sql b/query-engine/driver-adapters/js/smoke-test-js/prisma/mysql/commands/type_test/insert.sql similarity index 100% rename from query-engine/js-connectors/js/smoke-test-js/prisma/mysql/commands/type_test/insert.sql rename to query-engine/driver-adapters/js/smoke-test-js/prisma/mysql/commands/type_test/insert.sql diff --git a/query-engine/js-connectors/js/smoke-test-js/prisma/mysql/schema.prisma b/query-engine/driver-adapters/js/smoke-test-js/prisma/mysql/schema.prisma similarity index 98% rename from query-engine/js-connectors/js/smoke-test-js/prisma/mysql/schema.prisma rename to query-engine/driver-adapters/js/smoke-test-js/prisma/mysql/schema.prisma index 7de112bb71e..6681f70e6c6 100644 --- a/query-engine/js-connectors/js/smoke-test-js/prisma/mysql/schema.prisma +++ b/query-engine/driver-adapters/js/smoke-test-js/prisma/mysql/schema.prisma @@ -1,5 +1,6 @@ generator client { - provider = "prisma-client-js" + provider = "prisma-client-js" + previewFeatures = ["driverAdapters"] } datasource db { diff --git a/query-engine/js-connectors/js/smoke-test-js/prisma/postgres/commands/type_test/insert.sql b/query-engine/driver-adapters/js/smoke-test-js/prisma/postgres/commands/type_test/insert.sql similarity index 100% rename from query-engine/js-connectors/js/smoke-test-js/prisma/postgres/commands/type_test/insert.sql rename to query-engine/driver-adapters/js/smoke-test-js/prisma/postgres/commands/type_test/insert.sql diff --git a/query-engine/js-connectors/js/smoke-test-js/prisma/postgres/schema.prisma b/query-engine/driver-adapters/js/smoke-test-js/prisma/postgres/schema.prisma similarity index 97% rename from query-engine/js-connectors/js/smoke-test-js/prisma/postgres/schema.prisma rename to query-engine/driver-adapters/js/smoke-test-js/prisma/postgres/schema.prisma index 920b18ff7a6..c2564af557e 100644 --- a/query-engine/js-connectors/js/smoke-test-js/prisma/postgres/schema.prisma +++ b/query-engine/driver-adapters/js/smoke-test-js/prisma/postgres/schema.prisma @@ -1,5 +1,6 @@ generator client { - provider = "prisma-client-js" + provider = "prisma-client-js" + previewFeatures = ["driverAdapters"] } datasource db { diff --git a/query-engine/js-connectors/js/smoke-test-js/src/client/client.ts b/query-engine/driver-adapters/js/smoke-test-js/src/client/client.ts similarity index 77% rename from query-engine/js-connectors/js/smoke-test-js/src/client/client.ts rename to query-engine/driver-adapters/js/smoke-test-js/src/client/client.ts index 9f6b2188ed5..8367b43a7ac 100644 --- a/query-engine/js-connectors/js/smoke-test-js/src/client/client.ts +++ b/query-engine/driver-adapters/js/smoke-test-js/src/client/client.ts @@ -1,10 +1,10 @@ import { describe, it } from 'node:test' import assert from 'node:assert' import { PrismaClient } from '@prisma/client' -import { ErrorCapturingConnector } from '@jkomyno/prisma-js-connector-utils' +import type { DriverAdapter } from '@jkomyno/prisma-driver-adapter-utils' -export async function smokeTestClient(connector: ErrorCapturingConnector) { - const provider = connector.flavour +export async function smokeTestClient(driverAdapter: DriverAdapter) { + const provider = driverAdapter.flavour const log = [ { @@ -13,12 +13,13 @@ export async function smokeTestClient(connector: ErrorCapturingConnector) { } as const, ] - for (const jsConnector of [connector, undefined]) { - const isUsingJsConnector = jsConnector !== undefined - describe(isUsingJsConnector ? `using JS Connectors` : `using Rust drivers`, () => { + for (const adapter of [driverAdapter, undefined]) { + const isUsingDriverAdapters = adapter !== undefined + describe(isUsingDriverAdapters ? `using Driver Adapters` : `using Rust drivers`, () => { it('batch queries', async () => { const prisma = new PrismaClient({ - jsConnector, + // @ts-ignore + jsConnector: adapter, log, }) @@ -39,7 +40,7 @@ export async function smokeTestClient(connector: ErrorCapturingConnector) { 'COMMIT', ] - const jsConnectorExpectedQueries = [ + const driverAdapterExpectedQueries = [ '-- Implicit "BEGIN" query via underlying driver', 'SELECT 1', 'SELECT 2', @@ -57,13 +58,13 @@ export async function smokeTestClient(connector: ErrorCapturingConnector) { ] if (['mysql'].includes(provider)) { - if (isUsingJsConnector) { - assert.deepEqual(queries, jsConnectorExpectedQueries) + if (isUsingDriverAdapters) { + assert.deepEqual(queries, driverAdapterExpectedQueries) } else { assert.deepEqual(queries, defaultExpectedQueries) } } else if (['postgres'].includes(provider)) { - if (isUsingJsConnector) { + if (isUsingDriverAdapters) { assert.deepEqual(queries, defaultExpectedQueries) } else { assert.deepEqual(queries, postgresExpectedQueries) @@ -73,7 +74,8 @@ export async function smokeTestClient(connector: ErrorCapturingConnector) { it('applies isolation level when using batch $transaction', async () => { const prisma = new PrismaClient({ - jsConnector, + // @ts-ignore + jsConnector: adapter, log, }) diff --git a/query-engine/driver-adapters/js/smoke-test-js/src/client/neon.http.test.ts b/query-engine/driver-adapters/js/smoke-test-js/src/client/neon.http.test.ts new file mode 100644 index 00000000000..e2de75384b3 --- /dev/null +++ b/query-engine/driver-adapters/js/smoke-test-js/src/client/neon.http.test.ts @@ -0,0 +1,16 @@ +import { describe } from 'node:test' +import { neon } from '@neondatabase/serverless' +import { PrismaNeonHTTP } from '@jkomyno/prisma-adapter-neon' +import { smokeTestClient } from './client' + +describe('neon with @prisma/client', async () => { + const connectionString = `${process.env.JS_NEON_DATABASE_URL as string}` + + const connection = neon(connectionString, { + arrayMode: false, + fullResults: true, + }) + const adapter = new PrismaNeonHTTP(connection) + + smokeTestClient(adapter) +}) diff --git a/query-engine/driver-adapters/js/smoke-test-js/src/client/neon.ws.test.ts b/query-engine/driver-adapters/js/smoke-test-js/src/client/neon.ws.test.ts new file mode 100644 index 00000000000..fddc42eeade --- /dev/null +++ b/query-engine/driver-adapters/js/smoke-test-js/src/client/neon.ws.test.ts @@ -0,0 +1,16 @@ +import { describe } from 'node:test' +import { Pool, neonConfig } from '@neondatabase/serverless' +import { PrismaNeon } from '@jkomyno/prisma-adapter-neon' +import { WebSocket } from 'undici' +import { smokeTestClient } from './client' + +neonConfig.webSocketConstructor = WebSocket + +describe('neon with @prisma/client', async () => { + const connectionString = `${process.env.JS_NEON_DATABASE_URL as string}` + + const pool = new Pool({ connectionString }) + const adapter = new PrismaNeon(pool) + + smokeTestClient(adapter) +}) diff --git a/query-engine/js-connectors/js/smoke-test-js/src/client/pg.test.ts b/query-engine/driver-adapters/js/smoke-test-js/src/client/pg.test.ts similarity index 52% rename from query-engine/js-connectors/js/smoke-test-js/src/client/pg.test.ts rename to query-engine/driver-adapters/js/smoke-test-js/src/client/pg.test.ts index 61ca30f9831..a6652d71437 100644 --- a/query-engine/js-connectors/js/smoke-test-js/src/client/pg.test.ts +++ b/query-engine/driver-adapters/js/smoke-test-js/src/client/pg.test.ts @@ -1,13 +1,13 @@ -import { createPgConnector } from '@jkomyno/prisma-pg-js-connector' import { describe } from 'node:test' +import pg from 'pg' +import { PrismaPg } from '@jkomyno/prisma-adapter-pg' import { smokeTestClient } from './client' describe('pg with @prisma/client', async () => { const connectionString = `${process.env.JS_PG_DATABASE_URL as string}` - const jsConnector = createPgConnector({ - url: connectionString, - }) - - smokeTestClient(jsConnector) + const pool = new pg.Pool({ connectionString }) + const adapter = new PrismaPg(pool) + + smokeTestClient(adapter) }) diff --git a/query-engine/driver-adapters/js/smoke-test-js/src/client/planetscale.test.ts b/query-engine/driver-adapters/js/smoke-test-js/src/client/planetscale.test.ts new file mode 100644 index 00000000000..07a9809b8c0 --- /dev/null +++ b/query-engine/driver-adapters/js/smoke-test-js/src/client/planetscale.test.ts @@ -0,0 +1,13 @@ +import { connect } from '@planetscale/database' +import { PrismaPlanetScale } from '@jkomyno/prisma-adapter-planetscale' +import { describe } from 'node:test' +import { smokeTestClient } from './client' + +describe('planetscale with @prisma/client', async () => { + const connectionString = `${process.env.JS_PLANETSCALE_DATABASE_URL as string}` + + const connnection = connect({ url: connectionString }) + const adapter = new PrismaPlanetScale(connnection) + + smokeTestClient(adapter) +}) diff --git a/query-engine/js-connectors/js/smoke-test-js/src/engines/types/JsonProtocol.ts b/query-engine/driver-adapters/js/smoke-test-js/src/engines/types/JsonProtocol.ts similarity index 100% rename from query-engine/js-connectors/js/smoke-test-js/src/engines/types/JsonProtocol.ts rename to query-engine/driver-adapters/js/smoke-test-js/src/engines/types/JsonProtocol.ts diff --git a/query-engine/js-connectors/js/smoke-test-js/src/engines/types/Library.ts b/query-engine/driver-adapters/js/smoke-test-js/src/engines/types/Library.ts similarity index 83% rename from query-engine/js-connectors/js/smoke-test-js/src/engines/types/Library.ts rename to query-engine/driver-adapters/js/smoke-test-js/src/engines/types/Library.ts index 6b40040fc87..a8f1c28bb64 100644 --- a/query-engine/js-connectors/js/smoke-test-js/src/engines/types/Library.ts +++ b/query-engine/driver-adapters/js/smoke-test-js/src/engines/types/Library.ts @@ -1,4 +1,4 @@ -import type { ErrorCapturingConnector } from '@jkomyno/prisma-js-connector-utils' +import type { ErrorCapturingDriverAdapter } from '@jkomyno/prisma-driver-adapter-utils' import type { QueryEngineConfig } from './QueryEngine' export type QueryEngineInstance = { @@ -18,7 +18,11 @@ export type QueryEngineInstance = { } export interface QueryEngineConstructor { - new(config: QueryEngineConfig, logger: (log: string) => void, nodejsFnCtx?: ErrorCapturingConnector): QueryEngineInstance + new( + config: QueryEngineConfig, + logger: (log: string) => void, + driverAdapter?: ErrorCapturingDriverAdapter, + ): QueryEngineInstance } export interface LibraryLoader { diff --git a/query-engine/js-connectors/js/smoke-test-js/src/engines/types/QueryEngine.ts b/query-engine/driver-adapters/js/smoke-test-js/src/engines/types/QueryEngine.ts similarity index 100% rename from query-engine/js-connectors/js/smoke-test-js/src/engines/types/QueryEngine.ts rename to query-engine/driver-adapters/js/smoke-test-js/src/engines/types/QueryEngine.ts diff --git a/query-engine/js-connectors/js/smoke-test-js/src/engines/types/Transaction.ts b/query-engine/driver-adapters/js/smoke-test-js/src/engines/types/Transaction.ts similarity index 100% rename from query-engine/js-connectors/js/smoke-test-js/src/engines/types/Transaction.ts rename to query-engine/driver-adapters/js/smoke-test-js/src/engines/types/Transaction.ts diff --git a/query-engine/js-connectors/js/smoke-test-js/src/libquery/libquery.ts b/query-engine/driver-adapters/js/smoke-test-js/src/libquery/libquery.ts similarity index 97% rename from query-engine/js-connectors/js/smoke-test-js/src/libquery/libquery.ts rename to query-engine/driver-adapters/js/smoke-test-js/src/libquery/libquery.ts index e3a3c2d6bd8..724f0438fd9 100644 --- a/query-engine/js-connectors/js/smoke-test-js/src/libquery/libquery.ts +++ b/query-engine/driver-adapters/js/smoke-test-js/src/libquery/libquery.ts @@ -1,10 +1,10 @@ import { setTimeout } from 'node:timers/promises' -import type { ErrorCapturingConnector } from '@jkomyno/prisma-js-connector-utils' +import type { ErrorCapturingDriverAdapter } from '@jkomyno/prisma-driver-adapter-utils' import type { QueryEngineInstance } from '../engines/types/Library' import { initQueryEngine } from './util' import { JsonQuery } from '../engines/types/JsonProtocol' -export async function smokeTestLibquery(db: ErrorCapturingConnector, prismaSchemaRelativePath: string) { +export async function smokeTestLibquery(db: ErrorCapturingDriverAdapter, prismaSchemaRelativePath: string) { const engine = initQueryEngine(db, prismaSchemaRelativePath) console.log('[nodejs] connecting...') @@ -43,9 +43,9 @@ export async function smokeTestLibquery(db: ErrorCapturingConnector, prismaSchem } class SmokeTest { - readonly flavour: ErrorCapturingConnector['flavour'] + readonly flavour: ErrorCapturingDriverAdapter['flavour'] - constructor(private readonly engine: QueryEngineInstance, private readonly connector: ErrorCapturingConnector) { + constructor(private readonly engine: QueryEngineInstance, private readonly connector: ErrorCapturingDriverAdapter) { this.flavour = connector.flavour } diff --git a/query-engine/driver-adapters/js/smoke-test-js/src/libquery/neon.http.ts b/query-engine/driver-adapters/js/smoke-test-js/src/libquery/neon.http.ts new file mode 100644 index 00000000000..755289dcd42 --- /dev/null +++ b/query-engine/driver-adapters/js/smoke-test-js/src/libquery/neon.http.ts @@ -0,0 +1,23 @@ +import { PrismaNeonHTTP } from '@jkomyno/prisma-adapter-neon' +import { bindAdapter } from '@jkomyno/prisma-driver-adapter-utils' +import { neon } from '@neondatabase/serverless' +import { smokeTestLibquery } from './libquery' + +async function main() { + const connectionString = `${process.env.JS_NEON_DATABASE_URL as string}` + + const neonConnection = neon(connectionString, { + arrayMode: false, + fullResults: true, + }) + + const adapter = new PrismaNeonHTTP(neonConnection) + const driverAdapter = bindAdapter(adapter) + + await smokeTestLibquery(driverAdapter, '../../prisma/postgres/schema.prisma') +} + +main().catch((e) => { + console.error(e) + process.exit(1) +}) diff --git a/query-engine/driver-adapters/js/smoke-test-js/src/libquery/neon.ws.ts b/query-engine/driver-adapters/js/smoke-test-js/src/libquery/neon.ws.ts new file mode 100644 index 00000000000..888f29d35e2 --- /dev/null +++ b/query-engine/driver-adapters/js/smoke-test-js/src/libquery/neon.ws.ts @@ -0,0 +1,22 @@ +import { PrismaNeon } from '@jkomyno/prisma-adapter-neon' +import { bindAdapter } from '@jkomyno/prisma-driver-adapter-utils' +import { WebSocket } from 'undici' +import { Pool, neonConfig } from '@neondatabase/serverless' +import { smokeTestLibquery } from './libquery' + +neonConfig.webSocketConstructor = WebSocket + +async function main() { + const connectionString = `${process.env.JS_NEON_DATABASE_URL as string}` + + const pool = new Pool({ connectionString }) + const adapter = new PrismaNeon(pool) + const driverAdapter = bindAdapter(adapter) + + await smokeTestLibquery(driverAdapter, '../../prisma/postgres/schema.prisma') +} + +main().catch((e) => { + console.error(e) + process.exit(1) +}) diff --git a/query-engine/driver-adapters/js/smoke-test-js/src/libquery/pg.ts b/query-engine/driver-adapters/js/smoke-test-js/src/libquery/pg.ts new file mode 100644 index 00000000000..cc657ddbca3 --- /dev/null +++ b/query-engine/driver-adapters/js/smoke-test-js/src/libquery/pg.ts @@ -0,0 +1,19 @@ +import pg from 'pg' +import { PrismaPg } from '@jkomyno/prisma-adapter-pg' +import { bindAdapter } from '@jkomyno/prisma-driver-adapter-utils' +import { smokeTestLibquery } from './libquery' + +async function main() { + const connectionString = `${process.env.JS_PG_DATABASE_URL as string}` + + const pool = new pg.Pool({ connectionString }) + const adapter = new PrismaPg(pool) + const driverAdapter = bindAdapter(adapter) + + await smokeTestLibquery(driverAdapter, '../../prisma/postgres/schema.prisma') +} + +main().catch((e) => { + console.error(e) + process.exit(1) +}) diff --git a/query-engine/driver-adapters/js/smoke-test-js/src/libquery/planetscale.ts b/query-engine/driver-adapters/js/smoke-test-js/src/libquery/planetscale.ts new file mode 100644 index 00000000000..971c3fa0fb8 --- /dev/null +++ b/query-engine/driver-adapters/js/smoke-test-js/src/libquery/planetscale.ts @@ -0,0 +1,19 @@ +import { connect } from '@planetscale/database' +import { PrismaPlanetScale } from '@jkomyno/prisma-adapter-planetscale' +import { bindAdapter } from '@jkomyno/prisma-driver-adapter-utils' +import { smokeTestLibquery } from './libquery' + +async function main() { + const connectionString = `${process.env.JS_PLANETSCALE_DATABASE_URL as string}` + + const planetscale = connect({ url: connectionString }) + const adapter = new PrismaPlanetScale(planetscale) + const driverAdapter = bindAdapter(adapter) + + await smokeTestLibquery(driverAdapter, '../../prisma/mysql/schema.prisma') +} + +main().catch((e) => { + console.error(e) + process.exit(1) +}) diff --git a/query-engine/js-connectors/js/smoke-test-js/src/libquery/util.ts b/query-engine/driver-adapters/js/smoke-test-js/src/libquery/util.ts similarity index 84% rename from query-engine/js-connectors/js/smoke-test-js/src/libquery/util.ts rename to query-engine/driver-adapters/js/smoke-test-js/src/libquery/util.ts index c3a5b66b3fe..187d8b86c7f 100644 --- a/query-engine/js-connectors/js/smoke-test-js/src/libquery/util.ts +++ b/query-engine/driver-adapters/js/smoke-test-js/src/libquery/util.ts @@ -1,10 +1,10 @@ import path from 'node:path' import os from 'node:os' import fs from 'node:fs' -import type { ErrorCapturingConnector } from '@jkomyno/prisma-js-connector-utils' +import type { ErrorCapturingDriverAdapter } from '@jkomyno/prisma-driver-adapter-utils' import { Library, QueryEngineInstance } from '../engines/types/Library' -export function initQueryEngine(driver: ErrorCapturingConnector, prismaSchemaRelativePath: string): QueryEngineInstance { +export function initQueryEngine(driver: ErrorCapturingDriverAdapter, prismaSchemaRelativePath: string): QueryEngineInstance { // I assume nobody will run this on Windows ¯\_(ツ)_/¯ const libExt = os.platform() === 'darwin' ? 'dylib' : 'so' const dirname = path.dirname(new URL(import.meta.url).pathname) diff --git a/query-engine/driver-adapters/js/smoke-test-js/tsconfig.json b/query-engine/driver-adapters/js/smoke-test-js/tsconfig.json new file mode 100644 index 00000000000..3c43903cfdd --- /dev/null +++ b/query-engine/driver-adapters/js/smoke-test-js/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "../tsconfig.json" +} diff --git a/query-engine/js-connectors/js/tsconfig.json b/query-engine/driver-adapters/js/tsconfig.json similarity index 79% rename from query-engine/js-connectors/js/tsconfig.json rename to query-engine/driver-adapters/js/tsconfig.json index 193b27d3648..b405cea5020 100644 --- a/query-engine/js-connectors/js/tsconfig.json +++ b/query-engine/driver-adapters/js/tsconfig.json @@ -1,9 +1,10 @@ { "compilerOptions": { - "target": "ES2020", - "module": "commonjs", - "lib": ["ES2020", "ES2021.WeakRef"], - "esModuleInterop": true, + "target": "ES2022", + "module": "ESNext", + "lib": ["ES2022"], + "moduleResolution": "Bundler", + "esModuleInterop": false, "isolatedModules": true, "sourceMap": true, "declaration": true, diff --git a/query-engine/js-connectors/src/async_js_function.rs b/query-engine/driver-adapters/src/async_js_function.rs similarity index 100% rename from query-engine/js-connectors/src/async_js_function.rs rename to query-engine/driver-adapters/src/async_js_function.rs diff --git a/query-engine/js-connectors/src/conversion.rs b/query-engine/driver-adapters/src/conversion.rs similarity index 100% rename from query-engine/js-connectors/src/conversion.rs rename to query-engine/driver-adapters/src/conversion.rs diff --git a/query-engine/js-connectors/src/error.rs b/query-engine/driver-adapters/src/error.rs similarity index 100% rename from query-engine/js-connectors/src/error.rs rename to query-engine/driver-adapters/src/error.rs diff --git a/query-engine/js-connectors/src/lib.rs b/query-engine/driver-adapters/src/lib.rs similarity index 82% rename from query-engine/js-connectors/src/lib.rs rename to query-engine/driver-adapters/src/lib.rs index 083d9b69005..6e29f9e6960 100644 --- a/query-engine/js-connectors/src/lib.rs +++ b/query-engine/driver-adapters/src/lib.rs @@ -1,8 +1,8 @@ -//! Query Engine JS Connectors +//! Query Engine Driver Adapters //! This crate is responsible for defining a quaint::Connector implementation that uses functions //! exposed by client connectors via N-API. //! -//! A JsConnector is an object defined in javascript that uses a driver +//! A driver adapter is an object defined in javascript that uses a driver //! (ex. '@planetscale/database') to provide a similar implementation of that of a quaint Connector. i.e. the ability to query and execute SQL //! plus some transformation of types to adhere to what a quaint::Value expresses. //! diff --git a/query-engine/js-connectors/src/proxy.rs b/query-engine/driver-adapters/src/proxy.rs similarity index 99% rename from query-engine/js-connectors/src/proxy.rs rename to query-engine/driver-adapters/src/proxy.rs index 1e2e4817235..bc17e296323 100644 --- a/query-engine/js-connectors/src/proxy.rs +++ b/query-engine/driver-adapters/src/proxy.rs @@ -329,9 +329,9 @@ impl CommonProxy { } impl DriverProxy { - pub fn new(js_connector: &JsObject) -> napi::Result { + pub fn new(driver_adapter: &JsObject) -> napi::Result { Ok(Self { - start_transaction: js_connector.get_named_property("startTransaction")?, + start_transaction: driver_adapter.get_named_property("startTransaction")?, }) } diff --git a/query-engine/js-connectors/src/queryable.rs b/query-engine/driver-adapters/src/queryable.rs similarity index 100% rename from query-engine/js-connectors/src/queryable.rs rename to query-engine/driver-adapters/src/queryable.rs diff --git a/query-engine/js-connectors/src/result.rs b/query-engine/driver-adapters/src/result.rs similarity index 81% rename from query-engine/js-connectors/src/result.rs rename to query-engine/driver-adapters/src/result.rs index c4aedd2b781..a5965509ef8 100644 --- a/query-engine/js-connectors/src/result.rs +++ b/query-engine/driver-adapters/src/result.rs @@ -5,14 +5,14 @@ use serde::Deserialize; #[derive(Deserialize, Debug)] #[serde(tag = "kind")] /// Wrapper for JS-side errors -/// See js-connectors/js-connector-utils/types file for example -pub(crate) enum JsConnectorError { +/// See driver-adapters/js/adapter-utils/src/types.ts file for example +pub(crate) enum DriverAdapterError { /// Unexpected JS exception GenericJsError { id: i32 }, // in the future, expected errors that map to known user errors with PXXX codes will also go here } -impl FromNapiValue for JsConnectorError { +impl FromNapiValue for DriverAdapterError { unsafe fn from_napi_value(napi_env: napi::sys::napi_env, napi_val: napi::sys::napi_value) -> napi::Result { let env = Env::from_raw(napi_env); let value = JsUnknown::from_raw(napi_env, napi_val)?; @@ -20,23 +20,23 @@ impl FromNapiValue for JsConnectorError { } } -impl From for QuaintError { - fn from(value: JsConnectorError) -> Self { +impl From for QuaintError { + fn from(value: DriverAdapterError) -> Self { match value { - JsConnectorError::GenericJsError { id } => QuaintError::external_error(id), + DriverAdapterError::GenericJsError { id } => QuaintError::external_error(id), // in future, more error types would be added and we'll need to convert them to proper QuaintErrors here } } } /// Wrapper for JS-side result type -/// See js-connectors/js-connector-utils/types file for example +/// See driver-adapters/js/adapter-utils/src/types.ts file for example pub(crate) enum JsResult where T: FromNapiValue, { Ok(T), - Err(JsConnectorError), + Err(DriverAdapterError), } impl JsResult diff --git a/query-engine/js-connectors/src/transaction.rs b/query-engine/driver-adapters/src/transaction.rs similarity index 100% rename from query-engine/js-connectors/src/transaction.rs rename to query-engine/driver-adapters/src/transaction.rs diff --git a/query-engine/js-connectors/js/README.md b/query-engine/js-connectors/js/README.md deleted file mode 100644 index 712f9d8a113..00000000000 --- a/query-engine/js-connectors/js/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# Prisma JS Connectors - -This TypeScript monorepo contains the following packages: -- `@jkomyno/prisma-js-connector-utils` (later: `@prisma/js-connector-utils`) - - Internal set of utilities and types for Prisma's JS Connectors. -- `@jkomyno/prisma-neon-js-connector` (later: `@prisma/neon-js-connector`) - - Prisma's JS Connector that wraps the `@neondatabase/serverless` driver - - Exposes debug logs via `DEBUG="prisma:js-connector:neon"` -- `@jkomyno/prisma-planetscale-js-connector` (later: `@prisma/planetscale-js-connector`) - - Prisma's JS Connector that wraps the `@planetscale/database` driver - - Exposes debug logs via `DEBUG="prisma:js-connector:planetscale"` - -## Get Started - -We assume Node.js `v18.16.1`+ is installed. If not, run `nvm use` in the current directory. -This is very important to double-check if you have multiple versions installed, as PlanetScale requires either Node.js `v18.16.1`+ or a custom `fetch` function. - -Install `pnpm` via: - -```sh -npm i -g pnpm -``` - -## Development - -- Install Node.js dependencies via `pnpm i` -- Build and link TypeScript packages via `pnpm build` -- Publish packages to `npm` via `pnpm publish -r` diff --git a/query-engine/js-connectors/js/neon-js-connector/src/index.ts b/query-engine/js-connectors/js/neon-js-connector/src/index.ts deleted file mode 100644 index dd7f77d442b..00000000000 --- a/query-engine/js-connectors/js/neon-js-connector/src/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { createNeonConnector } from './neon' -export type { PrismaNeonConfig } from './neon' diff --git a/query-engine/js-connectors/js/pg-js-connector/src/index.ts b/query-engine/js-connectors/js/pg-js-connector/src/index.ts deleted file mode 100644 index 5cd1386f493..00000000000 --- a/query-engine/js-connectors/js/pg-js-connector/src/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { createPgConnector } from './pg' -export type { PrismaPgConfig } from './pg' diff --git a/query-engine/js-connectors/js/planetscale-js-connector/README.md b/query-engine/js-connectors/js/planetscale-js-connector/README.md deleted file mode 100644 index 1d2606ebc0a..00000000000 --- a/query-engine/js-connectors/js/planetscale-js-connector/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# @prisma/planetscale-js-connector - -**INTERNAL PACKAGE, DO NOT USE** diff --git a/query-engine/js-connectors/js/planetscale-js-connector/src/index.ts b/query-engine/js-connectors/js/planetscale-js-connector/src/index.ts deleted file mode 100644 index a7119cecac6..00000000000 --- a/query-engine/js-connectors/js/planetscale-js-connector/src/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { createPlanetScaleConnector } from './planetscale' -export type { PrismaPlanetScaleConfig } from './planetscale' diff --git a/query-engine/js-connectors/js/pnpm-workspace.yaml b/query-engine/js-connectors/js/pnpm-workspace.yaml deleted file mode 100644 index 6b96c3cb533..00000000000 --- a/query-engine/js-connectors/js/pnpm-workspace.yaml +++ /dev/null @@ -1,6 +0,0 @@ -packages: - - './js-connector-utils' - - './pg-js-connector' - - './planetscale-js-connector' - - './neon-js-connector' - - './smoke-test-js' diff --git a/query-engine/js-connectors/js/smoke-test-js/src/client/neon.test.ts b/query-engine/js-connectors/js/smoke-test-js/src/client/neon.test.ts deleted file mode 100644 index 3cf18d21026..00000000000 --- a/query-engine/js-connectors/js/smoke-test-js/src/client/neon.test.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { createNeonConnector } from '@jkomyno/prisma-neon-js-connector' -import { describe } from 'node:test' -import { smokeTestClient } from './client' - -describe('neon with @prisma/client', async () => { - const connectionString = `${process.env.JS_NEON_DATABASE_URL as string}` - - const jsConnector = createNeonConnector({ - url: connectionString, - }) - - smokeTestClient(jsConnector) -}) diff --git a/query-engine/js-connectors/js/smoke-test-js/src/client/planetscale.test.ts b/query-engine/js-connectors/js/smoke-test-js/src/client/planetscale.test.ts deleted file mode 100644 index ad8fd293906..00000000000 --- a/query-engine/js-connectors/js/smoke-test-js/src/client/planetscale.test.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { createPlanetScaleConnector } from '@jkomyno/prisma-planetscale-js-connector' -import { describe } from 'node:test' -import { smokeTestClient } from './client' - -describe('planetscale with @prisma/client', async () => { - const connectionString = `${process.env.JS_PLANETSCALE_DATABASE_URL as string}` - - const jsConnector = createPlanetScaleConnector({ - url: connectionString, - }) - - smokeTestClient(jsConnector) -}) diff --git a/query-engine/js-connectors/js/smoke-test-js/src/libquery/neon.ts b/query-engine/js-connectors/js/smoke-test-js/src/libquery/neon.ts deleted file mode 100644 index 7fb153dde6e..00000000000 --- a/query-engine/js-connectors/js/smoke-test-js/src/libquery/neon.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { createNeonConnector } from '@jkomyno/prisma-neon-js-connector' -import { smokeTestLibquery } from './libquery' - -async function neon() { - const connectionString = `${process.env.JS_NEON_DATABASE_URL as string}` - - const db = createNeonConnector({ - url: connectionString, - httpMode: false, - }) - - await smokeTestLibquery(db, '../../prisma/postgres/schema.prisma') -} - -neon().catch((e) => { - console.error(e) - process.exit(1) -}) diff --git a/query-engine/js-connectors/js/smoke-test-js/src/libquery/pg.ts b/query-engine/js-connectors/js/smoke-test-js/src/libquery/pg.ts deleted file mode 100644 index e1b8d924dcc..00000000000 --- a/query-engine/js-connectors/js/smoke-test-js/src/libquery/pg.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { createPgConnector } from '@jkomyno/prisma-pg-js-connector' -import { smokeTestLibquery } from './libquery' - -async function pg() { - const connectionString = `${process.env.JS_PG_DATABASE_URL as string}` - - const db = createPgConnector({ - url: connectionString, - }) - - await smokeTestLibquery(db, '../../prisma/postgres/schema.prisma') -} - -pg().catch((e) => { - console.error(e) - process.exit(1) -}) diff --git a/query-engine/js-connectors/js/smoke-test-js/src/libquery/planetscale.ts b/query-engine/js-connectors/js/smoke-test-js/src/libquery/planetscale.ts deleted file mode 100644 index e75f1fcead9..00000000000 --- a/query-engine/js-connectors/js/smoke-test-js/src/libquery/planetscale.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { createPlanetScaleConnector } from '@jkomyno/prisma-planetscale-js-connector' -import { smokeTestLibquery } from './libquery' - -async function planetscale() { - const connectionString = `${process.env.JS_PLANETSCALE_DATABASE_URL as string}` - - const db = createPlanetScaleConnector({ - url: connectionString, - }) - - await smokeTestLibquery(db, '../../prisma/mysql/schema.prisma') -} - -planetscale().catch((e) => { - console.error(e) - process.exit(1) -}) diff --git a/query-engine/js-connectors/js/smoke-test-js/tsconfig.json b/query-engine/js-connectors/js/smoke-test-js/tsconfig.json deleted file mode 100644 index 0080d3b715d..00000000000 --- a/query-engine/js-connectors/js/smoke-test-js/tsconfig.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "target": "ES2022", - "module": "ESNext", - "lib": ["ES2020", "ES2021.WeakRef"], - "moduleResolution": "NodeNext", - "esModuleInterop": true, - "isolatedModules": true, - "sourceMap": true, - "declaration": true, - "strict": true, - "noImplicitAny": false, - "noUncheckedIndexedAccess": false, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "useUnknownInCatchVariables": false, - "skipDefaultLibCheck": true, - "skipLibCheck": true, - "emitDeclarationOnly": true, - "resolveJsonModule": true - } -} diff --git a/query-engine/query-engine-node-api/Cargo.toml b/query-engine/query-engine-node-api/Cargo.toml index 3031c20f8d8..74f9686189f 100644 --- a/query-engine/query-engine-node-api/Cargo.toml +++ b/query-engine/query-engine-node-api/Cargo.toml @@ -9,9 +9,9 @@ crate-type = ["cdylib"] name = "query_engine" [features] -default = ["js-connectors"] +default = ["driver-adapters"] vendored-openssl = ["sql-connector/vendored-openssl"] -js-connectors = ["request-handlers/js-connectors", "sql-connector/js-connectors"] +driver-adapters = ["request-handlers/driver-adapters", "sql-connector/driver-adapters"] [dependencies] anyhow = "1" @@ -23,7 +23,7 @@ user-facing-errors = { path = "../../libs/user-facing-errors" } psl.workspace = true sql-connector = { path = "../connectors/sql-query-connector", package = "sql-query-connector" } prisma-models = { path = "../prisma-models" } -js-connectors = { path = "../js-connectors" } +driver-adapters = { path = "../driver-adapters" } napi.workspace = true napi-derive.workspace = true diff --git a/query-engine/query-engine-node-api/src/engine.rs b/query-engine/query-engine-node-api/src/engine.rs index e535da37106..37baeaee2c6 100644 --- a/query-engine/query-engine-node-api/src/engine.rs +++ b/query-engine/query-engine-node-api/src/engine.rs @@ -169,24 +169,33 @@ impl QueryEngine { let overrides: Vec<(_, _)> = datasource_overrides.into_iter().collect(); let mut schema = psl::validate(datamodel.into()); - let mut connector_mode = ConnectorMode::Rust; + let config = &mut schema.configuration; + let preview_features = config.preview_features(); - #[cfg(feature = "js-connectors")] - if let Some(driver) = maybe_driver { - let js_queryable = js_connectors::from_napi(driver); - let provider_name = schema.connector.provider_name(); + let mut connector_mode = ConnectorMode::Rust; - match sql_connector::register_js_connector(provider_name, Arc::new(js_queryable)) { - Ok(_) => { - connector_mode = ConnectorMode::Js; - tracing::info!("Registered js connector for {provider_name}") + if !preview_features.contains(PreviewFeature::DriverAdapters) { + tracing::info!( + "Please enable the {} preview feature to use driver adapters.", + PreviewFeature::DriverAdapters + ); + } else { + #[cfg(feature = "driver-adapters")] + if let Some(driver) = maybe_driver { + let js_queryable = driver_adapters::from_napi(driver); + let provider_name = schema.connector.provider_name(); + + match sql_connector::register_driver_adapter(provider_name, Arc::new(js_queryable)) { + Ok(_) => { + connector_mode = ConnectorMode::Js; + tracing::info!("Registered driver adapter for {provider_name}.") + } + Err(err) => tracing::error!("Failed to register driver adapter for {provider_name}. {err}"), } - Err(err) => tracing::error!("Failed to registered js connector for {provider_name}. {err}"), } } let connector_mode = connector_mode; - let config = &mut schema.configuration; schema .diagnostics diff --git a/query-engine/request-handlers/Cargo.toml b/query-engine/request-handlers/Cargo.toml index 41568f126be..f5fb433b13b 100644 --- a/query-engine/request-handlers/Cargo.toml +++ b/query-engine/request-handlers/Cargo.toml @@ -35,7 +35,7 @@ codspeed-criterion-compat = "1.1.0" default = ["mongodb", "sql"] mongodb = ["mongodb-query-connector"] sql = ["sql-query-connector"] -js-connectors = ["sql-query-connector"] +driver-adapters = ["sql-query-connector"] [[bench]] name = "query_planning_bench" diff --git a/query-engine/request-handlers/src/load_executor.rs b/query-engine/request-handlers/src/load_executor.rs index 3658885c985..6d4dec48228 100644 --- a/query-engine/request-handlers/src/load_executor.rs +++ b/query-engine/request-handlers/src/load_executor.rs @@ -18,8 +18,8 @@ pub async fn load( url: &str, ) -> query_core::Result> { if connector_mode == ConnectorMode::Js { - #[cfg(feature = "js-connectors")] - return jsconnector(source, url, features).await; + #[cfg(feature = "driver-adapters")] + return driver_adapter(source, url, features).await; } match source.active_provider { @@ -110,14 +110,14 @@ async fn mongodb( Ok(executor_for(mongo, false)) } -#[cfg(feature = "js-connectors")] -async fn jsconnector( +#[cfg(feature = "driver-adapters")] +async fn driver_adapter( source: &Datasource, url: &str, features: PreviewFeatures, ) -> Result, query_core::CoreError> { - trace!("Loading js connector ..."); + trace!("Loading driver adapter..."); let js = Js::from_source(source, url, features).await?; - trace!("Loaded js connector ..."); + trace!("Loaded driver adapter..."); Ok(executor_for(js, false)) }