Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 2 additions & 6 deletions src/vite.ts
Original file line number Diff line number Diff line change
Expand Up @@ -184,15 +184,14 @@ export default function solidGrab(
} = options;

let projectRoot = "";
let isDev = false;

return {
name: "solid-grab",
enforce: "pre", // Run before vite-plugin-solid
apply: "serve", // Only active during dev — completely skipped in production builds

configResolved(config: ResolvedConfig) {
projectRoot = config.root;
isDev = config.command === "serve" || config.mode === "development";
},

// Virtual module that imports the runtime — resolved by Vite's pipeline
Expand All @@ -207,9 +206,6 @@ export default function solidGrab(
},

transform(code, id) {
// Only transform in dev mode
if (!isDev) return null;

// Only transform JSX/TSX files in the user's project
if (!/\.[jt]sx$/.test(id)) return null;
if (id.includes("node_modules")) return null;
Expand Down Expand Up @@ -245,7 +241,7 @@ export default function solidGrab(

// Inject a <script src> that Vite's dev server will resolve
transformIndexHtml() {
if (!autoImport || !isDev) return;
if (!autoImport) return;
return [
{
tag: "script",
Expand Down
30 changes: 8 additions & 22 deletions tests/vite-plugin.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,12 @@ import solidGrab from "../src/vite.js";

/** Helper: create the plugin and simulate Vite's configResolved hook */
function createPlugin(
options: Parameters<typeof solidGrab>[0] = {},
mode: "development" | "production" = "development"
options: Parameters<typeof solidGrab>[0] = {}
): Plugin {
const plugin = solidGrab(options);

// Simulate Vite calling configResolved
const fakeConfig = {
root: "/project",
command: mode === "development" ? "serve" : "build",
mode,
} as ResolvedConfig;
const fakeConfig = { root: "/project" } as ResolvedConfig;

(plugin as any).configResolved(fakeConfig);
return plugin;
Expand All @@ -30,6 +25,11 @@ describe("plugin metadata", () => {
const plugin = solidGrab();
expect(plugin.enforce).toBe("pre");
});

test("only applies during dev serve", () => {
const plugin = solidGrab();
expect(plugin.apply).toBe("serve");
});
});

describe("transform", () => {
Expand Down Expand Up @@ -73,13 +73,6 @@ describe("transform", () => {
expect(result).toBeNull();
});

test("skips in production mode", () => {
const plugin = createPlugin({}, "production");
const code = `function App() {\n return <div>hello</div>;\n}`;
const result = (plugin as any).transform(code, "/project/src/App.tsx");
expect(result).toBeNull();
});

test("does not inject into TypeScript generics", () => {
const plugin = createPlugin();
const code = [
Expand Down Expand Up @@ -238,7 +231,7 @@ describe("virtual module (key config)", () => {
});

describe("transformIndexHtml", () => {
test("returns tag descriptors in dev mode", () => {
test("returns tag descriptors", () => {
const plugin = createPlugin();
const result = (plugin as any).transformIndexHtml();

Expand All @@ -250,13 +243,6 @@ describe("transformIndexHtml", () => {
expect(result[0].injectTo).toBe("head");
});

test("returns undefined in production mode", () => {
const plugin = createPlugin({}, "production");
const result = (plugin as any).transformIndexHtml();

expect(result).toBeUndefined();
});

test("returns undefined when autoImport is false", () => {
const plugin = createPlugin({ autoImport: false });
const result = (plugin as any).transformIndexHtml();
Expand Down