feat: export messaging-ui public API and enforce transport boundary
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
// @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([]);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user