style-to-object
Advanced tools
| {"version":3,"file":"style-to-object.min.js","sources":["../node_modules/inline-style-parser/index.js","../index.js"],"sourcesContent":["// http://www.w3.org/TR/CSS21/grammar.html\n// https://github.com/visionmedia/css-parse/pull/49#issuecomment-30088027\nvar COMMENT_REGEX = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//g;\n\nvar NEWLINE_REGEX = /\\n/g;\nvar WHITESPACE_REGEX = /^\\s*/;\n\n// declaration\nvar PROPERTY_REGEX = /^(\\*?[-#/*\\\\\\w]+(\\[[0-9a-z_-]+\\])?)\\s*/;\nvar COLON_REGEX = /^:\\s*/;\nvar VALUE_REGEX = /^((?:'(?:\\\\'|.)*?'|\"(?:\\\\\"|.)*?\"|\\([^)]*?\\)|[^};])+)/;\nvar SEMICOLON_REGEX = /^[;\\s]*/;\n\n// https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String/Trim#Polyfill\nvar TRIM_REGEX = /^\\s+|\\s+$/g;\n\n// strings\nvar NEWLINE = '\\n';\nvar FORWARD_SLASH = '/';\nvar ASTERISK = '*';\nvar EMPTY_STRING = '';\n\n// types\nvar TYPE_COMMENT = 'comment';\nvar TYPE_DECLARATION = 'declaration';\n\n/**\n * @param {String} style\n * @param {Object} [options]\n * @return {Object[]}\n * @throws {TypeError}\n * @throws {Error}\n */\nmodule.exports = function(style, options) {\n if (typeof style !== 'string') {\n throw new TypeError('First argument must be a string');\n }\n\n if (!style) return [];\n\n options = options || {};\n\n /**\n * Positional.\n */\n var lineno = 1;\n var column = 1;\n\n /**\n * Update lineno and column based on `str`.\n *\n * @param {String} str\n */\n function updatePosition(str) {\n var lines = str.match(NEWLINE_REGEX);\n if (lines) lineno += lines.length;\n var i = str.lastIndexOf(NEWLINE);\n column = ~i ? str.length - i : column + str.length;\n }\n\n /**\n * Mark position and patch `node.position`.\n *\n * @return {Function}\n */\n function position() {\n var start = { line: lineno, column: column };\n return function(node) {\n node.position = new Position(start);\n whitespace();\n return node;\n };\n }\n\n /**\n * Store position information for a node.\n *\n * @constructor\n * @property {Object} start\n * @property {Object} end\n * @property {undefined|String} source\n */\n function Position(start) {\n this.start = start;\n this.end = { line: lineno, column: column };\n this.source = options.source;\n }\n\n /**\n * Non-enumerable source string.\n */\n Position.prototype.content = style;\n\n var errorsList = [];\n\n /**\n * Error `msg`.\n *\n * @param {String} msg\n * @throws {Error}\n */\n function error(msg) {\n var err = new Error(\n options.source + ':' + lineno + ':' + column + ': ' + msg\n );\n err.reason = msg;\n err.filename = options.source;\n err.line = lineno;\n err.column = column;\n err.source = style;\n\n if (options.silent) {\n errorsList.push(err);\n } else {\n throw err;\n }\n }\n\n /**\n * Match `re` and return captures.\n *\n * @param {RegExp} re\n * @return {undefined|Array}\n */\n function match(re) {\n var m = re.exec(style);\n if (!m) return;\n var str = m[0];\n updatePosition(str);\n style = style.slice(str.length);\n return m;\n }\n\n /**\n * Parse whitespace.\n */\n function whitespace() {\n match(WHITESPACE_REGEX);\n }\n\n /**\n * Parse comments.\n *\n * @param {Object[]} [rules]\n * @return {Object[]}\n */\n function comments(rules) {\n var c;\n rules = rules || [];\n while ((c = comment())) {\n if (c !== false) {\n rules.push(c);\n }\n }\n return rules;\n }\n\n /**\n * Parse comment.\n *\n * @return {Object}\n * @throws {Error}\n */\n function comment() {\n var pos = position();\n if (FORWARD_SLASH != style.charAt(0) || ASTERISK != style.charAt(1)) return;\n\n var i = 2;\n while (\n EMPTY_STRING != style.charAt(i) &&\n (ASTERISK != style.charAt(i) || FORWARD_SLASH != style.charAt(i + 1))\n ) {\n ++i;\n }\n i += 2;\n\n if (EMPTY_STRING === style.charAt(i - 1)) {\n return error('End of comment missing');\n }\n\n var str = style.slice(2, i - 2);\n column += 2;\n updatePosition(str);\n style = style.slice(i);\n column += 2;\n\n return pos({\n type: TYPE_COMMENT,\n comment: str\n });\n }\n\n /**\n * Parse declaration.\n *\n * @return {Object}\n * @throws {Error}\n */\n function declaration() {\n var pos = position();\n\n // prop\n var prop = match(PROPERTY_REGEX);\n if (!prop) return;\n comment();\n\n // :\n if (!match(COLON_REGEX)) return error(\"property missing ':'\");\n\n // val\n var val = match(VALUE_REGEX);\n\n var ret = pos({\n type: TYPE_DECLARATION,\n property: trim(prop[0].replace(COMMENT_REGEX, EMPTY_STRING)),\n value: val\n ? trim(val[0].replace(COMMENT_REGEX, EMPTY_STRING))\n : EMPTY_STRING\n });\n\n // ;\n match(SEMICOLON_REGEX);\n\n return ret;\n }\n\n /**\n * Parse declarations.\n *\n * @return {Object[]}\n */\n function declarations() {\n var decls = [];\n\n comments(decls);\n\n // declarations\n var decl;\n while ((decl = declaration())) {\n if (decl !== false) {\n decls.push(decl);\n comments(decls);\n }\n }\n\n return decls;\n }\n\n whitespace();\n return declarations();\n};\n\n/**\n * Trim `str`.\n *\n * @param {String} str\n * @return {String}\n */\nfunction trim(str) {\n return str ? str.replace(TRIM_REGEX, EMPTY_STRING) : EMPTY_STRING;\n}\n","var parse = require('inline-style-parser');\n\n/**\n * Parses inline style to object.\n *\n * @example\n * // returns { 'line-height': '42' }\n * StyleToObject('line-height: 42;');\n *\n * @param {String} style - The inline style.\n * @param {Function} [iterator] - The iterator function.\n * @return {null|Object}\n */\nfunction StyleToObject(style, iterator) {\n var output = null;\n if (!style || typeof style !== 'string') {\n return output;\n }\n\n var declaration;\n var declarations = parse(style);\n var hasIterator = typeof iterator === 'function';\n var property;\n var value;\n\n for (var i = 0, len = declarations.length; i < len; i++) {\n declaration = declarations[i];\n property = declaration.property;\n value = declaration.value;\n\n if (hasIterator) {\n iterator(property, value, declaration);\n } else if (value) {\n output || (output = {});\n output[property] = value;\n }\n }\n\n return output;\n}\n\nmodule.exports = StyleToObject;\n"],"names":["COMMENT_REGEX","NEWLINE_REGEX","WHITESPACE_REGEX","PROPERTY_REGEX","COLON_REGEX","VALUE_REGEX","SEMICOLON_REGEX","TRIM_REGEX","EMPTY_STRING","trim","str","replace","style","iterator","declaration","output","property","value","declarations","options","TypeError","lineno","column","updatePosition","lines","match","length","i","lastIndexOf","position","start","line","node","Position","whitespace","this","end","source","error","msg","err","Error","reason","filename","silent","re","m","exec","slice","comments","rules","c","comment","push","pos","charAt","type","prop","val","ret","prototype","content","decl","decls","parse","hasIterator","len"],"mappings":"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"} |
+22
-1
@@ -1,5 +0,26 @@ | ||
| # Change Log | ||
| # Changelog | ||
| All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. | ||
| ### [0.2.3](https://github.com/remarkablemark/style-to-object/compare/v0.2.2...v0.2.3) (2019-06-22) | ||
| ### Build System | ||
| * **package:** add field "files" and remove `.npmignore` ([fdf3966](https://github.com/remarkablemark/style-to-object/commit/fdf3966)) | ||
| * **package:** update script `build:min` to generate sourcemap ([a13be58](https://github.com/remarkablemark/style-to-object/commit/a13be58)) | ||
| * **package:** upgrade devDependencies ([377bb40](https://github.com/remarkablemark/style-to-object/commit/377bb40)) | ||
| * **rollup:** remove `uglify-es` from config as it's unneeded ([b0951e0](https://github.com/remarkablemark/style-to-object/commit/b0951e0)) | ||
| ### Tests | ||
| * organize and rename describe blocks ([8d4c004](https://github.com/remarkablemark/style-to-object/commit/8d4c004)) | ||
| * organize data (test suites) into cases, errors, and invalids ([513732b](https://github.com/remarkablemark/style-to-object/commit/513732b)) | ||
| * rename `test/cases.js` to `test/data.js` ([75d084d](https://github.com/remarkablemark/style-to-object/commit/75d084d)) | ||
| * **data:** add more test cases and errors ([c9242c7](https://github.com/remarkablemark/style-to-object/commit/c9242c7)) | ||
| * **data:** refactor test data from object to array format ([1a07a38](https://github.com/remarkablemark/style-to-object/commit/1a07a38)) | ||
| <a name="0.2.2"></a> | ||
@@ -6,0 +27,0 @@ ## [0.2.2](https://github.com/remarkablemark/style-to-object/compare/v0.2.1...v0.2.2) (2018-09-13) |
+126
-466
| (function (global, factory) { | ||
| typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : | ||
| typeof define === 'function' && define.amd ? define(factory) : | ||
| (global.StyleToObject = factory()); | ||
| }(this, (function () { 'use strict'; | ||
| (global = global || self, global.StyleToObject = factory()); | ||
| }(this, function () { 'use strict'; | ||
| // http://www.w3.org/TR/CSS21/grammar.html | ||
| // https://github.com/visionmedia/css-parse/pull/49#issuecomment-30088027 | ||
| var commentre = /\/\*[^*]*\*+([^/*][^*]*\*+)*\//g; | ||
| var COMMENT_REGEX = /\/\*[^*]*\*+([^/*][^*]*\*+)*\//g; | ||
| var parse = function(css, options){ | ||
| var NEWLINE_REGEX = /\n/g; | ||
| var WHITESPACE_REGEX = /^\s*/; | ||
| // declaration | ||
| var PROPERTY_REGEX = /^(\*?[-#/*\\\w]+(\[[0-9a-z_-]+\])?)\s*/; | ||
| var COLON_REGEX = /^:\s*/; | ||
| var VALUE_REGEX = /^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};])+)/; | ||
| var SEMICOLON_REGEX = /^[;\s]*/; | ||
| // https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String/Trim#Polyfill | ||
| var TRIM_REGEX = /^\s+|\s+$/g; | ||
| // strings | ||
| var NEWLINE = '\n'; | ||
| var FORWARD_SLASH = '/'; | ||
| var ASTERISK = '*'; | ||
| var EMPTY_STRING = ''; | ||
| // types | ||
| var TYPE_COMMENT = 'comment'; | ||
| var TYPE_DECLARATION = 'declaration'; | ||
| /** | ||
| * @param {String} style | ||
| * @param {Object} [options] | ||
| * @return {Object[]} | ||
| * @throws {TypeError} | ||
| * @throws {Error} | ||
| */ | ||
| var inlineStyleParser = function(style, options) { | ||
| if (typeof style !== 'string') { | ||
| throw new TypeError('First argument must be a string'); | ||
| } | ||
| if (!style) return []; | ||
| options = options || {}; | ||
@@ -17,3 +52,2 @@ | ||
| */ | ||
| var lineno = 1; | ||
@@ -24,8 +58,9 @@ var column = 1; | ||
| * Update lineno and column based on `str`. | ||
| * | ||
| * @param {String} str | ||
| */ | ||
| function updatePosition(str) { | ||
| var lines = str.match(/\n/g); | ||
| var lines = str.match(NEWLINE_REGEX); | ||
| if (lines) lineno += lines.length; | ||
| var i = str.lastIndexOf('\n'); | ||
| var i = str.lastIndexOf(NEWLINE); | ||
| column = ~i ? str.length - i : column + str.length; | ||
@@ -36,7 +71,8 @@ } | ||
| * Mark position and patch `node.position`. | ||
| * | ||
| * @return {Function} | ||
| */ | ||
| function position() { | ||
| var start = { line: lineno, column: column }; | ||
| return function(node){ | ||
| return function(node) { | ||
| node.position = new Position(start); | ||
@@ -49,5 +85,9 @@ whitespace(); | ||
| /** | ||
| * Store position information for a node | ||
| * Store position information for a node. | ||
| * | ||
| * @constructor | ||
| * @property {Object} start | ||
| * @property {Object} end | ||
| * @property {undefined|String} source | ||
| */ | ||
| function Position(start) { | ||
@@ -60,15 +100,16 @@ this.start = start; | ||
| /** | ||
| * Non-enumerable source string | ||
| * Non-enumerable source string. | ||
| */ | ||
| Position.prototype.content = style; | ||
| Position.prototype.content = css; | ||
| /** | ||
| * Error `msg`. | ||
| * | ||
| * @param {String} msg | ||
| * @throws {Error} | ||
| */ | ||
| var errorsList = []; | ||
| function error(msg) { | ||
| var err = new Error(options.source + ':' + lineno + ':' + column + ': ' + msg); | ||
| var err = new Error( | ||
| options.source + ':' + lineno + ':' + column + ': ' + msg | ||
| ); | ||
| err.reason = msg; | ||
@@ -78,7 +119,5 @@ err.filename = options.source; | ||
| err.column = column; | ||
| err.source = css; | ||
| err.source = style; | ||
| if (options.silent) { | ||
| errorsList.push(err); | ||
| } else { | ||
| if (options.silent) ; else { | ||
| throw err; | ||
@@ -89,62 +128,13 @@ } | ||
| /** | ||
| * Parse stylesheet. | ||
| */ | ||
| function stylesheet() { | ||
| var rulesList = rules(); | ||
| return { | ||
| type: 'stylesheet', | ||
| stylesheet: { | ||
| source: options.source, | ||
| rules: rulesList, | ||
| parsingErrors: errorsList | ||
| } | ||
| }; | ||
| } | ||
| /** | ||
| * Opening brace. | ||
| */ | ||
| function open() { | ||
| return match(/^{\s*/); | ||
| } | ||
| /** | ||
| * Closing brace. | ||
| */ | ||
| function close() { | ||
| return match(/^}/); | ||
| } | ||
| /** | ||
| * Parse ruleset. | ||
| */ | ||
| function rules() { | ||
| var node; | ||
| var rules = []; | ||
| whitespace(); | ||
| comments(rules); | ||
| while (css.length && css.charAt(0) != '}' && (node = atrule() || rule())) { | ||
| if (node !== false) { | ||
| rules.push(node); | ||
| comments(rules); | ||
| } | ||
| } | ||
| return rules; | ||
| } | ||
| /** | ||
| * Match `re` and return captures. | ||
| * | ||
| * @param {RegExp} re | ||
| * @return {undefined|Array} | ||
| */ | ||
| function match(re) { | ||
| var m = re.exec(css); | ||
| var m = re.exec(style); | ||
| if (!m) return; | ||
| var str = m[0]; | ||
| updatePosition(str); | ||
| css = css.slice(str.length); | ||
| style = style.slice(str.length); | ||
| return m; | ||
@@ -156,15 +146,16 @@ } | ||
| */ | ||
| function whitespace() { | ||
| match(/^\s*/); | ||
| match(WHITESPACE_REGEX); | ||
| } | ||
| /** | ||
| * Parse comments; | ||
| * Parse comments. | ||
| * | ||
| * @param {Object[]} [rules] | ||
| * @return {Object[]} | ||
| */ | ||
| function comments(rules) { | ||
| var c; | ||
| rules = rules || []; | ||
| while (c = comment()) { | ||
| while ((c = comment())) { | ||
| if (c !== false) { | ||
@@ -179,24 +170,31 @@ rules.push(c); | ||
| * Parse comment. | ||
| * | ||
| * @return {Object} | ||
| * @throws {Error} | ||
| */ | ||
| function comment() { | ||
| var pos = position(); | ||
| if ('/' != css.charAt(0) || '*' != css.charAt(1)) return; | ||
| if (FORWARD_SLASH != style.charAt(0) || ASTERISK != style.charAt(1)) return; | ||
| var i = 2; | ||
| while ("" != css.charAt(i) && ('*' != css.charAt(i) || '/' != css.charAt(i + 1))) ++i; | ||
| while ( | ||
| EMPTY_STRING != style.charAt(i) && | ||
| (ASTERISK != style.charAt(i) || FORWARD_SLASH != style.charAt(i + 1)) | ||
| ) { | ||
| ++i; | ||
| } | ||
| i += 2; | ||
| if ("" === css.charAt(i-1)) { | ||
| if (EMPTY_STRING === style.charAt(i - 1)) { | ||
| return error('End of comment missing'); | ||
| } | ||
| var str = css.slice(2, i - 2); | ||
| var str = style.slice(2, i - 2); | ||
| column += 2; | ||
| updatePosition(str); | ||
| css = css.slice(i); | ||
| style = style.slice(i); | ||
| column += 2; | ||
| return pos({ | ||
| type: 'comment', | ||
| type: TYPE_COMMENT, | ||
| comment: str | ||
@@ -207,25 +205,7 @@ }); | ||
| /** | ||
| * Parse selector. | ||
| */ | ||
| function selector() { | ||
| var m = match(/^([^{]+)/); | ||
| if (!m) return; | ||
| /* @fix Remove all comments from selectors | ||
| * http://ostermiller.org/findcomment.html */ | ||
| return trim(m[0]) | ||
| .replace(/\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*\/+/g, '') | ||
| .replace(/"(?:\\"|[^"])*"|'(?:\\'|[^'])*'/g, function(m) { | ||
| return m.replace(/,/g, '\u200C'); | ||
| }) | ||
| .split(/\s*(?![^(]*\)),\s*/) | ||
| .map(function(s) { | ||
| return s.replace(/\u200C/g, ','); | ||
| }); | ||
| } | ||
| /** | ||
| * Parse declaration. | ||
| * | ||
| * @return {Object} | ||
| * @throws {Error} | ||
| */ | ||
| function declaration() { | ||
@@ -235,20 +215,22 @@ var pos = position(); | ||
| // prop | ||
| var prop = match(/^(\*?[-#\/\*\\\w]+(\[[0-9a-z_-]+\])?)\s*/); | ||
| var prop = match(PROPERTY_REGEX); | ||
| if (!prop) return; | ||
| prop = trim(prop[0]); | ||
| comment(); | ||
| // : | ||
| if (!match(/^:\s*/)) return error("property missing ':'"); | ||
| if (!match(COLON_REGEX)) return error("property missing ':'"); | ||
| // val | ||
| var val = match(/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^\)]*?\)|[^};])+)/); | ||
| var val = match(VALUE_REGEX); | ||
| var ret = pos({ | ||
| type: 'declaration', | ||
| property: prop.replace(commentre, ''), | ||
| value: val ? trim(val[0]).replace(commentre, '') : '' | ||
| type: TYPE_DECLARATION, | ||
| property: trim(prop[0].replace(COMMENT_REGEX, EMPTY_STRING)), | ||
| value: val | ||
| ? trim(val[0].replace(COMMENT_REGEX, EMPTY_STRING)) | ||
| : EMPTY_STRING | ||
| }); | ||
| // ; | ||
| match(/^[;\s]*/); | ||
| match(SEMICOLON_REGEX); | ||
@@ -260,8 +242,8 @@ return ret; | ||
| * Parse declarations. | ||
| * | ||
| * @return {Object[]} | ||
| */ | ||
| function declarations() { | ||
| var decls = []; | ||
| if (!open()) return error("missing '{'"); | ||
| comments(decls); | ||
@@ -271,3 +253,3 @@ | ||
| var decl; | ||
| while (decl = declaration()) { | ||
| while ((decl = declaration())) { | ||
| if (decl !== false) { | ||
@@ -279,308 +261,7 @@ decls.push(decl); | ||
| if (!close()) return error("missing '}'"); | ||
| return decls; | ||
| } | ||
| /** | ||
| * Parse keyframe. | ||
| */ | ||
| function keyframe() { | ||
| var m; | ||
| var vals = []; | ||
| var pos = position(); | ||
| while (m = match(/^((\d+\.\d+|\.\d+|\d+)%?|[a-z]+)\s*/)) { | ||
| vals.push(m[1]); | ||
| match(/^,\s*/); | ||
| } | ||
| if (!vals.length) return; | ||
| return pos({ | ||
| type: 'keyframe', | ||
| values: vals, | ||
| declarations: declarations() | ||
| }); | ||
| } | ||
| /** | ||
| * Parse keyframes. | ||
| */ | ||
| function atkeyframes() { | ||
| var pos = position(); | ||
| var m = match(/^@([-\w]+)?keyframes\s*/); | ||
| if (!m) return; | ||
| var vendor = m[1]; | ||
| // identifier | ||
| var m = match(/^([-\w]+)\s*/); | ||
| if (!m) return error("@keyframes missing name"); | ||
| var name = m[1]; | ||
| if (!open()) return error("@keyframes missing '{'"); | ||
| var frame; | ||
| var frames = comments(); | ||
| while (frame = keyframe()) { | ||
| frames.push(frame); | ||
| frames = frames.concat(comments()); | ||
| } | ||
| if (!close()) return error("@keyframes missing '}'"); | ||
| return pos({ | ||
| type: 'keyframes', | ||
| name: name, | ||
| vendor: vendor, | ||
| keyframes: frames | ||
| }); | ||
| } | ||
| /** | ||
| * Parse supports. | ||
| */ | ||
| function atsupports() { | ||
| var pos = position(); | ||
| var m = match(/^@supports *([^{]+)/); | ||
| if (!m) return; | ||
| var supports = trim(m[1]); | ||
| if (!open()) return error("@supports missing '{'"); | ||
| var style = comments().concat(rules()); | ||
| if (!close()) return error("@supports missing '}'"); | ||
| return pos({ | ||
| type: 'supports', | ||
| supports: supports, | ||
| rules: style | ||
| }); | ||
| } | ||
| /** | ||
| * Parse host. | ||
| */ | ||
| function athost() { | ||
| var pos = position(); | ||
| var m = match(/^@host\s*/); | ||
| if (!m) return; | ||
| if (!open()) return error("@host missing '{'"); | ||
| var style = comments().concat(rules()); | ||
| if (!close()) return error("@host missing '}'"); | ||
| return pos({ | ||
| type: 'host', | ||
| rules: style | ||
| }); | ||
| } | ||
| /** | ||
| * Parse media. | ||
| */ | ||
| function atmedia() { | ||
| var pos = position(); | ||
| var m = match(/^@media *([^{]+)/); | ||
| if (!m) return; | ||
| var media = trim(m[1]); | ||
| if (!open()) return error("@media missing '{'"); | ||
| var style = comments().concat(rules()); | ||
| if (!close()) return error("@media missing '}'"); | ||
| return pos({ | ||
| type: 'media', | ||
| media: media, | ||
| rules: style | ||
| }); | ||
| } | ||
| /** | ||
| * Parse custom-media. | ||
| */ | ||
| function atcustommedia() { | ||
| var pos = position(); | ||
| var m = match(/^@custom-media\s+(--[^\s]+)\s*([^{;]+);/); | ||
| if (!m) return; | ||
| return pos({ | ||
| type: 'custom-media', | ||
| name: trim(m[1]), | ||
| media: trim(m[2]) | ||
| }); | ||
| } | ||
| /** | ||
| * Parse paged media. | ||
| */ | ||
| function atpage() { | ||
| var pos = position(); | ||
| var m = match(/^@page */); | ||
| if (!m) return; | ||
| var sel = selector() || []; | ||
| if (!open()) return error("@page missing '{'"); | ||
| var decls = comments(); | ||
| // declarations | ||
| var decl; | ||
| while (decl = declaration()) { | ||
| decls.push(decl); | ||
| decls = decls.concat(comments()); | ||
| } | ||
| if (!close()) return error("@page missing '}'"); | ||
| return pos({ | ||
| type: 'page', | ||
| selectors: sel, | ||
| declarations: decls | ||
| }); | ||
| } | ||
| /** | ||
| * Parse document. | ||
| */ | ||
| function atdocument() { | ||
| var pos = position(); | ||
| var m = match(/^@([-\w]+)?document *([^{]+)/); | ||
| if (!m) return; | ||
| var vendor = trim(m[1]); | ||
| var doc = trim(m[2]); | ||
| if (!open()) return error("@document missing '{'"); | ||
| var style = comments().concat(rules()); | ||
| if (!close()) return error("@document missing '}'"); | ||
| return pos({ | ||
| type: 'document', | ||
| document: doc, | ||
| vendor: vendor, | ||
| rules: style | ||
| }); | ||
| } | ||
| /** | ||
| * Parse font-face. | ||
| */ | ||
| function atfontface() { | ||
| var pos = position(); | ||
| var m = match(/^@font-face\s*/); | ||
| if (!m) return; | ||
| if (!open()) return error("@font-face missing '{'"); | ||
| var decls = comments(); | ||
| // declarations | ||
| var decl; | ||
| while (decl = declaration()) { | ||
| decls.push(decl); | ||
| decls = decls.concat(comments()); | ||
| } | ||
| if (!close()) return error("@font-face missing '}'"); | ||
| return pos({ | ||
| type: 'font-face', | ||
| declarations: decls | ||
| }); | ||
| } | ||
| /** | ||
| * Parse import | ||
| */ | ||
| var atimport = _compileAtrule('import'); | ||
| /** | ||
| * Parse charset | ||
| */ | ||
| var atcharset = _compileAtrule('charset'); | ||
| /** | ||
| * Parse namespace | ||
| */ | ||
| var atnamespace = _compileAtrule('namespace'); | ||
| /** | ||
| * Parse non-block at-rules | ||
| */ | ||
| function _compileAtrule(name) { | ||
| var re = new RegExp('^@' + name + '\\s*([^;]+);'); | ||
| return function() { | ||
| var pos = position(); | ||
| var m = match(re); | ||
| if (!m) return; | ||
| var ret = { type: name }; | ||
| ret[name] = m[1].trim(); | ||
| return pos(ret); | ||
| } | ||
| } | ||
| /** | ||
| * Parse at rule. | ||
| */ | ||
| function atrule() { | ||
| if (css[0] != '@') return; | ||
| return atkeyframes() | ||
| || atmedia() | ||
| || atcustommedia() | ||
| || atsupports() | ||
| || atimport() | ||
| || atcharset() | ||
| || atnamespace() | ||
| || atdocument() | ||
| || atpage() | ||
| || athost() | ||
| || atfontface(); | ||
| } | ||
| /** | ||
| * Parse rule. | ||
| */ | ||
| function rule() { | ||
| var pos = position(); | ||
| var sel = selector(); | ||
| if (!sel) return error('selector missing'); | ||
| comments(); | ||
| return pos({ | ||
| type: 'rule', | ||
| selectors: sel, | ||
| declarations: declarations() | ||
| }); | ||
| } | ||
| return addParent(stylesheet()); | ||
| whitespace(); | ||
| return declarations(); | ||
| }; | ||
@@ -590,41 +271,16 @@ | ||
| * Trim `str`. | ||
| * | ||
| * @param {String} str | ||
| * @return {String} | ||
| */ | ||
| function trim(str) { | ||
| return str ? str.replace(/^\s+|\s+$/g, '') : ''; | ||
| return str ? str.replace(TRIM_REGEX, EMPTY_STRING) : EMPTY_STRING; | ||
| } | ||
| /** | ||
| * Adds non-enumerable parent node reference to each node. | ||
| */ | ||
| function addParent(obj, parent) { | ||
| var isNode = obj && typeof obj.type === 'string'; | ||
| var childParent = isNode ? obj : parent; | ||
| for (var k in obj) { | ||
| var value = obj[k]; | ||
| if (Array.isArray(value)) { | ||
| value.forEach(function(v) { addParent(v, childParent); }); | ||
| } else if (value && typeof value === 'object') { | ||
| addParent(value, childParent); | ||
| } | ||
| } | ||
| if (isNode) { | ||
| Object.defineProperty(obj, 'parent', { | ||
| configurable: true, | ||
| writable: true, | ||
| enumerable: false, | ||
| value: parent || null | ||
| }); | ||
| } | ||
| return obj; | ||
| } | ||
| /** | ||
| * Parses inline style. | ||
| * Parses inline style to object. | ||
| * | ||
| * Example: 'color:red' => { color: 'red' } | ||
| * @example | ||
| * // returns { 'line-height': '42' } | ||
| * StyleToObject('line-height: 42;'); | ||
| * | ||
@@ -635,11 +291,13 @@ * @param {String} style - The inline style. | ||
| */ | ||
| var styleToObject = function parseInlineStyle(style, iterator) { | ||
| if (!style || typeof style !== 'string') return null; | ||
| function StyleToObject(style, iterator) { | ||
| var output = null; | ||
| if (!style || typeof style !== 'string') { | ||
| return output; | ||
| } | ||
| // make sure to wrap declarations in placeholder | ||
| var declarations = parse('p{' + style + '}').stylesheet.rules[0].declarations; | ||
| var declaration, property, value; | ||
| var output = null; | ||
| var declaration; | ||
| var declarations = inlineStyleParser(style); | ||
| var hasIterator = typeof iterator === 'function'; | ||
| var property; | ||
| var value; | ||
@@ -660,6 +318,8 @@ for (var i = 0, len = declarations.length; i < len; i++) { | ||
| return output; | ||
| }; | ||
| } | ||
| var styleToObject = StyleToObject; | ||
| return styleToObject; | ||
| }))); | ||
| })); |
@@ -1,1 +0,2 @@ | ||
| !function(r,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):r.StyleToObject=e()}(this,function(){"use strict";var z=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//g,f=function(t,n){n=n||{};var i=1,s=1;function a(r){var e=r.match(/\n/g);e&&(i+=e.length);var n=r.lastIndexOf("\n");s=~n?r.length-n:s+r.length}function u(){var e={line:i,column:s};return function(r){return r.position=new o(e),g(),r}}function o(r){this.start=r,this.end={line:i,column:s},this.source=n.source}o.prototype.content=t;var c=[];function f(r){var e=new Error(n.source+":"+i+":"+s+": "+r);if(e.reason=r,e.filename=n.source,e.line=i,e.column=s,e.source=t,!n.silent)throw e;c.push(e)}function p(){return v(/^{\s*/)}function m(){return v(/^}/)}function l(){var r,e=[];for(g(),y(e);t.length&&"}"!=t.charAt(0)&&(r=j()||O());)!1!==r&&(e.push(r),y(e));return e}function v(r){var e=r.exec(t);if(e){var n=e[0];return a(n),t=t.slice(n.length),e}}function g(){v(/^\s*/)}function y(r){var e;for(r=r||[];e=d();)!1!==e&&r.push(e);return r}function d(){var r=u();if("/"==t.charAt(0)&&"*"==t.charAt(1)){for(var e=2;""!=t.charAt(e)&&("*"!=t.charAt(e)||"/"!=t.charAt(e+1));)++e;if(e+=2,""===t.charAt(e-1))return f("End of comment missing");var n=t.slice(2,e-2);return s+=2,a(n),t=t.slice(e),s+=2,r({type:"comment",comment:n})}}function h(){var r=v(/^([^{]+)/);if(r)return C(r[0]).replace(/\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*\/+/g,"").replace(/"(?:\\"|[^"])*"|'(?:\\'|[^'])*'/g,function(r){return r.replace(/,/g,"")}).split(/\s*(?![^(]*\)),\s*/).map(function(r){return r.replace(/\u200C/g,",")})}function w(){var r=u(),e=v(/^(\*?[-#\/\*\\\w]+(\[[0-9a-z_-]+\])?)\s*/);if(e){if(e=C(e[0]),!v(/^:\s*/))return f("property missing ':'");var n=v(/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^\)]*?\)|[^};])+)/),t=r({type:"declaration",property:e.replace(z,""),value:n?C(n[0]).replace(z,""):""});return v(/^[;\s]*/),t}}function A(){var r,e=[];if(!p())return f("missing '{'");for(y(e);r=w();)!1!==r&&(e.push(r),y(e));return m()?e:f("missing '}'")}function b(){for(var r,e=[],n=u();r=v(/^((\d+\.\d+|\.\d+|\d+)%?|[a-z]+)\s*/);)e.push(r[1]),v(/^,\s*/);if(e.length)return n({type:"keyframe",values:e,declarations:A()})}var r,e=E("import"),k=E("charset"),x=E("namespace");function E(t){var i=new RegExp("^@"+t+"\\s*([^;]+);");return function(){var r=u(),e=v(i);if(e){var n={type:t};return n[t]=e[1].trim(),r(n)}}}function j(){if("@"==t[0])return function(){var r=u();if(e=v(/^@([-\w]+)?keyframes\s*/)){var e,n=e[1];if(!(e=v(/^([-\w]+)\s*/)))return f("@keyframes missing name");var t,i=e[1];if(!p())return f("@keyframes missing '{'");for(var s=y();t=b();)s.push(t),s=s.concat(y());return m()?r({type:"keyframes",name:i,vendor:n,keyframes:s}):f("@keyframes missing '}'")}}()||function(){var r=u(),e=v(/^@media *([^{]+)/);if(e){var n=C(e[1]);if(!p())return f("@media missing '{'");var t=y().concat(l());return m()?r({type:"media",media:n,rules:t}):f("@media missing '}'")}}()||function(){var r=u(),e=v(/^@custom-media\s+(--[^\s]+)\s*([^{;]+);/);if(e)return r({type:"custom-media",name:C(e[1]),media:C(e[2])})}()||function(){var r=u(),e=v(/^@supports *([^{]+)/);if(e){var n=C(e[1]);if(!p())return f("@supports missing '{'");var t=y().concat(l());return m()?r({type:"supports",supports:n,rules:t}):f("@supports missing '}'")}}()||e()||k()||x()||function(){var r=u(),e=v(/^@([-\w]+)?document *([^{]+)/);if(e){var n=C(e[1]),t=C(e[2]);if(!p())return f("@document missing '{'");var i=y().concat(l());return m()?r({type:"document",document:t,vendor:n,rules:i}):f("@document missing '}'")}}()||function(){var r=u();if(v(/^@page */)){var e=h()||[];if(!p())return f("@page missing '{'");for(var n,t=y();n=w();)t.push(n),t=t.concat(y());return m()?r({type:"page",selectors:e,declarations:t}):f("@page missing '}'")}}()||function(){var r=u();if(v(/^@host\s*/)){if(!p())return f("@host missing '{'");var e=y().concat(l());return m()?r({type:"host",rules:e}):f("@host missing '}'")}}()||function(){var r=u();if(v(/^@font-face\s*/)){if(!p())return f("@font-face missing '{'");for(var e,n=y();e=w();)n.push(e),n=n.concat(y());return m()?r({type:"font-face",declarations:n}):f("@font-face missing '}'")}}()}function O(){var r=u(),e=h();return e?(y(),r({type:"rule",selectors:e,declarations:A()})):f("selector missing")}return function e(r,n){var t=r&&"string"==typeof r.type;var i=t?r:n;for(var s in r){var a=r[s];Array.isArray(a)?a.forEach(function(r){e(r,i)}):a&&"object"==typeof a&&e(a,i)}t&&Object.defineProperty(r,"parent",{configurable:!0,writable:!0,enumerable:!1,value:n||null});return r}((r=l(),{type:"stylesheet",stylesheet:{source:n.source,rules:r,parsingErrors:c}}))};function C(r){return r?r.replace(/^\s+|\s+$/g,""):""}return function(r,e){if(!r||"string"!=typeof r)return null;for(var n,t,i,s=f("p{"+r+"}").stylesheet.rules[0].declarations,a=null,u="function"==typeof e,o=0,c=s.length;o<c;o++)t=(n=s[o]).property,i=n.value,u?e(t,i,n):i&&(a||(a={}),a[t]=i);return a}}); | ||
| !function(n,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r():"function"==typeof define&&define.amd?define(r):(n=n||self).StyleToObject=r()}(this,function(){"use strict";var m=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//g,g=/\n/g,y=/^\s*/,d=/^(\*?[-#/*\\\w]+(\[[0-9a-z_-]+\])?)\s*/,w=/^:\s*/,A=/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};])+)/,x=/^[;\s]*/,r=/^\s+|\s+$/g,b="";function E(n){return n?n.replace(r,b):b}return function(n,r){var t,e=null;if(!n||"string"!=typeof n)return e;for(var o,i,u=function(e,t){if("string"!=typeof e)throw new TypeError("First argument must be a string");if(!e)return[];t=t||{};var o=1,i=1;function u(n){var r=n.match(g);r&&(o+=r.length);var t=n.lastIndexOf("\n");i=~t?n.length-t:i+n.length}function c(){var r={line:o,column:i};return function(n){return n.position=new f(r),l(),n}}function f(n){this.start=n,this.end={line:o,column:i},this.source=t.source}function a(n){var r=new Error(t.source+":"+o+":"+i+": "+n);if(r.reason=n,r.filename=t.source,r.line=o,r.column=i,r.source=e,!t.silent)throw r}function s(n){var r=n.exec(e);if(r){var t=r[0];return u(t),e=e.slice(t.length),r}}function l(){s(y)}function p(n){var r;for(n=n||[];r=h();)!1!==r&&n.push(r);return n}function h(){var n=c();if("/"==e.charAt(0)&&"*"==e.charAt(1)){for(var r=2;b!=e.charAt(r)&&("*"!=e.charAt(r)||"/"!=e.charAt(r+1));)++r;if(r+=2,b===e.charAt(r-1))return a("End of comment missing");var t=e.slice(2,r-2);return i+=2,u(t),e=e.slice(r),i+=2,n({type:"comment",comment:t})}}function v(){var n=c(),r=s(d);if(r){if(h(),!s(w))return a("property missing ':'");var t=s(A),e=n({type:"declaration",property:E(r[0].replace(m,b)),value:t?E(t[0].replace(m,b)):b});return s(x),e}}return f.prototype.content=e,l(),function(){var n,r=[];for(p(r);n=v();)!1!==n&&(r.push(n),p(r));return r}()}(n),c="function"==typeof r,f=0,a=u.length;f<a;f++)o=(t=u[f]).property,i=t.value,c?r(o,i,t):i&&((e=e||{})[o]=i);return e}}); | ||
| //# sourceMappingURL=style-to-object.min.js.map |
+17
-11
@@ -1,7 +0,9 @@ | ||
| var parse = require('css/lib/parse'); | ||
| var parse = require('inline-style-parser'); | ||
| /** | ||
| * Parses inline style. | ||
| * Parses inline style to object. | ||
| * | ||
| * Example: 'color:red' => { color: 'red' } | ||
| * @example | ||
| * // returns { 'line-height': '42' } | ||
| * StyleToObject('line-height: 42;'); | ||
| * | ||
@@ -12,11 +14,13 @@ * @param {String} style - The inline style. | ||
| */ | ||
| module.exports = function parseInlineStyle(style, iterator) { | ||
| if (!style || typeof style !== 'string') return null; | ||
| function StyleToObject(style, iterator) { | ||
| var output = null; | ||
| if (!style || typeof style !== 'string') { | ||
| return output; | ||
| } | ||
| // make sure to wrap declarations in placeholder | ||
| var declarations = parse('p{' + style + '}').stylesheet.rules[0].declarations; | ||
| var declaration, property, value; | ||
| var output = null; | ||
| var declaration; | ||
| var declarations = parse(style); | ||
| var hasIterator = typeof iterator === 'function'; | ||
| var property; | ||
| var value; | ||
@@ -37,2 +41,4 @@ for (var i = 0, len = declarations.length; i < len; i++) { | ||
| return output; | ||
| }; | ||
| } | ||
| module.exports = StyleToObject; |
+34
-21
| { | ||
| "name": "style-to-object", | ||
| "version": "0.2.2", | ||
| "version": "0.2.3", | ||
| "description": "Converts inline style to object.", | ||
@@ -8,12 +8,15 @@ "author": "Mark <mark@remarkablemark.org>", | ||
| "scripts": { | ||
| "build": "npm run clean && npm run build:min && npm run build:unmin", | ||
| "build:min": "NODE_ENV=production rollup --config --file dist/style-to-object.min.js --sourcemap", | ||
| "build:unmin": "NODE_ENV=development rollup --config --file dist/style-to-object.js", | ||
| "clean": "rm -rf dist", | ||
| "coveralls": "nyc report --reporter=text-lcov | coveralls", | ||
| "lint": "eslint --ignore-path .gitignore .", | ||
| "lint:fix": "npm run lint -- --fix", | ||
| "prepublishOnly": "npm run build", | ||
| "release": "standard-version", | ||
| "release": "standard-version --no-verify", | ||
| "test": "mocha", | ||
| "lint": "eslint --ignore-path .gitignore .", | ||
| "cover": "istanbul cover _mocha -- -R spec \"test/**/*.js\"", | ||
| "coveralls": "cat coverage/lcov.info | coveralls", | ||
| "clean": "rm -rf dist", | ||
| "build": "npm run clean && npm run build:min && npm run build:unmin", | ||
| "build:min": "NODE_ENV=production rollup --config --output.file dist/style-to-object.min.js", | ||
| "build:unmin": "rollup --config --output.file dist/style-to-object.js" | ||
| "test:coverage": "nyc npm test", | ||
| "test:coverage:report": "nyc report --reporter=html", | ||
| "test:watch": "mocha --watch" | ||
| }, | ||
@@ -28,5 +31,7 @@ "repository": { | ||
| "keywords": [ | ||
| "style-to-object", | ||
| "inline", | ||
| "style", | ||
| "parser", | ||
| "css", | ||
| "style", | ||
| "object", | ||
@@ -36,17 +41,25 @@ "pojo" | ||
| "dependencies": { | ||
| "css": "2.2.4" | ||
| "inline-style-parser": "0.1.1" | ||
| }, | ||
| "devDependencies": { | ||
| "coveralls": "3.0.2", | ||
| "eslint": "5.5.0", | ||
| "istanbul": "0.4.5", | ||
| "mocha": "5.2.0", | ||
| "rollup": "0.65.2", | ||
| "rollup-plugin-commonjs": "9.1.6", | ||
| "rollup-plugin-node-resolve": "3.4.0", | ||
| "rollup-plugin-uglify": "5.0.2", | ||
| "standard-version": "4.4.0", | ||
| "uglify-es": "3.3.9" | ||
| "@commitlint/cli": "^8.0.0", | ||
| "@commitlint/config-conventional": "^8.0.0", | ||
| "coveralls": "^3.0.4", | ||
| "eslint": "^6.0.0", | ||
| "eslint-plugin-prettier": "^3.1.0", | ||
| "husky": "^2.4.1", | ||
| "lint-staged": "^8.2.1", | ||
| "mocha": "^6.1.4", | ||
| "nyc": "^14.1.1", | ||
| "prettier": "^1.18.2", | ||
| "rollup": "^1.16.2", | ||
| "rollup-plugin-commonjs": "^10.0.0", | ||
| "rollup-plugin-node-resolve": "^5.0.4", | ||
| "rollup-plugin-uglify": "^6.0.2", | ||
| "standard-version": "^6.0.1" | ||
| }, | ||
| "files": [ | ||
| "/dist" | ||
| ], | ||
| "license": "MIT" | ||
| } |
+84
-31
@@ -9,2 +9,3 @@ # style-to-object | ||
| [](https://david-dm.org/remarkablemark/style-to-object) | ||
| [](https://www.npmjs.com/package/style-to-object) | ||
@@ -16,7 +17,12 @@ Parses inline style to object: | ||
| parser('color: #C0FFEE; background: #BADA55;'); | ||
| // { color: "#C0FFEE", background: "#BADA55" } | ||
| ``` | ||
| [JSFiddle](https://jsfiddle.net/remarkablemark/ykz2meot/) | [repl.it](https://repl.it/@remarkablemark/style-to-object) | ||
| Output: | ||
| ```js | ||
| { color: '#C0FFEE', background: '#BADA55' } | ||
| ``` | ||
| [JSFiddle](https://jsfiddle.net/remarkablemark/ykz2meot/) | [Repl.it](https://repl.it/@remarkablemark/style-to-object) | [Examples](https://github.com/remarkablemark/style-to-object/tree/master/examples) | ||
| ## Installation | ||
@@ -27,3 +33,3 @@ | ||
| ```sh | ||
| npm install style-to-object --save | ||
| $ npm install style-to-object --save | ||
| ``` | ||
@@ -34,3 +40,3 @@ | ||
| ```sh | ||
| yarn add style-to-object | ||
| $ yarn add style-to-object | ||
| ``` | ||
@@ -43,3 +49,3 @@ | ||
| <script> | ||
| var parser = window.StyleToObject; | ||
| window.StyleToObject(/* string */); | ||
| </script> | ||
@@ -54,6 +60,6 @@ ``` | ||
| // CommonJS | ||
| const parser = require('style-to-object'); | ||
| const parse = require('style-to-object'); | ||
| // ES Modules | ||
| import parser from 'style-to-object'; | ||
| import parse from 'style-to-object'; | ||
| ``` | ||
@@ -64,8 +70,11 @@ | ||
| ```js | ||
| parse(` | ||
| color: #f00 | ||
| `); | ||
| // { color: '#f00' } | ||
| parse('line-height: 42'); | ||
| ``` | ||
| Output: | ||
| ```js | ||
| { 'line-height': '42' } | ||
| ``` | ||
| Parse multiple declarations: | ||
@@ -75,22 +84,28 @@ | ||
| parse(` | ||
| color: #f00; | ||
| z-index: 42; | ||
| border-color: #ACE; | ||
| z-index: 1337; | ||
| `); | ||
| // { color: '#f00', 'z-index': '42' } | ||
| ``` | ||
| Output: | ||
| ```js | ||
| { 'border-color': '#ACE', 'z-index': '1337' } | ||
| ``` | ||
| Parse unknown declarations: | ||
| ```js | ||
| parse(` | ||
| foo: bar; | ||
| `); | ||
| // { foo: 'bar' } | ||
| parse('answer: 42;'); | ||
| ``` | ||
| Invalid declarations: | ||
| Output: | ||
| ```js | ||
| parse(1); // null | ||
| parse('top:'); // null | ||
| { 'answer': '42' } | ||
| ``` | ||
| Invalid declarations/arguments: | ||
| ```js | ||
| parse(` | ||
@@ -100,3 +115,14 @@ top: ; | ||
| `); // { right: '1em' } | ||
| parse(); // null | ||
| parse(null); // null | ||
| parse(1); // null | ||
| parse(true); // null | ||
| parse('top:'); // null | ||
| parse(':12px'); // null | ||
| parse(':'); // null | ||
| parse(';'); // null | ||
| parse('top'); // throws Error | ||
| parse('/*'); // throws Error | ||
| ``` | ||
@@ -109,3 +135,3 @@ | ||
| ```js | ||
| parser('color: #f00', function() {}); // null | ||
| parse('color: #f00', function() {}); // null | ||
| ``` | ||
@@ -127,11 +153,11 @@ | ||
| const style = ` | ||
| color: #f00; | ||
| background: #ba4; | ||
| color: red; | ||
| background: blue; | ||
| `; | ||
| const output = []; | ||
| const iterator = (name, value) => { | ||
| function iterator(name, value) { | ||
| output.push([name, value]); | ||
| }; | ||
| parser(style, iterator); | ||
| console.log(output); // [['color', '#f00'], ['background', '#ba4']] | ||
| } | ||
| parse(style, iterator); | ||
| console.log(output); // [['color', 'red'], ['background', 'blue']] | ||
| ``` | ||
@@ -141,13 +167,40 @@ | ||
| Run tests: | ||
| ```sh | ||
| $ npm test | ||
| ``` | ||
| Run tests in watch mode: | ||
| ```sh | ||
| $ npm run test:watch | ||
| ``` | ||
| Run tests with coverage: | ||
| ```sh | ||
| $ npm run test:coverage | ||
| # npm run test:coverage:report | ||
| ``` | ||
| Lint files: | ||
| ```sh | ||
| $ npm run lint | ||
| ``` | ||
| Fix lint errors: | ||
| ```sh | ||
| $ npm run lint:fix | ||
| ``` | ||
| ## Release | ||
| Only collaborators with credentials can release and publish: | ||
| ```sh | ||
| $ npm run release | ||
| $ npm publish | ||
| $ git push --follow-tags | ||
| $ git push --follow-tags && npm publish | ||
| ``` | ||
@@ -157,3 +210,3 @@ | ||
| - [css](https://github.com/reworkcss/css) | ||
| - [inline-style-parser](https://github.com/remarkablemark/inline-style-parser) | ||
| - [Contributors](https://github.com/remarkablemark/style-to-object/graphs/contributors) | ||
@@ -160,0 +213,0 @@ |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
28995
11.19%8
14.29%204
35.1%15
50%308
-44.5%6
Infinity%1
Infinity%+ Added
+ Added
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed