import * as t from "@babel/types";
import invariant from "invariant";
import { runBabelPluginReactCompiler } from "../Babel/RunReactCompilerBabelPlugin";
import type { Logger, LoggerEvent } from "../Entrypoint";
it("logs succesful compilation", () => {
const logs: [string | null, LoggerEvent][] = [];
const logger: Logger = {
logEvent(filename, event) {
logs.push([filename, event]);
},
};
const _ = runBabelPluginReactCompiler(
"function Component(props) { return <div>{props}</div> }",
"test.js",
"flow",
{ logger, panicThreshold: "all_errors" }
);
const [filename, event] = logs.at(0)!;
expect(filename).toContain("test.js");
expect(event.kind).toEqual("CompileSuccess");
invariant(event.kind === "CompileSuccess", "typescript be smarter");
expect(event.fnName).toEqual("Component");
expect(event.fnLoc?.end).toEqual({ column: 55, index: 55, line: 1 });
expect(event.fnLoc?.start).toEqual({ column: 0, index: 0, line: 1 });
});
it("logs failed compilation", () => {
const logs: [string | null, LoggerEvent][] = [];
const logger: Logger = {
logEvent(filename, event) {
logs.push([filename, event]);
},
};
expect(() => {
runBabelPluginReactCompiler(
"function Component(props) { props.foo = 1; return <div>{props}</div> }",
"test.js",
"flow",
{ logger, panicThreshold: "all_errors" }
);
}).toThrow();
const [filename, event] = logs.at(0)!;
expect(filename).toContain("test.js");
expect(event.kind).toEqual("CompileError");
invariant(event.kind === "CompileError", "typescript be smarter");
expect(event.detail.severity).toEqual("InvalidReact");
const { start, end, identifierName } = event.detail.loc as t.SourceLocation;
expect(start).toEqual({ column: 28, index: 28, line: 1 });
expect(end).toEqual({ column: 33, index: 33, line: 1 });
expect(identifierName).toEqual("props");
expect(event.fnLoc?.start).toEqual({ column: 0, index: 0, line: 1 });
expect(event.fnLoc?.end).toEqual({ column: 70, index: 70, line: 1 });
});