@assistant-ui/react
Version:
Open-source TypeScript/React library for building production-grade AI chat experiences
35 lines (30 loc) • 1.44 kB
text/typescript
/// <reference types="node" />
import { spawnSync } from "node:child_process";
import { fileURLToPath } from "node:url";
import { expect, it } from "vitest";
const PACKAGE_DIR = fileURLToPath(new URL("..", import.meta.url));
// The built entry imports React through @assistant-ui/tap/react-shim. Vite
// dev pre-bundles that shim with esbuild, whose CommonJS interop hands it
// React's default export only; the loader below recreates that for the shim.
const script = `
import { registerHooks } from "node:module";
registerHooks({
resolve(specifier, context, nextResolve) {
const resolved = nextResolve(specifier, context);
if (specifier !== "react" || !context.parentURL?.endsWith("/react-shim/index.js")) return resolved;
const source = "import React from " + JSON.stringify(resolved.url) + "; export default React;";
return { url: "data:text/javascript," + encodeURIComponent(source), shortCircuit: true };
},
});
const entry = await import("@assistant-ui/react");
console.log(typeof entry.ComposerPrimitive.Root, typeof entry.CloudRendererHost);
`;
it("loads the public entry when the react-shim only sees React's default export", () => {
const result = spawnSync(
process.execPath,
[...process.execArgv, "--input-type=module", "--eval", script],
{ cwd: PACKAGE_DIR, encoding: "utf8" },
);
expect(result.status, result.stderr).toBe(0);
expect(result.stdout.trim()).toBe("object function");
});