1import { schema } from "jazz-tools";2import {3 defineNestedApp,4 defineNestedPermissions,5 flattenNestedSchema,6 mergeNestedPermissions,7 s,8} from "./mod.ts";910// The facade re-exports, never reimplements: every curated member must be the11// pinned Jazz 2 original by identity, so semantics cannot drift.12const curatedMembers = [13 "string",14 "boolean",15 "int",16 "float",17 "timestamp",18 "bytes",19 "json",20 "enum",21 "ref",22 "array",23 "add",24 "drop",25 "renameFrom",26 "table",27 "defineSchema",28 "defineApp",29 "defineSliceableApp",30 "defineMigration",31 "renameTableFrom",32 "definePermissions",33 "permissionIntrospectionColumns",34] as const;3536Deno.test("schema facade exposes every curated member as the Jazz original", () => {37 for (const member of curatedMembers) {38 if (!(member in schema)) {39 throw new Error(`jazz-tools schema namespace no longer provides "${member}"`);40 }41 if (s[member] !== (schema as Record<string, unknown>)[member]) {42 throw new Error(`facade member "${member}" is not the jazz-tools original`);43 }44 }45});4647// The nested-namespace members are the one deliberate exception to the48// re-export rule: they are lofi-owned (a naming layer over the pinned49// defineSliceableApp), so they must be lofi's functions, not Jazz members.50Deno.test("the nested-namespace members are the lofi-owned originals", () => {51 const lofiMembers = {52 defineNestedApp,53 defineNestedPermissions,54 mergeNestedPermissions,55 flattenNestedSchema,56 } as const;57 for (const [name, member] of Object.entries(lofiMembers)) {58 if (s[name as keyof typeof lofiMembers] !== member) {59 throw new Error(`facade member "${name}" is not the lofi nested-namespace original`);60 }61 if (name in schema) {62 throw new Error(63 `jazz-tools now provides "${name}" — resolve the collision with the lofi member`,64 );65 }66 }67});6869Deno.test("a schema declared through the facade round-trips app and permissions", () => {70 const app = s.defineApp({71 tasks: s.table({72 text: s.string(),73 completed: s.boolean(),74 createdAt: s.timestamp(),75 }),76 });77 if (typeof app.tasks?.where !== "function") {78 throw new Error("facade-declared app does not expose a queryable table");79 }80 const permissions = s.definePermissions(app, ({ policy }) => {81 policy.tasks.allowInsert.always();82 });83 if (!permissions || typeof permissions !== "object") {84 throw new Error("facade-declared permissions did not compile");85 }86});