UNPKG

storybook-react-rsbuild

Version:

Storybook for React and Rsbuild: Develop React components in isolation with Hot Reloading.

163 lines (159 loc) 6.54 kB
import CJS_COMPAT_NODE_URL_bce9f5a39a886437 from 'node:url'; import CJS_COMPAT_NODE_PATH_bce9f5a39a886437 from 'node:path'; import CJS_COMPAT_NODE_MODULE_bce9f5a39a886437 from "node:module"; var __filename = CJS_COMPAT_NODE_URL_bce9f5a39a886437.fileURLToPath(import.meta.url); var __dirname = CJS_COMPAT_NODE_PATH_bce9f5a39a886437.dirname(__filename); var require = CJS_COMPAT_NODE_MODULE_bce9f5a39a886437.createRequire(import.meta.url); // ------------------------------------------------------------ // end of CJS compatibility banner, injected by Storybook's esbuild configuration // ------------------------------------------------------------ import "./chunk-HLWUFMVK.js"; // src/plugins/react-docgen-typescript/utils/generate.ts import MagicString from "magic-string"; import ts from "typescript"; function createLiteral(value) { switch (typeof value) { case "string": return ts.factory.createStringLiteral(value); case "number": return ts.factory.createNumericLiteral(value); case "boolean": return value ? ts.factory.createTrue() : ts.factory.createFalse(); } } function insertTsIgnoreBeforeStatement(statement) { return ts.setSyntheticLeadingComments(statement, [ { text: " @ts-ignore", // Leading space is important here kind: ts.SyntaxKind.SingleLineCommentTrivia, pos: -1, end: -1 } ]), statement; } function setDisplayName(d) { return insertTsIgnoreBeforeStatement( ts.factory.createExpressionStatement( ts.factory.createBinaryExpression( ts.factory.createPropertyAccessExpression( ts.factory.createIdentifier(d.displayName), ts.factory.createIdentifier("displayName") ), ts.SyntaxKind.EqualsToken, ts.factory.createStringLiteral(d.displayName) ) ) ); } function createPropDefinition(propName, prop, options) { let setDefaultValue = (defaultValue) => ts.factory.createPropertyAssignment( ts.factory.createStringLiteral("defaultValue"), // Use a more extensive check on defaultValue. Sometimes the parser // returns an empty object. defaultValue?.value !== void 0 && (typeof defaultValue.value == "string" || typeof defaultValue.value == "number" || typeof defaultValue.value == "boolean") ? ts.factory.createObjectLiteralExpression([ ts.factory.createPropertyAssignment( ts.factory.createIdentifier("value"), createLiteral(defaultValue.value) ) ]) : ts.factory.createNull() ), setStringLiteralField = (fieldName, fieldValue) => ts.factory.createPropertyAssignment( ts.factory.createStringLiteral(fieldName), ts.factory.createStringLiteral(fieldValue) ), setDescription = (description) => setStringLiteralField("description", description), setName = (name) => setStringLiteralField("name", name), setRequired = (required) => ts.factory.createPropertyAssignment( ts.factory.createStringLiteral("required"), required ? ts.factory.createTrue() : ts.factory.createFalse() ), setValue = (typeValue) => Array.isArray(typeValue) && typeValue.every((value) => typeof value.value == "string") ? ts.factory.createPropertyAssignment( ts.factory.createStringLiteral("value"), ts.factory.createArrayLiteralExpression( typeValue.map( (value) => ts.factory.createObjectLiteralExpression([ setStringLiteralField("value", value.value) ]) ) ) ) : void 0, setType = (typeName, typeValue) => { let objectFields = [setStringLiteralField("name", typeName)], valueField = setValue(typeValue); return valueField && objectFields.push(valueField), ts.factory.createPropertyAssignment( ts.factory.createStringLiteral(options.typePropName), ts.factory.createObjectLiteralExpression(objectFields) ); }; return ts.factory.createPropertyAssignment( ts.factory.createStringLiteral(propName), ts.factory.createObjectLiteralExpression([ setDefaultValue(prop.defaultValue), setDescription(prop.description), setName(prop.name), setRequired(prop.required), setType(prop.type.name, prop.type.value) ]) ); } function setComponentDocGen(d, options) { return insertTsIgnoreBeforeStatement( ts.factory.createExpressionStatement( ts.factory.createBinaryExpression( // SimpleComponent.__docgenInfo ts.factory.createPropertyAccessExpression( ts.factory.createIdentifier(d.displayName), ts.factory.createIdentifier("__docgenInfo") ), ts.SyntaxKind.EqualsToken, ts.factory.createObjectLiteralExpression([ // SimpleComponent.__docgenInfo.description ts.factory.createPropertyAssignment( ts.factory.createStringLiteral("description"), ts.factory.createStringLiteral(d.description) ), // SimpleComponent.__docgenInfo.displayName ts.factory.createPropertyAssignment( ts.factory.createStringLiteral("displayName"), ts.factory.createStringLiteral(d.displayName) ), // SimpleComponent.__docgenInfo.props ts.factory.createPropertyAssignment( ts.factory.createStringLiteral("props"), ts.factory.createObjectLiteralExpression( Object.entries(d.props).map( ([propName, prop]) => createPropDefinition(propName, prop, options) ) ) ) ]) ) ) ); } function generateDocgenCodeBlock(options) { let sourceFile = ts.createSourceFile( options.filename, options.source, ts.ScriptTarget.ESNext ), wrapInTryStatement = (statements) => ts.factory.createTryStatement( ts.factory.createBlock(statements, !0), ts.factory.createCatchClause( ts.factory.createVariableDeclaration( ts.factory.createIdentifier("__react_docgen_typescript_loader_error") ), ts.factory.createBlock([]) ), void 0 ), codeBlocks = options.componentDocs.map( (d) => wrapInTryStatement( [ options.setDisplayName ? setDisplayName(d) : null, setComponentDocGen(d, options) ].filter((s2) => s2 !== null) ) ), printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed }), printNode = (sourceNode) => printer.printNode(ts.EmitHint.Unspecified, sourceNode, sourceFile), s = new MagicString(options.source); for (let node of codeBlocks) s.append(printNode(node)); return { code: s.toString(), map: s.generateMap() }; } export { generateDocgenCodeBlock };