UNPKG

5.96 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports["default"] = exports.jsxDecorator = void 0;
7
8var _react = _interopRequireDefault(require("react"));
9
10var _addons = require("@storybook/addons");
11
12var _reactElementToJsxString = _interopRequireDefault(require("react-element-to-jsx-string"));
13
14var _jsBeautify = require("js-beautify");
15
16var _constants = require("./constants");
17
18function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
19
20function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
21
22function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
23
24function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
25
26/** Run the user supplied onBeforeRender function if it exists */
27var applyBeforeRender = function applyBeforeRender(domString, options) {
28 if (typeof options.onBeforeRender !== 'function') {
29 return domString;
30 }
31
32 return options.onBeforeRender(domString);
33};
34/** Apply the users parameters and render the jsx for a story */
35
36
37var renderJsx = function renderJsx(code, options) {
38 var renderedJSX = code;
39 var Type = renderedJSX.type;
40
41 for (var i = 0; i < options.skip; i++) {
42 if (typeof renderedJSX === 'undefined') {
43 // eslint-disable-next-line no-console
44 console.warn('Cannot skip undefined element');
45 return;
46 }
47
48 if (_react["default"].Children.count(renderedJSX) > 1) {
49 // eslint-disable-next-line no-console
50 console.warn('Trying to skip an array of elements');
51 return;
52 }
53
54 if (typeof renderedJSX.props.children === 'undefined') {
55 // eslint-disable-next-line no-console
56 console.warn('Not enough children to skip elements.');
57
58 if (typeof Type === 'function' && Type.name === '') {
59 renderedJSX = _react["default"].createElement(Type, renderedJSX.props);
60 }
61 } else if (typeof renderedJSX.props.children === 'function') {
62 renderedJSX = renderedJSX.props.children();
63 } else {
64 renderedJSX = renderedJSX.props.children;
65 }
66 }
67
68 if (typeof renderedJSX === 'undefined') {
69 // eslint-disable-next-line no-console
70 return console.warn('Too many skip or undefined component');
71 }
72
73 while (typeof Type === 'function' && Type.name === '') {
74 renderedJSX = _react["default"].createElement(Type, renderedJSX.props);
75 Type = renderedJSX.type;
76 }
77
78 var ooo = typeof options.displayName === 'string' ? _objectSpread({}, options, {
79 showFunctions: true,
80 displayName: function displayName() {
81 return options.displayName;
82 }
83 }) : options;
84 return _react["default"].Children.map(renderedJSX, function (c) {
85 var string = applyBeforeRender((0, _reactElementToJsxString["default"])(c, ooo), options);
86 var matches = string.match(/\S+=\\"([^"]*)\\"/g);
87
88 if (matches) {
89 matches.forEach(function (match) {
90 string = string.replace(match, match.replace(/&quot;/g, "'"));
91 });
92 }
93
94 return string;
95 }).join('\n');
96};
97/** Extract the docs for all components used in a story */
98
99
100var getDocs = function getDocs(story) {
101 var types = {};
102 /** Walk the story for components */
103
104 function extract(innerChildren) {
105 if (!innerChildren) {
106 return;
107 }
108
109 if (Array.isArray(innerChildren)) {
110 innerChildren.forEach(extract);
111 return;
112 }
113
114 if (innerChildren.props && innerChildren.props.children) {
115 extract(innerChildren.props.children);
116 }
117
118 Object.values(innerChildren.props || {}).forEach(function (prop) {
119 extract(prop);
120 });
121
122 if (typeof innerChildren.type !== 'string' && innerChildren.type) {
123 var childType = innerChildren.type;
124 var name = childType.displayName || childType.name;
125
126 if (name && !types[name]) {
127 types[name] = childType.__docgenInfo;
128 }
129 }
130 }
131
132 extract(story);
133 return types;
134};
135
136var defaultOpts = {
137 skip: 0,
138 showDefaultProps: true,
139 showFunctions: true,
140 enableBeautify: true
141};
142/** Extract components from story and emit them to the panel */
143
144var jsxDecorator = (0, _addons.makeDecorator)({
145 name: 'jsx',
146 parameterName: 'jsx',
147 wrapper: function wrapper(storyFn, parameters) {
148 var story = storyFn();
149
150 var channel = _addons.addons.getChannel();
151
152 var options = _objectSpread({}, defaultOpts, {}, parameters && parameters.parameters.jsx || {});
153
154 var components = {};
155 var jsx = '';
156
157 if (story.template) {
158 if (options.enableBeautify) {
159 jsx = (0, _jsBeautify.html)(story.template, options);
160 } else {
161 jsx = story.template;
162 }
163 } else {
164 var rendered = renderJsx(story, options);
165
166 if (rendered) {
167 jsx = rendered;
168 components = getDocs(story);
169 }
170 }
171
172 channel.emit(_constants.EVENTS.ADD_JSX, (parameters || {}).id, jsx, components);
173 return story;
174 }
175});
176exports.jsxDecorator = jsxDecorator;
177var _default = {
178 addWithJSX: function addWithJSX(kind, storyFn) {
179 return this.add(kind, function (context) {
180 return jsxDecorator(storyFn, context);
181 });
182 }
183};
184exports["default"] = _default;
\No newline at end of file