├── .babelrc ├── .editorconfig ├── .eslintignore ├── .eslintrc ├── .gitignore ├── .jscsrc ├── .nyc_output ├── 38eab3f97b0db93dddcb5758db8e2f08.json ├── 3edf4eb24a4175f98dddd8b265a28a85.json └── 46c29962757ad7ea6e79926ffa3c8395.json ├── .stylelintrc ├── README.md ├── data.json ├── index.js ├── package.json ├── public └── 1.0.0 │ ├── index.html │ ├── index.min.css │ └── index.min.js ├── spec ├── .eslintrc ├── helpers.js ├── index.html ├── index.spec.js ├── mocha.css ├── mocha.js └── utils.spec.js ├── src ├── index.js ├── index.mustache.js ├── index.pug ├── index.scss └── utils.js ├── vendor ├── react-15.3.2.js ├── react-15.3.2.min.js ├── react-15.4.0.js ├── react-15.4.0.min.js ├── react-15.4.1.js ├── react-15.4.1.min.js ├── react-15.4.2.js ├── react-15.4.2.min.js ├── react-15.5.0.js ├── react-15.5.0.min.js ├── react-15.5.1.js ├── react-15.5.1.min.js ├── react-15.5.2.js ├── react-15.5.2.min.js ├── react-15.5.3.js ├── react-15.5.3.min.js ├── react-15.5.4.js ├── react-15.5.4.min.js ├── react-15.6.0.js ├── react-15.6.0.min.js ├── react-15.6.1.js ├── react-15.6.1.min.js ├── react-15.6.2.js ├── react-15.6.2.min.js ├── react-16.0.0.js ├── react-16.0.0.min.js ├── react-16.1.0.js ├── react-16.1.0.min.js ├── react-16.1.1.js ├── react-16.1.1.min.js ├── react-16.2.0.js ├── react-16.2.0.min.js ├── react-dom-15.3.2.js ├── react-dom-15.3.2.min.js ├── react-dom-15.4.0.js ├── react-dom-15.4.0.min.js ├── react-dom-15.4.1.js ├── react-dom-15.4.1.min.js ├── react-dom-15.4.2.js ├── react-dom-15.4.2.min.js ├── react-dom-15.5.0.js ├── react-dom-15.5.0.min.js ├── react-dom-15.5.1.js ├── react-dom-15.5.1.min.js ├── react-dom-15.5.2.js ├── react-dom-15.5.2.min.js ├── react-dom-15.5.3.js ├── react-dom-15.5.3.min.js ├── react-dom-15.5.4.js ├── react-dom-15.5.4.min.js ├── react-dom-15.6.0.js ├── react-dom-15.6.0.min.js ├── react-dom-15.6.1.js ├── react-dom-15.6.1.min.js ├── react-dom-15.6.2.js ├── react-dom-15.6.2.min.js ├── react-dom-16.0.0.js ├── react-dom-16.0.0.min.js ├── react-dom-16.1.0.js ├── react-dom-16.1.0.min.js ├── react-dom-16.1.1.js ├── react-dom-16.1.1.min.js ├── react-dom-16.2.0.js └── react-dom-16.2.0.min.js └── yarn.lock /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ "es2015", "stage-0" ], 3 | "sourceMaps": "inline", 4 | "compact" : true 5 | } 6 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # This file is for unifying the coding style for different editors and IDEs 2 | # editorconfig.org 3 | 4 | root = true 5 | 6 | [*] 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = false 10 | insert_final_newline = true 11 | 12 | # Tabs unless otherwise specified 13 | [**.{js,jsx,json,html,css,less}] 14 | indent_style = tab 15 | indent_size = 4 16 | 17 | [package.json] 18 | indent_style = space 19 | indent_size = 2 20 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | vendor/ 2 | node_modules/ 3 | data.json 4 | .nyc_output/ 5 | public/ 6 | spec/mocha.js 7 | src/index.mustache.js 8 | coverage/ 9 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "parser": "babel-eslint", 3 | "extends": [ "leankit", "leankit/es6" ], 4 | "rules": { 5 | "complexity": [ 1, 5 ], 6 | "no-negated-condition": 1, 7 | "no-param-reassign": [ 0, { "props": false } ] 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | vendor/ 2 | node_modules/ 3 | data.json 4 | .nyc_output/ 5 | coverage/ 6 | .eslintcache -------------------------------------------------------------------------------- /.jscsrc: -------------------------------------------------------------------------------- 1 | { 2 | "disallowKeywords": [ 3 | "with" 4 | ], 5 | "disallowKeywordsOnNewLine": [ 6 | "else" 7 | ], 8 | "disallowMixedSpacesAndTabs": "smart", 9 | "disallowMultipleLineBreaks": true, 10 | "disallowMultipleLineStrings": true, 11 | "disallowMultipleSpaces": true, 12 | "disallowMultipleVarDecl": "exceptUndefined", 13 | "disallowNewlineBeforeBlockStatements": true, 14 | "disallowOperatorBeforeLineBreak": [ 15 | "+", 16 | "." 17 | ], 18 | "disallowPaddingNewlinesInBlocks": true, 19 | "disallowQuotedKeysInObjects": "allButReserved", 20 | "disallowSpaceAfterObjectKeys": true, 21 | "disallowSpaceAfterPrefixUnaryOperators": true, 22 | "disallowSpaceBeforeBinaryOperators": [ 23 | ",", 24 | ":" 25 | ], 26 | "disallowSpaceBeforePostfixUnaryOperators": true, 27 | "disallowSpacesInAnonymousFunctionExpression": { 28 | "beforeOpeningRoundBrace": true 29 | }, 30 | "disallowSpacesInCallExpression": true, 31 | "disallowSpacesInFunctionExpression": { 32 | "beforeOpeningRoundBrace": true 33 | }, 34 | "disallowSpacesInNamedFunctionExpression": { 35 | "beforeOpeningRoundBrace": true 36 | }, 37 | "disallowTrailingComma": true, 38 | "disallowTrailingWhitespace": true, 39 | "excludeFiles": [ 40 | "node_modules/**" 41 | ], 42 | "maximumLineLength": null, 43 | "requireBlocksOnNewline": true, 44 | "requireCamelCaseOrUpperCaseIdentifiers": "ignoreProperties", 45 | "requireCapitalizedConstructors": true, 46 | "requireCommaBeforeLineBreak": true, 47 | "requireCurlyBraces": [ 48 | "if", 49 | "else", 50 | "for", 51 | "while", 52 | "do", 53 | "try", 54 | "catch" 55 | ], 56 | "requireDotNotation": "except_snake_case", 57 | "requireLineFeedAtFileEnd": true, 58 | "requireOperatorBeforeLineBreak": true, 59 | "requirePaddingNewLinesBeforeLineComments": null, 60 | "requireParenthesesAroundIIFE": true, 61 | "requireSemicolons": true, 62 | "requireSpaceAfterBinaryOperators": true, 63 | "requireSpaceAfterKeywords": [ 64 | "if", 65 | "else", 66 | "for", 67 | "while", 68 | "do", 69 | "switch", 70 | "return", 71 | "try", 72 | "catch" 73 | ], 74 | "requireSpaceBeforeBinaryOperators": [ 75 | "=", "+=", "-=", "*=", "/=", "%=", "<<=", ">>=", ">>>=", "&=", "|=", "^=", "+=", "+", "-", 76 | "*", "/", "%", "<<", ">>", ">>>", "&", "|", "^", "&&", "||", "===", "==", ">=", "<=", "<", ">", "!=", "!==" 77 | ], 78 | "requireSpaceBeforeBlockStatements": true, 79 | "requireSpaceBeforeObjectValues": true, 80 | "requireSpaceBetweenArguments": true, 81 | "requireSpacesInAnonymousFunctionExpression": { 82 | "beforeOpeningCurlyBrace": true 83 | }, 84 | "requireSpacesInConditionalExpression": true, 85 | "requireSpacesInForStatement": true, 86 | "requireSpacesInFunctionExpression": { 87 | "beforeOpeningCurlyBrace": true 88 | }, 89 | "requireSpacesInNamedFunctionExpression": { 90 | "beforeOpeningCurlyBrace": true 91 | }, 92 | "requireSpacesInsideArrayBrackets": "all", 93 | "requireSpacesInsideObjectBrackets": "all", 94 | "requireSpacesInsideParentheses": "all", 95 | "safeContextKeyword": "that", 96 | "validateIndentation": "\t", 97 | "validateLineBreaks": "LF", 98 | "validateQuoteMarks": { 99 | "escape": true, 100 | "mark": "\"" 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /.nyc_output/38eab3f97b0db93dddcb5758db8e2f08.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /.nyc_output/3edf4eb24a4175f98dddd8b265a28a85.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /.nyc_output/46c29962757ad7ea6e79926ffa3c8395.json: -------------------------------------------------------------------------------- 1 | {"/Users/elijahm/egghead/react-file-size/src/index.js":{"path":"/Users/elijahm/egghead/react-file-size/src/index.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":2,"column":-1}},"1":{"start":{"line":2,"column":0},"end":{"line":null,"column":-1}},"2":{"start":{"line":3,"column":0},"end":{"line":null,"column":-1}},"3":{"start":{"line":4,"column":0},"end":{"line":null,"column":-1}},"4":{"start":{"line":5,"column":0},"end":{"line":null,"column":-1}},"5":{"start":{"line":8,"column":1},"end":{"line":9,"column":1}},"6":{"start":{"line":12,"column":1},"end":{"line":13,"column":1}},"7":{"start":{"line":16,"column":1},"end":{"line":20,"column":1}},"8":{"start":{"line":23,"column":1},"end":{"line":38,"column":1}},"9":{"start":{"line":24,"column":16},"end":{"line":24,"column":2}},"10":{"start":{"line":25,"column":24},"end":{"line":25,"column":2}},"11":{"start":{"line":26,"column":19},"end":{"line":26,"column":2}},"12":{"start":{"line":27,"column":27},"end":{"line":27,"column":2}},"13":{"start":{"line":28,"column":2},"end":{"line":37,"column":2}},"14":{"start":{"line":41,"column":1},"end":{"line":42,"column":1}},"15":{"start":{"line":45,"column":1},"end":{"line":47,"column":1}},"16":{"start":{"line":47,"column":17},"end":{"line":47,"column":1}},"17":{"start":{"line":48,"column":1},"end":{"line":64,"column":1}},"18":{"start":{"line":49,"column":2},"end":{"line":50,"column":2}},"19":{"start":{"line":50,"column":2},"end":{"line":60,"column":2}},"20":{"start":{"line":50,"column":78},"end":{"line":50,"column":44}},"21":{"start":{"line":50,"column":78},"end":{"line":50,"column":56}},"22":{"start":{"line":50,"column":78},"end":{"line":51,"column":2}},"23":{"start":{"line":51,"column":3},"end":{"line":52,"column":3}},"24":{"start":{"line":52,"column":16},"end":{"line":52,"column":3}},"25":{"start":{"line":53,"column":3},"end":{"line":54,"column":3}},"26":{"start":{"line":54,"column":3},"end":{"line":55,"column":3}},"27":{"start":{"line":55,"column":3},"end":{"line":56,"column":3}},"28":{"start":{"line":57,"column":3},"end":{"line":58,"column":3}},"29":{"start":{"line":58,"column":3},"end":{"line":59,"column":3}},"30":{"start":{"line":61,"column":2},"end":{"line":62,"column":2}},"31":{"start":{"line":62,"column":2},"end":{"line":63,"column":2}},"32":{"start":{"line":66,"column":0},"end":{"line":null,"column":-1}}},"fnMap":{"0":{"name":"createFolder","decl":{"start":{"line":7,"column":16},"end":{"line":7,"column":7}},"loc":{"start":{"line":7,"column":39},"end":{"line":11,"column":7}}},"1":{"name":"getAllReactVersions","decl":{"start":{"line":11,"column":16},"end":{"line":11,"column":7}},"loc":{"start":{"line":11,"column":38},"end":{"line":15,"column":7}}},"2":{"name":"getAllStats","decl":{"start":{"line":15,"column":16},"end":{"line":15,"column":7}},"loc":{"start":{"line":15,"column":49},"end":{"line":22,"column":7}}},"3":{"name":"mapStats","decl":{"start":{"line":22,"column":16},"end":{"line":22,"column":7}},"loc":{"start":{"line":22,"column":64},"end":{"line":40,"column":7}}},"4":{"name":"(anonymous_8)","decl":{"start":{"line":23,"column":22},"end":{"line":23,"column":32}},"loc":{"start":{"line":23,"column":33},"end":{"line":23,"column":8}}},"5":{"name":"writeFile","decl":{"start":{"line":40,"column":16},"end":{"line":40,"column":7}},"loc":{"start":{"line":40,"column":40},"end":{"line":44,"column":7}}},"6":{"name":"bootstrap","decl":{"start":{"line":44,"column":16},"end":{"line":44,"column":7}},"loc":{"start":{"line":44,"column":28},"end":{"line":64,"column":1}}},"7":{"name":"(anonymous_11)","decl":{"start":{"line":48,"column":36},"end":{"line":48,"column":47}},"loc":{"start":{"line":48,"column":48},"end":{"line":48,"column":8}}},"8":{"name":"(anonymous_12)","decl":{"start":{"line":50,"column":41},"end":{"line":50,"column":77}},"loc":{"start":{"line":50,"column":78},"end":{"line":50,"column":2}}},"9":{"name":"(anonymous_13)","decl":{"start":{"line":56,"column":13},"end":{"line":56,"column":21}},"loc":{"start":{"line":56,"column":22},"end":{"line":50,"column":2}}},"10":{"name":"(anonymous_14)","decl":{"start":{"line":60,"column":12},"end":{"line":60,"column":20}},"loc":{"start":{"line":60,"column":21},"end":{"line":48,"column":8}}}},"branchMap":{"0":{"loc":{"start":{"line":30,"column":23},"end":{"line":30,"column":10}},"type":"cond-expr","locations":[{"start":{"line":30,"column":23},"end":{"line":30,"column":10}},{"start":{"line":30,"column":36},"end":{"line":28,"column":9}}]},"1":{"loc":{"start":{"line":31,"column":32},"end":{"line":31,"column":12}},"type":"cond-expr","locations":[{"start":{"line":31,"column":32},"end":{"line":31,"column":12}},{"start":{"line":31,"column":52},"end":{"line":28,"column":9}}]},"2":{"loc":{"start":{"line":32,"column":29},"end":{"line":32,"column":13}},"type":"cond-expr","locations":[{"start":{"line":32,"column":29},"end":{"line":32,"column":13}},{"start":{"line":32,"column":50},"end":{"line":28,"column":9}}]},"3":{"loc":{"start":{"line":33,"column":31},"end":{"line":33,"column":15}},"type":"cond-expr","locations":[{"start":{"line":33,"column":31},"end":{"line":33,"column":15}},{"start":{"line":33,"column":59},"end":{"line":28,"column":9}}]},"4":{"loc":{"start":{"line":34,"column":24},"end":{"line":34,"column":13}},"type":"cond-expr","locations":[{"start":{"line":34,"column":24},"end":{"line":34,"column":13}},{"start":{"line":34,"column":40},"end":{"line":28,"column":9}}]},"5":{"loc":{"start":{"line":35,"column":35},"end":{"line":35,"column":16}},"type":"cond-expr","locations":[{"start":{"line":35,"column":35},"end":{"line":35,"column":16}},{"start":{"line":35,"column":59},"end":{"line":28,"column":9}}]}},"s":{"0":14,"1":14,"2":14,"3":14,"4":14,"5":19,"6":20,"7":18,"8":16,"9":32,"10":32,"11":32,"12":32,"13":32,"14":15,"15":18,"16":18,"17":18,"18":16,"19":16,"20":14,"21":14,"22":14,"23":14,"24":14,"25":14,"26":14,"27":14,"28":2,"29":2,"30":2,"31":2,"32":14},"f":{"0":19,"1":20,"2":18,"3":16,"4":32,"5":15,"6":18,"7":16,"8":14,"9":2,"10":2},"b":{"0":[2,30],"1":[2,30],"2":[30,2],"3":[30,2],"4":[30,2],"5":[30,2]}},"/Users/elijahm/egghead/react-file-size/src/utils.js":{"path":"/Users/elijahm/egghead/react-file-size/src/utils.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":null,"column":-1}},"1":{"start":{"line":2,"column":0},"end":{"line":null,"column":-1}},"2":{"start":{"line":3,"column":0},"end":{"line":null,"column":-1}},"3":{"start":{"line":4,"column":0},"end":{"line":null,"column":-1}},"4":{"start":{"line":5,"column":0},"end":{"line":null,"column":-1}},"5":{"start":{"line":8,"column":1},"end":{"line":9,"column":1}},"6":{"start":{"line":8,"column":51},"end":{"line":8,"column":7}},"7":{"start":{"line":12,"column":1},"end":{"line":20,"column":1}},"8":{"start":{"line":15,"column":3},"end":{"line":16,"column":3}},"9":{"start":{"line":18,"column":2},"end":{"line":19,"column":2}},"10":{"start":{"line":23,"column":1},"end":{"line":40,"column":1}},"11":{"start":{"line":24,"column":2},"end":{"line":39,"column":2}},"12":{"start":{"line":25,"column":16},"end":{"line":25,"column":3}},"13":{"start":{"line":26,"column":3},"end":{"line":27,"column":3}},"14":{"start":{"line":27,"column":3},"end":{"line":28,"column":3}},"15":{"start":{"line":29,"column":3},"end":{"line":38,"column":3}},"16":{"start":{"line":30,"column":4},"end":{"line":34,"column":4}},"17":{"start":{"line":31,"column":5},"end":{"line":32,"column":5}},"18":{"start":{"line":32,"column":5},"end":{"line":33,"column":5}},"19":{"start":{"line":35,"column":4},"end":{"line":36,"column":4}},"20":{"start":{"line":36,"column":4},"end":{"line":37,"column":4}},"21":{"start":{"line":43,"column":1},"end":{"line":62,"column":1}},"22":{"start":{"line":44,"column":2},"end":{"line":45,"column":2}},"23":{"start":{"line":45,"column":19},"end":{"line":45,"column":2}},"24":{"start":{"line":46,"column":3},"end":{"line":47,"column":3}},"25":{"start":{"line":47,"column":3},"end":{"line":48,"column":3}},"26":{"start":{"line":48,"column":3},"end":{"line":49,"column":3}},"27":{"start":{"line":50,"column":2},"end":{"line":61,"column":2}},"28":{"start":{"line":51,"column":3},"end":{"line":59,"column":3}},"29":{"start":{"line":59,"column":3},"end":{"line":60,"column":3}},"30":{"start":{"line":65,"column":1},"end":{"line":70,"column":1}},"31":{"start":{"line":66,"column":2},"end":{"line":67,"column":2}},"32":{"start":{"line":68,"column":2},"end":{"line":69,"column":2}}},"fnMap":{"0":{"name":"scrapeVersions","decl":{"start":{"line":7,"column":16},"end":{"line":7,"column":7}},"loc":{"start":{"line":7,"column":36},"end":{"line":11,"column":7}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":8,"column":51},"end":{"line":8,"column":56}},"loc":{"start":{"line":8,"column":51},"end":{"line":8,"column":8}}},"2":{"name":"getVersions","decl":{"start":{"line":11,"column":16},"end":{"line":11,"column":7}},"loc":{"start":{"line":11,"column":35},"end":{"line":22,"column":7}}},"3":{"name":"transform","decl":{"start":{"line":12,"column":17},"end":{"line":14,"column":12}},"loc":{"start":{"line":14,"column":20},"end":{"line":12,"column":17}}},"4":{"name":"(anonymous_5)","decl":{"start":{"line":17,"column":11},"end":{"line":17,"column":15}},"loc":{"start":{"line":17,"column":16},"end":{"line":12,"column":8}}},"5":{"name":"getFile","decl":{"start":{"line":22,"column":16},"end":{"line":22,"column":7}},"loc":{"start":{"line":22,"column":61},"end":{"line":42,"column":7}}},"6":{"name":"(anonymous_7)","decl":{"start":{"line":23,"column":21},"end":{"line":23,"column":22}},"loc":{"start":{"line":23,"column":44},"end":{"line":23,"column":8}}},"7":{"name":"(anonymous_8)","decl":{"start":{"line":29,"column":44},"end":{"line":29,"column":51}},"loc":{"start":{"line":29,"column":52},"end":{"line":29,"column":3}}},"8":{"name":"(anonymous_9)","decl":{"start":{"line":30,"column":30},"end":{"line":30,"column":34}},"loc":{"start":{"line":30,"column":35},"end":{"line":30,"column":4}}},"9":{"name":"(anonymous_10)","decl":{"start":{"line":34,"column":14},"end":{"line":34,"column":22}},"loc":{"start":{"line":34,"column":23},"end":{"line":29,"column":3}}},"10":{"name":"getStatistics","decl":{"start":{"line":42,"column":16},"end":{"line":42,"column":7}},"loc":{"start":{"line":42,"column":57},"end":{"line":64,"column":7}}},"11":{"name":"(anonymous_12)","decl":{"start":{"line":43,"column":21},"end":{"line":43,"column":22}},"loc":{"start":{"line":43,"column":44},"end":{"line":43,"column":8}}},"12":{"name":"(anonymous_13)","decl":{"start":{"line":45,"column":36},"end":{"line":45,"column":37}},"loc":{"start":{"line":45,"column":57},"end":{"line":45,"column":19}}},"13":{"name":"(anonymous_14)","decl":{"start":{"line":50,"column":34},"end":{"line":50,"column":35}},"loc":{"start":{"line":50,"column":53},"end":{"line":50,"column":11}}},"14":{"name":"fileExists","decl":{"start":{"line":64,"column":16},"end":{"line":64,"column":7}},"loc":{"start":{"line":64,"column":35},"end":{"line":70,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":24,"column":2},"end":{"line":39,"column":2}},"type":"if","locations":[{"start":{"line":24,"column":2},"end":{"line":39,"column":2}},{"start":{"line":24,"column":2},"end":{"line":39,"column":2}}]},"1":{"loc":{"start":{"line":57,"column":37},"end":{"line":57,"column":17}},"type":"cond-expr","locations":[{"start":{"line":57,"column":37},"end":{"line":57,"column":17}},{"start":{"line":57,"column":67},"end":{"line":51,"column":14}}]}},"s":{"0":21,"1":21,"2":21,"3":21,"4":21,"5":4,"6":12,"7":3,"8":1,"9":3,"10":12,"11":12,"12":10,"13":10,"14":10,"15":2,"16":1,"17":1,"18":1,"19":1,"20":1,"21":4,"22":4,"23":4,"24":4,"25":4,"26":4,"27":3,"28":8,"29":8,"30":15,"31":15,"32":3},"f":{"0":4,"1":12,"2":3,"3":1,"4":3,"5":12,"6":12,"7":1,"8":1,"9":1,"10":4,"11":4,"12":4,"13":8,"14":15},"b":{"0":[10,2],"1":[6,2]}}} -------------------------------------------------------------------------------- /.stylelintrc: -------------------------------------------------------------------------------- 1 | { 2 | "ingoreFiles": [ 3 | "./node_modules/**/*.css", 4 | "./public/*.css" 5 | ], 6 | "rules": { 7 | "color-named": "never", 8 | "color-no-invalid-hex": true, 9 | "font-family-name-quotes": "always-where-required", 10 | "function-max-empty-lines": 0, 11 | "string-quotes": "double", 12 | "time-no-imperceptible": true, 13 | "property-no-vendor-prefix": true, 14 | "declaration-no-important": true, 15 | "declaration-block-no-duplicate-properties": true, 16 | "declaration-block-no-ignored-properties": true, 17 | "declaration-block-single-line-max-declarations": 1, 18 | "block-no-empty": true, 19 | "selector-class-pattern": [ "^(([a-zA-Z]*)+)(-(([a-z][a-zA-Z]+)+))?(--(([a-z][a-zA-Z]+)+))?$" ], 20 | "selector-max-specificity": "1,0,1", 21 | "selector-no-vendor-prefix": true, 22 | "selector-list-comma-newline-after": "always", 23 | "selector-list-comma-newline-before": "never-multi-line", 24 | "rule-non-nested-empty-line-before": [ 25 | "always-multi-line", { 26 | "ignore": [ "after-comment" ] 27 | } 28 | ], 29 | indentation: "tab", 30 | "max-empty-lines": 1, 31 | "max-nesting-depth": 3, 32 | "no-browser-hacks": [ true, { 33 | "browsers": [ "last 2 versions", "ie >=9" ] 34 | } ], 35 | "no-duplicate-selectors": true, 36 | "no-indistinguishable-colors": [ 37 | true, 38 | { "threshold": 3 } 39 | ], 40 | "no-unsupported-browser-features": [ true, { 41 | "browsers": [ "last 2 versions", "ie >= 9" ], 42 | "ignore": [ "rem", "css-transitions", "css-animation", "flexbox" ] 43 | } ] 44 | } 45 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # react-file-size 2 | 3 | Pulls down multiple versions of react from cdnjs, gathers statistics about the files, and generates a webpage to display the information. 4 | 5 | http://elijahmanor.com/react-file-size 6 | 7 | ## npm scripts 8 | 9 | | Script | Description | 10 | | -------- | ----------- | 11 | | start | Pulls down react versions from cdnjs and gathers statistics | 12 | | lint | Runs ESLint and JSCS against the JavaScript | 13 | | build | Compiles the Jade, Mustache, and Sass then uglifies | 14 | | uglify | Minifies the JavaScript and CSS | 15 | | gh-pages | Pushes to gh-pages | 16 | -------------------------------------------------------------------------------- /data.json: -------------------------------------------------------------------------------- 1 | { 2 | "combined": [ 3 | { 4 | "version": "0.3.0", 5 | "react": 271893, 6 | "reactGz": 60254, 7 | "reactMin": 62213, 8 | "reactMinGz": 18060, 9 | "reactDom": 0, 10 | "reactDomGz": 0, 11 | "reactDomMin": 0, 12 | "reactDomMinGz": 0 13 | }, 14 | { 15 | "version": "0.3.1", 16 | "react": 271893, 17 | "reactGz": 60296, 18 | "reactMin": 62213, 19 | "reactMinGz": 18060, 20 | "reactDom": 0, 21 | "reactDomGz": 0, 22 | "reactDomMin": 0, 23 | "reactDomMinGz": 0 24 | }, 25 | { 26 | "version": "0.3.2", 27 | "react": 271893, 28 | "reactGz": 60296, 29 | "reactMin": 62213, 30 | "reactMinGz": 18063, 31 | "reactDom": 0, 32 | "reactDomGz": 0, 33 | "reactDomMin": 0, 34 | "reactDomMinGz": 0 35 | }, 36 | { 37 | "version": "0.3.3", 38 | "react": 272097, 39 | "reactGz": 60335, 40 | "reactMin": 62311, 41 | "reactMinGz": 18089, 42 | "reactDom": 0, 43 | "reactDomGz": 0, 44 | "reactDomMin": 0, 45 | "reactDomMinGz": 0 46 | }, 47 | { 48 | "version": "0.4.0", 49 | "react": 355743, 50 | "reactGz": 75106, 51 | "reactMin": 76815, 52 | "reactMinGz": 21677, 53 | "reactDom": 0, 54 | "reactDomGz": 0, 55 | "reactDomMin": 0, 56 | "reactDomMinGz": 0 57 | }, 58 | { 59 | "version": "0.4.1", 60 | "react": 360142, 61 | "reactGz": 75468, 62 | "reactMin": 77547, 63 | "reactMinGz": 21811, 64 | "reactDom": 0, 65 | "reactDomGz": 0, 66 | "reactDomMin": 0, 67 | "reactDomMinGz": 0 68 | }, 69 | { 70 | "version": "0.4.2", 71 | "react": 359939, 72 | "reactGz": 75411, 73 | "reactMin": 77355, 74 | "reactMinGz": 21758, 75 | "reactDom": 0, 76 | "reactDomGz": 0, 77 | "reactDomMin": 0, 78 | "reactDomMinGz": 0 79 | }, 80 | { 81 | "version": "0.5.0", 82 | "react": 443624, 83 | "reactGz": 92061, 84 | "reactMin": 92797, 85 | "reactMinGz": 25969, 86 | "reactDom": 0, 87 | "reactDomGz": 0, 88 | "reactDomMin": 0, 89 | "reactDomMinGz": 0 90 | }, 91 | { 92 | "version": "0.5.1", 93 | "react": 444062, 94 | "reactGz": 92157, 95 | "reactMin": 92974, 96 | "reactMinGz": 26024, 97 | "reactDom": 0, 98 | "reactDomGz": 0, 99 | "reactDomMin": 0, 100 | "reactDomMinGz": 0 101 | }, 102 | { 103 | "version": "0.5.2", 104 | "react": 444084, 105 | "reactGz": 92160, 106 | "reactMin": 92977, 107 | "reactMinGz": 26025, 108 | "reactDom": 0, 109 | "reactDomGz": 0, 110 | "reactDomMin": 0, 111 | "reactDomMinGz": 0 112 | }, 113 | { 114 | "version": "0.6.0", 115 | "react": 105852, 116 | "reactGz": 25736, 117 | "reactMin": 41933, 118 | "reactMinGz": 12284, 119 | "reactDom": 0, 120 | "reactDomGz": 0, 121 | "reactDomMin": 0, 122 | "reactDomMinGz": 0 123 | }, 124 | { 125 | "version": "0.6.1", 126 | "react": 97834, 127 | "reactGz": 23606, 128 | "reactMin": 38708, 129 | "reactMinGz": 10937, 130 | "reactDom": 0, 131 | "reactDomGz": 0, 132 | "reactDomMin": 0, 133 | "reactDomMinGz": 0 134 | }, 135 | { 136 | "version": "0.6.2", 137 | "react": 97909, 138 | "reactGz": 23515, 139 | "reactMin": 39894, 140 | "reactMinGz": 11600, 141 | "reactDom": 0, 142 | "reactDomGz": 0, 143 | "reactDomMin": 0, 144 | "reactDomMinGz": 0 145 | }, 146 | { 147 | "version": "0.6.3", 148 | "react": 98472, 149 | "reactGz": 23586, 150 | "reactMin": 40298, 151 | "reactMinGz": 11666, 152 | "reactDom": 0, 153 | "reactDomGz": 0, 154 | "reactDomMin": 0, 155 | "reactDomMinGz": 0 156 | }, 157 | { 158 | "version": "0.7.0", 159 | "react": 99322, 160 | "reactGz": 23744, 161 | "reactMin": 40760, 162 | "reactMinGz": 11784, 163 | "reactDom": 0, 164 | "reactDomGz": 0, 165 | "reactDomMin": 0, 166 | "reactDomMinGz": 0 167 | }, 168 | { 169 | "version": "0.7.1", 170 | "react": 99322, 171 | "reactGz": 23744, 172 | "reactMin": 40760, 173 | "reactMinGz": 11784, 174 | "reactDom": 0, 175 | "reactDomGz": 0, 176 | "reactDomMin": 0, 177 | "reactDomMinGz": 0 178 | }, 179 | { 180 | "version": "0.8.0", 181 | "react": 458736, 182 | "reactGz": 94042, 183 | "reactMin": 94460, 184 | "reactMinGz": 26490, 185 | "reactDom": 0, 186 | "reactDomGz": 0, 187 | "reactDomMin": 0, 188 | "reactDomMinGz": 0 189 | }, 190 | { 191 | "version": "0.9.0", 192 | "react": 528848, 193 | "reactGz": 107630, 194 | "reactMin": 108607, 195 | "reactMinGz": 30241, 196 | "reactDom": 0, 197 | "reactDomGz": 0, 198 | "reactDomMin": 0, 199 | "reactDomMinGz": 0 200 | }, 201 | { 202 | "version": "0.10.0", 203 | "react": 549985, 204 | "reactGz": 111616, 205 | "reactMin": 112351, 206 | "reactMinGz": 30949, 207 | "reactDom": 0, 208 | "reactDomGz": 0, 209 | "reactDomMin": 0, 210 | "reactDomMinGz": 0 211 | }, 212 | { 213 | "version": "0.11.0", 214 | "react": 592869, 215 | "reactGz": 121266, 216 | "reactMin": 126275, 217 | "reactMinGz": 34576, 218 | "reactDom": 0, 219 | "reactDomGz": 0, 220 | "reactDomMin": 0, 221 | "reactDomMinGz": 0 222 | }, 223 | { 224 | "version": "0.11.1", 225 | "react": 593628, 226 | "reactGz": 121514, 227 | "reactMin": 126354, 228 | "reactMinGz": 34596, 229 | "reactDom": 0, 230 | "reactDomGz": 0, 231 | "reactDomMin": 0, 232 | "reactDomMinGz": 0 233 | }, 234 | { 235 | "version": "0.11.2", 236 | "react": 594461, 237 | "reactGz": 121723, 238 | "reactMin": 126490, 239 | "reactMinGz": 34643, 240 | "reactDom": 0, 241 | "reactDomGz": 0, 242 | "reactDomMin": 0, 243 | "reactDomMinGz": 0 244 | }, 245 | { 246 | "version": "0.12.0", 247 | "react": 570900, 248 | "reactGz": 125763, 249 | "reactMin": 130289, 250 | "reactMinGz": 35776, 251 | "reactDom": 0, 252 | "reactDomGz": 0, 253 | "reactDomMin": 0, 254 | "reactDomMinGz": 0 255 | }, 256 | { 257 | "version": "0.12.1", 258 | "react": 571026, 259 | "reactGz": 125848, 260 | "reactMin": 130289, 261 | "reactMinGz": 35776, 262 | "reactDom": 0, 263 | "reactDomGz": 0, 264 | "reactDomMin": 0, 265 | "reactDomMinGz": 0 266 | }, 267 | { 268 | "version": "0.12.2", 269 | "react": 571784, 270 | "reactGz": 126053, 271 | "reactMin": 130436, 272 | "reactMinGz": 35818, 273 | "reactDom": 0, 274 | "reactDomGz": 0, 275 | "reactDomMin": 0, 276 | "reactDomMinGz": 0 277 | }, 278 | { 279 | "version": "0.13.0", 280 | "react": 598400, 281 | "reactGz": 134009, 282 | "reactMin": 120732, 283 | "reactMinGz": 35907, 284 | "reactDom": 0, 285 | "reactDomGz": 0, 286 | "reactDomMin": 0, 287 | "reactDomMinGz": 0 288 | }, 289 | { 290 | "version": "0.13.1", 291 | "react": 598504, 292 | "reactGz": 134030, 293 | "reactMin": 120797, 294 | "reactMinGz": 35923, 295 | "reactDom": 0, 296 | "reactDomGz": 0, 297 | "reactDomMin": 0, 298 | "reactDomMinGz": 0 299 | }, 300 | { 301 | "version": "0.13.2", 302 | "react": 599376, 303 | "reactGz": 134165, 304 | "reactMin": 121458, 305 | "reactMinGz": 35941, 306 | "reactDom": 0, 307 | "reactDomGz": 0, 308 | "reactDomMin": 0, 309 | "reactDomMinGz": 0 310 | }, 311 | { 312 | "version": "0.13.3", 313 | "react": 600572, 314 | "reactGz": 134488, 315 | "reactMin": 121738, 316 | "reactMinGz": 36037, 317 | "reactDom": 0, 318 | "reactDomGz": 0, 319 | "reactDomMin": 0, 320 | "reactDomMinGz": 0 321 | }, 322 | { 323 | "version": "0.14.0", 324 | "react": 640047, 325 | "reactGz": 144251, 326 | "reactMin": 135334, 327 | "reactMinGz": 39290, 328 | "reactDom": 1170, 329 | "reactDomGz": 627, 330 | "reactDomMin": 706, 331 | "reactDomMinGz": 431 332 | }, 333 | { 334 | "version": "0.14.1", 335 | "react": 640971, 336 | "reactGz": 144450, 337 | "reactMin": 135480, 338 | "reactMinGz": 39336, 339 | "reactDom": 1170, 340 | "reactDomGz": 627, 341 | "reactDomMin": 706, 342 | "reactDomMinGz": 431 343 | }, 344 | { 345 | "version": "0.14.2", 346 | "react": 641226, 347 | "reactGz": 144515, 348 | "reactMin": 135543, 349 | "reactMinGz": 39367, 350 | "reactDom": 1170, 351 | "reactDomGz": 628, 352 | "reactDomMin": 706, 353 | "reactDomMinGz": 431 354 | }, 355 | { 356 | "version": "0.14.3", 357 | "react": 641366, 358 | "reactGz": 144540, 359 | "reactMin": 135618, 360 | "reactMinGz": 39387, 361 | "reactDom": 1170, 362 | "reactDomGz": 627, 363 | "reactDomMin": 706, 364 | "reactDomMinGz": 431 365 | }, 366 | { 367 | "version": "0.14.4", 368 | "react": 641356, 369 | "reactGz": 144517, 370 | "reactMin": 135528, 371 | "reactMinGz": 39367, 372 | "reactDom": 1170, 373 | "reactDomGz": 627, 374 | "reactDomMin": 706, 375 | "reactDomMinGz": 431 376 | }, 377 | { 378 | "version": "0.14.5", 379 | "react": 641356, 380 | "reactGz": 144517, 381 | "reactMin": 135528, 382 | "reactMinGz": 39367, 383 | "reactDom": 1170, 384 | "reactDomGz": 627, 385 | "reactDomMin": 706, 386 | "reactDomMinGz": 431 387 | }, 388 | { 389 | "version": "0.14.6", 390 | "react": 641479, 391 | "reactGz": 144554, 392 | "reactMin": 135572, 393 | "reactMinGz": 39377, 394 | "reactDom": 1170, 395 | "reactDomGz": 627, 396 | "reactDomMin": 706, 397 | "reactDomMinGz": 432 398 | }, 399 | { 400 | "version": "0.14.7", 401 | "react": 641547, 402 | "reactGz": 144586, 403 | "reactMin": 135581, 404 | "reactMinGz": 39389, 405 | "reactDom": 1171, 406 | "reactDomGz": 627, 407 | "reactDomMin": 706, 408 | "reactDomMinGz": 432 409 | }, 410 | { 411 | "version": "0.14.8", 412 | "react": 641672, 413 | "reactGz": 144623, 414 | "reactMin": 135647, 415 | "reactMinGz": 39384, 416 | "reactDom": 1171, 417 | "reactDomGz": 627, 418 | "reactDomMin": 706, 419 | "reactDomMinGz": 432 420 | }, 421 | { 422 | "version": "0.14.9", 423 | "react": 642026, 424 | "reactGz": 144843, 425 | "reactMin": 135992, 426 | "reactMinGz": 39425, 427 | "reactDom": 1171, 428 | "reactDomGz": 628, 429 | "reactDomMin": 706, 430 | "reactDomMinGz": 432 431 | }, 432 | { 433 | "version": "15.0.0", 434 | "react": 655607, 435 | "reactGz": 148523, 436 | "reactMin": 145410, 437 | "reactMinGz": 42657, 438 | "reactDom": 1174, 439 | "reactDomGz": 628, 440 | "reactDomMin": 709, 441 | "reactDomMinGz": 432 442 | }, 443 | { 444 | "version": "15.0.1", 445 | "react": 656686, 446 | "reactGz": 148818, 447 | "reactMin": 145685, 448 | "reactMinGz": 42735, 449 | "reactDom": 1174, 450 | "reactDomGz": 628, 451 | "reactDomMin": 709, 452 | "reactDomMinGz": 432 453 | }, 454 | { 455 | "version": "15.0.2", 456 | "react": 659291, 457 | "reactGz": 149528, 458 | "reactMin": 146648, 459 | "reactMinGz": 42998, 460 | "reactDom": 1174, 461 | "reactDomGz": 629, 462 | "reactDomMin": 709, 463 | "reactDomMinGz": 432 464 | }, 465 | { 466 | "version": "15.1.0", 467 | "react": 668793, 468 | "reactGz": 150158, 469 | "reactMin": 147112, 470 | "reactMinGz": 43212, 471 | "reactDom": 1174, 472 | "reactDomGz": 628, 473 | "reactDomMin": 709, 474 | "reactDomMinGz": 432 475 | }, 476 | { 477 | "version": "15.2.0", 478 | "react": 690515, 479 | "reactGz": 155322, 480 | "reactMin": 153133, 481 | "reactMinGz": 45270, 482 | "reactDom": 1174, 483 | "reactDomGz": 629, 484 | "reactDomMin": 709, 485 | "reactDomMinGz": 432 486 | }, 487 | { 488 | "version": "15.2.1", 489 | "react": 691206, 490 | "reactGz": 154707, 491 | "reactMin": 147398, 492 | "reactMinGz": 43578, 493 | "reactDom": 1174, 494 | "reactDomGz": 629, 495 | "reactDomMin": 709, 496 | "reactDomMinGz": 432 497 | }, 498 | { 499 | "version": "15.3.0", 500 | "react": 703233, 501 | "reactGz": 157080, 502 | "reactMin": 148583, 503 | "reactMinGz": 44048, 504 | "reactDom": 1174, 505 | "reactDomGz": 628, 506 | "reactDomMin": 709, 507 | "reactDomMinGz": 432 508 | }, 509 | { 510 | "version": "15.3.1", 511 | "react": 702373, 512 | "reactGz": 157363, 513 | "reactMin": 148665, 514 | "reactMinGz": 44143, 515 | "reactDom": 1174, 516 | "reactDomGz": 628, 517 | "reactDomMin": 709, 518 | "reactDomMinGz": 432 519 | }, 520 | { 521 | "version": "15.3.2", 522 | "react": 701412, 523 | "reactGz": 157665, 524 | "reactMin": 148805, 525 | "reactMinGz": 44186, 526 | "reactDom": 1174, 527 | "reactDomGz": 628, 528 | "reactDomMin": 709, 529 | "reactDomMinGz": 432 530 | }, 531 | { 532 | "version": "15.4.0", 533 | "react": 127469, 534 | "reactGz": 30345, 535 | "reactMin": 21339, 536 | "reactMinGz": 7316, 537 | "reactDom": 619047, 538 | "reactDomGz": 140050, 539 | "reactDomMin": 123922, 540 | "reactDomMinGz": 37562 541 | }, 542 | { 543 | "version": "15.4.1", 544 | "react": 127517, 545 | "reactGz": 30368, 546 | "reactMin": 21339, 547 | "reactMinGz": 7316, 548 | "reactDom": 619308, 549 | "reactDomGz": 140120, 550 | "reactDomMin": 123996, 551 | "reactDomMinGz": 37585 552 | }, 553 | { 554 | "version": "15.4.2", 555 | "react": 127694, 556 | "reactGz": 30461, 557 | "reactMin": 21203, 558 | "reactMinGz": 7286, 559 | "reactDom": 620424, 560 | "reactDomGz": 140554, 561 | "reactDomMin": 123889, 562 | "reactDomMinGz": 37568 563 | }, 564 | { 565 | "version": "15.5.0", 566 | "react": 136018, 567 | "reactGz": 31415, 568 | "reactMin": 17488, 569 | "reactMinGz": 6247, 570 | "reactDom": 645755, 571 | "reactDomGz": 146051, 572 | "reactDomMin": 124656, 573 | "reactDomMinGz": 37845 574 | }, 575 | { 576 | "version": "15.5.1", 577 | "react": 136018, 578 | "reactGz": 31415, 579 | "reactMin": 17488, 580 | "reactMinGz": 6247, 581 | "reactDom": 645755, 582 | "reactDomGz": 146051, 583 | "reactDomMin": 124656, 584 | "reactDomMinGz": 37845 585 | }, 586 | { 587 | "version": "15.5.2", 588 | "react": 136016, 589 | "reactGz": 31413, 590 | "reactMin": 17488, 591 | "reactMinGz": 6247, 592 | "reactDom": 645753, 593 | "reactDomGz": 146049, 594 | "reactDomMin": 124656, 595 | "reactDomMinGz": 37845 596 | }, 597 | { 598 | "version": "15.5.3", 599 | "react": 136016, 600 | "reactGz": 31413, 601 | "reactMin": 17488, 602 | "reactMinGz": 6247, 603 | "reactDom": 645753, 604 | "reactDomGz": 146049, 605 | "reactDomMin": 124656, 606 | "reactDomMinGz": 37845 607 | }, 608 | { 609 | "version": "15.5.4", 610 | "react": 136397, 611 | "reactGz": 31669, 612 | "reactMin": 21335, 613 | "reactMinGz": 7328, 614 | "reactDom": 646420, 615 | "reactDomGz": 146373, 616 | "reactDomMin": 128505, 617 | "reactDomMinGz": 38903 618 | }, 619 | { 620 | "version": "15.6.0", 621 | "react": 142442, 622 | "reactGz": 33804, 623 | "reactMin": 22631, 624 | "reactMinGz": 7788, 625 | "reactDom": 651537, 626 | "reactDomGz": 147723, 627 | "reactDomMin": 129791, 628 | "reactDomMinGz": 39322 629 | }, 630 | { 631 | "version": "15.6.1", 632 | "react": 145032, 633 | "reactGz": 34341, 634 | "reactMin": 23040, 635 | "reactMinGz": 7915, 636 | "reactDom": 653066, 637 | "reactDomGz": 148087, 638 | "reactDomMin": 130293, 639 | "reactDomMinGz": 39467 640 | }, 641 | { 642 | "version": "15.6.2", 643 | "react": 141859, 644 | "reactGz": 34268, 645 | "reactMin": 22918, 646 | "reactMinGz": 7862, 647 | "reactDom": 636856, 648 | "reactDomGz": 147497, 649 | "reactDomMin": 130312, 650 | "reactDomMinGz": 39464 651 | }, 652 | { 653 | "version": "16.0.0", 654 | "react": 55295, 655 | "reactGz": 14251, 656 | "reactMin": 5611, 657 | "reactMinGz": 2364, 658 | "reactDom": 606573, 659 | "reactDomGz": 139604, 660 | "reactDomMin": 108200, 661 | "reactDomMinGz": 33881 662 | }, 663 | { 664 | "version": "16.1.0", 665 | "react": 45166, 666 | "reactGz": 12533, 667 | "reactMin": 5363, 668 | "reactMinGz": 2304, 669 | "reactDom": 547394, 670 | "reactDomGz": 127133, 671 | "reactDomMin": 92733, 672 | "reactDomMinGz": 29845 673 | }, 674 | { 675 | "version": "16.1.1", 676 | "react": 45220, 677 | "reactGz": 12560, 678 | "reactMin": 5363, 679 | "reactMinGz": 2304, 680 | "reactDom": 548798, 681 | "reactDomGz": 127451, 682 | "reactDomMin": 92803, 683 | "reactDomMinGz": 29858 684 | }, 685 | { 686 | "version": "16.2.0", 687 | "react": 45158, 688 | "reactGz": 12576, 689 | "reactMin": 5412, 690 | "reactMinGz": 2389, 691 | "reactDom": 549486, 692 | "reactDomGz": 127665, 693 | "reactDomMin": 92699, 694 | "reactDomMinGz": 29787 695 | }, 696 | { 697 | "version": "16.3.0", 698 | "react": 46575, 699 | "reactGz": 13051, 700 | "reactMin": 5663, 701 | "reactMinGz": 2488, 702 | "reactDom": 601200, 703 | "reactDomGz": 138035, 704 | "reactDomMin": 100686, 705 | "reactDomMinGz": 31778 706 | } 707 | ] 708 | } -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node --harmony 2 | const path = require( "path" ); 3 | const dir = path.basename( __dirname ); 4 | 5 | require( "babel-register" )( { 6 | ignore: false, 7 | only: new RegExp( path.join( dir, "src" ) ) 8 | } ); 9 | require( "./src/index.js" ); 10 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-file-size", 3 | "version": "1.0.0", 4 | "description": "Show file size changes over versions of React", 5 | "main": "index.js", 6 | "bin": { 7 | "react-file-size": "./index.js" 8 | }, 9 | "config": { 10 | "port": "1337" 11 | }, 12 | "scripts": { 13 | "start": "node index.js", 14 | "poststart": "npm run build && npm run server", 15 | "pretest": "npm run lint", 16 | "test": "mocha spec/ --require babel-register", 17 | "cover": "nyc npm t", 18 | "postcover": "rm -rf .nyc_output", 19 | "cover:open": "open coverage/index.html", 20 | "lint": "npm-run-all lint:**", 21 | "lint:js": "eslint --cache --fix ./", 22 | "lintx:css": "stylelint '**/*.scss' --syntax scss", 23 | "lintx:css:fix": "stylefmt -R src/", 24 | "watch": "npm-run-all --parallel watch:*", 25 | "watch:test": "npm t -- --watch", 26 | "watch:lint": "onchange 'src/**/*.js' 'src/**/*.scss' -- npm run lint", 27 | "build": "npm-run-all build:*", 28 | "prebuild": "rm -rf public/$npm_package_version", 29 | "build:html": "pug --obj data.json src/index.pug --out public/$npm_package_version/", 30 | "build:css": "node-sass src/index.scss | postcss -c .postcssrc.json | cssmin > public/$npm_package_version/index.min.css", 31 | "build:js": "mustache data.json src/index.mustache.js | uglifyjs > public/$npm_package_version/index.min.js", 32 | "server": "npm-run-all --parallel server:*", 33 | "server:create": "http-server public/$npm_package_version -p $npm_package_config_port", 34 | "server:launch": "open http://localhost:$npm_package_config_port", 35 | "prepush": "npm run lint", 36 | "gh-pages": "git subtree push --prefix public/$npm_package_version origin gh-pages", 37 | "gh-pages:force": "git push origin `git subtree split --prefix public/$npm_package_version master`:gh-pages --force", 38 | "gh-pages:refresh": "git push origin :gh-pages && git subtree push --prefix public/$npm_package_version origin gh-pages" 39 | }, 40 | "nyc": { 41 | "include": [ 42 | "src/**/*.js" 43 | ], 44 | "exclude": [ 45 | "node_modules", 46 | "spec/**/*.js" 47 | ], 48 | "reporter": [ 49 | "lcov", 50 | "text-summary", 51 | "html" 52 | ] 53 | }, 54 | "author": "Elijah Manor", 55 | "license": "MIT", 56 | "publishConfig": { 57 | "registry": "https://registry.npmjs.org/" 58 | }, 59 | "dependencies": { 60 | "babel-preset-es2015": "^6.6.0", 61 | "babel-preset-stage-0": "^6.3.13", 62 | "babel-preset-stage-2": "^6.3.13", 63 | "babel-register": "^6.5.2", 64 | "cheerio": "^0.22.0", 65 | "colors": "^1.2.1", 66 | "commander": "^2.15.1", 67 | "gzip-size": "^4.1.0", 68 | "gzip-size-cli": "^2.1.0", 69 | "inquirer": "^5.2.0", 70 | "lodash": "^4.17.5", 71 | "log-update": "^2.3.0", 72 | "normalize.scss": "^0.1.0", 73 | "ora": "^2.0.0", 74 | "pretty-bytes": "^4.0.2", 75 | "request": "^2.85.0", 76 | "request-promise": "^4.1.1", 77 | "semver": "^5.5.0", 78 | "shelljs": "^0.8.1", 79 | "when": "^3.7.7" 80 | }, 81 | "devDependencies": { 82 | "babel-eslint": "^8.2.2", 83 | "babel-jest": "^22.4.3", 84 | "babel-polyfill": "^6.13.0", 85 | "babel-register": "^6.16.3", 86 | "chai": "^4.1.2", 87 | "cssmin": "^0.4.3", 88 | "dirty-chai": "^2.0.1", 89 | "eslint": "^4.19.1", 90 | "eslint-config-leankit": "^4.4.0", 91 | "gzipped": "0.0.5", 92 | "http-server": "^0.11.1", 93 | "jade": "^1.11.0", 94 | "jest": "^22.4.3", 95 | "jscs": "^3.0.7", 96 | "mocha": "^5.0.5", 97 | "mustache": "^2.2.1", 98 | "node-sass": "^4.8.3", 99 | "npm-run-all": "^4.1.2", 100 | "nyc": "^11.6.0", 101 | "onchange": "^3.3.0", 102 | "parallelshell": "^3.0.2", 103 | "postcss-cli": "^5.0.0", 104 | "proxyquire": "^2.0.1", 105 | "pug-cli": "^1.0.0-alpha6", 106 | "push-dir": "^0.4.1", 107 | "sinon": "^4.5.0", 108 | "sinon-chai": "^3.0.0", 109 | "stylelint": "^9.1.3", 110 | "uglify-js": "^3.3.16" 111 | } 112 | } 113 | -------------------------------------------------------------------------------- /public/1.0.0/index.min.css: -------------------------------------------------------------------------------- 1 | /*! normalize.scss v0.1.0 | MIT License | based on git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}html{max-width:800px;margin:0 auto}body{margin:2rem}.GithubButtons{display:flex;justify-content:flex-end}.GithubButtons iframe,.GithubButtons a{margin-right:1rem}.GithubButtons iframe:last-child{margin-right:0}.table--fixed thead,.table--fixed tbody,.table--fixed tr{display:block;width:100%}.table--fixed tr{overflow:hidden}.table--fixed tbody{overflow-y:auto;height:300px}.table--fixed tbody td,.table--fixed thead th{float:left;border-bottom-width:0}.table--fixed tbody td:after,.table--fixed thead th:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.table--fixed thead,.table--fixed tbody,.table--fixed tr{display:block;width:100%}.table--fixed tr{overflow:hidden}.table--fixed tbody{overflow-y:auto;height:300px}.table--fixed tbody td,.table--fixed thead th{float:left;border-bottom-width:0}.table--fixed tbody td:after,.table--fixed thead th:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.table th,.table td{text-align:right;width:20%}.table th span,.table td span{display:none}.table th i,.table td i{display:none}i.increase{color:#3c763d}i.decrease{color:#a94442}.table tr:hover span{display:inline}.table tr:hover i{display:block}.table th:first-child,.table td:first-child{text-align:left}.toggle{margin-bottom:1rem}.toggle .toggle-button:before,.toggle .toggle-button:after{display:inline-block;font-size:1em;padding:.5rem;min-width:125px;text-align:center}.toggle .toggle-button:before{content:attr(data-label-off);color:black;font-weight:bold;border:1px solid black;background-color:#fff;margin-right:1rem}.toggle .toggle-button:after{content:attr(data-label-on);color:#999;background-color:#ccc;border:1px solid #999}.toggle .toggle-checkbox{display:none}.toggle .toggle-checkbox:checked+.toggle-button:before{color:#999;font-weight:normal;background-color:#ccc;border:1px solid #999}.toggle .toggle-checkbox:checked+.toggle-button:after{color:black;font-weight:bold;background-color:#fff;border:1px solid black} -------------------------------------------------------------------------------- /public/1.0.0/index.min.js: -------------------------------------------------------------------------------- 1 | var versions=[{version:"0.3.0","react.js":"271893","react.js.gz":"60254","react.min.js":"62213","react.min.js.gz":"18060","react-dom.js":"0","react-dom.js.gz":"0","react-dom.min.js":"0","react-dom.min.js.gz":"0"},{version:"0.3.1","react.js":"271893","react.js.gz":"60296","react.min.js":"62213","react.min.js.gz":"18060","react-dom.js":"0","react-dom.js.gz":"0","react-dom.min.js":"0","react-dom.min.js.gz":"0"},{version:"0.3.2","react.js":"271893","react.js.gz":"60296","react.min.js":"62213","react.min.js.gz":"18063","react-dom.js":"0","react-dom.js.gz":"0","react-dom.min.js":"0","react-dom.min.js.gz":"0"},{version:"0.3.3","react.js":"272097","react.js.gz":"60335","react.min.js":"62311","react.min.js.gz":"18089","react-dom.js":"0","react-dom.js.gz":"0","react-dom.min.js":"0","react-dom.min.js.gz":"0"},{version:"0.4.0","react.js":"355743","react.js.gz":"75106","react.min.js":"76815","react.min.js.gz":"21677","react-dom.js":"0","react-dom.js.gz":"0","react-dom.min.js":"0","react-dom.min.js.gz":"0"},{version:"0.4.1","react.js":"360142","react.js.gz":"75468","react.min.js":"77547","react.min.js.gz":"21811","react-dom.js":"0","react-dom.js.gz":"0","react-dom.min.js":"0","react-dom.min.js.gz":"0"},{version:"0.4.2","react.js":"359939","react.js.gz":"75411","react.min.js":"77355","react.min.js.gz":"21758","react-dom.js":"0","react-dom.js.gz":"0","react-dom.min.js":"0","react-dom.min.js.gz":"0"},{version:"0.5.0","react.js":"443624","react.js.gz":"92061","react.min.js":"92797","react.min.js.gz":"25969","react-dom.js":"0","react-dom.js.gz":"0","react-dom.min.js":"0","react-dom.min.js.gz":"0"},{version:"0.5.1","react.js":"444062","react.js.gz":"92157","react.min.js":"92974","react.min.js.gz":"26024","react-dom.js":"0","react-dom.js.gz":"0","react-dom.min.js":"0","react-dom.min.js.gz":"0"},{version:"0.5.2","react.js":"444084","react.js.gz":"92160","react.min.js":"92977","react.min.js.gz":"26025","react-dom.js":"0","react-dom.js.gz":"0","react-dom.min.js":"0","react-dom.min.js.gz":"0"},{version:"0.6.0","react.js":"105852","react.js.gz":"25736","react.min.js":"41933","react.min.js.gz":"12284","react-dom.js":"0","react-dom.js.gz":"0","react-dom.min.js":"0","react-dom.min.js.gz":"0"},{version:"0.6.1","react.js":"97834","react.js.gz":"23606","react.min.js":"38708","react.min.js.gz":"10937","react-dom.js":"0","react-dom.js.gz":"0","react-dom.min.js":"0","react-dom.min.js.gz":"0"},{version:"0.6.2","react.js":"97909","react.js.gz":"23515","react.min.js":"39894","react.min.js.gz":"11600","react-dom.js":"0","react-dom.js.gz":"0","react-dom.min.js":"0","react-dom.min.js.gz":"0"},{version:"0.6.3","react.js":"98472","react.js.gz":"23586","react.min.js":"40298","react.min.js.gz":"11666","react-dom.js":"0","react-dom.js.gz":"0","react-dom.min.js":"0","react-dom.min.js.gz":"0"},{version:"0.7.0","react.js":"99322","react.js.gz":"23744","react.min.js":"40760","react.min.js.gz":"11784","react-dom.js":"0","react-dom.js.gz":"0","react-dom.min.js":"0","react-dom.min.js.gz":"0"},{version:"0.7.1","react.js":"99322","react.js.gz":"23744","react.min.js":"40760","react.min.js.gz":"11784","react-dom.js":"0","react-dom.js.gz":"0","react-dom.min.js":"0","react-dom.min.js.gz":"0"},{version:"0.8.0","react.js":"458736","react.js.gz":"94042","react.min.js":"94460","react.min.js.gz":"26490","react-dom.js":"0","react-dom.js.gz":"0","react-dom.min.js":"0","react-dom.min.js.gz":"0"},{version:"0.9.0","react.js":"528848","react.js.gz":"107630","react.min.js":"108607","react.min.js.gz":"30241","react-dom.js":"0","react-dom.js.gz":"0","react-dom.min.js":"0","react-dom.min.js.gz":"0"},{version:"0.10.0","react.js":"549985","react.js.gz":"111616","react.min.js":"112351","react.min.js.gz":"30949","react-dom.js":"0","react-dom.js.gz":"0","react-dom.min.js":"0","react-dom.min.js.gz":"0"},{version:"0.11.0","react.js":"592869","react.js.gz":"121266","react.min.js":"126275","react.min.js.gz":"34576","react-dom.js":"0","react-dom.js.gz":"0","react-dom.min.js":"0","react-dom.min.js.gz":"0"},{version:"0.11.1","react.js":"593628","react.js.gz":"121514","react.min.js":"126354","react.min.js.gz":"34596","react-dom.js":"0","react-dom.js.gz":"0","react-dom.min.js":"0","react-dom.min.js.gz":"0"},{version:"0.11.2","react.js":"594461","react.js.gz":"121723","react.min.js":"126490","react.min.js.gz":"34643","react-dom.js":"0","react-dom.js.gz":"0","react-dom.min.js":"0","react-dom.min.js.gz":"0"},{version:"0.12.0","react.js":"570900","react.js.gz":"125763","react.min.js":"130289","react.min.js.gz":"35776","react-dom.js":"0","react-dom.js.gz":"0","react-dom.min.js":"0","react-dom.min.js.gz":"0"},{version:"0.12.1","react.js":"571026","react.js.gz":"125848","react.min.js":"130289","react.min.js.gz":"35776","react-dom.js":"0","react-dom.js.gz":"0","react-dom.min.js":"0","react-dom.min.js.gz":"0"},{version:"0.12.2","react.js":"571784","react.js.gz":"126053","react.min.js":"130436","react.min.js.gz":"35818","react-dom.js":"0","react-dom.js.gz":"0","react-dom.min.js":"0","react-dom.min.js.gz":"0"},{version:"0.13.0","react.js":"598400","react.js.gz":"134009","react.min.js":"120732","react.min.js.gz":"35907","react-dom.js":"0","react-dom.js.gz":"0","react-dom.min.js":"0","react-dom.min.js.gz":"0"},{version:"0.13.1","react.js":"598504","react.js.gz":"134030","react.min.js":"120797","react.min.js.gz":"35923","react-dom.js":"0","react-dom.js.gz":"0","react-dom.min.js":"0","react-dom.min.js.gz":"0"},{version:"0.13.2","react.js":"599376","react.js.gz":"134165","react.min.js":"121458","react.min.js.gz":"35941","react-dom.js":"0","react-dom.js.gz":"0","react-dom.min.js":"0","react-dom.min.js.gz":"0"},{version:"0.13.3","react.js":"600572","react.js.gz":"134488","react.min.js":"121738","react.min.js.gz":"36037","react-dom.js":"0","react-dom.js.gz":"0","react-dom.min.js":"0","react-dom.min.js.gz":"0"},{version:"0.14.0","react.js":"640047","react.js.gz":"144251","react.min.js":"135334","react.min.js.gz":"39290","react-dom.js":"1170","react-dom.js.gz":"627","react-dom.min.js":"706","react-dom.min.js.gz":"431"},{version:"0.14.1","react.js":"640971","react.js.gz":"144450","react.min.js":"135480","react.min.js.gz":"39336","react-dom.js":"1170","react-dom.js.gz":"627","react-dom.min.js":"706","react-dom.min.js.gz":"431"},{version:"0.14.2","react.js":"641226","react.js.gz":"144515","react.min.js":"135543","react.min.js.gz":"39367","react-dom.js":"1170","react-dom.js.gz":"628","react-dom.min.js":"706","react-dom.min.js.gz":"431"},{version:"0.14.3","react.js":"641366","react.js.gz":"144540","react.min.js":"135618","react.min.js.gz":"39387","react-dom.js":"1170","react-dom.js.gz":"627","react-dom.min.js":"706","react-dom.min.js.gz":"431"},{version:"0.14.4","react.js":"641356","react.js.gz":"144517","react.min.js":"135528","react.min.js.gz":"39367","react-dom.js":"1170","react-dom.js.gz":"627","react-dom.min.js":"706","react-dom.min.js.gz":"431"},{version:"0.14.5","react.js":"641356","react.js.gz":"144517","react.min.js":"135528","react.min.js.gz":"39367","react-dom.js":"1170","react-dom.js.gz":"627","react-dom.min.js":"706","react-dom.min.js.gz":"431"},{version:"0.14.6","react.js":"641479","react.js.gz":"144554","react.min.js":"135572","react.min.js.gz":"39377","react-dom.js":"1170","react-dom.js.gz":"627","react-dom.min.js":"706","react-dom.min.js.gz":"432"},{version:"0.14.7","react.js":"641547","react.js.gz":"144586","react.min.js":"135581","react.min.js.gz":"39389","react-dom.js":"1171","react-dom.js.gz":"627","react-dom.min.js":"706","react-dom.min.js.gz":"432"},{version:"0.14.8","react.js":"641672","react.js.gz":"144623","react.min.js":"135647","react.min.js.gz":"39384","react-dom.js":"1171","react-dom.js.gz":"627","react-dom.min.js":"706","react-dom.min.js.gz":"432"},{version:"0.14.9","react.js":"642026","react.js.gz":"144843","react.min.js":"135992","react.min.js.gz":"39425","react-dom.js":"1171","react-dom.js.gz":"628","react-dom.min.js":"706","react-dom.min.js.gz":"432"},{version:"15.0.0","react.js":"655607","react.js.gz":"148523","react.min.js":"145410","react.min.js.gz":"42657","react-dom.js":"1174","react-dom.js.gz":"628","react-dom.min.js":"709","react-dom.min.js.gz":"432"},{version:"15.0.1","react.js":"656686","react.js.gz":"148818","react.min.js":"145685","react.min.js.gz":"42735","react-dom.js":"1174","react-dom.js.gz":"628","react-dom.min.js":"709","react-dom.min.js.gz":"432"},{version:"15.0.2","react.js":"659291","react.js.gz":"149528","react.min.js":"146648","react.min.js.gz":"42998","react-dom.js":"1174","react-dom.js.gz":"629","react-dom.min.js":"709","react-dom.min.js.gz":"432"},{version:"15.1.0","react.js":"668793","react.js.gz":"150158","react.min.js":"147112","react.min.js.gz":"43212","react-dom.js":"1174","react-dom.js.gz":"628","react-dom.min.js":"709","react-dom.min.js.gz":"432"},{version:"15.2.0","react.js":"690515","react.js.gz":"155322","react.min.js":"153133","react.min.js.gz":"45270","react-dom.js":"1174","react-dom.js.gz":"629","react-dom.min.js":"709","react-dom.min.js.gz":"432"},{version:"15.2.1","react.js":"691206","react.js.gz":"154707","react.min.js":"147398","react.min.js.gz":"43578","react-dom.js":"1174","react-dom.js.gz":"629","react-dom.min.js":"709","react-dom.min.js.gz":"432"},{version:"15.3.0","react.js":"703233","react.js.gz":"157080","react.min.js":"148583","react.min.js.gz":"44048","react-dom.js":"1174","react-dom.js.gz":"628","react-dom.min.js":"709","react-dom.min.js.gz":"432"},{version:"15.3.1","react.js":"702373","react.js.gz":"157363","react.min.js":"148665","react.min.js.gz":"44143","react-dom.js":"1174","react-dom.js.gz":"628","react-dom.min.js":"709","react-dom.min.js.gz":"432"},{version:"15.3.2","react.js":"701412","react.js.gz":"157665","react.min.js":"148805","react.min.js.gz":"44186","react-dom.js":"1174","react-dom.js.gz":"628","react-dom.min.js":"709","react-dom.min.js.gz":"432"},{version:"15.4.0","react.js":"127469","react.js.gz":"30345","react.min.js":"21339","react.min.js.gz":"7316","react-dom.js":"619047","react-dom.js.gz":"140050","react-dom.min.js":"123922","react-dom.min.js.gz":"37562"},{version:"15.4.1","react.js":"127517","react.js.gz":"30368","react.min.js":"21339","react.min.js.gz":"7316","react-dom.js":"619308","react-dom.js.gz":"140120","react-dom.min.js":"123996","react-dom.min.js.gz":"37585"},{version:"15.4.2","react.js":"127694","react.js.gz":"30461","react.min.js":"21203","react.min.js.gz":"7286","react-dom.js":"620424","react-dom.js.gz":"140554","react-dom.min.js":"123889","react-dom.min.js.gz":"37568"},{version:"15.5.0","react.js":"136018","react.js.gz":"31415","react.min.js":"17488","react.min.js.gz":"6247","react-dom.js":"645755","react-dom.js.gz":"146051","react-dom.min.js":"124656","react-dom.min.js.gz":"37845"},{version:"15.5.1","react.js":"136018","react.js.gz":"31415","react.min.js":"17488","react.min.js.gz":"6247","react-dom.js":"645755","react-dom.js.gz":"146051","react-dom.min.js":"124656","react-dom.min.js.gz":"37845"},{version:"15.5.2","react.js":"136016","react.js.gz":"31413","react.min.js":"17488","react.min.js.gz":"6247","react-dom.js":"645753","react-dom.js.gz":"146049","react-dom.min.js":"124656","react-dom.min.js.gz":"37845"},{version:"15.5.3","react.js":"136016","react.js.gz":"31413","react.min.js":"17488","react.min.js.gz":"6247","react-dom.js":"645753","react-dom.js.gz":"146049","react-dom.min.js":"124656","react-dom.min.js.gz":"37845"},{version:"15.5.4","react.js":"136397","react.js.gz":"31669","react.min.js":"21335","react.min.js.gz":"7328","react-dom.js":"646420","react-dom.js.gz":"146373","react-dom.min.js":"128505","react-dom.min.js.gz":"38903"},{version:"15.6.0","react.js":"142442","react.js.gz":"33804","react.min.js":"22631","react.min.js.gz":"7788","react-dom.js":"651537","react-dom.js.gz":"147723","react-dom.min.js":"129791","react-dom.min.js.gz":"39322"},{version:"15.6.1","react.js":"145032","react.js.gz":"34341","react.min.js":"23040","react.min.js.gz":"7915","react-dom.js":"653066","react-dom.js.gz":"148087","react-dom.min.js":"130293","react-dom.min.js.gz":"39467"},{version:"15.6.2","react.js":"141859","react.js.gz":"34268","react.min.js":"22918","react.min.js.gz":"7862","react-dom.js":"636856","react-dom.js.gz":"147497","react-dom.min.js":"130312","react-dom.min.js.gz":"39464"},{version:"16.0.0","react.js":"55295","react.js.gz":"14251","react.min.js":"5611","react.min.js.gz":"2364","react-dom.js":"606573","react-dom.js.gz":"139604","react-dom.min.js":"108200","react-dom.min.js.gz":"33881"},{version:"16.1.0","react.js":"45166","react.js.gz":"12533","react.min.js":"5363","react.min.js.gz":"2304","react-dom.js":"547394","react-dom.js.gz":"127133","react-dom.min.js":"92733","react-dom.min.js.gz":"29845"},{version:"16.1.1","react.js":"45220","react.js.gz":"12560","react.min.js":"5363","react.min.js.gz":"2304","react-dom.js":"548798","react-dom.js.gz":"127451","react-dom.min.js":"92803","react-dom.min.js.gz":"29858"},{version:"16.2.0","react.js":"45158","react.js.gz":"12576","react.min.js":"5412","react.min.js.gz":"2389","react-dom.js":"549486","react-dom.js.gz":"127665","react-dom.min.js":"92699","react-dom.min.js.gz":"29787"},{version:"16.3.0","react.js":"46575","react.js.gz":"13051","react.min.js":"5663","react.min.js.gz":"2488","react-dom.js":"601200","react-dom.js.gz":"138035","react-dom.min.js":"100686","react-dom.min.js.gz":"31778"}];google.charts.load("current",{packages:["line"]});google.charts.setOnLoadCallback(drawChart);function drawChart(mode){var data=new google.visualization.DataTable;mode=mode||"Production";data.addColumn("string","Version");if(mode==="Production"){data.addColumn("number","react.min.js");data.addColumn("number","react.min.js.gz");data.addColumn("number","react-dom.min.js");data.addColumn("number","react-dom.min.js.gz");data.addRows(_.map(versions,function(version){return[version.version,parseFloat(version["react.min.js"]),parseFloat(version["react.min.js.gz"]),parseFloat(version["react-dom.min.js"]),parseFloat(version["react-dom.min.js.gz"])]}))}else{data.addColumn("number","react.js");data.addColumn("number","react-dom.js");data.addRows(_.map(versions,function(version){return[version.version,parseFloat(version["react.js"]),parseFloat(version["react-dom.js"])]}))}var options={chart:{title:"React File Size",subtitle:"in Kilobytes (kB)"},height:600};var chart=new google.charts.Line(document.getElementById("linechart_material"));chart.draw(data,options)}window.addEventListener("resize",_.throttle(function(){drawChart()},250));document.querySelector("tbody tr:last-child").addEventListener("mouseenter",function(){var tbody=document.querySelector("tbody");tbody.scrollTop=tbody.scrollHeight});document.querySelector(".toggle").addEventListener("click",function(e){if(e.target.nodeName==="INPUT"){var type="Development";if(e.target.checked){type="Production"}drawChart(type)}}); 2 | -------------------------------------------------------------------------------- /spec/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ "leankit/test" ] 3 | } -------------------------------------------------------------------------------- /spec/helpers.js: -------------------------------------------------------------------------------- 1 | import { isObject } from "lodash"; 2 | 3 | export function isPromise( promise ) { 4 | return isObject( promise ) && 5 | promise.then instanceof Function && 6 | promise.catch instanceof Function; 7 | } 8 | -------------------------------------------------------------------------------- /spec/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Mocha 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /spec/index.spec.js: -------------------------------------------------------------------------------- 1 | import chai from "chai"; 2 | import sinon from "sinon"; 3 | import sinonChai from "sinon-chai"; 4 | import proxyquire from "proxyquire"; 5 | import dirtyChai from "dirty-chai"; 6 | import { isPromise } from "./helpers"; 7 | import { merge } from "lodash"; 8 | 9 | const should = chai.should(); // eslint-disable-line no-unused-vars 10 | chai.use( sinonChai ); 11 | chai.use( dirtyChai ); 12 | 13 | const defaults = { 14 | fs: { 15 | writeFileSync: sinon.stub().returns( "readFileSync" ) 16 | }, 17 | ora: sinon.stub().returns( { 18 | start: sinon.stub().returnsThis(), 19 | succeed: sinon.stub().returnsThis(), 20 | fail: sinon.stub().returnsThis() 21 | } ), 22 | shelljs: { 23 | exec: sinon.stub() 24 | }, 25 | "./utils": { 26 | getVersions: sinon.stub().returns( Promise.resolve( [ 27 | "1.0.0", 28 | "2.0.0" 29 | ] ) ), 30 | getStatistics: sinon.stub().returns( Promise.resolve( [ 31 | { name: "react.js", version: "1.0.0", size: 0, sizeGzipped: 0 }, 32 | { name: "react.min.js", version: "1.0.0", size: 0, sizeGzipped: 0 }, 33 | { name: "react.js", version: "2.0.0", size: 0, sizeGzipped: 0 }, 34 | { name: "react.min.js", version: "2.0.0", size: 0, sizeGzipped: 0 }, 35 | { name: "react-dom.js", version: "1.0.0", size: 0, sizeGzipped: 0 }, 36 | { name: "react-dom.min.js", version: "1.0.0", size: 0, sizeGzipped: 0 }, 37 | { name: "react-dom.js", version: "2.0.0", size: 0, sizeGzipped: 0 }, 38 | { name: "react-dom.min.js", version: "2.0.0", size: 0, sizeGzipped: 0 } 39 | ] ) ) 40 | } 41 | }; 42 | 43 | function getStubs( options ) { 44 | return merge( {}, defaults, options ); 45 | } 46 | 47 | describe( "Index", () => { 48 | describe( "createFolder", () => { 49 | let stubs, createFolder; 50 | 51 | beforeEach( () => { 52 | stubs = getStubs(); 53 | createFolder = proxyquire( "../src/index.js", stubs ).createFolder; 54 | } ); 55 | 56 | it( "should create a vendor folder", () => { 57 | createFolder( "vendor" ); 58 | stubs.shelljs.exec.should.have.been.calledWith( "mkdir vendor" ); 59 | } ); 60 | } ); 61 | 62 | describe( "getAllReactVersions", () => { 63 | let stubs, getAllReactVersions; 64 | 65 | beforeEach( () => { 66 | stubs = getStubs(); 67 | getAllReactVersions = proxyquire( "../src/index.js", stubs ).getAllReactVersions; 68 | } ); 69 | 70 | it( "should return a promise", () => { 71 | const promise = getAllReactVersions(); 72 | isPromise( promise ).should.be.true(); 73 | } ); 74 | 75 | it( "should call getVersions with a cdnjs url to react", () => { 76 | getAllReactVersions(); 77 | stubs[ "./utils" ].getVersions.should.have.been.calledWith( "https://cdnjs.com/libraries/react" ); 78 | } ); 79 | } ); 80 | 81 | describe( "getAllStats", () => { 82 | let stubs, getAllStats; 83 | 84 | beforeEach( () => { 85 | stubs = getStubs(); 86 | getAllStats = proxyquire( "../src/index.js", stubs ).getAllStats; 87 | } ); 88 | 89 | it( "should return a promise", () => { 90 | const promise = getAllStats(); 91 | isPromise( promise ).should.be.true(); 92 | } ); 93 | 94 | it( "should call getStatistics for react and react-dom", () => { 95 | getAllStats(); 96 | stubs[ "./utils" ].getStatistics.should.have.been.calledWith( "react" ); 97 | stubs[ "./utils" ].getStatistics.should.have.been.calledWith( "react-dom" ); 98 | } ); 99 | } ); 100 | 101 | describe( "mapStats", () => { 102 | let stubs, mapStats; 103 | 104 | beforeEach( () => { 105 | stubs = getStubs(); 106 | mapStats = proxyquire( "../src/index.js", stubs ).mapStats; 107 | } ); 108 | 109 | it( "should coalesce react version stats", () => { 110 | const versions = [ "1.0.0", "2.0.0" ]; 111 | const reactStats = [ 112 | { name: "react.js", version: "1.0.0", size: 123, sizeGzipped: 120 }, 113 | { name: "react.min.js", version: "1.0.0", size: 12, sizeGzipped: 10 }, 114 | { name: "react.js", version: "2.0.0", size: 234, sizeGzipped: 230 }, 115 | { name: "react.min.js", version: "2.0.0", size: 23, sizeGzipped: 20 } 116 | ]; 117 | const reactDomStats = [ 118 | { name: "react-dom.js", version: "1.0.0", size: 123, sizeGzipped: 120 }, 119 | { name: "react-dom.min.js", version: "1.0.0", size: 12, sizeGzipped: 10 }, 120 | { name: "react-dom.js", version: "2.0.0", size: 234, sizeGzipped: 230 }, 121 | { name: "react-dom.min.js", version: "2.0.0", size: 23, sizeGzipped: 20 } 122 | ]; 123 | const stats = mapStats( versions, reactStats, reactDomStats ); 124 | stats.should.eql( [ 125 | { 126 | version: "1.0.0", 127 | react: 123, 128 | reactDom: 123, 129 | reactDomGz: 120, 130 | reactDomMin: 12, 131 | reactDomMinGz: 10, 132 | reactGz: 120, 133 | reactMin: 12, 134 | reactMinGz: 10 135 | }, 136 | { 137 | version: "2.0.0", 138 | react: 234, 139 | reactDom: 234, 140 | reactDomGz: 230, 141 | reactDomMin: 23, 142 | reactDomMinGz: 20, 143 | reactGz: 230, 144 | reactMin: 23, 145 | reactMinGz: 20 146 | } ] 147 | ); 148 | } ); 149 | 150 | it( "should default to zero bytes if size is undefined", () => { 151 | const versions = [ "1.0.0", "2.0.0" ]; 152 | const reactStats = [ 153 | { name: "react.js", version: "1.0.0" }, 154 | { name: "react.js", version: "2.0.0" } 155 | ]; 156 | const reactDomStats = [ 157 | ]; 158 | const stats = mapStats( versions, reactStats, reactDomStats ); 159 | stats.should.eql( [ 160 | { 161 | version: "1.0.0", 162 | react: 0, 163 | reactDom: 0, 164 | reactDomGz: 0, 165 | reactDomMin: 0, 166 | reactDomMinGz: 0, 167 | reactGz: 0, 168 | reactMin: 0, 169 | reactMinGz: 0 170 | }, 171 | { 172 | version: "2.0.0", 173 | react: 0, 174 | reactDom: 0, 175 | reactDomGz: 0, 176 | reactDomMin: 0, 177 | reactDomMinGz: 0, 178 | reactGz: 0, 179 | reactMin: 0, 180 | reactMinGz: 0 181 | } ] 182 | ); 183 | } ); 184 | } ); 185 | 186 | describe( "writeFile", () => { 187 | let stubs, writeFile; 188 | 189 | beforeEach( () => { 190 | stubs = getStubs(); 191 | writeFile = proxyquire( "../src/index.js", stubs ).writeFile; 192 | } ); 193 | 194 | it( "should write out formatted JSON", () => { 195 | writeFile( "~/tmp/hello.txt", { hello: "world" } ); 196 | stubs.fs.writeFileSync.should.have.been.calledWith( "~/tmp/hello.txt", `{ 197 | "hello": "world" 198 | }`, "utf8" ); 199 | } ); 200 | } ); 201 | 202 | describe( "bootstrap", () => { 203 | let stubs, bootstrap; 204 | 205 | beforeEach( () => { 206 | stubs = getStubs(); 207 | bootstrap = proxyquire( "../src/index.js", stubs ).bootstrap; 208 | } ); 209 | 210 | it( "should have started ora status", () => { 211 | bootstrap(); 212 | stubs.ora().start.should.have.been.called(); 213 | } ); 214 | 215 | it( "should have succeed ora status after getAllStatus", () => { 216 | bootstrap(); 217 | stubs.ora().succeed.should.have.been.called(); 218 | } ); 219 | 220 | it( "should fail when getAllStats is rejected", () => { 221 | stubs = getStubs( { 222 | "./utils": { 223 | getStatistics: sinon.stub().returns( Promise.reject( { message: "error" } ) ) 224 | } 225 | } ); 226 | bootstrap = proxyquire( "../src/index.js", stubs ).bootstrap; 227 | bootstrap().then( () => { 228 | stubs.ora().fail.should.have.been.called(); 229 | } ); 230 | } ); 231 | 232 | it( "should fail when getAllReactVersions is rejected", () => { 233 | stubs = getStubs( { 234 | "./utils": { 235 | getVersions: sinon.stub().returns( Promise.reject( { message: "error" } ) ) 236 | } 237 | } ); 238 | bootstrap = proxyquire( "../src/index.js", stubs ).bootstrap; 239 | bootstrap().then( () => { 240 | stubs.ora().fail.should.have.been.called(); 241 | } ); 242 | } ); 243 | } ); 244 | } ); 245 | -------------------------------------------------------------------------------- /spec/mocha.css: -------------------------------------------------------------------------------- 1 | @charset "utf-8"; 2 | 3 | body { 4 | margin:0; 5 | } 6 | 7 | #mocha { 8 | font: 20px/1.5 "Helvetica Neue", Helvetica, Arial, sans-serif; 9 | margin: 60px 50px; 10 | } 11 | 12 | #mocha ul, 13 | #mocha li { 14 | margin: 0; 15 | padding: 0; 16 | } 17 | 18 | #mocha ul { 19 | list-style: none; 20 | } 21 | 22 | #mocha h1, 23 | #mocha h2 { 24 | margin: 0; 25 | } 26 | 27 | #mocha h1 { 28 | margin-top: 15px; 29 | font-size: 1em; 30 | font-weight: 200; 31 | } 32 | 33 | #mocha h1 a { 34 | text-decoration: none; 35 | color: inherit; 36 | } 37 | 38 | #mocha h1 a:hover { 39 | text-decoration: underline; 40 | } 41 | 42 | #mocha .suite .suite h1 { 43 | margin-top: 0; 44 | font-size: .8em; 45 | } 46 | 47 | #mocha .hidden { 48 | display: none; 49 | } 50 | 51 | #mocha h2 { 52 | font-size: 12px; 53 | font-weight: normal; 54 | cursor: pointer; 55 | } 56 | 57 | #mocha .suite { 58 | margin-left: 15px; 59 | } 60 | 61 | #mocha .test { 62 | margin-left: 15px; 63 | overflow: hidden; 64 | } 65 | 66 | #mocha .test.pending:hover h2::after { 67 | content: '(pending)'; 68 | font-family: arial, sans-serif; 69 | } 70 | 71 | #mocha .test.pass.medium .duration { 72 | background: #c09853; 73 | } 74 | 75 | #mocha .test.pass.slow .duration { 76 | background: #b94a48; 77 | } 78 | 79 | #mocha .test.pass::before { 80 | content: '✓'; 81 | font-size: 12px; 82 | display: block; 83 | float: left; 84 | margin-right: 5px; 85 | color: #00d6b2; 86 | } 87 | 88 | #mocha .test.pass .duration { 89 | font-size: 9px; 90 | margin-left: 5px; 91 | padding: 2px 5px; 92 | color: #fff; 93 | -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.2); 94 | -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.2); 95 | box-shadow: inset 0 1px 1px rgba(0,0,0,.2); 96 | -webkit-border-radius: 5px; 97 | -moz-border-radius: 5px; 98 | -ms-border-radius: 5px; 99 | -o-border-radius: 5px; 100 | border-radius: 5px; 101 | } 102 | 103 | #mocha .test.pass.fast .duration { 104 | display: none; 105 | } 106 | 107 | #mocha .test.pending { 108 | color: #0b97c4; 109 | } 110 | 111 | #mocha .test.pending::before { 112 | content: '◦'; 113 | color: #0b97c4; 114 | } 115 | 116 | #mocha .test.fail { 117 | color: #c00; 118 | } 119 | 120 | #mocha .test.fail pre { 121 | color: black; 122 | } 123 | 124 | #mocha .test.fail::before { 125 | content: '✖'; 126 | font-size: 12px; 127 | display: block; 128 | float: left; 129 | margin-right: 5px; 130 | color: #c00; 131 | } 132 | 133 | #mocha .test pre.error { 134 | color: #c00; 135 | max-height: 300px; 136 | overflow: auto; 137 | } 138 | 139 | #mocha .test .html-error { 140 | overflow: auto; 141 | color: black; 142 | line-height: 1.5; 143 | display: block; 144 | float: left; 145 | clear: left; 146 | font: 12px/1.5 monaco, monospace; 147 | margin: 5px; 148 | padding: 15px; 149 | border: 1px solid #eee; 150 | max-width: 85%; /*(1)*/ 151 | max-width: -webkit-calc(100% - 42px); 152 | max-width: -moz-calc(100% - 42px); 153 | max-width: calc(100% - 42px); /*(2)*/ 154 | max-height: 300px; 155 | word-wrap: break-word; 156 | border-bottom-color: #ddd; 157 | -webkit-box-shadow: 0 1px 3px #eee; 158 | -moz-box-shadow: 0 1px 3px #eee; 159 | box-shadow: 0 1px 3px #eee; 160 | -webkit-border-radius: 3px; 161 | -moz-border-radius: 3px; 162 | border-radius: 3px; 163 | } 164 | 165 | #mocha .test .html-error pre.error { 166 | border: none; 167 | -webkit-border-radius: 0; 168 | -moz-border-radius: 0; 169 | border-radius: 0; 170 | -webkit-box-shadow: 0; 171 | -moz-box-shadow: 0; 172 | box-shadow: 0; 173 | padding: 0; 174 | margin: 0; 175 | margin-top: 18px; 176 | max-height: none; 177 | } 178 | 179 | /** 180 | * (1): approximate for browsers not supporting calc 181 | * (2): 42 = 2*15 + 2*10 + 2*1 (padding + margin + border) 182 | * ^^ seriously 183 | */ 184 | #mocha .test pre { 185 | display: block; 186 | float: left; 187 | clear: left; 188 | font: 12px/1.5 monaco, monospace; 189 | margin: 5px; 190 | padding: 15px; 191 | border: 1px solid #eee; 192 | max-width: 85%; /*(1)*/ 193 | max-width: -webkit-calc(100% - 42px); 194 | max-width: -moz-calc(100% - 42px); 195 | max-width: calc(100% - 42px); /*(2)*/ 196 | word-wrap: break-word; 197 | border-bottom-color: #ddd; 198 | -webkit-box-shadow: 0 1px 3px #eee; 199 | -moz-box-shadow: 0 1px 3px #eee; 200 | box-shadow: 0 1px 3px #eee; 201 | -webkit-border-radius: 3px; 202 | -moz-border-radius: 3px; 203 | border-radius: 3px; 204 | } 205 | 206 | #mocha .test h2 { 207 | position: relative; 208 | } 209 | 210 | #mocha .test a.replay { 211 | position: absolute; 212 | top: 3px; 213 | right: 0; 214 | text-decoration: none; 215 | vertical-align: middle; 216 | display: block; 217 | width: 15px; 218 | height: 15px; 219 | line-height: 15px; 220 | text-align: center; 221 | background: #eee; 222 | font-size: 15px; 223 | -webkit-border-radius: 15px; 224 | -moz-border-radius: 15px; 225 | border-radius: 15px; 226 | -webkit-transition:opacity 200ms; 227 | -moz-transition:opacity 200ms; 228 | -o-transition:opacity 200ms; 229 | transition: opacity 200ms; 230 | opacity: 0.3; 231 | color: #888; 232 | } 233 | 234 | #mocha .test:hover a.replay { 235 | opacity: 1; 236 | } 237 | 238 | #mocha-report.pass .test.fail { 239 | display: none; 240 | } 241 | 242 | #mocha-report.fail .test.pass { 243 | display: none; 244 | } 245 | 246 | #mocha-report.pending .test.pass, 247 | #mocha-report.pending .test.fail { 248 | display: none; 249 | } 250 | #mocha-report.pending .test.pass.pending { 251 | display: block; 252 | } 253 | 254 | #mocha-error { 255 | color: #c00; 256 | font-size: 1.5em; 257 | font-weight: 100; 258 | letter-spacing: 1px; 259 | } 260 | 261 | #mocha-stats { 262 | position: fixed; 263 | top: 15px; 264 | right: 10px; 265 | font-size: 12px; 266 | margin: 0; 267 | color: #888; 268 | z-index: 1; 269 | } 270 | 271 | #mocha-stats .progress { 272 | float: right; 273 | padding-top: 0; 274 | 275 | /** 276 | * Set safe initial values, so mochas .progress does not inherit these 277 | * properties from Bootstrap .progress (which causes .progress height to 278 | * equal line height set in Bootstrap). 279 | */ 280 | height: auto; 281 | -webkit-box-shadow: none; 282 | -moz-box-shadow: none; 283 | box-shadow: none; 284 | background-color: initial; 285 | } 286 | 287 | #mocha-stats em { 288 | color: black; 289 | } 290 | 291 | #mocha-stats a { 292 | text-decoration: none; 293 | color: inherit; 294 | } 295 | 296 | #mocha-stats a:hover { 297 | border-bottom: 1px solid #eee; 298 | } 299 | 300 | #mocha-stats li { 301 | display: inline-block; 302 | margin: 0 5px; 303 | list-style: none; 304 | padding-top: 11px; 305 | } 306 | 307 | #mocha-stats canvas { 308 | width: 40px; 309 | height: 40px; 310 | } 311 | 312 | #mocha code .comment { color: #ddd; } 313 | #mocha code .init { color: #2f6fad; } 314 | #mocha code .string { color: #5890ad; } 315 | #mocha code .keyword { color: #8a6343; } 316 | #mocha code .number { color: #2f6fad; } 317 | 318 | @media screen and (max-device-width: 480px) { 319 | #mocha { 320 | margin: 60px 0px; 321 | } 322 | 323 | #mocha #stats { 324 | position: absolute; 325 | } 326 | } 327 | -------------------------------------------------------------------------------- /spec/utils.spec.js: -------------------------------------------------------------------------------- 1 | import chai from "chai"; 2 | import sinon from "sinon"; 3 | import sinonChai from "sinon-chai"; 4 | import proxyquire from "proxyquire"; 5 | import dirtyChai from "dirty-chai"; 6 | import { isPromise } from "./helpers"; 7 | import { merge } from "lodash"; 8 | 9 | const should = chai.should(); 10 | chai.use( sinonChai ); 11 | chai.use( dirtyChai ); 12 | 13 | const defaults = { 14 | fs: { 15 | readFileSync: sinon.stub().returns( "readFileSync" ), 16 | writeFile: sinon.stub().callsArg( 2 ), 17 | statSync: sinon.stub().returnsThis(), 18 | isFile: sinon.stub().returns( true ) 19 | }, 20 | cheerio: { 21 | load: sinon.stub().returns( "" ) 22 | }, 23 | "gzip-size": { 24 | sync: sinon.stub().returns( 10 ) 25 | }, 26 | $: sinon.stub().returns( { 27 | get: sinon.stub().returns( [ 28 | { attribs: { value: "1.0.0" } }, 29 | { attribs: { value: "2.0.0" } }, 30 | { attribs: { value: "3.0.0" } } 31 | ] ), 32 | map: sinon.stub().returnsThis() 33 | } ), 34 | "request-promise": sinon.stub().returns( Promise.resolve() ) 35 | }; 36 | 37 | function getStubs( options ) { 38 | return merge( {}, defaults, options ); 39 | } 40 | 41 | describe( "Utils", () => { 42 | describe( "scrapeVersions", () => { 43 | let stubs, scrapeVersions; 44 | 45 | beforeEach( () => { 46 | stubs = getStubs(); 47 | scrapeVersions = proxyquire( "../src/utils.js", stubs ).scrapeVersions; 48 | } ); 49 | 50 | it( "should grab all of the version options", () => { 51 | scrapeVersions( stubs.$ ); 52 | stubs.$.should.have.been.calledWith( ".version-selector option" ); 53 | } ); 54 | } ); 55 | 56 | describe( "getVersions", () => { 57 | let stubs, getVersions; 58 | 59 | beforeEach( () => { 60 | stubs = getStubs( { 61 | "request-promise": sinon.stub().returns( Promise.resolve( defaults.$ ) ) 62 | } ); 63 | getVersions = proxyquire( "../src/utils.js", stubs ).getVersions; 64 | } ); 65 | 66 | it( "should make a request to the supplied url", () => { 67 | getVersions( "http://elijahmanor.com" ); 68 | const firstCall = stubs[ "request-promise" ].getCall( 0 ); 69 | firstCall.args[ 0 ].uri.should.equal( "http://elijahmanor.com" ); 70 | } ); 71 | 72 | it( "should parse the body content with cheerio", () => { 73 | stubs = getStubs( { 74 | "request-promise": sinon.stub() 75 | .yieldsTo( "transform", "body" ) 76 | .returns( Promise.resolve( defaults.$ ) ) 77 | } ); 78 | getVersions = proxyquire( "../src/utils.js", stubs ).getVersions; 79 | return getVersions( "http://elijahmanor.com" ).then( () => { 80 | stubs.cheerio.load.should.have.been.calledWith( "body" ); 81 | } ); 82 | } ); 83 | 84 | it( "should return a list of versions", () => { 85 | return getVersions( "http://elijahmanor.com" ).then( versions => { 86 | versions.should.eql( [ "3.0.0", "2.0.0", "1.0.0" ] ); 87 | } ); 88 | } ); 89 | } ); 90 | 91 | describe( "fileExists", () => { 92 | let stubs, fileExists; 93 | 94 | beforeEach( () => { 95 | stubs = getStubs(); 96 | fileExists = proxyquire( "../src/utils.js", stubs ).fileExists; 97 | } ); 98 | 99 | it( "should check the file system for its stats", () => { 100 | fileExists( "/tmp/fileName.txt" ); 101 | stubs.fs.statSync.should.have.been.calledWith( "/tmp/fileName.txt" ); 102 | } ); 103 | 104 | it( "should check to see if the path is a file", () => { 105 | fileExists( "/tmp/fileName.txt" ); 106 | stubs.fs.isFile.should.have.been.called(); 107 | } ); 108 | 109 | it( "should return false if throws an error", () => { 110 | stubs = getStubs( { 111 | fs: { 112 | statSync: sinon.stub().throws() 113 | } 114 | } ); 115 | fileExists = proxyquire( "../src/utils.js", stubs ).fileExists; 116 | const exists = fileExists( "/tmp/fileName.txt" ); 117 | exists.should.equal( false ); 118 | } ); 119 | } ); 120 | 121 | describe( "getFile", () => { 122 | let stubs, getFile; 123 | 124 | beforeEach( () => { 125 | stubs = getStubs(); 126 | getFile = proxyquire( "../src/utils.js", stubs ).getFile; 127 | } ); 128 | 129 | it( "should return a promise", () => { 130 | const promise = getFile( "name", "version", "path", "url", {} ); 131 | isPromise( promise ).should.be.true(); 132 | } ); 133 | 134 | it( "should read the file if it already exists", () => { 135 | return getFile( "name", "version", "path", "url", {} ).then( file => { 136 | stubs.fs.readFileSync.should.be.calledWith( "path" ); 137 | } ); 138 | } ); 139 | 140 | it( "should request the file if it doesn't exists", () => { 141 | stubs = getStubs( { 142 | fs: { 143 | statSync: sinon.stub().throws() 144 | } 145 | } ); 146 | getFile = proxyquire( "../src/utils.js", stubs ).getFile; 147 | return getFile( "name", "version", "path", "url", {} ).then( file => { 148 | stubs[ "request-promise" ].should.have.been.called(); 149 | } ); 150 | } ); 151 | 152 | it( "should return an empty body if request failed", () => { 153 | stubs = getStubs( { 154 | fs: { 155 | statSync: sinon.stub().throws() 156 | }, 157 | "request-promise": sinon.stub().returns( Promise.reject() ) 158 | } ); 159 | getFile = proxyquire( "../src/utils.js", stubs ).getFile; 160 | return getFile( "name", "version", "path", "url", {} ).then( file => { 161 | should.not.exist( file.body ); 162 | } ); 163 | } ); 164 | } ); 165 | 166 | describe( "getStatistics", () => { 167 | let stubs, getStatistics; 168 | 169 | beforeEach( () => { 170 | stubs = getStubs(); 171 | getStatistics = proxyquire( "../src/utils.js", stubs ).getStatistics; 172 | } ); 173 | 174 | it( "should return a promise", () => { 175 | const promise = getStatistics( "name", "versions", {} ); 176 | isPromise( promise ).should.be.true(); 177 | } ); 178 | 179 | it( "should get normal and minified files", () => { 180 | const versions = [ "1.0.0" ]; 181 | return getStatistics( "name", versions, {} ).then( stats => { 182 | stats[ 0 ].name.should.equal( "name.js" ); 183 | stats[ 1 ].name.should.equal( "name.min.js" ); 184 | } ); 185 | } ); 186 | 187 | it( "should get gZip of 0 if file is empty", () => { 188 | stubs = getStubs( { 189 | fs: { 190 | readFileSync: sinon.stub().returns( "" ) 191 | }, 192 | "gzip-size": { 193 | sync: sinon.stub().returns( 0 ) 194 | } 195 | } ); 196 | getStatistics = proxyquire( "../src/utils.js", stubs ).getStatistics; 197 | const versions = [ "1.0.0" ]; 198 | return getStatistics( "name", versions, {} ).then( stats => { 199 | stats[ 0 ].sizeGzipped.should.equal( 0 ); 200 | } ); 201 | } ); 202 | 203 | it( "should get normal and minified files for each version provided", () => { 204 | const versions = [ "2.0.0", "3.0.0" ]; 205 | return getStatistics( "name", versions, {} ).then( stats => { 206 | stats.length.should.equal( 4 ); 207 | stats[ 0 ].path.should.equal( "vendor/name-2.0.0.js" ); 208 | stats[ 1 ].path.should.equal( "vendor/name-2.0.0.min.js" ); 209 | stats[ 2 ].path.should.equal( "vendor/name-3.0.0.js" ); 210 | stats[ 3 ].path.should.equal( "vendor/name-3.0.0.min.js" ); 211 | } ); 212 | } ); 213 | } ); 214 | } ); 215 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import { getVersions, getStatistics } from "./utils"; 2 | import shell from "shelljs"; 3 | import ora from "ora"; 4 | import _ from "lodash"; 5 | import fs from "fs"; 6 | 7 | export function createFolder( folder ) { 8 | shell.exec( `mkdir ${ folder }`, { silent: true } ); 9 | } 10 | 11 | export function getAllReactVersions() { 12 | return getVersions( "https://cdnjs.com/libraries/react" ); 13 | } 14 | 15 | export function getAllStats( versions, spinner ) { 16 | return Promise.all( [ 17 | getStatistics( "react", versions, spinner ), 18 | getStatistics( "react-dom", versions, spinner ) 19 | ] ); 20 | } 21 | 22 | export function mapStats( versions, reactStats, reactDomStats ) { 23 | return versions.map( version => { // eslint-disable-line complexity 24 | const react = _.find( reactStats, { version, name: "react.js" } ); 25 | const reactMinified = _.find( reactStats, { version, name: "react.min.js" } ); 26 | const reactDom = _.find( reactDomStats, { version, name: "react-dom.js" } ); 27 | const reactDomMinified = _.find( reactDomStats, { version, name: "react-dom.min.js" } ); 28 | return { 29 | version, 30 | react: react.size ? react.size : 0, 31 | reactGz: react.sizeGzipped ? react.sizeGzipped : 0, 32 | reactMin: reactMinified ? reactMinified.size : 0, 33 | reactMinGz: reactMinified ? reactMinified.sizeGzipped : 0, 34 | reactDom: reactDom ? reactDom.size : 0, 35 | reactDomGz: reactDom ? reactDom.sizeGzipped : 0, 36 | reactDomMin: reactDomMinified ? reactDomMinified.size : 0, 37 | reactDomMinGz: reactDomMinified ? reactDomMinified.sizeGzipped : 0 38 | }; 39 | } ); 40 | } 41 | 42 | export function writeFile( path, data ) { 43 | fs.writeFileSync( path, JSON.stringify( data, null, 2 ), "utf8" ); 44 | } 45 | 46 | export function bootstrap() { 47 | createFolder( "vendor" ); 48 | 49 | const spinner = ora( "Getting list of available react versions from cdnjs.com..." ).start(); 50 | return getAllReactVersions().then( versions => { 51 | spinner.text = "Getting statistics for react and react-dom..."; 52 | getAllStats( versions, spinner ).then( ( [ reactStats, reactDomStats ] ) => { 53 | spinner.text = "Finished getting statistics for react and react-dom"; 54 | const data = mapStats( versions, reactStats, reactDomStats ); 55 | spinner.text = "Writing data.json with updated statistics for react and react-dom"; 56 | writeFile( "data.json", { combined: data } ); 57 | spinner.succeed(); 58 | } ).catch( error => { 59 | spinner.text = `Houston, we have a problem: ${ error.message }`; 60 | spinner.fail(); 61 | } ); 62 | } ).catch( error => { 63 | spinner.text = `Houston, we have a problem: ${ error.message }`; 64 | spinner.fail(); 65 | } ); 66 | } 67 | 68 | bootstrap(); 69 | -------------------------------------------------------------------------------- /src/index.mustache.js: -------------------------------------------------------------------------------- 1 | var versions = [ 2 | {{#combined}} 3 | { 4 | version: "{{version}}", 5 | "react.js": "{{react}}", 6 | "react.js.gz": "{{reactGz}}", 7 | "react.min.js": "{{reactMin}}", 8 | "react.min.js.gz": "{{reactMinGz}}", 9 | "react-dom.js": "{{reactDom}}", 10 | "react-dom.js.gz": "{{reactDomGz}}", 11 | "react-dom.min.js": "{{reactDomMin}}", 12 | "react-dom.min.js.gz": "{{reactDomMinGz}}", 13 | }, 14 | {{/combined}} 15 | ]; 16 | 17 | google.charts.load( 'current', { 'packages': [ 'line' ] } ); 18 | google.charts.setOnLoadCallback( drawChart ); 19 | 20 | function drawChart( mode ) { 21 | var data = new google.visualization.DataTable(); 22 | 23 | mode = mode || "Production"; 24 | 25 | data.addColumn('string', 'Version'); 26 | 27 | if ( mode === "Production" ) { 28 | data.addColumn('number', 'react.min.js'); 29 | data.addColumn('number', 'react.min.js.gz'); 30 | data.addColumn('number', 'react-dom.min.js'); 31 | data.addColumn('number', 'react-dom.min.js.gz'); 32 | 33 | data.addRows( 34 | _.map( versions, function( version ) { 35 | return [ 36 | version.version, 37 | parseFloat( version[ "react.min.js" ] ), 38 | parseFloat( version[ "react.min.js.gz" ] ), 39 | parseFloat( version[ "react-dom.min.js" ] ), 40 | parseFloat( version[ "react-dom.min.js.gz" ] ) 41 | ]; 42 | } ) 43 | ); 44 | 45 | } else { 46 | data.addColumn('number', 'react.js'); 47 | data.addColumn('number', 'react-dom.js'); 48 | 49 | data.addRows( 50 | _.map( versions, function( version ) { 51 | return [ 52 | version.version, 53 | parseFloat( version[ "react.js" ] ), 54 | parseFloat( version[ "react-dom.js" ] ), 55 | ]; 56 | } ) 57 | ); 58 | } 59 | 60 | var options = { 61 | chart: { 62 | title: "React File Size", 63 | subtitle: 'in Kilobytes (kB)' 64 | }, 65 | height: 600 66 | }; 67 | 68 | var chart = new google.charts.Line( document.getElementById( 'linechart_material' ) ); 69 | 70 | chart.draw( data, options ); 71 | } 72 | 73 | window.addEventListener( "resize", _.throttle( function() { 74 | drawChart(); 75 | }, 250 ) ); 76 | 77 | document.querySelector( "tbody tr:last-child").addEventListener( "mouseenter", function() { 78 | var tbody = document.querySelector( "tbody" ); 79 | tbody.scrollTop = tbody.scrollHeight; 80 | } ); 81 | 82 | document.querySelector( ".toggle" ).addEventListener( "click", function( e ) { 83 | if ( e.target.nodeName === "INPUT" ) { 84 | var type = "Development"; 85 | if ( e.target.checked ) { 86 | type = "Production"; 87 | } 88 | drawChart( type ); 89 | } 90 | } ); 91 | -------------------------------------------------------------------------------- /src/index.pug: -------------------------------------------------------------------------------- 1 | - // https://github.com/sindresorhus/pretty-bytes 2 | - var prettyBytes = function( num ) { 3 | - var exponent; 4 | - var unit; 5 | - var neg = num < 0; 6 | - var units = ['B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; 7 | - 8 | - if (neg) { 9 | - num = -num; 10 | - } 11 | - 12 | - if (num < 1) { 13 | - return (neg ? '-' : '') + num + ' B'; 14 | - } 15 | - 16 | - exponent = Math.min(Math.floor(Math.log(num) / Math.log(1000)), units.length - 1); 17 | - num = Number((num / Math.pow(1000, exponent)).toFixed(2)); 18 | - unit = units[exponent]; 19 | - 20 | - return (neg ? '-' : '') + num + ' ' + unit; 21 | - } 22 | 23 | mixin tableData(data, prev) 24 | - var change = prev ? ( data - prev ) : 0; 25 | - var sign = change > 0 ? "+" : change < 0 ? "-" : ""; 26 | if data 27 | td 28 | | #{data.toLocaleString()}  29 | span bytes
(#{prettyBytes( data )}) 30 | i(class=`${ change > 0 ? 'decrease' : 'increase' }`) Δ #{ sign }#{ prettyBytes(Math.abs(change)) } 31 | else 32 | td – 33 | 34 | doctype 35 | html.no-js 36 | head 37 | meta(charset='utf-8') 38 | meta(http-equiv='X-UA-Compatible', content='IE=edge') 39 | title React File Size 40 | meta(name='description', content='') 41 | meta(name='viewport', content='width=device-width, initial-scale=1') 42 | link(rel='stylesheet', href='//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css') 43 | link(rel='stylesheet', href='./index.min.css?ver=2') 44 | body 45 | div(class='GithubButtons') 46 | a(class="youtube" href="https://www.youtube.com/watch?v=WhWqy-vxKS8" target="_blank") 📹 What's New in React 16.3.0 47 | a(href="https://twitter.com/share" class="twitter-share-button" data-via="elijahmanor") Tweet 48 | a(href="https://twitter.com/elijahmanor" class="twitter-follow-button" data-show-count="false") Follow @elijahmanor 49 | iframe(src="https://ghbtns.com/github-btn.html?user=elijahmanor&repo=react-file-size&type=star" frameborder="0" scrolling="0" width="51px" height="20px") 50 | iframe(src="https://ghbtns.com/github-btn.html?user=elijahmanor&repo=react-file-size&type=fork" frameborder="0" scrolling="0" width="53px" height="20px") 51 | script. 52 | !function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs'); 53 | h1 React File Size 54 | p 55 | a(href='https://facebook.github.io/react/') Facebook's React Library 56 | |  is a very powerful and popular library these days. 57 | | This website's intent is to track the rise and fall of the size of the React library.  58 | a(href="#linechart_material") (see chart below) 59 | div(class='table-responsive') 60 | table(class='table table-striped table--fixed') 61 | thead 62 | tr 63 | th version 64 | th react.js 65 | th react.min.js 66 | th react-dom.js 67 | th react-dom.min.js 68 | tbody 69 | each version, i in combined.reverse() 70 | - var previous = combined[ i - 1 ]; 71 | tr 72 | td #{version.version} 73 | + tableData(version.react, previous ? previous.react : null) 74 | + tableData(version.reactMin, previous ? previous.reactMin : null) 75 | + tableData(version.reactDom, previous ? previous.reactDom : null) 76 | + tableData(version.reactDomMin, previous ? previous.reactDomMin : null) 77 | hr 78 | div(class="toggle") 79 | input(type="checkbox" id="toggle" class="toggle-checkbox" checked) 80 | label(class="toggle-button" for="toggle" data-label-on="Production" data-label-off="Development") 81 | div(id="linechart_material") 82 | script(src='//cdnjs.cloudflare.com/ajax/libs/lodash.js/4.6.1/lodash.min.js') 83 | script(src='//www.gstatic.com/charts/loader.js') 84 | script(src='./index.min.js?ver=2') 85 | script 86 | | (function(b,o,i,l,e,r){b.GoogleAnalyticsObject=l;b[l]||(b[l]= 87 | | function(){(b[l].q=b[l].q||[]).push(arguments)});b[l].l=+new Date; 88 | | e=o.createElement(i);r=o.getElementsByTagName(i)[0]; 89 | | e.src='//www.google-analytics.com/analytics.js'; 90 | | r.parentNode.insertBefore(e,r)}(window,document,'script','ga')); 91 | | ga('create','UA-62341839-1');ga('send','pageview'); 92 | script(src="//static.getclicky.com/js") 93 | script try{ clicky.init(116099); }catch(e){} 94 | -------------------------------------------------------------------------------- /src/index.scss: -------------------------------------------------------------------------------- 1 | @import "../node_modules/normalize.scss/normalize.scss"; 2 | 3 | html { 4 | max-width: 800px; 5 | margin: 0 auto; 6 | } 7 | 8 | body { 9 | margin: 2rem; 10 | } 11 | 12 | .GithubButtons { 13 | display: flex; 14 | justify-content: flex-end; 15 | 16 | iframe, 17 | a { 18 | margin-right: 1rem; 19 | } 20 | 21 | iframe:last-child { 22 | margin-right: 0; 23 | } 24 | } 25 | 26 | .table--fixed { 27 | thead, 28 | tbody, 29 | tr { 30 | display: block; 31 | width: 100%; 32 | } 33 | 34 | tr { 35 | overflow: hidden; 36 | } 37 | 38 | tbody { 39 | overflow-y: auto; 40 | height: 300px; 41 | } 42 | 43 | tbody td, 44 | thead th { 45 | float: left; 46 | border-bottom-width: 0; 47 | 48 | &:after { 49 | visibility: hidden; 50 | display: block; 51 | font-size: 0; 52 | content: " "; 53 | clear: both; 54 | height: 0; 55 | } 56 | } 57 | } 58 | 59 | .table--fixed { 60 | thead, tbody, tr { 61 | display: block; 62 | width: 100%; 63 | } 64 | 65 | tr { 66 | overflow: hidden; 67 | } 68 | 69 | tbody { 70 | overflow-y: auto; 71 | height: 300px; 72 | } 73 | 74 | tbody td, thead th { 75 | float: left; 76 | border-bottom-width: 0; 77 | &:after { 78 | visibility: hidden; 79 | display: block; 80 | font-size: 0; 81 | content: " "; 82 | clear: both; 83 | height: 0; 84 | } 85 | } 86 | } 87 | 88 | .table th, 89 | .table td { 90 | text-align: right; 91 | width: 20%; 92 | 93 | span { 94 | display: none; 95 | } 96 | 97 | i { 98 | display: none; 99 | } 100 | } 101 | 102 | i.increase { 103 | color: #3c763d; 104 | } 105 | 106 | i.decrease { 107 | color: #a94442; 108 | } 109 | 110 | .table tr:hover { 111 | span { 112 | display: inline; 113 | } 114 | 115 | i { 116 | display: block; 117 | } 118 | } 119 | 120 | .table th:first-child, 121 | .table td:first-child { 122 | text-align: left; 123 | } 124 | 125 | .toggle { 126 | margin-bottom: 1rem; 127 | 128 | .toggle-button { 129 | &:before, 130 | &:after { 131 | display: inline-block; 132 | font-size: 1em; 133 | padding: 0.5rem; 134 | min-width: 125px; 135 | text-align: center; 136 | } 137 | 138 | &:before { 139 | content: attr(data-label-off); 140 | color: black; 141 | font-weight: bold; 142 | border: 1px solid black; 143 | background-color: #fff; 144 | margin-right: 1rem; 145 | } 146 | 147 | &:after { 148 | content: attr(data-label-on); 149 | color: #999; 150 | background-color: #ccc; 151 | border: 1px solid #999; 152 | } 153 | } 154 | 155 | .toggle-checkbox { 156 | display: none; 157 | 158 | &:checked { 159 | & + .toggle-button { 160 | &:before { 161 | color: #999; 162 | font-weight: normal; 163 | background-color: #ccc; 164 | border: 1px solid #999; 165 | } 166 | &:after { 167 | color: black; 168 | font-weight: bold; 169 | background-color: #fff; 170 | border: 1px solid black; 171 | } 172 | } 173 | } 174 | } 175 | } 176 | -------------------------------------------------------------------------------- /src/utils.js: -------------------------------------------------------------------------------- 1 | import fs from "fs"; 2 | import request from "request-promise"; 3 | import cheerio from "cheerio"; 4 | import gzipSize from "gzip-size"; 5 | import when from "when"; 6 | import semver from "semver"; 7 | 8 | const CDN_BASE = "https://cdnjs.cloudflare.com/ajax/libs"; 9 | 10 | export function scrapeVersions( $ ) { 11 | return $( ".version-selector option" ) 12 | .get().map( el => el.attribs.value ) 13 | .filter( el => !~el.indexOf( "-" ) ) 14 | .reverse(); 15 | } 16 | 17 | export function getVersions( uri ) { 18 | return request( { 19 | uri, 20 | transform( body ) { 21 | return cheerio.load( body ); 22 | } 23 | } ).then( $ => { 24 | return scrapeVersions( $ ); 25 | } ); 26 | } 27 | 28 | export function getFile( name, version, path, url, spinner ) { 29 | return new Promise( ( resolve, reject ) => { 30 | if ( fileExists( path ) ) { 31 | const body = fs.readFileSync( path, "utf8" ); 32 | spinner.text = `${ name } v${ version }`; 33 | resolve( { name, version, path, url, body } ); 34 | } else { 35 | request( { url, encoding: null } ).then( body => { 36 | fs.writeFile( path, body, e => { 37 | spinner.text = `${ name } v${ version }`; 38 | resolve( { name, version, path, url, body } ); 39 | } ); 40 | } ).catch( error => { 41 | spinner.text = `${ name } v${ version }`; 42 | resolve( { name, version, path, url, body: "" } ); 43 | } ); 44 | } 45 | } ); 46 | } 47 | 48 | export function getStatistics( name, versions, spinner ) { 49 | return new Promise( ( resolve, reject ) => { 50 | spinner.text = `Getting statistics for ${ name }...`; 51 | 52 | const promises = versions.reduce( ( memo, version ) => { 53 | memo.push( 54 | getFile( 55 | `${ name }.js`, 56 | version, 57 | `vendor/${ name }-${ version }.js`, 58 | semver.lt( version, "16.0.0" ) ? 59 | `${ CDN_BASE }/${ name }/${ version }/${ name }.js` : 60 | `${ CDN_BASE }/${ name }/${ version }/cjs/${ name }.development.js`, 61 | spinner 62 | ) ); 63 | memo.push( 64 | getFile( 65 | `${ name }.min.js`, 66 | version, 67 | `vendor/${ name }-${ version }.min.js`, 68 | semver.lt( version, "16.0.0" ) ? 69 | `${ CDN_BASE }/${ name }/${ version }/${ name }.min.js` : 70 | `${ CDN_BASE }/${ name }/${ version }/cjs/${ name }.production.min.js`, 71 | spinner 72 | ) ); 73 | return memo; 74 | }, [] ); 75 | resolve( when.reduce( promises, ( memo, value ) => { 76 | memo.push( { 77 | name: value.name, 78 | version: value.version, 79 | path: value.path, 80 | url: value.url, 81 | size: value.body.length, 82 | sizeGzipped: value.body.length ? gzipSize.sync( value.body ) : 0 83 | } ); 84 | return memo; 85 | }, [] ) ); 86 | } ); 87 | } 88 | 89 | export function fileExists( path ) { 90 | try { 91 | return fs.statSync( path ).isFile(); 92 | } catch ( error ) { 93 | return false; 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /vendor/react-15.4.2.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * React v15.4.2 3 | * 4 | * Copyright 2013-present, Facebook, Inc. 5 | * All rights reserved. 6 | * 7 | * This source code is licensed under the BSD-style license found in the 8 | * LICENSE file in the root directory of this source tree. An additional grant 9 | * of patent rights can be found in the PATENTS file in the same directory. 10 | * 11 | */ 12 | !function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.React=t()}}(function(){return function t(e,n,r){function o(u,a){if(!n[u]){if(!e[u]){var s="function"==typeof require&&require;if(!a&&s)return s(u,!0);if(i)return i(u,!0);var c=new Error("Cannot find module '"+u+"'");throw c.code="MODULE_NOT_FOUND",c}var l=n[u]={exports:{}};e[u][0].call(l.exports,function(t){var n=e[u][1][t];return o(n?n:t)},l,l.exports,t,e,n,r)}return n[u].exports}for(var i="function"==typeof require&&require,u=0;u1){for(var h=Array(v),m=0;m1){for(var g=Array(b),E=0;E>"),O={array:u("array"),bool:u("boolean"),func:u("function"),number:u("number"),object:u("object"),string:u("string"),symbol:u("symbol"),any:a(),arrayOf:s,element:c(),instanceOf:l,node:y(),objectOf:p,oneOf:f,oneOfType:d,shape:v};o.prototype=Error.prototype,e.exports=O},{12:12,14:14,19:19,23:23,26:26,9:9}],14:[function(t,e,n){"use strict";var r="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED";e.exports=r},{}],15:[function(t,e,n){"use strict";function r(t,e,n){this.props=t,this.context=e,this.refs=s,this.updater=n||a}function o(){}var i=t(27),u=t(6),a=t(11),s=t(24);o.prototype=u.prototype,r.prototype=new o,r.prototype.constructor=r,i(r.prototype,u.prototype),r.prototype.isPureReactComponent=!0,e.exports=r},{11:11,24:24,27:27,6:6}],16:[function(t,e,n){"use strict";var r=t(27),o=t(3),i=r({__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:{ReactCurrentOwner:t(7)}},o);e.exports=i},{27:27,3:3,7:7}],17:[function(t,e,n){"use strict";e.exports="15.4.2"},{}],18:[function(t,e,n){"use strict";var r=!1;e.exports=r},{}],19:[function(t,e,n){"use strict";function r(t){var e=t&&(o&&t[o]||t[i]);if("function"==typeof e)return e}var o="function"==typeof Symbol&&Symbol.iterator,i="@@iterator";e.exports=r},{}],20:[function(t,e,n){"use strict";function r(t){return i.isValidElement(t)?void 0:o("143"),t}var o=t(21),i=t(9);t(25);e.exports=r},{21:21,25:25,9:9}],21:[function(t,e,n){"use strict";function r(t){for(var e=arguments.length-1,n="Minified React error #"+t+"; visit http://facebook.github.io/react/docs/error-decoder.html?invariant="+t,r=0;r1){for(var h=Array(d),y=0;y1){for(var m=Array(v),g=0;g1){for(var h=Array(d),y=0;y1){for(var m=Array(v),g=0;g1){for(var h=Array(d),y=0;y1){for(var m=Array(v),g=0;g1){for(var h=Array(d),y=0;y1){for(var m=Array(v),g=0;g1){for(var y=Array(d),h=0;h1){for(var m=Array(v),b=0;bK.length&&K.push(a)} 20 | function N(a,b,d,e){var c=typeof a;if("undefined"===c||"boolean"===c)a=null;if(null===a||"string"===c||"number"===c||"object"===c&&a.$$typeof===I)return d(e,a,""===b?"."+O(a,0):b),1;var g=0;b=""===b?".":b+":";if(Array.isArray(a))for(var k=0;kJ.length&&J.push(a)} 17 | function M(a,b,e,d){var c=typeof a;if("undefined"===c||"boolean"===c)a=null;if(null===a||"string"===c||"number"===c||"object"===c&&a.$$typeof===G||"object"===c&&a.$$typeof===H)return e(d,a,""===b?"."+N(a,0):b),1;var h=0;b=""===b?".":b+":";if(Array.isArray(a))for(var k=0;kJ.length&&J.push(a)} 17 | function M(a,b,e,d){var c=typeof a;if("undefined"===c||"boolean"===c)a=null;if(null===a||"string"===c||"number"===c||"object"===c&&a.$$typeof===G||"object"===c&&a.$$typeof===H)return e(d,a,""===b?"."+N(a,0):b),1;var h=0;b=""===b?".":b+":";if(Array.isArray(a))for(var k=0;kM.length&&M.push(a)} 16 | function P(a,b,e,c){var d=typeof a;if("undefined"===d||"boolean"===d)a=null;var g=!1;if(null===a)g=!0;else switch(d){case "string":case "number":g=!0;break;case "object":switch(a.$$typeof){case r:case t:case u:case v:g=!0}}if(g)return e(c,a,""===b?"."+Q(a,0):b),1;g=0;b=""===b?".":b+":";if(Array.isArray(a))for(var k=0;k 23 | } else { 24 | var g; 25 | if (typeof window !== "undefined") { 26 | g = window; 27 | } else if (typeof global !== "undefined") { 28 | g = global; 29 | } else if (typeof self !== "undefined") { 30 | g = self; 31 | } else { 32 | // works providing we're not in "use strict"; 33 | // needed for Java 8 Nashorn 34 | // see https://github.com/facebook/react/issues/3037 35 | g = this; 36 | } 37 | g.ReactDOM = f(g.React); 38 | } 39 | 40 | })(function(React) { 41 | return React.__SECRET_DOM_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; 42 | }); 43 | -------------------------------------------------------------------------------- /vendor/react-dom-15.3.2.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ReactDOM v15.3.2 3 | * 4 | * Copyright 2013-present, Facebook, Inc. 5 | * All rights reserved. 6 | * 7 | * This source code is licensed under the BSD-style license found in the 8 | * LICENSE file in the root directory of this source tree. An additional grant 9 | * of patent rights can be found in the PATENTS file in the same directory. 10 | * 11 | */ 12 | !function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e(require("react"));else if("function"==typeof define&&define.amd)define(["react"],e);else{var f;f="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,f.ReactDOM=e(f.React)}}(function(e){return e.__SECRET_DOM_DO_NOT_USE_OR_YOU_WILL_BE_FIRED}); --------------------------------------------------------------------------------