UNPKG

5.37 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.withSmartKnobs = exports.propTypeKnobResolver = exports.addKnobResolver = undefined;
7
8var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
9
10var _react = require('react');
11
12var _storybook = require('@kadira/storybook');
13
14var _storybookAddonKnobs = require('@kadira/storybook-addon-knobs');
15
16function _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; }
17
18function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
19
20var knobResolvers = {};
21var addKnobResolver = exports.addKnobResolver = function addKnobResolver(_ref) {
22 var name = _ref.name,
23 resolver = _ref.resolver,
24 _ref$weight = _ref.weight,
25 weight = _ref$weight === undefined ? 0 : _ref$weight;
26 return knobResolvers[name] = { name: name, resolver: resolver, weight: weight };
27};
28
29/*
30 * Register default knob resolvers.
31 * --------------------------------
32 */
33
34var propTypeKnobResolver = exports.propTypeKnobResolver = function propTypeKnobResolver(name, knob) {
35 for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
36 args[_key - 2] = arguments[_key];
37 }
38
39 return function (propName, propType, value, propTypes, defaultProps) {
40 return propType.type.name === name ? knob.apply(undefined, [propName, value].concat(args)) : undefined;
41 };
42};
43
44/* eslint-disable no-multi-spaces */
45// Default simple PropType based knob map.
46var propTypeKnobsMap = [{ name: 'string', knob: _storybookAddonKnobs.text }, { name: 'number', knob: _storybookAddonKnobs.number }, { name: 'bool', knob: _storybookAddonKnobs.boolean }, { name: 'func', knob: function knob(name, value) {
47 return value || (0, _storybook.action)(name);
48 } }, { name: 'object', knob: _storybookAddonKnobs.object }, { name: 'node', knob: _storybookAddonKnobs.text }, { name: 'element', knob: _storybookAddonKnobs.text }];
49
50propTypeKnobsMap.forEach(function (_ref2, weight) {
51 var name = _ref2.name,
52 knob = _ref2.knob,
53 _ref2$args = _ref2.args,
54 args = _ref2$args === undefined ? [] : _ref2$args;
55 return addKnobResolver({
56 weight: weight * 10,
57 name: 'PropTypes.' + name,
58 resolver: propTypeKnobResolver.apply(undefined, [name, knob].concat(_toConsumableArray(args)))
59 });
60});
61
62// Register 'oneOf' PropType knob resolver.
63addKnobResolver({
64 name: 'PropTypes.oneOf',
65 resolver: function resolver(propName, propType, value, propTypes, defaultProps) {
66 /* eslint-disable quotes */
67 if (propType.type.name === 'enum' && propType.type.value.length) {
68 try {
69 var options = propType.type.value.map(function (value) {
70 return value.value;
71 })
72 // Cleanup string quotes, if any.
73 .map(function (value) {
74 return value[0] === "'" && value[value.length - 1] === "'" ? '"' + value.replace(/'"'/g, '\\"').slice(1, value.length - 1) + '"' : value;
75 }).map(JSON.parse).reduce(function (res, value) {
76 return _extends({}, res, _defineProperty({}, value, value));
77 }, {});
78
79 return (0, _storybookAddonKnobs.select)(propName, _extends({ '': '--' }, options), defaultProps[propName]);
80 } catch (e) {}
81 }
82 }
83});
84
85var withSmartKnobs = exports.withSmartKnobs = function withSmartKnobs(story, context) {
86 var component = story(context);
87 var _component$type$__doc = component.type.__docgenInfo;
88 _component$type$__doc = _component$type$__doc === undefined ? { props: {} } : _component$type$__doc;
89 var props = _component$type$__doc.props;
90
91 var defaultProps = _extends({}, component.type.defaultProps || {}, component.props);
92
93 var finalProps = Object.keys(props).reduce(function (acc, n) {
94 var item = props[n];
95 if (!item.type) {
96 console.warn('There is a prop with defaultValue ' + item.defaultValue.value + ' but it wasnt specified on element.propTypes. Check story: "' + context.kind + '".');
97 return acc;
98 }
99
100 return _extends({}, acc, _defineProperty({}, n, item));
101 }, {});
102
103 return (0, _storybookAddonKnobs.withKnobs)(function () {
104 return (0, _react.cloneElement)(component, resolvePropValues(finalProps, defaultProps));
105 }, context);
106};
107
108var resolvePropValues = function resolvePropValues(propTypes, defaultProps) {
109 var propNames = Object.keys(propTypes);
110 var resolvers = Object.keys(knobResolvers).sort(function (a, b) {
111 return knobResolvers[a].weight < knobResolvers[b].weight;
112 }).map(function (name) {
113 return knobResolvers[name].resolver;
114 });
115
116 return propNames.map(function (propName) {
117 return resolvers.reduce(function (value, resolver) {
118 return value !== undefined ? value : resolver(propName, propTypes[propName], defaultProps[propName], propTypes, defaultProps);
119 }, undefined);
120 }).reduce(function (props, value, i) {
121 return _extends({}, props, _defineProperty({}, propNames[i], value));
122 }, defaultProps);
123};
\No newline at end of file