diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000000000000000000000000000000000000..0fde5664c792ded72691588d364f9b5d785bc402 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,29 @@ +module.exports = { + root: true, + plugins: ['prettier'], + extends: ['airbnb-base', 'prettier'], + env: { + node: true, + es6: true, + }, + parser: 'babel-eslint', + rules: { + 'prettier/prettier': [ + 'error', + { + singleQuote: true, + trailingComma: 'all', + semi: false, + }, + ], + 'no-console': 0, + 'no-unused-vars': 1, // only warning + 'prefer-destructuring': 0, + 'no-restricted-syntax': 0, + 'no-underscore-dangle': 0, + 'no-nested-ternary': 0, + }, + globals: { + process: true, + }, +} diff --git a/.jshintrc b/.jshintrc deleted file mode 100644 index cb1d5355d6260e59deef6dc577d6c247804d8095..0000000000000000000000000000000000000000 --- a/.jshintrc +++ /dev/null @@ -1,34 +0,0 @@ -{ - // JSHint Default Configuration File (as on JSHint website) - // See http://jshint.com/docs/ for more details - - "maxerr" : 50, // {int} Maximum error before stopping - - // Enforcing - "camelcase" : true, // true: Identifiers must be in camelCase - "curly" : false, // true: Require {} for every new block or scope - "nonew" : true, // true: Prohibit use of constructors for side-effects (without assignment) - "quotmark" : "single", // Quotation mark consistency - "strict" : false, // true: Requires all functions run in ES5 Strict Mode - - "maxparams" : 5, // {int} Max number of formal params allowed per function - "maxdepth" : 5, // {int} Max depth of nested blocks (within functions) - "maxstatements" : 40, // {int} Max number statements per function - "maxcomplexity" : 20, // {int} Max cyclomatic complexity per function - "maxlen" : 120, // {int} Max number of characters per line - - // Relaxing - "asi" : true, // true: Tolerate Automatic Semicolon Insertion (no semicolons) - "esversion" : 6, // {int} Specify the ECMAScript version to which the code must adhere. - "funcscope" : true, // true: Tolerate defining variables inside control statements - - // Environments - "browser" : false, // Web Browser (window, document, etc) - "devel" : true, // Development/debugging (alert, confirm, etc) - "jquery" : false, // jQuery - "mocha" : true, // Mocha - "node" : true, // Node.js - - // Custom Globals - "globals" : {} // additional predefined global variables -} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000000000000000000000000000000000..6145f7401933ba131d54d7fde4c7db6ab725e462 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5122 @@ +{ + "name": "new.ok1kvk.cz", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0-beta.31", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.31.tgz", + "integrity": "sha512-yd7CkUughvHQoEahQqcMdrZw6o/6PwUxiRkfZuVDVHCDe77mysD/suoNyk5mK6phTnRW1kyIbPHyCJgxw++LXg==", + "dev": true, + "requires": { + "chalk": "2.3.0", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "@babel/helper-function-name": { + "version": "7.0.0-beta.31", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.31.tgz", + "integrity": "sha512-c+DAyp8LMm2nzSs2uXEuxp4LYGSUYEyHtU3fU57avFChjsnTmmpWmXj2dv0yUxHTEydgVAv5fIzA+4KJwoqWDA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "7.0.0-beta.31", + "@babel/template": "7.0.0-beta.31", + "@babel/traverse": "7.0.0-beta.31", + "@babel/types": "7.0.0-beta.31" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0-beta.31", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.31.tgz", + "integrity": "sha512-m7rVVX/dMLbbB9NCzKYRrrFb0qZxgpmQ4Wv6y7zEsB6skoJHRuXVeb/hAFze79vXBbuD63ci7AVHXzAdZSk9KQ==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.31" + } + }, + "@babel/template": { + "version": "7.0.0-beta.31", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.31.tgz", + "integrity": "sha512-97IRmLvoDhIDSQkqklVt3UCxJsv0LUEVb/0DzXWtc8Lgiyxj567qZkmTG9aR21CmcJVVIvq2Y/moZj4oEpl5AA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.31", + "@babel/types": "7.0.0-beta.31", + "babylon": "7.0.0-beta.31", + "lodash": "4.17.4" + }, + "dependencies": { + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + } + } + }, + "@babel/traverse": { + "version": "7.0.0-beta.31", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.31.tgz", + "integrity": "sha512-3N+VJW+KlezEjFBG7WSYeMyC5kIqVLPb/PGSzCDPFcJrnArluD1GIl7Y3xC7cjKiTq2/JohaLWHVPjJWHlo9Gg==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.31", + "@babel/helper-function-name": "7.0.0-beta.31", + "@babel/types": "7.0.0-beta.31", + "babylon": "7.0.0-beta.31", + "debug": "3.1.0", + "globals": "10.4.0", + "invariant": "2.2.2", + "lodash": "4.17.4" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "globals": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-10.4.0.tgz", + "integrity": "sha512-uNUtxIZpGyuaq+5BqGGQHsL4wUlJAXRqOm6g3Y48/CWNGTLONgBibI0lh6lGxjR2HljFYUfszb+mk4WkgMntsA==", + "dev": true + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.0.0-beta.31", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.31.tgz", + "integrity": "sha512-exAHB+NeFGxkfQ5dSUD03xl3zYGneeSk2Mw2ldTt/nTvYxuDiuSp3DlxgUBgzbdTFG4fbwPk0WtKWOoTXCmNGg==", + "dev": true, + "requires": { + "esutils": "2.0.2", + "lodash": "4.17.4", + "to-fast-properties": "2.0.0" + }, + "dependencies": { + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + } + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "accepts": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", + "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "requires": { + "mime-types": "2.1.17", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "3.3.0" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "after": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.1.tgz", + "integrity": "sha1-q11PuIP1loFtNRX495HAr0ht1ic=" + }, + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ajv-keywords": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "ansi-escapes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", + "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.3" + } + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "arraybuffer.slice": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", + "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=" + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" + }, + "async-each-series": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", + "integrity": "sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=" + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "babel-eslint": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.0.3.tgz", + "integrity": "sha512-7D4iUpylEiKJPGbeSAlNddGcmA41PadgZ6UAb6JVyh003h3d0EbZusYFBR/+nBgqtaVJM2J2zUVa3N0hrpMH6g==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.31", + "@babel/traverse": "7.0.0-beta.31", + "@babel/types": "7.0.0-beta.31", + "babylon": "7.0.0-beta.31" + } + }, + "babylon": { + "version": "7.0.0-beta.31", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.31.tgz", + "integrity": "sha512-6lm2mV3S51yEnKmQQNnswoABL1U1H1KHoCCVwdwI3hvIv+W7ya4ki7Aw4o4KxtUHjNKkK5WpZb22rrMMOcJXJQ==", + "dev": true + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" + }, + "base64id": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-0.1.0.tgz", + "integrity": "sha1-As4P3u4M709ACA4ec+g08LG/zj8=" + }, + "batch": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.5.3.tgz", + "integrity": "sha1-PzQU84AyF0O/wQQvmoP/HVgk1GQ=" + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "requires": { + "callsite": "1.0.0" + } + }, + "binary-extensions": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", + "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=" + }, + "blob": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=" + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "requires": { + "inherits": "2.0.3" + } + }, + "bluebird": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", + "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=", + "dev": true + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "browser-sync": { + "version": "2.18.13", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.18.13.tgz", + "integrity": "sha512-qhdrmgshVGwweogT/bdOKkZDxVxqiF4+9mibaDeAxvDBeoUtdgABk5x7YQ1KCcLRchAfv8AVtp9NuITl5CTNqg==", + "requires": { + "browser-sync-client": "2.5.1", + "browser-sync-ui": "0.6.3", + "bs-recipes": "1.3.4", + "chokidar": "1.7.0", + "connect": "3.5.0", + "dev-ip": "1.0.1", + "easy-extender": "2.3.2", + "eazy-logger": "3.0.2", + "emitter-steward": "1.0.0", + "fs-extra": "3.0.1", + "http-proxy": "1.15.2", + "immutable": "3.8.1", + "localtunnel": "1.8.3", + "micromatch": "2.3.11", + "opn": "4.0.2", + "portscanner": "2.1.1", + "qs": "6.2.1", + "resp-modifier": "6.0.2", + "rx": "4.1.0", + "serve-index": "1.8.0", + "serve-static": "1.12.2", + "server-destroy": "1.0.1", + "socket.io": "1.6.0", + "socket.io-client": "1.6.0", + "ua-parser-js": "0.7.12", + "yargs": "6.4.0" + } + }, + "browser-sync-client": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.5.1.tgz", + "integrity": "sha1-7BrWmknC4tS2RbGLHAbCmz2a+Os=", + "requires": { + "etag": "1.8.1", + "fresh": "0.3.0" + } + }, + "browser-sync-ui": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-0.6.3.tgz", + "integrity": "sha1-ZApTfBgGiTA9W+krxHa568RBwLw=", + "requires": { + "async-each-series": "0.1.1", + "connect-history-api-fallback": "1.4.0", + "immutable": "3.8.1", + "server-destroy": "1.0.1", + "stream-throttle": "0.1.3", + "weinre": "2.0.0-pre-I0Z7U9OV" + } + }, + "bs-recipes": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", + "integrity": "sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=" + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "0.2.0" + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + } + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.1", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" + } + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "cli": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/cli/-/cli-0.11.3.tgz", + "integrity": "sha1-ewzT3pkORSklZnwNuv/cn38qmhU=", + "requires": { + "exit": "0.1.2", + "glob": "7.1.2" + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "requires": { + "delayed-stream": "1.0.0" + } + }, + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" + }, + "component-emitter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", + "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=" + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "typedarray": "0.0.6" + } + }, + "connect": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.5.0.tgz", + "integrity": "sha1-s1dSWgtMH1BZnNmD4dnv7qlncZg=", + "requires": { + "debug": "2.2.0", + "finalhandler": "0.5.0", + "parseurl": "1.3.2", + "utils-merge": "1.0.0" + } + }, + "connect-history-api-fallback": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.4.0.tgz", + "integrity": "sha1-PbJPlz9LkjsOgvYZzg3wJBHKYj0=" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookiejar": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.0.1.tgz", + "integrity": "sha1-PRJ1L2rfaKiS8zJDNJK9WBK7Zo8=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "requires": { + "lru-cache": "4.1.1", + "which": "1.3.0" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "requires": { + "boom": "2.10.1" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "requires": { + "array-find-index": "1.0.2" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.2.8" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "dev-ip": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", + "integrity": "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=" + }, + "diff": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", + "dev": true + }, + "doctrine": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.2.tgz", + "integrity": "sha512-y0tm5Pq6ywp3qSTZ1vPgVdAnbDEoeoc5wlOHXoY1c4Wug/a7JvqHIl7BTvwodaHmejWkK/9dSb3sCYfyo/om8A==", + "dev": true, + "requires": { + "esutils": "2.0.2" + } + }, + "easy-extender": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.2.tgz", + "integrity": "sha1-PTJI/r4rFZYHMW2PnPSRwWZIIh0=", + "requires": { + "lodash": "3.10.1" + } + }, + "eazy-logger": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-3.0.2.tgz", + "integrity": "sha1-oyWqXlPROiIliJsqxBE7K5Y29Pw=", + "requires": { + "tfunk": "3.1.0" + } + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "emitter-steward": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/emitter-steward/-/emitter-steward-1.0.0.tgz", + "integrity": "sha1-80Ea3pdYp1Zd+Eiy2gy70bRsvWQ=" + }, + "encodeurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" + }, + "engine.io": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.0.tgz", + "integrity": "sha1-PutfJky3XbvsG6rqJtYfWk6s4qo=", + "requires": { + "accepts": "1.3.3", + "base64id": "0.1.0", + "cookie": "0.3.1", + "debug": "2.3.3", + "engine.io-parser": "1.3.1", + "ws": "1.1.1" + }, + "dependencies": { + "accepts": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", + "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", + "requires": { + "mime-types": "2.1.17", + "negotiator": "0.6.1" + } + }, + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=" + } + } + }, + "engine.io-client": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.0.tgz", + "integrity": "sha1-e3MOQSdBQIdZbZvjyI0rxf22z1w=", + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "2.3.3", + "engine.io-parser": "1.3.1", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parsejson": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "1.1.1", + "xmlhttprequest-ssl": "1.5.3", + "yeast": "0.1.2" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=" + } + } + }, + "engine.io-parser": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.1.tgz", + "integrity": "sha1-lVTxrjMQfW+9FwylRm0vgz9qB88=", + "requires": { + "after": "0.8.1", + "arraybuffer.slice": "0.0.6", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.4", + "has-binary": "0.1.6", + "wtf-8": "1.0.0" + }, + "dependencies": { + "has-binary": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.6.tgz", + "integrity": "sha1-JTJvOc+k9hath4eJTjryz7x7bhA=", + "requires": { + "isarray": "0.0.1" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "requires": { + "is-arrayish": "0.2.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "dev": true, + "requires": { + "esprima": "2.7.3", + "estraverse": "1.9.3", + "esutils": "2.0.2", + "optionator": "0.8.2", + "source-map": "0.2.0" + }, + "dependencies": { + "source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "dev": true, + "optional": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "eslint": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.12.1.tgz", + "integrity": "sha512-28hOYej+NZ/R5H1yMvyKa1+bPlu+fnsIAQffK6hxXgvmXnImos2bA5XfCn5dYv2k2mrKj+/U/Z4L5ICWxC7TQw==", + "dev": true, + "requires": { + "ajv": "5.5.1", + "babel-code-frame": "6.26.0", + "chalk": "2.3.0", + "concat-stream": "1.6.0", + "cross-spawn": "5.1.0", + "debug": "3.1.0", + "doctrine": "2.0.2", + "eslint-scope": "3.7.1", + "espree": "3.5.2", + "esquery": "1.0.0", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "functional-red-black-tree": "1.0.1", + "glob": "7.1.2", + "globals": "11.0.1", + "ignore": "3.3.7", + "imurmurhash": "0.1.4", + "inquirer": "3.3.0", + "is-resolvable": "1.0.0", + "js-yaml": "3.10.0", + "json-stable-stringify-without-jsonify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.4", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "7.0.0", + "progress": "2.0.0", + "require-uncached": "1.0.3", + "semver": "5.4.1", + "strip-ansi": "4.0.0", + "strip-json-comments": "2.0.1", + "table": "4.0.2", + "text-table": "0.2.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.1.tgz", + "integrity": "sha1-s4u4h22ehr7plJVqBOch6IskjrI=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "eslint-config-airbnb-base": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-12.1.0.tgz", + "integrity": "sha512-/vjm0Px5ZCpmJqnjIzcFb9TKZrKWz0gnuG/7Gfkt0Db1ELJR51xkZth+t14rYdqWgX836XbuxtArbIHlVhbLBA==", + "dev": true, + "requires": { + "eslint-restricted-globals": "0.1.1" + } + }, + "eslint-config-prettier": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-2.9.0.tgz", + "integrity": "sha512-ag8YEyBXsm3nmOv1Hz991VtNNDMRa+MNy8cY47Pl4bw6iuzqKbJajXdqUpiw13STdLLrznxgm1hj9NhxeOYq0A==", + "dev": true, + "requires": { + "get-stdin": "5.0.1" + }, + "dependencies": { + "get-stdin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", + "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", + "dev": true + } + } + }, + "eslint-import-resolver-node": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.1.tgz", + "integrity": "sha512-yUtXS15gIcij68NmXmP9Ni77AQuCN0itXbCc/jWd8C6/yKZaSNXicpC8cgvjnxVdmfsosIXrjpzFq7GcDryb6A==", + "dev": true, + "requires": { + "debug": "2.6.9", + "resolve": "1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + } + } + }, + "eslint-module-utils": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", + "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "pkg-dir": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-plugin-import": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.8.0.tgz", + "integrity": "sha512-Rf7dfKJxZ16QuTgVv1OYNxkZcsu/hULFnC+e+w0Gzi6jMC3guQoWQgxYxc54IDRinlb6/0v5z/PxxIKmVctN+g==", + "dev": true, + "requires": { + "builtin-modules": "1.1.1", + "contains-path": "0.1.0", + "debug": "2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "0.3.1", + "eslint-module-utils": "2.1.1", + "has": "1.0.1", + "lodash.cond": "4.5.2", + "minimatch": "3.0.4", + "read-pkg-up": "2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "eslint-plugin-prettier": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-2.3.1.tgz", + "integrity": "sha512-AV8shBlGN9tRZffj5v/f4uiQWlP3qiQ+lh+BhTqRLuKSyczx+HRWVkVZaf7dOmguxghAH1wftnou/JUEEChhGg==", + "dev": true, + "requires": { + "fast-diff": "1.1.2", + "jest-docblock": "21.2.0" + } + }, + "eslint-restricted-globals": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz", + "integrity": "sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=", + "dev": true + }, + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true, + "requires": { + "esrecurse": "4.2.0", + "estraverse": "4.2.0" + }, + "dependencies": { + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + } + } + }, + "espree": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.2.tgz", + "integrity": "sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==", + "dev": true, + "requires": { + "acorn": "5.2.1", + "acorn-jsx": "3.0.1" + }, + "dependencies": { + "acorn": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz", + "integrity": "sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w==", + "dev": true + } + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "esquery": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", + "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "dev": true, + "requires": { + "estraverse": "4.2.0" + }, + "dependencies": { + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", + "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "dev": true, + "requires": { + "estraverse": "4.2.0", + "object-assign": "4.1.1" + }, + "dependencies": { + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + } + } + }, + "estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "eventemitter3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=" + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "requires": { + "fill-range": "2.2.3" + } + }, + "express": { + "version": "2.5.11", + "resolved": "https://registry.npmjs.org/express/-/express-2.5.11.tgz", + "integrity": "sha1-TOjqHzY15p5J8Ou0l7aksKUc5vA=", + "requires": { + "connect": "1.9.2", + "mime": "1.2.4", + "mkdirp": "0.3.0", + "qs": "0.4.2" + }, + "dependencies": { + "connect": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/connect/-/connect-1.9.2.tgz", + "integrity": "sha1-QogKIulDiuWait105Df1iujlKAc=", + "requires": { + "formidable": "1.0.17", + "mime": "1.2.4", + "qs": "0.4.2" + } + }, + "mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=" + }, + "qs": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-0.4.2.tgz", + "integrity": "sha1-PKxMhh43GoycR3CsI82o3mObjl8=" + } + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + }, + "external-editor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", + "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", + "dev": true, + "requires": { + "chardet": "0.4.2", + "iconv-lite": "0.4.19", + "tmp": "0.0.33" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "1.0.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", + "dev": true + }, + "fast-diff": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", + "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "1.3.0", + "object-assign": "4.1.1" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" + }, + "filendir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/filendir/-/filendir-1.0.0.tgz", + "integrity": "sha1-dFtEWvzElwpM2wD9lTnHftlCrfY=", + "requires": { + "mkdirp": "0.5.1" + } + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "finalhandler": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.5.0.tgz", + "integrity": "sha1-6VCKvs6bbbqHGmlCodeRG5GRGsc=", + "requires": { + "debug": "2.2.0", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "statuses": "1.3.1", + "unpipe": "1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "flat-cache": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "dev": true, + "requires": { + "circular-json": "0.3.3", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "requires": { + "for-in": "1.0.2" + } + }, + "foreachasync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", + "integrity": "sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY=" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "formatio": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", + "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", + "dev": true, + "requires": { + "samsam": "1.1.2" + } + }, + "formidable": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.0.17.tgz", + "integrity": "sha1-71SRSQ+UM7cF+qdyScmQKa40hVk=" + }, + "fresh": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", + "integrity": "sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8=" + }, + "fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "3.0.1", + "universalify": "0.1.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.2.8" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", + "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "gaze": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz", + "integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=", + "requires": { + "globule": "1.2.0" + } + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "requires": { + "is-glob": "2.0.1" + } + }, + "globals": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.0.1.tgz", + "integrity": "sha1-Eqh7sBDlFUOWrMU14eQ/x1Ow5eg=", + "dev": true + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "globule": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz", + "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=", + "requires": { + "glob": "7.1.2", + "lodash": "4.17.4", + "minimatch": "3.0.4" + }, + "dependencies": { + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + } + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "handlebars": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "dev": true, + "requires": { + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.29" + } + }, + "har-schema": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=" + }, + "har-validator": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "requires": { + "function-bind": "1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-binary": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", + "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=", + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "highlight.js": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.12.0.tgz", + "integrity": "sha1-5tnb5Xy+/mB1HwKvM2GVhwyQwB4=" + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==" + }, + "http-errors": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.5.1.tgz", + "integrity": "sha1-eIwNLB3iyBuebowBhDtrl+uSB1A=", + "requires": { + "inherits": "2.0.3", + "setprototypeof": "1.0.2", + "statuses": "1.3.1" + } + }, + "http-proxy": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.15.2.tgz", + "integrity": "sha1-ZC/cr/5S00SNK9o7AHnpQJBk2jE=", + "requires": { + "eventemitter3": "1.2.0", + "requires-port": "1.0.0" + } + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true + }, + "ignore": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", + "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", + "dev": true + }, + "immutable": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.1.tgz", + "integrity": "sha1-IAgH8Rqw9ycQ6khVQt4IgHX2jNI=" + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "in-publish": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", + "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=" + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "requires": { + "repeating": "2.0.1" + } + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=" + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dev": true, + "requires": { + "ansi-escapes": "3.0.0", + "chalk": "2.3.0", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.1.0", + "figures": "2.0.0", + "lodash": "4.17.4", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rx-lite": "4.0.8", + "rx-lite-aggregates": "4.0.8", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "through": "2.3.8" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "dev": true, + "requires": { + "loose-envify": "1.3.1" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "1.10.0" + } + }, + "is-buffer": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=" + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "requires": { + "kind-of": "3.2.2" + } + }, + "is-number-like": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", + "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", + "requires": { + "lodash.isfinite": "3.3.2" + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true, + "requires": { + "is-path-inside": "1.0.1" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-resolvable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", + "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", + "dev": true, + "requires": { + "tryit": "1.0.3" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "istanbul": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", + "dev": true, + "requires": { + "abbrev": "1.0.9", + "async": "1.5.2", + "escodegen": "1.8.1", + "esprima": "2.7.3", + "glob": "5.0.15", + "handlebars": "4.0.11", + "js-yaml": "3.10.0", + "mkdirp": "0.5.1", + "nopt": "3.0.6", + "once": "1.4.0", + "resolve": "1.1.7", + "supports-color": "3.2.3", + "which": "1.3.0", + "wordwrap": "1.0.0" + }, + "dependencies": { + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "dev": true + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "jade": { + "version": "0.26.3", + "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", + "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", + "dev": true, + "requires": { + "commander": "0.6.1", + "mkdirp": "0.3.0" + }, + "dependencies": { + "commander": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", + "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", + "dev": true + }, + "mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", + "dev": true + } + } + }, + "jest-docblock": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-21.2.0.tgz", + "integrity": "sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw==", + "dev": true + }, + "js-base64": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.3.2.tgz", + "integrity": "sha512-Y2/+DnfJJXT1/FCwUebUhLWb3QihxiSC42+ctHLGogmW2jPY6LCapMdFZXRvVP2z6qyKW7s6qncE/9gSqZiArw==" + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", + "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", + "dev": true, + "requires": { + "argparse": "1.0.9", + "esprima": "4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true + } + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=" + }, + "jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "requires": { + "graceful-fs": "4.1.11" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.5" + } + }, + "kindof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/kindof/-/kindof-1.0.0.tgz", + "integrity": "sha1-ExiZqFJ1N6lNou3NXMSfxglgZWA=", + "dev": true + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "requires": { + "graceful-fs": "4.1.11" + } + }, + "latinize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/latinize/-/latinize-0.4.0.tgz", + "integrity": "sha1-J0ObIeTrdQbDdxe2OPHfLEkHWkg=" + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true, + "optional": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "1.0.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2", + "type-check": "0.3.2" + } + }, + "limiter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.2.tgz", + "integrity": "sha512-JIKZ0xb6fZZYa3deZ0BgXCgX6HgV8Nx3mFGeFHmFWW8Fb2c08e0CyE+G3nalpD0xGvGssjGb1UdFr+PprxZEbw==" + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "localtunnel": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-1.8.3.tgz", + "integrity": "sha1-3MWSL9hWUQN9S94k/ZMkjQsk6wU=", + "requires": { + "debug": "2.6.8", + "openurl": "1.1.1", + "request": "2.81.0", + "yargs": "3.29.0" + }, + "dependencies": { + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "yargs": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.29.0.tgz", + "integrity": "sha1-GquWYOrnnYuPZ1vK7qtu40ws9pw=", + "requires": { + "camelcase": "1.2.1", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "os-locale": "1.4.0", + "window-size": "0.1.4", + "y18n": "3.2.1" + } + } + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, + "lodash.cond": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", + "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", + "dev": true + }, + "lodash.isfinite": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", + "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=" + }, + "lolex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", + "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "dev": true, + "requires": { + "js-tokens": "3.0.2" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + } + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + }, + "marked": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.6.tgz", + "integrity": "sha1-ssbGGPzOzk74bE/Gy4p8v1rtqNc=" + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "mime": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.4.tgz", + "integrity": "sha1-EbX9rynCUJJVF2uArVIClPXekrc=" + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "requires": { + "mime-db": "1.30.0" + } + }, + "mimic-fn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", + "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", + "integrity": "sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg=", + "dev": true, + "requires": { + "commander": "2.3.0", + "debug": "2.2.0", + "diff": "1.4.0", + "escape-string-regexp": "1.0.2", + "glob": "3.2.11", + "growl": "1.9.2", + "jade": "0.26.3", + "mkdirp": "0.5.1", + "supports-color": "1.2.0", + "to-iso-string": "0.0.2" + }, + "dependencies": { + "commander": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", + "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", + "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=", + "dev": true + }, + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimatch": "0.3.0" + } + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "dev": true, + "requires": { + "lru-cache": "2.7.3", + "sigmund": "1.0.1" + } + }, + "supports-color": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", + "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=", + "dev": true + } + } + }, + "moment": { + "version": "2.19.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.19.1.tgz", + "integrity": "sha1-VtoaLRy/AdOLfhr8McELz6GSkWc=" + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + }, + "must": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/must/-/must-0.12.0.tgz", + "integrity": "sha1-V0HnKb7byLD+K8jFAGRZQVOD0F0=", + "dev": true, + "requires": { + "kindof": "1.0.0" + } + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nan": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz", + "integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "ncp": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz", + "integrity": "sha1-q8xsvT7C7Spyn/bnwfqPAXhKhXQ=" + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "node-fs-extra": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/node-fs-extra/-/node-fs-extra-0.8.2.tgz", + "integrity": "sha1-CfsrYNMPfXA+Nh7LYmqRQE8XCXo=", + "requires": { + "jsonfile": "1.1.1", + "mkdirp": "0.3.5", + "ncp": "0.4.2", + "rimraf": "2.2.8" + }, + "dependencies": { + "jsonfile": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-1.1.1.tgz", + "integrity": "sha1-2k/WrXfxolUgPqY8e8Mtwx72RDM=" + }, + "mkdirp": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=" + } + } + }, + "node-gyp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.2.tgz", + "integrity": "sha1-m/vlRWIoYoSDjnUOrAUpWFP6HGA=", + "requires": { + "fstream": "1.0.11", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "nopt": "3.0.6", + "npmlog": "4.1.2", + "osenv": "0.1.4", + "request": "2.81.0", + "rimraf": "2.2.8", + "semver": "5.3.0", + "tar": "2.2.1", + "which": "1.3.0" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" + } + } + }, + "node-pre-gyp": { + "version": "0.6.38", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.38.tgz", + "integrity": "sha1-6Sog+DQWQVu0CG9tH7eLPac9ET0=", + "requires": { + "hawk": "3.1.3", + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.2", + "rc": "1.2.2", + "request": "2.81.0", + "rimraf": "2.6.2", + "semver": "5.4.1", + "tar": "2.2.1", + "tar-pack": "3.4.1" + }, + "dependencies": { + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "requires": { + "abbrev": "1.1.1", + "osenv": "0.1.4" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "requires": { + "glob": "7.1.2" + } + } + } + }, + "node-sass": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-3.13.1.tgz", + "integrity": "sha1-ckD7v/I5YwS0IjUn7TAgWJwAT8I=", + "requires": { + "async-foreach": "0.1.3", + "chalk": "1.1.3", + "cross-spawn": "3.0.1", + "gaze": "1.1.2", + "get-stdin": "4.0.1", + "glob": "7.1.2", + "in-publish": "2.0.0", + "lodash.assign": "4.2.0", + "lodash.clonedeep": "4.5.0", + "meow": "3.7.0", + "mkdirp": "0.5.1", + "nan": "2.7.0", + "node-gyp": "3.6.2", + "npmlog": "4.1.2", + "request": "2.81.0", + "sass-graph": "2.2.4" + } + }, + "nodegit": { + "version": "0.20.3", + "resolved": "https://registry.npmjs.org/nodegit/-/nodegit-0.20.3.tgz", + "integrity": "sha1-pEFy2wjIM83LGrm7wsgyzgWJiBU=", + "requires": { + "fs-extra": "0.26.7", + "lodash": "4.17.4", + "nan": "2.7.0", + "node-gyp": "3.6.2", + "node-pre-gyp": "0.6.38", + "promisify-node": "0.3.0" + }, + "dependencies": { + "fs-extra": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz", + "integrity": "sha1-muH92UiXeY7at20JGM9C0MMYT6k=", + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "2.4.0", + "klaw": "1.3.1", + "path-is-absolute": "1.0.1", + "rimraf": "2.2.8" + } + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "requires": { + "graceful-fs": "4.1.11" + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + } + } + }, + "nodegit-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/nodegit-promise/-/nodegit-promise-4.0.0.tgz", + "integrity": "sha1-VyKxhPLfcycWEGSnkdLoQskWezQ=", + "requires": { + "asap": "2.0.6" + } + }, + "noder.io": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/noder.io/-/noder.io-1.2.0.tgz", + "integrity": "sha1-rSvGxsP5RliR7bxtv16E3K4vqeY=", + "dev": true + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "requires": { + "abbrev": "1.1.1" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "requires": { + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "5.4.1", + "validate-npm-package-license": "3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "nunjucks": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-2.5.2.tgz", + "integrity": "sha1-6n00bnhbikh0Zmw8yp4YxXf7oiw=", + "requires": { + "asap": "2.0.6", + "chokidar": "1.7.0", + "yargs": "3.32.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + }, + "yargs": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "requires": { + "camelcase": "2.1.1", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "os-locale": "1.4.0", + "string-width": "1.0.2", + "window-size": "0.1.4", + "y18n": "3.2.1" + } + } + } + }, + "nunjucks-date-filter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/nunjucks-date-filter/-/nunjucks-date-filter-0.1.1.tgz", + "integrity": "sha1-qTbUTSzJiY2Vxqt7KrpwhPpgq6Y=", + "requires": { + "moment": "2.19.1" + } + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" + }, + "object-path": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.9.2.tgz", + "integrity": "sha1-D9mnT8X60a45aLWGvaXGMr1sBaU=" + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "1.1.0" + } + }, + "openurl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", + "integrity": "sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=" + }, + "opn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", + "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", + "requires": { + "object-assign": "4.1.1", + "pinkie-promise": "2.0.1" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "0.0.8", + "wordwrap": "0.0.3" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" + } + }, + "options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=" + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", + "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "p-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", + "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", + "dev": true + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.1.0" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "1.3.1" + } + }, + "parsejson": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", + "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", + "requires": { + "better-assert": "1.0.2" + } + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "requires": { + "better-assert": "1.0.2" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "requires": { + "better-assert": "1.0.2" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "2.0.4" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "1.1.2" + } + }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "dev": true + }, + "portscanner": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.1.1.tgz", + "integrity": "sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y=", + "requires": { + "async": "1.5.2", + "is-number-like": "1.0.8" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" + }, + "prettier": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.8.2.tgz", + "integrity": "sha512-fHWjCwoRZgjP1rvLP7OGqOznq7xH1sHMQUFLX8qLRO79hI57+6xbc5vB904LxEkCfgFgyr3vv06JkafgCSzoZg==", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "progress": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "dev": true + }, + "promisify-node": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/promisify-node/-/promisify-node-0.3.0.tgz", + "integrity": "sha1-tLVaz5D6p9K4uQyjlomQhsAwYM8=", + "requires": { + "nodegit-promise": "4.0.0" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "qs": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.1.tgz", + "integrity": "sha1-zgPF/wk1vB2daanxTL0Y5WjWdiU=" + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "rc": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.2.tgz", + "integrity": "sha1-2M6ctX6NZNnHut2YdsfDTL48cHc=", + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "requires": { + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.3", + "set-immediate-shim": "1.0.1" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } + }, + "reduce-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/reduce-component/-/reduce-component-1.0.1.tgz", + "integrity": "sha1-4Mk1QsV0UhvqE98PlIjtgqt3xdo=", + "dev": true + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.1.0" + }, + "dependencies": { + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "0.1.0", + "resolve-from": "1.0.1" + } + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "resp-modifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", + "integrity": "sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08=", + "requires": { + "debug": "2.2.0", + "minimatch": "3.0.4" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "2.0.1", + "signal-exit": "3.0.2" + } + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=" + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "2.1.0" + } + }, + "rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=" + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "requires": { + "rx-lite": "4.0.8" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "samsam": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", + "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=", + "dev": true + }, + "sass-graph": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", + "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "requires": { + "glob": "7.1.2", + "lodash": "4.17.4", + "scss-tokenizer": "0.2.3", + "yargs": "7.1.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "requires": { + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "y18n": "3.2.1", + "yargs-parser": "5.0.0" + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "requires": { + "camelcase": "3.0.0" + } + } + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "requires": { + "js-base64": "2.3.2", + "source-map": "0.4.4" + } + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + }, + "send": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.15.2.tgz", + "integrity": "sha1-+R+rRAO8+H5xb3DOtdsvV4vcF9Y=", + "requires": { + "debug": "2.6.4", + "depd": "1.1.1", + "destroy": "1.0.4", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.0", + "http-errors": "1.6.2", + "mime": "1.3.4", + "ms": "1.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.3.1" + }, + "dependencies": { + "debug": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.4.tgz", + "integrity": "sha1-dYaps8OXQcAoKuM0RcTorHRzT+A=", + "requires": { + "ms": "0.7.3" + }, + "dependencies": { + "ms": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.3.tgz", + "integrity": "sha1-cIFVpeROM/X9D8U+gdDUCpG+H/8=" + } + } + }, + "fresh": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz", + "integrity": "sha1-9HTKXmqSRtb9jglTz6m5yAWvp44=" + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.3.1" + } + }, + "mime": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" + }, + "ms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-1.0.0.tgz", + "integrity": "sha1-Wa3NIu3FQ/e1OBhi0xOHsfS8lHM=" + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + } + } + }, + "serve-index": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.8.0.tgz", + "integrity": "sha1-fF2WwT+xMRAfk8HFd0+FFqHnjTs=", + "requires": { + "accepts": "1.3.4", + "batch": "0.5.3", + "debug": "2.2.0", + "escape-html": "1.0.3", + "http-errors": "1.5.1", + "mime-types": "2.1.17", + "parseurl": "1.3.2" + } + }, + "serve-static": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.2.tgz", + "integrity": "sha1-5UbicmCBuBtLzsjpCAjrzdMjr7o=", + "requires": { + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.15.2" + } + }, + "server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" + }, + "setprototypeof": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.2.tgz", + "integrity": "sha1-gaVSFB7BBLiOic44MQOtXGZWTQg=" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "should": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/should/-/should-6.0.3.tgz", + "integrity": "sha1-2u4weGpVdmL7x3TACNfFh5Htsdk=", + "dev": true, + "requires": { + "should-equal": "0.3.1", + "should-format": "0.0.7", + "should-type": "0.0.4" + } + }, + "should-equal": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-0.3.1.tgz", + "integrity": "sha1-vY6pemdI45+tR2o75v1y68LnK/A=", + "dev": true, + "requires": { + "should-type": "0.0.4" + } + }, + "should-format": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/should-format/-/should-format-0.0.7.tgz", + "integrity": "sha1-Hi74a9kdqcLgQSM1tWq6vZov3hI=", + "dev": true, + "requires": { + "should-type": "0.0.4" + } + }, + "should-type": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/should-type/-/should-type-0.0.4.tgz", + "integrity": "sha1-ATKgVBemEmhmQmrPEW8e1WI6XNA=", + "dev": true + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "sinon": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", + "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=", + "dev": true, + "requires": { + "formatio": "1.1.1", + "lolex": "1.3.2", + "samsam": "1.1.2", + "util": "0.10.3" + } + }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + } + } + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "requires": { + "hoek": "2.16.3" + } + }, + "socket.io": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.6.0.tgz", + "integrity": "sha1-PkDZMmN+a9kjmBslyvfFPoO24uE=", + "requires": { + "debug": "2.3.3", + "engine.io": "1.8.0", + "has-binary": "0.1.7", + "object-assign": "4.1.0", + "socket.io-adapter": "0.5.0", + "socket.io-client": "1.6.0", + "socket.io-parser": "2.3.1" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=" + }, + "object-assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", + "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=" + } + } + }, + "socket.io-adapter": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", + "integrity": "sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=", + "requires": { + "debug": "2.3.3", + "socket.io-parser": "2.3.1" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=" + } + } + }, + "socket.io-client": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.6.0.tgz", + "integrity": "sha1-W2aPT3cTBN/u0XkGRwg4b6ZxeFM=", + "requires": { + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "2.3.3", + "engine.io-client": "1.8.0", + "has-binary": "0.1.7", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseuri": "0.0.5", + "socket.io-parser": "2.3.1", + "to-array": "0.1.4" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=" + } + } + }, + "socket.io-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", + "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=", + "requires": { + "component-emitter": "1.1.2", + "debug": "2.2.0", + "isarray": "0.0.1", + "json3": "3.3.2" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": "1.0.1" + } + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "requires": { + "spdx-license-ids": "1.2.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=" + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=" + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sqlite-parser": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/sqlite-parser/-/sqlite-parser-0.14.5.tgz", + "integrity": "sha1-DuI7Ga/zdjoh7+Xa/lkItnvIqUo=" + }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + }, + "stream-throttle": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", + "integrity": "sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=", + "requires": { + "commander": "2.11.0", + "limiter": "1.1.2" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "requires": { + "get-stdin": "4.0.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "superagent": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-0.21.0.tgz", + "integrity": "sha1-+xUCeYR1HucVIgDmzSHNbhml3oc=", + "dev": true, + "requires": { + "component-emitter": "1.1.2", + "cookiejar": "2.0.1", + "debug": "2.2.0", + "extend": "1.2.1", + "form-data": "0.1.3", + "formidable": "1.0.14", + "methods": "1.0.1", + "mime": "1.2.11", + "qs": "1.2.0", + "readable-stream": "1.0.27-1", + "reduce-component": "1.0.1" + }, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "dev": true + }, + "combined-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", + "integrity": "sha1-ATfmV7qlp1QcV6w3rF/AfXO03B8=", + "dev": true, + "requires": { + "delayed-stream": "0.0.5" + } + }, + "delayed-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", + "integrity": "sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8=", + "dev": true + }, + "extend": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-1.2.1.tgz", + "integrity": "sha1-oPX9bPyDpf5J72mNYOyKYk3UV2w=", + "dev": true + }, + "form-data": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.3.tgz", + "integrity": "sha1-TuQ0bm61Ni6DRKAgdb2NvYxzc+o=", + "dev": true, + "requires": { + "async": "0.9.2", + "combined-stream": "0.0.7", + "mime": "1.2.11" + } + }, + "formidable": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.0.14.tgz", + "integrity": "sha1-Kz9MQRy7X91pXESEPiojUUpDIxo=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "methods": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.0.1.tgz", + "integrity": "sha1-dbyRlD3/19oDfPPusO1zoAN80Us=", + "dev": true + }, + "mime": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=", + "dev": true + }, + "qs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-1.2.0.tgz", + "integrity": "sha1-7Qeb4oaCFH5v2aNMwrDB4OxkU+4=", + "dev": true + }, + "readable-stream": { + "version": "1.0.27-1", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.27-1.tgz", + "integrity": "sha1-a2eYPCA1fO/QfwFlABoW1xDZEHg=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "supertest": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-0.15.0.tgz", + "integrity": "sha1-hhGGld5L5Yhps+6UxF4dCEyn+sU=", + "dev": true, + "requires": { + "methods": "1.1.2", + "superagent": "0.21.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "syntax-error": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.3.0.tgz", + "integrity": "sha1-HtkmbE1AvnXcVb+bsct3Biu5bKE=", + "requires": { + "acorn": "4.0.13" + } + }, + "table": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", + "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "dev": true, + "requires": { + "ajv": "5.5.1", + "ajv-keywords": "2.1.1", + "chalk": "2.3.0", + "lodash": "4.17.4", + "slice-ansi": "1.0.0", + "string-width": "2.1.1" + }, + "dependencies": { + "ajv": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.1.tgz", + "integrity": "sha1-s4u4h22ehr7plJVqBOch6IskjrI=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.1.tgz", + "integrity": "sha512-PPRybI9+jM5tjtCbN2cxmmRU7YmqT3Zv/UDy48tAh2XRkLa9bAORtSWLkVc13+GJF+cdTh1yEnHEk3cpTaL5Kg==", + "requires": { + "debug": "2.2.0", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.3.3", + "rimraf": "2.6.2", + "tar": "2.2.1", + "uid-number": "0.0.6" + }, + "dependencies": { + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "requires": { + "glob": "7.1.2" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "tfunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tfunk/-/tfunk-3.1.0.tgz", + "integrity": "sha1-OORBT8ZJd9h6/apy+sttKfgve1s=", + "requires": { + "chalk": "1.1.3", + "object-path": "0.9.2" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-iso-string": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/to-iso-string/-/to-iso-string-0.0.2.tgz", + "integrity": "sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE=", + "dev": true + }, + "toml": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.3.tgz", + "integrity": "sha512-O7L5hhSQHxuufWUdcTRPfuTh3phKfAZ/dqfxZFoxPCj2RYmpaSGLEIs016FCXItQwNr08yefUB5TSjzRYnajTA==" + }, + "toml-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/toml-js/-/toml-js-0.0.8.tgz", + "integrity": "sha1-ZI6m8aTWOxnAuzC47QPkDQlHOwo=" + }, + "tough-cookie": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "requires": { + "punycode": "1.4.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" + }, + "tryit": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", + "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.12", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.12.tgz", + "integrity": "sha1-BMgamb3V3FImPqKdJMa/jUgYpLs=" + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "optional": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "optional": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "optional": true + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true, + "optional": true + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true, + "optional": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", + "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=" + }, + "ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=" + }, + "underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=" + }, + "unit.js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unit.js/-/unit.js-2.0.0.tgz", + "integrity": "sha1-6RtWq8UMUw26A82/4OHfKj7jqjI=", + "dev": true, + "requires": { + "bluebird": "2.11.0", + "lodash": "3.10.1", + "must": "0.12.0", + "noder.io": "1.2.0", + "should": "6.0.3", + "sinon": "1.17.7", + "supertest": "0.15.0" + } + }, + "universalify": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", + "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" + }, + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "walk": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.9.tgz", + "integrity": "sha1-MbTbZnjyrgHDnqn7hyWpAx5Vins=", + "requires": { + "foreachasync": "3.0.0" + } + }, + "weinre": { + "version": "2.0.0-pre-I0Z7U9OV", + "resolved": "https://registry.npmjs.org/weinre/-/weinre-2.0.0-pre-I0Z7U9OV.tgz", + "integrity": "sha1-/viqIjkh97QLu71MPtQwL2/QqBM=", + "requires": { + "express": "2.5.11", + "nopt": "3.0.6", + "underscore": "1.7.0" + } + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + }, + "wide-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "requires": { + "string-width": "1.0.2" + } + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "0.5.1" + } + }, + "ws": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.1.tgz", + "integrity": "sha1-CC3bbGQehdS7RR8D1S8G6r2x8Bg=", + "requires": { + "options": "0.0.6", + "ultron": "1.0.2" + } + }, + "wtf-8": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", + "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=" + }, + "xmlhttprequest-ssl": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", + "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yargs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.4.0.tgz", + "integrity": "sha1-gW4ahm1VmMzzTlWW3c4i2S2kkNQ=", + "requires": { + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "window-size": "0.2.0", + "y18n": "3.2.1", + "yargs-parser": "4.2.1" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, + "window-size": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=" + } + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "requires": { + "camelcase": "3.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + } + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" + } + } +} diff --git a/package.json b/package.json index d2f4e935a858a0ecbeccd81a7dafe4f4ce49ff0a..1869fe5695347369c8d89119827e265329ddbe07 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "filendir": "^1.0.0", "highlight.js": "^9.2.0", "jsesc": "^1.0.0", + "latinize": "^0.4.0", "marked": "^0.3.5", "mkdirp": "^0.5.1", "moment": "^2.12.0", @@ -30,8 +31,15 @@ "walk": "^2.3.9" }, "devDependencies": { + "babel-eslint": "^8.0.3", + "eslint": "^4.12.1", + "eslint-config-airbnb-base": "^12.1.0", + "eslint-config-prettier": "^2.9.0", + "eslint-plugin-import": "^2.8.0", + "eslint-plugin-prettier": "^2.3.1", "istanbul": "^0.4.2", "mocha": "^2.3.4", + "prettier": "^1.8.2", "unit.js": "^2.0.0" }, "optionalDependencies": { diff --git a/sitegin/config.js b/sitegin/config.js index ac876304ec5342004a97d8a04fe88f96a1e4ef3c..216577f466fca5d21a010602accfbcb113868d8b 100644 --- a/sitegin/config.js +++ b/sitegin/config.js @@ -1,64 +1,91 @@ -'use strict'; /* * This file specifies whole configuration of sitegin. * It reads config file from content/config.toml it also parses command-line * arguments. CLI args take precedence over config options */ -var Git = require('nodegit'); -var cli = require('cli'); -var fs = require('fs'); -var path = require('path'); -var toml = require('toml'); -var options = cli.parse({ - noserver: ['n', 'Dont run server'], - port: ['p', 'Port on which server should run', 'number', 1337], - uiport: [null, 'BrowserSync UI port', 'number', 'port+1'], - httpsonly: [null, 'Converts all http://ok1kvk.cz links to https'], - httponly: [null, 'Converts all https://ok1kvk.cz links to http'], - contentdir: [null, 'Allows to specify arbitrary content directory.', 'string', 'content'], - themedir: [null, 'Allows to specify arbitrary content directory.', 'string', 'theme'], - builddir: [null, 'Allows to specify arbitrary content directory.', 'string', null], - staticdir: [null, 'Allows to specify arbitrary directory for static files.', 'string', 'static'], - baseurl: [null, 'BaseURL without trailing /', 'string', ''], - nowatch: [null, 'Disable watching for changes'], - debugarticle: [null, 'Article for which extra information should be printed out. Full file path '+ - 'relative to contentdir (Ex. articles/2010/hello-word.md)','string', null] -}); +const cli = require('cli') +const fs = require('fs') +const path = require('path') +const toml = require('toml') -module.exports = function() { - console.log('Build step: Config'); - var builddir = 'build'; - if(options.builddir) - builddir = options.builddir; - else if(!options.noserver) builddir = 'build-debug'; +const options = cli.parse({ + noserver: ['n', 'Dont run server'], + port: ['p', 'Port on which server should run', 'number', 1337], + uiport: [null, 'BrowserSync UI port', 'number', 'port+1'], + httpsonly: [null, 'Converts all http://ok1kvk.cz links to https'], + httponly: [null, 'Converts all https://ok1kvk.cz links to http'], + contentdir: [ + null, + 'Allows to specify arbitrary content directory.', + 'string', + 'content', + ], + themedir: [ + null, + 'Allows to specify arbitrary content directory.', + 'string', + 'theme', + ], + builddir: [ + null, + 'Allows to specify arbitrary content directory.', + 'string', + null, + ], + staticdir: [ + null, + 'Allows to specify arbitrary directory for static files.', + 'string', + 'static', + ], + baseurl: [null, 'BaseURL without trailing /', 'string', ''], + nowatch: [null, 'Disable watching for changes'], + debugarticle: [ + null, + 'Article for which extra information should be printed out. Full file path ' + + 'relative to contentdir (Ex. articles/2010/hello-word.md)', + 'string', + null, + ], +}) - if(options.uiport == 'port+1') { - options.uiport = options.port+1; +module.exports = () => { + console.log('Build step: Config') + let builddir = 'build' + if (options.builddir) ({ builddir } = options) + else if (!options.noserver) builddir = 'build-debug' + + if (options.uiport === 'port+1') { + options.uiport = options.port + 1 } - return new Promise(function(resolve, reject) { - var config = { - options: options, - builddir: builddir, + return new Promise(resolve => { + const config = { + options, + builddir, sourceDir: options.contentdir, staticDir: options.staticdir, themeDir: options.themedir, articlesLocation: 'articles', redirectsLocation: 'redirects', - linksPerPage: 6 - }; - var configFile = path.join(config.sourceDir, 'config.toml'); - fs.readFile(configFile,'utf-8',function(err,data) { - if(err) { - console.log('Failed to read configuration from '+configFile); + linksPerPage: 6, + } + const configFile = path.join(config.sourceDir, 'config.toml') + fs.readFile(configFile, 'utf-8', (err, data_) => { + if (err) { + console.log(`Failed to read configuration from ${configFile}`) console.log('Using defaults') - return resolve({config: config}); + resolve({ config }) + return + } + const data = toml.parse(data_) + for (const attr of Object.keys(config)) { + data[attr] = config[attr] } - data = toml.parse(data); - for(let attr in config) { data[attr] = config[attr]; } - resolve({config: data}); + resolve({ config: data }) }) }) } -module.exports.watch = !options.noserver; -module.exports.themeDir = options.themedir; +module.exports.watch = !options.noserver +module.exports.themeDir = options.themedir +module.exports.options = options diff --git a/sitegin/gitInfo.js b/sitegin/gitInfo.js index 3d02d80e41a12bd1ce7bee50a04bb131a28ff45a..2a448fa0de8b768f1c6e3f3e97469af1fac7ee0b 100644 --- a/sitegin/gitInfo.js +++ b/sitegin/gitInfo.js @@ -1,216 +1,215 @@ -'use strict'; /* * Add date: {creation, modification, modified} and author: {name, email} * to metadata if not already present */ -var nodegit = require('nodegit'); -var path = require('path'); -var moment = require('moment'); +const nodegit = require('nodegit') +const path = require('path') +const moment = require('moment') // Returns promise for patch of single commit -var gitShow = function(repo, commitData) { - var commit, tree, parentTree; +const gitShow = (repo, commitData) => { + let commit + let tree + let parentTree return nodegit.Revparse.single(repo, commitData.commit) - .then((obj) => { - return nodegit.Commit.lookup(repo, obj.id()); + .then(obj => nodegit.Commit.lookup(repo, obj.id())) + .then(_commit => { + commit = _commit + if (commit.parentcount() < 1) return null + return commit.getParents(1) }) - .then((_commit) => { - commit = _commit; - if(commit.parentcount() < 1) return null; - return commit.getParents(1); + .then(parents => { + if (parents === null) return null + return parents[0].getTree() }) - .then((parents) => { - if(parents === null) return null; - return parents[0].getTree(); + .then(_parentTree => { + parentTree = _parentTree + return commit.getTree() }) - .then((_parentTree) => { - parentTree = _parentTree; - return commit.getTree(); + .then(_tree => { + tree = _tree + return nodegit.Diff.treeToTree(repo, parentTree, tree, null) }) - .then((_tree) => { - tree = _tree; - return nodegit.Diff.treeToTree(repo, parentTree, tree, null); - }) - .then((diff) => { - return diff.patches(); - }) - .then((patches) => { - return [ - patches, - commitData - ]; - }); + .then(diff => diff.patches()) + .then(patches => [patches, commitData]) } -var gitlog = function(repo) { - var map = function(repo){ - return Promise.resolve() - .then(function(){ - return function(commit){ - var author = commit.author(); - var sha = commit.sha(); - - return { - 'commit': sha, - 'author': { - 'name': author.name(), - 'email': author.email() - }, - 'date': commit.date(), - 'message': commit.message() - }; - }; - }); - }; - +const gitlog = repo => { + const map = () => + Promise.resolve().then(() => commit => { + const author = commit.author() + const sha = commit.sha() - return repo.getHeadCommit() - .then(function(commit) { - return new Promise(function(resolve, reject){ - commit.history() - .on('end', resolve) - .on('error', reject) - .start(); + return { + commit: sha, + author: { + name: author.name(), + email: author.email(), + }, + date: commit.date(), + message: commit.message(), + } }) - .then(function(commits){ - return map(repo) - .then(function(log){ - return commits.map(log); - }); - }); - }); -}; -var getFilesHistory = function(repo, startCommitMessage) { - if(!Array.isArray(startCommitMessage) && startCommitMessage !== undefined) { - startCommitMessage = [startCommitMessage]; + return repo.getHeadCommit().then(commit => + new Promise((resolve, reject) => { + commit + .history() + .on('end', resolve) + .on('error', reject) + .start() + }).then(commits => map().then(log => commits.map(log))), + ) +} + +const getFilesHistory = (repo, _startCommitMessage) => { + let startCommitMessage = _startCommitMessage + if (!Array.isArray(startCommitMessage) && startCommitMessage !== undefined) { + startCommitMessage = [startCommitMessage] } return Promise.resolve() - .then(function() { - return gitlog(repo) - }) - .then(function(log){ - var promises = []; - for(var i = 0; i < log.length; i++) { - promises.push(gitShow(repo, log[i])); - } - return Promise.all(promises); - }) - .then(function(diffs) { - var filehistory = {}; - diffs.forEach(function(data) { - var commit = data[1]; - var diff = data[0]; + .then(() => gitlog(repo)) + .then(log => { + const promises = [] + for (let i = 0; i < log.length; i += 1) { + promises.push(gitShow(repo, log[i])) + } + return Promise.all(promises) + }) + .then(diffs => { + const filehistory = {} + diffs.forEach(data => { + const commit = data[1] + const diff = data[0] - diff.forEach(function(entry) { - var p = path.normalize(entry.newFile().path()); - if(filehistory[p]===undefined) { - filehistory[p] = []; - } - filehistory[p].push(commit); - }); - }); - return filehistory; - }) - .then(function(log) { - var sorter = function (a, b) { - var rhs = a.date; - var lhs = b.date; - return lhs > rhs ? 1 : lhs < rhs ? -1 : 0; - }; - for(var file in log) { - log[file].sort(sorter); - } - return log; - }) - .then(function(log) { - if(startCommitMessage === undefined) return log; - function mergeCommit(commits) { - var r; - commits.reverse(); - commits.forEach(function(commit) { - if(r === undefined) - startCommitMessage.forEach(function(matcher) { - if(commit.message.indexOf(matcher) > -1) r = commit; + diff.forEach(entry => { + const p = path.normalize(entry.newFile().path()) + if (filehistory[p] === undefined) { + filehistory[p] = [] + } + filehistory[p].push(commit) }) }) - commits.reverse(); - return r; - } - for(var file in log) { - log[file].mergeCommit = mergeCommit(log[file]); - } - return log; - }); -} - -module.exports = function(obj) { - console.log('Build step: GitInfo'); - let pathToRepo = path.resolve(obj.config.sourceDir); - return new Promise(function(resolve,reject) { - return nodegit.Repository.open(pathToRepo) - .catch(function() { - resolve(obj); + return filehistory }) - .then(function(repo) { - return getFilesHistory(repo, obj.config.git.mergeMessage); + .then(log => { + const sorter = (a, b) => { + const rhs = a.date + const lhs = b.date + return lhs > rhs ? 1 : lhs < rhs ? -1 : 0 + } + for (const file of Object.keys(log)) { + log[file].sort(sorter) + } + return log }) - .then(function(hist) { - if(obj.config.options.debugarticle !== null) { - var log = hist[obj.config.options.debugarticle]; - log.forEach(function(commit) { - console.log(' '+commit.date+' '+commit.author.email+'\t'+commit.message.replace(/\n([^]*)$/,'')); + .then(log => { + if (startCommitMessage === undefined) return log + function mergeCommit(commits) { + let r + commits.reverse() + commits.forEach(commit => { + if (r === undefined) + startCommitMessage.forEach(matcher => { + if (commit.message.indexOf(matcher) > -1) r = commit + }) }) - console.log() - console.log(' Starting commit: '+log.mergeCommit.message.replace(/\n([^]*)$/,'')) + commits.reverse() + return r } - return hist; + for (const file of Object.keys(log)) { + // eslint-disable-next-line no-param-reassign + log[file].mergeCommit = mergeCommit(log[file]) + } + return log }) - .then((filesHistory) => { - obj.pages.forEach(function(article) { - var file = path.relative(pathToRepo, article.filename); - var commits = filesHistory[file]; - if(commits !== undefined) { - commits.sort(function(a,b){ - return b.date - a.date; - }); - var newestCommit = commits[0]; - var oldestCommit = commits[commits.length-1]; - var mergeCommit = commits.mergeCommit; +} - if(article.metadata.date === undefined) - article.metadata.date = {}; +module.exports = obj => { + console.log('Build step: GitInfo') + const pathToRepo = path.resolve(obj.config.sourceDir) + return new Promise((resolve, reject) => + nodegit.Repository.open(pathToRepo) + .catch(() => { + resolve(obj) + }) + .then(repo => getFilesHistory(repo, obj.config.git.mergeMessage)) + .then(hist => { + if (obj.config.options.debugarticle !== null) { + const log = hist[obj.config.options.debugarticle] + log.forEach(commit => { + console.log( + ` ${commit.date} ${ + commit.author.email + }\t${commit.message.replace(/\n([^]*)$/, '')}`, + ) + }) + console.log() + console.log( + ` Starting commit: ${log.mergeCommit.message.replace( + /\n([^]*)$/, + '', + )}`, + ) + } + return hist + }) + .then(filesHistory => { + obj.pages.forEach(article => { + const file = path.relative(pathToRepo, article.filename) + const commits = filesHistory[file] + if (commits !== undefined) { + commits.sort((a, b) => b.date - a.date) + const newestCommit = commits[0] + const oldestCommit = commits[commits.length - 1] + const { mergeCommit } = commits - if(article.metadata.date.creation === undefined) { - if(mergeCommit === undefined) { - console.log('[Warning] Article '+ file +' does not have merge commit.'); - article.metadata.date.creation = moment(); - } else - article.metadata.date.creation = mergeCommit.date; - } + // eslint-disable-next-line no-param-reassign + if (article.metadata.date === undefined) article.metadata.date = {} - article.metadata.date.modification = newestCommit.date; + if (article.metadata.date.creation === undefined) { + if (mergeCommit === undefined) { + console.log( + `[Warning] Article ${file} does not have merge commit.`, + ) + // eslint-disable-next-line no-param-reassign + article.metadata.date.creation = moment() + } else { + // eslint-disable-next-line no-param-reassign + article.metadata.date.creation = mergeCommit.date + } + } - if(article.metadata.author === undefined) - article.metadata.author = {} - if(article.metadata.author.name === undefined) - article.metadata.author.name = oldestCommit.author.name - if(article.metadata.author.email === undefined) - article.metadata.author.email = oldestCommit.author.email + // eslint-disable-next-line no-param-reassign + article.metadata.date.modification = newestCommit.date - article.commits = commits; - } else { - console.log('[Warning] Article '+ file +' is not in git repository.'); - } - }); - return obj; - }) - .then(function(o) { - resolve(o); - }) - .catch(function(e){ - reject(e); - }); - }) + if (article.metadata.author === undefined) { + // eslint-disable-next-line no-param-reassign + article.metadata.author = {} + } + if (article.metadata.author.name === undefined) { + // eslint-disable-next-line no-param-reassign + article.metadata.author.name = oldestCommit.author.name + } + if (article.metadata.author.email === undefined) { + // eslint-disable-next-line no-param-reassign + article.metadata.author.email = oldestCommit.author.email + } + + // eslint-disable-next-line no-param-reassign + article.commits = commits + } else { + console.log(`[Warning] Article ${file} is not in git repository.`) + } + }) + return obj + }) + .then(o => { + resolve(o) + }) + .catch(e => { + reject(e) + }), + ) } diff --git a/sitegin/image.js b/sitegin/image.js index 6e6cd28201edb3a7d6ed9a25a7da8c084ebbfe65..ac32aeee95e175bec8bf7760531ed630693e39be 100644 --- a/sitegin/image.js +++ b/sitegin/image.js @@ -1,127 +1,126 @@ -'use strict'; +const youtube = require('./utils/youtube.js') +const path = require('path') +const url = require('url') +const jobs = require('./jobs') +const { rewriteURL } = require('./urls') -var youtube = require('./utils/youtube.js'); -var path = require('path'); -var url = require('url'); -var jobs = require('./jobs'); -var rewriteURL = require('./urls').rewriteURL; +const generateImage = (file, targetDir, width, height) => + jobs.run('imageResizer', file, targetDir, width, height) -var generateImage = function(file, targetDir, width, height) { - return jobs.run('imageResizer', file, targetDir, width, height); -} - -var paramInHrefParser = function(href) { - var sepIndex = href.indexOf(' ='); - var ret = { - href: href, - options: {} +const paramInHrefParser = href => { + const sepIndex = href.indexOf(' =') + const ret = { + href, + options: {}, } - if(sepIndex < 0) { - return ret; - } else { - ret.href = href.substr(0, sepIndex); - var options = href.substr(sepIndex+2); - options = options // split by ',' but not '\,' - .replace('a,','\u0007') - .split(',') - .map(function(e) {return e.replace('\u0007','a,')}); - options.forEach(function(option) { - var index = option.indexOf('='); - if(index < 0) { - ret.options[option] = true; - } else { - var key = option.substr(0,index); - var value = option.substr(index+1); - ret.options[key] = value; - } - }); - return ret; + if (sepIndex < 0) { + return ret } + ret.href = href.substr(0, sepIndex) + let options = href.substr(sepIndex + 2) + options = options // split by ',' but not '\,' + .replace('a,', '\u0007') + .split(',') + .map(e => e.replace('\u0007', 'a,')) + options.forEach(option => { + const index = option.indexOf('=') + if (index < 0) { + ret.options[option] = true + } else { + const key = option.substr(0, index) + const value = option.substr(index + 1) + ret.options[key] = value + } + }) + return ret } -var renderYoutube = function(href, options) { - var info = youtube.info(href); - let out = '<div class="video-container"><div class="videodiv">'; - out += '<iframe src="https://www.youtube.com/embed/'+info.videoid+ - '?modestbranding&start='+info.time+'" frameborder="0" allowfullscreen></iframe>' +const renderYoutube = href => { + const info = youtube.info(href) + let out = '<div class="video-container"><div class="videodiv">' + out += `${`<iframe src="https://www.youtube.com/embed/${info.videoid}` + + '?modestbranding&start='}${ + info.time + }" frameborder="0" allowfullscreen></iframe>` out += '</div></div>' - return out; + return out } -module.exports = function(href, title, text, curFile, cfg) { - var parsed = paramInHrefParser(href); - href = parsed.href; - var options = parsed.options; +module.exports = (href_, title, text, curFile_, cfg) => { + let curFile = curFile_ + const parsed = paramInHrefParser(href_) + const { href } = parsed + const { options } = parsed - for(let option in options) { - if( !options.hasOwnProperty(option) ) continue; - - if(option.match(/x[0-9]+/) || option.match(/[0-9]+x[0-9]*/)) { // 123x or x123 or 123x123 - options.size = option.split('x'); - if(options.size !== undefined) { - if(options.size[0].length > 0) { - options.width = options.size[0]; + for (const option of Object.keys(options)) { + if (option.match(/x[0-9]+/) || option.match(/[0-9]+x[0-9]*/)) { + // 123x or x123 or 123x123 + options.size = option.split('x') + if (options.size !== undefined) { + if (options.size[0].length > 0) { + options.width = options.size[0] } - if(options.size.length > 1 && options.size[1].length > 0) { - options.height = options.size[1]; + if (options.size.length > 1 && options.size[1].length > 0) { + options.height = options.size[1] } } } } - if(youtube.isVideo(href)) { - return renderYoutube(href, options); - } else { - var genHTML = function(file, norel) { - var rel = file; - if(!norel) path.relative(process.cwd(),file); - - var out = '<img src="' + rel + '" alt="' + text + '"'; - if(options.width) { - out += ' width="' + options.width + '"'; - } - if(options.height) { - out += ' height="' + options.height + '"'; - } - if (title) { - out += ' title="' + title + '"'; - } + if (youtube.isVideo(href)) { + return renderYoutube(href, options) + } + const genHTML = (file, norel) => { + const rel = file + if (!norel) path.relative(process.cwd(), file) - out += '>'; - if(!options.nolightbox) { // if lightbox - var a = '<a href="'+href+'"'; - a += ' data-lightbox="group"'; - a += ' data-title="' + text + '"'; - a += '>'; - out = a+out+'</a>'; - } - return out; + let out = `<img src="${rel}" alt="${text}"` + if (options.width) { + out += ` width="${options.width}"` + } + if (options.height) { + out += ` height="${options.height}"` + } + if (title) { + out += ` title="${title}"` } - var parsedHref = url.parse(href); - - if(parsedHref.host) { - return genHTML(href, true); - } else if(path.isAbsolute(href)) { - return genHTML(href); - } else { - curFile = curFile.replace(/\.md$/,''); - var targetDir = rewriteURL(curFile); - targetDir = path.resolve(cfg.builddir, targetDir); - var absSrc = path.resolve(cfg.staticDir, curFile, href); - if(!options.size) options.size = []; - var w = options.size[0], - h = options.size[1]; - if(w === '') w = undefined; else w = Number(w); - if(h === '') h = undefined; else h = Number(h); - if(w === undefined && h === undefined) w = 512; - var file = generateImage(absSrc, targetDir, w, h); - return genHTML(file); + out += '>' + if (!options.nolightbox) { + // if lightbox + let a = `<a href="${href}"` + a += ' data-lightbox="group"' + a += ` data-title="${text}"` + a += '>' + out = `${a + out}</a>` } + return out + } + const parsedHref = url.parse(href) + + if (parsedHref.host) { + return genHTML(href, true) + } else if (path.isAbsolute(href)) { + return genHTML(href) } + curFile = curFile.replace(/\.md$/, '') + let targetDir = rewriteURL(curFile) + targetDir = path.resolve(cfg.builddir, targetDir) + const absSrc = path.resolve(cfg.staticDir, curFile, href) + + if (!options.size) options.size = [] + let w = options.size[0] + let h = options.size[1] + if (w === '') w = undefined + else w = Number(w) + if (h === '') h = undefined + else h = Number(h) + if (w === undefined && h === undefined) w = 512 + const file = generateImage(absSrc, targetDir, w, h) + return genHTML(file) } module.exports._test = { - paramInHrefParser: paramInHrefParser + paramInHrefParser, } diff --git a/sitegin/imageResizer.js b/sitegin/imageResizer.js index f3e7ae2e044f274149af0cca923330dae886c11c..a3f1f12e3cccf0760453f203b1879a96fff3dd30 100644 --- a/sitegin/imageResizer.js +++ b/sitegin/imageResizer.js @@ -1,59 +1,66 @@ -'use strict'; -var lwip; -var path = require('path'); -try {lwip = require('lwip');} -catch(e) { +let lwip +const path = require('path') + +try { + // eslint-disable-next-line import/no-extraneous-dependencies, global-require, import/no-unresolved + lwip = require('lwip') +} catch (e) { lwip = null - console.log('WARNING! LWIP is not installed - image minification won\'t work.'); - console.log('You can try to run npm install.'); - console.log('If it does not help try to make npm install lwip work.'); + console.log("WARNING! LWIP is not installed - image minification won't work.") + console.log('You can try to run npm install.') + console.log('If it does not help try to make npm install lwip work.') } -var mkdirp = require('mkdirp'); -var path = require('path'); +const mkdirp = require('mkdirp') -module.exports = function(file, targetDir, width, height) { - if(lwip && (width || height)) { - let tmp = path.basename(file).split('.'); - tmp.splice(-1,1); - let base = tmp.join('.'); - let targetFile = base+'_thumb_'; - if(width) targetFile += width; - targetFile += 'x'; - if(height) targetFile += height; - targetFile += '.png'; - let ret = targetFile; - targetFile = path.resolve(targetDir,targetFile); - lwip.open(file, function(err, image) { +module.exports = function imageResizer(file, targetDir, _width, _height) { + let width = _width + let height = _height + if (lwip && (width || height)) { + const tmp = path.basename(file).split('.') + tmp.splice(-1, 1) + const base = tmp.join('.') + let targetFile = `${base}_thumb_` + if (width) targetFile += width + targetFile += 'x' + if (height) targetFile += height + targetFile += '.png' + const ret = targetFile + targetFile = path.resolve(targetDir, targetFile) + lwip.open(file, (err, image) => { function doResize() { - mkdirp(path.dirname(targetFile), function() { - image.batch() - .resize(width, height) - .writeFile(targetFile, function(err) { - if(err) console.log(err); - }); + mkdirp(path.dirname(targetFile), () => { + image + .batch() + .resize(width, height) + .writeFile(targetFile, e => { + if (e) console.log(e) + }) }) } - if(err) return console.log(err); - var w = image.width(), h = image.height(); - if(width && height) { - doResize(); - } else if(height) { - if(h > height) { - width = Math.round(height*w/h); - doResize(); + if (err) { + console.log(err) + return + } + const w = image.width() + const h = image.height() + if (width && height) { + doResize() + } else if (height) { + if (h > height) { + width = Math.round(height * w / h) + doResize() } - } else if(width) { - if(w > width) { - height = Math.round(width*h/w); - doResize(); + } else if (width) { + if (w > width) { + height = Math.round(width * h / w) + doResize() } } else { - console.log(new Error('Panic! Code should never get here!')); + console.log(new Error('Panic! Code should never get here!')) } }) - return ret; - } else { - return path.basename(file); + return ret } + return path.basename(file) } diff --git a/sitegin/jobs.js b/sitegin/jobs.js index 128290e7269562a7833f52f5f38f3913e0e88350..469aabac425fe0da5ebdc925dd648480fde100b2 100644 --- a/sitegin/jobs.js +++ b/sitegin/jobs.js @@ -1,161 +1,158 @@ -'use strict'; +const syntaxError = require('syntax-error') +const fs = require('fs') +const chokidar = require('chokidar') -var syntaxError = require('syntax-error'); -var fs = require('fs'); -var chokidar = require('chokidar'); -var eventEmitter = new (require('events').EventEmitter)(); - -var jobList = {}; -var watchers = []; +const jobList = {} +let watchers = [] function JobError(message, name) { - Error.captureStackTrace(this, JobError); - this.name = name+'Error'; - this.message = message; - return this; + Error.captureStackTrace(this, JobError) + this.name = `${name}Error` + this.message = message + return this } -var onReload = function() {} -var requireError = function(e, jobName, module, reject) { - if(e instanceof SyntaxError) { - console.log(module+': '+e); - var resolved = require.resolve(module); - fs.readFile(resolved, 'utf8', function(err, content) { - console.log(syntaxError(content,resolved)); - reject(new JobError('Failed to register job '+jobName+' (SyntaxError)','Require')) +let onReload = () => {} +const requireError = (e, jobName, module, reject) => { + if (e instanceof SyntaxError) { + console.log(`${module}: ${e}`) + const resolved = require.resolve(module) + fs.readFile(resolved, 'utf8', (err, content) => { + console.log(syntaxError(content, resolved)) + reject( + new JobError( + `Failed to register job ${jobName} (SyntaxError)`, + 'Require', + ), + ) }) } else { - if(e.code === 'MODULE_NOT_FOUND') - console.log(e.toString()); - reject(new JobError('Failed to register job '+jobName+' ('+e+')','Require')) + if (e.code === 'MODULE_NOT_FOUND') console.log(e.toString()) + reject(new JobError(`Failed to register job ${jobName} (${e})`, 'Require')) } } -var jobs = { - register: function(jobName, module, watch) { - return new Promise(function(resolve, reject) { - if(watch === undefined) watch = true; - if(jobList[jobName] !== undefined) { - return Promise.reject( - new JobError('Job '+jobName+' is already registered', 'JobAlreadyRegistered') +const jobs = { + register(jobName, module, watch = true) { + return new Promise((resolve, reject) => { + if (jobList[jobName] !== undefined) { + Promise.reject( + new JobError( + `Job ${jobName} is already registered`, + 'JobAlreadyRegistered', + ), ) + return } - var f; + let f try { - f = require(module); - } catch(e) { - requireError(e, jobName, module, reject); - return; + // eslint-disable-next-line global-require, import/no-dynamic-require + f = require(module) + } catch (e) { + requireError(e, jobName, module, reject) + return } - if(typeof f !== 'function') - throw new JobError('Module "'+module+'" for job "'+jobName+'" does not export function'); + if (typeof f !== 'function') + throw new JobError( + `Module "${module}" for job "${jobName}" does not export function`, + ) jobList[jobName] = { - f: f, - module: module - }; - if(watch) jobs.watch(jobName); - resolve(); - - }); + f, + module, + } + if (watch) jobs.watch(jobName) + resolve() + }) }, - reload: function(jobName) { - var module = jobList[jobName].module; - delete require.cache[require.resolve(module)]; + reload(jobName) { + const { module } = jobList[jobName] + delete require.cache[require.resolve(module)] - return new Promise(function(resolve, reject) { + return new Promise((resolve, reject) => { try { - var f = require(module); - if(typeof f === 'function') { - var job = { - f: f, - module: module - }; - delete jobList[jobName]; - jobList[jobName] = job; - resolve(); + // eslint-disable-next-line global-require, import/no-dynamic-require + const f = require(module) + if (typeof f === 'function') { + const job = { + f, + module, + } + delete jobList[jobName] + jobList[jobName] = job + resolve() } else { - console.log('Error reloading job '+jobName+' retry in 500ms'); - setTimeout(function() { + console.log(`Error reloading job ${jobName} retry in 500ms`) + setTimeout(() => { resolve(jobs.reload(jobName)) - },500) + }, 500) } - } catch(e) { - console.log(e); - requireError(e, jobName, module, reject); + } catch (e) { + console.log(e) + requireError(e, jobName, module, reject) } - }); + }) }, // registerMultiple( // {watch: true}, // ['jobName','./module'],['jobName2','./module2'] // ) - registerMultiple: function() { - var regs = []; - var watch = true; - var i; - for(i in arguments) { - var job = arguments[i]; - if(i === '0') { - if(job.watch !== undefined) watch = job.watch; - } else { - regs.push(jobs.register(job[0], job[1], watch)); - } + registerMultiple({ watch = true }, ...args) { + const regs = [] + for (const job of args) { + regs.push(jobs.register(job[0], job[1], watch)) } - return Promise.all(regs); + return Promise.all(regs) }, - run: function() { - var jobName = arguments[0]; - if(jobList[jobName] === undefined) { - throw new JobError('Job '+jobName+' is not registered', 'JobNotRegistered') + run(jobName, ...args) { + if (jobList[jobName] === undefined) { + throw new JobError(`Job ${jobName} is not registered`, 'JobNotRegistered') } try { - return jobList[jobName].f.apply(null, Array.prototype.slice.call(arguments, 1)); - } catch(e) { - console.log('Error running job',jobName); - console.log(jobList[jobName]); - throw e; + return jobList[jobName].f(...args) + } catch (e) { + console.log('Error running job', jobName) + console.log(jobList[jobName]) + throw e } }, - runSequence: function() { - var prom; - console.log('Running',Array.prototype.slice.call(arguments, 0)) - var jobSequence = [].splice.call(arguments, 0); - jobSequence.forEach(function(job){ - if(prom === undefined) { - prom = jobs.run(job); + runSequence(...args) { + let prom + console.log('Running', args) + const jobSequence = args + jobSequence.forEach(job => { + if (prom === undefined) { + prom = jobs.run(job) } else { - prom = prom.then(function() { - var args = [].splice.call(arguments, 0); - args.splice(0,0,job); - return jobs.run.apply(null,args) + prom = prom.then((...a) => { + a.splice(0, 0, job) + return jobs.run(...a) }) } - }); - return prom; + }) + return prom + }, + watch(jobName) { + const { module } = jobList[jobName] + const file = require.resolve(module) + const w = chokidar.watch(file) + w.on('change', () => { + jobs.reload(jobName).then(onReload) + }) + watchers.push(w) }, - watch: function(jobName) { - var module = jobList[jobName].module; - var file = require.resolve(module); - var w = chokidar.watch(file); - w.on('change', path => { - jobs.reload(jobName) - .then(onReload); - }); - watchers.push(w); + onReload(f) { + onReload = f }, - onReload: function(f) { - onReload = f; + close() { + watchers.forEach(w => { + w.close() + console.log(w.getWatched()) + }) + watchers = [] }, - close: function() { - watchers.forEach(function(w) { - w.close(); - console.log(w.getWatched()); - }); - watchers = []; - } } -module.exports = jobs; -module.exports.jobList = jobList; +module.exports = jobs +module.exports.jobList = jobList diff --git a/sitegin/markdown.js b/sitegin/markdown.js index e7fe5ecc6eedf8a60546e2a1f158080d537705b3..c36e26f741d09b79332d0fc0653d398bf21725a6 100644 --- a/sitegin/markdown.js +++ b/sitegin/markdown.js @@ -1,29 +1,28 @@ -'use strict'; /* * Transforms pages[0..length].content from markdown to HTML */ -var marked = require('marked'); -var renderer = new marked.Renderer(); -var highlightjs = require('highlight.js'); -var jobs = require('./jobs'); +const marked = require('marked') -var lang; +const renderer = new marked.Renderer() +const highlightjs = require('highlight.js') +const jobs = require('./jobs') -var opts = { - highlight: function (code) { - var h; - if(lang) { - if(highlightjs.getLanguage(lang)) - h = highlightjs.highlight(lang, code, true); - else - h = highlightjs.highlight(code); +let lang + +const opts = { + highlight(code) { + let h + if (lang) { + if (highlightjs.getLanguage(lang)) + h = highlightjs.highlight(lang, code, true) + else h = highlightjs.highlight(code) } else { - h = highlightjs.highlightAuto(code); + h = highlightjs.highlightAuto(code) } - return h.value; + return h.value }, - renderer: renderer, + renderer, gfm: true, tables: true, breaks: false, @@ -31,60 +30,49 @@ var opts = { sanitize: false, smartLists: true, smartypants: false, -}; +} -var parser = new marked.Parser(opts); -var lexer = new marked.Lexer(opts); +const parser = new marked.Parser(opts) +const lexer = new marked.Lexer(opts) -var toURL = function(url) { - return jobs.run('toURL', url); -} +const toURL = url => jobs.run('toURL', url) -var renderImage = function(href, title, text, curFilename, cfg) { - return jobs.run('image', href, title, text, curFilename, cfg); -} +const renderImage = (href, title, text, curFilename, cfg) => + jobs.run('image', href, title, text, curFilename, cfg) -renderer.heading = function(text, level, raw) { - return '<h' + - (level+2) + - ' id="' + - toURL(raw) + - '">' + - text + - '</h' + - (level+2) + - '>\n'; -} +renderer.heading = (text, level, raw) => + `<h${level + 2} id="${toURL(raw)}">${text}</h${level + 2}>\n` -renderer.paragraph = function(text) { - if(text.match('\\<img')) return '<div class="has-image">'+text+'</div>\n'; - else return '<p>'+text+'</p>\n'; +renderer.paragraph = text => { + if (text.match('\\<img')) return `<div class="has-image">${text}</div>\n` + return `<p>${text}</p>\n` } -renderer._link = renderer.link; +renderer._link = renderer.link -module.exports = function(obj) { - console.log('Build step: Markdown'); - var options = obj.config.options; - renderer.link = function(href, title, text) { - if(options.httponly) { - if(href.match(/^https:\/\/ok1kvk.cz/)) - href = href.replace('https://', 'http://'); +module.exports = obj => { + console.log('Build step: Markdown') + const { options } = obj.config + renderer.link = (href_, title, text) => { + let href = href_ + if (options.httponly) { + if (href.match(/^https:\/\/ok1kvk.cz/)) + href = href.replace('https://', 'http://') } - if(options.httpsonly) { - if(href.match(/^http:\/\/ok1kvk.cz/)) - href = href.replace('http://', 'https://'); + if (options.httpsonly) { + if (href.match(/^http:\/\/ok1kvk.cz/)) + href = href.replace('http://', 'https://') } - return renderer._link(href,title,text); - }; + return renderer._link(href, title, text) + } - obj.pages.forEach(function(article) { - renderer.image = function(href, title, text) { - return renderImage(href, title, text, article.file, obj.config); - }; - lang = article.metadata.lang; - article.content = parser.parse(lexer.lex(article.content)); - }); - return Promise.resolve(obj); + obj.pages.forEach(article => { + renderer.image = (href, title, text) => + renderImage(href, title, text, article.file, obj.config) + ;({ lang } = article.metadata) + // eslint-disable-next-line no-param-reassign + article.content = parser.parse(lexer.lex(article.content)) + }) + return Promise.resolve(obj) } diff --git a/sitegin/nunjucks.js b/sitegin/nunjucks.js index cff74e7a3b0c3c9c6f8db4858e2d23d60f6b2ba2..cf4e86864072801d1e5ebebfd53f450f33f9c369 100644 --- a/sitegin/nunjucks.js +++ b/sitegin/nunjucks.js @@ -1,128 +1,134 @@ -'use strict'; /* * This job renders `data` using nunjucks template `type` */ -var nunjucks = require('nunjucks'); -var fs = require('fs'); -var dateFilter = require('nunjucks-date-filter'); -var util = require('util'); -var url = require('url') +const nunjucks = require('nunjucks') +const fs = require('fs') +const dateFilter = require('nunjucks-date-filter') +const util = require('util') +const url = require('url') -var config = require('./config'); -console.log('watch: '+config.watch); -var env = new nunjucks.Environment( - new nunjucks.FileSystemLoader(config.themeDir+'/templates',{watch: config.watch}) -); +const config = require('./config') -env.addFilter('date', dateFilter); +console.log(`watch: ${config.watch}`) +const env = new nunjucks.Environment( + new nunjucks.FileSystemLoader(`${config.themeDir}/templates`, { + watch: config.watch, + }), +) -env.addFilter('paginationList', function(page, count) { - var curPage = page; - var pages = []; - pages.push(curPage); - for(var i = 0; i < count; i++) { - curPage = curPage.metadata.prevpage; - if(curPage === undefined) break; - pages.unshift(curPage); - } +env.addFilter('date', dateFilter) - curPage = page; - for(let i = 0; i < count; i++) { - curPage = curPage.metadata.nextpage; - if(curPage === undefined) break; - pages.push(curPage); - } - return pages; -}); +env.addFilter('paginationList', (page, count) => { + let curPage = page + const pages = [] + pages.push(curPage) + for (let i = 0; i < count; i += 1) { + curPage = curPage.metadata.prevpage + if (curPage === undefined) break + pages.unshift(curPage) + } -env.addFilter('inspect', function(obj) { - return util.inspect(obj); -}); + curPage = page + for (let i = 0; i < count; i += 1) { + curPage = curPage.metadata.nextpage + if (curPage === undefined) break + pages.push(curPage) + } + return pages +}) -env.addFilter('log', function(obj) { - return console.log(obj); -}); +env.addFilter('inspect', obj => util.inspect(obj)) -env.addFilter('relURL', function(filename, dir){ - if(filename.substr(0,1) == '/' || filename.match('://')) return filename; - if(dir.substr(0,1) !== '/') dir = '/' + dir; - if(filename.match(/\/$/)) return dir+filename; - if(dir.match(/\/$/)) return dir+filename; - return dir+'/'+filename; -}) +env.addFilter('log', obj => console.log(obj)) -env.addFilter('absURL', function(rel, base){ - return url.resolve(base, rel) +env.addFilter('relURL', (filename, dir_) => { + let dir = dir_ + if (filename.substr(0, 1) === '/' || filename.match('://')) return filename + if (dir.substr(0, 1) !== '/') dir = `/${dir}` + if (filename.match(/\/$/)) return dir + filename + if (dir.match(/\/$/)) return dir + filename + return `${dir}/${filename}` }) -var formats = {}; +env.addFilter('absURL', (rel, base) => url.resolve(base, rel)) -module.exports = function(data, type, config) { - return new Promise(function(resolve, reject) { - if(formats[type]) resolve(formats[type]); +let formats = {} + +module.exports = (data, type_) => + new Promise((resolve, reject) => { + if (formats[type_]) resolve(formats[type_]) else { - fs.readdir(config.themeDir+'/templates',function(err, files) { - if(err) { - console.log(config); - return reject(new Error('Error listing files in '+config.themeDir+'/templates')); + fs.readdir(`${config.themeDir}/templates`, (err, files_) => { + if (err) { + console.log(config) + reject( + new Error(`Error listing files in ${config.themeDir}/templates`), + ) + return } - files = files.filter(function(file) { - return file.match(type+'\..*\.nunj'); - }); + const files = files_.filter(file => file.match(`${type_}..*.nunj`)) - var filteredFiles = []; - var todo = 0; - files.forEach(function(file) { - fs.stat(config.themeDir+'/templates/'+file,function(err, stat) { - if(err) reject(new Error('Error stating '+config.themeDir+'/templates'+file)); - if(stat.isFile()) - filteredFiles.push(file); - todo--; - if(todo <= 0) { - formats[type] = filteredFiles; - resolve(filteredFiles); + const filteredFiles = [] + let todo = 0 + files.forEach(file => { + fs.stat(`${config.themeDir}/templates/${file}`, (err2, stat) => { + if (err2) + reject( + new Error(`Error stating ${config.themeDir}/templates${file}`), + ) + if (stat.isFile()) filteredFiles.push(file) + todo -= 1 + if (todo <= 0) { + formats[type_] = filteredFiles + resolve(filteredFiles) } - }); - todo++; - }); - }); - } - }).then(function(filelist) { - var promises = []; - filelist.forEach(function(file){ - var type = file.replace(/^.*\.([a-z]+)\.nunj/,'$1'); - promises.push(new Promise(function(resolve, reject) { - env.getTemplate(file, function(err, tmpl) { - if(err) reject(new Error('Failed to load template '+type+'.html.nunj')); - resolve({tmpl: tmpl, type: type, file: file}); - }); - })); - }); - return Promise.all(promises); - }).then(function(tmpls) { - var promises = []; - tmpls.forEach(function(o) { - promises.push(new Promise(function(resolve, reject){ - var param = Object.assign({}, data, { - config: Object.assign({}, data.config, { - baseurl: config ? config.options.baseurl : '' }) + todo += 1 }) - o.tmpl.render(param, function(err, val) { - if(err) { - //reject(new Error('Error rendering template '+o.file)); - reject(err); - } - resolve({content: val, type: o.type}); - }); - })); - }); - return Promise.all(promises); - }); -} + }) + } + }) + .then(filelist => { + const promises = [] + filelist.forEach(file => { + const type = file.replace(/^.*\.([a-z]+)\.nunj/, '$1') + promises.push( + new Promise((resolve, reject) => { + env.getTemplate(file, (err, tmpl) => { + if (err) + reject(new Error(`Failed to load template ${type}.html.nunj`)) + resolve({ tmpl, type, file }) + }) + }), + ) + }) + return Promise.all(promises) + }) + .then(tmpls => { + const promises = [] + tmpls.forEach(o => { + promises.push( + new Promise((resolve, reject) => { + const param = Object.assign({}, data, { + config: Object.assign({}, data.config, { + baseurl: config ? config.options.baseurl : '', + }), + }) + o.tmpl.render(param, (err, val) => { + if (err) { + // reject(new Error('Error rendering template '+o.file)); + reject(err) + } + resolve({ content: val, type: o.type }) + }) + }), + ) + }) + return Promise.all(promises) + }) -module.exports.reset = function() { - formats = {}; +module.exports.reset = () => { + formats = {} } diff --git a/sitegin/parseHugo.js b/sitegin/parseHugo.js index e685065f8bafe636f2576b957b6ff0440bfacd50..7daaf1ac34fba3a37b0b2e6b9e097cfa678a9438 100644 --- a/sitegin/parseHugo.js +++ b/sitegin/parseHugo.js @@ -1,39 +1,47 @@ -var toml = require('toml'); -var moment = require('moment'); -var path = require('path'); -var jsesc = require('jsesc') +const toml = require('toml') +const moment = require('moment') +const jsesc = require('jsesc') -var readPageWorker = function(content, obj) { - if(content === undefined) throw new Error('content is undefined'); - var headLength = content.indexOf('\n')+1; - var head = content.substring(0,headLength) - content = content.substring(headLength); - var fmEnd = content.indexOf(head); - if(fmEnd < 0) { - console.log(jsesc(content)); - throw new Error('Cannot find terminating '+ - head.substring(0,headLength-1)+ - '\n in file '+obj.filename); +const readPageWorker = (content_, obj) => { + let content = content_ + if (content === undefined) throw new Error('content is undefined') + const headLength = content.indexOf('\n') + 1 + const head = content.substring(0, headLength) + content = content.substring(headLength) + const fmEnd = content.indexOf(head) + if (fmEnd < 0) { + console.log(jsesc(content)) + throw new Error( + `Cannot find terminating ${head.substring(0, headLength - 1)}\n in file ${ + obj.filename + }`, + ) } - obj.content = content.substring(fmEnd+4); + // eslint-disable-next-line no-param-reassign + obj.content = content.substring(fmEnd + 4) try { - obj.metadata = toml.parse(content.substring(0,fmEnd-1)+'\n'); - } catch(e) { - console.log(obj.filename+': Failed to parse metadata'); - throw e; + // eslint-disable-next-line no-param-reassign + obj.metadata = toml.parse(`${content.substring(0, fmEnd - 1)}\n`) + } catch (e) { + console.log(`${obj.filename}: Failed to parse metadata`) + throw e } - if(obj.metadata.date && obj.metadata.date.creation) obj.metadata.date.creation = moment(obj.metadata.date.creation); - return obj; + if (obj.metadata.date && obj.metadata.date.creation) { + // eslint-disable-next-line no-param-reassign + obj.metadata.date.creation = moment(obj.metadata.date.creation) + } + return obj } -module.exports = function(obj) { - console.log('Build step: ParseHugo'); - return new Promise(function(resolve, reject) { - var pages = []; - obj.pages.forEach(function(page) { - pages.push(readPageWorker(page.content, page)); +module.exports = obj => { + console.log('Build step: ParseHugo') + return new Promise(resolve => { + const pages = [] + obj.pages.forEach(page => { + pages.push(readPageWorker(page.content, page)) }) - obj.pages = pages; - resolve(obj); - }); + // eslint-disable-next-line no-param-reassign + obj.pages = pages + resolve(obj) + }) } diff --git a/sitegin/parseRedirects.js b/sitegin/parseRedirects.js index 8e651ce88e63407ca65637aa0a101d26cafa2994..02a872a1d0eda8c48ac5011b57d2d58277c5e134 100644 --- a/sitegin/parseRedirects.js +++ b/sitegin/parseRedirects.js @@ -1,32 +1,38 @@ -'use strict'; -var toml = require('toml'); -var path = require('path'); +const toml = require('toml') +const path = require('path') -var readRedirectWorker = function(content, obj) { - if(content === undefined) throw new Error('content is undefined'); +const readRedirectWorker = (content, obj) => { + if (content === undefined) throw new Error('content is undefined') try { - obj.metadata = toml.parse(content); - } catch(e) { - console.log(obj.filename+': Failed to parse metadata'); - throw e; + // eslint-disable-next-line no-param-reassign + obj.metadata = toml.parse(content) + } catch (e) { + console.log(`${obj.filename}: Failed to parse metadata`) + throw e } - obj.content = obj.metadata.target; - obj.file = obj.file.split(path.sep).join('/'); - if(obj.file.match(/^redirects\/(.*)index\.toml/)) - obj.file = obj.file.replace(/^redirects\/(.*)index\.toml/,'$1'); - else - obj.file = obj.file.replace(/^redirects\/(.*)\.toml/,'$1'); - return obj; + // eslint-disable-next-line no-param-reassign + obj.content = obj.metadata.target + // eslint-disable-next-line no-param-reassign + obj.file = obj.file.split(path.sep).join('/') + if (obj.file.match(/^redirects\/(.*)index\.toml/)) { + // eslint-disable-next-line no-param-reassign + obj.file = obj.file.replace(/^redirects\/(.*)index\.toml/, '$1') + } else { + // eslint-disable-next-line no-param-reassign + obj.file = obj.file.replace(/^redirects\/(.*)\.toml/, '$1') + } + return obj } -module.exports = function(obj) { - console.log('Build step: ParseRedirects'); - return new Promise(function(resolve, reject) { - var redirects = []; - obj.redirects.forEach(function(page) { - redirects.push(readRedirectWorker(page.content, page)); +module.exports = obj => { + console.log('Build step: ParseRedirects') + return new Promise(resolve => { + const redirects = [] + obj.redirects.forEach(page => { + redirects.push(readRedirectWorker(page.content, page)) }) - obj.redirects = redirects; - resolve(obj); - }); + // eslint-disable-next-line no-param-reassign + obj.redirects = redirects + resolve(obj) + }) } diff --git a/sitegin/pipeline.js b/sitegin/pipeline.js index 26b791b337099c058e1f126457c7d6e7c47bfca7..bba73752f1a6a0b43988bc9065e3ffe77a139b4e 100644 --- a/sitegin/pipeline.js +++ b/sitegin/pipeline.js @@ -2,8 +2,8 @@ * This jobs just runs all job in the right order */ -module.exports = function(jobs) { - return jobs.runSequence( +module.exports = jobs => + jobs.runSequence( 'resetJobs', 'config', 'readFiles', @@ -16,6 +16,5 @@ module.exports = function(jobs) { 'tags', 'theme', 'writeFiles', - 'print' - ); -} + 'print', + ) diff --git a/sitegin/print.js b/sitegin/print.js index 01fda30c8e409d84e6489bc57b7d49a826284303..70c0de3bcf6799b80e7558ee36647ca116f70f5c 100644 --- a/sitegin/print.js +++ b/sitegin/print.js @@ -1,16 +1,18 @@ -var util = require('util') +const util = require('util') -module.exports = function(a) { - var save = {}; - var savec = {}; - var props = []; - var shortenProp = function(prop) { - if(a[prop]) { - save[prop] = a[prop]; - a[prop] = [a[prop][0]]; - savec[prop] = a[prop][0].content; - a[prop][0].content = '...'; - props.push(prop); +module.exports = a => { + const save = {} + const savec = {} + const props = [] + const shortenProp = prop => { + if (a[prop]) { + save[prop] = a[prop] + // eslint-disable-next-line no-param-reassign + a[prop] = [a[prop][0]] + savec[prop] = a[prop][0].content + // eslint-disable-next-line no-param-reassign + a[prop][0].content = '...' + props.push(prop) } } @@ -18,12 +20,14 @@ module.exports = function(a) { shortenProp('tags') shortenProp('redirects') - console.log(util.inspect(a,null,2)) + console.log(util.inspect(a, null, 2)) - props.forEach(function(prop){ - a[prop] = save[prop]; - a[prop][0].content = savec[prop]; - }); + props.forEach(prop => { + // eslint-disable-next-line no-param-reassign + a[prop] = save[prop] + // eslint-disable-next-line no-param-reassign + a[prop][0].content = savec[prop] + }) return Promise.resolve(a) } diff --git a/sitegin/readFiles.js b/sitegin/readFiles.js index a2aed1b2f90d2609ee22a9eaa799852e2f8b3f1b..4dcd2fb74f2cfa4d8db17cbab7234d4aa2e6ca18 100644 --- a/sitegin/readFiles.js +++ b/sitegin/readFiles.js @@ -1,64 +1,66 @@ -'use strict'; /* * This job reads files from config.articlesLocation and loads this list to `pages` */ -var walk = require('walk'); -var fs = require('fs'); -var path = require('path'); +const walk = require('walk') +const fs = require('fs') +const path = require('path') -module.exports = function(obj) { - console.log('Build step: ReadFiles'); - var onFile = function(root, fileStats, next, array) { - var filename = path.join(root,fileStats.name); - var file = path.relative(obj.config.sourceDir, filename); - fs.readFile(filename, 'utf8', function(err,data) { - if(err) { - console.log('Error reading file '+filename) - console.log(err); +module.exports = obj => { + console.log('Build step: ReadFiles') + const onFile = (root, fileStats, next, array) => { + const filename = path.join(root, fileStats.name) + const file = path.relative(obj.config.sourceDir, filename) + fs.readFile(filename, 'utf8', (err, data) => { + if (err) { + console.log(`Error reading file ${filename}`) + console.log(err) } else { array.push({ - filename: filename, - file: file, - content: data + filename, + file, + content: data, }) } next() }) - }; + } - var promise1 = new Promise(function(resolve, reject) { - var pages = []; - walk.walk(path.join(obj.config.sourceDir,obj.config.articlesLocation)) - .on('file',function(root,fileStats,next) { - onFile(root,fileStats,next,pages); - }) - .on('errors',function(root, nodeStatsArray, next) { - console.log('Walker error', root, nodeStatsArray); - next(); - }) - .on('end', function() { - resolve({type: 'pages', val: pages}); - }) + const promise1 = new Promise(resolve => { + const pages = [] + walk + .walk(path.join(obj.config.sourceDir, obj.config.articlesLocation)) + .on('file', (root, fileStats, next) => { + onFile(root, fileStats, next, pages) + }) + .on('errors', (root, nodeStatsArray, next) => { + console.log('Walker error', root, nodeStatsArray) + next() + }) + .on('end', () => { + resolve({ type: 'pages', val: pages }) + }) }) - var promise2 = new Promise(function(resolve, reject) { - let redirects = []; - walk.walk(path.join(obj.config.sourceDir,obj.config.redirectsLocation)) - .on('file',function(root,fileStats,next) { - onFile(root,fileStats,next,redirects); - }) - .on('errors',function(root, nodeStatsArray, next) { - console.log('Walker error', root, nodeStatsArray); - next(); - }) - .on('end', function() { - resolve({type: 'redirects', val: redirects}); + const promise2 = new Promise(resolve => { + const redirects = [] + walk + .walk(path.join(obj.config.sourceDir, obj.config.redirectsLocation)) + .on('file', (root, fileStats, next) => { + onFile(root, fileStats, next, redirects) + }) + .on('errors', (root, nodeStatsArray, next) => { + console.log('Walker error', root, nodeStatsArray) + next() + }) + .on('end', () => { + resolve({ type: 'redirects', val: redirects }) + }) + }) + return Promise.all([promise1, promise2]).then(arr => { + arr.forEach(v => { + // eslint-disable-next-line no-param-reassign + obj[v.type] = v.val }) + return obj }) - return Promise.all([promise1,promise2]).then(function(arr) { - arr.forEach(function(v) { - obj[v.type] = v.val; - }); - return obj; - }); } diff --git a/sitegin/resetJobs.js b/sitegin/resetJobs.js index e5030f437b410d5609c244bac5318a4b752b980b..c4709a6c3cd58e50b1c3d0bc3d778388f54189d4 100644 --- a/sitegin/resetJobs.js +++ b/sitegin/resetJobs.js @@ -1,12 +1,10 @@ -var jobs = require('./jobs'); -module.exports = function() { - for(var jobname in jobs.jobList) { - if(! jobs.jobList.hasOwnProperty(jobname)) continue; +const jobs = require('./jobs') - var job = jobs.jobList[jobname]; - if(job.f.reset) { - job.f.reset(); +module.exports = function resetJobs() { + for (const job of Object.values(jobs.jobList)) { + if (job.f.reset) { + job.f.reset() } } - return Promise.resolve(); + return Promise.resolve() } diff --git a/sitegin/sitegin.js b/sitegin/sitegin.js index e23fae145e4e6558e7c69aa71570656c548c6655..0b894de3384ee0ed8eec75d69c2c3ba3f4a35150 100644 --- a/sitegin/sitegin.js +++ b/sitegin/sitegin.js @@ -1,29 +1,27 @@ -var jobs = require('./jobs'); +const jobs = require('./jobs') -module.exports = function(config) { - return jobs.registerMultiple( - config, - ['config', './config'], - ['gitInfo', './gitInfo'], - ['markdown', './markdown'], - ['parseHugo', './parseHugo'], - ['print', './print'], - ['readFiles', './readFiles'], - ['toURL', './toURL'], - ['tags', './tags'], - ['nunjucks', './nunjucks'], - ['theme', './theme'], - ['urls', './urls'], - ['writeFiles', './writeFiles'], - ['resetJobs', './resetJobs'], - ['sitemap', './sitemap'], - ['parseRedirects','./parseRedirects'], - ['image', './image'], - ['imageResizer', './imageResizer'], +module.exports = config => + jobs + .registerMultiple( + config, + ['config', './config'], + ['gitInfo', './gitInfo'], + ['markdown', './markdown'], + ['parseHugo', './parseHugo'], + ['print', './print'], + ['readFiles', './readFiles'], + ['toURL', './toURL'], + ['tags', './tags'], + ['nunjucks', './nunjucks'], + ['theme', './theme'], + ['urls', './urls'], + ['writeFiles', './writeFiles'], + ['resetJobs', './resetJobs'], + ['sitemap', './sitemap'], + ['parseRedirects', './parseRedirects'], + ['image', './image'], + ['imageResizer', './imageResizer'], - ['pipeline','./pipeline'] - ) - .then(function() { - return jobs; - }) -} + ['pipeline', './pipeline'], + ) + .then(() => jobs) diff --git a/sitegin/sitemap.js b/sitegin/sitemap.js index 9f1d50a0b20b563639667fd1f2be4b2855d57574..eea7c8527ae5edeff1cf90d3620075b3d81927ff 100644 --- a/sitegin/sitemap.js +++ b/sitegin/sitemap.js @@ -1,22 +1,24 @@ -var fs = require('fs'); -module.exports = function(obj) { - console.log('Build step: Sitemap'); - return new Promise(function(resolve, reject) { - var file = '<?xml version="1.0" encoding="UTF-8"?>\n'+ - '<urlset\n'+ - 'xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"\n'+ - 'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\n'+ - 'xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">\n'; - obj.pages.forEach(function(page) { - if(!page.date) return; - file += '<url>\n'+ - ' <loc>https://ok1kvk.cz/'+page.file+'/</loc>\n'+ - ' <lastmod>'+page.metadata.date.modification.toISOString()+'</lastmod>\n'+ - '</url>\n' +const fs = require('fs') + +module.exports = function sitemapJob(obj) { + console.log('Build step: Sitemap') + return new Promise(resolve => { + let file = + '<?xml version="1.0" encoding="UTF-8"?>\n' + + '<urlset\n' + + 'xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"\n' + + 'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\n' + + 'xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">\n' + obj.pages.forEach(page => { + if (!page.date) return + file += + `${'<url>\n <loc>https://ok1kvk.cz/'}${page.file}/</loc>\n` + + ` <lastmod>${page.metadata.date.modification.toISOString()}</lastmod>\n` + + `</url>\n` }) - file += '</urlset>'; - fs.writeFile(obj.config.builddir+'/sitemap.xml',file,function(){ - resolve(obj); + file += '</urlset>' + fs.writeFile(`${obj.config.builddir}/sitemap.xml`, file, () => { + resolve(obj) }) - }); + }) } diff --git a/sitegin/tags.js b/sitegin/tags.js index db4ac0c8bddec22a7c893628c7a00cdf651d19be..91ca9274c70aeea2d1253d242e168458c581b7ab 100644 --- a/sitegin/tags.js +++ b/sitegin/tags.js @@ -1,118 +1,114 @@ -'use strict'; +const jobs = require('./jobs') -var moment = require('moment'); -var jobs = require('./jobs'); +const toURL = url => jobs.run('toURL', url) -var toURL = function(url) { - return jobs.run('toURL', url); -} - -module.exports = function(obj) { - console.log('Build step: Tags'); - return new Promise(function(resolve, reject) { - var tags = [{ - text: 'VÅ¡echny Älánky a aktuality', - url: 'tag/vse', - }]; - var tagPages = { +module.exports = function tagsJob(obj) { + console.log('Build step: Tags') + return new Promise(resolve => { + const tags = [ + { + text: 'VÅ¡echny Älánky a aktuality', + url: 'tag/vse', + }, + ] + const tagPages = { 'tag/vse': [], - }; - obj.pages.forEach(function(article) { - if(!article.metadata.tags) { - article.metadata.tags = []; + } + for (const article of obj.pages) { + if (!article.metadata.tags) { + article.metadata.tags = [] } - if(article.metadata.tags) { - - var ntags = []; - article.metadata.tags.forEach(function(tag) { - tag = { - text: tag, - url: 'tag/'+toURL(tag) + if (article.metadata.tags) { + const ntags = [] + for (const tag_ of article.metadata.tags) { + const tag = { + text: tag_, + url: `tag/${toURL(tag_)}`, } - ntags.push(tag); - if(tags.map(function(e) { return e.url; }).indexOf(tag.url) < 0) - tags.push(tag) - if(tagPages[tag.url] === undefined) tagPages[tag.url] = []; + ntags.push(tag) + if (tags.map(e => e.url).indexOf(tag.url) < 0) tags.push(tag) + if (tagPages[tag.url] === undefined) tagPages[tag.url] = [] tagPages[tag.url].push(article) - }) + } - if(!article.metadata.notarticle) { + if (!article.metadata.notarticle) { ntags.push(tags[0]) tagPages[tags[0].url].push(article) } - article.metadata.tags = ntags; + article.metadata.tags = ntags } - }); + } - obj.tags = []; - if(!Array.isArray(obj.redirects)) obj.redirects = []; + // eslint-disable-next-line no-param-reassign + obj.tags = [] + // eslint-disable-next-line no-param-reassign + if (!Array.isArray(obj.redirects)) obj.redirects = [] - var generateTagPages = function(tag, pageList, subtags) { + const generateTagPages = (tag, pageList, subtags) => { const file = tag.url - var pg = {}; - pg.type = 'redirect'; - pg.file = file; - pg.content = file+'/1'; - obj.redirects.push(pg); + const pg = {} + pg.type = 'redirect' + pg.file = file + pg.content = `${file}/1` + obj.redirects.push(pg) - pageList.sort(function (a, b) { - if(a.metadata.date === undefined) return -1; - if(b.metadata.date === undefined) return 1; - var rhs = a.metadata.date.creation; - var lhs = b.metadata.date.creation; - return lhs > rhs ? 1 : lhs < rhs ? -1 : 0; + pageList.sort((a, b) => { + if (a.metadata.date === undefined) return -1 + if (b.metadata.date === undefined) return 1 + const rhs = a.metadata.date.creation + const lhs = b.metadata.date.creation + return lhs > rhs ? 1 : lhs < rhs ? -1 : 0 }) - var c = 0; - let p = 0; - var tagPage; - var prevurl; - var prevpage; - var firstpage; - var lastpage; - var tagPageList = []; - pageList.forEach(function(page) { - if(c === 0) { - p++; - if(tagPage !== undefined) { - tagPage.metadata.nexturl = file+'/'+p; - obj.tags.push(tagPage); - tagPageList.push(tagPage); + let c = 0 + let p = 0 + let tagPage + let prevurl + let prevpage + let firstpage + let lastpage + const tagPageList = [] + pageList.forEach(page => { + if (c === 0) { + p += 1 + if (tagPage !== undefined) { + tagPage.metadata.nexturl = `${file}/${p}` + obj.tags.push(tagPage) + tagPageList.push(tagPage) } - tagPage = {metadata: {}}; - if(firstpage === undefined) firstpage = tagPage; - lastpage = tagPage; + tagPage = { metadata: {} } + if (firstpage === undefined) firstpage = tagPage + lastpage = tagPage - tagPage.file = file+'/'+p+'/'; - tagPage.type = 'tag'; - tagPage.tag = tag; - tagPage.subtags = subtags; - tagPage.metadata.firstpage = firstpage; - tagPage.metadata.prevpage = prevpage; - tagPage.metadata.prevurl = prevurl; - tagPage.metadata.thispage = tagPage; - tagPage.metadata.pagenumber = p; - tagPage.canonicalURL = 'https://ok1kvk.cz/'+tagPage.file + tagPage.file = `${file}/${p}/` + tagPage.type = 'tag' + tagPage.tag = tag + tagPage.subtags = subtags + tagPage.metadata.firstpage = firstpage + tagPage.metadata.prevpage = prevpage + tagPage.metadata.prevurl = prevurl + tagPage.metadata.thispage = tagPage + tagPage.metadata.pagenumber = p + tagPage.canonicalURL = `https://ok1kvk.cz/${tagPage.file}` - tagPage.content = []; - if(prevpage !== undefined) - prevpage.metadata.nextpage = tagPage; - prevurl = tagPage.file; - prevpage = tagPage; + tagPage.content = [] + if (prevpage !== undefined) prevpage.metadata.nextpage = tagPage + prevurl = tagPage.file + prevpage = tagPage } - tagPage.content.push(page); + tagPage.content.push(page) - c++; - c %= obj.config.linksPerPage; - }); - obj.tags.push(tagPage); - tagPageList.push(tagPage); - tagPageList.forEach(function(tagPage) { - tagPage.metadata.lastpage = lastpage; - }); + c += 1 + c %= obj.config.linksPerPage + }) + obj.tags.push(tagPage) + tagPageList.push(tagPage) + for (const tp of tagPageList) { + tp.metadata.lastpage = lastpage + } } - const gen = (arr) => arr.map(a => ({ text: a, url: 'tag/'+toURL(a) })) + const gen = arr => arr.map(a => ({ text: a, url: `tag/${toURL(a)}` })) const subtags = { 'tag/konstrukce': gen([ 'Konstrukce pro zaÄáteÄnÃky', @@ -127,29 +123,11 @@ module.exports = function(obj) { 'SK', 'Radioklub', ]), - 'tag/programovani': gen([ - 'C/C++', - 'Javascript', - 'LaTeX', - 'Nástroje', - ]), - 'tag/mikroprocesory': gen([ - 'AVR', - 'Periferie', - 'Knihovny', - ]), - 'tag/technicke-clanky': gen([ - 'Eagle', - ]), - 'tag/zavody': gen([ - 'HF', - 'VHF', - ]), - 'tag/aktuality': gen([ - 'Pozvánky', - 'Stalo se', - 'Závody', - ]), + 'tag/programovani': gen(['C/C++', 'Javascript', 'LaTeX', 'Nástroje']), + 'tag/mikroprocesory': gen(['AVR', 'Periferie', 'Knihovny']), + 'tag/technicke-clanky': gen(['Eagle']), + 'tag/zavody': gen(['HF', 'VHF']), + 'tag/aktuality': gen(['Pozvánky', 'Stalo se', 'Závody']), 'tag/clanky': gen([ 'ProgramovánÃ', 'Mikroprocesory', @@ -157,15 +135,11 @@ module.exports = function(obj) { 'Technické Älánky', 'ZajÃmavosti', ]), - 'tag/vse': gen([ - 'Aktuality', - 'ÄŒlánky', - ]) + 'tag/vse': gen(['Aktuality', 'ÄŒlánky']), } - tags.forEach(function(tag) { - + tags.forEach(tag => { generateTagPages(tag, tagPages[tag.url], subtags[tag.url]) }) - resolve(obj); + resolve(obj) }) } diff --git a/sitegin/tests/.eslintrc.js b/sitegin/tests/.eslintrc.js new file mode 100644 index 0000000000000000000000000000000000000000..585dd557a9fd2acb4812cb30da4ceb89e533eae9 --- /dev/null +++ b/sitegin/tests/.eslintrc.js @@ -0,0 +1,5 @@ +module.exports = { + env: { + mocha: true, + }, +} diff --git a/sitegin/tests/imageTest.js b/sitegin/tests/imageTest.js index 8752dbca2016d6cf60e72674b07c72c73265f7d7..6d8bd3de545b742ed0d26f7995ee3ecead35d027 100644 --- a/sitegin/tests/imageTest.js +++ b/sitegin/tests/imageTest.js @@ -1,15 +1,14 @@ -require('should'); +const assert = require('assert') -var o = require('../image')._test; +const o = require('../image')._test -describe('Image', function() { - it('paramInHrefParser image.png =option,option2=123', function() { - o.paramInHrefParser('image.png =option,option2=123').should.be.eql({ - href: 'image.png', - options: { - option: true, - option2: '123' - } - }) +describe('Image', () => { + it('paramInHrefParser image.png =option,option2=123', () => { + const v = o.paramInHrefParser('image.png =option,option2=123') + assert(typeof v === 'object') + assert(v.href === 'image.png') + assert(typeof v.options === 'object') + assert(v.options.option === true) + assert(v.options.option2 === '123') }) }) diff --git a/sitegin/tests/youtubeTest.js b/sitegin/tests/youtubeTest.js index 17f991428e61a7779958f3ff7d48439d81d132da..182c3d9674f7644b52ca63de69c3f928405d0cc3 100644 --- a/sitegin/tests/youtubeTest.js +++ b/sitegin/tests/youtubeTest.js @@ -1,11 +1,9 @@ -'use strict'; -/*jshint expr: true*/ -require('should'); +const assert = require('assert') -var youtube = require('../utils/youtube.js'); +const youtube = require('../utils/youtube.js') -describe('Youtube', function() { - let links = { +describe('Youtube', () => { + const links = { 'https://www.youtube.com/watch?v=QH2-TGUlwu4': true, 'http://www.youtube.com/watch?v=QH2-TGUlwu4': true, 'https://youtu.be/QH2-TGUlwu4': true, @@ -15,36 +13,37 @@ describe('Youtube', function() { 'https://www.youtube.com/watch?app=desktop&gl=CZ&v=QH2-TGUlwu4&hl=cs&v=cTa1Q2mBeJE': true, 'https://www.youtube.com/': false, 'https://www.youtube.com/channel/UCzNxmbk_LA1jXvYgivCCkpw': false, - 'youtube.png': false + 'youtube.png': false, } function testLink(link, val) { - it('isVideo '+link+' => '+val,function() { - youtube.isVideo(link).should.be.equal(val); + it(`isVideo ${link} => ${val}`, () => { + assert(youtube.isVideo(link) === val) }) } - for(let link in links) { - if(!links.hasOwnProperty(link)) continue; - testLink(link, links[link]); + for (const [key, val] of Object.entries(links)) { + testLink(key, val) } - it('info https://youtu.be/wZZ7oFKsKzY?t=3h30m30s', function() { - var info = youtube.info('https://youtu.be/wZZ7oFKsKzY?t=3h30m30s'); - info.should.be.object; - info.time.should.be.eql(3*3600+30*60+30); - info.videoid.should.be.eql('wZZ7oFKsKzY'); + it('info https://youtu.be/wZZ7oFKsKzY?t=3h30m30s', () => { + const info = youtube.info('https://youtu.be/wZZ7oFKsKzY?t=3h30m30s') + assert(typeof info === 'object') + assert(info.time === 3 * 3600 + 30 * 60 + 30) + assert(info.videoid === 'wZZ7oFKsKzY') }) - it('info https://youtu.be/QH2-TGUlwu4', function() { - var info = youtube.info('https://youtu.be/QH2-TGUlwu4'); - info.should.be.object; - info.time.should.be.eql(0); - info.videoid.should.be.eql('QH2-TGUlwu4'); + it('info https://youtu.be/QH2-TGUlwu4', () => { + const info = youtube.info('https://youtu.be/QH2-TGUlwu4') + assert(typeof info === 'object') + assert(info.time === 0) + assert(info.videoid === 'QH2-TGUlwu4') }) - it('info https://www.youtube.com/watch?t=3m30s&v=QH2-TGUlwu4', function() { - var info = youtube.info('https://www.youtube.com/watch?t=3m30s&v=QH2-TGUlwu4'); - info.should.be.object; - info.time.should.be.eql(3*60+30); - info.videoid.should.be.eql('QH2-TGUlwu4'); + it('info https://www.youtube.com/watch?t=3m30s&v=QH2-TGUlwu4', () => { + const info = youtube.info( + 'https://www.youtube.com/watch?t=3m30s&v=QH2-TGUlwu4', + ) + assert(typeof info === 'object') + assert(info.time === 3 * 60 + 30) + assert(info.videoid === 'QH2-TGUlwu4') }) }) diff --git a/sitegin/theme.js b/sitegin/theme.js index 7fb86bf2b51b519d7302e868197c03e6f0725e2f..3aed36d34d6402e0aa124010ca13dc04f703fe0f 100644 --- a/sitegin/theme.js +++ b/sitegin/theme.js @@ -1,37 +1,41 @@ -var jobs = require('./jobs'); +const jobs = require('./jobs') -module.exports = function(_obj) { - var obj = _obj; - console.log('Build step: Theme'); - return new Promise(function(resolve,reject){ - var todo = 0; - var done = function(){ - todo--; if(todo <= 0) resolve(obj); +module.exports = function theme(_obj) { + console.log('Build step: Theme') + return new Promise((resolve, reject) => { + let todo = 0 + const done = () => { + todo -= 1 + if (todo <= 0) resolve(_obj) } - var runJob = function(obj, type) { - todo++; - jobs.run('nunjucks', obj, type, _obj.config) - .then(function(data) { - if(!obj.rendered) obj.rendered = []; - data.forEach(function(o){ - obj.rendered.push(o); - }); + const runJob = (obj, type) => { + todo += 1 + jobs + .run('nunjucks', obj, type, _obj.config) + .then(data => { + // eslint-disable-next-line no-param-reassign + if (!obj.rendered) obj.rendered = [] + data.forEach(o => { + obj.rendered.push(o) + }) - done(); - }) - .catch(function(e) {reject(e)}) + done() + }) + .catch(e => { + reject(e) + }) } - obj.pages.forEach(function(page) { - runJob(page,'article') + _obj.pages.forEach(page => { + runJob(page, 'article') }) - obj.tags.forEach(function(tag) { - runJob(tag,'tag') + _obj.tags.forEach(tag => { + runJob(tag, 'tag') }) - obj.redirects.forEach(function(redirect) { - runJob(redirect,'redirect') + _obj.redirects.forEach(redirect => { + runJob(redirect, 'redirect') }) - if(todo <= 0) resolve(obj); + if (todo <= 0) resolve(_obj) }) } diff --git a/sitegin/toURL.js b/sitegin/toURL.js index 7d765bb6e886c4dfea799399a239f8dfc78d34a6..c4b492ba820c8d3665e4f27855d517a62f0a017c 100644 --- a/sitegin/toURL.js +++ b/sitegin/toURL.js @@ -1,11 +1,8 @@ +const latinize = require('latinize') - -/* jshint ignore:start */ -var Latinise={};Latinise.latin_map={'Ã':'A','Ä‚':'A','Ắ':'A','Ặ':'A','Ằ':'A','Ẳ':'A','Ẵ':'A','Ç':'A','Â':'A','Ấ':'A','Ậ':'A','Ầ':'A','Ẩ':'A','Ẫ':'A','Ä':'A','Çž':'A','Ȧ':'A','Ç ':'A','Ạ':'A','È€':'A','À':'A','Ả':'A','È‚':'A','Ä€':'A','Ä„':'A','Ã…':'A','Ǻ':'A','Ḁ':'A','Ⱥ':'A','Ã':'A','Ꜳ':'AA','Æ':'AE','Ǽ':'AE','Ç¢':'AE','Ꜵ':'AO','Ꜷ':'AU','Ꜹ':'AV','Ꜻ':'AV','Ꜽ':'AY','Ḃ':'B','Ḅ':'B','Æ':'B','Ḇ':'B','Ƀ':'B','Æ‚':'B','Ć':'C','ÄŒ':'C','Ç':'C','Ḉ':'C','Ĉ':'C','ÄŠ':'C','Ƈ':'C','È»':'C','ÄŽ':'D','á¸':'D','Ḓ':'D','Ḋ':'D','Ḍ':'D','ÆŠ':'D','Ḏ':'D','Dz':'D','Ç…':'D','Ä':'D','Æ‹':'D','DZ':'DZ','Ç„':'DZ','É':'E','Ä”':'E','Äš':'E','Ȩ':'E','Ḝ':'E','Ê':'E','Ế':'E','Ệ':'E','Ề':'E','Ể':'E','Ễ':'E','Ḙ':'E','Ë':'E','Ä–':'E','Ẹ':'E','È„':'E','È':'E','Ẻ':'E','Ȇ':'E','Ä’':'E','Ḗ':'E','Ḕ':'E','Ę':'E','Ɇ':'E','Ẽ':'E','Ḛ':'E','êª':'ET','Ḟ':'F','Æ‘':'F','Ç´':'G','Äž':'G','Ǧ':'G','Ä¢':'G','Äœ':'G','Ä ':'G','Æ“':'G','Ḡ':'G','Ǥ':'G','Ḫ':'H','Èž':'H','Ḩ':'H','Ĥ':'H','Ⱨ':'H','Ḧ':'H','Ḣ':'H','Ḥ':'H','Ħ':'H','Ã':'I','Ĭ':'I','Ç':'I','ÃŽ':'I','Ã':'I','Ḯ':'I','Ä°':'I','Ị':'I','Ȉ':'I','ÃŒ':'I','Ỉ':'I','ÈŠ':'I','Ī':'I','Ä®':'I','Æ—':'I','Ĩ':'I','Ḭ':'I','ê¹':'D','ê»':'F','ê½':'G','êž‚':'R','êž„':'S','Ꞇ':'T','ê¬':'IS','Ä´':'J','Ɉ':'J','Ḱ':'K','Ǩ':'K','Ķ':'K','Ⱪ':'K','ê‚':'K','Ḳ':'K','Ƙ':'K','Ḵ':'K','ê€':'K','ê„':'K','Ĺ':'L','Ƚ':'L','Ľ':'L','Ä»':'L','Ḽ':'L','Ḷ':'L','Ḹ':'L','â± ':'L','êˆ':'L','Ḻ':'L','Ä¿':'L','â±¢':'L','Lj':'L','Å':'L','LJ':'LJ','Ḿ':'M','á¹€':'M','Ṃ':'M','â±®':'M','Ń':'N','Ň':'N','Å…':'N','Ṋ':'N','Ṅ':'N','Ṇ':'N','Ǹ':'N','Æ':'N','Ṉ':'N','È ':'N','Ç‹':'N','Ñ':'N','ÇŠ':'NJ','Ó':'O','ÅŽ':'O','Ç‘':'O','Ô':'O','á»':'O','Ộ':'O','á»’':'O','á»”':'O','á»–':'O','Ö':'O','Ȫ':'O','È®':'O','È°':'O','Ọ':'O','Å':'O','ÈŒ':'O','Ã’':'O','Ỏ':'O','Æ ':'O','Ớ':'O','Ợ':'O','Ờ':'O','Ở':'O','á» ':'O','ÈŽ':'O','êŠ':'O','êŒ':'O','ÅŒ':'O','á¹’':'O','á¹':'O','ÆŸ':'O','Ǫ':'O','Ǭ':'O','Ø':'O','Ǿ':'O','Õ':'O','Ṍ':'O','Ṏ':'O','Ȭ':'O','Æ¢':'OI','êŽ':'OO','Æ':'E','Ɔ':'O','È¢':'OU','á¹”':'P','á¹–':'P','ê’':'P','Ƥ':'P','ê”':'P','â±£':'P','ê':'P','ê˜':'Q','ê–':'Q','Å”':'R','Ř':'R','Å–':'R','Ṙ':'R','Ṛ':'R','Ṝ':'R','È':'R','È’':'R','Ṟ':'R','ÉŒ':'R','Ɽ':'R','Ꜿ':'C','ÆŽ':'E','Åš':'S','Ṥ':'S','Å ':'S','Ṧ':'S','Åž':'S','Åœ':'S','Ș':'S','á¹ ':'S','á¹¢':'S','Ṩ':'S','Ť':'T','Å¢':'T','á¹°':'T','Èš':'T','Ⱦ':'T','Ṫ':'T','Ṭ':'T','Ƭ':'T','á¹®':'T','Æ®':'T','Ŧ':'T','Ɐ':'A','Ꞁ':'L','Æœ':'M','É…':'V','Ꜩ':'TZ','Ú':'U','Ŭ':'U','Ç“':'U','Û':'U','Ṷ':'U','Ãœ':'U','Ç—':'U','Ç™':'U','Ç›':'U','Ç•':'U','á¹²':'U','Ụ':'U','Å°':'U','È”':'U','Ù':'U','Ủ':'U','Ư':'U','Ứ':'U','á»°':'U','Ừ':'U','Ử':'U','á»®':'U','È–':'U','Ū':'U','Ṻ':'U','Ų':'U','Å®':'U','Ũ':'U','Ṹ':'U','á¹´':'U','êž':'V','á¹¾':'V','Ʋ':'V','á¹¼':'V','ê ':'VY','Ẃ':'W','Å´':'W','Ẅ':'W','Ẇ':'W','Ẉ':'W','Ẁ':'W','â±²':'W','Ẍ':'X','Ẋ':'X','Ã':'Y','Ŷ':'Y','Ÿ':'Y','Ẏ':'Y','á»´':'Y','Ỳ':'Y','Ƴ':'Y','Ỷ':'Y','Ỿ':'Y','Ȳ':'Y','ÉŽ':'Y','Ỹ':'Y','Ź':'Z','Ž':'Z','áº':'Z','Ⱬ':'Z','Å»':'Z','Ẓ':'Z','Ȥ':'Z','Ẕ':'Z','Ƶ':'Z','IJ':'IJ','Å’':'OE','á´€':'A','á´':'AE','Ê™':'B','á´ƒ':'B','á´„':'C','á´…':'D','á´‡':'E','ꜰ':'F','É¢':'G','Ê›':'G','Êœ':'H','ɪ':'I','Ê':'R','á´Š':'J','á´‹':'K','ÊŸ':'L','á´Œ':'L','á´':'M','É´':'N','á´':'O','ɶ':'OE','á´':'O','á´•':'OU','á´˜':'P','Ê€':'R','á´Ž':'N','á´™':'R','ꜱ':'S','á´›':'T','â±»':'E','á´š':'R','á´œ':'U','á´ ':'V','á´¡':'W','Ê':'Y','á´¢':'Z','á':'a','ă':'a','ắ':'a','ặ':'a','ằ':'a','ẳ':'a','ẵ':'a','ÇŽ':'a','â':'a','ấ':'a','áº':'a','ầ':'a','ẩ':'a','ẫ':'a','ä':'a','ÇŸ':'a','ȧ':'a','Ç¡':'a','ạ':'a','È':'a','à ':'a','ả':'a','ȃ':'a','Ä':'a','Ä…':'a','á¶':'a','ẚ':'a','Ã¥':'a','Ç»':'a','á¸':'a','â±¥':'a','ã':'a','ꜳ':'aa','æ':'ae','ǽ':'ae','Ç£':'ae','ꜵ':'ao','ꜷ':'au','ꜹ':'av','ꜻ':'av','ꜽ':'ay','ḃ':'b','ḅ':'b','É“':'b','ḇ':'b','ᵬ':'b','ᶀ':'b','Æ€':'b','ƃ':'b','ɵ':'o','ć':'c','Ä':'c','ç':'c','ḉ':'c','ĉ':'c','É•':'c','Ä‹':'c','ƈ':'c','ȼ':'c','Ä':'d','ḑ':'d','ḓ':'d','È¡':'d','ḋ':'d','á¸':'d','É—':'d','ᶑ':'d','á¸':'d','áµ':'d','á¶':'d','Ä‘':'d','É–':'d','ÆŒ':'d','ı':'i','È·':'j','ÉŸ':'j','Ê„':'j','dz':'dz','dž':'dz','é':'e','Ä•':'e','Ä›':'e','È©':'e','á¸':'e','ê':'e','ế':'e','ệ':'e','á»':'e','ể':'e','á»…':'e','ḙ':'e','ë':'e','Ä—':'e','ẹ':'e','È…':'e','è':'e','ẻ':'e','ȇ':'e','Ä“':'e','ḗ':'e','ḕ':'e','ⱸ':'e','Ä™':'e','ᶒ':'e','ɇ':'e','ẽ':'e','ḛ':'e','ê«':'et','ḟ':'f','Æ’':'f','áµ®':'f','ᶂ':'f','ǵ':'g','ÄŸ':'g','ǧ':'g','Ä£':'g','Ä':'g','Ä¡':'g','É ':'g','ḡ':'g','ᶃ':'g','Ç¥':'g','ḫ':'h','ÈŸ':'h','ḩ':'h','Ä¥':'h','ⱨ':'h','ḧ':'h','ḣ':'h','ḥ':'h','ɦ':'h','ẖ':'h','ħ':'h','Æ•':'hv','Ã':'i','Ä':'i','Ç':'i','î':'i','ï':'i','ḯ':'i','ị':'i','ȉ':'i','ì':'i','ỉ':'i','È‹':'i','Ä«':'i','į':'i','ᶖ':'i','ɨ':'i','Ä©':'i','á¸':'i','êº':'d','ê¼':'f','áµ¹':'g','ꞃ':'r','êž…':'s','ꞇ':'t','ê':'is','Ç°':'j','ĵ':'j','Ê':'j','ɉ':'j','ḱ':'k','Ç©':'k','Ä·':'k','ⱪ':'k','êƒ':'k','ḳ':'k','Æ™':'k','ḵ':'k','ᶄ':'k','ê':'k','ê…':'k','ĺ':'l','Æš':'l','ɬ':'l','ľ':'l','ļ':'l','ḽ':'l','È´':'l','ḷ':'l','ḹ':'l','ⱡ':'l','ê‰':'l','ḻ':'l','Å€':'l','É«':'l','ᶅ':'l','É':'l','Å‚':'l','lj':'lj','Å¿':'s','ẜ':'s','ẛ':'s','áº':'s','ḿ':'m','á¹':'m','ṃ':'m','ɱ':'m','ᵯ':'m','ᶆ':'m','Å„':'n','ň':'n','ņ':'n','ṋ':'n','ȵ':'n','á¹…':'n','ṇ':'n','ǹ':'n','ɲ':'n','ṉ':'n','Æž':'n','áµ°':'n','ᶇ':'n','ɳ':'n','ñ':'n','ÇŒ':'nj','ó':'o','Å':'o','Ç’':'o','ô':'o','ố':'o','á»™':'o','ồ':'o','ổ':'o','á»—':'o','ö':'o','È«':'o','ȯ':'o','ȱ':'o','á»':'o','Å‘':'o','È':'o','ò':'o','á»':'o','Æ¡':'o','á»›':'o','ợ':'o','á»':'o','ở':'o','ỡ':'o','È':'o','ê‹':'o','ê':'o','ⱺ':'o','Å':'o','ṓ':'o','ṑ':'o','Ç«':'o','Ç':'o','ø':'o','Ç¿':'o','õ':'o','á¹':'o','á¹':'o','È':'o','Æ£':'oi','ê':'oo','É›':'e','ᶓ':'e','É”':'o','ᶗ':'o','È£':'ou','ṕ':'p','á¹—':'p','ê“':'p','Æ¥':'p','áµ±':'p','ᶈ':'p','ê•':'p','áµ½':'p','ê‘':'p','ê™':'q','Ê ':'q','É‹':'q','ê—':'q','Å•':'r','Å™':'r','Å—':'r','á¹™':'r','á¹›':'r','á¹':'r','È‘':'r','ɾ':'r','áµ³':'r','È“':'r','ṟ':'r','ɼ':'r','áµ²':'r','ᶉ':'r','É':'r','ɽ':'r','ↄ':'c','ꜿ':'c','ɘ':'e','É¿':'r','Å›':'s','á¹¥':'s','Å¡':'s','ṧ':'s','ÅŸ':'s','Å':'s','È™':'s','ṡ':'s','á¹£':'s','ṩ':'s','Ê‚':'s','áµ´':'s','ᶊ':'s','È¿':'s','É¡':'g','á´‘':'o','á´“':'o','á´':'u','Å¥':'t','Å£':'t','á¹±':'t','È›':'t','ȶ':'t','ẗ':'t','ⱦ':'t','ṫ':'t','á¹':'t','Æ':'t','ṯ':'t','áµµ':'t','Æ«':'t','ʈ':'t','ŧ':'t','ᵺ':'th','É':'a','á´‚':'ae','Ç':'e','áµ·':'g','É¥':'h','Ê®':'h','ʯ':'h','á´‰':'i','Êž':'k','êž':'l','ɯ':'m','É°':'m','á´”':'oe','ɹ':'r','É»':'r','ɺ':'r','â±¹':'r','ʇ':'t','ÊŒ':'v','Ê':'w','ÊŽ':'y','ꜩ':'tz','ú':'u','Å':'u','Ç”':'u','û':'u','á¹·':'u','ü':'u','ǘ':'u','Çš':'u','Çœ':'u','Ç–':'u','á¹³':'u','ụ':'u','ű':'u','È•':'u','ù':'u','ủ':'u','Æ°':'u','ứ':'u','á»±':'u','ừ':'u','á»':'u','ữ':'u','È—':'u','Å«':'u','á¹»':'u','ų':'u','ᶙ':'u','ů':'u','Å©':'u','á¹¹':'u','á¹µ':'u','ᵫ':'ue','ê¸':'um','â±´':'v','êŸ':'v','ṿ':'v','Ê‹':'v','ᶌ':'v','â±±':'v','á¹½':'v','ê¡':'vy','ẃ':'w','ŵ':'w','ẅ':'w','ẇ':'w','ẉ':'w','áº':'w','â±³':'w','ẘ':'w','áº':'x','ẋ':'x','á¶':'x','ý':'y','Å·':'y','ÿ':'y','áº':'y','ỵ':'y','ỳ':'y','Æ´':'y','á»·':'y','ỿ':'y','ȳ':'y','ẙ':'y','É':'y','ỹ':'y','ź':'z','ž':'z','ẑ':'z','Ê‘':'z','ⱬ':'z','ż':'z','ẓ':'z','È¥':'z','ẕ':'z','ᵶ':'z','ᶎ':'z','Ê':'z','ƶ':'z','É€':'z','ff':'ff','ffi':'ffi','ffl':'ffl','ï¬':'fi','fl':'fl','ij':'ij','Å“':'oe','st':'st','â‚':'a','â‚‘':'e','áµ¢':'i','â±¼':'j','â‚’':'o','áµ£':'r','ᵤ':'u','áµ¥':'v','â‚“':'x'}; -var latinise = function(l){return l.replace(/[^A-Za-z0-9\[\] ]/g,function(a){return Latinise.latin_map[a]||a})}; -/* jshint ignore:end */ - -module.exports = function(tag) { - if(tag === undefined) return undefined; - return latinise(tag.toLowerCase()).replace(/ /g,'-').replace(/-+/g,'-'); +module.exports = tag => { + if (tag === undefined) return undefined + return latinize(tag.toLowerCase()) + .replace(/ /g, '-') + .replace(/-+/g, '-') } diff --git a/sitegin/urls.js b/sitegin/urls.js index bd667a925b690f648a8d18b6d04812e29a7c1fe1..7f260b78f29231b2af764efad4ae433491097abb 100644 --- a/sitegin/urls.js +++ b/sitegin/urls.js @@ -2,21 +2,18 @@ * This jobs translates files to resulting URL */ -var rewriteURL = function(file) { - file = file.replace(/\.md$/,'/'); - file = file.replace(/^articles/,'clanek'); - return file; -} +const rewriteURL = file => + file.replace(/\.md$/, '/').replace(/^articles/, 'clanek') -module.exports = function(obj) { - console.log('Build step: URLs'); - return new Promise(function(resolve, reject) { - obj.pages.forEach(function(page) { - page.file = rewriteURL(page.file); - page.canonicalURL = 'https://ok1kvk.cz/'+page.file - }) +module.exports = obj => { + console.log('Build step: URLs') + return new Promise(resolve => { + for (const page of obj.pages) { + page.file = rewriteURL(page.file) + page.canonicalURL = `https://ok1kvk.cz/${page.file}` + } resolve(obj) - }); + }) } -module.exports.rewriteURL = rewriteURL; +module.exports.rewriteURL = rewriteURL diff --git a/sitegin/utils/youtube.js b/sitegin/utils/youtube.js index 46913cc29bb1b973d3993dabd2819176a7e05db2..7f2f543b36a70376951f1b678ca048d8bd795587 100644 --- a/sitegin/utils/youtube.js +++ b/sitegin/utils/youtube.js @@ -1,57 +1,54 @@ -'use strict'; +const url = require('url') +const querystring = require('querystring') -var url = require('url'); -var querystring = require('querystring'); +module.exports.isVideo = href => { + const o = url.parse(href) + if (!o.host) return false -module.exports.isVideo = function(href) { - var o = url.parse(href); - if(!o.host) return false; - - if(o.host == 'youtu.be') { - return o.pathname.length > 1; + if (o.host === 'youtu.be') { + return o.pathname.length > 1 } // not youtube link - if(!o.host.match('youtube.[a-zA-Z]+$')) return false; + if (!o.host.match('youtube.[a-zA-Z]+$')) return false - var query = querystring.parse(o.query); + const query = querystring.parse(o.query) // not youtube video - if(!query.v) return false; + if (!query.v) return false - return true; + return true } -module.exports.info = function(href) { - href = url.parse(href); - var query = querystring.parse(href.query); - var info = { +module.exports.info = href_ => { + const href = url.parse(href_) + const query = querystring.parse(href.query) + const info = { videoid: false, - time: 0 + time: 0, } - if(href.host == 'youtu.be') { - if(href.pathname.length < 2) throw new Error(href+' is not video link'); - info.videoid = href.pathname.substr(1); - } else if(href.host.match('youtube.[a-zA-Z]+$')) { - if(Array.isArray(query.v)) - info.videoid = query.v[0]; - else - info.videoid = query.v; + if (href.host === 'youtu.be') { + if (href.pathname.length < 2) throw new Error(`${href} is not video link`) + info.videoid = href.pathname.substr(1) + } else if (href.host.match('youtube.[a-zA-Z]+$')) { + if (Array.isArray(query.v)) info.videoid = query.v[0] + else info.videoid = query.v } else { - throw new Error(href+' is not youtube url'); + throw new Error(`${href} is not youtube url`) } - if(query.t) { - var units = query.t.split(/[0-9]+/); - units.splice(0,1); - var values = query.t.split(/[^0-9]/); - values.splice(-1,1); - if(units.length != values.length) throw new Error('Youtube: Wrong time specifier: '+query.t); - for(let i = 0; i < units.length; i++) { - if(units[i] == 'h') info.time += Number(values[i])*3600; - else if(units[i] == 'm') info.time += Number(values[i])*60; - else if(units[i] == 's') info.time += Number(values[i]); - else throw new Error('Youtube: Wrong time specifier: '+query.t); + if (query.t) { + const units = query.t.split(/[0-9]+/) + units.splice(0, 1) + const values = query.t.split(/[^0-9]/) + values.splice(-1, 1) + if (units.length !== values.length) + throw new Error(`Youtube: Wrong time specifier: ${query.t}`) + for (let i = 0; i < units.length; i += 1) { + if (units[i] === 'h') info.time += Number(values[i]) * 3600 + else if (units[i] === 'm') info.time += Number(values[i]) * 60 + else if (units[i] === 's') info.time += Number(values[i]) + else throw new Error(`Youtube: Wrong time specifier: ${query.t}`) } } - return info; + return info } diff --git a/sitegin/writeFiles.js b/sitegin/writeFiles.js index 002e8354e518c6c21ede88b6e2d19061bca3117c..4e893493c5830a681f8771e57469ca74563ec214 100644 --- a/sitegin/writeFiles.js +++ b/sitegin/writeFiles.js @@ -1,38 +1,43 @@ +const fs = require('fs') +const path = require('path') +const mkdirp = require('mkdirp') -var fs = require('fs'); -var path = require('path'); -var mkdirp = require('mkdirp'); +module.exports = function writeFiles(obj) { + console.log('Build step: WriteFiles') + return new Promise((resolve, reject) => { + const { builddir } = obj.config + let todo = 0 -module.exports = function(obj) { - console.log('Build step: WriteFiles'); - return new Promise(function(resolve,reject) { - var builddir = obj.config.builddir; - var todo = 0; - - var doWrite = function(file, content) { - todo++; - mkdirp(path.dirname(file), function() { - fs.writeFile(file, content, function(err) { - if(err) reject(err); - todo--; - if(todo <= 0) resolve(obj); - }); - }); + const doWrite = (file, content) => { + todo += 1 + mkdirp(path.dirname(file), () => { + fs.writeFile(file, content, err => { + if (err) reject(err) + todo -= 1 + if (todo <= 0) resolve(obj) + }) + }) } - var writeFile = function(article) { - if(article.rendered) { - article.rendered.forEach(function(o) { - var f = path.join(builddir,article.file,'index.'+o.type); - doWrite(f, o.content); + const writeFile = article => { + if (article.rendered) { + article.rendered.forEach(o => { + const f = path.join(builddir, article.file, `index.${o.type}`) + doWrite(f, o.content) }) } else { - console.log(article); + console.log(article) } } - obj.pages.forEach(function(o) { writeFile(o); }) - obj.redirects.forEach(function(o) { writeFile(o); }) - obj.tags.forEach(function(o) { writeFile(o); }) - if(todo <= 0) resolve(obj); + obj.pages.forEach(o => { + writeFile(o) + }) + obj.redirects.forEach(o => { + writeFile(o) + }) + obj.tags.forEach(o => { + writeFile(o) + }) + if (todo <= 0) resolve(obj) }) }