Skip to content

Commit 851e989

Browse files
committed
Merge TS loader unification (Phase 3)
Retires FileMetaDataLoader; introduces MetaDataLoader.fromDirectory/fromUris/ fromString factories + module-level loadDirectory/loadUris/loadString shortcuts. Polymorphic Source impls: FileSource/DirectorySource/UriSource/InMemoryStringSource. Browser-safety preserved via dynamic imports of yaml + node:fs paths. 2533 tests passing (+20 net from loader-unification tests). Pre-existing integration-test failures (Docker required) are unchanged.
2 parents ed4fa1b + 8b0e4c2 commit 851e989

111 files changed

Lines changed: 1051 additions & 676 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

server/typescript/packages/cli/test/unit/payload-field-tree.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { describe, test, expect } from "bun:test";
2-
import { MetaDataLoader, InMemorySource } from "@metaobjectsdev/metadata";
2+
import { MetaDataLoader, InMemoryStringSource } from "@metaobjectsdev/metadata";
33
import { derivePayloadFieldTree } from "../../src/lib/payload-field-tree.js";
44

55
async function loadRoot(children: unknown[]) {
66
const res = await new MetaDataLoader().load([
7-
new InMemorySource(JSON.stringify({ "metadata.root": { package: "acme::ai", children } })),
7+
new InMemoryStringSource(JSON.stringify({ "metadata.root": { package: "acme::ai", children } })),
88
]);
99
expect(res.errors).toEqual([]);
1010
return res.root;

server/typescript/packages/cli/test/unit/projection-migrations.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import { describe, test, expect } from "bun:test";
2-
import { MetaDataLoader, InMemorySource } from "@metaobjectsdev/metadata";
2+
import { MetaDataLoader, InMemoryStringSource } from "@metaobjectsdev/metadata";
33
import { computeProjectionMigrations } from "../../src/lib/projection-migrations.js";
44

55
// ---------------------------------------------------------------------------
66
// Helper — wrap children in metadata envelope and load.
77
// ---------------------------------------------------------------------------
88
async function load(children: unknown[]) {
99
const json = JSON.stringify({ "metadata.root": { package: "test", children } });
10-
const result = await new MetaDataLoader().load([new InMemorySource(json)]);
10+
const result = await new MetaDataLoader().load([new InMemoryStringSource(json)]);
1111
if (result.errors.length > 0) {
1212
throw new Error(
1313
`Loader errors:\n${result.errors.map((e) => e.message).join("\n")}`,

server/typescript/packages/codegen-ts-react/test/cross-target.test.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import { describe, it, expect } from "bun:test";
2-
import { FileMetaDataLoader } from "@metaobjectsdev/metadata/core";
32
import { resolve } from "node:path";
43
import { makeRenderContext, buildPkMap, buildRelationMap, type ResolvedTarget } from "@metaobjectsdev/codegen-ts";
54
import { renderFormFile } from "../src/templates/form-file.js";
5+
import { MetaDataLoader } from "@metaobjectsdev/metadata";
6+
import { FileSource } from "@metaobjectsdev/metadata/core";
67

78
// Product lives in package "shop::commerce" → package-layout path "shop/commerce/Product".
89
const FIXTURE = resolve(import.meta.dir, "fixtures", "packaged-entity.json");
@@ -11,7 +12,7 @@ const model: ResolvedTarget = { name: "default", outDir: "db/gen", importBase: "
1112
const web: ResolvedTarget = { name: "web", outDir: "web/gen", importBase: undefined, outputLayout: "package", dbImport: "../index" };
1213

1314
async function ctxFor(self: ResolvedTarget, em: ResolvedTarget) {
14-
const { root } = await new FileMetaDataLoader().loadFiles([FIXTURE]);
15+
const { root } = await new MetaDataLoader().load([new FileSource(FIXTURE)]);
1516
const entity = root.objects().find((o) => o.name === "Product")!;
1617
const ctx = makeRenderContext({
1718
dialect: "sqlite", loadedRoot: root, outDir: self.outDir, dbImport: self.dbImport,

server/typescript/packages/codegen-ts-tanstack/test/cross-target.test.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import { describe, it, expect } from "bun:test";
2-
import { FileMetaDataLoader } from "@metaobjectsdev/metadata/core";
32
import { resolve } from "node:path";
43
import { makeRenderContext, buildPkMap, buildRelationMap, type ResolvedTarget } from "@metaobjectsdev/codegen-ts";
54
import { renderHooksFile } from "../src/templates/hooks-file.js";
65
import { renderColumnsFile } from "../src/templates/columns-file.js";
6+
import { MetaDataLoader } from "@metaobjectsdev/metadata";
7+
import { FileSource } from "@metaobjectsdev/metadata/core";
78

89
// Product lives in package "shop::commerce" → package-layout path "shop/commerce/Product".
910
const FIXTURE = resolve(import.meta.dir, "fixtures", "packaged-grid-entity.json");
@@ -12,7 +13,7 @@ const model: ResolvedTarget = { name: "default", outDir: "db/gen", importBase: "
1213
const web: ResolvedTarget = { name: "web", outDir: "web/gen", importBase: undefined, outputLayout: "package", dbImport: "../index" };
1314

1415
async function ctxFor(self: ResolvedTarget, em: ResolvedTarget) {
15-
const { root } = await new FileMetaDataLoader().loadFiles([FIXTURE]);
16+
const { root } = await new MetaDataLoader().load([new FileSource(FIXTURE)]);
1617
const entity = root.objects().find((o) => o.name === "Product")!;
1718
const ctx = makeRenderContext({
1819
dialect: "sqlite", loadedRoot: root, outDir: self.outDir, dbImport: self.dbImport,

server/typescript/packages/codegen-ts-tanstack/test/golden/grid-hook-golden.test.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,11 @@ import {
2020
} from "node:fs";
2121
import { tmpdir } from "node:os";
2222
import { join, resolve } from "node:path";
23-
import { FileMetaDataLoader } from "@metaobjectsdev/metadata/core";
2423
import { runGen, defineConfig } from "@metaobjectsdev/codegen-ts";
2524
import { entityFile } from "@metaobjectsdev/codegen-ts/generators";
2625
import { tanstackGridHook } from "../../src/index.js";
26+
import { MetaDataLoader } from "@metaobjectsdev/metadata";
27+
import { FileSource } from "@metaobjectsdev/metadata/core";
2728

2829
const SNAP = join(import.meta.dir, "__snapshots__");
2930
const UPDATE = process.env.UPDATE_GOLDEN === "1";
@@ -55,7 +56,7 @@ const fixtures = [
5556
describe("tanstackGridHook() — golden snapshot", () => {
5657
for (const fixture of fixtures) {
5758
it(`generates byte-identical .grid.ts output — ${fixture.name}`, async () => {
58-
const { root, errors } = await new FileMetaDataLoader().loadFiles([fixture.path]);
59+
const { root, errors } = await new MetaDataLoader().load([new FileSource(fixture.path)]);
5960
if (errors.length > 0) {
6061
throw new Error(`Fixture load errors: ${errors.join(", ")}`);
6162
}

server/typescript/packages/codegen-ts-tanstack/test/integration.test.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@ import { describe, test, expect, beforeEach, afterEach } from "bun:test";
22
import { mkdtempSync, rmSync, readdirSync, readFileSync } from "node:fs";
33
import { tmpdir } from "node:os";
44
import { join, resolve } from "node:path";
5-
import { FileMetaDataLoader } from "@metaobjectsdev/metadata/core";
65
import { runGen, defineConfig } from "@metaobjectsdev/codegen-ts";
76
import { entityFile, queriesFile, routesFile, barrel } from "@metaobjectsdev/codegen-ts/generators";
87
import { tanstackQuery, tanstackGrid } from "../src/index.js";
8+
import { MetaDataLoader } from "@metaobjectsdev/metadata";
9+
import { FileSource } from "@metaobjectsdev/metadata/core";
910

1011
const MULTI_GRID = resolve(import.meta.dir, "fixtures", "multi-grid-entity.json");
1112

@@ -15,7 +16,7 @@ afterEach(() => { rmSync(tmp, { recursive: true, force: true }); });
1516

1617
describe("Full pipeline — Project A + Project B generators together", () => {
1718
test("emits Program.ts, Program.queries.ts, Program.routes.ts, Program.hooks.ts, Program.columns.tsx, index.ts", async () => {
18-
const { root } = await new FileMetaDataLoader().loadFiles([MULTI_GRID]);
19+
const { root } = await new MetaDataLoader().load([new FileSource(MULTI_GRID)]);
1920
const out = await runGen({
2021
config: defineConfig({
2122
outDir: tmp, extStyle: "none", dbImport: "../db", dialect: "sqlite",
@@ -51,7 +52,7 @@ describe("Full pipeline — Project A + Project B generators together", () => {
5152
});
5253

5354
test("all generators emit their expected file kinds together (happy path)", async () => {
54-
const { root } = await new FileMetaDataLoader().loadFiles([MULTI_GRID]);
55+
const { root } = await new MetaDataLoader().load([new FileSource(MULTI_GRID)]);
5556
const out = await runGen({
5657
config: defineConfig({
5758
outDir: tmp, extStyle: "none", dbImport: "../db", dialect: "sqlite",

server/typescript/packages/codegen-ts-tanstack/test/package-layout.test.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@ import { describe, test, expect, beforeEach, afterEach } from "bun:test";
22
import { mkdtempSync, rmSync, readdirSync, readFileSync, existsSync } from "node:fs";
33
import { tmpdir } from "node:os";
44
import { join, resolve } from "node:path";
5-
import { FileMetaDataLoader } from "@metaobjectsdev/metadata/core";
65
import { runGen, defineConfig } from "@metaobjectsdev/codegen-ts";
76
import { entityFile } from "@metaobjectsdev/codegen-ts/generators";
87
import { tanstackQuery, tanstackGrid } from "../src/index.js";
8+
import { MetaDataLoader } from "@metaobjectsdev/metadata";
9+
import { FileSource } from "@metaobjectsdev/metadata/core";
910

1011
const PACKAGED_GRID = resolve(import.meta.dir, "fixtures", "packaged-grid-entity.json");
1112

@@ -15,7 +16,7 @@ afterEach(() => { rmSync(tmp, { recursive: true, force: true }); });
1516

1617
describe("package-aware output placement — tanstackQuery + tanstackGrid", () => {
1718
test("package layout: hooks and columns land in package sub-path alongside entity file", async () => {
18-
const { root, errors } = await new FileMetaDataLoader().loadFiles([PACKAGED_GRID]);
19+
const { root, errors } = await new MetaDataLoader().load([new FileSource(PACKAGED_GRID)]);
1920
expect(errors).toEqual([]);
2021

2122
const out = await runGen({
@@ -57,7 +58,7 @@ describe("package-aware output placement — tanstackQuery + tanstackGrid", () =
5758
});
5859

5960
test("flat layout (default): hooks and columns land at outDir root", async () => {
60-
const { root, errors } = await new FileMetaDataLoader().loadFiles([PACKAGED_GRID]);
61+
const { root, errors } = await new MetaDataLoader().load([new FileSource(PACKAGED_GRID)]);
6162
expect(errors).toEqual([]);
6263

6364
const out = await runGen({
@@ -80,7 +81,7 @@ describe("package-aware output placement — tanstackQuery + tanstackGrid", () =
8081
});
8182

8283
test("extStyle: js — hooks and columns import the entity with a .js extension", async () => {
83-
const { root, errors } = await new FileMetaDataLoader().loadFiles([PACKAGED_GRID]);
84+
const { root, errors } = await new MetaDataLoader().load([new FileSource(PACKAGED_GRID)]);
8485
expect(errors).toEqual([]);
8586

8687
const out = await runGen({

server/typescript/packages/codegen-ts-tanstack/test/projection-hooks.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
// - vanilla entities still emit all 5 hooks (read + create/update/delete)
55

66
import { describe, test, expect } from "bun:test";
7-
import { MetaDataLoader, InMemorySource } from "@metaobjectsdev/metadata";
7+
import { MetaDataLoader, InMemoryStringSource } from "@metaobjectsdev/metadata";
88
import { renderHooksFile } from "../src/templates/hooks-file.js";
99
import { makeRenderContext, buildPkMap, buildRelationMap } from "@metaobjectsdev/codegen-ts";
1010

@@ -14,7 +14,7 @@ import { makeRenderContext, buildPkMap, buildRelationMap } from "@metaobjectsdev
1414

1515
async function loadMetadata(children: unknown[]) {
1616
const json = JSON.stringify({ "metadata.root": { package: "test", children } });
17-
const result = await new MetaDataLoader().load([new InMemorySource(json)]);
17+
const result = await new MetaDataLoader().load([new InMemoryStringSource(json)]);
1818
if (result.errors.length > 0) {
1919
throw new Error(
2020
`Loader errors:\n${result.errors.map((e: { message: string }) => e.message).join("\n")}`,

server/typescript/packages/codegen-ts-tanstack/test/tanstack-grid.test.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
import { describe, test, expect } from "bun:test";
22
import { resolve } from "node:path";
3-
import { FileMetaDataLoader } from "@metaobjectsdev/metadata/core";
43
import { tanstackGrid } from "../src/tanstack-grid.js";
54
import { makeRenderContext, buildPkMap, buildRelationMap } from "@metaobjectsdev/codegen-ts";
65
import type { GenContext } from "@metaobjectsdev/codegen-ts";
6+
import { MetaDataLoader } from "@metaobjectsdev/metadata";
7+
import { FileSource } from "@metaobjectsdev/metadata/core";
78

89
const FIXTURE = resolve(import.meta.dir, "fixtures", "single-entity.json");
910
const MULTI_GRID = resolve(import.meta.dir, "fixtures", "multi-grid-entity.json");
1011
const GRID_FILTER = resolve(import.meta.dir, "fixtures", "grid-filter-fixture.json");
1112

1213
async function ctxFor(fixturePath: string): Promise<GenContext> {
13-
const { root } = await new FileMetaDataLoader().loadFiles([fixturePath]);
14+
const { root } = await new MetaDataLoader().load([new FileSource(fixturePath)]);
1415
const entities = root.objects();
1516
const renderContext = makeRenderContext({
1617
dialect: "sqlite", loadedRoot: root, outDir: "/tmp",

server/typescript/packages/codegen-ts-tanstack/test/tanstack-query-filter.test.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
import { describe, test, expect } from "bun:test";
22
import { resolve } from "node:path";
3-
import { FileMetaDataLoader } from "@metaobjectsdev/metadata/core";
43
import { tanstackQuery } from "../src/tanstack-query.js";
54
import { makeRenderContext } from "@metaobjectsdev/codegen-ts";
65
import { buildPkMap, buildRelationMap } from "@metaobjectsdev/codegen-ts";
76
import type { GenContext } from "@metaobjectsdev/codegen-ts";
7+
import { MetaDataLoader } from "@metaobjectsdev/metadata";
8+
import { FileSource } from "@metaobjectsdev/metadata/core";
89

910
const FIXTURE = resolve(import.meta.dir, "..", "..", "codegen-ts", "test", "fixtures", "filter-fixture.json");
1011

1112
async function buildCtx(): Promise<GenContext> {
12-
const loader = new FileMetaDataLoader();
13-
const { root } = await loader.loadFiles([FIXTURE]);
13+
const loader = new MetaDataLoader();
14+
const { root } = await loader.load([new FileSource(FIXTURE)]);
1415
const entities = root.objects();
1516
const renderContext = makeRenderContext({
1617
dialect: "sqlite",

0 commit comments

Comments
 (0)