import { describe, expect, test } from "bun:test"; import { defineAuthz } from "../src/registry.ts"; import { mergeCatalogs, emptyCatalog } from "../src/catalog.ts"; import { generatePermissionTypes } from "../src/codegen.ts"; describe("generatePermissionTypes", () => { test("emits sorted Permission and Role unions", () => { const catalog = mergeCatalogs([ { source: "t.ts", module: defineAuthz({ permissions: { "post:write": {}, "post:read": {} }, roles: { editor: ["post:*"], admin: ["*"] }, }), }, ]); const out = generatePermissionTypes(catalog); expect(out).toContain('export type Permission = "post:read" | "post:write";'); expect(out).toContain('export type Role = "admin" | "editor";'); expect(out).toContain("DO NOT EDIT"); }); test("emits never for an empty catalog so the file still typechecks", () => { const out = generatePermissionTypes(emptyCatalog()); expect(out).toContain("export type Permission = never;"); expect(out).toContain("export type Role = never;"); }); test("escapes quotes in identifiers", () => { const catalog = mergeCatalogs([{ source: "t.ts", module: { roles: { 'we"ird': [] } } }]); expect(generatePermissionTypes(catalog)).toContain('"we\\"ird"'); }); });