// @vitest-environment node import { describe, it, expect } from 'vitest'; import { readdirSync, readFileSync, statSync } from 'node:fs'; import { fileURLToPath } from 'node:url'; import { join } from 'node:path'; // This package is ESM ("type": "module") — __dirname does not exist here. const SRC = fileURLToPath(new URL('.', import.meta.url)); const ADAPTERS = join(SRC, 'adapters'); function tsFilesIn(dir: string): string[] { const out: string[] = []; for (const entry of readdirSync(dir)) { const full = join(dir, entry); if (statSync(full).isDirectory()) out.push(...tsFilesIn(full)); else if (/\.tsx?$/.test(full)) out.push(full); } return out; } // The whole premise of this package: core renders, adapters transport. If core ever // imports a transport, an app on a different backend pays for socket code it cannot // use — which is exactly how iios-message-web welded itself to MessageSocket. describe('transport boundary', () => { const coreFiles = tsFilesIn(SRC).filter((f) => !f.startsWith(ADAPTERS) && !/\.test\.tsx?$/.test(f)); it('has core files to check', () => { expect(coreFiles.length).toBeGreaterThan(0); }); it('core never imports a transport package', () => { const offenders: string[] = []; for (const file of coreFiles) { const content = readFileSync(file, 'utf8'); if (/@insignia\/iios-kernel-client|socket\.io|@abe-kap\/appshell-sdk/.test(content)) { offenders.push(file.replace(SRC, 'src')); } } expect(offenders).toEqual([]); }); });