import assert from 'node:assert/strict' import { readFile } from 'node:fs/promises' import test from 'node:test' import ts from 'typescript' const source = await readFile(new URL('./types.ts', import.meta.url), 'utf8') const compiled = ts.transpileModule(source, { compilerOptions: { module: ts.ModuleKind.ESNext, target: ts.ScriptTarget.ES2022 }, }).outputText const { isApiFailure, isApiEnvelope } = await import(`data:text/javascript;base64,${Buffer.from(compiled).toString('base64')}`) test('recognizes a security failure without data and preserves diagnostics', () => { const failure = { code: 'A0403', message: 'Access denied', requestId: 'request-1', traceId: 'trace-1' } assert.equal(isApiFailure(failure), true) assert.equal(isApiEnvelope(failure), false) assert.equal(failure.requestId, 'request-1') assert.equal(failure.traceId, 'trace-1') }) test('does not accept malformed or data-less successful responses', () => { for (const value of [null, {}, { code: 403, message: 'Denied' }, { code: 'A0403' }, { code: 'A0403', message: 'Denied', traceId: {} }, { code: '200', message: 'OK' }]) { assert.equal(isApiFailure(value), false) } assert.equal(isApiEnvelope({ code: '200', message: 'OK' }), false) assert.equal(isApiEnvelope({ code: '200', message: 'OK', data: [] }), true) }) test('unified transport handles business-code and HTTP security failures', async () => { const transport = await readFile(new URL('./http.ts', import.meta.url), 'utf8') assert.match(transport, /if \(isApiFailure\(invalid\)\)/) assert.match(transport, /isApiEnvelope\(body\) \|\| isApiFailure\(body\)/) })