testCollectionsWaitForAsyncSchemas

tcmts.content.test.testCollectionsWaitForAsyncSchemas · #jrdf5cen · function

import { collection } from "#codebase/tcmts/content";
import type { StandardSchema } from "#codebase/tcmts/content";
import { postSchema } from "#codebase/tcmts/content/test";
import assert from "node:assert/strict";

export const testCollectionsWaitForAsyncSchemas = async () => {
  // postSchema, answering later (as Zod's async refinements do)
  const later: StandardSchema<{ title: string; date: string }> = {
    "~standard": {
      ...postSchema["~standard"],
      validate: async (v) => postSchema["~standard"].validate(v),
    },
  };
  const posts = collection(
    {
      a: "---\ntitle: A\ndate: 2026-11-07\n---\nHi.\n",
      b: "---\ntitle: B\ndate: 2026-11-08\n---\n",
    },
    { schema: later },
  );
  assert.throws(() => posts.all(), /checks asynchronously: `await` its `load\(\)`/);
  await posts.load();
  assert.deepEqual(
    posts.all().map((e) => e.data.title),
    ["A", "B"],
  );
  assert.equal(posts.get("b")?.data.date, "2026-11-08");
  // tcm's check, as a file is saved: a promise of what's wrong
  const check = (posts as unknown as Record<symbol, (n: string, t: string) => Promise<string[]>>)[
    Symbol.for("tcm.collection")
  ]!;
  assert.deepEqual(await check("x", "---\ntitle: 3\n---\n"), [
    "title: a title, as text",
    "date: a day, YYYY-MM-DD",
  ]);
  assert.deepEqual(await check("x", "---\ntitle: T\ndate: 2026-11-07\n---\n"), []);
}

uses