From d526df2e58faf567e409f4dfab6a0bfee6c2e1b7 Mon Sep 17 00:00:00 2001 From: ecyrbe Date: Wed, 26 Jun 2024 04:11:50 +0200 Subject: [PATCH] feature: add cloudflare @effect/sql-d1 package (#3045) --- .changeset/clever-walls-smoke.md | 5 + packages/sql-d1/CHANGELOG.md | 1 + packages/sql-d1/LICENSE | 21 +++ packages/sql-d1/README.md | 5 + packages/sql-d1/docgen.json | 6 + packages/sql-d1/package.json | 60 +++++++ packages/sql-d1/src/D1Client.ts | 194 ++++++++++++++++++++++ packages/sql-d1/src/index.ts | 4 + packages/sql-d1/test/Client.test.ts | 43 +++++ packages/sql-d1/test/Resolver.test.ts | 169 +++++++++++++++++++ packages/sql-d1/test/utils.ts | 41 +++++ packages/sql-d1/tsconfig.build.json | 13 ++ packages/sql-d1/tsconfig.examples.json | 15 ++ packages/sql-d1/tsconfig.json | 9 + packages/sql-d1/tsconfig.src.json | 10 ++ packages/sql-d1/tsconfig.test.json | 15 ++ packages/sql-d1/vitest.config.ts | 6 + pnpm-lock.yaml | 220 ++++++++++++++++++++++++- tsconfig.base.json | 11 +- tsconfig.build.json | 1 + tsconfig.json | 1 + vitest.shared.ts | 1 + 22 files changed, 847 insertions(+), 4 deletions(-) create mode 100644 .changeset/clever-walls-smoke.md create mode 100644 packages/sql-d1/CHANGELOG.md create mode 100644 packages/sql-d1/LICENSE create mode 100644 packages/sql-d1/README.md create mode 100644 packages/sql-d1/docgen.json create mode 100644 packages/sql-d1/package.json create mode 100644 packages/sql-d1/src/D1Client.ts create mode 100644 packages/sql-d1/src/index.ts create mode 100644 packages/sql-d1/test/Client.test.ts create mode 100644 packages/sql-d1/test/Resolver.test.ts create mode 100644 packages/sql-d1/test/utils.ts create mode 100644 packages/sql-d1/tsconfig.build.json create mode 100644 packages/sql-d1/tsconfig.examples.json create mode 100644 packages/sql-d1/tsconfig.json create mode 100644 packages/sql-d1/tsconfig.src.json create mode 100644 packages/sql-d1/tsconfig.test.json create mode 100644 packages/sql-d1/vitest.config.ts diff --git a/.changeset/clever-walls-smoke.md b/.changeset/clever-walls-smoke.md new file mode 100644 index 00000000000..5920c21aed0 --- /dev/null +++ b/.changeset/clever-walls-smoke.md @@ -0,0 +1,5 @@ +--- +"@effect/sql-d1": minor +--- + +Add new cloudflare @effect/sql-d1 package diff --git a/packages/sql-d1/CHANGELOG.md b/packages/sql-d1/CHANGELOG.md new file mode 100644 index 00000000000..b0ddc6f6039 --- /dev/null +++ b/packages/sql-d1/CHANGELOG.md @@ -0,0 +1 @@ +# @effect/sql-d1 diff --git a/packages/sql-d1/LICENSE b/packages/sql-d1/LICENSE new file mode 100644 index 00000000000..7f6fe480f77 --- /dev/null +++ b/packages/sql-d1/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023-present The Contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/sql-d1/README.md b/packages/sql-d1/README.md new file mode 100644 index 00000000000..8d9d6bb3975 --- /dev/null +++ b/packages/sql-d1/README.md @@ -0,0 +1,5 @@ +# Effect SQL - Cloudflare D1 + +An @effect/sql implementation using cloudflare D1. + +See here for more information: https://github.com/Effect-TS/effect/tree/main/packages/sql diff --git a/packages/sql-d1/docgen.json b/packages/sql-d1/docgen.json new file mode 100644 index 00000000000..f980a32f522 --- /dev/null +++ b/packages/sql-d1/docgen.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../node_modules/@effect/docgen/schema.json", + "exclude": [ + "src/internal/**/*.ts" + ] +} diff --git a/packages/sql-d1/package.json b/packages/sql-d1/package.json new file mode 100644 index 00000000000..3044aeb3c3f --- /dev/null +++ b/packages/sql-d1/package.json @@ -0,0 +1,60 @@ +{ + "name": "@effect/sql-d1", + "version": "0.0.1", + "type": "module", + "license": "MIT", + "description": "A Cloudflare D1 integration for Effect", + "homepage": "https://effect.website", + "repository": { + "type": "git", + "url": "https://github.com/Effect-TS/effect.git", + "directory": "packages/sql-d1" + }, + "bugs": { + "url": "https://github.com/Effect-TS/effect/issues" + }, + "tags": [ + "typescript", + "sql", + "database", + "cloudflare", + "D1" + ], + "keywords": [ + "typescript", + "sql", + "database", + "cloudflare", + "D1" + ], + "publishConfig": { + "access": "public", + "directory": "dist", + "provenance": true + }, + "scripts": { + "codegen": "build-utils prepare-v2", + "build": "pnpm build-esm && pnpm build-cjs && pnpm build-annotate && build-utils pack-v2", + "build-esm": "tsc -b tsconfig.build.json", + "build-cjs": "babel build/esm --plugins @babel/transform-export-namespace-from --plugins @babel/transform-modules-commonjs --out-dir build/cjs --source-maps", + "build-annotate": "babel build --plugins annotate-pure-calls --out-dir build --source-maps", + "check": "tsc -b tsconfig.json", + "test": "vitest", + "coverage": "vitest --coverage" + }, + "devDependencies": { + "@effect/platform": "workspace:^", + "@effect/sql": "workspace:^", + "effect": "workspace:^", + "miniflare": "^3.20240610.1" + }, + "peerDependencies": { + "@effect/platform": "workspace:^", + "@effect/sql": "workspace:^", + "effect": "workspace:^" + }, + "dependencies": { + "@cloudflare/workers-types": "^4.20240620.0", + "@opentelemetry/semantic-conventions": "^1.24.1" + } +} diff --git a/packages/sql-d1/src/D1Client.ts b/packages/sql-d1/src/D1Client.ts new file mode 100644 index 00000000000..2505d2df223 --- /dev/null +++ b/packages/sql-d1/src/D1Client.ts @@ -0,0 +1,194 @@ +/** + * @since 1.0.0 + */ +import type { D1Database, D1PreparedStatement } from "@cloudflare/workers-types" +import * as Client from "@effect/sql/SqlClient" +import type { Connection } from "@effect/sql/SqlConnection" +import { SqlError } from "@effect/sql/SqlError" +import * as Statement from "@effect/sql/Statement" +import * as Otel from "@opentelemetry/semantic-conventions" +import * as Cache from "effect/Cache" +import * as Config from "effect/Config" +import type { ConfigError } from "effect/ConfigError" +import * as Context from "effect/Context" +import * as Duration from "effect/Duration" +import * as Effect from "effect/Effect" +import { identity } from "effect/Function" +import * as Layer from "effect/Layer" +import type * as Scope from "effect/Scope" + +/** + * @category type ids + * @since 1.0.0 + */ +export const TypeId: unique symbol = Symbol.for("@effect/sql-d1/D1Client") + +/** + * @category type ids + * @since 1.0.0 + */ +export type TypeId = typeof TypeId + +/** + * @category models + * @since 1.0.0 + */ +export interface D1Client extends Client.SqlClient { + readonly [TypeId]: TypeId + readonly config: D1ClientConfig + + /** Not supported in d1 */ + readonly updateValues: never +} + +/** + * @category tags + * @since 1.0.0 + */ +export const D1Client = Context.GenericTag("@effect/sql-d1/D1Client") + +/** + * @category models + * @since 1.0.0 + */ +export interface D1ClientConfig { + readonly db: D1Database + readonly prepareCacheSize?: number | undefined + readonly prepareCacheTTL?: Duration.DurationInput | undefined + readonly spanAttributes?: Record | undefined + + readonly transformResultNames?: ((str: string) => string) | undefined + readonly transformQueryNames?: ((str: string) => string) | undefined +} + +/** + * @category constructor + * @since 1.0.0 + */ +export const make = ( + options: D1ClientConfig +): Effect.Effect => + Effect.gen(function*() { + const compiler = Statement.makeCompilerSqlite(options.transformQueryNames) + const transformRows = Statement.defaultTransforms( + options.transformResultNames! + ).array + + const makeConnection = Effect.gen(function*() { + const db = options.db + + const prepareCache = yield* Cache.make({ + capacity: options.prepareCacheSize ?? 200, + timeToLive: options.prepareCacheTTL ?? Duration.minutes(10), + lookup: (sql: string) => + Effect.try({ + try: () => db.prepare(sql), + catch: (error) => new SqlError({ error }) + }) + }) + + const runStatement = ( + statement: D1PreparedStatement, + params: ReadonlyArray = [] + ) => + Effect.tryPromise({ + try: async () => { + const response = await statement.bind(...params).all() + if (response.error) { + throw response.error + } + return response.results || [] + }, + catch: (error) => new SqlError({ error }) + }) + + const run = ( + sql: string, + params: ReadonlyArray = [] + ) => Effect.flatMap(prepareCache.get(sql), (s) => runStatement(s, params)) + + const runRaw = ( + sql: string, + params: ReadonlyArray = [] + ) => Effect.map(runStatement(db.prepare(sql), params), transformRows) + + const runTransform = options.transformResultNames + ? (sql: string, params?: ReadonlyArray) => Effect.map(run(sql, params), transformRows) + : run + + const runValues = ( + sql: string, + params: ReadonlyArray + ) => + Effect.flatMap( + prepareCache.get(sql), + (statement) => + Effect.tryPromise({ + try: () => { + return statement.bind(...params).raw() as Promise< + ReadonlyArray< + ReadonlyArray + > + > + }, + catch: (error) => new SqlError({ error }) + }) + ) + + return identity({ + execute(sql, params) { + return runTransform(sql, params) + }, + executeValues(sql, params) { + return runValues(sql, params) + }, + executeWithoutTransform(sql, params) { + return run(sql, params) + }, + executeRaw(sql, params) { + return runRaw(sql, params) + }, + executeStream(_sql, _params) { + return Effect.dieMessage("executeStream not implemented") + } + }) + }) + + const connection = yield* makeConnection + const acquirer = Effect.succeed(connection) + const transactionAcquirer = Effect.dieMessage("transactions are not supported in D1") + + return Object.assign( + Client.make({ + acquirer, + compiler, + transactionAcquirer, + spanAttributes: [ + ...(options.spanAttributes ? Object.entries(options.spanAttributes) : []), + [Otel.SEMATTRS_DB_SYSTEM, Otel.DBSYSTEMVALUES_SQLITE] + ] + }) as D1Client, + { + [TypeId]: TypeId as TypeId, + config: options + } + ) + }) + +/** + * @category layers + * @since 1.0.0 + */ +export const layer = ( + config: Config.Config.Wrap +): Layer.Layer => + Layer.scopedContext( + Config.unwrap(config).pipe( + Effect.flatMap(make), + Effect.map((client) => + Context.make(D1Client, client).pipe( + Context.add(Client.SqlClient, client) + ) + ) + ) + ) diff --git a/packages/sql-d1/src/index.ts b/packages/sql-d1/src/index.ts new file mode 100644 index 00000000000..e7e1b4a838d --- /dev/null +++ b/packages/sql-d1/src/index.ts @@ -0,0 +1,4 @@ +/** + * @since 1.0.0 + */ +export * as D1Client from "./D1Client.js" diff --git a/packages/sql-d1/test/Client.test.ts b/packages/sql-d1/test/Client.test.ts new file mode 100644 index 00000000000..0f051842e3d --- /dev/null +++ b/packages/sql-d1/test/Client.test.ts @@ -0,0 +1,43 @@ +import { D1Client } from "@effect/sql-d1" +import { assert, describe, it } from "@effect/vitest" +import { Cause, Effect } from "effect" +import { D1Miniflare } from "./utils.js" + +describe("Client", () => { + it.scoped("should handle queries without transactions", () => + Effect.gen(function*() { + const sql = yield* D1Client.D1Client + yield* sql`CREATE TABLE test (id INTEGER PRIMARY KEY, name TEXT)` + yield* sql`INSERT INTO test (name) VALUES ('hello')` + let rows = yield* sql`SELECT * FROM test` + assert.deepStrictEqual(rows, [{ id: 1, name: "hello" }]) + yield* sql`INSERT INTO test (name) VALUES ('world')` + rows = yield* sql`SELECT * FROM test` + assert.deepStrictEqual(rows, [ + { id: 1, name: "hello" }, + { id: 2, name: "world" } + ]) + }).pipe(Effect.provide(D1Miniflare.ClientLive))) + + it.scoped("should handle queries with params without transactions", () => + Effect.gen(function*() { + const sql = yield* D1Client.D1Client + yield* sql`CREATE TABLE test (id INTEGER PRIMARY KEY, name TEXT)` + yield* sql`INSERT INTO test ${sql.insert({ name: "hello" })}` + const rows = yield* sql`SELECT * FROM test WHERE name = ${"hello"}` + assert.deepStrictEqual(rows, [{ id: 1, name: "hello" }]) + }).pipe(Effect.provide(D1Miniflare.ClientLive))) + + it.scoped("should defect on transactions", () => + Effect.gen(function*() { + const sql = yield* D1Client.D1Client + yield* sql`CREATE TABLE test (id INTEGER PRIMARY KEY, name TEXT)` + const res = yield* sql`INSERT INTO test ${sql.insert({ name: "hello" })}`.pipe( + sql.withTransaction, + Effect.catchAllDefect((defect) => Effect.succeed(defect)) + ) + const rows = yield* sql`SELECT * FROM test` + assert.deepStrictEqual(rows, []) + assert.equal(Cause.isRuntimeException(res), true) + }).pipe(Effect.provide(D1Miniflare.ClientLive))) +}) diff --git a/packages/sql-d1/test/Resolver.test.ts b/packages/sql-d1/test/Resolver.test.ts new file mode 100644 index 00000000000..96e0a73473e --- /dev/null +++ b/packages/sql-d1/test/Resolver.test.ts @@ -0,0 +1,169 @@ +import * as Schema from "@effect/schema/Schema" +import { SqlError, SqlResolver } from "@effect/sql" +import { D1Client } from "@effect/sql-d1" +import { assert, describe, it } from "@effect/vitest" +import { Array, Effect, Option } from "effect" +import { D1Miniflare } from "./utils.js" + +const seededClient = Effect.gen(function*(_) { + const sql = yield* D1Client.D1Client + yield* sql`CREATE TABLE test (id INTEGER PRIMARY KEY, name TEXT)` + yield* Effect.forEach(Array.range(1, 100), (id) => sql`INSERT INTO test ${sql.insert({ id, name: `name${id}` })}`) + return sql +}) + +describe("Resolver", () => { + describe("ordered", () => { + it.scoped("insert", () => + Effect.gen(function*(_) { + const batches: Array> = [] + const sql = yield* _(seededClient) + const Insert = yield* _(SqlResolver.ordered("Insert", { + Request: Schema.String, + Result: Schema.Struct({ id: Schema.Number, name: Schema.String }), + execute: (names) => { + batches.push(names) + return sql`INSERT INTO test ${sql.insert(names.map((name) => ({ name })))} RETURNING *` + } + })) + assert.deepStrictEqual( + yield* _(Effect.all({ + one: Insert.execute("one"), + two: Insert.execute("two") + }, { batching: true })), + { + one: { id: 101, name: "one" }, + two: { id: 102, name: "two" } + } + ) + assert.deepStrictEqual(batches, [["one", "two"]]) + }).pipe(Effect.provide(D1Miniflare.ClientLive))) + + it.scoped("result length mismatch", () => + Effect.gen(function*(_) { + const batches: Array> = [] + const sql = yield* _(seededClient) + const Select = yield* _(SqlResolver.ordered("Select", { + Request: Schema.Number, + Result: Schema.Struct({ id: Schema.Number, name: Schema.String }), + execute: (ids) => { + batches.push(ids) + return sql`SELECT * FROM test WHERE id IN ${sql.in(ids)}` + } + })) + const error = yield* _( + Effect.all([ + Select.execute(1), + Select.execute(2), + Select.execute(3), + Select.execute(101) + ], { batching: true }), + Effect.flip + ) + assert(error instanceof SqlError.ResultLengthMismatch) + assert.strictEqual(error.actual, 3) + assert.strictEqual(error.expected, 4) + assert.deepStrictEqual(batches, [[1, 2, 3, 101]]) + }).pipe(Effect.provide(D1Miniflare.ClientLive))) + }) + + describe("grouped", () => { + it.scoped("find by name", () => + Effect.gen(function*(_) { + const sql = yield* _(seededClient) + const FindByName = yield* _(SqlResolver.grouped("FindByName", { + Request: Schema.String, + RequestGroupKey: (name) => name, + Result: Schema.Struct({ id: Schema.Number, name: Schema.String }), + ResultGroupKey: (result) => result.name, + execute: (names) => sql`SELECT * FROM test WHERE name IN ${sql.in(names)}` + })) + yield* _(sql`INSERT INTO test ${sql.insert({ name: "name1" })}`) + assert.deepStrictEqual( + yield* _(Effect.all({ + one: FindByName.execute("name1"), + two: FindByName.execute("name2"), + three: FindByName.execute("name0") + }, { batching: true })), + { + one: [{ id: 1, name: "name1" }, { id: 101, name: "name1" }], + two: [{ id: 2, name: "name2" }], + three: [] + } + ) + }).pipe(Effect.provide(D1Miniflare.ClientLive))) + + it.scoped("using raw rows", () => + Effect.gen(function*(_) { + const sql = yield* _(seededClient) + const FindByName = yield* _(SqlResolver.grouped("FindByName", { + Request: Schema.String, + RequestGroupKey: (name) => name, + Result: Schema.Struct({ id: Schema.Number, name: Schema.String }), + ResultGroupKey: (_, result: any) => result.name, + execute: (names) => sql`SELECT * FROM test WHERE name IN ${sql.in(names)}` + })) + yield* _(sql`INSERT INTO test ${sql.insert({ name: "name1" })}`) + assert.deepStrictEqual( + yield* _(Effect.all({ + one: FindByName.execute("name1"), + two: FindByName.execute("name2"), + three: FindByName.execute("name0") + }, { batching: true })), + { + one: [{ id: 1, name: "name1" }, { id: 101, name: "name1" }], + two: [{ id: 2, name: "name2" }], + three: [] + } + ) + }).pipe(Effect.provide(D1Miniflare.ClientLive))) + }) + + describe("findById", () => { + it.scoped("find by id", () => + Effect.gen(function*(_) { + const sql = yield* _(seededClient) + const FindById = yield* _(SqlResolver.findById("FindById", { + Id: Schema.Number, + Result: Schema.Struct({ id: Schema.Number, name: Schema.String }), + ResultId: (result) => result.id, + execute: (ids) => sql`SELECT * FROM test WHERE id IN ${sql.in(ids)}` + })) + assert.deepStrictEqual( + yield* _(Effect.all({ + one: FindById.execute(1), + two: FindById.execute(2), + three: FindById.execute(101) + }, { batching: true })), + { + one: Option.some({ id: 1, name: "name1" }), + two: Option.some({ id: 2, name: "name2" }), + three: Option.none() + } + ) + }).pipe(Effect.provide(D1Miniflare.ClientLive))) + + it.scoped("using raw rows", () => + Effect.gen(function*(_) { + const sql = yield* _(seededClient) + const FindById = yield* _(SqlResolver.findById("FindById", { + Id: Schema.Number, + Result: Schema.Struct({ id: Schema.Number, name: Schema.String }), + ResultId: (_, result: any) => result.id, + execute: (ids) => sql`SELECT * FROM test WHERE id IN ${sql.in(ids)}` + })) + assert.deepStrictEqual( + yield* _(Effect.all({ + one: FindById.execute(1), + two: FindById.execute(2), + three: FindById.execute(101) + }, { batching: true })), + { + one: Option.some({ id: 1, name: "name1" }), + two: Option.some({ id: 2, name: "name2" }), + three: Option.none() + } + ) + }).pipe(Effect.provide(D1Miniflare.ClientLive))) + }) +}) diff --git a/packages/sql-d1/test/utils.ts b/packages/sql-d1/test/utils.ts new file mode 100644 index 00000000000..36dc43eaaf9 --- /dev/null +++ b/packages/sql-d1/test/utils.ts @@ -0,0 +1,41 @@ +import type { D1Database } from "@cloudflare/workers-types" +import { D1Client } from "@effect/sql-d1" +import { Config, Context, Data, Effect, Layer } from "effect" +import { Miniflare } from "miniflare" + +export class MiniflareError extends Data.TaggedError("MiniflareError")<{ + cause: unknown +}> {} + +export class D1Miniflare extends Context.Tag("test/D1Miniflare")< + D1Miniflare, + Miniflare +>() { + static Live = Layer.scoped( + this, + Effect.acquireRelease( + Effect.try({ + try: () => + new Miniflare({ + modules: true, + d1Databases: { + DB: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" + }, + script: "" + }), + catch: (cause) => new MiniflareError({ cause }) + }), + (miniflare) => Effect.promise(() => miniflare.dispose()) + ) + ) + + static ClientLive = Layer.unwrapEffect( + Effect.gen(function*() { + const miniflare = yield* D1Miniflare + const db: D1Database = yield* Effect.tryPromise(() => miniflare.getD1Database("DB")) + return D1Client.layer({ + db: Config.succeed(db) + }) + }) + ).pipe(Layer.provide(this.Live)) +} diff --git a/packages/sql-d1/tsconfig.build.json b/packages/sql-d1/tsconfig.build.json new file mode 100644 index 00000000000..8a5c6b4d6ee --- /dev/null +++ b/packages/sql-d1/tsconfig.build.json @@ -0,0 +1,13 @@ +{ + "extends": "./tsconfig.src.json", + "references": [ + { "path": "../effect/tsconfig.build.json" }, + { "path": "../sql/tsconfig.build.json" } + ], + "compilerOptions": { + "tsBuildInfoFile": ".tsbuildinfo/build.tsbuildinfo", + "outDir": "build/esm", + "declarationDir": "build/dts", + "stripInternal": true + } +} diff --git a/packages/sql-d1/tsconfig.examples.json b/packages/sql-d1/tsconfig.examples.json new file mode 100644 index 00000000000..119ff192eb9 --- /dev/null +++ b/packages/sql-d1/tsconfig.examples.json @@ -0,0 +1,15 @@ +{ + "extends": "../../tsconfig.base.json", + "include": ["examples"], + "references": [ + { "path": "tsconfig.src.json" }, + { "path": "../effect" }, + { "path": "../experimental" }, + { "path": "../sql" } + ], + "compilerOptions": { + "tsBuildInfoFile": ".tsbuildinfo/examples.tsbuildinfo", + "rootDir": "examples", + "noEmit": true + } +} diff --git a/packages/sql-d1/tsconfig.json b/packages/sql-d1/tsconfig.json new file mode 100644 index 00000000000..3edbf6b8a56 --- /dev/null +++ b/packages/sql-d1/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.base.json", + "include": [], + "references": [ + { "path": "tsconfig.src.json" }, + { "path": "tsconfig.test.json" }, + { "path": "tsconfig.examples.json" } + ] +} diff --git a/packages/sql-d1/tsconfig.src.json b/packages/sql-d1/tsconfig.src.json new file mode 100644 index 00000000000..424a843861e --- /dev/null +++ b/packages/sql-d1/tsconfig.src.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.base.json", + "include": ["src"], + "references": [{ "path": "../effect" }, { "path": "../sql" }], + "compilerOptions": { + "tsBuildInfoFile": ".tsbuildinfo/src.tsbuildinfo", + "rootDir": "src", + "outDir": "build/src" + } +} diff --git a/packages/sql-d1/tsconfig.test.json b/packages/sql-d1/tsconfig.test.json new file mode 100644 index 00000000000..9d0a40abeda --- /dev/null +++ b/packages/sql-d1/tsconfig.test.json @@ -0,0 +1,15 @@ +{ + "extends": "../../tsconfig.base.json", + "include": ["test"], + "references": [ + { "path": "tsconfig.src.json" }, + { "path": "../effect" }, + { "path": "../sql" }, + { "path": "../vitest" } + ], + "compilerOptions": { + "tsBuildInfoFile": ".tsbuildinfo/test.tsbuildinfo", + "rootDir": "test", + "noEmit": true + } +} diff --git a/packages/sql-d1/vitest.config.ts b/packages/sql-d1/vitest.config.ts new file mode 100644 index 00000000000..0411095f257 --- /dev/null +++ b/packages/sql-d1/vitest.config.ts @@ -0,0 +1,6 @@ +import { mergeConfig, type UserConfigExport } from "vitest/config" +import shared from "../../vitest.shared.js" + +const config: UserConfigExport = {} + +export default mergeConfig(shared, config) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2e14f256a3f..d9442011c62 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -576,6 +576,29 @@ importers: version: link:../effect/dist publishDirectory: dist + packages/sql-d1: + dependencies: + '@cloudflare/workers-types': + specifier: ^4.20240620.0 + version: 4.20240620.0 + '@opentelemetry/semantic-conventions': + specifier: ^1.24.1 + version: 1.25.1 + devDependencies: + '@effect/platform': + specifier: workspace:^ + version: link:../platform/dist + '@effect/sql': + specifier: workspace:^ + version: link:../sql/dist + effect: + specifier: workspace:^ + version: link:../effect/dist + miniflare: + specifier: ^3.20240610.1 + version: 3.20240610.1 + publishDirectory: dist + packages/sql-drizzle: devDependencies: '@effect/sql': @@ -589,7 +612,7 @@ importers: version: 10.10.0 drizzle-orm: specifier: ^0.31.2 - version: 0.31.2(@op-engineering/op-sqlite@6.0.7(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(react@18.3.1))(react@18.3.1))(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.10)(better-sqlite3@11.0.0)(bun-types@1.1.16)(mysql2@3.10.1)(postgres@3.4.4)(react@18.3.1) + version: 0.31.2(@cloudflare/workers-types@4.20240620.0)(@op-engineering/op-sqlite@6.0.7(react@18.3.1))(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.10)(better-sqlite3@11.0.0)(bun-types@1.1.16)(mysql2@3.10.1)(postgres@3.4.4)(react@18.3.1) effect: specifier: workspace:^ version: link:../effect/dist @@ -1675,6 +1698,43 @@ packages: '@changesets/write@0.3.1': resolution: {integrity: sha512-SyGtMXzH3qFqlHKcvFY2eX+6b0NGiFcNav8AFsYwy5l8hejOeoeTDemu5Yjmke2V5jpzY+pBvM0vCCQ3gdZpfw==} + '@cloudflare/workerd-darwin-64@1.20240610.1': + resolution: {integrity: sha512-YanZ1iXgMGaUWlleB5cswSE6qbzyjQ8O7ENWZcPAcZZ6BfuL7q3CWi0t9iM1cv2qx92rRztsRTyjcfq099++XQ==} + engines: {node: '>=16'} + cpu: [x64] + os: [darwin] + + '@cloudflare/workerd-darwin-arm64@1.20240610.1': + resolution: {integrity: sha512-bRe/y/LKjIgp3L2EHjc+CvoCzfHhf4aFTtOBkv2zW+VToNJ4KlXridndf7LvR9urfsFRRo9r4TXCssuKaU+ypQ==} + engines: {node: '>=16'} + cpu: [arm64] + os: [darwin] + + '@cloudflare/workerd-linux-64@1.20240610.1': + resolution: {integrity: sha512-2zDcadR7+Gs9SjcMXmwsMji2Xs+yASGNA2cEHDuFc4NMUup+eL1mkzxc/QzvFjyBck98e92rBjMZt2dVscpGKg==} + engines: {node: '>=16'} + cpu: [x64] + os: [linux] + + '@cloudflare/workerd-linux-arm64@1.20240610.1': + resolution: {integrity: sha512-7y41rPi5xmIYJN8CY+t3RHnjLL0xx/WYmaTd/j552k1qSr02eTE2o/TGyWZmGUC+lWnwdPQJla0mXbvdqgRdQg==} + engines: {node: '>=16'} + cpu: [arm64] + os: [linux] + + '@cloudflare/workerd-windows-64@1.20240610.1': + resolution: {integrity: sha512-B0LyT3DB6rXHWNptnntYHPaoJIy0rXnGfeDBM3nEVV8JIsQrx8MEFn2F2jYioH1FkUVavsaqKO/zUosY3tZXVA==} + engines: {node: '>=16'} + cpu: [x64] + os: [win32] + + '@cloudflare/workers-types@4.20240620.0': + resolution: {integrity: sha512-CQD8YS6evRob7LChvIX3gE3zYo0KVgaLDOu1SwNP1BVIS2Sa0b+FC8S1e1hhrNN8/E4chYlVN+FDAgA4KRDUEQ==} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + '@dependents/detective-less@4.1.0': resolution: {integrity: sha512-KrkT6qO5NxqNfy68sBl6CTSoJ4SNDIS5iQArkibhlbGU4LaDukZ3q2HIkh8aUKDio6o4itU4xDR7t82Y2eP1Bg==} engines: {node: '>=14'} @@ -1883,6 +1943,10 @@ packages: resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@fastify/busboy@2.1.1': + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + '@hapi/hoek@9.3.0': resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} @@ -1975,6 +2039,9 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@js-joda/core@5.6.3': resolution: {integrity: sha512-T1rRxzdqkEXcou0ZprN1q9yDRlvzCPLqmlNt5IIsGBzoEVgLCCYrKEwc84+TvsXuAc95VAZwtWD2zVsKPY4bcA==} @@ -2872,6 +2939,9 @@ packages: resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} engines: {node: '>= 0.4'} + as-table@1.0.55: + resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} + asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} @@ -3117,6 +3187,9 @@ packages: caniuse-lite@1.0.30001636: resolution: {integrity: sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==} + capnp-ts@0.7.0: + resolution: {integrity: sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==} + chai@4.4.1: resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} engines: {node: '>=4'} @@ -3271,6 +3344,10 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + core-js-compat@3.37.1: resolution: {integrity: sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==} @@ -3305,6 +3382,9 @@ packages: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} + data-uri-to-buffer@2.0.2: + resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} + dataloader@1.4.0: resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} @@ -3824,6 +3904,10 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} + exit-hook@2.2.1: + resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} + engines: {node: '>=6'} + expand-range@1.8.2: resolution: {integrity: sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==} engines: {node: '>=0.10.0'} @@ -4039,6 +4123,9 @@ packages: resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} engines: {node: '>=8'} + get-source@2.0.12: + resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==} + get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -4068,6 +4155,9 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + glob@10.4.2: resolution: {integrity: sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==} engines: {node: '>=16 || 14 >=14.18'} @@ -4969,6 +5059,11 @@ packages: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} + miniflare@3.20240610.1: + resolution: {integrity: sha512-ZkfSpBmX3nJW00yYhvF2kGvjb6f77TOimRR6+2GQvsArbwo6e0iYqLGM9aB/cnJzgFjLMvOv1qj4756iynSxJQ==} + engines: {node: '>=16.13'} + hasBin: true + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -5067,6 +5162,10 @@ packages: multipasta@0.2.2: resolution: {integrity: sha512-KKGdmXIJUmt9BV45LsbUdMnju8eCNSyF9KpbyqK2E3wQXjpPQOg52/Hc+nsmBacmEkNxLVT5h1y3ZgEXB4prXg==} + mustache@4.2.0: + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} + hasBin: true + mysql2@3.10.1: resolution: {integrity: sha512-6zo1T3GILsXMCex3YEu7hCz2OXLUarxFsxvFcUHWMpkPtmZLeTTWgRdc1gWyNJiYt6AxITmIf9bZDRy/jAfWew==} engines: {node: '>= 8.0'} @@ -5475,6 +5574,9 @@ packages: resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} engines: {node: '>=10'} + printable-characters@1.0.42: + resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} + private@0.1.8: resolution: {integrity: sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==} engines: {node: '>= 0.6'} @@ -5981,6 +6083,9 @@ packages: resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} engines: {node: '>=6'} + stacktracey@2.1.8: + resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} + standard-as-callback@2.1.0: resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} @@ -6351,6 +6456,10 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici@5.28.4: + resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} + engines: {node: '>=14.0'} + undici@6.19.2: resolution: {integrity: sha512-JfjKqIauur3Q6biAtHJ564e3bWa8VvT+7cSiOJHFbX4Erv6CLGDpg8z+Fmg/1OI/47RA+GI2QZaF48SSaLvyBA==} engines: {node: '>=18.17'} @@ -6537,6 +6646,11 @@ packages: engines: {node: '>=8'} hasBin: true + workerd@1.20240610.1: + resolution: {integrity: sha512-Rtut5GrsODQMh6YU43b9WZ980Wd05Ov1/ds88pT/SoetmXFBvkBzdRfiHiATv+azmGX8KveE0i/Eqzk/yI01ug==} + engines: {node: '>=16'} + hasBin: true + wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -6643,6 +6757,9 @@ packages: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} + youch@3.3.3: + resolution: {integrity: sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==} + zip-stream@4.1.1: resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} engines: {node: '>= 10'} @@ -7974,6 +8091,27 @@ snapshots: human-id: 1.0.2 prettier: 2.8.8 + '@cloudflare/workerd-darwin-64@1.20240610.1': + optional: true + + '@cloudflare/workerd-darwin-arm64@1.20240610.1': + optional: true + + '@cloudflare/workerd-linux-64@1.20240610.1': + optional: true + + '@cloudflare/workerd-linux-arm64@1.20240610.1': + optional: true + + '@cloudflare/workerd-windows-64@1.20240610.1': + optional: true + + '@cloudflare/workers-types@4.20240620.0': {} + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + '@dependents/detective-less@4.1.0': dependencies: gonzales-pe: 4.3.0 @@ -8123,6 +8261,8 @@ snapshots: '@eslint/js@8.57.0': {} + '@fastify/busboy@2.1.1': {} + '@hapi/hoek@9.3.0': {} '@hapi/topo@5.1.0': @@ -8236,6 +8376,11 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@js-joda/core@5.6.3': {} '@lmdb/lmdb-darwin-arm64@3.0.12': @@ -9363,6 +9508,10 @@ snapshots: is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.3 + as-table@1.0.55: + dependencies: + printable-characters: 1.0.42 + asap@2.0.6: {} asn1@0.2.6: @@ -9689,6 +9838,13 @@ snapshots: caniuse-lite@1.0.30001636: {} + capnp-ts@0.7.0: + dependencies: + debug: 4.3.5 + tslib: 2.6.3 + transitivePeerDependencies: + - supports-color + chai@4.4.1: dependencies: assertion-error: 1.1.0 @@ -9865,6 +10021,8 @@ snapshots: convert-source-map@2.0.0: {} + cookie@0.5.0: {} + core-js-compat@3.37.1: dependencies: browserslist: 4.23.1 @@ -9905,6 +10063,8 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + data-uri-to-buffer@2.0.2: {} + dataloader@1.4.0: {} dayjs@1.11.11: {} @@ -10074,8 +10234,9 @@ snapshots: dotenv@8.6.0: {} - drizzle-orm@0.31.2(@op-engineering/op-sqlite@6.0.7(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(react@18.3.1))(react@18.3.1))(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.10)(better-sqlite3@11.0.0)(bun-types@1.1.16)(mysql2@3.10.1)(postgres@3.4.4)(react@18.3.1): + drizzle-orm@0.31.2(@cloudflare/workers-types@4.20240620.0)(@op-engineering/op-sqlite@6.0.7(react@18.3.1))(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.10)(better-sqlite3@11.0.0)(bun-types@1.1.16)(mysql2@3.10.1)(postgres@3.4.4)(react@18.3.1): optionalDependencies: + '@cloudflare/workers-types': 4.20240620.0 '@op-engineering/op-sqlite': 6.0.7(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(react@18.3.1))(react@18.3.1) '@opentelemetry/api': 1.9.0 '@types/better-sqlite3': 7.6.10 @@ -10465,6 +10626,8 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 + exit-hook@2.2.1: {} + expand-range@1.8.2: dependencies: fill-range: 2.2.4 @@ -10706,6 +10869,11 @@ snapshots: get-port@5.1.1: {} + get-source@2.0.12: + dependencies: + data-uri-to-buffer: 2.0.2 + source-map: 0.6.1 + get-stream@6.0.1: {} get-stream@8.0.1: {} @@ -10734,6 +10902,8 @@ snapshots: dependencies: is-glob: 4.0.3 + glob-to-regexp@0.4.1: {} + glob@10.4.2: dependencies: foreground-child: 3.2.1 @@ -11798,6 +11968,25 @@ snapshots: mimic-response@3.1.0: {} + miniflare@3.20240610.1: + dependencies: + '@cspotcode/source-map-support': 0.8.1 + acorn: 8.12.0 + acorn-walk: 8.3.2 + capnp-ts: 0.7.0 + exit-hook: 2.2.1 + glob-to-regexp: 0.4.1 + stoppable: 1.1.0 + undici: 5.28.4 + workerd: 1.20240610.1 + ws: 8.17.1 + youch: 3.3.3 + zod: 3.23.8 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -11891,6 +12080,8 @@ snapshots: multipasta@0.2.2: {} + mustache@4.2.0: {} + mysql2@3.10.1: dependencies: denque: 2.1.0 @@ -12293,6 +12484,8 @@ snapshots: dependencies: parse-ms: 2.1.0 + printable-characters@1.0.42: {} + private@0.1.8: {} process-nextick-args@2.0.1: {} @@ -12880,6 +13073,11 @@ snapshots: dependencies: type-fest: 0.7.1 + stacktracey@2.1.8: + dependencies: + as-table: 1.0.55 + get-source: 2.0.12 + standard-as-callback@2.1.0: {} statuses@1.5.0: {} @@ -13289,6 +13487,10 @@ snapshots: undici-types@5.26.5: {} + undici@5.28.4: + dependencies: + '@fastify/busboy': 2.1.1 + undici@6.19.2: {} unicode-canonical-property-names-ecmascript@2.0.0: {} @@ -13467,6 +13669,14 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 + workerd@1.20240610.1: + optionalDependencies: + '@cloudflare/workerd-darwin-64': 1.20240610.1 + '@cloudflare/workerd-darwin-arm64': 1.20240610.1 + '@cloudflare/workerd-linux-64': 1.20240610.1 + '@cloudflare/workerd-linux-arm64': 1.20240610.1 + '@cloudflare/workerd-windows-64': 1.20240610.1 + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -13555,6 +13765,12 @@ snapshots: yocto-queue@1.0.0: {} + youch@3.3.3: + dependencies: + cookie: 0.5.0 + mustache: 4.2.0 + stacktracey: 2.1.8 + zip-stream@4.1.1: dependencies: archiver-utils: 3.0.4 diff --git a/tsconfig.base.json b/tsconfig.base.json index e2a6c58ba28..d996f5c453e 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -48,13 +48,17 @@ "@effect/cluster/test/*": ["./packages/cluster/test/*.js"], "@effect/cluster-browser": ["./packages/cluster-browser/src/index.js"], "@effect/cluster-browser/*": ["./packages/cluster-browser/src/*.js"], - "@effect/cluster-browser/test/*": ["./packages/cluster-browser/test/*.js"], + "@effect/cluster-browser/test/*": [ + "./packages/cluster-browser/test/*.js" + ], "@effect/cluster-node": ["./packages/cluster-node/src/index.js"], "@effect/cluster-node/*": ["./packages/cluster-node/src/*.js"], "@effect/cluster-node/test/*": ["./packages/cluster-node/test/*.js"], "@effect/cluster-workflow": ["./packages/cluster-workflow/src/index.js"], "@effect/cluster-workflow/*": ["./packages/cluster-workflow/src/*.js"], - "@effect/cluster-workflow/test/*": ["./packages/cluster-workflow/test/*.js"], + "@effect/cluster-workflow/test/*": [ + "./packages/cluster-workflow/test/*.js" + ], "@effect/experimental": ["./packages/experimental/src/index.js"], "@effect/experimental/*": ["./packages/experimental/src/*.js"], "@effect/experimental/test/*": ["./packages/experimental/test/*.js"], @@ -102,6 +106,9 @@ "@effect/sql": ["./packages/sql/src/index.js"], "@effect/sql/*": ["./packages/sql/src/*.js"], "@effect/sql/test/*": ["./packages/sql/test/*.js"], + "@effect/sql-d1": ["./packages/sql-d1/src/index.js"], + "@effect/sql-d1/*": ["./packages/sql-d1/src/*.js"], + "@effect/sql-d1/test/*": ["./packages/sql-d1/test/*.js"], "@effect/sql-drizzle": ["./packages/sql-drizzle/src/index.js"], "@effect/sql-drizzle/*": ["./packages/sql-drizzle/src/*.js"], "@effect/sql-drizzle/test/*": ["./packages/sql-drizzle/test/*.js"], diff --git a/tsconfig.build.json b/tsconfig.build.json index ef5e83aa779..e3868b28778 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -21,6 +21,7 @@ { "path": "packages/rpc-http/tsconfig.build.json" }, { "path": "packages/schema/tsconfig.build.json" }, { "path": "packages/sql/tsconfig.build.json" }, + { "path": "packages/sql-d1/tsconfig.build.json" }, { "path": "packages/sql-drizzle/tsconfig.build.json" }, { "path": "packages/sql-mysql2/tsconfig.build.json" }, { "path": "packages/sql-mssql/tsconfig.build.json" }, diff --git a/tsconfig.json b/tsconfig.json index 924272f72b0..ca8fb9b4a82 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -22,6 +22,7 @@ { "path": "packages/schema" }, { "path": "packages/schema" }, { "path": "packages/sql" }, + { "path": "packages/sql-d1" }, { "path": "packages/sql-drizzle" }, { "path": "packages/sql-mssql" }, { "path": "packages/sql-mysql2" }, diff --git a/vitest.shared.ts b/vitest.shared.ts index f059116057a..82e5c4547e5 100644 --- a/vitest.shared.ts +++ b/vitest.shared.ts @@ -47,6 +47,7 @@ const config: UserConfig = { ...alias("rpc-http"), ...alias("schema"), ...alias("sql"), + ...alias("sql-d1"), ...alias("sql-drizzle"), ...alias("sql-mssql"), ...alias("sql-mysql2"),