feat: transition module packages to database ABI v1
CI / verify (pull_request) Successful in 1m1s
CI / infrastructure-smoke (pull_request) Successful in 36s
CI / migration-smoke (pull_request) Successful in 1m54s
CI / image-build (pull_request) Successful in 31s
CI / deploy-smoke (same-origin) (pull_request) Successful in 52s
CI / deploy-smoke (split) (pull_request) Successful in 1m32s

This commit is contained in:
ekklesia
2026-10-07 18:00:04 -05:00
parent 20ad1ae208
commit 70854d234c
20 changed files with 274 additions and 115 deletions
@@ -31,11 +31,14 @@ async function readJson(file: string): Promise<Record<string, unknown>> {
return JSON.parse(await readFile(file, "utf8")) as Record<string, unknown>;
}
async function platform() {
async function platform(databaseRuntimeVersion?: string) {
const core = await readJson(path.join(repositoryRoot, "core", "package.json"));
return {
databaseRuntime: {
"drizzle-orm": (core.dependencies as Record<string, string>)["drizzle-orm"] ?? "",
"drizzle-orm":
databaseRuntimeVersion ??
(core.dependencies as Record<string, string>)["drizzle-orm"] ??
"",
},
moduleSdkVersion: String(
(await readJson(path.join(repositoryRoot, "packages", "module-sdk", "package.json"))).version,
@@ -96,6 +99,32 @@ describe("the module template as a Module Package v1", () => {
expect(await treeListing(template)).toEqual(templateBefore);
});
it("packages the canonical template as ABI v1 with Drizzle private to the module", async () => {
const { archive, result } = await packTemplate();
const files = fileEntries(archive);
const manifest = JSON.parse(files.get("example/ekklesia.module.json")?.toString("utf8") ?? "");
const metadata = JSON.parse(files.get("example/ekklesia.package.json")?.toString("utf8") ?? "");
expect(manifest.database).toEqual({ abi: 1 });
expect(metadata.transitional).toBeUndefined();
expect(metadata.incorporates).toMatchObject({
"@ekklesia/module-database": expect.any(String),
});
expect(
[...files.entries()].some(
([file, data]) => file.endsWith(".js") && data.toString("utf8").includes("drizzle-orm"),
),
).toBe(true);
await expect(
verifyModulePackage({
archivePath: result.archivePath,
expectedSha256: result.sha256,
platform: await platform("99.0.0"),
}),
).resolves.toMatchObject({ moduleId: "example" });
});
it("verifies against this platform and extracts to an unrelated directory that holds no link", async () => {
const { result } = await packTemplate();
const target = path.join(await scratchDirectory("ekklesia-installed-elsewhere-"), "example");