feat: deliver module database ABI by manifest
CI / verify (pull_request) Successful in 1m0s
CI / infrastructure-smoke (pull_request) Successful in 36s
CI / migration-smoke (pull_request) Successful in 1m53s
CI / image-build (pull_request) Successful in 23s
CI / deploy-smoke (same-origin) (pull_request) Successful in 50s
CI / deploy-smoke (split) (pull_request) Successful in 1m30s

This commit is contained in:
ekklesia
2026-10-07 17:29:32 -05:00
parent a1cdcb3ad1
commit 49b4d4165d
60 changed files with 948 additions and 237 deletions
@@ -1,5 +1,16 @@
import { type ModuleRuntimeDefinition, parseModuleRuntimeDefinition } from "@ekklesia/contracts";
import {
type LegacyModuleRuntimeDefinition,
type ModuleDatabaseAbiRuntimeDefinition,
type ModuleRuntimeDefinition,
parseModuleRuntimeDefinition,
} from "@ekklesia/contracts";
export function defineModuleRuntime<const Definition extends ModuleDatabaseAbiRuntimeDefinition>(
definition: Definition,
): Readonly<Definition>;
export function defineModuleRuntime<const Definition extends LegacyModuleRuntimeDefinition>(
definition: Definition,
): Readonly<Definition>;
export function defineModuleRuntime<const Definition extends ModuleRuntimeDefinition>(
definition: Definition,
): Readonly<Definition> {
@@ -1,7 +1,7 @@
import { describe, expect, it, vi } from "vitest";
import { describe, expect, expectTypeOf, it, vi } from "vitest";
import {
EMPTY_MODULE_CONFIGURATION,
defineModuleRuntime,
EMPTY_MODULE_CONFIGURATION,
isModuleHttpMethod,
MODULE_HTTP_METHODS,
type ModuleHttpRouteRegistrar,
@@ -9,6 +9,42 @@ import {
} from "../src/index.js";
describe("defineModuleRuntime", () => {
it("types each database mode without exposing a legacy-or-ABI union", () => {
defineModuleRuntime({
database: { abi: 1 },
id: "example",
version: "0.1.0",
start({ services }) {
expectTypeOf(services.database.query).toBeFunction();
expectTypeOf(services.database.abiVersion).toEqualTypeOf<1>();
// @ts-expect-error ABI-v1 modules never receive the legacy Drizzle facade.
services.database.select();
},
register({ http }) {
http.route({
handler: (_request, { services }) => {
expectTypeOf(services.database.abiVersion).toEqualTypeOf<1>();
return new Response();
},
maxBodyBytes: 0,
method: "GET",
path: "/",
permission: "example.read",
});
},
});
defineModuleRuntime({
id: "legacy",
version: "0.1.0",
start({ services }) {
expectTypeOf(services.database.select).toBeFunction();
// @ts-expect-error Legacy modules do not receive the ABI executor.
services.database.abiVersion;
},
});
});
it("defines a frozen server runtime without duplicating the static manifest", async () => {
const start = vi.fn();
const runtime = defineModuleRuntime({