UNPKG

jss-global

Version:
191 lines (145 loc) 4.94 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); 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; }; }(); exports['default'] = jssGlobal; var _jss = require('jss'); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var propKey = '@global'; var prefixKey = '@global '; var GlobalContainerRule = function () { function GlobalContainerRule(key, styles, options) { _classCallCheck(this, GlobalContainerRule); this.type = 'global'; this.key = key; this.options = options; this.rules = new _jss.RuleList(_extends({}, options, { parent: this })); for (var selector in styles) { this.rules.add(selector, styles[selector], { selector: selector }); } this.rules.process(); } /** * Get a rule. */ _createClass(GlobalContainerRule, [{ key: 'getRule', value: function getRule(name) { return this.rules.get(name); } /** * Create and register rule, run plugins. */ }, { key: 'addRule', value: function addRule(name, style, options) { var rule = this.rules.add(name, style, options); this.options.jss.plugins.onProcessRule(rule); return rule; } /** * Get index of a rule. */ }, { key: 'indexOf', value: function indexOf(rule) { return this.rules.indexOf(rule); } /** * Generates a CSS string. */ }, { key: 'toString', value: function toString() { return this.rules.toString(); } }]); return GlobalContainerRule; }(); var GlobalPrefixedRule = function () { function GlobalPrefixedRule(name, style, options) { _classCallCheck(this, GlobalPrefixedRule); this.name = name; this.options = options; var selector = name.substr(prefixKey.length); this.rule = options.jss.createRule(selector, style, _extends({}, options, { parent: this, selector: selector })); } _createClass(GlobalPrefixedRule, [{ key: 'toString', value: function toString(options) { return this.rule.toString(options); } }]); return GlobalPrefixedRule; }(); var separatorRegExp = /\s*,\s*/g; function addScope(selector, scope) { var parts = selector.split(separatorRegExp); var scoped = ''; for (var i = 0; i < parts.length; i++) { scoped += scope + ' ' + parts[i].trim(); if (parts[i + 1]) scoped += ', '; } return scoped; } function handleNestedGlobalContainerRule(rule) { var options = rule.options, style = rule.style; var rules = style[propKey]; if (!rules) return; for (var name in rules) { options.sheet.addRule(name, rules[name], _extends({}, options, { selector: addScope(name, rule.selector) })); } delete style[propKey]; } function handlePrefixedGlobalRule(rule) { var options = rule.options, style = rule.style; for (var prop in style) { if (prop.substr(0, propKey.length) !== propKey) continue; var selector = addScope(prop.substr(propKey.length), rule.selector); options.sheet.addRule(selector, style[prop], _extends({}, options, { selector: selector })); delete style[prop]; } } /** * Convert nested rules to separate, remove them from original styles. * * @param {Rule} rule * @api public */ function jssGlobal() { function onCreateRule(name, styles, options) { if (name === propKey) { return new GlobalContainerRule(name, styles, options); } if (name[0] === '@' && name.substr(0, prefixKey.length) === prefixKey) { return new GlobalPrefixedRule(name, styles, options); } var parent = options.parent; if (parent) { if (parent.type === 'global' || parent.options.parent.type === 'global') { options.global = true; } } if (options.global) options.selector = name; return null; } function onProcessRule(rule) { if (rule.type !== 'style') return; handleNestedGlobalContainerRule(rule); handlePrefixedGlobalRule(rule); } return { onCreateRule: onCreateRule, onProcessRule: onProcessRule }; }