CSS selectors complexity and performance analyzer

Overview

analyze-css

NPM version Known Vulnerabilities Coverage Status CodeFactor

Download stats

CSS selectors complexity and performance analyzer. analyze-css is built as a set of rules bound to events fired by CSS parser. Each rule can generate metrics and add "offenders" with more detailed information (see Usage section for an example).

Install

analyze-css comes as a "binary" for command-line and as CommonJS module. Run the following to install them globally:

npm install --global analyze-css

or to install from GitHub's repository:

npm install --global @macbre/analyze-css

Usage

Command line tool

You can use analyze-css "binary" to analyze local CSS files or remote CSS assets:

$ analyze-css --file examples/elecena.css

$ analyze-css --url http://s3.macbre.net/analyze-css/propertyResets.css
$ analyze-css --url https://s3.macbre.net/analyze-css/propertyResets.css --ignore-ssl-errors

You can provide CSS via stdin as well (notice the dash: -):

$ echo ".foo {margin: 0 \!important}" | analyze-css -

This will emit JSON formatted results on stdout. Use --pretty (or -p shortcut) option to make the output readable for human beings.

Basic HTTP authentication can be provided through the options --auth-user and --auth-pass.

HTTP proxy (e.g. http://localhost:8080) can be provided via:

  • --proxy or -x option
  • HTTP_PROXY env variable

CommonJS module

npm i --save analyze-css
const analyze = require('analyze-css');

(async() => {
  const results = await analyze('.foo {margin: 0 !important}');
  console.log(results); // example? see below
})();
// options can be provided
const opts = {
  'noOffenders': true
};

(async() => {
  const results = await analyze('.foo {margin: 0 !important}', opts);
  console.log(results); // example? see below
})();

grunt task

Created by @DeuxHuitHuit

$ npm i grunt-contrib-analyze-css

It uses configurable threshold and compares the analyze-css result with it.

Results

{
  "generator": "analyze-css v0.10.2",
  "metrics": {
    "base64Length": 11332,
    "redundantBodySelectors": 0,
    "redundantChildNodesSelectors": 1,
    "colors": 106,
    "comments": 1,
    "commentsLength": 68,
    "complexSelectors": 37,
    "duplicatedSelectors": 7,
    "duplicatedProperties": 24,
    "emptyRules": 0,
    "expressions": 0,
    "oldIEFixes": 51,
    "imports": 0,
    "importants": 3,
    "mediaQueries": 0,
    "notMinified": 0,
    "multiClassesSelectors": 74,
    "parsingErrors": 0,
    "oldPropertyPrefixes": 79,
    "propertyResets": 0,
    "qualifiedSelectors": 28,
    "specificityIdAvg": 0.04,
    "specificityIdTotal": 25,
    "specificityClassAvg": 1.27,
    "specificityClassTotal": 904,
    "specificityTagAvg": 0.79,
    "specificityTagTotal": 562,
    "selectors": 712,
    "selectorLengthAvg": 1.5722460658082975,
    "selectorsByAttribute": 92,
    "selectorsByClass": 600,
    "selectorsById": 25,
    "selectorsByPseudo": 167,
    "selectorsByTag": 533,
    "length": 55173,
    "rules": 433,
    "declarations": 1288
  },
  "offenders": {
    "importants": [
      ".foo {margin: 0 !important}"
    ]
  }
}

Metrics

  • base64Length: total length of base64-encoded data in CSS source (will warn about base64-encoded data bigger than 4 kB)
  • redundantBodySelectors: number of redundant body selectors (e.g. body .foo, section body h2, but not body > h1)
  • redundantChildNodesSelectors: number of redundant child nodes selectors (e.g. ul li, table tr)
  • colors: number of unique colors used in CSS
  • comments: number of comments in CSS source
  • commentsLength: length of comments content in CSS source
  • complexSelectors: number of complex selectors (consisting of more than three expressions, e.g. header ul li .foo)
  • duplicatedSelectors: number of CSS selectors defined more than once in CSS source
  • duplicatedProperties: number of CSS property definitions duplicated within a selector
  • emptyRules: number of rules with no properties (e.g. .foo { })
  • expressions: number of rules with CSS expressions (e.g. expression( document.body.clientWidth > 600 ? "600px" : "auto" ))
  • oldIEFixes: number of fixes for old versions of Internet Explorer (e.g. * html .foo {} and .foo { *zoom: 1 }, read more)
  • imports number of @import rules
  • importants: number of properties with value forced by !important
  • mediaQueries: number of media queries (e.g. @media screen and (min-width: 1370px))
  • notMinified: set to 1 if the provided CSS is not minified
  • multiClassesSelectors: reports selectors with multiple classes (e.g. span.foo.bar)
  • parsingErrors: number of CSS parsing errors
  • oldPropertyPrefixes: number of properties with no longer needed vendor prefix, powered by data provided by autoprefixer (e.g. --moz-border-radius)
  • propertyResets: number of accidental property resets
  • qualifiedSelectors: number of qualified selectors (e.g. header#nav, .foo#bar, h1.title)
  • specificityIdAvg: average specificity for ID
  • specificityIdTotal: total specificity for ID
  • specificityClassAvg: average specificity for class, pseudo-class or attribute
  • specificityClassTotal: total specificity for class, pseudo-class or attribute
  • specificityTagAvg: average specificity for element
  • specificityTagTotal: total specificity for element
  • selectors: number of selectors (e.g. .foo, .bar { color: red } is counted as two selectors - .foo and .bar)
  • selectorLengthAvg: average length of selector (e.g. for .foo .bar, #test div > span { color: red } will be set as 2.5)
  • selectorsByAttribute: number of selectors by attribute (e.g. .foo[value=bar])
  • selectorsByClass: number of selectors by class
  • selectorsById: number of selectors by ID
  • selectorsByPseudo: number of pseudo-selectors (e,g. :hover)
  • selectorsByTag: number of selectors by tag name
  • length: length of CSS source (in bytes)
  • rules: number of rules (e.g. .foo, .bar { color: red } is counted as one rule)
  • declarations: number of declarations (e.g. .foo, .bar { color: red } is counted as one declaration - color: red)

Read more

Dev hints

Running tests and linting the code:

$ npm test && npm run-script lint

Turning on debug mode (i.e. verbose logging to stderr via debug module):

$ DEBUG=analyze-css* analyze-css ...

Stargazers over time

Stargazers over time

Comments
  • New metric: average selectors length

    New metric: average selectors length

    Hi @macbre!

    What about having a metric giving the average length of selectors?

    For example:

    div .foo {}
    div .bar {}
    div .foo .bar {}
    

    has an average complexity of 2.333

    By the way, is there a reason why analyze-css doesn't count attribute expressions in the complexity? For example .form_b2_legacy .row-fluid input[class*="span"] has 4 expressions but is not in the complexSelectors offenders.

    Gaël

    new metric 
    opened by gmetais 8
  • Report duplicated properties

    Report duplicated properties

    Report duplicated CSS properties.

    .foo {
      background:#474646;
      border:1px solid #6b6a6a;
      background:#4c4b4b;
      border:1px solid #6b6a6a;
      margin-bottom:10px;
    }
    
    new metric 
    opened by macbre 8
  • Install does not work

    Install does not work

    After doing sudo npm install --global analyze-css

    I get the following output in my log :

    0 info it worked if it ends with ok 1 verbose cli [ 'node', 1 verbose cli '/usr/local/bin/npm', 1 verbose cli 'install', 1 verbose cli '--global', 1 verbose cli 'analyze-css' ] 2 info using [email protected] 3 info using [email protected] 4 verbose cache add [ 'analyze-css', null ] 5 verbose cache add name=undefined spec="analyze-css" args=["analyze-css",null] 6 verbose parsed url { protocol: null, 6 verbose parsed url slashes: null, 6 verbose parsed url auth: null, 6 verbose parsed url host: null, 6 verbose parsed url port: null, 6 verbose parsed url hostname: null, 6 verbose parsed url hash: null, 6 verbose parsed url search: null, 6 verbose parsed url query: null, 6 verbose parsed url pathname: 'analyze-css', 6 verbose parsed url path: 'analyze-css', 6 verbose parsed url href: 'analyze-css' } 7 silly lockFile 29d1466f-analyze-css analyze-css 8 verbose lock analyze-css /Users/abotermans/.npm/29d1466f-analyze-css.lock 9 silly lockFile 29d1466f-analyze-css analyze-css 10 silly lockFile 29d1466f-analyze-css analyze-css 11 verbose addNamed [ 'analyze-css', '' ] 12 verbose addNamed [ null, '_' ] 13 silly lockFile ba4893c7-analyze-css analyze-css@ 14 verbose lock analyze-css@ /Users/abotermans/.npm/ba4893c7-analyze-css.lock 15 silly addNameRange { name: 'analyze-css', range: '', hasData: false } 16 verbose url raw analyze-css 17 verbose url resolving [ 'https://registry.npmjs.org/', './analyze-css' ] 18 verbose url resolved https://registry.npmjs.org/analyze-css 19 info trying registry request attempt 1 at 20:58:06 20 verbose etag "9S2S8771EYEVXJTX0193TQKUV" 21 http GET https://registry.npmjs.org/analyze-css 22 http 304 https://registry.npmjs.org/analyze-css 23 silly registry.get cb [ 304, 23 silly registry.get { date: 'Mon, 11 Aug 2014 18:58:06 GMT', 23 silly registry.get server: 'Apache', 23 silly registry.get via: '1.1 varnish', 23 silly registry.get 'last-modified': 'Mon, 11 Aug 2014 18:58:06 GMT', 23 silly registry.get 'cache-control': 'max-age=60', 23 silly registry.get etag: '"9S2S8771EYEVXJTX0193TQKUV"', 23 silly registry.get 'x-served-by': 'cache-fra1223-FRA', 23 silly registry.get 'x-cache': 'HIT', 23 silly registry.get 'x-cache-hits': '1', 23 silly registry.get 'x-timer': 'S1407783486.807473,VS0,VE176', 23 silly registry.get vary: 'Accept', 23 silly registry.get 'content-length': '0', 23 silly registry.get 'keep-alive': 'timeout=10, max=50', 23 silly registry.get connection: 'Keep-Alive' } ] 24 verbose etag analyze-css from cache 25 silly addNameRange number 2 { name: 'analyze-css', range: '', hasData: true } 26 silly addNameRange versions [ 'analyze-css', 26 silly addNameRange [ '0.1.0', '0.2.0', '0.3.0', '0.4.0', '0.4.1', '0.5.0' ] ] 27 verbose addNamed [ 'analyze-css', '0.5.0' ] 28 verbose addNamed [ '0.5.0', '0.5.0' ] 29 silly lockFile 3d425a4f-analyze-css-0-5-0 [email protected] 30 verbose lock [email protected] /Users/abotermans/.npm/3d425a4f-analyze-css-0-5-0.lock 31 silly lockFile 3d425a4f-analyze-css-0-5-0 [email protected] 32 silly lockFile 3d425a4f-analyze-css-0-5-0 [email protected] 33 silly lockFile ba4893c7-analyze-css analyze-css@ 34 silly lockFile ba4893c7-analyze-css analyze-css@ 35 silly resolved [ { name: 'analyze-css', 35 silly resolved version: '0.5.0', 35 silly resolved author: 35 silly resolved { name: 'Maciej Brencz', 35 silly resolved email: '[email protected]', 35 silly resolved url: 'https://github.com/macbre' }, 35 silly resolved description: 'CSS selectors complexity and performance analyzer', 35 silly resolved main: './lib/index.js', 35 silly resolved repository: { type: 'git', url: 'git://github.com/macbre/analyze-css.git' }, 35 silly resolved keywords: [ 'css', 'analyzer', 'complexity', 'webperf' ], 35 silly resolved license: 'BSD', 35 silly resolved engines: { node: '>=0.8' }, 35 silly resolved dependencies: 35 silly resolved { cli: '~0.6.2', 35 silly resolved 'css-parse': '~1.7.0', 35 silly resolved debug: '~1.0.4', 35 silly resolved 'fast-stats': '0.0.x', 35 silly resolved glob: '^4.0.5', 35 silly resolved 'node-sass': '^0.9.3', 35 silly resolved optimist: '0.6.x', 35 silly resolved slick: '~1.12.1', 35 silly resolved specificity: '~0.1.3' }, 35 silly resolved devDependencies: 35 silly resolved { autoprefixer: '~2.2.0', 35 silly resolved glob: '~4.0.5', 35 silly resolved istanbul: '^0.3.0', 35 silly resolved jshint: '~2.5.2', 35 silly resolved mocha: '~1.21.3' }, 35 silly resolved bin: { 'analyze-css': './bin/analyze-css.js' }, 35 silly resolved preferGlobal: true, 35 silly resolved scripts: 35 silly resolved { test: 'mocha -R spec', 35 silly resolved lint: 'jshint --verbose bin/ lib/ rules/ test/', 35 silly resolved coverage: 'istanbul cover mocha -- -R spec' }, 35 silly resolved jshintConfig: { node: true, strict: true, validthis: true }, 35 silly resolved readme: 'analyze-css\n===========\n\nNPM version\nBuild Status\nBitdeli Badge\n\nCSS selectors complexity and performance analyzer. analyze-css is built as a set of rules bound to events fired by CSS parser. Each rule can generate metrics and add "offenders" with more detailed information (see Usage section for an example).\n\n## Install\n\nanalyze-css comes as a "binary" for command-line and as CommonJS module. Run the following to install them globally:\n\n\nnpm install --global analyze-css\n\n\n## Usage\n\n### Command line tool\n\nYou can use analyze-css "binary" to analyze local CSS files or remote CSS assets:\n\n\nanalyze-css --file examples/elecena.css\nanalyze-css --url http://jigsaw.w3.org/css-validator/style/base.css\n\n\nYou can provide CSS via stdin as well (notice the dash: -):\n\n\necho ".foo {margin: 0 \\!important}" | analyze-css -\n\n\nThis will emit JSON formatted results on stdout. Use --pretty (or -p shortcut) option to make the output readable for human beings.\n\n### CommonJS module\n\njs\nvar analyzer = require(\'analyze-css\');\n\nnew analyzer(\'.foo {margin: 0 !important}\', function(err, results) {\n console.error(err);\n console.log(results); // example? see below\n});\n\n\n\n### grunt task\n\n> Created by @DeuxHuitHuit\n\n\nnpm i grunt-contrib-analyze-css\n\n\nIt uses configurable threshold and compares the analyze-css result with it.\n\n### Results\n\njson\n{\n "generator": "analyze-css v0.4.1",\n "metrics": {\n "base64Length": 9308,\n "redundantBodySelectors": 0,\n "comments": 1,\n "commentsLength": 68,\n "complexSelectors": 32,\n "complexSelectorsByAttribute": 3,\n "duplicatedSelectors": 7,\n "emptyRules": 0,\n "expressions": 0,\n "oldIEFixes": 51,\n "imports": 0,\n "importants": 3,\n "mediaQueries": 0,\n "oldPropertyPrefixes": 65,\n "qualifiedSelectors": 28,\n "specificityIdAvg": 0.05,\n "specificityIdTotal": 35,\n "specificityClassAvg": 1.25,\n "specificityClassTotal": 872,\n "specificityTagAvg": 0.78,\n "specificityTagTotal": 548,\n "selectorsByAttribute": 93,\n "selectorsByClass": 568,\n "selectorsById": 35,\n "selectorsByPseudo": 166,\n "selectorsByTag": 519,\n "universalSelectors": 4,\n "length": 51665,\n "rules": 422,\n "selectors": 699,\n "declarations": 1240\n },\n "offenders": {\n "importants": [\n ".foo {margin: 0 !important}"\n ]\n }\n}\n\n\n## Metrics\n\n base64Length: total length of base64-encoded data in CSS source (will warn about base64-encoded data bigger than 4 kB)\n* redundantBodySelectors: number of redundant body selectors (e.g. body .foo, section body h2, but not body > h1)\n* comments: number of comments in CSS source\n* commentsLength: length of comments content in CSS source\n* complexSelectors: number of complex selectors (consisting of more than three expressions, e.g. header ul li .foo)\n* complexSelectorsByAttribute: number of selectors with complex matching by attribute (e.g. [class$="foo"])\n* duplicatedSelectors: number of CSS selectors defined more than once in CSS source\n* emptyRules: number of rules with no properties (e.g. .foo { })\n* expressions: number of rules with CSS expressions (e.g. expression( document.body.clientWidth > 600 ? "600px" : "auto" ))\n* oldIEFixes: number of fixes for old versions of Internet Explorer (e.g. * html .foo {} and .foo { *zoom: 1 }, read more)\n* imports number of @import rules\n* importants: number of properties with value forced by !important\n* mediaQueries: number of media queries (e.g. @media screen and (min-width: 1370px))\n* oldPropertyPrefixes: number of properties with no longer needed vendor prefix, powered by data provided by autoprefixer (e.g. --moz-border-radius)\n* qualifiedSelectors: number of qualified selectors (e.g. header#nav, .foo#bar, h1.title)\n* specificityIdAvg: average specificity for ID\n* specificityIdTotal: total specificity for ID\n* specificityClassAvg: average specificity for class, pseudo-class or attribute\n* specificityClassTotal: total specificity for class, pseudo-class or attribute\n* specificityTagAvg: average specificity for element\n* specificityTagTotal: total specificity for element\n* selectorsByAttribute: number of selectors by attribute (e.g. .foo[value=bar])\n* selectorsByClass: number of selectors by class\n* selectorsById: number of selectors by ID\n* selectorsByPseudo: number of pseudo-selectors (e,g. :hover)\n* selectorsByTag: number of selectors by tag name\n* universalSelectors: number of selectors trying to match every element (e.g. .foo > *)\n* length: length of CSS source (in bytes)\n* rules: number of rules (e.g. .foo, .bar { color: red } is counted as one rule)\n* selectors: number of selectors (e.g. .foo, .bar { color: red } is counted as two selectors - .foo and .bar)\n* declarations: number of declarations (e.g. .foo, .bar { color: red } is counted as one declaration - color: red)\n\n## Read more\n\n* Writing Efficient CSS (by Mozilla)\n* Optimize browser rendering (by Google)\n* Profiling CSS for fun and profit. Optimization notes.\n* CSS specificity\n* CSS Selector Performance has changed! (For the better) (by Nicole Sullivan)\n* CSS Performance (by Paul Irish)\n* GitHub's CSS Performance (by Joh Rohan)\n\n## Dev hints\n\nRunning tests and linting the code:\n\n\nnpm test && npm run-script lint\n\n\nTurning on debug mode (i.e. verbose logging to stderr via debug module):\n\n\nDEBUG=analyze-css* analyze-css ...\n\n', 35 silly resolved readmeFilename: 'README.md', 35 silly resolved bugs: { url: 'https://github.com/macbre/analyze-css/issues' }, 35 silly resolved _id: '[email protected]', 35 silly resolved _from: 'analyze-css@' } ] 36 info install [email protected] into /usr/local/lib 37 info installOne [email protected] 38 info /usr/local/lib/node_modules/analyze-css unbuild 39 verbose tar unpack /Users/abotermans/.npm/analyze-css/0.5.0/package.tgz 40 silly lockFile 32bcc707-cal-lib-node-modules-analyze-css tar:///usr/local/lib/node_modules/analyze-css 41 verbose lock tar:///usr/local/lib/node_modules/analyze-css /Users/abotermans/.npm/32bcc707-cal-lib-node-modules-analyze-css.lock 42 silly lockFile 56b8b159-pm-analyze-css-0-5-0-package-tgz tar:///Users/abotermans/.npm/analyze-css/0.5.0/package.tgz 43 verbose lock tar:///Users/abotermans/.npm/analyze-css/0.5.0/package.tgz /Users/abotermans/.npm/56b8b159-pm-analyze-css-0-5-0-package-tgz.lock 44 silly gunzTarPerm modes [ '755', '644' ] 45 silly gunzTarPerm extractEntry package.json 46 silly gunzTarPerm extractEntry .npmignore 47 silly gunzTarPerm extractEntry README.md 48 silly gunzTarPerm extractEntry LICENSE 49 silly gunzTarPerm extractEntry bin/analyze-css.js 50 silly gunzTarPerm extractEntry .travis.yml 51 silly gunzTarPerm extractEntry examples/_reset.scss 52 silly gunzTarPerm extractEntry examples/base.scss 53 silly gunzTarPerm extractEntry examples/elecena.css 54 silly gunzTarPerm extractEntry examples/ti.mobile.css 55 silly gunzTarPerm extractEntry lib/collection.js 56 silly gunzTarPerm extractEntry lib/index.js 57 silly gunzTarPerm extractEntry lib/preprocessors.js 58 silly gunzTarPerm extractEntry lib/runner.js 59 silly gunzTarPerm extractEntry lib/preprocessors/sass.js 60 silly gunzTarPerm extractEntry test/errors.js 61 silly gunzTarPerm extractEntry test/rules.js 62 silly gunzTarPerm extractEntry test/sass.js 63 silly gunzTarPerm extractEntry test/rules/base64.js 64 silly gunzTarPerm extractEntry test/rules/emptyRules.js 65 silly gunzTarPerm extractEntry test/rules/expressions.js 66 silly gunzTarPerm extractEntry test/rules/ieFixes.js 67 silly gunzTarPerm extractEntry test/rules/import.js 68 silly gunzTarPerm extractEntry test/rules/duplicated.js 69 silly gunzTarPerm extractEntry test/rules/length.js 70 silly gunzTarPerm extractEntry test/rules/mediaQueries.js 71 silly gunzTarPerm extractEntry test/rules/multiClassesSelectors.js 72 silly gunzTarPerm extractEntry test/rules/prefixes.js 73 silly gunzTarPerm extractEntry test/rules/qualified.js 74 silly gunzTarPerm extractEntry test/rules/complex.js 75 silly gunzTarPerm extractEntry test/rules/specificity.js 76 silly gunzTarPerm extractEntry test/rules/comments.js 77 silly gunzTarPerm extractEntry test/rules/stats.js 78 silly gunzTarPerm extractEntry test/rules/bodySelectors.js 79 silly gunzTarPerm extractEntry test/rules/universal.js 80 silly gunzTarPerm extractEntry test/rules/important.js 81 silly gunzTarPerm extractEntry rules/base64.js 82 silly gunzTarPerm extractEntry rules/emptyRules.js 83 silly gunzTarPerm extractEntry rules/expressions.js 84 silly gunzTarPerm extractEntry rules/ieFixes.js 85 silly gunzTarPerm extractEntry rules/import.js 86 silly gunzTarPerm extractEntry rules/duplicated.js 87 silly gunzTarPerm extractEntry rules/length.js 88 silly gunzTarPerm extractEntry rules/mediaQueries.js 89 silly gunzTarPerm extractEntry rules/multiClassesSelectors.js 90 silly gunzTarPerm extractEntry rules/prefixes.js 91 silly gunzTarPerm extractEntry rules/stats.js 92 silly gunzTarPerm extractEntry rules/complex.js 93 silly gunzTarPerm extractEntry rules/qualified.js 94 silly gunzTarPerm extractEntry rules/comments.js 95 silly gunzTarPerm extractEntry rules/specificity.js 96 silly gunzTarPerm extractEntry rules/bodySelectors.js 97 silly gunzTarPerm extractEntry rules/universal.js 98 silly gunzTarPerm extractEntry rules/important.js 99 silly gunzTarPerm extractEntry rules/prefixes.json 100 silly gunzTarPerm extractEntry data/prefixes.js 101 silly lockFile 32bcc707-cal-lib-node-modules-analyze-css tar:///usr/local/lib/node_modules/analyze-css 102 silly lockFile 32bcc707-cal-lib-node-modules-analyze-css tar:///usr/local/lib/node_modules/analyze-css 103 silly lockFile 56b8b159-pm-analyze-css-0-5-0-package-tgz tar:///Users/abotermans/.npm/analyze-css/0.5.0/package.tgz 104 silly lockFile 56b8b159-pm-analyze-css-0-5-0-package-tgz tar:///Users/abotermans/.npm/analyze-css/0.5.0/package.tgz 105 info preinstall [email protected] 106 verbose readDependencies using package.json deps 107 verbose readDependencies using package.json deps 108 verbose cache add [ 'cli@~0.6.2', null ] 109 verbose cache add name=undefined spec="cli@~0.6.2" args=["cli@~0.6.2",null] 110 verbose parsed url { protocol: null, 110 verbose parsed url slashes: null, 110 verbose parsed url auth: null, 110 verbose parsed url host: null, 110 verbose parsed url port: null, 110 verbose parsed url hostname: null, 110 verbose parsed url hash: null, 110 verbose parsed url search: null, 110 verbose parsed url query: null, 110 verbose parsed url pathname: 'cli@~0.6.2', 110 verbose parsed url path: 'cli@~0.6.2', 110 verbose parsed url href: 'cli@~0.6.2' } 111 verbose cache add name="cli" spec="~0.6.2" args=["cli","~0.6.2"] 112 verbose parsed url { protocol: null, 112 verbose parsed url slashes: null, 112 verbose parsed url auth: null, 112 verbose parsed url host: null, 112 verbose parsed url port: null, 112 verbose parsed url hostname: null, 112 verbose parsed url hash: null, 112 verbose parsed url search: null, 112 verbose parsed url query: null, 112 verbose parsed url pathname: '~0.6.2', 112 verbose parsed url path: '~0.6.2', 112 verbose parsed url href: '~0.6.2' } 113 verbose addNamed [ 'cli', '~0.6.2' ] 114 verbose addNamed [ null, '>=0.6.2-0 <0.7.0-0' ] 115 silly lockFile 2262b754-cli-0-6-2 cli@~0.6.2 116 verbose lock cli@~0.6.2 /Users/abotermans/.npm/2262b754-cli-0-6-2.lock 117 verbose cache add [ 'css-parse@~1.7.0', null ] 118 verbose cache add name=undefined spec="css-parse@~1.7.0" args=["css-parse@~1.7.0",null] 119 verbose parsed url { protocol: null, 119 verbose parsed url slashes: null, 119 verbose parsed url auth: null, 119 verbose parsed url host: null, 119 verbose parsed url port: null, 119 verbose parsed url hostname: null, 119 verbose parsed url hash: null, 119 verbose parsed url search: null, 119 verbose parsed url query: null, 119 verbose parsed url pathname: 'css-parse@~1.7.0', 119 verbose parsed url path: 'css-parse@~1.7.0', 119 verbose parsed url href: 'css-parse@~1.7.0' } 120 verbose cache add name="css-parse" spec="~1.7.0" args=["css-parse","~1.7.0"] 121 verbose parsed url { protocol: null, 121 verbose parsed url slashes: null, 121 verbose parsed url auth: null, 121 verbose parsed url host: null, 121 verbose parsed url port: null, 121 verbose parsed url hostname: null, 121 verbose parsed url hash: null, 121 verbose parsed url search: null, 121 verbose parsed url query: null, 121 verbose parsed url pathname: '~1.7.0', 121 verbose parsed url path: '~1.7.0', 121 verbose parsed url href: '~1.7.0' } 122 verbose addNamed [ 'css-parse', '~1.7.0' ] 123 verbose addNamed [ null, '>=1.7.0-0 <1.8.0-0' ] 124 silly lockFile a652e804-css-parse-1-7-0 css-parse@~1.7.0 125 verbose lock css-parse@~1.7.0 /Users/abotermans/.npm/a652e804-css-parse-1-7-0.lock 126 verbose cache add [ 'debug@~1.0.4', null ] 127 verbose cache add name=undefined spec="debug@~1.0.4" args=["debug@~1.0.4",null] 128 verbose parsed url { protocol: null, 128 verbose parsed url slashes: null, 128 verbose parsed url auth: null, 128 verbose parsed url host: null, 128 verbose parsed url port: null, 128 verbose parsed url hostname: null, 128 verbose parsed url hash: null, 128 verbose parsed url search: null, 128 verbose parsed url query: null, 128 verbose parsed url pathname: 'debug@~1.0.4', 128 verbose parsed url path: 'debug@~1.0.4', 128 verbose parsed url href: 'debug@~1.0.4' } 129 verbose cache add name="debug" spec="~1.0.4" args=["debug","~1.0.4"] 130 verbose parsed url { protocol: null, 130 verbose parsed url slashes: null, 130 verbose parsed url auth: null, 130 verbose parsed url host: null, 130 verbose parsed url port: null, 130 verbose parsed url hostname: null, 130 verbose parsed url hash: null, 130 verbose parsed url search: null, 130 verbose parsed url query: null, 130 verbose parsed url pathname: '~1.0.4', 130 verbose parsed url path: '~1.0.4', 130 verbose parsed url href: '~1.0.4' } 131 verbose addNamed [ 'debug', '~1.0.4' ] 132 verbose addNamed [ null, '>=1.0.4-0 <1.1.0-0' ] 133 silly lockFile 0bd7c3a1-debug-1-0-4 debug@~1.0.4 134 verbose lock debug@~1.0.4 /Users/abotermans/.npm/0bd7c3a1-debug-1-0-4.lock 135 verbose cache add [ '[email protected]', null ] 136 verbose cache add name=undefined spec="[email protected]" args=["[email protected]",null] 137 verbose parsed url { protocol: null, 137 verbose parsed url slashes: null, 137 verbose parsed url auth: null, 137 verbose parsed url host: null, 137 verbose parsed url port: null, 137 verbose parsed url hostname: null, 137 verbose parsed url hash: null, 137 verbose parsed url search: null, 137 verbose parsed url query: null, 137 verbose parsed url pathname: '[email protected]', 137 verbose parsed url path: '[email protected]', 137 verbose parsed url href: '[email protected]' } 138 verbose cache add name="fast-stats" spec="0.0.x" args=["fast-stats","0.0.x"] 139 verbose parsed url { protocol: null, 139 verbose parsed url slashes: null, 139 verbose parsed url auth: null, 139 verbose parsed url host: null, 139 verbose parsed url port: null, 139 verbose parsed url hostname: null, 139 verbose parsed url hash: null, 139 verbose parsed url search: null, 139 verbose parsed url query: null, 139 verbose parsed url pathname: '0.0.x', 139 verbose parsed url path: '0.0.x', 139 verbose parsed url href: '0.0.x' } 140 verbose addNamed [ 'fast-stats', '0.0.x' ] 141 verbose addNamed [ null, '>=0.0.0-0 <0.1.0-0' ] 142 silly lockFile 18867ebf-fast-stats-0-0-x [email protected] 143 verbose lock [email protected] /Users/abotermans/.npm/18867ebf-fast-stats-0-0-x.lock 144 verbose cache add [ 'glob@^4.0.5', null ] 145 verbose cache add name=undefined spec="glob@^4.0.5" args=["glob@^4.0.5",null] 146 verbose parsed url { protocol: null, 146 verbose parsed url slashes: null, 146 verbose parsed url auth: null, 146 verbose parsed url host: null, 146 verbose parsed url port: null, 146 verbose parsed url hostname: null, 146 verbose parsed url hash: null, 146 verbose parsed url search: null, 146 verbose parsed url query: null, 146 verbose parsed url pathname: 'glob@^4.0.5', 146 verbose parsed url path: 'glob@^4.0.5', 146 verbose parsed url href: 'glob@^4.0.5' } 147 verbose cache add name="glob" spec="^4.0.5" args=["glob","^4.0.5"] 148 verbose parsed url { protocol: null, 148 verbose parsed url slashes: null, 148 verbose parsed url auth: null, 148 verbose parsed url host: null, 148 verbose parsed url port: null, 148 verbose parsed url hostname: null, 148 verbose parsed url hash: null, 148 verbose parsed url search: null, 148 verbose parsed url query: null, 148 verbose parsed url pathname: '^4.0.5', 148 verbose parsed url path: '^4.0.5', 148 verbose parsed url href: '^4.0.5' } 149 verbose addNamed [ 'glob', '^4.0.5' ] 150 verbose addNamed [ null, null ] 151 silly lockFile a8e851ff-glob-4-0-5 glob@^4.0.5 152 verbose lock glob@^4.0.5 /Users/abotermans/.npm/a8e851ff-glob-4-0-5.lock 153 silly addNameRange { name: 'cli', range: '>=0.6.2-0 <0.7.0-0', hasData: false } 154 verbose cache add [ 'node-sass@^0.9.3', null ] 155 verbose cache add name=undefined spec="node-sass@^0.9.3" args=["node-sass@^0.9.3",null] 156 verbose parsed url { protocol: null, 156 verbose parsed url slashes: null, 156 verbose parsed url auth: null, 156 verbose parsed url host: null, 156 verbose parsed url port: null, 156 verbose parsed url hostname: null, 156 verbose parsed url hash: null, 156 verbose parsed url search: null, 156 verbose parsed url query: null, 156 verbose parsed url pathname: 'node-sass@^0.9.3', 156 verbose parsed url path: 'node-sass@^0.9.3', 156 verbose parsed url href: 'node-sass@^0.9.3' } 157 verbose cache add name="node-sass" spec="^0.9.3" args=["node-sass","^0.9.3"] 158 verbose parsed url { protocol: null, 158 verbose parsed url slashes: null, 158 verbose parsed url auth: null, 158 verbose parsed url host: null, 158 verbose parsed url port: null, 158 verbose parsed url hostname: null, 158 verbose parsed url hash: null, 158 verbose parsed url search: null, 158 verbose parsed url query: null, 158 verbose parsed url pathname: '^0.9.3', 158 verbose parsed url path: '^0.9.3', 158 verbose parsed url href: '^0.9.3' } 159 verbose addNamed [ 'node-sass', '^0.9.3' ] 160 verbose addNamed [ null, null ] 161 silly lockFile 2d1d1d8c-node-sass-0-9-3 node-sass@^0.9.3 162 verbose lock node-sass@^0.9.3 /Users/abotermans/.npm/2d1d1d8c-node-sass-0-9-3.lock 163 verbose cache add [ '[email protected]', null ] 164 verbose cache add name=undefined spec="[email protected]" args=["[email protected]",null] 165 verbose parsed url { protocol: null, 165 verbose parsed url slashes: null, 165 verbose parsed url auth: null, 165 verbose parsed url host: null, 165 verbose parsed url port: null, 165 verbose parsed url hostname: null, 165 verbose parsed url hash: null, 165 verbose parsed url search: null, 165 verbose parsed url query: null, 165 verbose parsed url pathname: '[email protected]', 165 verbose parsed url path: '[email protected]', 165 verbose parsed url href: '[email protected]' } 166 verbose cache add name="optimist" spec="0.6.x" args=["optimist","0.6.x"] 167 verbose parsed url { protocol: null, 167 verbose parsed url slashes: null, 167 verbose parsed url auth: null, 167 verbose parsed url host: null, 167 verbose parsed url port: null, 167 verbose parsed url hostname: null, 167 verbose parsed url hash: null, 167 verbose parsed url search: null, 167 verbose parsed url query: null, 167 verbose parsed url pathname: '0.6.x', 167 verbose parsed url path: '0.6.x', 167 verbose parsed url href: '0.6.x' } 168 verbose addNamed [ 'optimist', '0.6.x' ] 169 verbose addNamed [ null, '>=0.6.0-0 <0.7.0-0' ] 170 silly lockFile 153c05cb-optimist-0-6-x [email protected] 171 verbose lock [email protected] /Users/abotermans/.npm/153c05cb-optimist-0-6-x.lock 172 silly addNameRange { name: 'css-parse', 172 silly addNameRange range: '>=1.7.0-0 <1.8.0-0', 172 silly addNameRange hasData: false } 173 silly addNameRange { name: 'debug', range: '>=1.0.4-0 <1.1.0-0', hasData: false } 174 silly addNameRange { name: 'fast-stats', 174 silly addNameRange range: '>=0.0.0-0 <0.1.0-0', 174 silly addNameRange hasData: false } 175 verbose cache add [ 'slick@~1.12.1', null ] 176 verbose cache add name=undefined spec="slick@~1.12.1" args=["slick@~1.12.1",null] 177 verbose parsed url { protocol: null, 177 verbose parsed url slashes: null, 177 verbose parsed url auth: null, 177 verbose parsed url host: null, 177 verbose parsed url port: null, 177 verbose parsed url hostname: null, 177 verbose parsed url hash: null, 177 verbose parsed url search: null, 177 verbose parsed url query: null, 177 verbose parsed url pathname: 'slick@~1.12.1', 177 verbose parsed url path: 'slick@~1.12.1', 177 verbose parsed url href: 'slick@~1.12.1' } 178 verbose cache add name="slick" spec="~1.12.1" args=["slick","~1.12.1"] 179 verbose parsed url { protocol: null, 179 verbose parsed url slashes: null, 179 verbose parsed url auth: null, 179 verbose parsed url host: null, 179 verbose parsed url port: null, 179 verbose parsed url hostname: null, 179 verbose parsed url hash: null, 179 verbose parsed url search: null, 179 verbose parsed url query: null, 179 verbose parsed url pathname: '~1.12.1', 179 verbose parsed url path: '~1.12.1', 179 verbose parsed url href: '~1.12.1' } 180 verbose addNamed [ 'slick', '~1.12.1' ] 181 verbose addNamed [ null, '>=1.12.1-0 <1.13.0-0' ] 182 silly lockFile 948a04a3-slick-1-12-1 slick@~1.12.1 183 verbose lock slick@~1.12.1 /Users/abotermans/.npm/948a04a3-slick-1-12-1.lock 184 verbose cache add [ 'specificity@~0.1.3', null ] 185 verbose cache add name=undefined spec="specificity@~0.1.3" args=["specificity@~0.1.3",null] 186 verbose parsed url { protocol: null, 186 verbose parsed url slashes: null, 186 verbose parsed url auth: null, 186 verbose parsed url host: null, 186 verbose parsed url port: null, 186 verbose parsed url hostname: null, 186 verbose parsed url hash: null, 186 verbose parsed url search: null, 186 verbose parsed url query: null, 186 verbose parsed url pathname: 'specificity@~0.1.3', 186 verbose parsed url path: 'specificity@~0.1.3', 186 verbose parsed url href: 'specificity@~0.1.3' } 187 verbose cache add name="specificity" spec="~0.1.3" args=["specificity","~0.1.3"] 188 verbose parsed url { protocol: null, 188 verbose parsed url slashes: null, 188 verbose parsed url auth: null, 188 verbose parsed url host: null, 188 verbose parsed url port: null, 188 verbose parsed url hostname: null, 188 verbose parsed url hash: null, 188 verbose parsed url search: null, 188 verbose parsed url query: null, 188 verbose parsed url pathname: '~0.1.3', 188 verbose parsed url path: '~0.1.3', 188 verbose parsed url href: '~0.1.3' } 189 verbose addNamed [ 'specificity', '~0.1.3' ] 190 verbose addNamed [ null, '>=0.1.3-0 <0.2.0-0' ] 191 silly lockFile 8e55d64e-specificity-0-1-3 specificity@~0.1.3 192 verbose lock specificity@~0.1.3 /Users/abotermans/.npm/8e55d64e-specificity-0-1-3.lock 193 info addNameTag [ 'glob', '^4.0.5' ] 194 info addNameTag [ 'node-sass', '^0.9.3' ] 195 silly addNameRange { name: 'optimist', range: '>=0.6.0-0 <0.7.0-0', hasData: false } 196 silly addNameRange { name: 'slick', range: '>=1.12.1-0 <1.13.0-0', hasData: false } 197 silly addNameRange { name: 'specificity', 197 silly addNameRange range: '>=0.1.3-0 <0.2.0-0', 197 silly addNameRange hasData: false } 198 verbose url raw cli 199 verbose url resolving [ 'https://registry.npmjs.org/', './cli' ] 200 verbose url resolved https://registry.npmjs.org/cli 201 info trying registry request attempt 1 at 20:58:07 202 verbose etag "1BI7VML5ZAH55O20NYCVGZ1OZ" 203 http GET https://registry.npmjs.org/cli 204 verbose url raw css-parse 205 verbose url resolving [ 'https://registry.npmjs.org/', './css-parse' ] 206 verbose url resolved https://registry.npmjs.org/css-parse 207 info trying registry request attempt 1 at 20:58:07 208 verbose etag "8LKM72WHL2NB559F4JE0Q8M6C" 209 http GET https://registry.npmjs.org/css-parse 210 verbose url raw debug 211 verbose url resolving [ 'https://registry.npmjs.org/', './debug' ] 212 verbose url resolved https://registry.npmjs.org/debug 213 info trying registry request attempt 1 at 20:58:07 214 verbose etag "20GEU8UKR4073SIYWSJOANGTH" 215 http GET https://registry.npmjs.org/debug 216 verbose url raw fast-stats 217 verbose url resolving [ 'https://registry.npmjs.org/', './fast-stats' ] 218 verbose url resolved https://registry.npmjs.org/fast-stats 219 info trying registry request attempt 1 at 20:58:07 220 verbose etag "1BYWQPNOPX20XEJZAMXU9578J" 221 http GET https://registry.npmjs.org/fast-stats 222 verbose url raw glob 223 verbose url resolving [ 'https://registry.npmjs.org/', './glob' ] 224 verbose url resolved https://registry.npmjs.org/glob 225 info trying registry request attempt 1 at 20:58:07 226 verbose etag "E0H7WTUVWGDLBAMR8L78YRHXG" 227 http GET https://registry.npmjs.org/glob 228 verbose url raw node-sass 229 verbose url resolving [ 'https://registry.npmjs.org/', './node-sass' ] 230 verbose url resolved https://registry.npmjs.org/node-sass 231 info trying registry request attempt 1 at 20:58:07 232 verbose etag "3U12TJR5Z4B72IKOT1YPD8DON" 233 http GET https://registry.npmjs.org/node-sass 234 verbose url raw optimist 235 verbose url resolving [ 'https://registry.npmjs.org/', './optimist' ] 236 verbose url resolved https://registry.npmjs.org/optimist 237 info trying registry request attempt 1 at 20:58:07 238 verbose etag "2PCLK7LSR31LE5IWKN2IJPRGB" 239 http GET https://registry.npmjs.org/optimist 240 verbose url raw slick 241 verbose url resolving [ 'https://registry.npmjs.org/', './slick' ] 242 verbose url resolved https://registry.npmjs.org/slick 243 info trying registry request attempt 1 at 20:58:07 244 verbose etag "3PZTJUCWBR0G9R7PFBQBF73R3" 245 http GET https://registry.npmjs.org/slick 246 verbose url raw specificity 247 verbose url resolving [ 'https://registry.npmjs.org/', './specificity' ] 248 verbose url resolved https://registry.npmjs.org/specificity 249 info trying registry request attempt 1 at 20:58:07 250 verbose etag "1P67BUTL3Z2UUR31SJHJU7OIU" 251 http GET https://registry.npmjs.org/specificity 252 http 304 https://registry.npmjs.org/cli 253 silly registry.get cb [ 304, 253 silly registry.get { date: 'Mon, 11 Aug 2014 18:58:07 GMT', 253 silly registry.get server: 'Apache', 253 silly registry.get via: '1.1 varnish', 253 silly registry.get 'last-modified': 'Mon, 11 Aug 2014 18:58:07 GMT', 253 silly registry.get 'cache-control': 'max-age=60', 253 silly registry.get etag: '"1BI7VML5ZAH55O20NYCVGZ1OZ"', 253 silly registry.get 'x-served-by': 'cache-fra1232-FRA', 253 silly registry.get 'x-cache': 'HIT', 253 silly registry.get 'x-cache-hits': '1', 253 silly registry.get 'x-timer': 'S1407783487.230289,VS0,VE0', 253 silly registry.get vary: 'Accept', 253 silly registry.get 'content-length': '0', 253 silly registry.get 'keep-alive': 'timeout=10, max=50', 253 silly registry.get connection: 'Keep-Alive' } ] 254 verbose etag cli from cache 255 silly addNameRange number 2 { name: 'cli', range: '>=0.6.2-0 <0.7.0-0', hasData: true } 256 silly addNameRange versions [ 'cli', 256 silly addNameRange [ '0.1.0', 256 silly addNameRange '0.1.1', 256 silly addNameRange '0.1.3', 256 silly addNameRange '0.1.4', 256 silly addNameRange '0.1.5', 256 silly addNameRange '0.1.6', 256 silly addNameRange '0.1.7', 256 silly addNameRange '0.1.8', 256 silly addNameRange '0.1.9', 256 silly addNameRange '0.2.0', 256 silly addNameRange '0.2.1-1', 256 silly addNameRange '0.2.2-1', 256 silly addNameRange '0.2.3-1', 256 silly addNameRange '0.2.3-2', 256 silly addNameRange '0.2.3-3', 256 silly addNameRange '0.2.3-4', 256 silly addNameRange '0.2.3-5', 256 silly addNameRange '0.2.4-1', 256 silly addNameRange '0.2.4-2', 256 silly addNameRange '0.2.5', 256 silly addNameRange '0.2.6', 256 silly addNameRange '0.2.7', 256 silly addNameRange '0.2.8', 256 silly addNameRange '0.3.0', 256 silly addNameRange '0.3.1', 256 silly addNameRange '0.3.2', 256 silly addNameRange '0.3.3', 256 silly addNameRange '0.3.4', 256 silly addNameRange '0.3.5', 256 silly addNameRange '0.3.6', 256 silly addNameRange '0.3.7', 256 silly addNameRange '0.3.8', 256 silly addNameRange '0.3.9', 256 silly addNameRange '0.4.0', 256 silly addNameRange '0.4.1', 256 silly addNameRange '0.4.2', 256 silly addNameRange '0.4.3', 256 silly addNameRange '0.4.4', 256 silly addNameRange '0.4.4-1', 256 silly addNameRange '0.4.4-2', 256 silly addNameRange '0.4.5', 256 silly addNameRange '0.5.0', 256 silly addNameRange '0.6.0', 256 silly addNameRange '0.6.2', 256 silly addNameRange '0.6.3' ] ] 257 verbose addNamed [ 'cli', '0.6.3' ] 258 verbose addNamed [ '0.6.3', '0.6.3' ] 259 silly lockFile 5858ae5a-cli-0-6-3 [email protected] 260 verbose lock [email protected] /Users/abotermans/.npm/5858ae5a-cli-0-6-3.lock 261 silly lockFile 5858ae5a-cli-0-6-3 [email protected] 262 silly lockFile 5858ae5a-cli-0-6-3 [email protected] 263 silly lockFile 2262b754-cli-0-6-2 cli@~0.6.2 264 silly lockFile 2262b754-cli-0-6-2 cli@~0.6.2 265 http 304 https://registry.npmjs.org/node-sass 266 silly registry.get cb [ 304, 266 silly registry.get { date: 'Mon, 11 Aug 2014 18:58:07 GMT', 266 silly registry.get server: 'Apache', 266 silly registry.get via: '1.1 varnish', 266 silly registry.get 'last-modified': 'Mon, 11 Aug 2014 18:58:07 GMT', 266 silly registry.get 'cache-control': 'max-age=60', 266 silly registry.get etag: '"3U12TJR5Z4B72IKOT1YPD8DON"', 266 silly registry.get 'x-served-by': 'cache-fra1232-FRA', 266 silly registry.get 'x-cache': 'HIT', 266 silly registry.get 'x-cache-hits': '1', 266 silly registry.get 'x-timer': 'S1407783487.282869,VS0,VE0', 266 silly registry.get vary: 'Accept', 266 silly registry.get 'content-length': '0', 266 silly registry.get 'keep-alive': 'timeout=10, max=49', 266 silly registry.get connection: 'Keep-Alive' } ] 267 verbose etag node-sass from cache 268 http 304 https://registry.npmjs.org/glob 269 silly registry.get cb [ 304, 269 silly registry.get { date: 'Mon, 11 Aug 2014 18:58:07 GMT', 269 silly registry.get server: 'Apache', 269 silly registry.get via: '1.1 varnish', 269 silly registry.get 'last-modified': 'Mon, 11 Aug 2014 18:58:02 GMT', 269 silly registry.get 'cache-control': 'max-age=60', 269 silly registry.get etag: '"E0H7WTUVWGDLBAMR8L78YRHXG"', 269 silly registry.get 'x-served-by': 'cache-fra1230-FRA', 269 silly registry.get 'x-cache': 'HIT', 269 silly registry.get 'x-cache-hits': '2', 269 silly registry.get 'x-timer': 'S1407783487.283851,VS0,VE0', 269 silly registry.get vary: 'Accept', 269 silly registry.get 'content-length': '0', 269 silly registry.get 'keep-alive': 'timeout=10, max=50', 269 silly registry.get connection: 'Keep-Alive' } ] 270 verbose etag glob from cache 271 silly lockFile 2d1d1d8c-node-sass-0-9-3 node-sass@^0.9.3 272 silly lockFile 2d1d1d8c-node-sass-0-9-3 node-sass@^0.9.3 273 silly lockFile a8e851ff-glob-4-0-5 glob@^4.0.5 274 silly lockFile a8e851ff-glob-4-0-5 glob@^4.0.5 275 verbose about to build /usr/local/lib/node_modules/analyze-css 276 info /usr/local/lib/node_modules/analyze-css unbuild 277 info preuninstall [email protected] 278 info uninstall [email protected] 279 verbose true,/usr/local/lib/node_modules,/usr/local/lib/node_modules unbuild [email protected] 280 verbose /usr/local/bin,[object Object] binRoot 281 info postuninstall [email protected] 282 error Error: No compatible version found: node-sass@'^0.9.3' 282 error Valid install targets: 282 error ["0.2.0","0.2.1","0.2.2","0.2.3","0.2.4","0.2.5","0.2.6","0.3.0","0.4.0","0.4.1","0.4.2","0.4.3","0.4.4","0.5.0","0.5.1","0.5.2","0.5.3","0.5.4","0.6.0","0.6.1","0.6.2","0.6.3","0.6.4","0.6.5","0.6.6","0.6.7","0.7.0-alpha","0.7.0","0.8.0","0.8.1","0.8.2","0.8.3","0.8.4","0.8.5","0.8.6","0.9.0","0.9.1","0.9.2","0.9.3"] 282 error at installTargetsError (/usr/local/lib/node_modules/npm/lib/cache.js:719:10) 282 error at /usr/local/lib/node_modules/npm/lib/cache.js:638:10 282 error at saved (/usr/local/lib/node_modules/npm/node_modules/npm-registry-client/lib/get.js:142:7) 282 error at /usr/local/lib/node_modules/npm/node_modules/graceful-fs/polyfills.js:133:7 282 error at Object.oncomplete (fs.js:107:15) 283 error If you need help, you may report this log at: 283 error http://github.com/isaacs/npm/issues 283 error or email it to: 283 error [email protected] 284 error System Darwin 13.3.0 285 error command "node" "/usr/local/bin/npm" "install" "--global" "analyze-css" 286 error cwd /Users/abotermans 287 error node -v v0.10.15 288 error npm -v 1.3.5 289 verbose exit [ 1, true ]

    bug 
    opened by a-botermans 6
  • build(deps): bump css-what from 5.1.0 to 6.0.1

    build(deps): bump css-what from 5.1.0 to 6.0.1

    Bumps css-what from 5.1.0 to 6.0.1.

    Release notes

    Sourced from css-what's releases.

    v6.0.1

    • Fix parsing column combinators after tag names 503570e

    https://github.com/fb55/css-what/compare/v6.0.0...v6.0.1

    v6.0.0

    Breaking Changes

    • Added ES6 module export (by @​spocke, fb55/css-what#680)
      • CommonJS is still provided for earlier NodeJS versions, but this change might cause issues with your build system. If they aren't trivially resolved, please open an issue!
    • Removed all options 5cad07b
      • BREAKING: Added a new value for ignoreCase: 'quirks' should ignore the case only in quirks mode.
      • BREAKING: Tags and attributes aren't lowercased anymore
    • Made selector types & actions enums 65121fe
    • Set empty namespace to null in attributes de367ca
    • Simplify stringify output 8a29466 b3e5e59

    Features

    • Support parsing column combinators 8030f67

    Fixes

    • Strip leading whitespace encapsulated in comments a812a1c
      • This used to be a way to sneak in descendant operators in front of selectors.

    Refactors

    • Switched parsing to numbers 65121fe
    • Restructured the parser to a big switch statement 7b6cc76

    Other

    • Adopted CSS Selector parsing tests from WPT 1881bba
    • Updated README to reflect changes b165a8d

    New Contributors

    Full Changelog: https://github.com/fb55/css-what/compare/v5.1.0...v6.0.0

    Commits
    • 035ed70 6.0.1
    • 503570e fix(parse): Fix parsing column combinators after tag names
    • c6bdb4c build(deps-dev): bump @​types/node from 17.0.4 to 17.0.5 (#688)
    • b528a20 6.0.0
    • b165a8d docs: Update README to reflect changes
    • 1881bba test: Adopt CSS Selector parsing tests from WPT
    • 8a29466 refactor(stringify): Simplify selectors
    • b3e5e59 refactor(stringify): Only escape what needs escaping
    • de367ca refactor: Set empty namespace to null in attributes
    • 5cad07b refactor: Remove all options
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies javascript 
    opened by dependabot[bot] 5
  • Fix CSS parsing freeze

    Fix CSS parsing freeze

    Resolves #233

    Use https://github.com/fb55/css-what

      analyze-css:parseRules selector: .someclass:not([ng-show="gcdmShowSystemNotAvailableMessage()"]) +1ms
      analyze-css:parseRules parsed selector: [[{"type":"attribute","name":"class","action":"element","value":"someclass","namespace":null,"ignoreCase":false},{"type":"pseudo","name":"not","data":[[{"type":"attribute","name":"ng-show","action":"equals","value":"gcdmShowSystemNotAvailableMessage()","namespace":null,"ignoreCase":false}]]}]] +1ms
    

    How to reproduce

    echo '.someclass:not([ng-show="gcdmShowSystemNotAvailableMessage()"]){display:none}' | DEBUG=* ./bin/analyze-css.js -
    

    Rules to refactor

    • [x] bodySelectors
    • [x] childSelectors
    • [x] multiClassesSelectors
    • [x] qualified
    • [x] stats
    enhancement internals 
    opened by macbre 5
  • Reparse file in silent mode after a CSS parsing error

    Reparse file in silent mode after a CSS parsing error

    Hi!

    I've seen that the CSS parser used by analyze-css has a 'silent' option: https://github.com/reworkcss/css#cssparsecode-options

    Here's my idea: analyze-css could parse the CSS file a first time without this option, to detect any parsing error. Then, if there is one, restart parsing in silent mode so the rest of the file can be analyzed despite the error.

    enhancement 
    opened by gmetais 5
  • Falsely redundant .foo .bar"">

    Falsely redundant "body > .foo .bar"

    Hey there, I noticed that selectors like "body > .foo .bar" return to be a redundantBodySelector, even though the body selector is combined with a child selector. Is this wanted behaviour? Thanks, Matt

    bug 
    opened by matthias-vogt 4
  • @font-face interpreted as a duplicated selector

    @font-face interpreted as a duplicated selector

    Hello,

    For exemple on this stylesheet: http://www.laredoute.fr/css/1/fr-FR/bundles/master?v=5f2VA4kNn1isin_Q20pvCYNBAA2CHJajWpBg8zy4l4Q1

    There is @font-face (8 times) in the duplicated selectors offenders. It might be a little bug!

    bug 
    opened by gmetais 4
  • Redundant selectors for child nodes

    Redundant selectors for child nodes

    Hi @macbre,

    The redundant body selector could be extended to some other rules. li elements are always inside ul elements, but i often see this kind of rules in stylesheets: .content ul li

    Same thing for select option, table tr, tr td and probably some other cases i'm forgetting.

    enhancement 
    opened by gmetais 4
  • Grunt plugin available

    Grunt plugin available

    I just wanted to let you know that I've made an analyze-css grunt task.

    https://www.npmjs.org/package/grunt-contrib-analyze-css

    npm i grunt-contrib-analyze-css

    It uses configurable threshold and compare the analyze-css result with to it.

    opened by nitriques 4
  • Add 'ignore-ssl-errors' flag.

    Add 'ignore-ssl-errors' flag.

    Hi — love analyze-css and really want to be able to use it with phantomas. :)

    I struck a hurdle though as the server I want to run tests against has in invalid self-signed SSL cert.

    Currently analyze-css will explode with Error: HTTP request failed: Error: SELF_SIGNED_CERT_IN_CHAIN trying to fetch content from this server.

    This PR adds an --ignore-ssl-errors bool flag that will allow for getting content from servers that have busted SSL certs. It makes a few changes to option passing in the main executable, and changes the request method in the runner to take an object instead of just a URL as a string.

    Phantomas integration

    I would love to add a follow-on PR for phantomas that will pass down along the --ignore-ssl-errors option from phantomas into analyze-css, however I’m not sure if this is the right thing to do (seems to make most sense?), and also not sure how you want to handle the version locking between the two (assuming this PR is accepted and a release made).

    Cheers! :)

    opened by plasticine 4
  • build(deps): bump onecolor from 3.1.0 to 4.0.0

    build(deps): bump onecolor from 3.1.0 to 4.0.0

    Bumps onecolor from 3.1.0 to 4.0.0.

    Commits
    • dbfe12f 4.0.0
    • 4a3bafa Fix files spec in package.json to match the new source map file names
    • 99db0b0 Lock down prettier to ~2.8.0
    • 568ac1e Run prettier
    • 7ed619b Merge pull request #36 from One-com/feature/rrggbbaa
    • 1e7a377 Change the hexa method to return #rrggbbaa instead of #aarrggbb
    • b68d1d3 Merge branch 'master' into feature/rrggbbaa
    • 50fb015 Merge pull request #48 from alexjeffburke/readme-quoting
    • b8aab01 Fix output quoting.
    • d76a0ca Merge pull request #47 from alexjeffburke/validate-documentation
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies javascript 
    opened by dependabot[bot] 0
  • Report annotations when being run in GitHub Actions

    Report annotations when being run in GitHub Actions

    • https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-error-message
    • https://github.com/ansible/ansible-lint/blob/9aee394e02dc856c6218c0e2ab7dfd55c8cd85e4/lib/ansiblelint/formatters/init.py#L102-L139

    Example

    ::warning file=roles/gcloud-env/tasks/main.yml,line=3::[E208] File permissions not mentioned
    

    Inspired by https://github.com/ansible/ansible-lint#cicd

    enhancement 
    opened by macbre 0
Releases(v2.1.76)
Owner
Maciej Brencz
I enjoy investigating how software works under the hood (this also includes situations when software does not work and has to be fixed)
Maciej Brencz
PublisherConnector is a class object that allows you to interact with the CHILI Publisher editorObject via postMessage without the complexity of postMessage.

PublisherConnector is a class object that allows you to interact with the CHILI Editor editorObject via postMessage without the complexity of postMessage.

CHILI publish 8 Nov 24, 2022
A lexical analyzer based on DFA that made by JS and supports multi-language extension

lexer 一个基于DFA法的支持多语言扩展的JS版开源词法分析器,快速了解与体验请查看线上网站 It is a lexical analyzer based on DFA that made by JS and supports multi-language extension. For quic

null 273 Dec 21, 2022
A plugin for Master Styles to group up styles and add selectors.

master-styles-group A plugin for Master Styles to group up styles and add selectors. THIS PROJECT IS IN BETA This project may contain bugs and have no

SerKo 5 Sep 27, 2022
A Laravel Blade parser, compiler, and static analyzer written in TypeScript.

Blade Parser This library provides a Laravel Blade parser written in TypeScript. In addition to being able to parse Blade template files, this library

Stillat 7 Jan 4, 2023
A GitHub action to run Dart analyzer with annotation support.

⚒️ GitHub Action for Dart Analyzer A GitHub action to run Dart analyzer with annotation support. License Usage name: "analyze" on: # rebuild any PRs a

Invertase 149 Dec 28, 2022
Chain Anime.js calls on jQuery selectors.

jQuery.animejs This is a small (< 1kb) helper plugin for the great Anime.js. Features Chain Anime.js calls in a more readable way. Supports latest Ani

null 2 Jun 8, 2022
High performance and SEO friendly lazy loader for images (responsive and normal), iframes and more, that detects any visibility changes triggered through user interaction, CSS or JavaScript without configuration.

lazysizes lazysizes is a fast (jank-free), SEO-friendly and self-initializing lazyloader for images (including responsive images picture/srcset), ifra

Alexander Farkas 16.6k Jan 1, 2023
AppRun is a JavaScript library for developing high-performance and reliable web applications using the elm inspired architecture, events and components.

AppRun AppRun is a JavaScript library for building reliable, high-performance web applications using the Elm-inspired architecture, events, and compon

Yiyi Sun 1.1k Dec 20, 2022
Project Cider. A new look into listening and enjoying Apple Music in style and performance. 🚀

Links Wiki Request Feature Report Bug View The Releases Install Sources Compiling and Configuration For more information surrounding configuration, co

Cider Collective 5.8k Jan 5, 2023
Seamless and lightweight parallax scrolling library implemented in pure JavaScript utilizing Hardware acceleration for extra performance.

parallax-vanilla.js Seamless and lightweight parallax scrolling library implemented in pure JavaScript utilizing Hardware acceleration for extra perfo

Erik Engervall 91 Dec 16, 2022
An animation library, built on the Web Animations API for the smallest filesize and the fastest performance

motion-signals A wrapper over Motion One, An animation library, built on the Web Animations API for the smallest filesize and the fastest performance.

Tanvesh Sarve 48 Dec 27, 2022
Lexical is an extensible JavaScript web text-editor framework with an emphasis on reliability, accessibility and performance

Lexical is an extensible JavaScript web text-editor framework with an emphasis on reliability, accessibility and performance. Lexical aims to provide a best-in-class developer experience, so you can easily prototype and build features with confidence.

Meta 12.7k Dec 30, 2022
🔑 Keagate is an open-source, high-performance alternative to popular cryptocurrency payment gateways such as Coinbase Commerce, CoinGate, BitPay, NOWPayments, CoinRemitter, CoinsPaid and more.

⛩️ Keagate – A High-Performance Cryptocurrency Payment Gateway ?? This project is actively in development ?? Table of Contents About the Project Purpo

null 76 Jan 3, 2023
An ultra-high performance stream reader for browser and Node.js

QuickReader An ultra-high performance stream reader for browser and Node.js, easy-to-use, zero dependency. Install npm i quickreader Demo import {Quic

EtherDream 156 Nov 28, 2022
A work-in-progress HTML sanitizer that strives for: performance like window.Sanitizer, readiness like DOMPurify, and ability to run in a WebWorker like neither of those.

Amuchina A work-in-progress HTML sanitizer that strives for: performance like window.Sanitizer, readiness like DOMPurify, and ability to run in a WebW

Fabio Spampinato 9 Sep 17, 2022
A lightweight @discord client mod focused on simplicity and performance.

Replugged Maintained fork of powercord - a lightweight @discord client mod focused on simplicity and performance. Installation/Uninstallation See the

Replugged 401 Jan 9, 2023
A jquery plugin that allows an html page to be converted and/or downloaded into a Microsoft Word Document with an emphasis on performance

googoose A jquery plugin that allows an html page to be converted and/or downloaded into a Microsoft Word Document with an emphasis on performance Abo

Aaron Adel 32 Jan 3, 2023
Webpack dev tools to make performance analysis, error investigation and loader development more convenient

build-tool-inspector Introduction Webpack dev tools to make performance analysis, error investigation and loader development more convenient. Provide

Modern JS 25 Nov 17, 2022
👑 A tiny yet powerful tool for high-performance color manipulations and conversions

Colord is a tiny yet powerful tool for high-performance color manipulations and conversions. Features ?? Small: Just 1.7 KB gzipped (3x+ lighter than

Vlad Shilov 1.2k Jan 3, 2023