import assert from "node:assert/strict"; import test from "node:test"; import { compileCapabilityResourceSource } from "../src/capability-language/parser.js"; import { generateTypeScriptBindings, type BindingSchema } from "../src/bindings/index.js"; const source = { repository: "https://example.test/p.git", commit: "1".repeat(40) }; const schemaFor = (body: string): BindingSchema => { const compiled = compileCapabilityResourceSource( `external atom Thing id "thing"; package Demo id "demo" revision "demo@1" { ${body} }`, { source }, ); assert.equal(compiled.ok, true, JSON.stringify(compiled.diagnostics)); if (!compiled.ok || compiled.resource.kind !== "package") throw new Error("expected package"); return { format: "quixos-bindings", version: 1, interfaces: [], packages: [compiled.resource.revision] }; }; test("generator uses exact IDs, restricted ports, nominal references, and lossless scalar types", () => { const schema = schemaFor( 'operation run id "run-id" : list -> optional> mode call receiver atom Thing requires { state payload id "payload-id" : bytes [read]; };', ); const generated = generateTypeScriptBindings(schema, "demo@1"); assert.match(generated, /Array/); assert.match(generated, /Promise/); assert.match(generated, /QxObjectRef<"atom:thing">/); assert.doesNotMatch(generated, /"set":/); assert.match(generated, /"run-id": bindQxHandler/); assert.equal(generateTypeScriptBindings(schema, "demo@1"), generated); }); test("missing external types and constructor signatures fail generation", () => { const schema = schemaFor('function run id "run" : unit -> message "example.Payload";'); assert.throws(() => generateTypeScriptBindings(schema, "demo@1"), /Missing TypeScript message binding/); assert.match( generateTypeScriptBindings(schema, "demo@1", { messages: { "example.Payload": { module: "./payload.js", export: "payload" } }, }), /BindingValue/, ); const constructor = schemaFor( 'function run id "run" : unit -> unit requires { constructor thing id "ctor" : Thing; };', ); assert.throws(() => generateTypeScriptBindings(constructor, "demo@1"), /explicit input contract/); const typed = schemaFor( 'function run id "run" : unit -> unit requires { constructor thing id "ctor" : Thing input string; };', ); assert.match(generateTypeScriptBindings(typed, "demo@1"), /construct.*input: string/); });