UNPKG

8.07 kBJavaScriptView Raw
1"use strict";
2
3require("core-js/modules/es.symbol");
4
5require("core-js/modules/es.symbol.description");
6
7require("core-js/modules/es.symbol.iterator");
8
9require("core-js/modules/es.array.concat");
10
11require("core-js/modules/es.array.includes");
12
13require("core-js/modules/es.array.is-array");
14
15require("core-js/modules/es.array.iterator");
16
17require("core-js/modules/es.array.map");
18
19require("core-js/modules/es.array.reduce");
20
21require("core-js/modules/es.array.some");
22
23require("core-js/modules/es.date.to-string");
24
25require("core-js/modules/es.object.assign");
26
27require("core-js/modules/es.object.define-property");
28
29require("core-js/modules/es.object.entries");
30
31require("core-js/modules/es.object.to-string");
32
33require("core-js/modules/es.regexp.exec");
34
35require("core-js/modules/es.string.includes");
36
37require("core-js/modules/es.string.iterator");
38
39require("core-js/modules/es.string.replace");
40
41require("core-js/modules/web.dom-collections.iterator");
42
43require("core-js/modules/web.timers");
44
45Object.defineProperty(exports, "__esModule", {
46 value: true
47});
48exports["default"] = void 0;
49
50var _global = require("global");
51
52var _escapeHtml = _interopRequireDefault(require("escape-html"));
53
54var _clientApi = require("@storybook/client-api");
55
56var _KnobStore = _interopRequireDefault(require("./KnobStore"));
57
58var _shared = require("./shared");
59
60var _converters = require("./converters");
61
62function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
63
64function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
65
66function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
67
68function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
69
70function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
71
72function _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; }
73
74function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
75
76function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
77
78function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
79
80function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
81
82var knobValuesFromUrl = Object.entries((0, _clientApi.getQueryParams)()).reduce(function (acc, _ref) {
83 var _ref2 = _slicedToArray(_ref, 2),
84 k = _ref2[0],
85 v = _ref2[1];
86
87 if (k.includes('knob-')) {
88 return Object.assign({}, acc, _defineProperty({}, k.replace('knob-', ''), v));
89 }
90
91 return acc;
92}, {}); // This is used by _mayCallChannel to determine how long to wait to before triggering a panel update
93
94var PANEL_UPDATE_INTERVAL = 400;
95
96function escapeStrings(obj) {
97 if (typeof obj === 'string') {
98 return (0, _escapeHtml["default"])(obj);
99 }
100
101 if (obj == null || _typeof(obj) !== 'object') {
102 return obj;
103 }
104
105 if (Array.isArray(obj)) {
106 var newArray = obj.map(escapeStrings);
107 var didChange = newArray.some(function (newValue, key) {
108 return newValue !== obj[key];
109 });
110 return didChange ? newArray : obj;
111 }
112
113 return Object.entries(obj).reduce(function (acc, _ref3) {
114 var _ref4 = _slicedToArray(_ref3, 2),
115 key = _ref4[0],
116 oldValue = _ref4[1];
117
118 var newValue = escapeStrings(oldValue);
119 return newValue === oldValue ? acc : Object.assign({}, acc, _defineProperty({}, key, newValue));
120 }, obj);
121}
122
123var KnobManager =
124/*#__PURE__*/
125function () {
126 function KnobManager() {
127 _classCallCheck(this, KnobManager);
128
129 this.knobStore = new _KnobStore["default"]();
130 this.channel = void 0;
131 this.options = {};
132 this.calling = false;
133 }
134
135 _createClass(KnobManager, [{
136 key: "setChannel",
137 value: function setChannel(channel) {
138 this.channel = channel;
139 }
140 }, {
141 key: "setOptions",
142 value: function setOptions(options) {
143 this.options = options;
144 }
145 }, {
146 key: "getKnobValue",
147 value: function getKnobValue(_ref5) {
148 var value = _ref5.value;
149 return this.options.escapeHTML ? escapeStrings(value) : value;
150 }
151 }, {
152 key: "knob",
153 value: function knob(name, options) {
154 this._mayCallChannel();
155
156 var knobName = options.groupId ? "".concat(name, "_").concat(options.groupId) : name;
157 var knobStore = this.knobStore;
158 var existingKnob = knobStore.get(knobName); // We need to return the value set by the knob editor via this.
159 // Normally the knobs are reset and so re-use is safe as long as the types match
160 // when in storyshots, though the change event isn't called and so the knobs aren't reset, making this code fail
161 // so always create a new knob when in storyshots
162
163 if (existingKnob && options.type === existingKnob.type && _global.navigator && ( // userAgent is not set in react-native
164 !_global.navigator.userAgent || !_global.navigator.userAgent.includes('jsdom'))) {
165 return this.getKnobValue(existingKnob);
166 }
167
168 var knobInfo = Object.assign({}, options, {
169 name: knobName,
170 label: name
171 });
172
173 if (knobValuesFromUrl[knobName]) {
174 var value = _converters.deserializers[options.type](knobValuesFromUrl[knobName]);
175
176 knobInfo.defaultValue = value;
177 knobInfo.value = value;
178 delete knobValuesFromUrl[knobName];
179 } else {
180 knobInfo.defaultValue = options.value;
181 }
182
183 knobStore.set(knobName, knobInfo);
184 return this.getKnobValue(knobStore.get(knobName));
185 }
186 }, {
187 key: "_mayCallChannel",
188 value: function _mayCallChannel() {
189 var _this = this;
190
191 // Re rendering of the story may cause changes to the knobStore. Some new knobs maybe added and
192 // Some knobs may go unused. So we need to update the panel accordingly. For example remove the
193 // unused knobs from the panel. This function sends the `setKnobs` message to the channel
194 // triggering a panel re-render.
195 if (!this.channel) {
196 // to prevent call to undefined channel and therefore throwing TypeError
197 return;
198 }
199
200 if (this.calling) {
201 // If a call to channel has already registered ignore this call.
202 // Once the previous call is completed all the changes to knobStore including the one that
203 // triggered this, will be added to the panel.
204 // This avoids emitting to the channel within very short periods of time.
205 return;
206 }
207
208 this.calling = true;
209 var timestamp = +new Date();
210 setTimeout(function () {
211 _this.calling = false; // emit to the channel and trigger a panel re-render
212
213 if (_this.channel) _this.channel.emit(_shared.SET, {
214 knobs: _this.knobStore.getAll(),
215 timestamp: timestamp
216 });
217 }, PANEL_UPDATE_INTERVAL);
218 }
219 }]);
220
221 return KnobManager;
222}();
223
224exports["default"] = KnobManager;
\No newline at end of file