vitest-auto-mock
Version:
Library for mocking dependencies in Vitest with TypeScript without need to provide a path.
44 lines (43 loc) • 1.57 kB
JavaScript
import { createFilter as u } from "vite";
import { configDefaults as p } from "vitest/config";
const m = "vi", f = "mocked";
function P() {
let e = null;
return {
name: "vite-plugin-vitest-auto-mock",
configResolved: ({ test: t }) => {
const r = (t == null ? void 0 : t.include) ?? p.include;
e = u(r);
},
transform(t, r) {
return !e || !e(r) ? void 0 : { code: d(t, this.parse) };
}
};
}
const d = (e, t) => {
const n = t(e).body, o = n.filter(C), a = g(n);
if (a.length === 0)
return e;
const l = I(o), c = a.map(l);
return x(c).concat(e);
}, g = (e) => {
const t = e.filter((o) => o.type === "VariableDeclaration").map((o) => o.declarations[0].init), r = e.filter(E).map((o) => o.expression).filter(i);
return [...t, ...r].filter(i).filter(y);
}, y = (e) => {
const t = e.callee;
if (!A(t))
return !1;
const r = t.object;
if (!s(r) || r.name !== m)
return !1;
const n = t.property;
return s(n) ? n.name === f : !1;
}, I = (e) => (t) => M(e, t), M = (e, t) => {
const r = t.arguments[0];
return s(r) ? k(e, r.name) : null;
}, i = (e) => !!e && e.type === "CallExpression", s = (e) => e.type === "Identifier", A = (e) => e.type === "MemberExpression", E = (e) => e.type === "ExpressionStatement", C = (e) => e.type === "ImportDeclaration", k = (e, t) => e.filter((r) => b(r, t)).map((r) => r.source.raw)[0] ?? null, b = (e, t) => e.specifiers.some((r) => r.local.name === t), x = (e) => `
` + e.filter((t) => !!t).map((t) => `vi.mock(${t});`).join(`
`);
export {
P as default
};