'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _createClass = function () { function 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _isInBrowser = require('is-in-browser'); var _isInBrowser2 = _interopRequireDefault(_isInBrowser); var _StyleSheet = require('./StyleSheet'); var _StyleSheet2 = _interopRequireDefault(_StyleSheet); var _PluginsRegistry = require('./PluginsRegistry'); var _PluginsRegistry2 = _interopRequireDefault(_PluginsRegistry); var _rules = require('./plugins/rules'); var _rules2 = _interopRequireDefault(_rules); var _observables = require('./plugins/observables'); var _observables2 = _interopRequireDefault(_observables); var _functions = require('./plugins/functions'); var _functions2 = _interopRequireDefault(_functions); var _sheets = require('./sheets'); var _sheets2 = _interopRequireDefault(_sheets); var _StyleRule = require('./rules/StyleRule'); var _StyleRule2 = _interopRequireDefault(_StyleRule); var _createGenerateClassName = require('./utils/createGenerateClassName'); var _createGenerateClassName2 = _interopRequireDefault(_createGenerateClassName); var _createRule2 = require('./utils/createRule'); var _createRule3 = _interopRequireDefault(_createRule2); var _DomRenderer = require('./renderers/DomRenderer'); var _DomRenderer2 = _interopRequireDefault(_DomRenderer); var _VirtualRenderer = require('./renderers/VirtualRenderer'); var _VirtualRenderer2 = _interopRequireDefault(_VirtualRenderer); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var defaultPlugins = _rules2['default'].concat([_observables2['default'], _functions2['default']]); var instanceCounter = 0; var Jss = function () { function Jss(options) { _classCallCheck(this, Jss); this.id = instanceCounter++; this.version = "9.8.7"; this.plugins = new _PluginsRegistry2['default'](); this.options = { createGenerateClassName: _createGenerateClassName2['default'], Renderer: _isInBrowser2['default'] ? _DomRenderer2['default'] : _VirtualRenderer2['default'], plugins: [] }; this.generateClassName = (0, _createGenerateClassName2['default'])(); // eslint-disable-next-line prefer-spread this.use.apply(this, defaultPlugins); this.setup(options); } _createClass(Jss, [{ key: 'setup', value: function setup() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; if (options.createGenerateClassName) { this.options.createGenerateClassName = options.createGenerateClassName; // $FlowFixMe this.generateClassName = options.createGenerateClassName(); } if (options.insertionPoint != null) this.options.insertionPoint = options.insertionPoint; if (options.virtual || options.Renderer) { this.options.Renderer = options.Renderer || (options.virtual ? _VirtualRenderer2['default'] : _DomRenderer2['default']); } // eslint-disable-next-line prefer-spread if (options.plugins) this.use.apply(this, options.plugins); return this; } /** * Create a Style Sheet. */ }, { key: 'createStyleSheet', value: function createStyleSheet(styles) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var index = options.index; if (typeof index !== 'number') { index = _sheets2['default'].index === 0 ? 0 : _sheets2['default'].index + 1; } var sheet = new _StyleSheet2['default'](styles, _extends({}, options, { jss: this, generateClassName: options.generateClassName || this.generateClassName, insertionPoint: this.options.insertionPoint, Renderer: this.options.Renderer, index: index })); this.plugins.onProcessSheet(sheet); return sheet; } /** * Detach the Style Sheet and remove it from the registry. */ }, { key: 'removeStyleSheet', value: function removeStyleSheet(sheet) { sheet.detach(); _sheets2['default'].remove(sheet); return this; } /** * Create a rule without a Style Sheet. */ }, { key: 'createRule', value: function createRule(name) { var style = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; // Enable rule without name for inline styles. if ((typeof name === 'undefined' ? 'undefined' : _typeof(name)) === 'object') { options = style; style = name; name = undefined; } // Cast from RuleFactoryOptions to RuleOptions // https://stackoverflow.com/questions/41328728/force-casting-in-flow var ruleOptions = options; ruleOptions.jss = this; ruleOptions.Renderer = this.options.Renderer; if (!ruleOptions.generateClassName) ruleOptions.generateClassName = this.generateClassName; if (!ruleOptions.classes) ruleOptions.classes = {}; var rule = (0, _createRule3['default'])(name, style, ruleOptions); if (!ruleOptions.selector && rule instanceof _StyleRule2['default']) { rule.selector = '.' + ruleOptions.generateClassName(rule); } this.plugins.onProcessRule(rule); return rule; } /** * Register plugin. Passed function will be invoked with a rule instance. */ }, { key: 'use', value: function use() { var _this = this; for (var _len = arguments.length, plugins = Array(_len), _key = 0; _key < _len; _key++) { plugins[_key] = arguments[_key]; } plugins.forEach(function (plugin) { // Avoids applying same plugin twice, at least based on ref. if (_this.options.plugins.indexOf(plugin) === -1) { _this.options.plugins.push(plugin); _this.plugins.use(plugin); } }); return this; } }]); return Jss; }(); exports['default'] = Jss;