UNPKG

15 kBJavaScriptView Raw
1"use strict";
2
3require("core-js/modules/es.object.keys.js");
4
5require("core-js/modules/es.symbol.js");
6
7require("core-js/modules/es.array.slice.js");
8
9require("core-js/modules/es.object.freeze.js");
10
11require("core-js/modules/es.symbol.description.js");
12
13require("core-js/modules/es.symbol.iterator.js");
14
15require("core-js/modules/es.array.iterator.js");
16
17require("core-js/modules/es.string.iterator.js");
18
19require("core-js/modules/web.dom-collections.iterator.js");
20
21require("core-js/modules/es.function.name.js");
22
23require("core-js/modules/es.array.from.js");
24
25require("core-js/modules/es.regexp.exec.js");
26
27Object.defineProperty(exports, "__esModule", {
28 value: true
29});
30exports.init = void 0;
31
32require("core-js/modules/es.array.includes.js");
33
34require("core-js/modules/es.array.map.js");
35
36require("core-js/modules/es.array.sort.js");
37
38require("core-js/modules/es.array.filter.js");
39
40require("core-js/modules/es.object.to-string.js");
41
42require("core-js/modules/es.object.entries.js");
43
44require("core-js/modules/es.array.concat.js");
45
46require("core-js/modules/es.array.join.js");
47
48require("core-js/modules/es.object.assign.js");
49
50var _clientLogger = require("@storybook/client-logger");
51
52var _coreEvents = require("@storybook/core-events");
53
54var _router = require("@storybook/router");
55
56var _csf = require("@storybook/csf");
57
58var _fastDeepEqual = _interopRequireDefault(require("fast-deep-equal"));
59
60var _global = _interopRequireDefault(require("global"));
61
62var _tsDedent = _interopRequireDefault(require("ts-dedent"));
63
64var _stories = require("../lib/stories");
65
66var _templateObject, _templateObject2, _templateObject3, _templateObject4;
67
68var _excluded = ["full", "panel", "nav", "shortcuts", "addonPanel", "tabs", "addons", "panelRight", "stories", "selectedKind", "selectedStory", "path"],
69 _excluded2 = ["store", "navigate", "state", "provider", "fullAPI"];
70
71function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
72
73function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
74
75function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
76
77function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
78
79function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
80
81function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
82
83function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
84
85function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
86
87function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
88
89function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_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; }
90
91function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
92
93function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
94
95function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
96
97function _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; }
98
99var globalWindow = _global.default.window;
100
101var parseBoolean = function parseBoolean(value) {
102 if (value === 'true' || value === '1') return true;
103 if (value === 'false' || value === '0') return false;
104 return undefined;
105}; // Initialize the state based on the URL.
106// NOTE:
107// Although we don't change the URL when you change the state, we do support setting initial state
108// via the following URL parameters:
109// - full: 0/1 -- show fullscreen
110// - panel: bottom/right/0 -- set addons panel position (or hide)
111// - nav: 0/1 -- show or hide the story list
112//
113// We also support legacy URLs from storybook <5
114
115
116var prevParams;
117
118var initialUrlSupport = function initialUrlSupport(_ref) {
119 var _ref$state = _ref.state,
120 location = _ref$state.location,
121 path = _ref$state.path,
122 viewMode = _ref$state.viewMode,
123 storyIdFromUrl = _ref$state.storyId,
124 singleStory = _ref.singleStory;
125
126 var _queryFromLocation = (0, _router.queryFromLocation)(location),
127 full = _queryFromLocation.full,
128 panel = _queryFromLocation.panel,
129 nav = _queryFromLocation.nav,
130 shortcuts = _queryFromLocation.shortcuts,
131 addonPanel = _queryFromLocation.addonPanel,
132 tabs = _queryFromLocation.tabs,
133 addons = _queryFromLocation.addons,
134 panelRight = _queryFromLocation.panelRight,
135 stories = _queryFromLocation.stories,
136 selectedKind = _queryFromLocation.selectedKind,
137 selectedStory = _queryFromLocation.selectedStory,
138 queryPath = _queryFromLocation.path,
139 otherParams = _objectWithoutProperties(_queryFromLocation, _excluded);
140
141 var layout = {
142 isFullscreen: parseBoolean(full),
143 showNav: !singleStory && parseBoolean(nav),
144 showPanel: parseBoolean(panel),
145 panelPosition: ['right', 'bottom'].includes(panel) ? panel : undefined,
146 showTabs: parseBoolean(tabs)
147 };
148 var ui = {
149 enableShortcuts: parseBoolean(shortcuts)
150 };
151 var selectedPanel = addonPanel || undefined; // @deprecated Superceded by `panel=false`, to be removed in 7.0
152
153 if (addons === '0') {
154 _clientLogger.once.warn((0, _tsDedent.default)(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n The 'addons' query param is deprecated and will be removed in Storybook 7.0. Use 'panel=false' instead.\n\n More info: https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#deprecated-layout-url-params\n "]))));
155
156 layout.showPanel = false;
157 } // @deprecated Superceded by `panel=right`, to be removed in 7.0
158
159
160 if (panelRight === '1') {
161 _clientLogger.once.warn((0, _tsDedent.default)(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n The 'panelRight' query param is deprecated and will be removed in Storybook 7.0. Use 'panel=right' instead.\n\n More info: https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#deprecated-layout-url-params\n "]))));
162
163 layout.panelPosition = 'right';
164 } // @deprecated Superceded by `nav=false`, to be removed in 7.0
165
166
167 if (stories === '0') {
168 _clientLogger.once.warn((0, _tsDedent.default)(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n The 'stories' query param is deprecated and will be removed in Storybook 7.0. Use 'nav=false' instead.\n\n More info: https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#deprecated-layout-url-params\n "]))));
169
170 layout.showNav = false;
171 } // @deprecated To be removed in 7.0
172 // If the user hasn't set the storyId on the URL, we support legacy URLs (selectedKind/selectedStory)
173 // NOTE: this "storyId" can just be a prefix of a storyId, really it is a storyIdSpecifier.
174
175
176 var storyId = storyIdFromUrl;
177
178 if (!storyId && selectedKind) {
179 _clientLogger.once.warn((0, _tsDedent.default)(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n The 'selectedKind' and 'selectedStory' query params are deprecated and will be removed in Storybook 7.0. Use 'path' instead.\n\n More info: https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#deprecated-layout-url-params\n "]))));
180
181 storyId = selectedStory ? (0, _csf.toId)(selectedKind, selectedStory) : (0, _csf.sanitize)(selectedKind);
182 } // Avoid returning a new object each time if no params actually changed.
183
184
185 var customQueryParams = (0, _fastDeepEqual.default)(prevParams, otherParams) ? prevParams : otherParams;
186 prevParams = customQueryParams;
187 return {
188 viewMode: viewMode,
189 layout: layout,
190 ui: ui,
191 selectedPanel: selectedPanel,
192 location: location,
193 path: path,
194 customQueryParams: customQueryParams,
195 storyId: storyId
196 };
197};
198
199var init = function init(_ref2) {
200 var store = _ref2.store,
201 navigate = _ref2.navigate,
202 state = _ref2.state,
203 provider = _ref2.provider,
204 fullAPI = _ref2.fullAPI,
205 rest = _objectWithoutProperties(_ref2, _excluded2);
206
207 var navigateTo = function navigateTo(path) {
208 var queryParams = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
209 var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
210 var params = Object.entries(queryParams).filter(function (_ref3) {
211 var _ref4 = _slicedToArray(_ref3, 2),
212 v = _ref4[1];
213
214 return v;
215 }).sort(function (_ref5, _ref6) {
216 var _ref7 = _slicedToArray(_ref5, 1),
217 a = _ref7[0];
218
219 var _ref8 = _slicedToArray(_ref6, 1),
220 b = _ref8[0];
221
222 return a < b ? -1 : 1;
223 }).map(function (_ref9) {
224 var _ref10 = _slicedToArray(_ref9, 2),
225 k = _ref10[0],
226 v = _ref10[1];
227
228 return "".concat(k, "=").concat(v);
229 });
230 var to = [path].concat(_toConsumableArray(params)).join('&');
231 return navigate(to, options);
232 };
233
234 var api = {
235 getQueryParam: function getQueryParam(key) {
236 var _store$getState = store.getState(),
237 customQueryParams = _store$getState.customQueryParams;
238
239 return customQueryParams ? customQueryParams[key] : undefined;
240 },
241 getUrlState: function getUrlState() {
242 var _store$getState2 = store.getState(),
243 path = _store$getState2.path,
244 customQueryParams = _store$getState2.customQueryParams,
245 storyId = _store$getState2.storyId,
246 url = _store$getState2.url,
247 viewMode = _store$getState2.viewMode;
248
249 return {
250 path: path,
251 queryParams: customQueryParams,
252 storyId: storyId,
253 url: url,
254 viewMode: viewMode
255 };
256 },
257 setQueryParams: function setQueryParams(input) {
258 var _store$getState3 = store.getState(),
259 customQueryParams = _store$getState3.customQueryParams;
260
261 var queryParams = {};
262 var update = Object.assign({}, customQueryParams, Object.entries(input).reduce(function (acc, _ref11) {
263 var _ref12 = _slicedToArray(_ref11, 2),
264 key = _ref12[0],
265 value = _ref12[1];
266
267 if (value !== null) {
268 acc[key] = value;
269 }
270
271 return acc;
272 }, queryParams));
273
274 if (!(0, _fastDeepEqual.default)(customQueryParams, update)) {
275 store.setState({
276 customQueryParams: update
277 });
278 fullAPI.emit(_coreEvents.UPDATE_QUERY_PARAMS, update);
279 }
280 },
281 navigateUrl: function navigateUrl(url, options) {
282 navigate(url, Object.assign({}, options, {
283 plain: true
284 }));
285 }
286 };
287
288 var initModule = function initModule() {
289 // Sets `args` parameter in URL, omitting any args that have their initial value or cannot be unserialized safely.
290 var updateArgsParam = function updateArgsParam() {
291 var _fullAPI$getUrlState = fullAPI.getUrlState(),
292 path = _fullAPI$getUrlState.path,
293 queryParams = _fullAPI$getUrlState.queryParams,
294 viewMode = _fullAPI$getUrlState.viewMode;
295
296 if (viewMode !== 'story') return;
297 var currentStory = fullAPI.getCurrentStoryData();
298 if (!(0, _stories.isStory)(currentStory)) return;
299 var args = currentStory.args,
300 initialArgs = currentStory.initialArgs;
301 var argsString = (0, _router.buildArgsParam)(initialArgs, args);
302 navigateTo(path, Object.assign({}, queryParams, {
303 args: argsString
304 }), {
305 replace: true
306 });
307 api.setQueryParams({
308 args: argsString
309 });
310 };
311
312 fullAPI.on(_coreEvents.SET_CURRENT_STORY, function () {
313 return updateArgsParam();
314 });
315 var handleOrId;
316 fullAPI.on(_coreEvents.STORY_ARGS_UPDATED, function () {
317 if ('requestIdleCallback' in globalWindow) {
318 if (handleOrId) globalWindow.cancelIdleCallback(handleOrId);
319 handleOrId = globalWindow.requestIdleCallback(updateArgsParam, {
320 timeout: 1000
321 });
322 } else {
323 if (handleOrId) clearTimeout(handleOrId);
324 setTimeout(updateArgsParam, 100);
325 }
326 });
327 fullAPI.on(_coreEvents.GLOBALS_UPDATED, function (_ref13) {
328 var globals = _ref13.globals,
329 initialGlobals = _ref13.initialGlobals;
330
331 var _fullAPI$getUrlState2 = fullAPI.getUrlState(),
332 path = _fullAPI$getUrlState2.path,
333 queryParams = _fullAPI$getUrlState2.queryParams;
334
335 var globalsString = (0, _router.buildArgsParam)(initialGlobals, globals);
336 navigateTo(path, Object.assign({}, queryParams, {
337 globals: globalsString
338 }), {
339 replace: true
340 });
341 api.setQueryParams({
342 globals: globalsString
343 });
344 });
345 fullAPI.on(_coreEvents.NAVIGATE_URL, function (url, options) {
346 fullAPI.navigateUrl(url, options);
347 });
348
349 if (fullAPI.showReleaseNotesOnLaunch()) {
350 navigate('/settings/release-notes');
351 }
352 };
353
354 return {
355 api: api,
356 state: initialUrlSupport(Object.assign({
357 store: store,
358 navigate: navigate,
359 state: state,
360 provider: provider,
361 fullAPI: fullAPI
362 }, rest)),
363 init: initModule
364 };
365};
366
367exports.init = init;
\No newline at end of file