UNPKG

14.9 kBJavaScriptView Raw
1module.exports =
2/******/ (function(modules) { // webpackBootstrap
3/******/ // The module cache
4/******/ var installedModules = {};
5/******/
6/******/ // The require function
7/******/ function __webpack_require__(moduleId) {
8/******/
9/******/ // Check if module is in cache
10/******/ if(installedModules[moduleId]) {
11/******/ return installedModules[moduleId].exports;
12/******/ }
13/******/ // Create a new module (and put it into the cache)
14/******/ var module = installedModules[moduleId] = {
15/******/ i: moduleId,
16/******/ l: false,
17/******/ exports: {}
18/******/ };
19/******/
20/******/ // Execute the module function
21/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
22/******/
23/******/ // Flag the module as loaded
24/******/ module.l = true;
25/******/
26/******/ // Return the exports of the module
27/******/ return module.exports;
28/******/ }
29/******/
30/******/
31/******/ // expose the modules object (__webpack_modules__)
32/******/ __webpack_require__.m = modules;
33/******/
34/******/ // expose the module cache
35/******/ __webpack_require__.c = installedModules;
36/******/
37/******/ // identity function for calling harmony imports with the correct context
38/******/ __webpack_require__.i = function(value) { return value; };
39/******/
40/******/ // define getter function for harmony exports
41/******/ __webpack_require__.d = function(exports, name, getter) {
42/******/ if(!__webpack_require__.o(exports, name)) {
43/******/ Object.defineProperty(exports, name, {
44/******/ configurable: false,
45/******/ enumerable: true,
46/******/ get: getter
47/******/ });
48/******/ }
49/******/ };
50/******/
51/******/ // getDefaultExport function for compatibility with non-harmony modules
52/******/ __webpack_require__.n = function(module) {
53/******/ var getter = module && module.__esModule ?
54/******/ function getDefault() { return module['default']; } :
55/******/ function getModuleExports() { return module; };
56/******/ __webpack_require__.d(getter, 'a', getter);
57/******/ return getter;
58/******/ };
59/******/
60/******/ // Object.prototype.hasOwnProperty.call
61/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
62/******/
63/******/ // __webpack_public_path__
64/******/ __webpack_require__.p = "";
65/******/
66/******/ // Load entry module and return exports
67/******/ return __webpack_require__(__webpack_require__.s = 8);
68/******/ })
69/************************************************************************/
70/******/ ([
71/* 0 */
72/***/ (function(module, exports) {
73
74module.exports = require("babel-runtime/helpers/objectWithoutProperties");
75
76/***/ }),
77/* 1 */
78/***/ (function(module, exports) {
79
80module.exports = require("babel-runtime/helpers/toConsumableArray");
81
82/***/ }),
83/* 2 */
84/***/ (function(module, exports) {
85
86module.exports = require("ejson");
87
88/***/ }),
89/* 3 */
90/***/ (function(module, exports) {
91
92module.exports = require("react");
93
94/***/ }),
95/* 4 */
96/***/ (function(module, exports, __webpack_require__) {
97
98"use strict";
99
100
101Object.defineProperty(exports, "__esModule", {
102 value: true
103});
104
105var _objectWithoutProperties2 = __webpack_require__(0);
106
107var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
108
109var _toConsumableArray2 = __webpack_require__(1);
110
111var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
112
113var _extends2 = __webpack_require__(12);
114
115var _extends3 = _interopRequireDefault(_extends2);
116
117exports.default = configure;
118
119var _react = __webpack_require__(3);
120
121var _react2 = _interopRequireDefault(_react);
122
123var _reactDom = __webpack_require__(14);
124
125var _render = __webpack_require__(6);
126
127var _serialize = __webpack_require__(7);
128
129function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
130
131/* eslint-env browser */
132var chromaticRoot = void 0;
133
134var drawn = false;
135function drawIsolator() {
136 if (drawn) {
137 return;
138 }
139 var styles = '\n /* ensure a given element is not laid out at all */\n .' + _render.NO_LAYOUT_CLASS + ' {\n margin: 0 !important;\n padding: 0 !important;\n position: static !important;\n }\n ';
140 var el = document.createElement('style');
141 el.type = 'text/css';
142 el.innerHTML = styles;
143 document.head.appendChild(el);
144
145 chromaticRoot = document.createElement('div');
146
147 // Hide all existing content
148 document.querySelectorAll('body > *').forEach(function (e) {
149 e.style.display = 'none';
150 });
151
152 // Add our root
153 document.body.appendChild(chromaticRoot);
154 drawn = true;
155}
156
157function configure(_ref) {
158 var runtimes = _ref.runtimes,
159 clearScreen = _ref.clearScreen;
160
161 if (clearScreen) {
162 drawIsolator();
163 }
164
165 var runtimeRenderers = {};
166 runtimes.forEach(function (r) {
167 runtimeRenderers[r.runtime] = r.renderSpec;
168 });
169
170 function runtimeSpecs() {
171 return runtimes.map(function (_ref2) {
172 var runtime = _ref2.runtime,
173 specs = _ref2.specs;
174 return specs().map(function (spec) {
175 return (0, _extends3.default)({ runtime: runtime }, spec);
176 });
177 }).reduce(function (a, b) {
178 return [].concat((0, _toConsumableArray3.default)(a), (0, _toConsumableArray3.default)(b));
179 }, []);
180 }
181
182 function renderSpecToDom(spec) {
183 drawIsolator();
184
185 var parsedSpec = (0, _extends3.default)({}, spec, {
186 input: typeof spec.input === 'string' ? (0, _serialize.parse)(spec.input) : spec.input
187 });
188
189 var element = void 0;
190 if (spec.runtime) {
191 var renderer = runtimeRenderers[spec.runtime];
192 if (!renderer) {
193 throw new Error('Didn\'t find a renderer for runtime \'' + spec.runtime + '\' -- are you sure you added it in your client configuration?');
194 }
195 var renderedSpec = renderer(parsedSpec);
196 element = _react2.default.createElement(
197 'div',
198 { className: _render.CONTAINER_CLASS },
199 renderedSpec
200 );
201 } else {
202 throw new Error('No runtime passed for spec', spec);
203 }
204
205 (0, _reactDom.unmountComponentAtNode)(chromaticRoot);
206 (0, _reactDom.render)(element, chromaticRoot);
207 }
208
209 // API to be used by test script to gather runtime spec definitions
210 window.__chromaticRuntimeSpecs__ = runtimeSpecs;
211
212 // API to be used by capture worker to render a spec
213 window.__renderChromaticSpec__ = renderSpecToDom;
214
215 function handleMessage(_ref3) {
216 var data = _ref3.data,
217 source = _ref3.source,
218 origin = _ref3.origin;
219
220 // TODO -- is it unsafe to not check origin? I don't get the sense it matters
221
222 var message = data.message,
223 rest = (0, _objectWithoutProperties3.default)(data, ['message']);
224
225 if (message === 'requestCapabilities') {
226 source.postMessage({
227 message: 'capabilities',
228 service: 'chromatic-isolator',
229 version: 0
230 }, origin);
231 } else if (message === 'renderSpec') {
232 try {
233 renderSpecToDom(rest.spec);
234 } catch (error) {
235 source.postMessage({
236 message: 'renderSpecError',
237 error: error.toString()
238 }, origin);
239
240 // For now, throw the error so we can see it in the iframe
241 throw error;
242 }
243 }
244 }
245
246 window.addEventListener('message', handleMessage, false);
247}
248
249/***/ }),
250/* 5 */
251/***/ (function(module, exports, __webpack_require__) {
252
253"use strict";
254
255
256Object.defineProperty(exports, "__esModule", {
257 value: true
258});
259
260var _classCallCheck2 = __webpack_require__(10);
261
262var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
263
264var _createClass2 = __webpack_require__(11);
265
266var _createClass3 = _interopRequireDefault(_createClass2);
267
268var _ejson = __webpack_require__(2);
269
270var _ejson2 = _interopRequireDefault(_ejson);
271
272function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
273
274var Callback = function () {
275 function Callback(name) {
276 (0, _classCallCheck3.default)(this, Callback);
277
278 // super('throw new Error("I shouldn\'t have been called!");');
279 this.name = name;
280 }
281
282 (0, _createClass3.default)(Callback, [{
283 key: 'toString',
284 value: function toString() {
285 return 'function ' + this.name + '()';
286 }
287 }, {
288 key: 'toJSONValue',
289 value: function toJSONValue() {
290 return this.name;
291 }
292
293 // eslint-disable-next-line class-methods-use-this
294
295 }, {
296 key: 'typeName',
297 value: function typeName() {
298 return 'ChromaticCallback';
299 }
300 }]);
301 return Callback;
302}();
303
304// eslint-disable-next-line no-underscore-dangle
305
306
307exports.default = Callback;
308if (!_ejson2.default._getTypes().ChromaticCallback) {
309 _ejson2.default.addType('ChromaticCallback', function (name) {
310 return new Callback(name);
311 });
312}
313
314/***/ }),
315/* 6 */
316/***/ (function(module, exports, __webpack_require__) {
317
318"use strict";
319
320
321Object.defineProperty(exports, "__esModule", {
322 value: true
323});
324exports.CONTAINER_CLASS = exports.NO_LAYOUT_CLASS = undefined;
325
326var _toConsumableArray2 = __webpack_require__(1);
327
328var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
329
330var _keys = __webpack_require__(9);
331
332var _keys2 = _interopRequireDefault(_keys);
333
334var _objectWithoutProperties2 = __webpack_require__(0);
335
336var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
337
338var _typeof2 = __webpack_require__(13);
339
340var _typeof3 = _interopRequireDefault(_typeof2);
341
342exports.default = renderSpec;
343
344var _react = __webpack_require__(3);
345
346var _react2 = _interopRequireDefault(_react);
347
348function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
349
350var NO_LAYOUT_CLASS = exports.NO_LAYOUT_CLASS = '__chromatic__no_layout'; // Render a spec in our format to a React element.
351// Note that this is *NOT* a stateless functional component
352// We *don't* want to end up with our own element type, instead
353// we need to construct an element tree *as we saved it*.
354/* eslint-disable react/prop-types */
355
356var CONTAINER_CLASS = exports.CONTAINER_CLASS = '__chromatic_rendered_spec_container';
357
358// We need at least a single div so we can set the CONTAINER_CLASS
359var defaultAncestors = [{ name: 'div' }];
360// Don't specify if we don't know
361var defaultDimensions = { width: '', height: '' };
362
363function wrapInAncestors(element, ancestors, _ref) {
364 var width = _ref.width,
365 height = _ref.height;
366
367 return ancestors.reduceRight(function (output, _ref2, index) {
368 var Tag = _ref2.name,
369 id = _ref2.id,
370 className = _ref2.className;
371
372 var classes = [NO_LAYOUT_CLASS, className];
373 if (index === ancestors.length - 1) {
374 classes.push(CONTAINER_CLASS);
375 }
376 return _react2.default.createElement(
377 Tag,
378 { id: id, className: classes.join(' '), style: { width: width, height: height } },
379 output
380 );
381 }, element);
382}
383
384function renderInputElement(element, options) {
385 if ((typeof element === 'undefined' ? 'undefined' : (0, _typeof3.default)(element)) !== 'object') {
386 return element;
387 }
388
389 var name = element.name,
390 props = element.props;
391
392
393 var mappedProps = {};
394 var mappedChildren = [];
395 if (props) {
396 var children = props.children,
397 otherProps = (0, _objectWithoutProperties3.default)(props, ['children']);
398
399
400 (0, _keys2.default)(otherProps).forEach(function (propName) {
401 mappedProps[propName] = options.mapProps(propName, props[propName]);
402 });
403
404 if (children) {
405 mappedChildren = [].concat(children).map(function (e) {
406 return renderInputElement(e, options);
407 });
408 }
409 }
410
411 var component = options.nameToComponent(name);
412
413 return _react.createElement.apply(undefined, [component, mappedProps].concat((0, _toConsumableArray3.default)(mappedChildren)));
414}
415
416function renderSpec(_ref3) {
417 var _ref3$input = _ref3.input,
418 element = _ref3$input.element,
419 _ref3$input$ancestors = _ref3$input.ancestors,
420 ancestors = _ref3$input$ancestors === undefined ? defaultAncestors : _ref3$input$ancestors,
421 _ref3$input$dimension = _ref3$input.dimensions,
422 dimensions = _ref3$input$dimension === undefined ? defaultDimensions : _ref3$input$dimension;
423 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { nameToComponent: function nameToComponent(name) {
424 return name;
425 }, mapProps: function mapProps(name, value) {
426 return value;
427 } };
428
429 var reactElement = renderInputElement(element, options);
430
431 return wrapInAncestors(reactElement, ancestors, dimensions);
432}
433
434/***/ }),
435/* 7 */
436/***/ (function(module, exports, __webpack_require__) {
437
438"use strict";
439
440
441Object.defineProperty(exports, "__esModule", {
442 value: true
443});
444exports.Callback = exports.parse = exports.stringify = undefined;
445
446var _ejson = __webpack_require__(2);
447
448var _Callback = __webpack_require__(5);
449
450var _Callback2 = _interopRequireDefault(_Callback);
451
452function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
453
454exports.stringify = _ejson.stringify;
455exports.parse = _ejson.parse;
456exports.Callback = _Callback2.default;
457
458// Ensure this has been registered
459
460/***/ }),
461/* 8 */
462/***/ (function(module, exports, __webpack_require__) {
463
464"use strict";
465
466
467Object.defineProperty(exports, "__esModule", {
468 value: true
469});
470
471var _isolator = __webpack_require__(4);
472
473var _isolator2 = _interopRequireDefault(_isolator);
474
475function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
476
477var hasSetup = false; /* eslint-env browser */
478
479function configure() {
480 var runtimes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
481
482 if (hasSetup) {
483 throw new Error('Chromatic already configured.');
484 }
485 hasSetup = true;
486
487 if (runtimes === []) {
488 throw new Error('Chromatic must be configured with at least one runtime. http://docs.chromaticqa.com/runtime-api');
489 }
490
491 // If we are rendered in an iframe, (by ourself), then we need to clear
492 // the screen right away, rather than waiting for a spec
493 var isIsolator = document.location.hash.match('__chromatic_isolator__');
494
495 (0, _isolator2.default)({
496 runtimes: [].concat(runtimes), // allow passing a single runtime
497 clearScreen: isIsolator
498 });
499}
500
501exports.default = configure;
502
503/***/ }),
504/* 9 */
505/***/ (function(module, exports) {
506
507module.exports = require("babel-runtime/core-js/object/keys");
508
509/***/ }),
510/* 10 */
511/***/ (function(module, exports) {
512
513module.exports = require("babel-runtime/helpers/classCallCheck");
514
515/***/ }),
516/* 11 */
517/***/ (function(module, exports) {
518
519module.exports = require("babel-runtime/helpers/createClass");
520
521/***/ }),
522/* 12 */
523/***/ (function(module, exports) {
524
525module.exports = require("babel-runtime/helpers/extends");
526
527/***/ }),
528/* 13 */
529/***/ (function(module, exports) {
530
531module.exports = require("babel-runtime/helpers/typeof");
532
533/***/ }),
534/* 14 */
535/***/ (function(module, exports) {
536
537module.exports = require("react-dom");
538
539/***/ })
540/******/ ]);
541//# sourceMappingURL=client.js.map
\No newline at end of file