'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var warning = require('tiny-warning'); var jss = require('jss'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var warning__default = /*#__PURE__*/_interopDefaultLegacy(warning); var now = Date.now(); var fnValuesNs = "fnValues" + now; var fnRuleNs = "fnStyle" + ++now; var functionPlugin = function functionPlugin() { return { onCreateRule: function onCreateRule(name, decl, options) { if (typeof decl !== 'function') return null; var rule = jss.createRule(name, {}, options); rule[fnRuleNs] = decl; return rule; }, onProcessStyle: function onProcessStyle(style, rule) { // We need to extract function values from the declaration, so that we can keep core unaware of them. // We need to do that only once. // We don't need to extract functions on each style update, since this can happen only once. // We don't support function values inside of function rules. if (fnValuesNs in rule || fnRuleNs in rule) return style; var fnValues = {}; for (var prop in style) { var value = style[prop]; if (typeof value !== 'function') continue; delete style[prop]; fnValues[prop] = value; } // $FlowFixMe[prop-missing] rule[fnValuesNs] = fnValues; return style; }, onUpdate: function onUpdate(data, rule, sheet, options) { var styleRule = rule; // $FlowFixMe[prop-missing] var fnRule = styleRule[fnRuleNs]; // If we have a style function, the entire rule is dynamic and style object // will be returned from that function. if (fnRule) { // Empty object will remove all currently defined props // in case function rule returns a falsy value. styleRule.style = fnRule(data) || {}; if (process.env.NODE_ENV === 'development') { for (var prop in styleRule.style) { if (typeof styleRule.style[prop] === 'function') { process.env.NODE_ENV !== "production" ? warning__default['default'](false, '[JSS] Function values inside function rules are not supported.') : void 0; break; } } } } // $FlowFixMe[prop-missing] var fnValues = styleRule[fnValuesNs]; // If we have a fn values map, it is a rule with function values. if (fnValues) { for (var _prop in fnValues) { styleRule.prop(_prop, fnValues[_prop](data), options); } } } }; }; exports.default = functionPlugin;