storybook-framework-cedarjs
Version:
Storybook for CedarJS
61 lines (60 loc) • 1.76 kB
JavaScript
import path from "path";
import { createFilter } from "@rollup/pluginutils";
import MagicString from "magic-string";
import {
ERROR_CODES,
parse,
builtinHandlers as docgenHandlers,
builtinResolvers as docgenResolver,
builtinImporters as docgenImporters
} from "react-docgen";
import actualNameHandler from "./docgen-handlers/actualNameHandler.js";
const defaultHandlers = Object.values(docgenHandlers).map((handler) => handler);
const defaultResolver = new docgenResolver.FindExportedDefinitionsResolver();
const defaultImporter = docgenImporters.fsImporter;
const handlers = [...defaultHandlers, actualNameHandler];
function reactDocgen({
include = /\.(tsx?|jsx?)$/,
exclude = [/node_modules\/.*/]
} = {}) {
const cwd = process.cwd();
const filter = createFilter(include, exclude);
return {
name: "storybook:react-docgen-plugin",
enforce: "pre",
async transform(src, id) {
const relPath = path.relative(cwd, id);
if (!filter(relPath)) {
return;
}
try {
const docgenResults = parse(src, {
resolver: defaultResolver,
handlers,
importer: defaultImporter,
filename: id
});
const s = new MagicString(src);
docgenResults.forEach((info) => {
const { actualName, ...docgenInfo } = info;
if (actualName) {
const docNode = JSON.stringify(docgenInfo);
s.append(`;${actualName}.__docgenInfo=${docNode}`);
}
});
return {
code: s.toString(),
map: s.generateMap()
};
} catch (e) {
if (e.code === ERROR_CODES.MISSING_DEFINITION) {
return;
}
throw e;
}
}
};
}
export {
reactDocgen
};