diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..214c29d --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +registry=https://registry.npmjs.org/ diff --git a/package-lock.json b/package-lock.json index 1420aef..347f380 100644 --- a/package-lock.json +++ b/package-lock.json @@ -710,7 +710,7 @@ }, "babel-core": { "version": "6.26.3", - "resolved": "https://npm.wsmgroup.ru/babel-core/-/babel-core-6.26.3.tgz", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", "dev": true, "requires": { @@ -737,7 +737,7 @@ "dependencies": { "debug": { "version": "2.6.9", - "resolved": "https://npm.wsmgroup.ru/debug/-/debug-2.6.9.tgz", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { @@ -764,7 +764,7 @@ }, "babel-helpers": { "version": "6.24.1", - "resolved": "https://npm.wsmgroup.ru/babel-helpers/-/babel-helpers-6.24.1.tgz", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", "dev": true, "requires": { @@ -773,13 +773,13 @@ } }, "babel-jest": { - "version": "23.0.1", - "resolved": "https://npm.wsmgroup.ru/babel-jest/-/babel-jest-23.0.1.tgz", - "integrity": "sha1-u6079SP7IC2gXtCmVAtIyE7tE6Y=", + "version": "23.4.2", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-23.4.2.tgz", + "integrity": "sha512-wg1LJ2tzsafXqPFVgAsYsMCVD5U7kwJZAvbZIxVm27iOewsQw1BR7VZifDlMTEWVo3wasoPPyMdKXWCsfFPr3Q==", "dev": true, "requires": { "babel-plugin-istanbul": "^4.1.6", - "babel-preset-jest": "^23.0.1" + "babel-preset-jest": "^23.2.0" } }, "babel-messages": { @@ -804,9 +804,9 @@ } }, "babel-plugin-jest-hoist": { - "version": "23.0.1", - "resolved": "https://npm.wsmgroup.ru/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.0.1.tgz", - "integrity": "sha1-6qEclkVjrqnCG+zvK994U/fzwUg=", + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz", + "integrity": "sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc=", "dev": true }, "babel-plugin-syntax-object-rest-spread": { @@ -816,18 +816,18 @@ "dev": true }, "babel-preset-jest": { - "version": "23.0.1", - "resolved": "https://npm.wsmgroup.ru/babel-preset-jest/-/babel-preset-jest-23.0.1.tgz", - "integrity": "sha1-YxzFRcbPAhlDATvK8i9F2H/mIZg=", + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz", + "integrity": "sha1-jsegOhOPABoaj7HoETZSvxpV2kY=", "dev": true, "requires": { - "babel-plugin-jest-hoist": "^23.0.1", + "babel-plugin-jest-hoist": "^23.2.0", "babel-plugin-syntax-object-rest-spread": "^6.13.0" } }, "babel-register": { "version": "6.26.0", - "resolved": "https://npm.wsmgroup.ru/babel-register/-/babel-register-6.26.0.tgz", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", "dev": true, "requires": { @@ -3591,24 +3591,28 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true, "optional": true }, "ansi-regex": { "version": "2.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, "aproba": { "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true, "optional": true }, "are-we-there-yet": { "version": "1.1.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", "dev": true, "optional": true, "requires": { @@ -3618,12 +3622,14 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, "brace-expansion": { "version": "1.1.11", - "bundled": true, + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -3632,34 +3638,40 @@ }, "chownr": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", "dev": true, "optional": true }, "code-point-at": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, "concat-map": { "version": "0.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true }, "core-util-is": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true, "optional": true }, "debug": { "version": "2.6.9", - "bundled": true, + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "optional": true, "requires": { @@ -3668,25 +3680,29 @@ }, "deep-extend": { "version": "0.5.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz", + "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==", "dev": true, "optional": true }, "delegates": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true, "optional": true }, "detect-libc": { "version": "1.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "dev": true, "optional": true }, "fs-minipass": { "version": "1.2.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", "dev": true, "optional": true, "requires": { @@ -3695,13 +3711,15 @@ }, "fs.realpath": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true, "optional": true }, "gauge": { "version": "2.7.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "optional": true, "requires": { @@ -3717,7 +3735,8 @@ }, "glob": { "version": "7.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "optional": true, "requires": { @@ -3731,13 +3750,15 @@ }, "has-unicode": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true, "optional": true }, "iconv-lite": { "version": "0.4.21", - "bundled": true, + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz", + "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==", "dev": true, "optional": true, "requires": { @@ -3746,7 +3767,8 @@ }, "ignore-walk": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", "dev": true, "optional": true, "requires": { @@ -3755,7 +3777,8 @@ }, "inflight": { "version": "1.0.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "optional": true, "requires": { @@ -3765,18 +3788,21 @@ }, "inherits": { "version": "2.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, "ini": { "version": "1.3.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { "number-is-nan": "^1.0.0" @@ -3784,13 +3810,15 @@ }, "isarray": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true, "optional": true }, "minimatch": { "version": "3.0.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -3798,12 +3826,14 @@ }, "minimist": { "version": "0.0.8", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, "minipass": { "version": "2.2.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.2.4.tgz", + "integrity": "sha512-hzXIWWet/BzWhYs2b+u7dRHlruXhwdgvlTMDKC6Cb1U7ps6Ac6yQlR39xsbjWJE377YTCtKwIXIpJ5oP+j5y8g==", "dev": true, "requires": { "safe-buffer": "^5.1.1", @@ -3812,7 +3842,8 @@ }, "minizlib": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz", + "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==", "dev": true, "optional": true, "requires": { @@ -3821,7 +3852,8 @@ }, "mkdirp": { "version": "0.5.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { "minimist": "0.0.8" @@ -3829,13 +3861,15 @@ }, "ms": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true, "optional": true }, "needle": { "version": "2.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.0.tgz", + "integrity": "sha512-eFagy6c+TYayorXw/qtAdSvaUpEbBsDwDyxYFgLZ0lTojfH7K+OdBqAF7TAFwDokJaGpubpSGG0wO3iC0XPi8w==", "dev": true, "optional": true, "requires": { @@ -3846,7 +3880,8 @@ }, "node-pre-gyp": { "version": "0.10.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.10.0.tgz", + "integrity": "sha512-G7kEonQLRbcA/mOoFoxvlMrw6Q6dPf92+t/l0DFSMuSlDoWaI9JWIyPwK0jyE1bph//CUEL65/Fz1m2vJbmjQQ==", "dev": true, "optional": true, "requires": { @@ -3864,7 +3899,8 @@ }, "nopt": { "version": "4.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "dev": true, "optional": true, "requires": { @@ -3874,13 +3910,15 @@ }, "npm-bundled": { "version": "1.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.3.tgz", + "integrity": "sha512-ByQ3oJ/5ETLyglU2+8dBObvhfWXX8dtPZDMePCahptliFX2iIuhyEszyFk401PZUNQH20vvdW5MLjJxkwU80Ow==", "dev": true, "optional": true }, "npm-packlist": { "version": "1.1.10", - "bundled": true, + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.10.tgz", + "integrity": "sha512-AQC0Dyhzn4EiYEfIUjCdMl0JJ61I2ER9ukf/sLxJUcZHfo+VyEfz2rMJgLZSS1v30OxPQe1cN0LZA1xbcaVfWA==", "dev": true, "optional": true, "requires": { @@ -3890,7 +3928,8 @@ }, "npmlog": { "version": "4.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "optional": true, "requires": { @@ -3902,18 +3941,21 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, "object-assign": { "version": "4.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true, "optional": true }, "once": { "version": "1.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { "wrappy": "1" @@ -3921,19 +3963,22 @@ }, "os-homedir": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true, "optional": true }, "osenv": { "version": "0.1.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "optional": true, "requires": { @@ -3943,19 +3988,22 @@ }, "path-is-absolute": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true, "optional": true }, "process-nextick-args": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "dev": true, "optional": true }, "rc": { "version": "1.2.7", - "bundled": true, + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.7.tgz", + "integrity": "sha512-LdLD8xD4zzLsAT5xyushXDNscEjB7+2ulnl8+r1pnESlYtlJtVSoCMBGr30eDRJ3+2Gq89jK9P9e4tCEH1+ywA==", "dev": true, "optional": true, "requires": { @@ -3967,7 +4015,8 @@ "dependencies": { "minimist": { "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true, "optional": true } @@ -3975,7 +4024,8 @@ }, "readable-stream": { "version": "2.3.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "optional": true, "requires": { @@ -3990,7 +4040,8 @@ }, "rimraf": { "version": "2.6.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "optional": true, "requires": { @@ -3999,42 +4050,49 @@ }, "safe-buffer": { "version": "5.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", "dev": true }, "safer-buffer": { "version": "2.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "optional": true }, "sax": { "version": "1.2.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true, "optional": true }, "semver": { "version": "5.5.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", "dev": true, "optional": true }, "set-blocking": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true, "optional": true }, "signal-exit": { "version": "3.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true, "optional": true }, "string-width": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { "code-point-at": "^1.0.0", @@ -4044,7 +4102,8 @@ }, "string_decoder": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "optional": true, "requires": { @@ -4053,7 +4112,8 @@ }, "strip-ansi": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { "ansi-regex": "^2.0.0" @@ -4061,13 +4121,15 @@ }, "strip-json-comments": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true, "optional": true }, "tar": { "version": "4.4.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.1.tgz", + "integrity": "sha512-O+v1r9yN4tOsvl90p5HAP4AEqbYhx4036AGMm075fH9F8Qwi3oJ+v4u50FkT/KkvywNGtwkk0zRI+8eYm1X/xg==", "dev": true, "optional": true, "requires": { @@ -4082,13 +4144,15 @@ }, "util-deprecate": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true, "optional": true }, "wide-align": { "version": "1.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", "dev": true, "optional": true, "requires": { @@ -4097,12 +4161,14 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "yallist": { "version": "3.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", + "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=", "dev": true } } @@ -4428,7 +4494,7 @@ }, "home-or-tmp": { "version": "2.0.0", - "resolved": "https://npm.wsmgroup.ru/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "dev": true, "requires": { @@ -6887,7 +6953,7 @@ }, "private": { "version": "0.1.8", - "resolved": "https://npm.wsmgroup.ru/private/-/private-0.1.8.tgz", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", "dev": true }, @@ -8318,7 +8384,7 @@ }, "source-map-support": { "version": "0.4.18", - "resolved": "https://npm.wsmgroup.ru/source-map-support/-/source-map-support-0.4.18.tgz", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "dev": true, "requires": { diff --git a/package.json b/package.json index 587f3df..4309e9e 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,8 @@ }, "license": "MIT", "devDependencies": { + "babel-core": "^6.26.3", + "babel-jest": "^23.4.2", "benchmark": "^2.1.4", "eslint": "^4.19.1", "eslint-config-airbnb": "^16.1.0", diff --git a/packages/bbob-html/lib/index.js b/packages/bbob-html/lib/index.js index b8af469..1113638 100644 --- a/packages/bbob-html/lib/index.js +++ b/packages/bbob-html/lib/index.js @@ -1,19 +1,4 @@ -function escapeQuote(value) { - return value.replace(/"/g, '"'); -} - -function attrValue(name, value) { - const type = typeof value; - - const types = { - boolean: () => (value ? `${name}` : ''), - number: () => `${name}="${value}"`, - string: () => `${name}="${escapeQuote(value)}"`, - object: () => `${name}="${escapeQuote(JSON.stringify(value))}"`, - }; - - return types[type] ? types[type]() : ''; -} +const { attrValue } = require('@bbob/plugin-helper'); /** * Transforms attrs to html params string diff --git a/packages/bbob-html/package.json b/packages/bbob-html/package.json index e073d61..5763267 100644 --- a/packages/bbob-html/package.json +++ b/packages/bbob-html/package.json @@ -3,6 +3,9 @@ "version": "1.0.7", "description": "HTML renderer for BBCode pareser BBob", "main": "lib/index.js", + "dependencies": { + "@bbob/plugin-helper": "^1.0.0" + }, "devDependencies": { "@bbob/parser": "^1.1.0" }, diff --git a/packages/bbob-plugin-helper/.eslintignore b/packages/bbob-plugin-helper/.eslintignore new file mode 100644 index 0000000..ecfc81b --- /dev/null +++ b/packages/bbob-plugin-helper/.eslintignore @@ -0,0 +1,2 @@ +dist +test diff --git a/packages/bbob-plugin-helper/lib/TagNode.js b/packages/bbob-plugin-helper/lib/TagNode.js index 5fff0c9..b1bf463 100644 --- a/packages/bbob-plugin-helper/lib/TagNode.js +++ b/packages/bbob-plugin-helper/lib/TagNode.js @@ -29,8 +29,9 @@ class TagNode { toString() { const OB = getChar(OPEN_BRAKET); const CB = getChar(CLOSE_BRAKET); + const SL = getChar(SLASH); - return OB + this.tag + CB + this.content.reduce((r, node) => r + node.toString(), '') + OB + getChar(SLASH) + this.tag + CB; + return OB + this.tag + CB + this.content.reduce((r, node) => r + node.toString(), '') + OB + SL + this.tag + CB; } } diff --git a/packages/bbob-plugin-helper/lib/index.js b/packages/bbob-plugin-helper/lib/index.js index e4c6399..e5db153 100644 --- a/packages/bbob-plugin-helper/lib/index.js +++ b/packages/bbob-plugin-helper/lib/index.js @@ -1,6 +1,6 @@ const { getChar, N } = require('./char'); -const isTagNode = el => typeof el === 'object' && el.tag; +const isTagNode = el => typeof el === 'object' && !!el.tag; const isStringNode = el => typeof el === 'string'; const EOL = getChar(N); @@ -20,7 +20,23 @@ const appendToNode = (node, value) => { node.content.push(value); }; +const escapeQuote = value => value.replace(/"/g, '"'); + +const attrValue = (name, value) => { + const type = typeof value; + + const types = { + boolean: () => (value ? `${name}` : ''), + number: () => `${name}="${value}"`, + string: () => `${name}="${escapeQuote(value)}"`, + object: () => `${name}="${escapeQuote(JSON.stringify(value))}"`, + }; + + return types[type] ? types[type]() : ''; +}; + module.exports = { + attrValue, appendToNode, getNodeLength, isTagNode, diff --git a/packages/bbob-plugin-helper/test/TagNode.test.js b/packages/bbob-plugin-helper/test/TagNode.test.js new file mode 100644 index 0000000..f8415b7 --- /dev/null +++ b/packages/bbob-plugin-helper/test/TagNode.test.js @@ -0,0 +1,21 @@ +const TagNode = require('../lib/TagNode'); + +describe('@bbob/plugin-helper/lib/TagNode', () => { + test('create', () => { + const tagNode = TagNode.create('test', {test: 1}, ['Hello']); + + expect(tagNode).toBeInstanceOf(TagNode) + }); + + test('isOf', () => { + const tagNode = TagNode.create('test', {test: 1}, ['Hello']); + + expect(TagNode.isOf(tagNode, 'test')).toBe(true); + }); + + test('toString', () => { + const tagNode = TagNode.create('test', {test: 1}, ['Hello']); + + expect(String(tagNode)).toBe('[test]Hello[/test]'); + }); +}); diff --git a/packages/bbob-plugin-helper/test/index.test.js b/packages/bbob-plugin-helper/test/index.test.js index 003f779..914d9ce 100644 --- a/packages/bbob-plugin-helper/test/index.test.js +++ b/packages/bbob-plugin-helper/test/index.test.js @@ -1,6 +1,68 @@ +const { + attrValue, + appendToNode, + getNodeLength, + isTagNode, + isStringNode, +} = require('../lib'); describe('@bbob/plugin-helper', () => { - test('one', () => { - expect(1 + 2).toBe(3); + test('appendToNode', () => { + const value = 'test'; + const node = { content: [] }; + + appendToNode(node, value); + expect(node.content.pop()).toBe(value); + }); + + test('getNodeLength', () => { + const node = { + tag: 'test', + content: [ + '123', + { + tag: 'test2', + content: ['123'] + } + ] + }; + + expect(getNodeLength(node)).toBe(6) + }); + + test('isTagNode', () => { + const node = { + tag: 'test', + content: [] + }; + + expect(isTagNode(node)).toBe(true) + }); + + test('isStringNode', () => { + const node = { + tag: 'test', + content: ['123'] + }; + + expect(isStringNode(node.content[0])).toBe(true); + }); + + test('attrValue boolean', () => { + expect(attrValue('test', true)).toBe('test'); + }); + + test('attrValue number', () => { + expect(attrValue('test', 123)).toBe('test="123"'); + }); + + test('attrValue string', () => { + expect(attrValue('test', 'hello')).toBe('test="hello"'); + }); + + test('attrValue object', () => { + const attrs = { tag: 'test'}; + + expect(attrValue('test', attrs)).toBe('test="{"tag":"test"}"'); }); }); diff --git a/packages/bbob-preset-html5/lib/index.js b/packages/bbob-preset-html5/lib/index.js index f654f4a..5e942d7 100644 --- a/packages/bbob-preset-html5/lib/index.js +++ b/packages/bbob-preset-html5/lib/index.js @@ -1,12 +1,24 @@ +/* eslint-disable indent */ const { isTagNode } = require('@bbob/plugin-helper'); -const defaultProcessors = require('./default'); +const defaultTags = require('./default'); -module.exports = function html5Preset(opts = {}) { - const processors = Object.assign({}, defaultProcessors, opts.processors || {}); - - return function process(tree, core) { - tree.walk(node => (isTagNode(node) && processors[node.tag] - ? processors[node.tag](node, core) +function process(tags, tree, core) { + tree.walk(node => (isTagNode(node) && tags[node.tag] + ? tags[node.tag](node, core) : node)); - }; -}; +} + +function html5Preset(opts = {}) { + const tags = Object.assign({}, defaultTags, opts.tags || {}); + + return (tree, core) => process(tags, tree, core); +} + +function extend(callback) { + const tags = callback(defaultTags); + + return () => (tree, core) => process(tags, tree, core); +} + +module.exports = html5Preset; +module.exports.extend = extend; diff --git a/packages/bbob-react/.babelrc b/packages/bbob-react/.babelrc new file mode 100644 index 0000000..811d140 --- /dev/null +++ b/packages/bbob-react/.babelrc @@ -0,0 +1,5 @@ +{ + "presets": [ + "react" + ] +} diff --git a/packages/bbob-react/index.js b/packages/bbob-react/index.js deleted file mode 100644 index 1d2446d..0000000 --- a/packages/bbob-react/index.js +++ /dev/null @@ -1,47 +0,0 @@ -const React = require('react'); -const PropTypes = require('prop-types'); -const parse = require('@bbob/html'); - -class BBCode extends React.Component { - content() { - if (this.props.source) { - // eslint-disable-next-line react/no-danger - return ; - } - - return React.Children.map(this.props.children, (child) => { - if (typeof child === 'string') { - // eslint-disable-next-line react/no-danger - return ; - } - return child; - }); - } - - renderBBCode(source) { - return parse(source, this.props.options); - } - - render() { - const Container = this.props.container; - - return ({this.content()}); - } -} - -BBCode.propTypes = { - container: PropTypes.node, - children: PropTypes.element.isRequired, - source: PropTypes.string, - options: PropTypes.shape({ - prop: PropTypes.bool, - }), -}; - -BBCode.defaultProps = { - container: 'div', - options: {}, - source: null, -}; - -module.exports = BBCode; diff --git a/packages/bbob-react/index.test.js b/packages/bbob-react/index.test.js deleted file mode 100644 index 592f157..0000000 --- a/packages/bbob-react/index.test.js +++ /dev/null @@ -1,5 +0,0 @@ -describe('React BBCode', () => { - test('render markup properly', () => { - - }); -}); diff --git a/packages/bbob-react/lib/Component.js b/packages/bbob-react/lib/Component.js new file mode 100644 index 0000000..6c347ed --- /dev/null +++ b/packages/bbob-react/lib/Component.js @@ -0,0 +1,39 @@ +const React = require('react'); +const PropTypes = require('prop-types'); +const core = require('@bbob/core'); +const render = require('./render'); + +class Component extends React.Component { + content() { + return React.Children.map(this.props.children, (child) => { + if (typeof child === 'string') { + // eslint-disable-next-line react/no-danger + return render(this.renderBBCodeToAST(child)); + } + return child; + }); + } + + renderBBCodeToAST(source) { + return core(this.props.plugins).process(source).tree; + } + + render() { + const Container = this.props.container; + + return ({this.content()}); + } +} + +Component.propTypes = { + container: PropTypes.node, + children: PropTypes.node.isRequired, + plugins: PropTypes.arrayOf(Function), +}; + +Component.defaultProps = { + container: 'span', + plugins: [], +}; + +module.exports = Component; diff --git a/packages/bbob-react/lib/index.js b/packages/bbob-react/lib/index.js new file mode 100644 index 0000000..6f8ed4a --- /dev/null +++ b/packages/bbob-react/lib/index.js @@ -0,0 +1,2 @@ +module.exports = require('./Component'); + diff --git a/packages/bbob-react/lib/preset-html5.js b/packages/bbob-react/lib/preset-html5.js new file mode 100644 index 0000000..38554fa --- /dev/null +++ b/packages/bbob-react/lib/preset-html5.js @@ -0,0 +1,33 @@ +const presetHTML5 = require('@bbob/preset-html5'); + +module.exports = presetHTML5.extend(tags => ({ + ...tags, + + b: (...args) => ({ + ...tags.b(...args), + attrs: { + style: { fontWeight: 'bold' }, + }, + }), + + i: (...args) => ({ + ...tags.b(...args), + attrs: { + style: { fontStyle: 'italic' }, + }, + }), + + u: (...args) => ({ + ...tags.b(...args), + attrs: { + style: { textDecoration: 'underline' }, + }, + }), + + s: (...args) => ({ + ...tags.b(...args), + attrs: { + style: { textDecoration: 'line-through' }, + }, + }), +})); diff --git a/packages/bbob-react/lib/render.js b/packages/bbob-react/lib/render.js new file mode 100644 index 0000000..555e7d9 --- /dev/null +++ b/packages/bbob-react/lib/render.js @@ -0,0 +1,35 @@ +const React = require('react'); +const { isTagNode, isStringNode } = require('@bbob/plugin-helper'); + +function tagToReactElement(node) { + if (node.content === null) { + return React.createElement( + node.tag, + node.attrs, + null, + ); + } + + return React.createElement( + node.tag, + node.attrs, + // eslint-disable-next-line no-use-before-define + render(node.content), + ); +} + +function render(nodes) { + const els = nodes.reduce((arr, node) => { + if (isTagNode(node)) { + arr.push(tagToReactElement(node)); + } else if (isStringNode(node)) { + arr.push(node); + } + + return arr; + }, []); + + return els; +} + +module.exports = render; diff --git a/packages/bbob-react/package.json b/packages/bbob-react/package.json index 3537b3a..7d57fbb 100644 --- a/packages/bbob-react/package.json +++ b/packages/bbob-react/package.json @@ -2,7 +2,23 @@ "name": "@bbob/react", "version": "1.0.7", "description": "", - "main": "index.js", + "main": "lib/index.js", + "directories": { + "lib": "lib" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/JiLiZART/bbob.git" + }, + "keywords": [ + "bbob", + "react", + "helper" + ], + "bugs": { + "url": "https://github.com/JiLiZART/bbob/issues" + }, + "homepage": "https://github.com/JiLiZART/bbob#readme", "scripts": { "test": "../../node_modules/.bin/jest --", "cover": "../../node_modules/.bin/jest --coverage", @@ -14,11 +30,20 @@ "registry": "https://registry.npmjs.org/" }, "dependencies": { - "@bbob/html": "^1.0.7", - "prop-types": "^15.6.1", - "react": "^15.6.2" + "@bbob/core": "^1.x", + "@bbob/plugin-helper": "^1.x", + "@bbob/preset-html5": "^1.0.5", + "prop-types": "^15.6.1" }, "peerDependencies": { "react": "15.x" + }, + "devDependencies": { + "babel-preset-react": "^6.24.1", + "enzyme": "^3.4.0", + "enzyme-adapter-react-15": "^1.0.6", + "react": "15.x", + "react-dom": "^15.6.2", + "react-test-renderer": "^15.6.2" } } diff --git a/packages/bbob-react/test/index.test.js b/packages/bbob-react/test/index.test.js new file mode 100644 index 0000000..6d36629 --- /dev/null +++ b/packages/bbob-react/test/index.test.js @@ -0,0 +1,44 @@ +const React = require('react'); +const { shallow } = require('enzyme'); +const BBCode = require('../lib'); +const presetHTML5 = require('../lib/preset-html5'); +const Enzyme = require('enzyme'); +const Adapter = require('enzyme-adapter-react-15'); + +Enzyme.configure({ adapter: new Adapter() }); + +const renderBBCode = input => shallow( + {input} +).html(); + +describe('@bbob/react', () => { + test('[b]bolded text[/b]', () => { + const html = renderBBCode('[b]bolded text[/b]'); + + expect(html).toBe('bolded text') + }); + + test('[i]italicized text[/i]', () => { + const html = renderBBCode('[i]italicized text[/i]'); + + expect(html).toBe('italicized text') + }); + + test('[u]underlined text[/u]', () => { + const html = renderBBCode('[u]underlined text[/u]'); + + expect(html).toBe('underlined text') + }); + + test('[s]strikethrough text[/s]', () => { + const html = renderBBCode('[s]strikethrough text[/s]'); + + expect(html).toBe('strikethrough text') + }); + + test('[url]https://en.wikipedia.org[/url]', () => { + const html = renderBBCode('[url]https://en.wikipedia.org[/url]'); + + expect(html).toBe('https://en.wikipedia.org') + }); +});