vite-plugin-turbosnap
Version:
Enables the use of Chromatic Turbosnap in vite storybook projects
64 lines (61 loc) • 2.16 kB
JavaScript
import { writeFile } from 'fs/promises';
import path from 'path';
function stripQueryParams(filePath) {
return filePath.split("?")[0];
}
function isUserCode(moduleName) {
return Boolean(moduleName && !moduleName.startsWith("vite/") && !moduleName.startsWith("\0") && !moduleName.startsWith("\0") && moduleName !== "react/jsx-runtime" && !moduleName.match(/node_modules\//));
}
function pluginTurbosnap({
rootDir
}) {
function normalize(filename) {
if (filename.startsWith("/virtual:")) {
return filename;
} else {
const relativePath = path.relative(rootDir, stripQueryParams(filename));
return `./${relativePath}`;
}
}
function createReasons(importers) {
return (importers || []).map((i) => ({ moduleName: normalize(i) }));
}
function createStatsMapModule(filename, importers) {
return {
id: filename,
name: filename,
reasons: createReasons(importers)
};
}
const statsMap = /* @__PURE__ */ new Map();
return {
name: "rollup-plugin-turbosnap",
enforce: "post",
moduleParsed: function(mod) {
if (isUserCode(mod.id)) {
mod.importedIds.concat(mod.dynamicallyImportedIds).filter((name) => isUserCode(name)).forEach((depIdUnsafe) => {
const depId = normalize(depIdUnsafe);
if (statsMap.has(depId)) {
const m = statsMap.get(depId);
if (m) {
m.reasons = (m.reasons ?? []).concat(createReasons([mod.id])).filter((r) => r.moduleName !== depId);
statsMap.set(depId, m);
}
} else {
statsMap.set(depId, createStatsMapModule(depId, [mod.id]));
}
});
}
},
generateBundle: function(outOpts) {
const stats = { modules: Array.from(statsMap.values()) };
if (!outOpts.dir) {
throw new Error("Vite option `build.outDir` was not configured.");
}
const filename = path.resolve(outOpts.dir, "preview-stats.json");
console.log(`rollup-plugin-turbosnap: writing to ${filename}`);
return writeFile(filename, JSON.stringify(stats, null, 2));
}
};
}
export { pluginTurbosnap as default };