@storybook/react 6.5.0-alpha.9 → 6.5.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. package/README.md +2 -2
  2. package/dist/cjs/client/docs/config.js +29 -0
  3. package/dist/cjs/client/docs/extractArgTypes.js +54 -0
  4. package/dist/cjs/client/docs/extractProps.js +77 -0
  5. package/dist/cjs/client/docs/jsxDecorator.js +277 -0
  6. package/dist/cjs/client/docs/lib/captions.js +18 -0
  7. package/dist/cjs/client/docs/lib/componentTypes.js +24 -0
  8. package/dist/cjs/client/docs/lib/defaultValues/createDefaultValue.js +81 -0
  9. package/dist/cjs/client/docs/lib/defaultValues/createFromRawDefaultProp.js +225 -0
  10. package/dist/cjs/client/docs/lib/defaultValues/generateArray.js +29 -0
  11. package/dist/cjs/client/docs/lib/defaultValues/generateObject.js +29 -0
  12. package/dist/cjs/client/docs/lib/defaultValues/index.js +37 -0
  13. package/dist/cjs/client/docs/lib/defaultValues/prettyIdentifier.js +34 -0
  14. package/dist/cjs/client/docs/lib/generateCode.js +89 -0
  15. package/dist/cjs/client/docs/lib/index.js +63 -0
  16. package/dist/cjs/client/docs/lib/inspection/acornParser.js +254 -0
  17. package/dist/cjs/client/docs/lib/inspection/index.js +37 -0
  18. package/dist/cjs/client/docs/lib/inspection/inspectValue.js +26 -0
  19. package/dist/cjs/client/docs/lib/inspection/types.js +19 -0
  20. package/dist/cjs/client/docs/lib/isHtmlTag.js +18 -0
  21. package/dist/cjs/client/docs/propTypes/createType.js +469 -0
  22. package/dist/cjs/client/docs/propTypes/generateFuncSignature.js +78 -0
  23. package/dist/cjs/client/docs/propTypes/handleProp.js +54 -0
  24. package/dist/cjs/client/docs/propTypes/rawDefaultPropResolvers.js +47 -0
  25. package/dist/cjs/client/docs/propTypes/sortProps.js +37 -0
  26. package/dist/cjs/client/docs/react-argtypes.stories.js +129 -0
  27. package/dist/cjs/client/docs/typeScript/handleProp.js +38 -0
  28. package/dist/cjs/client/index.js +30 -14
  29. package/dist/cjs/client/preview/config.js +1 -1
  30. package/dist/cjs/client/preview/index.js +3 -3
  31. package/dist/cjs/client/preview/render.js +117 -34
  32. package/dist/cjs/client/preview/types-6-0.js +5 -1
  33. package/dist/cjs/client/preview/types-6-3.js +2 -0
  34. package/dist/cjs/client/preview/types-7-0.js +5 -1
  35. package/dist/cjs/client/preview/types.js +5 -1
  36. package/dist/cjs/client/testing/index.js +112 -0
  37. package/dist/cjs/demo/Welcome.js +7 -3
  38. package/dist/cjs/server/{framework-preset-react-docgen.js → framework-preset-react-docs.js} +21 -11
  39. package/dist/cjs/server/framework-preset-react-dom-hack.js +31 -0
  40. package/dist/cjs/server/framework-preset-react.js +2 -2
  41. package/dist/cjs/server/preset.js +4 -4
  42. package/dist/esm/client/docs/config.js +16 -0
  43. package/dist/esm/client/docs/extractArgTypes.js +39 -0
  44. package/dist/esm/client/docs/extractProps.js +54 -0
  45. package/dist/esm/client/docs/jsxDecorator.js +218 -0
  46. package/dist/esm/client/docs/lib/captions.js +6 -0
  47. package/dist/esm/client/docs/lib/componentTypes.js +9 -0
  48. package/dist/esm/client/docs/lib/defaultValues/createDefaultValue.js +67 -0
  49. package/dist/esm/client/docs/lib/defaultValues/createFromRawDefaultProp.js +191 -0
  50. package/dist/esm/client/docs/lib/defaultValues/generateArray.js +19 -0
  51. package/dist/esm/client/docs/lib/defaultValues/generateObject.js +19 -0
  52. package/dist/esm/client/docs/lib/defaultValues/index.js +2 -0
  53. package/dist/esm/client/docs/lib/defaultValues/prettyIdentifier.js +22 -0
  54. package/dist/esm/client/docs/lib/generateCode.js +68 -0
  55. package/dist/esm/client/docs/lib/index.js +4 -0
  56. package/dist/esm/client/docs/lib/inspection/acornParser.js +213 -0
  57. package/dist/esm/client/docs/lib/inspection/index.js +2 -0
  58. package/dist/esm/client/docs/lib/inspection/inspectValue.js +16 -0
  59. package/dist/esm/client/docs/lib/inspection/types.js +12 -0
  60. package/dist/esm/client/docs/lib/isHtmlTag.js +6 -0
  61. package/dist/esm/client/docs/propTypes/createType.js +449 -0
  62. package/dist/esm/client/docs/propTypes/generateFuncSignature.js +62 -0
  63. package/dist/esm/client/docs/propTypes/handleProp.js +39 -0
  64. package/dist/esm/client/docs/propTypes/rawDefaultPropResolvers.js +32 -0
  65. package/dist/esm/client/docs/propTypes/sortProps.js +24 -0
  66. package/dist/esm/client/docs/react-argtypes.stories.js +97 -0
  67. package/dist/esm/client/docs/typeScript/handleProp.js +27 -0
  68. package/dist/esm/client/index.js +1 -0
  69. package/dist/esm/client/preview/index.js +1 -1
  70. package/dist/esm/client/preview/render.js +106 -28
  71. package/dist/esm/client/preview/types-6-0.js +1 -0
  72. package/dist/esm/client/preview/types-6-3.js +3 -1
  73. package/dist/esm/client/preview/types-7-0.js +1 -0
  74. package/dist/esm/client/preview/types.js +1 -0
  75. package/dist/esm/client/testing/index.js +96 -0
  76. package/dist/esm/demo/Welcome.js +7 -4
  77. package/dist/{modern/server/framework-preset-react-docgen.js → esm/server/framework-preset-react-docs.js} +15 -11
  78. package/dist/esm/server/framework-preset-react-dom-hack.js +21 -0
  79. package/dist/esm/server/framework-preset-react.js +2 -2
  80. package/dist/esm/server/preset.js +2 -2
  81. package/dist/modern/client/docs/config.js +14 -0
  82. package/dist/modern/client/docs/extractArgTypes.js +38 -0
  83. package/dist/modern/client/docs/extractProps.js +42 -0
  84. package/dist/modern/client/docs/jsxDecorator.js +177 -0
  85. package/dist/modern/client/docs/lib/captions.js +6 -0
  86. package/dist/modern/client/docs/lib/componentTypes.js +2 -0
  87. package/dist/modern/client/docs/lib/defaultValues/createDefaultValue.js +72 -0
  88. package/dist/modern/client/docs/lib/defaultValues/createFromRawDefaultProp.js +181 -0
  89. package/dist/modern/client/docs/lib/defaultValues/generateArray.js +21 -0
  90. package/dist/modern/client/docs/lib/defaultValues/generateObject.js +21 -0
  91. package/dist/modern/client/docs/lib/defaultValues/index.js +2 -0
  92. package/dist/modern/client/docs/lib/defaultValues/prettyIdentifier.js +24 -0
  93. package/dist/modern/client/docs/lib/generateCode.js +59 -0
  94. package/dist/modern/client/docs/lib/index.js +4 -0
  95. package/dist/modern/client/docs/lib/inspection/acornParser.js +211 -0
  96. package/dist/modern/client/docs/lib/inspection/index.js +2 -0
  97. package/dist/modern/client/docs/lib/inspection/inspectValue.js +15 -0
  98. package/dist/modern/client/docs/lib/inspection/types.js +12 -0
  99. package/dist/modern/client/docs/lib/isHtmlTag.js +4 -0
  100. package/dist/modern/client/docs/propTypes/createType.js +446 -0
  101. package/dist/modern/client/docs/propTypes/generateFuncSignature.js +57 -0
  102. package/dist/modern/client/docs/propTypes/handleProp.js +39 -0
  103. package/dist/modern/client/docs/propTypes/rawDefaultPropResolvers.js +31 -0
  104. package/dist/modern/client/docs/propTypes/sortProps.js +14 -0
  105. package/dist/modern/client/docs/react-argtypes.stories.js +54 -0
  106. package/dist/modern/client/docs/typeScript/handleProp.js +28 -0
  107. package/dist/modern/client/index.js +1 -0
  108. package/dist/modern/client/preview/index.js +1 -1
  109. package/dist/modern/client/preview/render.js +51 -6
  110. package/dist/modern/client/preview/types-6-0.js +1 -0
  111. package/dist/modern/client/preview/types-6-3.js +3 -1
  112. package/dist/modern/client/preview/types-7-0.js +1 -0
  113. package/dist/modern/client/preview/types.js +1 -0
  114. package/dist/modern/client/testing/index.js +96 -0
  115. package/dist/modern/demo/Welcome.js +10 -6
  116. package/dist/{esm/server/framework-preset-react-docgen.js → modern/server/framework-preset-react-docs.js} +15 -11
  117. package/dist/modern/server/framework-preset-react-dom-hack.js +21 -0
  118. package/dist/modern/server/framework-preset-react.js +2 -2
  119. package/dist/modern/server/preset.js +2 -2
  120. package/dist/ts3.4/client/docs/config.d.ts +13 -0
  121. package/dist/ts3.4/client/docs/extractArgTypes.d.ts +2 -0
  122. package/dist/ts3.4/client/docs/extractProps.d.ts +5 -0
  123. package/dist/ts3.4/client/docs/jsxDecorator.d.ts +23 -0
  124. package/dist/ts3.4/client/docs/lib/captions.d.ts +6 -0
  125. package/dist/ts3.4/client/docs/lib/componentTypes.d.ts +2 -0
  126. package/dist/ts3.4/client/docs/lib/defaultValues/createDefaultValue.d.ts +2 -0
  127. package/dist/ts3.4/client/docs/lib/defaultValues/createFromRawDefaultProp.d.ts +11 -0
  128. package/dist/ts3.4/client/docs/lib/defaultValues/generateArray.d.ts +3 -0
  129. package/dist/ts3.4/client/docs/lib/defaultValues/generateObject.d.ts +3 -0
  130. package/dist/ts3.4/client/docs/lib/defaultValues/index.d.ts +2 -0
  131. package/dist/ts3.4/client/docs/lib/defaultValues/prettyIdentifier.d.ts +4 -0
  132. package/dist/ts3.4/client/docs/lib/generateCode.d.ts +3 -0
  133. package/dist/ts3.4/client/docs/lib/index.d.ts +4 -0
  134. package/dist/ts3.4/client/docs/lib/inspection/acornParser.d.ts +7 -0
  135. package/dist/ts3.4/client/docs/lib/inspection/index.d.ts +2 -0
  136. package/dist/ts3.4/client/docs/lib/inspection/inspectValue.d.ts +2 -0
  137. package/dist/ts3.4/client/docs/lib/inspection/types.d.ts +50 -0
  138. package/dist/ts3.4/client/docs/lib/isHtmlTag.d.ts +1 -0
  139. package/dist/ts3.4/client/docs/propTypes/createType.d.ts +2 -0
  140. package/dist/ts3.4/client/docs/propTypes/generateFuncSignature.d.ts +4 -0
  141. package/dist/ts3.4/client/docs/propTypes/handleProp.d.ts +5 -0
  142. package/dist/ts3.4/client/docs/propTypes/rawDefaultPropResolvers.d.ts +1 -0
  143. package/dist/ts3.4/client/docs/propTypes/sortProps.d.ts +4 -0
  144. package/dist/ts3.4/client/docs/react-argtypes.stories.d.ts +1 -0
  145. package/dist/ts3.4/client/docs/typeScript/handleProp.d.ts +3 -0
  146. package/dist/ts3.4/client/index.d.ts +1 -0
  147. package/dist/ts3.4/client/testing/index.d.ts +84 -0
  148. package/dist/ts3.4/server/framework-preset-react-docs.d.ts +6 -0
  149. package/dist/ts3.4/server/framework-preset-react-dom-hack.d.ts +32 -0
  150. package/dist/ts3.4/server/framework-preset-react.d.ts +1 -46
  151. package/dist/ts3.4/server/preset.d.ts +1 -1
  152. package/dist/ts3.9/client/docs/config.d.ts +13 -0
  153. package/dist/ts3.9/client/docs/extractArgTypes.d.ts +2 -0
  154. package/dist/ts3.9/client/docs/extractProps.d.ts +5 -0
  155. package/dist/ts3.9/client/docs/jsxDecorator.d.ts +23 -0
  156. package/dist/ts3.9/client/docs/lib/captions.d.ts +6 -0
  157. package/dist/ts3.9/client/docs/lib/componentTypes.d.ts +2 -0
  158. package/dist/ts3.9/client/docs/lib/defaultValues/createDefaultValue.d.ts +2 -0
  159. package/dist/ts3.9/client/docs/lib/defaultValues/createFromRawDefaultProp.d.ts +11 -0
  160. package/dist/ts3.9/client/docs/lib/defaultValues/generateArray.d.ts +3 -0
  161. package/dist/ts3.9/client/docs/lib/defaultValues/generateObject.d.ts +3 -0
  162. package/dist/ts3.9/client/docs/lib/defaultValues/index.d.ts +2 -0
  163. package/dist/ts3.9/client/docs/lib/defaultValues/prettyIdentifier.d.ts +4 -0
  164. package/dist/ts3.9/client/docs/lib/generateCode.d.ts +3 -0
  165. package/dist/ts3.9/client/docs/lib/index.d.ts +4 -0
  166. package/dist/ts3.9/client/docs/lib/inspection/acornParser.d.ts +7 -0
  167. package/dist/ts3.9/client/docs/lib/inspection/index.d.ts +2 -0
  168. package/dist/ts3.9/client/docs/lib/inspection/inspectValue.d.ts +2 -0
  169. package/dist/ts3.9/client/docs/lib/inspection/types.d.ts +50 -0
  170. package/dist/ts3.9/client/docs/lib/isHtmlTag.d.ts +1 -0
  171. package/dist/ts3.9/client/docs/propTypes/createType.d.ts +2 -0
  172. package/dist/ts3.9/client/docs/propTypes/generateFuncSignature.d.ts +4 -0
  173. package/dist/ts3.9/client/docs/propTypes/handleProp.d.ts +5 -0
  174. package/dist/ts3.9/client/docs/propTypes/rawDefaultPropResolvers.d.ts +1 -0
  175. package/dist/ts3.9/client/docs/propTypes/sortProps.d.ts +4 -0
  176. package/dist/ts3.9/client/docs/react-argtypes.stories.d.ts +1 -0
  177. package/dist/ts3.9/client/docs/typeScript/handleProp.d.ts +3 -0
  178. package/dist/ts3.9/client/index.d.ts +1 -0
  179. package/dist/ts3.9/client/preview/render.d.ts +1 -1
  180. package/dist/ts3.9/client/preview/types-6-0.d.ts +3 -3
  181. package/dist/ts3.9/client/preview/types-7-0.d.ts +2 -2
  182. package/dist/ts3.9/client/testing/index.d.ts +84 -0
  183. package/dist/ts3.9/server/framework-preset-cra.d.ts +1 -1
  184. package/dist/ts3.9/server/framework-preset-react-docs.d.ts +6 -0
  185. package/dist/ts3.9/server/framework-preset-react-dom-hack.d.ts +32 -0
  186. package/dist/ts3.9/server/framework-preset-react.d.ts +1 -46
  187. package/dist/ts3.9/server/options.d.ts +1 -1
  188. package/dist/ts3.9/server/preset.d.ts +2 -2
  189. package/package.json +38 -14
  190. package/types/index.ts +9 -1
  191. package/dist/cjs/typings.d.js +0 -1
  192. package/dist/esm/typings.d.js +0 -0
  193. package/dist/modern/typings.d.js +0 -0
  194. package/dist/ts3.4/server/framework-preset-react-docgen.d.ts +0 -5
  195. package/dist/ts3.9/server/framework-preset-react-docgen.d.ts +0 -5
@@ -0,0 +1,38 @@
1
+ import "core-js/modules/es.array.reduce.js";
2
+ import { extractProps } from './extractProps';
3
+ export const extractArgTypes = component => {
4
+ if (component) {
5
+ const {
6
+ rows
7
+ } = extractProps(component);
8
+
9
+ if (rows) {
10
+ return rows.reduce((acc, row) => {
11
+ const {
12
+ name,
13
+ description,
14
+ type,
15
+ sbType,
16
+ defaultValue: defaultSummary,
17
+ jsDocTags,
18
+ required
19
+ } = row;
20
+ acc[name] = {
21
+ name,
22
+ description,
23
+ type: Object.assign({
24
+ required
25
+ }, sbType),
26
+ table: {
27
+ type,
28
+ jsDocTags,
29
+ defaultValue: defaultSummary
30
+ }
31
+ };
32
+ return acc;
33
+ }, {});
34
+ }
35
+ }
36
+
37
+ return null;
38
+ };
@@ -0,0 +1,42 @@
1
+ import PropTypes from 'prop-types';
2
+ import { hasDocgen, extractComponentProps, TypeSystem } from '@storybook/docs-tools';
3
+ import { enhancePropTypesProps } from './propTypes/handleProp';
4
+ import { enhanceTypeScriptProps } from './typeScript/handleProp';
5
+ import { isMemo } from './lib'; // FIXME
6
+
7
+ const propTypesMap = new Map();
8
+ Object.keys(PropTypes).forEach(typeName => {
9
+ // @ts-ignore
10
+ const type = PropTypes[typeName];
11
+ propTypesMap.set(type, typeName);
12
+ propTypesMap.set(type.isRequired, typeName);
13
+ });
14
+
15
+ function getPropDefs(component, section) {
16
+ let processedComponent = component; // eslint-disable-next-line react/forbid-foreign-prop-types
17
+
18
+ if (!hasDocgen(component) && !component.propTypes && isMemo(component)) {
19
+ processedComponent = component.type;
20
+ }
21
+
22
+ const extractedProps = extractComponentProps(processedComponent, section);
23
+
24
+ if (extractedProps.length === 0) {
25
+ return [];
26
+ }
27
+
28
+ switch (extractedProps[0].typeSystem) {
29
+ case TypeSystem.JAVASCRIPT:
30
+ return enhancePropTypesProps(extractedProps, component);
31
+
32
+ case TypeSystem.TYPESCRIPT:
33
+ return enhanceTypeScriptProps(extractedProps);
34
+
35
+ default:
36
+ return extractedProps.map(x => x.propDef);
37
+ }
38
+ }
39
+
40
+ export const extractProps = component => ({
41
+ rows: getPropDefs(component, 'props')
42
+ });
@@ -0,0 +1,177 @@
1
+ const _excluded = ["mdxType", "originalType", "children"];
2
+
3
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
4
+
5
+ import React, { createElement } from 'react';
6
+ import reactElementToJSXString from 'react-element-to-jsx-string';
7
+ import dedent from 'ts-dedent';
8
+ import deprecate from 'util-deprecate';
9
+ import { addons, useEffect } from '@storybook/addons';
10
+ import { SourceType, SNIPPET_RENDERED, getDocgenSection } from '@storybook/docs-tools';
11
+ import { logger } from '@storybook/client-logger';
12
+ import { isMemo, isForwardRef } from './lib';
13
+
14
+ /** Run the user supplied onBeforeRender function if it exists */
15
+ const applyBeforeRender = (domString, options) => {
16
+ if (typeof options.onBeforeRender !== 'function') {
17
+ return domString;
18
+ }
19
+
20
+ const deprecatedOnBeforeRender = deprecate(options.onBeforeRender, dedent`
21
+ StoryFn.parameters.jsx.onBeforeRender was deprecated.
22
+ Prefer StoryFn.parameters.jsx.transformSource instead.
23
+ See https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#deprecated-onbeforerender for details.
24
+ `);
25
+ return deprecatedOnBeforeRender(domString);
26
+ };
27
+ /** Run the user supplied transformSource function if it exists */
28
+
29
+
30
+ const applyTransformSource = (domString, options, context) => {
31
+ if (typeof options.transformSource !== 'function') {
32
+ return domString;
33
+ }
34
+
35
+ return options.transformSource(domString, context);
36
+ };
37
+ /** Apply the users parameters and render the jsx for a story */
38
+
39
+
40
+ export const renderJsx = (code, options) => {
41
+ if (typeof code === 'undefined') {
42
+ logger.warn('Too many skip or undefined component');
43
+ return null;
44
+ }
45
+
46
+ let renderedJSX = code;
47
+ const Type = renderedJSX.type;
48
+
49
+ for (let i = 0; i < options.skip; i += 1) {
50
+ if (typeof renderedJSX === 'undefined') {
51
+ logger.warn('Cannot skip undefined element');
52
+ return null;
53
+ }
54
+
55
+ if (React.Children.count(renderedJSX) > 1) {
56
+ logger.warn('Trying to skip an array of elements');
57
+ return null;
58
+ }
59
+
60
+ if (typeof renderedJSX.props.children === 'undefined') {
61
+ logger.warn('Not enough children to skip elements.');
62
+
63
+ if (typeof renderedJSX.type === 'function' && renderedJSX.type.name === '') {
64
+ renderedJSX = /*#__PURE__*/React.createElement(Type, renderedJSX.props);
65
+ }
66
+ } else if (typeof renderedJSX.props.children === 'function') {
67
+ renderedJSX = renderedJSX.props.children();
68
+ } else {
69
+ renderedJSX = renderedJSX.props.children;
70
+ }
71
+ }
72
+
73
+ const displayNameDefaults = typeof options.displayName === 'string' ? {
74
+ showFunctions: true,
75
+ displayName: () => options.displayName
76
+ } : {
77
+ // To get exotic component names resolving properly
78
+ displayName: el => el.type.displayName || getDocgenSection(el.type, 'displayName') || (el.type.name !== '_default' ? el.type.name : null) || (typeof el.type === 'function' ? 'No Display Name' : null) || (isForwardRef(el.type) ? el.type.render.name : null) || (isMemo(el.type) ? el.type.type.name : null) || el.type
79
+ };
80
+ const filterDefaults = {
81
+ filterProps: (value, key) => value !== undefined
82
+ };
83
+ const opts = Object.assign({}, displayNameDefaults, filterDefaults, options);
84
+ const result = React.Children.map(code, c => {
85
+ // @ts-ignore FIXME: workaround react-element-to-jsx-string
86
+ const child = typeof c === 'number' ? c.toString() : c;
87
+ let string = applyBeforeRender(reactElementToJSXString(child, opts), options);
88
+
89
+ if (string.indexOf('&quot;') > -1) {
90
+ const matches = string.match(/\S+=\\"([^"]*)\\"/g);
91
+
92
+ if (matches) {
93
+ matches.forEach(match => {
94
+ string = string.replace(match, match.replace(/&quot;/g, "'"));
95
+ });
96
+ }
97
+ }
98
+
99
+ return string;
100
+ }).join('\n');
101
+ return result.replace(/function\s+noRefCheck\(\)\s+\{\}/, '() => {}');
102
+ };
103
+ const defaultOpts = {
104
+ skip: 0,
105
+ showFunctions: false,
106
+ enableBeautify: true,
107
+ showDefaultProps: false
108
+ };
109
+ export const skipJsxRender = context => {
110
+ var _context$parameters$d;
111
+
112
+ const sourceParams = context === null || context === void 0 ? void 0 : (_context$parameters$d = context.parameters.docs) === null || _context$parameters$d === void 0 ? void 0 : _context$parameters$d.source;
113
+ const isArgsStory = context === null || context === void 0 ? void 0 : context.parameters.__isArgsStory; // always render if the user forces it
114
+
115
+ if ((sourceParams === null || sourceParams === void 0 ? void 0 : sourceParams.type) === SourceType.DYNAMIC) {
116
+ return false;
117
+ } // never render if the user is forcing the block to render code, or
118
+ // if the user provides code, or if it's not an args story.
119
+
120
+
121
+ return !isArgsStory || (sourceParams === null || sourceParams === void 0 ? void 0 : sourceParams.code) || (sourceParams === null || sourceParams === void 0 ? void 0 : sourceParams.type) === SourceType.CODE;
122
+ };
123
+
124
+ const isMdx = node => {
125
+ var _node$type, _node$props;
126
+
127
+ return ((_node$type = node.type) === null || _node$type === void 0 ? void 0 : _node$type.displayName) === 'MDXCreateElement' && !!((_node$props = node.props) !== null && _node$props !== void 0 && _node$props.mdxType);
128
+ };
129
+
130
+ const mdxToJsx = node => {
131
+ if (!isMdx(node)) return node;
132
+
133
+ const _node$props2 = node.props,
134
+ {
135
+ originalType,
136
+ children
137
+ } = _node$props2,
138
+ rest = _objectWithoutPropertiesLoose(_node$props2, _excluded);
139
+
140
+ let jsxChildren = [];
141
+
142
+ if (children) {
143
+ const array = Array.isArray(children) ? children : [children];
144
+ jsxChildren = array.map(mdxToJsx);
145
+ }
146
+
147
+ return /*#__PURE__*/createElement(originalType, rest, ...jsxChildren);
148
+ };
149
+
150
+ export const jsxDecorator = (storyFn, context) => {
151
+ var _context$parameters$d2, _context$parameters$d3;
152
+
153
+ const channel = addons.getChannel();
154
+ const skip = skipJsxRender(context);
155
+ const story = storyFn();
156
+ let jsx = '';
157
+ useEffect(() => {
158
+ if (!skip) channel.emit(SNIPPET_RENDERED, (context || {}).id, jsx);
159
+ }); // We only need to render JSX if the source block is actually going to
160
+ // consume it. Otherwise it's just slowing us down.
161
+
162
+ if (skip) {
163
+ return story;
164
+ }
165
+
166
+ const options = Object.assign({}, defaultOpts, (context === null || context === void 0 ? void 0 : context.parameters.jsx) || {}); // Exclude decorators from source code snippet by default
167
+
168
+ const storyJsx = context !== null && context !== void 0 && (_context$parameters$d2 = context.parameters.docs) !== null && _context$parameters$d2 !== void 0 && (_context$parameters$d3 = _context$parameters$d2.source) !== null && _context$parameters$d3 !== void 0 && _context$parameters$d3.excludeDecorators ? context.originalStoryFn(context.args, context) : story;
169
+ const sourceJsx = mdxToJsx(storyJsx);
170
+ const rendered = renderJsx(sourceJsx, options);
171
+
172
+ if (rendered) {
173
+ jsx = applyTransformSource(rendered, options, context);
174
+ }
175
+
176
+ return story;
177
+ };
@@ -0,0 +1,6 @@
1
+ export const CUSTOM_CAPTION = 'custom';
2
+ export const OBJECT_CAPTION = 'object';
3
+ export const ARRAY_CAPTION = 'array';
4
+ export const CLASS_CAPTION = 'class';
5
+ export const FUNCTION_CAPTION = 'func';
6
+ export const ELEMENT_CAPTION = 'element';
@@ -0,0 +1,2 @@
1
+ export const isMemo = component => component.$$typeof === Symbol.for('react.memo');
2
+ export const isForwardRef = component => component.$$typeof === Symbol.for('react.forward_ref');
@@ -0,0 +1,72 @@
1
+ import { createSummaryValue, isTooLongForDefaultValueSummary } from '@storybook/docs-tools';
2
+ import { FUNCTION_CAPTION, ELEMENT_CAPTION } from '../captions';
3
+ import { InspectionType, inspectValue } from '../inspection';
4
+ import { isHtmlTag } from '../isHtmlTag';
5
+ import { generateCode } from '../generateCode';
6
+ import { generateObject } from './generateObject';
7
+ import { generateArray } from './generateArray';
8
+ import { getPrettyIdentifier } from './prettyIdentifier';
9
+
10
+ function generateFunc({
11
+ inferredType,
12
+ ast
13
+ }) {
14
+ const {
15
+ identifier
16
+ } = inferredType;
17
+
18
+ if (identifier != null) {
19
+ return createSummaryValue(getPrettyIdentifier(inferredType), generateCode(ast));
20
+ }
21
+
22
+ const prettyCaption = generateCode(ast, true);
23
+ return !isTooLongForDefaultValueSummary(prettyCaption) ? createSummaryValue(prettyCaption) : createSummaryValue(FUNCTION_CAPTION, generateCode(ast));
24
+ } // All elements are JSX elements.
25
+ // JSX elements are not supported by escodegen.
26
+
27
+
28
+ function generateElement(defaultValue, inspectionResult) {
29
+ const {
30
+ inferredType
31
+ } = inspectionResult;
32
+ const {
33
+ identifier
34
+ } = inferredType;
35
+
36
+ if (identifier != null) {
37
+ if (!isHtmlTag(identifier)) {
38
+ const prettyIdentifier = getPrettyIdentifier(inferredType);
39
+ return createSummaryValue(prettyIdentifier, defaultValue);
40
+ }
41
+ }
42
+
43
+ return !isTooLongForDefaultValueSummary(defaultValue) ? createSummaryValue(defaultValue) : createSummaryValue(ELEMENT_CAPTION, defaultValue);
44
+ }
45
+
46
+ export function createDefaultValue(defaultValue) {
47
+ try {
48
+ const inspectionResult = inspectValue(defaultValue);
49
+
50
+ switch (inspectionResult.inferredType.type) {
51
+ case InspectionType.OBJECT:
52
+ return generateObject(inspectionResult);
53
+
54
+ case InspectionType.FUNCTION:
55
+ return generateFunc(inspectionResult);
56
+
57
+ case InspectionType.ELEMENT:
58
+ return generateElement(defaultValue, inspectionResult);
59
+
60
+ case InspectionType.ARRAY:
61
+ return generateArray(inspectionResult);
62
+
63
+ default:
64
+ return null;
65
+ }
66
+ } catch (e) {
67
+ // eslint-disable-next-line no-console
68
+ console.error(e);
69
+ }
70
+
71
+ return null;
72
+ }
@@ -0,0 +1,181 @@
1
+ import isPlainObject from 'lodash/isPlainObject';
2
+ import isFunction from 'lodash/isFunction';
3
+ import isString from 'lodash/isString'; // @ts-ignore
4
+
5
+ import reactElementToJSXString from 'react-element-to-jsx-string';
6
+ import { createSummaryValue, isTooLongForDefaultValueSummary } from '@storybook/docs-tools';
7
+ import { inspectValue } from '../inspection';
8
+ import { generateObject } from './generateObject';
9
+ import { generateArray } from './generateArray';
10
+ import { getPrettyElementIdentifier, getPrettyFuncIdentifier } from './prettyIdentifier';
11
+ import { OBJECT_CAPTION, FUNCTION_CAPTION, ELEMENT_CAPTION } from '../captions';
12
+ import { isHtmlTag } from '../isHtmlTag';
13
+
14
+ function isReactElement(element) {
15
+ return element.$$typeof != null;
16
+ }
17
+
18
+ export function extractFunctionName(func, propName) {
19
+ const {
20
+ name
21
+ } = func; // Comparison with the prop name is to discard inferred function names.
22
+
23
+ if (name !== '' && name !== 'anonymous' && name !== propName) {
24
+ return name;
25
+ }
26
+
27
+ return null;
28
+ }
29
+
30
+ const stringResolver = rawDefaultProp => {
31
+ return createSummaryValue(JSON.stringify(rawDefaultProp));
32
+ };
33
+
34
+ function generateReactObject(rawDefaultProp) {
35
+ const {
36
+ type
37
+ } = rawDefaultProp;
38
+ const {
39
+ displayName
40
+ } = type;
41
+ const jsx = reactElementToJSXString(rawDefaultProp, {});
42
+
43
+ if (displayName != null) {
44
+ const prettyIdentifier = getPrettyElementIdentifier(displayName);
45
+ return createSummaryValue(prettyIdentifier, jsx);
46
+ }
47
+
48
+ if (isString(type)) {
49
+ // This is an HTML element.
50
+ if (isHtmlTag(type)) {
51
+ const jsxCompact = reactElementToJSXString(rawDefaultProp, {
52
+ tabStop: 0
53
+ });
54
+ const jsxSummary = jsxCompact.replace(/\r?\n|\r/g, '');
55
+
56
+ if (!isTooLongForDefaultValueSummary(jsxSummary)) {
57
+ return createSummaryValue(jsxSummary);
58
+ }
59
+ }
60
+ }
61
+
62
+ return createSummaryValue(ELEMENT_CAPTION, jsx);
63
+ }
64
+
65
+ const objectResolver = rawDefaultProp => {
66
+ if (isReactElement(rawDefaultProp) && rawDefaultProp.type != null) {
67
+ return generateReactObject(rawDefaultProp);
68
+ }
69
+
70
+ if (isPlainObject(rawDefaultProp)) {
71
+ const inspectionResult = inspectValue(JSON.stringify(rawDefaultProp));
72
+ return generateObject(inspectionResult);
73
+ }
74
+
75
+ if (Array.isArray(rawDefaultProp)) {
76
+ const inspectionResult = inspectValue(JSON.stringify(rawDefaultProp));
77
+ return generateArray(inspectionResult);
78
+ }
79
+
80
+ return createSummaryValue(OBJECT_CAPTION);
81
+ };
82
+
83
+ const functionResolver = (rawDefaultProp, propDef) => {
84
+ let isElement = false;
85
+ let inspectionResult; // Try to display the name of the component. The body of the component is omitted since the code has been transpiled.
86
+
87
+ if (isFunction(rawDefaultProp.render)) {
88
+ isElement = true;
89
+ } else if (rawDefaultProp.prototype != null && isFunction(rawDefaultProp.prototype.render)) {
90
+ isElement = true;
91
+ } else {
92
+ let innerElement;
93
+
94
+ try {
95
+ inspectionResult = inspectValue(rawDefaultProp.toString());
96
+ const {
97
+ hasParams,
98
+ params
99
+ } = inspectionResult.inferredType;
100
+
101
+ if (hasParams) {
102
+ // It might be a functional component accepting props.
103
+ if (params.length === 1 && params[0].type === 'ObjectPattern') {
104
+ innerElement = rawDefaultProp({});
105
+ }
106
+ } else {
107
+ innerElement = rawDefaultProp();
108
+ }
109
+
110
+ if (innerElement != null) {
111
+ if (isReactElement(innerElement)) {
112
+ isElement = true;
113
+ }
114
+ }
115
+ } catch (e) {// do nothing.
116
+ }
117
+ }
118
+
119
+ const funcName = extractFunctionName(rawDefaultProp, propDef.name);
120
+
121
+ if (funcName != null) {
122
+ if (isElement) {
123
+ return createSummaryValue(getPrettyElementIdentifier(funcName));
124
+ }
125
+
126
+ if (inspectionResult != null) {
127
+ inspectionResult = inspectValue(rawDefaultProp.toString());
128
+ }
129
+
130
+ const {
131
+ hasParams
132
+ } = inspectionResult.inferredType;
133
+ return createSummaryValue(getPrettyFuncIdentifier(funcName, hasParams));
134
+ }
135
+
136
+ return createSummaryValue(isElement ? ELEMENT_CAPTION : FUNCTION_CAPTION);
137
+ };
138
+
139
+ const defaultResolver = rawDefaultProp => {
140
+ return createSummaryValue(rawDefaultProp.toString());
141
+ };
142
+
143
+ const DEFAULT_TYPE_RESOLVERS = {
144
+ string: stringResolver,
145
+ object: objectResolver,
146
+ function: functionResolver,
147
+ default: defaultResolver
148
+ };
149
+ export function createTypeResolvers(customResolvers = {}) {
150
+ return Object.assign({}, DEFAULT_TYPE_RESOLVERS, customResolvers);
151
+ } // When react-docgen cannot provide a defaultValue we take it from the raw defaultProp.
152
+ // It works fine for types that are not transpiled. For the types that are transpiled, we can only provide partial support.
153
+ // This means that:
154
+ // - The detail might not be available.
155
+ // - Identifiers might not be "prettified" for all the types.
156
+
157
+ export function createDefaultValueFromRawDefaultProp(rawDefaultProp, propDef, typeResolvers = DEFAULT_TYPE_RESOLVERS) {
158
+ try {
159
+ // Keep the extra () otherwise it will fail for functions.
160
+ switch (typeof rawDefaultProp) {
161
+ case 'string':
162
+ return typeResolvers.string(rawDefaultProp, propDef);
163
+
164
+ case 'object':
165
+ return typeResolvers.object(rawDefaultProp, propDef);
166
+
167
+ case 'function':
168
+ {
169
+ return typeResolvers.function(rawDefaultProp, propDef);
170
+ }
171
+
172
+ default:
173
+ return typeResolvers.default(rawDefaultProp, propDef);
174
+ }
175
+ } catch (e) {
176
+ // eslint-disable-next-line no-console
177
+ console.error(e);
178
+ }
179
+
180
+ return null;
181
+ }
@@ -0,0 +1,21 @@
1
+ import { createSummaryValue, isTooLongForDefaultValueSummary } from '@storybook/docs-tools';
2
+ import { ARRAY_CAPTION } from '../captions';
3
+ import { generateArrayCode } from '../generateCode';
4
+ export function generateArray({
5
+ inferredType,
6
+ ast
7
+ }) {
8
+ const {
9
+ depth
10
+ } = inferredType;
11
+
12
+ if (depth <= 2) {
13
+ const compactArray = generateArrayCode(ast, true);
14
+
15
+ if (!isTooLongForDefaultValueSummary(compactArray)) {
16
+ return createSummaryValue(compactArray);
17
+ }
18
+ }
19
+
20
+ return createSummaryValue(ARRAY_CAPTION, generateArrayCode(ast));
21
+ }
@@ -0,0 +1,21 @@
1
+ import { createSummaryValue, isTooLongForDefaultValueSummary } from '@storybook/docs-tools';
2
+ import { OBJECT_CAPTION } from '../captions';
3
+ import { generateObjectCode } from '../generateCode';
4
+ export function generateObject({
5
+ inferredType,
6
+ ast
7
+ }) {
8
+ const {
9
+ depth
10
+ } = inferredType;
11
+
12
+ if (depth === 1) {
13
+ const compactObject = generateObjectCode(ast, true);
14
+
15
+ if (!isTooLongForDefaultValueSummary(compactObject)) {
16
+ return createSummaryValue(compactObject);
17
+ }
18
+ }
19
+
20
+ return createSummaryValue(OBJECT_CAPTION, generateObjectCode(ast));
21
+ }
@@ -0,0 +1,2 @@
1
+ export * from './createDefaultValue';
2
+ export * from './createFromRawDefaultProp';
@@ -0,0 +1,24 @@
1
+ import { InspectionType } from '../inspection';
2
+ export function getPrettyIdentifier(inferredType) {
3
+ const {
4
+ type,
5
+ identifier
6
+ } = inferredType;
7
+
8
+ switch (type) {
9
+ case InspectionType.FUNCTION:
10
+ return getPrettyFuncIdentifier(identifier, inferredType.hasParams);
11
+
12
+ case InspectionType.ELEMENT:
13
+ return getPrettyElementIdentifier(identifier);
14
+
15
+ default:
16
+ return identifier;
17
+ }
18
+ }
19
+ export function getPrettyFuncIdentifier(identifier, hasArguments) {
20
+ return hasArguments ? `${identifier}( ... )` : `${identifier}()`;
21
+ }
22
+ export function getPrettyElementIdentifier(identifier) {
23
+ return `<${identifier} />`;
24
+ }
@@ -0,0 +1,59 @@
1
+ import { generate } from 'escodegen';
2
+ import dedent from 'ts-dedent';
3
+ const BASIC_OPTIONS = {
4
+ format: {
5
+ indent: {
6
+ style: ' '
7
+ },
8
+ semicolons: false
9
+ }
10
+ };
11
+ const COMPACT_OPTIONS = Object.assign({}, BASIC_OPTIONS, {
12
+ format: {
13
+ newline: ''
14
+ }
15
+ });
16
+ const PRETTY_OPTIONS = Object.assign({}, BASIC_OPTIONS);
17
+ export function generateCode(ast, compact = false) {
18
+ return generate(ast, compact ? COMPACT_OPTIONS : PRETTY_OPTIONS);
19
+ }
20
+ export function generateObjectCode(ast, compact = false) {
21
+ return !compact ? generateCode(ast) : generateCompactObjectCode(ast);
22
+ }
23
+
24
+ function generateCompactObjectCode(ast) {
25
+ let result = generateCode(ast, true); // Cannot get escodegen to add a space before the last } with the compact mode settings.
26
+ // Fix it until a better solution is found.
27
+
28
+ if (!result.endsWith(' }')) {
29
+ result = `${result.slice(0, -1)} }`;
30
+ }
31
+
32
+ return result;
33
+ }
34
+
35
+ export function generateArrayCode(ast, compact = false) {
36
+ return !compact ? generateMultilineArrayCode(ast) : generateCompactArrayCode(ast);
37
+ }
38
+
39
+ function generateMultilineArrayCode(ast) {
40
+ let result = generateCode(ast); // escodegen add extra spacing before the closing bracket of a multiple line array with a nested object.
41
+ // Fix it until a better solution is found.
42
+
43
+ if (result.endsWith(' }]')) {
44
+ result = dedent(result);
45
+ }
46
+
47
+ return result;
48
+ }
49
+
50
+ function generateCompactArrayCode(ast) {
51
+ let result = generateCode(ast, true); // escodegen add extra an extra before the opening bracket of a compact array that contains primitive values.
52
+ // Fix it until a better solution is found.
53
+
54
+ if (result.startsWith('[ ')) {
55
+ result = result.replace('[ ', '[');
56
+ }
57
+
58
+ return result;
59
+ }
@@ -0,0 +1,4 @@
1
+ export * from './captions';
2
+ export * from './isHtmlTag';
3
+ export * from './generateCode';
4
+ export * from './componentTypes';