Skip to content

Commit fd8d08c

Browse files
committed
Remove FumaDB helper casts
1 parent 1bba8cb commit fd8d08c

7 files changed

Lines changed: 63 additions & 59 deletions

File tree

apps/cloud/src/services/fuma.ts

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
import { fumadb, type FumaDB } from "fumadb";
22
import { drizzleAdapter, type DrizzleConfig } from "fumadb/adapters/drizzle";
3-
import { schema as fumaSchema } from "fumadb/schema";
3+
import { schema as fumaSchema, type RelationsMap } from "fumadb/schema";
44

55
import type { FumaDb, FumaTables } from "@executor-js/sdk";
66

7-
export interface DrizzleFumaDb {
8-
readonly db: FumaDb;
9-
readonly fuma: FumaDB;
7+
type DrizzleFumaSchema<TTables extends FumaTables> = ReturnType<
8+
typeof fumaSchema<string, TTables, RelationsMap<TTables>>
9+
>;
10+
11+
export interface DrizzleFumaDb<TTables extends FumaTables = FumaTables> {
12+
readonly db: FumaDb<DrizzleFumaSchema<TTables>>;
13+
readonly fuma: FumaDB<DrizzleFumaSchema<TTables>[]>;
1014
}
1115

1216
export interface CreateDrizzleFumaDbOptions<TTables extends FumaTables = FumaTables> {
@@ -17,12 +21,9 @@ export interface CreateDrizzleFumaDbOptions<TTables extends FumaTables = FumaTab
1721
readonly provider: DrizzleConfig["provider"];
1822
}
1923

20-
const asFumaDb = (db: unknown): FumaDb => db as FumaDb;
21-
const asFumaClient = (client: unknown): FumaDB => client as FumaDB;
22-
2324
export const createDrizzleFumaDb = <const TTables extends FumaTables>(
2425
options: CreateDrizzleFumaDbOptions<TTables>,
25-
): DrizzleFumaDb => {
26+
): DrizzleFumaDb<TTables> => {
2627
const version = options.version ?? "1.0.0";
2728
const latestSchema = fumaSchema({
2829
version,
@@ -40,7 +41,7 @@ export const createDrizzleFumaDb = <const TTables extends FumaTables>(
4041
);
4142

4243
return {
43-
db: asFumaDb(fuma.orm(version)),
44-
fuma: asFumaClient(fuma),
44+
db: fuma.orm(version),
45+
fuma,
4546
};
4647
};

apps/cloud/src/services/pglite.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,18 @@ import {
44
type PGLiteSocketServer as PgliteSocketServer,
55
} from "@electric-sql/pglite-socket";
66
import { drizzle, type PgliteDatabase } from "drizzle-orm/pglite";
7-
import type { FumaDB } from "fumadb";
87
import {
98
createDrizzleRuntimeSchemaFromTables,
109
ensureDrizzleRuntimeSchemaFromTables,
1110
} from "fumadb/adapters/drizzle";
1211

13-
import type { FumaDb, FumaTables } from "@executor-js/sdk";
12+
import type { FumaTables } from "@executor-js/sdk";
1413

15-
import { createDrizzleFumaDb } from "./fuma";
14+
import { createDrizzleFumaDb, type DrizzleFumaDb } from "./fuma";
1615

17-
export interface PgliteFumaDb {
18-
readonly db: FumaDb;
19-
readonly fuma: FumaDB;
16+
export interface PgliteFumaDb<
17+
TTables extends FumaTables = FumaTables,
18+
> extends DrizzleFumaDb<TTables> {
2019
readonly drizzle: PgliteDatabase<any>;
2120
readonly pglite: PGlite;
2221
readonly server: PgliteSocketServer | null;
@@ -35,7 +34,7 @@ export interface CreatePgliteFumaDbOptions<TTables extends FumaTables = FumaTabl
3534

3635
export const createPgliteFumaDb = async <const TTables extends FumaTables>(
3736
options: CreatePgliteFumaDbOptions<TTables>,
38-
): Promise<PgliteFumaDb> => {
37+
): Promise<PgliteFumaDb<TTables>> => {
3938
const version = options.version ?? "1.0.0";
4039
const pglite = await PGlite.create(options.dataDir ?? "memory://");
4140
const schema = createDrizzleRuntimeSchemaFromTables({

apps/local/src/server/sqlite-fumadb.ts

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,17 @@ import {
66
createDrizzleRuntimeSchemaSqlFromTables,
77
drizzleAdapter,
88
} from "fumadb/adapters/drizzle";
9-
import { schema as fumaSchema } from "fumadb/schema";
9+
import { schema as fumaSchema, type RelationsMap } from "fumadb/schema";
1010

1111
import type { FumaDb, FumaTables } from "@executor-js/sdk";
1212

13-
export interface SqliteFumaDb {
14-
readonly db: FumaDb;
15-
readonly fuma: FumaDB;
13+
type SqliteFumaSchema<TTables extends FumaTables> = ReturnType<
14+
typeof fumaSchema<string, TTables, RelationsMap<TTables>>
15+
>;
16+
17+
export interface SqliteFumaDb<TTables extends FumaTables = FumaTables> {
18+
readonly db: FumaDb<SqliteFumaSchema<TTables>>;
19+
readonly fuma: FumaDB<SqliteFumaSchema<TTables>[]>;
1620
readonly drizzle: BunSQLiteDatabase<Record<string, unknown>>;
1721
readonly sqlite: Database;
1822
readonly close: () => Promise<void>;
@@ -25,12 +29,9 @@ export interface CreateSqliteFumaDbOptions<TTables extends FumaTables = FumaTabl
2529
readonly path: string;
2630
}
2731

28-
const asFumaDb = (db: unknown): FumaDb => db as FumaDb;
29-
const asFumaClient = (client: unknown): FumaDB => client as FumaDB;
30-
3132
export const createSqliteFumaDb = async <const TTables extends FumaTables>(
3233
options: CreateSqliteFumaDbOptions<TTables>,
33-
): Promise<SqliteFumaDb> => {
34+
): Promise<SqliteFumaDb<TTables>> => {
3435
const version = options.version ?? "1.0.0";
3536
const sqlite = new Database(options.path, { create: true });
3637
sqlite.exec("PRAGMA foreign_keys = ON");
@@ -69,8 +70,8 @@ export const createSqliteFumaDb = async <const TTables extends FumaTables>(
6970
);
7071

7172
return {
72-
db: asFumaDb(fuma.orm(version)),
73-
fuma: asFumaClient(fuma),
73+
db: fuma.orm(version),
74+
fuma,
7475
drizzle: drizzleDb,
7576
sqlite,
7677
close: async () => {

packages/core/sdk/src/fuma-runtime.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export type FumaTables = Record<string, AnyTable>;
1717
export type TablesToFumaSchema<TTables extends FumaTables | undefined> = TTables extends FumaTables
1818
? FumaSchema<"latest", TTables>
1919
: AnySchema;
20-
export type FumaDb<TSchema extends AnySchema = AnySchema> = AbstractQuery<TSchema>;
20+
export type FumaDb<TSchema extends AnySchema = any> = AbstractQuery<TSchema>;
2121
export type FumaRow<TTable extends AnyTable> = Omit<
2222
{
2323
readonly [K in keyof TTable["columns"]]: TTable["columns"][K]["$out"];

packages/core/sdk/src/sqlite-test-db.ts

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,17 @@ import {
88
createDrizzleRuntimeSchemaSqlFromTables,
99
drizzleAdapter,
1010
} from "fumadb/adapters/drizzle";
11-
import { schema as fumaSchema } from "fumadb/schema";
11+
import { schema as fumaSchema, type RelationsMap } from "fumadb/schema";
1212

1313
import type { FumaDb, FumaTables } from "./fuma-runtime";
1414

15-
export interface SqliteTestFumaDb {
16-
readonly db: FumaDb;
17-
readonly fuma: FumaDB;
15+
type SqliteTestFumaSchema<TTables extends FumaTables> = ReturnType<
16+
typeof fumaSchema<string, TTables, RelationsMap<TTables>>
17+
>;
18+
19+
export interface SqliteTestFumaDb<TTables extends FumaTables = FumaTables> {
20+
readonly db: FumaDb<SqliteTestFumaSchema<TTables>>;
21+
readonly fuma: FumaDB<SqliteTestFumaSchema<TTables>[]>;
1822
readonly drizzle: BetterSQLite3Database<Record<string, unknown>>;
1923
readonly sqlite: Database.Database;
2024
readonly close: () => Promise<void>;
@@ -27,12 +31,9 @@ export interface CreateSqliteTestFumaDbOptions<TTables extends FumaTables = Fuma
2731
readonly path?: string;
2832
}
2933

30-
const asFumaDb = (db: unknown): FumaDb => db as FumaDb;
31-
const asFumaClient = (client: unknown): FumaDB => client as FumaDB;
32-
3334
export const createSqliteTestFumaDb = async <const TTables extends FumaTables>(
3435
options: CreateSqliteTestFumaDbOptions<TTables>,
35-
): Promise<SqliteTestFumaDb> => {
36+
): Promise<SqliteTestFumaDb<TTables>> => {
3637
const version = options.version ?? "1.0.0";
3738
const namespace = options.namespace ?? "executor_test";
3839
if (options.path && options.path !== ":memory:") {
@@ -74,8 +75,8 @@ export const createSqliteTestFumaDb = async <const TTables extends FumaTables>(
7475
);
7576

7677
return {
77-
db: asFumaDb(fuma.orm(version)),
78-
fuma: asFumaClient(fuma),
78+
db: fuma.orm(version),
79+
fuma,
7980
drizzle: drizzleDb,
8081
sqlite,
8182
close: async () => {

packages/core/sdk/src/test-config.ts

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ const makeLazyTestFumaDb = (options: {
2929
readonly dataDir?: string;
3030
}): TestFumaDb => {
3131
let started: Promise<SqliteTestFumaDb> | undefined;
32-
const asFumaDb = (db: unknown): FumaDb => db as FumaDb;
3332
const start = () => {
3433
if (!started) {
3534
started = import("./sqlite-test-db").then(({ createSqliteTestFumaDb }) =>
@@ -43,21 +42,20 @@ const makeLazyTestFumaDb = (options: {
4342
return started;
4443
};
4544

46-
const db = asFumaDb(
47-
new Proxy(
48-
{ internal: undefined },
49-
{
50-
get(target, prop) {
51-
if (prop === "internal") return target.internal;
52-
return async (...args: unknown[]) => {
53-
const actual = await start();
54-
const method = Reflect.get(actual.db, prop) as (...innerArgs: unknown[]) => unknown;
55-
return method.apply(actual.db, args);
56-
};
57-
},
45+
// oxlint-disable-next-line executor/no-double-cast -- boundary: lazy test DB proxy has the FumaDB shape only after first method access
46+
const db = new Proxy(
47+
{ internal: undefined },
48+
{
49+
get(target, prop) {
50+
if (prop === "internal") return target.internal;
51+
return async (...args: unknown[]) => {
52+
const actual = await start();
53+
const method = Reflect.get(actual.db, prop) as (...innerArgs: unknown[]) => unknown;
54+
return method.apply(actual.db, args);
55+
};
5856
},
59-
),
60-
);
57+
},
58+
) as unknown as FumaDb;
6159

6260
return {
6361
db,
@@ -81,7 +79,10 @@ export type TestConfigOptions<TPlugins extends readonly AnyPlugin[] = readonly [
8179

8280
export const makeTestConfig = <const TPlugins extends readonly AnyPlugin[] = readonly []>(
8381
options?: TestConfigOptions<TPlugins>,
84-
): ExecutorConfig<TPlugins> & { readonly testDb: TestFumaDb } => {
82+
): Omit<ExecutorConfig<TPlugins>, "db"> & {
83+
readonly db: FumaDb;
84+
readonly testDb: TestFumaDb;
85+
} => {
8586
const scopes = options?.scopes ?? [
8687
Scope.make({
8788
id: ScopeId.make("test-scope"),

packages/kernel/runtime-dynamic-worker/src/integration.test.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,11 @@ const makeSpec = (contentType: string, schema: Record<string, unknown> = { type:
159159
},
160160
});
161161

162-
const asFumaDb = (db: unknown): FumaDb => db as FumaDb;
163-
164-
const createPostgresFumaDb = (db: unknown, tables: FumaTables): FumaDb => {
165-
const version = "1.0.0";
162+
const createPostgresFumaDb = <const TTables extends FumaTables>(
163+
db: unknown,
164+
tables: TTables,
165+
): FumaDb => {
166+
const version = "1.0.0" as const;
166167
const factory = fumadb({
167168
namespace: DATABASE_NAMESPACE,
168169
schemas: [
@@ -178,7 +179,7 @@ const createPostgresFumaDb = (db: unknown, tables: FumaTables): FumaDb => {
178179
provider: "postgresql",
179180
}),
180181
);
181-
return asFumaDb(fuma.orm(version));
182+
return fuma.orm(version);
182183
};
183184

184185
const buildSandboxBridge = (spec: string, namespace: string, baseUrl = "https://upstream.test") =>

0 commit comments

Comments
 (0)