UNPKG

storybook-amp

Version:

Storybook addon for AMP Html. Allows to display in your stories AMP Html components generated with React.

144 lines (138 loc) 7.28 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.withAmpDecorator = void 0; var _react = _interopRequireDefault(require("react")); var _server = _interopRequireDefault(require("react-dom/server")); var _addons = require("@storybook/addons"); var _templates = require("./templates"); var _getBlodURL = _interopRequireDefault(require("./utils/getBlodURL")); var _constants = require("./constants"); var _getHtmlFormatForType = _interopRequireDefault(require("./utils/getHtmlFormatForType")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } var defaultRenderFn = function defaultRenderFn(storyFn, context) { var html = _server["default"].renderToStaticMarkup(storyFn(context)); return { html: html, styles: null }; }; /* *************** */ var getAmpHTML = function getAmpHTML(storyFn, _ref, templateFn) { var title = _ref.title, scripts = _ref.scripts, customStyles = _ref.styles, baseUrl = _ref.baseUrl, renderFn = _ref.renderFn, context = _ref.context, parameters = _ref.parameters; var _renderFn = renderFn(storyFn, context), html = _renderFn.html, styles = _renderFn.styles; var innerProps = { storyFn: storyFn, title: title, scripts: scripts && typeof scripts === "string" ? scripts : "", styles: "".concat(customStyles && typeof customStyles === "string" ? customStyles : "").concat(styles ? styles : ""), baseUrl: baseUrl }; return templateFn(innerProps).replace("<!-- STORY CODE -->", html); }; /* *************** */ var decorator = function decorator(storyFn) { var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var _ref2 = arguments.length > 2 ? arguments[2] : undefined, _ref2$parameters = _ref2.parameters, parameters = _ref2$parameters === void 0 ? {} : _ref2$parameters; var title = context.title; var _parameters$isEnabled = parameters.isEnabled, isEnabled = _parameters$isEnabled === void 0 ? false : _parameters$isEnabled, _parameters$template = parameters.template, template = _parameters$template === void 0 ? "amphtml" : _parameters$template, _parameters$scripts = parameters.scripts, scripts = _parameters$scripts === void 0 ? "" : _parameters$scripts, _parameters$styles = parameters.styles, styles = _parameters$styles === void 0 ? "" : _parameters$styles, _parameters$renderFn = parameters.renderFn, renderFn = _parameters$renderFn === void 0 ? defaultRenderFn : _parameters$renderFn; if (!isEnabled) { return storyFn(context); } var _getTemplateFn = (0, _templates.getTemplateFn)(template), type = _getTemplateFn.type, templateFn = _getTemplateFn.templateFn; var ampHtml = getAmpHTML(storyFn, { type: type, title: title, scripts: scripts, styles: styles, renderFn: renderFn, context: context, parameters: parameters, baseUrl: window.location.origin }, templateFn); var blodURL = (0, _getBlodURL["default"])(ampHtml, "text/html"); var isValid = function isValid(html, format) { var _window, _window$parent; var parentWindow = (_window = window) === null || _window === void 0 ? void 0 : (_window$parent = _window.parent) === null || _window$parent === void 0 ? void 0 : _window$parent.window; return new Promise(function (resolve, reject) { var _parentWindow$__STORY, _parentWindow$__STORY2, _parentWindow$amp, _parentWindow$amp$val, _parentWindow$__STORY3, _parentWindow$__STORY4; if (parentWindow !== null && parentWindow !== void 0 && (_parentWindow$__STORY = parentWindow.__STORYBOOK_AMP__) !== null && _parentWindow$__STORY !== void 0 && (_parentWindow$__STORY2 = _parentWindow$__STORY.validator) !== null && _parentWindow$__STORY2 !== void 0 && _parentWindow$__STORY2.isReady && parentWindow !== null && parentWindow !== void 0 && (_parentWindow$amp = parentWindow.amp) !== null && _parentWindow$amp !== void 0 && (_parentWindow$amp$val = _parentWindow$amp.validator) !== null && _parentWindow$amp$val !== void 0 && _parentWindow$amp$val.validateString) { var _parentWindow$amp2, _parentWindow$amp2$va; var validationResults = parentWindow === null || parentWindow === void 0 ? void 0 : (_parentWindow$amp2 = parentWindow.amp) === null || _parentWindow$amp2 === void 0 ? void 0 : (_parentWindow$amp2$va = _parentWindow$amp2.validator) === null || _parentWindow$amp2$va === void 0 ? void 0 : _parentWindow$amp2$va.validateString(html, format); resolve((validationResults === null || validationResults === void 0 ? void 0 : validationResults.status) === "PASS"); } else if (parentWindow !== null && parentWindow !== void 0 && (_parentWindow$__STORY3 = parentWindow.__STORYBOOK_AMP__) !== null && _parentWindow$__STORY3 !== void 0 && (_parentWindow$__STORY4 = _parentWindow$__STORY3.validator) !== null && _parentWindow$__STORY4 !== void 0 && _parentWindow$__STORY4.init) { var _parentWindow$__STORY5, _parentWindow$__STORY6; parentWindow === null || parentWindow === void 0 ? void 0 : (_parentWindow$__STORY5 = parentWindow.__STORYBOOK_AMP__) === null || _parentWindow$__STORY5 === void 0 ? void 0 : (_parentWindow$__STORY6 = _parentWindow$__STORY5.validator) === null || _parentWindow$__STORY6 === void 0 ? void 0 : _parentWindow$__STORY6.init().then(function () { var _parentWindow$amp3, _parentWindow$amp3$va; var validationResults = parentWindow === null || parentWindow === void 0 ? void 0 : (_parentWindow$amp3 = parentWindow.amp) === null || _parentWindow$amp3 === void 0 ? void 0 : (_parentWindow$amp3$va = _parentWindow$amp3.validator) === null || _parentWindow$amp3$va === void 0 ? void 0 : _parentWindow$amp3$va.validateString(html, format); resolve((validationResults === null || validationResults === void 0 ? void 0 : validationResults.status) === "PASS"); }); } }); }; /* *************** */ var channel = _addons.addons.getChannel(); channel.emit(_constants.EVENTS.RESULT, { html: ampHtml, type: type, isValid: isValid }); /* *************** */ if (window.self === window.top) { location.href = blodURL; var EmptyElement = function EmptyElement() { return null; }; return /*#__PURE__*/_react["default"].createElement(EmptyElement, null); } return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("style", { dangerouslySetInnerHTML: { __html: "body { position: absolute; top: 0; left: 0; width: 100%; height: 100%; padding: 0; margin: 0; }" } }), /*#__PURE__*/_react["default"].createElement("iframe", { id: "amp-iframe", src: blodURL, title: "Iframe", style: { position: "absolute", top: 0, left: 0, width: "100%", height: "100%", border: "none" } })); }; var withAmpDecorator = (0, _addons.makeDecorator)({ name: "withAmpDecorator", parameterName: _constants.PARAM_KEY, wrapper: function wrapper(storyFn, context, _ref3) { var parameters = _ref3.parameters; return decorator(storyFn, context, { parameters: parameters }); } }); exports.withAmpDecorator = withAmpDecorator;