{"_id":"picturebook","_rev":"120-ac1602322296fd6c6e76c7235d02b270","name":"picturebook","description":"Opinionated Storybook Setup","dist-tags":{"latest":"2.0.0-beta.18","test":"1.1.9-test14","beta":"2.0.0-beta.24","alpha":"3.0.0-alpha.2"},"versions":{"1.0.0":{"name":"picturebook","version":"1.0.0","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh"},"dependencies":{"@storybook/addon-knobs":"3.2.14","@storybook/addon-notes":"3.2.14","@storybook/addon-options":"3.2.14","@storybook/react":"3.2.14","find-up":"2.1.0","lodash":"4.17.4","react":"16.0.0","react-dom":"16.0.0","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.1","babel-plugin-flow-react-proptypes":"8.0.0","babel-plugin-lodash":"3.2.11","babel-plugin-module-resolver":"2.7.1","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-plugin-transform-runtime":"6.23.0","babel-preset-env":"1.6.1","babel-runtime":"6.26.0","eslint":"4.10.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-flowtype":"2.39.1","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0"},"_id":"picturebook@1.0.0","dist":{"shasum":"49bb543751cfe51b096494e576bb2dd701a3609c","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.0.tgz","integrity":"sha512-MKjKk7SjvdpxbnyqTDDc9Wv5A5z/P8rXlDNkLhLTxAbO4Ipz7G1osx8PFPzbdxm9oYdv5bmkH/u9l0kFqB+9lg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDw4G5ckPTvm1G7FmHLP7CR0poPcNkUXuRM0VHLE9rF+AIhANNb2IlEn7aH2WDizhntBnG1ZUUnPNSMspE3IGpU0FPP"}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.0.tgz_1509764429358_0.7758111031726003"},"directories":{}},"1.0.1":{"name":"picturebook","version":"1.0.1","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh"},"dependencies":{"@storybook/addon-knobs":"3.2.14","@storybook/addon-notes":"3.2.14","@storybook/addon-options":"3.2.14","@storybook/react":"3.2.14","find-up":"2.1.0","lodash":"4.17.4","react":"16.0.0","react-dom":"16.0.0","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.1","babel-plugin-flow-react-proptypes":"8.0.0","babel-plugin-lodash":"3.2.11","babel-plugin-module-resolver":"2.7.1","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-plugin-transform-runtime":"6.23.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","eslint":"4.10.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-flowtype":"2.39.1","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0"},"_id":"picturebook@1.0.1","dist":{"shasum":"a858338210369e743645d86d0a5be266dfdd635c","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.1.tgz","integrity":"sha512-cnpL/dGhbN1a9yTregfU5VPsNOQAOB924Swv0ZPHB5yh1vMnWiOKRKC7iTtehJ3k2zFJUdF80jCuV23E7eL1EQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCwjAq/vCEdKYHE6mjF6xDJI0kNka80Woq+tQwMuBzbcQIgAgB6YUAoBa8OqLm1K6orL+GARpHwBmORYJJsvkoil6s="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.1.tgz_1509814983559_0.8243501950055361"},"directories":{}},"1.0.2":{"name":"picturebook","version":"1.0.2","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh"},"scripts":{"format-all":"git ls-files {config,}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/addon-knobs":"3.2.14","@storybook/addon-notes":"3.2.14","@storybook/addon-options":"3.2.14","@storybook/react":"3.2.14","find-up":"2.1.0","lodash":"4.17.4","rc":"1.2.2","react":"16.0.0","react-dom":"16.0.0","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.1","babel-plugin-flow-react-proptypes":"8.0.0","babel-plugin-lodash":"3.2.11","babel-plugin-module-resolver":"2.7.1","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-plugin-transform-runtime":"6.23.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","eslint":"4.10.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-flowtype":"2.39.1","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","prettier":"1.7.4"},"_id":"picturebook@1.0.2","dist":{"shasum":"162bf31c3ae1810cdcfac16f97c43fd2799ca040","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.2.tgz","integrity":"sha512-ywNetzW1fzQJQ3Zt937fS8fy+nYjt10DRYo3v9dc94DI5LZh2mieUjWERwSXDEu5qAg6ZOZ6P2MfDdUsC1Eh7g==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCOv6oeHZisyCgUsIMiuw1ab3NI3bs9ATzc3AiUlLTUFQIgCPeOt7MzLLqiNZJRx7KsjxY9aJQdibEdOfU2DmKgglY="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.2.tgz_1509824027860_0.14528250112198293"},"directories":{}},"1.0.3":{"name":"picturebook","version":"1.0.3","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh"},"scripts":{"format-all":"git ls-files {config,}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/addon-actions":"3.2.14","@storybook/addon-knobs":"3.2.14","@storybook/addon-notes":"3.2.14","@storybook/addon-options":"3.2.14","@storybook/channels":"3.2.14","@storybook/react":"3.2.14","find-up":"2.1.0","lodash":"4.17.4","rc":"1.2.2","react":"16.0.0","react-dom":"16.0.0","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.1","babel-plugin-flow-react-proptypes":"8.0.0","babel-plugin-lodash":"3.2.11","babel-plugin-module-resolver":"2.7.1","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-plugin-transform-runtime":"6.23.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","eslint":"4.10.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-flowtype":"2.39.1","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","prettier":"1.7.4"},"_id":"picturebook@1.0.3","dist":{"shasum":"8e6e9b24d48d51cce7c671fd198316152f75eb2d","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.3.tgz","integrity":"sha512-ZAgtRTAVur4/7C0x+im1q9pIBkkk3POJUJRpEn7EHiHA4TD3a1OSpOIuPg4gSnjn8zIkA65dcpuaeNze8ViHlA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBdGyexphTnSNyfGRIGF9lqwZlpj6A6w97q6u9A7UiSAAiEAvqzp0DIvqeYBV6MVtIendiNs7tn6PkRGxxE4IGCpnqM="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.3.tgz_1509841027448_0.8559408071450889"},"directories":{}},"1.0.4":{"name":"picturebook","version":"1.0.4","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh"},"scripts":{"format-all":"git ls-files {config,}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/addon-actions":"3.2.14","@storybook/addon-knobs":"3.2.14","@storybook/addon-notes":"3.2.14","@storybook/addon-options":"3.2.14","@storybook/channels":"3.2.14","@storybook/react":"3.2.14","find-up":"2.1.0","lodash":"4.17.4","rc":"1.2.2","react":"16.0.0","react-dom":"16.0.0","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.1","babel-plugin-flow-react-proptypes":"8.0.0","babel-plugin-lodash":"3.2.11","babel-plugin-module-resolver":"2.7.1","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-plugin-transform-runtime":"6.23.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","eslint":"4.10.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-flowtype":"2.39.1","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","prettier":"1.7.4"},"_id":"picturebook@1.0.4","dist":{"shasum":"e635937a28d3f49958f947573c3df4a749800744","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.4.tgz","integrity":"sha512-YblZhFCGaZbbxMKSPHeAPMSPqH+1J4uCiMboULZDZ5UyzMb9jN+hTsM6QV8mcnSysEg22NpispUSqHP/XMMR/w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDma74601UtdtYdgBf9j5a/hqdHDrU4OoZDRwrUub9TrwIhAKirw9sGf4fnNEjxq0zDeQwQKVGEvmW6/j0NbIsC++nV"}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.4.tgz_1509984361803_0.7253201603889465"},"directories":{}},"1.0.5":{"name":"picturebook","version":"1.0.5","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh"},"scripts":{"format-all":"git ls-files {config,}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/addon-actions":"3.2.14","@storybook/addon-knobs":"3.2.14","@storybook/addon-notes":"3.2.14","@storybook/addon-options":"3.2.14","@storybook/channels":"3.2.14","@storybook/react":"3.2.14","find-up":"2.1.0","lodash":"4.17.4","rc":"1.2.2","react":"16.0.0","react-dom":"16.0.0","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.1","babel-plugin-flow-react-proptypes":"8.0.0","babel-plugin-lodash":"3.2.11","babel-plugin-module-resolver":"2.7.1","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-plugin-transform-runtime":"6.23.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.10.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-flowtype":"2.39.1","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.7.4"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.5","dist":{"shasum":"def1c307a07f74355248cfbd343b320f4a872c27","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.5.tgz","integrity":"sha512-Pn1mTRuG+7tM3bt9Bizoj1d9vyP16874O5jsE9oxbrPzN4nlfDDdvCCXM6Ng/I19hYh/BDMkVuAooMteKkfBlw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGpenB/c+wG1+ChtoYvDdR3tWyU3vr1kEV7w4f/dE96yAiAuSrKSuW6wn71rF3pqCDdiRfmKaFh/vJNay2uQu3TkBg=="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.5.tgz_1509997274778_0.645889273378998"},"directories":{}},"1.0.6":{"name":"picturebook","version":"1.0.6","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh"},"scripts":{"format-all":"git ls-files {config,}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/addon-actions":"3.2.14","@storybook/addon-knobs":"3.2.14","@storybook/addon-notes":"3.2.14","@storybook/addon-options":"3.2.14","@storybook/channels":"3.2.14","@storybook/react":"3.2.14","find-up":"2.1.0","lodash":"4.17.4","rc":"1.2.2","react":"16.0.0","react-dom":"16.0.0","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.1","babel-plugin-flow-react-proptypes":"8.0.0","babel-plugin-lodash":"3.2.11","babel-plugin-module-resolver":"2.7.1","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-plugin-transform-runtime":"6.23.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.10.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-flowtype":"2.39.1","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.7.4"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.6","dist":{"shasum":"f540f1432325b2725468f40deb5081e3bcc0b4f4","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.6.tgz","integrity":"sha512-C16BaM0phOEPBLhGHDFjyN7abC5+tBOBMLeQ//tVG7gQTMce/VcodkeNTwnzG6U5JW8vBJiwCIQxfP5OkdNojA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD6EsCUeDn964fa8rvl0wTyef5Srtnb4WEY16OKf13/7gIhAKqBmqIT3UiCe5FwbLClk+tn8IhRbMUHobpXiO8CjuQ/"}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.6.tgz_1509998333344_0.8589474761392921"},"directories":{}},"1.0.7":{"name":"picturebook","version":"1.0.7","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh"},"scripts":{"format-all":"git ls-files {config,}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/addon-actions":"3.2.14","@storybook/addon-knobs":"3.2.14","@storybook/addon-notes":"3.2.14","@storybook/addon-options":"3.2.14","@storybook/channels":"3.2.14","@storybook/react":"3.2.14","find-up":"2.1.0","lodash":"4.17.4","rc":"1.2.2","react":"16.0.0","react-dom":"16.0.0","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.1","babel-plugin-flow-react-proptypes":"8.0.0","babel-plugin-lodash":"3.2.11","babel-plugin-module-resolver":"2.7.1","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-plugin-transform-runtime":"6.23.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.10.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-flowtype":"2.39.1","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.7.4"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.7","dist":{"shasum":"a724b6baa1de9998bf92a36b51f0234470ef30a0","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.7.tgz","integrity":"sha512-Oen5AtqwDRab320rXy81uu3xS2n+ijN0rKSvcY5Wggq6CGTrEgXGoecVtc7Gh+zSILiLs6Kx753UwFvXt1uwkQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCXi5bNDyq47OFaV3MryH5mUF1rXum7ag1NkPpetTfiGgIgGxwlevsyX0f1PNvxopvocasNrRveVFXMHcVaaSzlJ5w="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.7.tgz_1510001547450_0.33093655575066805"},"directories":{}},"1.0.8":{"name":"picturebook","version":"1.0.8","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-jest":"./picturebook-jest.js"},"scripts":{"format-all":"git ls-files {config,}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/addon-actions":"3.2.14","@storybook/addon-knobs":"3.2.14","@storybook/addon-notes":"3.2.14","@storybook/addon-options":"3.2.14","@storybook/channels":"3.2.14","@storybook/react":"3.2.14","enzyme":"3.1.1","enzyme-adapter-react-16":"1.0.4","find-up":"2.1.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","rc":"1.2.2","react":"16.0.0","react-dom":"16.0.0","saucelabs":"1.4.0","selenium-standalone":"6.11.0","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.1","babel-jest":"21.2.0","babel-plugin-flow-react-proptypes":"8.0.0","babel-plugin-lodash":"3.2.11","babel-plugin-module-resolver":"2.7.1","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-plugin-transform-runtime":"6.23.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.10.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-flowtype":"2.39.1","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","jest":"21.2.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.7.4"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.8","dist":{"shasum":"a1464961cd427f46b413166cd9ed05ce487e16e5","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.8.tgz","integrity":"sha512-1KU4B7o7SU/PVTa7PlJTl+fo1mJZHz63KjgQD9USYFjEd4paEcVNxKAkGhZdvFRWL3d+AVTNcHsQmqrzaZUoBA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAyc+7+Ys6F1zrgDlAGw+h/bTE0ihnk8xrJREDqJHAL9AiEApVaHWOCrQ54cLdCrKl0zoe3gS39UV0iY0S1VcEqly+s="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.8.tgz_1510023687226_0.17615283536724746"},"directories":{}},"1.0.9":{"name":"picturebook","version":"1.0.9","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-jest":"./picturebook-jest.sh"},"scripts":{"format-all":"git ls-files {config,}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/addon-actions":"3.2.14","@storybook/addon-knobs":"3.2.14","@storybook/addon-notes":"3.2.14","@storybook/addon-options":"3.2.14","@storybook/channels":"3.2.14","@storybook/react":"3.2.14","enzyme":"3.1.1","enzyme-adapter-react-16":"1.0.4","find-up":"2.1.0","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","rc":"1.2.2","react":"16.0.0","react-dom":"16.0.0","saucelabs":"1.4.0","selenium-standalone":"6.11.0","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.1","babel-jest":"21.2.0","babel-plugin-flow-react-proptypes":"8.0.0","babel-plugin-lodash":"3.2.11","babel-plugin-module-resolver":"2.7.1","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-plugin-transform-runtime":"6.23.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.10.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-flowtype":"2.39.1","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","jest":"21.2.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.7.4"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.9","dist":{"shasum":"d0068dfdc207852fefe6c5d3948e636b415675dd","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.9.tgz","integrity":"sha512-yxpe5JkwtgeDJ2jIOMlC676uAH9Wp6lk5I6YkZNCIIdMgmg4al9lPoKRGL8pW92ZbxNt0XP79mdOY/f8+rd1Ug==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD9nJDXy6jg43A/oY4JYaoDrZvKbsT8+lSDx9SBO3BlsQIhAP6Eo8D2aiHOtkFIE730ohTl1+J1RmQAUGAWgRrTllC6"}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.9.tgz_1510031913956_0.321781741688028"},"directories":{}},"1.0.10":{"name":"picturebook","version":"1.0.10","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-jest":"./picturebook-jest.sh"},"scripts":{"format-all":"git ls-files {config,}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/addon-actions":"3.2.14","@storybook/addon-knobs":"3.2.14","@storybook/addon-notes":"3.2.14","@storybook/addon-options":"3.2.14","@storybook/channels":"3.2.14","@storybook/react":"3.2.14","enzyme":"3.1.1","enzyme-adapter-react-16":"1.0.4","find-up":"2.1.0","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","rc":"1.2.2","react":"16.0.0","react-dom":"16.0.0","saucelabs":"1.4.0","selenium-standalone":"6.11.0","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.1","babel-jest":"21.2.0","babel-plugin-flow-react-proptypes":"8.0.0","babel-plugin-lodash":"3.2.11","babel-plugin-module-resolver":"2.7.1","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-plugin-transform-runtime":"6.23.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.10.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-flowtype":"2.39.1","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","jest":"21.2.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.7.4"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.10","dist":{"shasum":"2b85b6dbdb17166ff9ae4ccd2186bfbfaff18d1f","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.10.tgz","integrity":"sha512-xp5F+1rDLHVv4gBSKBO7HIV0xWxirpnCvBeJdarOsXTwuDUNw2bfoA+wkLFwLIiXKrQOg6IPPoOLlOgoMsO8OQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGKLl2usGlmn6lGvzb8XRmqIp7mkoeZ7jd6Os/E+NiMvAiEAhyOAsQG/gzyWrle1uHgdPAGSEGXH5m3j0FTAMUyk4Jc="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.10.tgz_1510032029462_0.8295000751968473"},"directories":{}},"1.0.11":{"name":"picturebook","version":"1.0.11","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-jest":"./picturebook-jest.sh"},"scripts":{"format-all":"git ls-files {config,}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/addon-actions":"3.2.14","@storybook/addon-knobs":"3.2.14","@storybook/addon-notes":"3.2.14","@storybook/addon-options":"3.2.14","@storybook/addon-storyshots":"3.2.14","@storybook/channels":"3.2.14","@storybook/react":"3.2.14","find-up":"2.1.0","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","rc":"1.2.2","react":"16.0.0","react-dom":"16.0.0","saucelabs":"1.4.0","selenium-standalone":"6.11.0","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.1","babel-jest":"21.2.0","babel-plugin-flow-react-proptypes":"8.0.0","babel-plugin-lodash":"3.2.11","babel-plugin-module-resolver":"2.7.1","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-plugin-transform-runtime":"6.23.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.10.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-flowtype":"2.39.1","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","jest":"21.2.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.7.4"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.11","dist":{"shasum":"c343dfab3be26cba7dcd017a71da712ce5b2aaf7","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.11.tgz","integrity":"sha512-AJfI0k9tuDFIgyYus62e4K+iyOELoZIzzfaALEoV+sAhptj2APQbQQESOAwXb/pnavWqOv4Wc+G4bDXK9n0VwQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCJkVnVFhazjUQRcFTZ+ANv15WGLidyIfceoO6B1CO0sAIhAMzS3ybR2Z4fWyblpk5ibdpNA0a7ic6v1T+Ao9huAnRH"}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.11.tgz_1510111905702_0.9678490113001317"},"directories":{}},"1.0.12":{"name":"picturebook","version":"1.0.12","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-jest":"./picturebook-jest.sh"},"scripts":{"format-all":"git ls-files {config,}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/addon-actions":"3.2.14","@storybook/addon-knobs":"3.2.14","@storybook/addon-notes":"3.2.14","@storybook/addon-options":"3.2.14","@storybook/addon-storyshots":"3.2.14","@storybook/channels":"3.2.14","@storybook/react":"3.2.14","find-up":"2.1.0","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","rc":"1.2.2","react":"16.0.0","react-dom":"16.0.0","saucelabs":"1.4.0","selenium-standalone":"6.11.0","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.1","babel-jest":"21.2.0","babel-plugin-flow-react-proptypes":"8.0.0","babel-plugin-lodash":"3.2.11","babel-plugin-module-resolver":"2.7.1","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-plugin-transform-runtime":"6.23.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.10.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-flowtype":"2.39.1","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.7.4"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.12","dist":{"shasum":"8a799b9beb814b04ba2ef8cdb44dd6534d892381","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.12.tgz","integrity":"sha512-R9FT9IvjuqqkNCvCfVAEjsPIZEf9VwtEjDv9g71gYBMQV0trEOim9sqVvt7qgDkbT62SVKIsCa1Zpmltfm3Vnw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDlLEDWCoitpGDxnZqNcPWSLM9+3gbHM1Kmoe0j5JLz0AiEAqPtXLQL+ObVJtOLu9RKl4qdXOUesGlDVCD+kkAlaiPw="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.12.tgz_1510112231584_0.47742528817616403"},"directories":{}},"1.0.13":{"name":"picturebook","version":"1.0.13","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-jest":"./picturebook-jest.sh"},"scripts":{"format-all":"git ls-files {config,}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/addon-actions":"3.2.14","@storybook/addon-knobs":"3.2.14","@storybook/addon-notes":"3.2.14","@storybook/addon-options":"3.2.14","@storybook/addon-storyshots":"3.2.14","@storybook/channels":"3.2.14","@storybook/react":"3.2.14","find-up":"2.1.0","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","jest":"21.2.1","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","rc":"1.2.2","react":"16.0.0","react-dom":"16.0.0","saucelabs":"1.4.0","selenium-standalone":"6.11.0","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.1","babel-jest":"21.2.0","babel-plugin-flow-react-proptypes":"8.0.0","babel-plugin-lodash":"3.2.11","babel-plugin-module-resolver":"2.7.1","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-plugin-transform-runtime":"6.23.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.10.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-flowtype":"2.39.1","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.7.4"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.13","dist":{"shasum":"8fbaf69fd2ee6c161e6d32d64e54686ccd7f9589","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.13.tgz","integrity":"sha512-52/WRIEoMPZFRWfzdZQzeSRdPl2J4k8b2MDGizx0WUxZqWPM/0i2IzD7+K+laWCG4VgTFPxsuau6TMiwpbL8Sw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDviC4Gx1C5DHAopewRsxcaMR6I4BdV7EYUhO1atsBoxAIgCfCcicZvRdK4CpIeuS4hgYgCBR5C6ty4YdkEoWt46qA="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.13.tgz_1510115358140_0.47580928821116686"},"directories":{}},"1.0.14":{"name":"picturebook","version":"1.0.14","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-jest":"./picturebook-jest.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/addon-actions":"3.2.14","@storybook/addon-knobs":"3.2.14","@storybook/addon-notes":"3.2.14","@storybook/addon-options":"3.2.14","@storybook/addon-storyshots":"3.2.14","@storybook/channels":"3.2.14","@storybook/react":"3.2.14","find-up":"2.1.0","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","jest":"21.2.1","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","rc":"1.2.2","react":"16.0.0","react-dom":"16.0.0","saucelabs":"1.4.0","selenium-standalone":"6.11.0","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.1","babel-jest":"21.2.0","babel-plugin-flow-react-proptypes":"8.0.0","babel-plugin-lodash":"3.2.11","babel-plugin-module-resolver":"2.7.1","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-plugin-transform-runtime":"6.23.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.10.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-flowtype":"2.39.1","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.7.4"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.14","dist":{"shasum":"d969a1a887e194b8c665ea14c7ebc6f4035e7740","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.14.tgz","integrity":"sha512-bGoymt2gjjOJWgt2GUk94zhPucj3HlbkkJR2GVl2ZBKgCt4S78bm/hpgSR0vz354/VHZhacsiXpdZK4/6h2VEQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIARiTTHnjxwnAbDYZvTvaHYYnTMTih6uwStXUVW9f7ylAiB7VlOLi324MKcqCSX3OTjx3XIG+3R8r34r99vyvLGXbw=="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.14.tgz_1510116111365_0.8421357769984752"},"directories":{}},"1.0.15":{"name":"picturebook","version":"1.0.15","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-jest":"./picturebook-jest.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/addon-actions":"3.2.14","@storybook/addon-knobs":"3.2.14","@storybook/addon-notes":"3.2.14","@storybook/addon-options":"3.2.14","@storybook/addon-storyshots":"3.2.14","@storybook/channels":"3.2.14","@storybook/react":"3.2.14","find-up":"2.1.0","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","jest":"21.2.1","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","rc":"1.2.2","react":"16.0.0","react-dom":"16.0.0","saucelabs":"1.4.0","selenium-standalone":"6.11.0","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.1","babel-jest":"21.2.0","babel-plugin-flow-react-proptypes":"8.0.0","babel-plugin-lodash":"3.2.11","babel-plugin-module-resolver":"2.7.1","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-plugin-transform-runtime":"6.23.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.10.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-flowtype":"2.39.1","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.7.4"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.15","dist":{"shasum":"91f8e51960e461632dea56ea015e5070ee07b4cf","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.15.tgz","integrity":"sha512-cpttudD/aD0tOje3I3O7i0il8TwGHVi5eBrqu5aN7dTLiKP4qaW53qpxU6+sGjY0aQnLgL+U/tW0J4ll1RlfGQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGKCLXs6p2OWpdWLKswdfrgzyeqGvkM7tCGhSFgpNmvjAiBK/R4RwNkPGPIRPoVJlS5Pehe4E722T/wnObzvhcN0yw=="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.15.tgz_1510117976156_0.9012104668654501"},"directories":{}},"1.0.16":{"name":"picturebook","version":"1.0.16","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-jest":"./picturebook-jest.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/addon-actions":"3.2.14","@storybook/addon-knobs":"3.2.14","@storybook/addon-notes":"3.2.14","@storybook/addon-options":"3.2.14","@storybook/addon-storyshots":"3.2.14","@storybook/channels":"3.2.14","@storybook/react":"3.2.14","find-up":"2.1.0","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","jest":"21.2.1","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","rc":"1.2.2","react":"16.0.0","react-dom":"16.0.0","saucelabs":"1.4.0","selenium-standalone":"6.11.0","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.1","babel-jest":"21.2.0","babel-plugin-flow-react-proptypes":"8.0.0","babel-plugin-lodash":"3.2.11","babel-plugin-module-resolver":"2.7.1","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-plugin-transform-runtime":"6.23.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.10.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-flowtype":"2.39.1","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.7.4"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.16","dist":{"shasum":"ac91355de4183186b0b38b4b42b950899771c61e","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.16.tgz","integrity":"sha512-mJ/fMq/3Bi5nKp1Z5gFYNOxgtpfw4571NJH3BPm/5CxzEI7Ytj0UnCOs60vS7hXj1/UPgk8IxtHOTOfDzH0YPQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC5XsJwG3oICmiieenJmbKVLgry9VnZ469rtJMxSW/RLwIgFnCjbWtraz7Bzjh+TEu+83pRjlwtTYLap2DklRIzroI="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.16.tgz_1510270664572_0.4836371762212366"},"directories":{}},"1.0.17":{"name":"picturebook","version":"1.0.17","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-jest":"./picturebook-jest.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/addon-actions":"3.2.14","@storybook/addon-knobs":"3.2.14","@storybook/addon-notes":"3.2.14","@storybook/addon-options":"3.2.14","@storybook/addon-storyshots":"3.2.14","@storybook/channels":"3.2.14","@storybook/react":"3.2.14","find-up":"2.1.0","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","jest":"21.2.1","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","rc":"1.2.2","react":"16.0.0","react-dom":"16.0.0","saucelabs":"1.4.0","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.1","babel-jest":"21.2.0","babel-plugin-flow-react-proptypes":"8.0.0","babel-plugin-lodash":"3.2.11","babel-plugin-module-resolver":"2.7.1","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-plugin-transform-runtime":"6.23.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.10.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-flowtype":"2.39.1","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.7.4"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.17","dist":{"shasum":"3a3261553c9e9ddf5d8c597baed57202e28a174c","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.17.tgz","integrity":"sha512-XfAOMyU1ZxoY409wAAlTAdHlPl7BD4+6E0gY5pZpBjHsiq8kayQDmtLQN/zj2WK1EwSOjbMeYw+BqpEBCeFyFQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDJR8XOm1o+kFGkrIWQ0cuK8u/cLDhdk2lMKks+llVL2AIgcDKip2C76SLjud5UKrgpkA+UwDyOPCWQB25q3i/Gd/g="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.17.tgz_1510271772967_0.4097392354160547"},"directories":{}},"1.0.18":{"name":"picturebook","version":"1.0.18","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-jest":"./picturebook-jest.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/addon-actions":"3.2.14","@storybook/addon-knobs":"3.2.14","@storybook/addon-notes":"3.2.14","@storybook/addon-options":"3.2.14","@storybook/addon-storyshots":"3.2.14","@storybook/channels":"3.2.14","@storybook/react":"3.2.14","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","jest":"21.2.1","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","rc":"1.2.2","react":"16.0.0","react-dom":"16.0.0","saucelabs":"1.4.0","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.1","babel-jest":"21.2.0","babel-plugin-flow-react-proptypes":"8.0.0","babel-plugin-lodash":"3.2.11","babel-plugin-module-resolver":"2.7.1","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-plugin-transform-runtime":"6.23.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.10.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-flowtype":"2.39.1","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.7.4"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.18","dist":{"shasum":"a2c8682a7b997713b39bb6c796e90d1cf405d898","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.18.tgz","integrity":"sha512-AAlebTtTReI2z6/kStFCIf43EjqRzH9O6cFmOXewyV8AFAexEiBK0ZvpFwe+Zgy0mQLSZAVkbpNBXHtr2ySAVQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBGIrUlTrE6mtUBWZC+47Kv510V6rA3uSRU0koxywPHbAiEAzvNI+IWH8cBAwelw1uZrxLHKsmOUSskqbqYqURnPyYM="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.18.tgz_1510272949706_0.6602432248182595"},"directories":{}},"1.0.18-test.1":{"name":"picturebook","version":"1.0.18-test.1","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-jest":"./picturebook-jest.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/addon-actions":"3.2.14","@storybook/addon-knobs":"3.2.14","@storybook/addon-notes":"3.2.14","@storybook/addon-options":"3.2.14","@storybook/addon-storyshots":"3.2.14","@storybook/channels":"3.2.14","@storybook/react":"3.2.14","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","jest":"21.2.1","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","rc":"1.2.2","react":"16.0.0","react-dom":"16.0.0","saucelabs":"1.4.0","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.1","babel-jest":"21.2.0","babel-plugin-flow-react-proptypes":"8.0.0","babel-plugin-lodash":"3.2.11","babel-plugin-module-resolver":"2.7.1","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-plugin-transform-runtime":"6.23.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.10.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-flowtype":"2.39.1","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.7.4"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.18-test.1","dist":{"shasum":"750005d4c374319562e6acab54312d99b8604bfc","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.18-test.1.tgz","integrity":"sha512-prY24eLCRlEycJAW1InSuye5GuU93sSKAfXruoj6/QQA6G5pZHi7/Xdgvj7MogbcL6GqnChOjis49BM1bvaIqg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD5qOSEsCdJ+VRCS0ld+QzL71P6Z6T56ZB7ikuxRFFk1gIgVnKiIsNpML4TqMdv/VPby4uMRtYXjFj9saaGkaVus74="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.18-test.1.tgz_1510528092235_0.6187276667915285"},"directories":{}},"1.0.18-test.2":{"name":"picturebook","version":"1.0.18-test.2","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-jest":"./picturebook-jest.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/addon-actions":"3.2.14","@storybook/addon-knobs":"3.2.14","@storybook/addon-notes":"3.2.14","@storybook/addon-options":"3.2.14","@storybook/addon-storyshots":"3.2.14","@storybook/channels":"3.2.14","@storybook/react":"3.2.14","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","jest":"21.2.1","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","rc":"1.2.2","react":"16.0.0","react-dom":"16.0.0","saucelabs":"1.4.0","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.1","babel-jest":"21.2.0","babel-plugin-lodash":"3.2.11","babel-plugin-module-resolver":"2.7.1","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-plugin-transform-runtime":"6.23.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.10.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-flowtype":"2.39.1","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.7.4"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.18-test.2","dist":{"shasum":"111b315c585c28b4d718c72967bb7513b39396bd","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.18-test.2.tgz","integrity":"sha512-DkxehPfoM7gdT2QcyAuCWS5xRpULu5AFMu5PHQQ4CVnqMcTaWmvTOkWr0suQWYhagquhlRtbAU97Q14Emx131Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGJevmsHQH8Dw7cAAYj95UA4tugQ4IRd6wJ09JflW/YIAiEAtxHHYKcdOFq/LTP6S/mAd6Ybsv3LlfGi302rp3rGO5k="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.18-test.2.tgz_1510528455969_0.027559239882975817"},"directories":{}},"1.0.18-test.3":{"name":"picturebook","version":"1.0.18-test.3","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-jest":"./picturebook-jest.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/addon-actions":"3.2.14","@storybook/addon-knobs":"3.2.14","@storybook/addon-notes":"3.2.14","@storybook/addon-options":"3.2.14","@storybook/addon-storyshots":"3.2.14","@storybook/channels":"3.2.14","@storybook/react":"3.2.14","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","jest":"21.2.1","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","rc":"1.2.2","react":"16.0.0","react-dom":"16.0.0","saucelabs":"1.4.0","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.1","babel-jest":"21.2.0","babel-plugin-lodash":"3.2.11","babel-plugin-module-resolver":"2.7.1","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-plugin-transform-runtime":"6.23.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.10.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-flowtype":"2.39.1","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.7.4"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.18-test.3","dist":{"shasum":"b00717e6199f3a24ae2c36507b4cc296f8dcbba7","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.18-test.3.tgz","integrity":"sha512-Dlm3h14/a/FvRI55VyNQH1GqYlXBkMsWrtdS2ozhbf2ykXIA6s29Ezu7GdNVIULXn/qbRH9a61Nz+DHMoNWtYA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCg1a/d3EFVr4N4m5fyDPs8SQltt+eE2if/CnjXD7t+GwIgQr93fIQlgExImgfjpJsrIBRbFBxYM3aXwBwaqDwCOY8="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.18-test.3.tgz_1510528797469_0.8421594775281847"},"directories":{}},"1.0.19":{"name":"picturebook","version":"1.0.19","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-jest":"./picturebook-jest.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/addon-actions":"3.2.14","@storybook/addon-knobs":"3.2.14","@storybook/addon-notes":"3.2.14","@storybook/addon-options":"3.2.14","@storybook/addon-storyshots":"3.2.14","@storybook/channels":"3.2.14","@storybook/react":"3.2.14","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","jest":"21.2.1","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","rc":"1.2.2","react":"16.0.0","react-dom":"16.0.0","saucelabs":"1.4.0","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.1","babel-jest":"21.2.0","babel-plugin-lodash":"3.2.11","babel-plugin-module-resolver":"2.7.1","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-plugin-transform-runtime":"6.23.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.10.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-flowtype":"2.39.1","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.7.4"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.19","dist":{"shasum":"368755c442eaca9717eb7b86625097dc5ff0f504","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.19.tgz","integrity":"sha512-1l5KNwz02N0OViU7HXAj8MnapXMHb+UbuLMekzjQSbE6dudMaIHr1HQND86lcuepXltvuVwb7Gxui3MPxZVM6Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHOY/mriL9N32d8QTaT4IpfltItHMITw6SLm6E28sxfaAiBvE3YtIC9b59s6HCaEm8zBZZD+8bKXl6dnpV1xypHYvQ=="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.19.tgz_1510529791206_0.8173259634058923"},"directories":{}},"1.0.20":{"name":"picturebook","version":"1.0.20","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-jest":"./picturebook-jest.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/addon-actions":"3.2.14","@storybook/addon-knobs":"3.2.14","@storybook/addon-notes":"3.2.14","@storybook/addon-options":"3.2.14","@storybook/addon-storyshots":"3.2.14","@storybook/channels":"3.2.14","@storybook/react":"3.2.14","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","jest":"21.2.1","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","rc":"1.2.2","react":"16.0.0","react-dom":"16.0.0","saucelabs":"1.4.0","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.1","babel-jest":"21.2.0","babel-plugin-lodash":"3.2.11","babel-plugin-module-resolver":"2.7.1","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-plugin-transform-runtime":"6.23.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.10.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-flowtype":"2.39.1","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.7.4"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.20","dist":{"shasum":"c543d0356bcd390ce2d97685e4f3c9cf838bce9d","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.20.tgz","integrity":"sha512-W0Tk16F49MV5KIqkD7+XEFFb5DIITPYUJOJDm1zBeij23FDFuIJIJB6QnQHAPtknDdlnqSbWVPa1fyp3s8mAUg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDg2CbnYnYupaRvopbkP9sP74I48KQpYK+0xnHfyAmqngIhAK+phRx9mrbDw52QbvQ62IRLxkv5vnrq4Fz2HIpxZwHS"}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.20.tgz_1510531400067_0.3363918906543404"},"directories":{}},"1.0.21":{"name":"picturebook","version":"1.0.21","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-jest":"./picturebook-jest.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/addon-actions":"3.2.14","@storybook/addon-knobs":"3.2.14","@storybook/addon-notes":"3.2.14","@storybook/addon-options":"3.2.14","@storybook/addon-storyshots":"3.2.14","@storybook/channels":"3.2.14","@storybook/react":"3.2.14","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","jest":"21.2.1","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","rc":"1.2.2","react":"16.0.0","react-dom":"16.0.0","saucelabs":"1.4.0","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.1","babel-jest":"21.2.0","babel-plugin-lodash":"3.2.11","babel-plugin-module-resolver":"2.7.1","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-plugin-transform-runtime":"6.23.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.10.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-flowtype":"2.39.1","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.7.4"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.21","dist":{"shasum":"1d2156fb9c33367986ac835d0fa5e44c3531e9ff","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.21.tgz","integrity":"sha512-vHCXBpjjDYSGzArNHBtx9WjoMZvDVpPHz8PdLC7mIwjl1A50pfK4ee/saPPBYUQx3k3ak06bs9CdPEI2NswH0g==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA283e8O39LYvn5g+Vvdo6amPn5I054yB+o5Kaqn28BIAiEAxNCWOGecHFRAIk5JldnqTQGGDFKe/vMajzyGNVCpgMg="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.21.tgz_1510533976004_0.814820553176105"},"directories":{}},"1.0.22":{"name":"picturebook","version":"1.0.22","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-jest":"./picturebook-jest.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/addon-actions":"3.2.14","@storybook/addon-knobs":"3.2.14","@storybook/addon-notes":"3.2.14","@storybook/addon-options":"3.2.14","@storybook/addon-storyshots":"3.2.14","@storybook/channels":"3.2.14","@storybook/react":"3.2.14","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","jest":"21.2.1","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","rc":"1.2.2","react":"16.0.0","react-dom":"16.0.0","saucelabs":"1.4.0","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.1","babel-jest":"21.2.0","babel-plugin-lodash":"3.2.11","babel-plugin-module-resolver":"2.7.1","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-plugin-transform-runtime":"6.23.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.10.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-flowtype":"2.39.1","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.7.4"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.22","dist":{"shasum":"74da3fa469cb0af1f5dc37d67b61f36f7b7165f8","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.22.tgz","integrity":"sha512-8XdJFMhRUH/ss+fyvDRF6TKZFZgentZctXKM93y57X7SgnKsu1qFG9CedZoV4JTA+Im9hE8/1WsKVOZFUqrQTQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIARFA64OLN9Q5V5GQQk4Hcdn/kKeVWYh1yOBSx0bnvgZAiEA+qhIbtigPvKMMUGFjbgvAJyueojDAHePlcW8OJo0QP4="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.22.tgz_1510592759883_0.7864446106832474"},"directories":{}},"1.0.23":{"name":"picturebook","version":"1.0.23","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-jest":"./picturebook-jest.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/addon-actions":"3.2.14","@storybook/addon-knobs":"3.2.14","@storybook/addon-notes":"3.2.14","@storybook/addon-options":"3.2.14","@storybook/addon-storyshots":"3.2.14","@storybook/channels":"3.2.14","@storybook/react":"3.2.14","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","jest":"21.2.1","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","rc":"1.2.2","react":"16.0.0","react-dom":"16.0.0","saucelabs":"1.4.0","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.1","babel-jest":"21.2.0","babel-plugin-lodash":"3.2.11","babel-plugin-module-resolver":"2.7.1","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-plugin-transform-runtime":"6.23.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.10.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-flowtype":"2.39.1","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.7.4"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.23","dist":{"shasum":"e5f097d528d99a22165011e6bb28e10a11f74a8a","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.23.tgz","integrity":"sha512-eeysstRAmXxtRD2UQfAcTj/MW4a8awcSUTJ1x48x2AecSBoPaxtdejICuYrlvT/FzC8Ixi22xVKIYNFLLI9dPA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHE9v1rqFYIw+1c0LwkB+sfsxqL0yX8bJBC/mgqeyMFrAiBH3+AIoL+nHSggM7+ziPXo+Hc5jbS7UKmA0J3NajRFEw=="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.23.tgz_1510593040736_0.8258673613891006"},"directories":{}},"1.0.24":{"name":"picturebook","version":"1.0.24","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/addon-actions":"3.2.14","@storybook/addon-knobs":"3.2.14","@storybook/addon-notes":"3.2.14","@storybook/addon-options":"3.2.14","@storybook/channels":"3.2.14","@storybook/react":"3.2.14","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","rc":"1.2.2","react":"16.0.0","react-dom":"16.0.0","saucelabs":"1.4.0","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.1","babel-plugin-lodash":"3.2.11","babel-plugin-module-resolver":"2.7.1","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-plugin-transform-runtime":"6.23.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.10.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-flowtype":"2.39.1","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.7.4"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.24","dist":{"shasum":"31a215bd674f6374dc1e091f4efd426b609763f1","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.24.tgz","integrity":"sha512-Uzx2Y0ryaWglDFnBTt4rllKxolIAZIk6+foOb9srArdWhWrO4va6ueSEKF+yiLCdXIpLYCC8phgMHn0X+HXTyQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC06WOFf3/uGWPld125TCg9k/cgk+74FRmDLkKN1+16DgIhAIp24iUUwnoBP9zOJ5H/AeMB2OvUJOrZJc/eBS919VC1"}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.24.tgz_1510714912569_0.9964722450822592"},"directories":{}},"1.0.25":{"name":"picturebook","version":"1.0.25","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","rc":"1.2.2","saucelabs":"1.4.0","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-plugin-transform-runtime":"6.23.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-flowtype":"2.39.1","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.25","dist":{"shasum":"ce1a8d234ab546f4ad28c96908dcbfc4fc5af55e","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.25.tgz","integrity":"sha512-/hBndzUf1MjiV4/neZ7u1aa11OwutgT7swzuoMIUsB4NXXYPLCMHJjzrCEwutu31YHsmoWl8LvrLYZ3T5FFi2g==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBqDF9tEsOkQDkIO6LLYII3K21fmStbIxIoLiL1d3A1dAiEA5SKUvErS43J4mnwWdWi8KZxSeaPEJmoEcUcNWDIwx2Y="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.25.tgz_1510719307562_0.4684019696433097"},"directories":{}},"1.0.26":{"name":"picturebook","version":"1.0.26","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","rc":"1.2.2","saucelabs":"1.4.0","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-plugin-transform-runtime":"6.23.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-flowtype":"2.39.1","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.26","dist":{"shasum":"baefc09a322ff28c450b3b474c382a3277a24551","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.26.tgz","integrity":"sha512-F2hz/yvrzPVClQD5bx5mjNe0WHe89NGvX4nZTM9deHYtNb0czVeY8ude9WlPFxOrBcYmWOdQt/i8WV55brO4tQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHG/fRhFdfRK3UXIKgzS0zJJFNxUr1J/5NlFeWtSDGiGAiA/fNzhtrWgejQr8Ia4Dzvw/BAyVFUy1I+V72qu1HAvBw=="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.26.tgz_1510721561249_0.4511878555640578"},"directories":{}},"1.0.27":{"name":"picturebook","version":"1.0.27","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","rc":"1.2.2","saucelabs":"1.4.0","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.27","dist":{"shasum":"a96fe1fe332037957eb77607f18d53fb9b021454","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.27.tgz","integrity":"sha512-APU7mauYr3SlVw+jACFzEwYeSRPt5B+z0zhDizdqIvn6hF5W9/zhcFnj7KutvRNVnbtOT52RkBACp7L8UvDMLA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIENhpNmnWw4dbscjU3cKN1Sr9EvypSQoDL6rXWbNtUwdAiAkuREY89cgTukR+qywdUXYe3KTgCbC4Ps8uIKsRtm78A=="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.27.tgz_1510761459247_0.18861888395622373"},"directories":{}},"1.0.28":{"name":"picturebook","version":"1.0.28","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","rc":"1.2.2","saucelabs":"1.4.0","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.28","dist":{"shasum":"c139d802f5c9c9b695aace4e12638388256e3123","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.28.tgz","integrity":"sha512-Qsc3tnhYG5EIc9zdegX8Ax2xTYxWCUqUoobilr3i/8rlg4uyTvi05LD5rpP15Nb9USNbQod9DqTxjMZsO+J2HQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDj3Y+EXdDRKl5e2rTuRftZDS3nZzfwg+8r5B7MOkUosAiBTzmC23JBDuQ7KLum7rfrm6By2+ZhSLr8hEWs6v9OOAA=="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.28.tgz_1510764720933_0.19508355599828064"},"directories":{}},"1.0.28-beta.1":{"name":"picturebook","version":"1.0.28-beta.1","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","rc":"1.2.2","saucelabs":"1.4.0","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","browserstack":"1.5.0","browserstack-local":"1.3.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.28-beta.1","dist":{"shasum":"9eb196a29d7467b12b9ff88fe27ba699d06b4eab","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.28-beta.1.tgz","integrity":"sha512-c32OVeJDouK2KO3OxC4V5unz0BmCN1HBp6TWcEYkwGYsZ6Igg2OSx8MG0Bpo7NKwSdA6RGmv9iZCxioYy8LM5g==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC85dDPUgqijPsWdpnPcW1wGEzD03SlNkhzdFjF2X5ffQIhANylctLYakfzAlG9OZMTKGo8riZbuJzal+0as8N/l/fF"}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.28-beta.1.tgz_1510855713434_0.9571497654542327"},"directories":{}},"1.0.28-beta.2":{"name":"picturebook","version":"1.0.28-beta.2","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","browserstack":"1.5.0","browserstack-local":"1.3.0","cosmiconfig":"3.1.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.28-beta.2","dist":{"shasum":"8be682a288ec2c32b8899b0a03aeb81be2e8e817","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.28-beta.2.tgz","integrity":"sha512-Km3LUuPaWsOEtWd72Q7m6BR5AvClzMc8wb+0s7Z0QNPnSxGmJHKZOcw5dIbMLVuE6CtZfLklgZCIqnWPe4qEtw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDY/0Mdf2Z59o4YyZk0nHON9m30e3uTvRE32gz6QPP5iQIhAJGdhhdDvHDUtRj6jiSdOJU3lcBdW5I3KwhU7piQxoTE"}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.28-beta.2.tgz_1510861452346_0.03089872025884688"},"directories":{}},"1.0.28-beta.3":{"name":"picturebook","version":"1.0.28-beta.3","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","browserstack":"1.5.0","browserstack-local":"1.3.0","cosmiconfig":"git+https://git@github.com/davidtheclark/cosmiconfig#930926e","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.28-beta.3","dist":{"shasum":"f624b3b746e25f4ad30ba94f8855d5d7ee4be38a","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.28-beta.3.tgz","integrity":"sha512-bkWYHHzTb8VKWu6qGna3gBqz79pazsfdfWMgjvqFuvt/uVSVorx7ujC94oNnPzH2sbqcKyjG4upcDA4vteFQ1Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCU2JUt5ExMpGxYfeTq7hJR44mmXyIuebMc3twvF5UTIAIgYiH1r7e6SrVWH5oDA1WJNlX2IHXuD0PO5qGOnIIZEKo="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.28-beta.3.tgz_1510862617201_0.3742323445621878"},"directories":{}},"1.0.28-beta.4":{"name":"picturebook","version":"1.0.28-beta.4","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","browserstack":"1.5.0","browserstack-local":"1.3.0","cosmiconfig":"git+https://git@github.com/davidtheclark/cosmiconfig#930926e","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.28-beta.4","dist":{"shasum":"5cc2d8392988781eb088129799f2621fbf9adbfc","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.28-beta.4.tgz","integrity":"sha512-7PQ3pH6855+hE1nZFuVrL0NCkR6t4ziADXEpddmAtb5tWmwrJ832Leezh8EBdNwbLR2RBob/cVxiaFyuR/n65g==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHUsoKSivuvuIOvb4jpYD5f3Wrr2GtZ5qKadleQWgA0xAiEAgGPE9Zb7pCS6XUNzi2lXySgFXf6mjLCBg+TJQ8kgtt0="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.28-beta.4.tgz_1510862660710_0.6526442354079336"},"directories":{}},"1.0.28-beta.5":{"name":"picturebook","version":"1.0.28-beta.5","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-standalone":"6.11.0","sharp":"0.18.4","cosmiconfig":"3.1.0","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","browserstack":"1.5.0","browserstack-local":"1.3.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.28-beta.5","dist":{"shasum":"e5f9e4534730c0084b809e4a63a99b9ca4998d1a","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.28-beta.5.tgz","integrity":"sha512-INZ4KzWQ31DRXKd2D6EgkZe03YXLIoi65cm3yrMd1D++bxSF6FxEl6xagw9Hjllo6jNqg3cJ7NkREVb7iP96sg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHvyfJ7SQjAZ19mZ2OnpA8VaqySYeIU+Ky6W7wUrT9uAAiAJHSAo7JNAkcZKLTcspW3sroKsXVKDy8TP0zhUxqPRyQ=="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.28-beta.5.tgz_1510863150544_0.06866835127584636"},"directories":{}},"1.0.28-beta.6":{"name":"picturebook","version":"1.0.28-beta.6","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","browserstack":"1.5.0","browserstack-local":"1.3.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.28-beta.6","dist":{"shasum":"2b2a3845224aeade5909bfcda9d12af7d82d8a86","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.28-beta.6.tgz","integrity":"sha512-oB0Vk/WxFY2hGaiPhjjI+blZBk6Luy2RSrrJ+idSB7AFqKDGmiH5L4IulABInFphwymrgy9P/3G2Q6uXbAj8vg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDx/1we205ULTVqESUFPo6LclZcdd3j3VPFBgJVHIZx+AIgEflWRjNt7Lh0lwemECk3Z0Ay4DjjDYhNu7b+x1vMuNc="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.28-beta.6.tgz_1510863296030_0.24750120239332318"},"directories":{}},"1.0.28-beta.7":{"name":"picturebook","version":"1.0.28-beta.7","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","browserstack":"1.5.0","browserstack-local":"1.3.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.7.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.4.0","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.28-beta.7","dist":{"shasum":"ac496e691a0d3d78d0e9fb8ef1b40db181bccd9b","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.28-beta.7.tgz","integrity":"sha512-NhlUDxLCOJIsV79BB8xLSNiuV2k457ajOia4Mh9w5X6nm03bSDaFc3DamrXgxgwFrS3MhHXgw84hO1ZWE1j8MA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCMdfQTFKk+qe5u1PtxvDCDfhjxTK1fT6IAtnxvcEDCGAIgQBz0LUyjG4aSD4jhEnLIIg/K500FRqmrRvTts4nnHW4="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.28-beta.7.tgz_1510869174700_0.9102686049882323"},"directories":{}},"1.0.28-beta.8":{"name":"picturebook","version":"1.0.28-beta.8","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-core":"6.26.0","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","browserstack":"1.5.0","browserstack-local":"1.3.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.8.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.28-beta.8","dist":{"shasum":"88f1f8df74ae6b64719dc562ed52400b4f50bfa9","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.28-beta.8.tgz","integrity":"sha512-tltRl31rdckdDqmqUt2QgOj4uMcdkI4OQLjhlyhzH8lsVOSKhW5yYlItCAqCaDXsCnnUkicmGdVRcB3vVfkrgQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAFjDdRwIiwUfzOXpKP6dKfjLrAyT1c9kC2pFmoxKiq7AiBXy3IB63XaodU75XIBTGx30RNR/mRS9oeq2Hx96KlIqQ=="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.28-beta.8.tgz_1511139456772_0.1704410146921873"},"directories":{}},"1.0.28-beta.9":{"name":"picturebook","version":"1.0.28-beta.9","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-core":"6.26.0","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-standalone":"6.11.0","sharp":"0.18.4","browserstack":"1.5.0","browserstack-local":"1.3.0","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-cli":"6.26.0","babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.8.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.28-beta.9","dist":{"shasum":"8b6b1ebc64cf07e06f4853844cd65d51a56706f0","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.28-beta.9.tgz","integrity":"sha512-MYjdVygpmHgOz2Zv0/ob0kDnL3DOxxq7HiRxZxjGElkBZa6uWebY0Z7KU1DMsbvwEVIihsBIhhdandxBmnI3lg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCZz/7VEmwliRoKfHCr6BfDws5i9Rep7XVGtlyvGKOFdAIgSp/gY94fAYIiSlIDzerQFhtmA8jtwqjxARgJXCJA+xE="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.28-beta.9.tgz_1511140318939_0.9308025543577969"},"directories":{}},"1.0.28-beta.10":{"name":"picturebook","version":"1.0.28-beta.10","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-core":"6.26.0","browserstack":"1.5.0","browserstack-local":"1.3.0","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.8.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.28-beta.10","dist":{"shasum":"3998b73f9c7eb4b473cec5f9d2dd3ddfbd382030","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.28-beta.10.tgz","integrity":"sha512-RABullwVtqY+GKmwYUQmn1AsN0oBeFQ67EADUXbp4GR+UJjItsNVRdTxWQZ30ADKRNEVXUyYlDBNo83eE0Tnzw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA05E1sH+5K3MBc2SSlpmQngxj3d4kuwC1lQujrHTdNEAiEApzxW09Plu1ZwuJgmeX0Kes37Ul3YYCZi6N4tnV4os4U="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.28-beta.10.tgz_1511142722211_0.783339767716825"},"directories":{}},"1.0.28-beta.11":{"name":"picturebook","version":"1.0.28-beta.11","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","browserstack":"1.5.0","browserstack-local":"1.3.0","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.8.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.28-beta.11","dist":{"shasum":"d98377bbf973b32cbbaf61ad17e7e4d8ff644c79","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.28-beta.11.tgz","integrity":"sha512-+zaPlsPor0b0fDdw1L0qYy5lrD15Rs8uvbq+TCoxAwZvW3GXz3JNkm8xJhQn6DPW3jY01N7HZ3NaYeQGXm4NYw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF44Zk+yu4rZnN7cIuuIQ2zFEPJG1/XYkx5uc7EeiQlaAiEAnBpNhURzaMTEx01B7npTmGlDa07raxsXYuGvdZc2GJQ="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.28-beta.11.tgz_1511144403784_0.5410064340103418"},"directories":{}},"1.0.28-beta.12":{"name":"picturebook","version":"1.0.28-beta.12","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","browserstack":"1.5.0","browserstack-local":"1.3.0","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.8.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.28-beta.12","dist":{"shasum":"fe1a44615d9eb4e46009c0a4e29eb14f8ab0d995","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.28-beta.12.tgz","integrity":"sha512-5wxK13ZZtU81bY2oii65GR9OUDQbMEseJdPhkmmaKeqngEa6m5+pAIvsZ7739vEG3nr9f+6qG/ePr7sIu9stSg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBLxlqc9da4RG862CYE/co7NA3NwJo8d67Z/lpoi+XSJAiEA1h38l3AaHnkk5uNTF31nEn1NOUI0IEwYe5Crit7PYs8="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.28-beta.12.tgz_1511145342690_0.9253015439026058"},"directories":{}},"1.0.28-beta.13":{"name":"picturebook","version":"1.0.28-beta.13","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","browserstack":"1.5.0","browserstack-local":"1.3.0","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server":"3.7.1","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.8.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.28-beta.13","dist":{"shasum":"be42258faf8adc96eb46727cef50d1e2c5738e93","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.28-beta.13.tgz","integrity":"sha512-Pl553+iGL5mBnhuKTvJwiMNgvEpxFOiL938u+HB+DCTQ5PyGoGzgsQjm614LsfUsJ309zUPDrlqfgC04QUAoXQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE2VnD670DqXeVHRa71r1/koAMQ7ZBmNVJ9Y2RweO3iPAiBB7VQ+PNqq1k9tfPals/tLGAjmwKumTxlVNugxYsI9mA=="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.28-beta.13.tgz_1511146419750_0.3692578552290797"},"directories":{}},"1.0.28-beta.14":{"name":"picturebook","version":"1.0.28-beta.14","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","browserstack":"1.5.0","browserstack-local":"1.3.0","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.8.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.28-beta.14","dist":{"shasum":"8dd697d5d3afbdb892c2774fa0bef4c3d9f9f7e9","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.28-beta.14.tgz","integrity":"sha512-0RoQNJ2hYoZ00VShBA4nrgZtmoBuGjcqJeEKG/XpPkPdoFqGvbLZ18fcqa6T/fx+g+lSVHLO6l2s1Szn5egnnQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDLHMTBTxTdp5A9gIMisEA1xe/rLVHkcpLgiKA+krkKkwIhAO9cwO6p1HH+AuHsFwvqafR6BMVc1gtyQwssxe8VIeX2"}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.28-beta.14.tgz_1511147829191_0.4450489867012948"},"directories":{}},"1.0.28-beta.15":{"name":"picturebook","version":"1.0.28-beta.15","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","browserstack":"1.5.0","browserstack-local":"1.3.0","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.7.1","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.8.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.28-beta.15","dist":{"shasum":"1aa1247ebc057aed798af536325d3bf8bdaa31df","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.28-beta.15.tgz","integrity":"sha512-VOvOSS/pzrIPp0WH/vP/9uS7zQFPJYee20U0n34ef+doZNRz7mSNINo7b1HZ9YvgGSpReOA3BZnx7uzLh2DMlQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC5jUGuNGZaW2yMal0LyGMmWvD8yaZHzkHxIi0YoP5UVAiBHX1laqTv2V58teL5WZoAyXyyAFPgV3tq2wa/o5+xZFw=="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.28-beta.15.tgz_1511149088659_0.5181067229714245"},"directories":{}},"1.0.28-beta.16":{"name":"picturebook","version":"1.0.28-beta.16","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","browserstack":"1.5.0","browserstack-local":"1.3.0","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.7.1","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.8.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.28-beta.16","dist":{"shasum":"2a309d1fa79c5a31e22f47a8567829782a1f2348","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.28-beta.16.tgz","integrity":"sha512-nleuj0yuuTcZtpebwCR64m0/FjDCRcfBFWsYJvw6Bd4tnk4YJprilkg115n2uMA6FQng3EVnVF2urB90QfxKMw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCFB5t3AUyIExGd3KvAbuo3/1uE20AXJS1To9Iv2V0PNQIhAKhrHmtJEK5p9Ve5q0rjBUgcXEiRsy5nEY45ZZ+Jjs1a"}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.28-beta.16.tgz_1511150173334_0.9064828674308956"},"directories":{}},"1.0.28-beta.17":{"name":"picturebook","version":"1.0.28-beta.17","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.7.1","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.8.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.28-beta.17","dist":{"shasum":"94139ae1f678b492230ee05cf418b6317341493a","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.28-beta.17.tgz","integrity":"sha512-oLuDkmclvc/8+srKs28Ojq1i38RcEmAbuaEU4Z99Yh1xoYQHANP60lsB/UFk1f4tOSIfsxLkddSCXfY43YXWIQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBj+4r8bapwKUKbCmDB0CIzMWMAAbcpoYT8cRf5wnPTJAiBdYhUy4rtGuvlsanJGH/gHxy9bt0fLb7Zt3tw0Q3GKTg=="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.28-beta.17.tgz_1511161774636_0.468554163351655"},"directories":{}},"1.0.28-beta.18":{"name":"picturebook","version":"1.0.28-beta.18","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.7.1","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.8.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.28-beta.18","dist":{"shasum":"e2a4f28d42ecc659e99c0507ff33a7b2160d1b54","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.28-beta.18.tgz","integrity":"sha512-EJwM+qcOwT0v0GWpAM0eleTbeyoQXJYImMSm//LCJTCyokQPGJMHlSbUdzzWKI8wBwEDVShkzQD5qNcbvuAGCw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHv6bteFGme62Ls6c2OCA2iGJvKmS6smbt+zP4pYxCfXAiEAmnbRwWtFe17/5zplqo5W5DKUrzS/g0tKZtbjO0ubAxw="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.28-beta.18.tgz_1511163938781_0.6370218242518604"},"directories":{}},"1.0.28-beta.19":{"name":"picturebook","version":"1.0.28-beta.19","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.7.1","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.8.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.28-beta.19","dist":{"shasum":"f4f8a08f0040fb3c24d29c2dcc1e04453728f842","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.28-beta.19.tgz","integrity":"sha512-epF1FUBba49YhlCyLh0bU1P7DUMT9HrvwBDtL4nOb7EyzJCR+iH8bZar8JXyA3j55ocnSnc5bDA0chYgZCIx3w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCb7RbqCHAknb+b6ESBvreOZ/U9vJqdWILrNARIJeAazQIgKRxteyzWWcWXOdx9L9Z514xLbvsxHk9kKBXxtVrS7ak="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.28-beta.19.tgz_1511304089841_0.14141635806299746"},"directories":{}},"1.0.28-beta.20":{"name":"picturebook","version":"1.0.28-beta.20","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.7.1","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.8.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.28-beta.20","dist":{"shasum":"df514d7d57d4029b232f309fae105b529244ed6a","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.28-beta.20.tgz","integrity":"sha512-M+GhMAdyNMW4akJW/rOP+1o1jYD3IN/o0kuMADFjf7e0RO/0jdereal8OLPk99Nta5AWhFddnXE2Cgmd1Ydh8Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGrasEEcONccFsBrhPHALLslMcfyq3eyf8ImpZXbfXQyAiEAg2vw9I5kNLX6cpWgmCTJui+t3DYbEgefY6un0E9AHW4="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.28-beta.20.tgz_1511304837001_0.9853415717370808"},"directories":{}},"1.0.28-beta.21":{"name":"picturebook","version":"1.0.28-beta.21","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.7.1","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.8.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.28-beta.21","dist":{"shasum":"fb53b110abcaf001e7a8ecb3c61294ddf4264f44","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.28-beta.21.tgz","integrity":"sha512-IwP0v6VGS3i4DSyneCsnOJgzz419EDF+D9qDuNN/ZK6A65GdHIvPHrfVJw04UBd9yg5s/gV9zQ9y1luVJ02zIA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCZp0ur7Q0kgxHZAhg7DHKaCaZbqZtpaQvXRFzbHZUH9wIhANGdchFDD41a1wClnz8Y/s6gzhlzxm37BbYTbE1UUUsi"}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.28-beta.21.tgz_1511316826473_0.1430230129044503"},"directories":{}},"1.0.29":{"name":"picturebook","version":"1.0.29","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.7.1","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.8.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.29","dist":{"shasum":"6d11aff90a581e6230f6ebd0b8158656128e077e","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.29.tgz","integrity":"sha512-Mn8mSjwseOwCMYIFlX5ZROuG4Se80QkduVSpLnBwGR13jQY4aOzXdB7z6hyakWlCn6tSJ920WDyN81ADAgXM1g==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCGymy462aWO0TdhQmIcEa0TI+Fa6JkdnebUU7WoIqkPwIhAMzU5NSN9qn7Bh5Uiltte1LMuo7weaRA1/i89lPurlQd"}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.29.tgz_1511399428193_0.7733709171880037"},"directories":{}},"1.0.30":{"name":"picturebook","version":"1.0.30","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.7.1","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.8.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.30","dist":{"shasum":"771a5f033a4e60a91b245de5db16c12c318267b2","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.30.tgz","integrity":"sha512-sGC0qHVDuQOMMwrLVSgAQtqn6FW3XVjCIWaL28IaWGza3FEBBgFinIrlmdpFK5+T0EI/lSVC7UPrdnjUDqbvxA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDkme5EGH/Aft0Q5NPu3b10AgN2+WI3W+wpPMhRc/i1vAIhAPp1x6E68QktiVm9/ywpyrDxgrS8BcjbdIXHHr0T8psL"}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.30.tgz_1512056885165_0.19753088639117777"},"directories":{}},"1.0.31":{"name":"picturebook","version":"1.0.31","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.7.1","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.8.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.31","dist":{"shasum":"27da98c9c3e60d649fb3c5afe54fce0b6a9cf9c9","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.31.tgz","integrity":"sha512-y78g0RLJd2HwAABqxfw+vZJCevpVB65oKz/XJBKLeK9syGuRru4USjRZjmpKKkuYobWA9fNvGYw3MPhxHbCnfA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC++4U4kXjBJn0SGEKv1qr5hEREtCNAMT+bHedqBxexswIgZBqFBIdcEy3DJSUfCB3oDoAmkpVCp7dso3mfcyjitG0="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.31.tgz_1512057051773_0.8212576957885176"},"directories":{}},"1.0.32":{"name":"picturebook","version":"1.0.32","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.7.1","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.8.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.32","dist":{"shasum":"c1b93df6324fb840bbe30d4325dcebd491054b88","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.32.tgz","integrity":"sha512-YdUskTCM0X/LyTSF/0tYyu/N4JejlKgjCcfhIFWKgrZ4G9yjJvjd7WrYuuvDtxnVjM9WdS8OYHgFp6epONCRww==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHVZT79JY88PmG41hDNKiWImjaVP/Dg9NZ+iy3yrbPhZAiEA6rJkAiplo6rtfJpxiqY3r3ZJ7ZUxrO65krGbubx7NNo="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.32.tgz_1512362231352_0.5818462441675365"},"directories":{}},"1.0.33":{"name":"picturebook","version":"1.0.33","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.7.1","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.8.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.33","dist":{"shasum":"60f74baaed40102227cac867f0f7efe2f76b80b3","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.33.tgz","integrity":"sha512-V6LVwdYfYSJxbXXydYJF4jOzdIMSM7Ld5Fq9OVT43L6R5OEkYFQ+bugrWqBL+nPAhDLaDm9DSlp63DqT4I3Uiw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICi4dW2uzT0erp/3n0PcqROeQ89PgmUZAPI5I4JKZDgbAiEA8wUWWX0oWWuzvMpE2e/9QXYBCALWF0QnWllKJ2PSgCo="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.33.tgz_1512676446080_0.5546639629174024"},"directories":{}},"1.0.34":{"name":"picturebook","version":"1.0.34","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.7.1","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.8.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.0.34","dist":{"shasum":"6dcffc5dc677f40154a0619af440f864a654862a","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.34.tgz","integrity":"sha512-UC30cQ5pdTikZZT4IvC9Y2O51f5LQnbYnhEuxP7TKlCQyDjhJJflZZuOU+BMpSFwQwBRv3F/mu883JhyU8bdXA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHMpF6uOZOaxl37rdLIWbASWmB97akGgRJOzOKQaZKiMAiEAjfBAvRtXyFe9/uysEIU1zETa9YcH+Tp6wxrr6uR6iHc="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.34.tgz_1512768174453_0.7183340771589428"},"directories":{}},"1.0.35":{"name":"picturebook","version":"1.0.35","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"git+https://github.com/obartra/picturebook.git"},"author":{"name":"Oscar Bartra","email":"obartra@taser.com"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.7.1","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.8.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"gitHead":"701a388f525aadd35076cfcd71b86955614731ee","bugs":{"url":"https://github.com/obartra/picturebook/issues"},"homepage":"https://github.com/obartra/picturebook#readme","_id":"picturebook@1.0.35","_npmVersion":"5.5.1","_nodeVersion":"9.1.0","_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"dist":{"integrity":"sha512-RtjjebcDniCjorHn0gpPbNHiuWnqcf7i7Vreum6mKKgl6oN/VoNJ9rxHsfgIGj3TskWl3DdKtHDVzrbjX8F9hg==","shasum":"615f5267c5d7e0a52bc82b22e2c103c25c44d426","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.0.35.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAmNAemxBlVgfnc1K9vUTUYxBp/S6dBM1ih+ReMiVoHXAiEAjeDl1/Sp8SQJBvIrhzzH5ap8XfNLTIhyzQvZagJPkro="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.0.35.tgz_1513359946063_0.5217646097298712"},"directories":{}},"1.1.0":{"name":"picturebook","version":"1.1.0","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.7.1","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.8.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.1.0","dist":{"shasum":"dd079b2104ce9d6eeae084c59c7d84cd41c65018","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.1.0.tgz","integrity":"sha512-o5COLrSAy7l00k1RVJ1o6nGA2m8PJCrEbgmwUn9G7+Ncg9XxT7/DP1AtGbIyu/aCRmfsVT5egSRBdC3QKyCk/A==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAEZdi+921SM53vmD8jBGbHBYKbUD3BPi5Gb/oJWE2CbAiEAhjL+DimhpIVuabPKwvepKgWGLuueiPZxksl+BYuGkvQ="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.1.0.tgz_1514839025030_0.23052024096250534"},"directories":{}},"1.1.1":{"name":"picturebook","version":"1.1.1","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.7.1","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.8.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.1.1","dist":{"shasum":"60be7e00f24043ed4dc6c49605e7ce49080acf9d","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.1.1.tgz","integrity":"sha512-LnHWWWxtlTXW7mG4P2VFill5ltmA+sdwKhEyPId9E5fxArkf7wOBj5/fazVqt20gtqDVP30oTCKvGFr0GI7PFg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFtZ7jrWJU0P13kg7veX2wDVn37MD9skizNDW7xM2IGyAiEAzRyAR4qhPS4Z/+89JYBJvDJ3NJYUajJwsFAhXx/74JI="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.1.1.tgz_1514840565886_0.1859197486191988"},"directories":{}},"1.1.2":{"name":"picturebook","version":"1.1.2","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.7.1","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.8.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.1.2","dist":{"shasum":"a4aef5726d3188e939650a83f36738c708170ed8","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.1.2.tgz","integrity":"sha512-0BSxY4E+Qpss+xG36HmilWEgvFOfjsCqf0Vp/YzsZCyY8NZiWR31JfddOmcHJoLPxBAnq6IREttqK+4zabk6lA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIClL3qNz3dBHEGjQF+H81MrbGSF3KnPJGUyraA+x8qKfAiAY/iV4+hQmND3WmG4ZfInTP00v4y034qRZDRX7nO5cnw=="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.1.2.tgz_1514845174266_0.37759214197285473"},"directories":{}},"1.1.3":{"name":"picturebook","version":"1.1.3","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.7.1","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.8.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.1.3","dist":{"shasum":"198a5e850bcd7c262183edbc4d64da7c7ea0f7e7","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.1.3.tgz","integrity":"sha512-Yn5vNGYjW4CHlsgdoWRQnHrBimeV7I2WCGte5PvVcfHipy0AroF5ETWwI0jz1eycacLAwdF0A1nUq9rtsMwQFA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDdDHZ67yfZ8fVHPjO3h5lLiednO+7Luk3c+WMIy89psgIhAKBQ6ohw3WcUxsVoyNFfvtsdphtKjEYhG3K3hHNpXw7v"}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.1.3.tgz_1514845995079_0.42949811485596"},"directories":{}},"1.1.4":{"name":"picturebook","version":"1.1.4","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.7.1","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.8.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.1.4","dist":{"shasum":"f88a140d064c8dba89a5d168963c309661bf28a1","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.1.4.tgz","integrity":"sha512-nQ/j8BzPywtvkAZVnAGojJFLIwJwZ1HBgSTCXcg2noK3w8E5kd0FmOHYKfjMErtIt5HV7zKtDoYbfhWQyUfmgQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCGI3F+3b6+9xDlkNs6GfkahAPLFRO7U+s4+h/AedDKqQIhAIctOjQuFFgdWiklyqQX0aU5l3VqVl9wuIxYyDAFXXR5"}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.1.4.tgz_1515188072376_0.02706454717554152"},"directories":{}},"1.1.5":{"name":"picturebook","version":"1.1.5","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.7.1","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.8.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.1.5","dist":{"shasum":"3cee295986ce5ef2f33ef068fc8ad9a8342b3332","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.1.5.tgz","integrity":"sha512-ZgETCLR7PENH/OaBudOeNlJ+gS/T8ozJ4skyGy1vMJKPmpvw3KkDszQYKbRF8HP+1oGptBQXzZjpA/Hnp3O4Fw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD/jPICERZDOe3mP3+aUz11F8vcgjiljJW/ouQSnwaT7wIhAI8uJi+d/DwQJ3c439wkrL4wG2QwZk/Vgq4MM/QE2ljf"}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.1.5.tgz_1515457991890_0.5572002839762717"},"directories":{}},"1.1.6":{"name":"picturebook","version":"1.1.6","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"4.0.2","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.16","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.7.1","selenium-standalone":"6.11.0","sharp":"0.18.4","storybook-addon-jsx":"5.0.0"},"devDependencies":{"babel-eslint":"8.0.2","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.11.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.8.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.2","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.8.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.1.6","dist":{"shasum":"1219c85066e1167a56e4e4d1d860660a22c260a7","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.1.6.tgz","integrity":"sha512-cxnAGQCEaclseriffhRHqDtj2+B2U8icCwqL+6naGtiLFQTczsIIeHWav+AWR6W1kpA7r5NSGef80KdusprprQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDQZHCmoir8uTURBACPKXxwUEjk98sDCfFfqk5yALcxmgIhAPBc3k6ipFvg1lrAwKJpMyK2kDgalwEOXN9lPl80GSxY"}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.1.6.tgz_1515465254282_0.6838213349692523"},"directories":{}},"1.1.7":{"name":"picturebook","version":"1.1.7","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"5.0.0","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.19","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.8.1","selenium-standalone":"6.12.0","sharp":"0.18.4","storybook-addon-jsx":"5.3.0"},"devDependencies":{"babel-eslint":"8.2.1","babel-plugin-lodash":"3.3.2","babel-plugin-module-resolver":"3.0.0","babel-plugin-preval":"1.6.3","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.15.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.9.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.3","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.9.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.1.7","dist":{"shasum":"cf6235972e309030bca73ac112469647ff518a56","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.1.7.tgz","integrity":"sha512-Sn0u9a86UQUlsqS+PyQRhLYVkK5ScJB5iueo6PdqpbOIsqFanxR0BPbtK8Vm/R0hFYlEgP86hYkS//4bLhcM7w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCd3gef1NznUmS9ZrKClt0eEVs1JMWlWV8d9YgD9EmhqQIgN5vKwUvdOc66h7DVadKQQXke6unf3f6LqDhNRha/XqA="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.1.7.tgz_1515602538706_0.8626335980370641"},"directories":{}},"1.1.8":{"name":"picturebook","version":"1.1.8","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","babel-plugin-lodash":"3.3.2","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"5.0.0","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","lodash":"4.17.4","nightwatch":"0.9.19","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.8.1","selenium-standalone":"6.12.0","sharp":"0.18.4","storybook-addon-jsx":"5.3.0"},"devDependencies":{"babel-eslint":"8.2.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.15.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.9.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.3","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.9.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.1.8","dist":{"shasum":"d4bdcc101f27e50d1151f0749d413c41293d8981","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.1.8.tgz","integrity":"sha512-ZxRQ1F7jUh7qryFXwvYFLhiLEuY3Pa5Q2w0h1ZLlJfxkNpkstPCy1WL0yYWKVbV7+b/E9Y7d37z34/bVaf236w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC1jFwUrtFAuN8RAzoshNFj2TMIDxp+Hi0mtcMq26NcnAiEA99X11wcbBWhVdzaMzmaKA87LyOtKKgy7LzlfIIG/Nhg="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.1.8.tgz_1516645416137_0.3840595968067646"},"directories":{}},"1.1.9":{"name":"picturebook","version":"1.1.9","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"git+https://github.com/obartra/picturebook.git"},"author":{"name":"Oscar Bartra"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","babel-plugin-lodash":"3.3.2","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"5.0.0","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","kcd-scripts":"^0.30.4","lodash":"4.17.4","nightwatch":"0.9.19","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.8.1","selenium-standalone":"6.12.0","sharp":"0.18.4","storybook-addon-jsx":"5.3.0"},"devDependencies":{"babel-eslint":"8.2.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.15.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.9.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.3","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.9.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"gitHead":"0925b7069991769923e86add9f3fe985f019cfb4","bugs":{"url":"https://github.com/obartra/picturebook/issues"},"homepage":"https://github.com/obartra/picturebook#readme","_id":"picturebook@1.1.9","_npmVersion":"5.5.1","_nodeVersion":"9.3.0","_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"dist":{"integrity":"sha512-cEutaZz2H5T2rxul/VK0K3MlcvtbH6eV3wk2iSK2IOX1Z25MfcwGlRgOgjNIAgSQcHRzU+/EPzp12UxWoQjmzg==","shasum":"643cfa6fc305d97f0d9476ef791f2a25d220e1ba","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.1.9.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDSXHZGocJ3CJgv1X//wV3Dah4s42KvMgczzKCnOWyP6wIhAKcI2I5EA+Toca+CQCC0WgKlwkRP0jyl037u4vKwuX6O"}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.1.9.tgz_1516995236955_0.3789748677518219"},"directories":{}},"1.1.9-test":{"name":"picturebook","version":"1.1.9-test","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra"},"license":"MIT","bin":{"picturebook":"start-storybook -c ./config","picturebook-build":"build-storybook -c ./config","picturebook-image":"nightwatch --config ./test/screenshot/nightwatch.conf.js"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","babel-plugin-lodash":"3.3.2","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"5.0.0","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","kcd-scripts":"^0.30.4","lodash":"4.17.4","nightwatch":"0.9.19","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.8.1","selenium-standalone":"6.12.0","sharp":"0.18.4","storybook-addon-jsx":"5.3.0"},"devDependencies":{"babel-eslint":"8.2.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.15.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.9.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.3","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.9.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.1.9-test","dist":{"shasum":"150ac7ff2638199066efd137e9646ffd44a0bc5f","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.1.9-test.tgz","integrity":"sha512-EKW89miMWXbJqtBV/kHeCFFQcEbORcTOXFMD5kKk55wORMqaO9mFbs6lZaJaX7AHQ9PdLtjPqPaGBI8lGFCFgA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCcX621H6NMdSQH+4p6D0kpo45rRhC2szB4XCgmS3Po/wIhAKH5l3f9pFiPApygxtl6nVlwBovert/HAOox2eNyp5cS"}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.1.9-test.tgz_1517171289446_0.07599211949855089"},"directories":{}},"1.1.9-test2":{"name":"picturebook","version":"1.1.9-test2","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/react":"3.x","babel-cli":"6.26.0","babel-core":"6.26.0","babel-plugin-lodash":"3.3.2","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"5.0.0","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","kcd-scripts":"^0.30.4","lodash":"4.17.4","nightwatch":"0.9.19","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.8.1","selenium-standalone":"6.12.0","sharp":"0.18.4","storybook-addon-jsx":"5.3.0"},"devDependencies":{"babel-eslint":"8.2.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.15.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.9.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.3","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.9.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.1.9-test2","dist":{"shasum":"45b046c5230ec6ef61f8b6b240472399a5ea8f9e","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.1.9-test2.tgz","integrity":"sha512-Db7MvED45637dtJSWeyHlwBD6TNmPXrAcmZ0g1Ge/bF/h5L/RIxYeR17KuXWHOeMwCN47Qjq6i5a8mrVMOUIaQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIF3TR4mwvws+oMe+4DjFSsw2BZe2JHYs7Ps1Hc1nHieaAiAVzsudrrSs2T1FQejUEL6c2nVjHINci5gnkDEgjYKxEw=="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.1.9-test2.tgz_1517173749037_0.7157105701044202"},"directories":{}},"1.1.9-test3":{"name":"picturebook","version":"1.1.9-test3","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra"},"license":"MIT","bin":{"picturebook":"./picturebook.sh","picturebook-build":"./picturebook-build.sh","picturebook-image":"./picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/react":"3.x","babel-cli":"6.26.0","babel-core":"6.26.0","babel-plugin-lodash":"3.3.2","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"5.0.0","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","kcd-scripts":"^0.30.4","lodash":"4.17.4","nightwatch":"0.9.19","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.8.1","selenium-standalone":"6.12.0","sharp":"0.18.4","storybook-addon-jsx":"5.3.0"},"devDependencies":{"babel-eslint":"8.2.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.15.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.9.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.3","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.9.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.1.9-test3","dist":{"shasum":"c4c264efc7feb9c526ae7b60f1e8799de9ef4776","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.1.9-test3.tgz","integrity":"sha512-5+7ARmL8cqzIeyD7znyemkMVyEoh6saWqd/C3PoH6EoZRuXYnQ2c+uyDXAcCAW2hHRolxgsp3AzoLv1qfZbI3w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCAeWe9kBChEoU64fajHGAZdlcCy030rfHLutm3f1lguwIhAI/Zp7x7vnZhp8y/wDvVmN1U0lf9DkVAOx5+UUPvPHyd"}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.1.9-test3.tgz_1517174496330_0.1481251863297075"},"directories":{}},"1.1.9-test4":{"name":"picturebook","version":"1.1.9-test4","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra"},"license":"MIT","bin":{"picturebook":"./bin/picturebook.sh","picturebook-build":"./bin/picturebook-build.sh","picturebook-image":"./bin/picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/react":"3.x","babel-cli":"6.26.0","babel-core":"6.26.0","babel-plugin-lodash":"3.3.2","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"5.0.0","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","kcd-scripts":"^0.30.4","lodash":"4.17.4","nightwatch":"0.9.19","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.8.1","selenium-standalone":"6.12.0","sharp":"0.18.4","storybook-addon-jsx":"5.3.0"},"devDependencies":{"babel-eslint":"8.2.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.15.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.9.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.3","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.9.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.1.9-test4","dist":{"shasum":"7141cbd6aaaeb110a7fc2882a506f7f139c63a59","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.1.9-test4.tgz","integrity":"sha512-aF6TiyBO0E/EgFw4fjmSzgomsNrNvYpGseDH24YHO5vmsrBGHk6b4u+pAjRz81P1jVi6TnV3gKWmYLvjzKjp4A==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDIQCI2rr8rMpf3TR8hWubzKirUuBEZajrUVjCQO34ebQIhAO2P8/mOpOydDZgjvm+whBv2bTdf4WzSbyD9mcM3+7WQ"}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.1.9-test4.tgz_1517176866404_0.8090585791505873"},"directories":{}},"1.1.9-test5":{"name":"picturebook","version":"1.1.9-test5","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra"},"license":"MIT","bin":{"picturebook":"./bin/picturebook.js","picturebook-build":"./bin/picturebook-build.sh","picturebook-image":"./bin/picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/react":"3.x","babel-cli":"6.26.0","babel-core":"6.26.0","babel-plugin-lodash":"3.3.2","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"5.0.0","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","kcd-scripts":"^0.30.4","lodash":"4.17.4","nightwatch":"0.9.19","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.8.1","selenium-standalone":"6.12.0","sharp":"0.18.4","storybook-addon-jsx":"5.3.0"},"devDependencies":{"babel-eslint":"8.2.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.15.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.9.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.3","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.9.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.1.9-test5","dist":{"shasum":"0ef01dfd2bf721c10f710ad0a1f7ab0e60dfef7e","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.1.9-test5.tgz","integrity":"sha512-8zoBZ+n01x8BVJcS5qfzqhkQs7/nxbBWGx2QN8JKxpcqxtpjfgoYGL4LaMzvfrbhaKMlrIHACs47z07scZVmvQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCyuCBVjrJcOMQYUYTph+4zR3I6oaX4DcQUZ8c8mwz6+wIgSxqXGi1uil5PoisJL/BXGYERoZB7KhFmDuUDKpDG/jg="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.1.9-test5.tgz_1517177303607_0.06740009202621877"},"directories":{}},"1.1.9-test6":{"name":"picturebook","version":"1.1.9-test6","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra"},"license":"MIT","bin":{"picturebook":"./bin/picturebook.js","picturebook-build":"./bin/picturebook-build.sh","picturebook-image":"./bin/picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/react":"3.x","babel-cli":"6.26.0","babel-core":"6.26.0","babel-plugin-lodash":"3.3.2","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"5.0.0","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","kcd-scripts":"^0.30.4","lodash":"4.17.4","nightwatch":"0.9.19","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.8.1","selenium-standalone":"6.12.0","sharp":"0.18.4","storybook-addon-jsx":"5.3.0"},"devDependencies":{"babel-eslint":"8.2.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.15.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.9.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.3","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.9.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.1.9-test6","dist":{"shasum":"91d0e5054168b03e85154bb90eb04ca1bece69d0","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.1.9-test6.tgz","integrity":"sha512-EpR1EbJ/d8/X4ZRh1nkZfpNh0nynsohOM9CM7lOZZUdZGvWq6od9a4CMLvxrt0Af/SBhEjQE1dJuTRfFDJ0Spg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDSLM2g9w6YSTK5o/ipy1O6j6UMCHlgTZOQcv3W8bROygIhAKB8FRNdbNSFeJ2n5mo5Xv5YuLFuU4yCiPHwCbwDBxel"}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.1.9-test6.tgz_1517177768903_0.2516576915513724"},"directories":{}},"1.1.9-test7":{"name":"picturebook","version":"1.1.9-test7","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra"},"license":"MIT","bin":{"picturebook":"./bin/picturebook.js","picturebook-build":"./bin/picturebook-build.sh","picturebook-image":"./bin/picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/react":"3.x","babel-cli":"6.26.0","babel-core":"6.26.0","babel-plugin-lodash":"3.3.2","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"5.0.0","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","kcd-scripts":"^0.30.4","lodash":"4.17.4","nightwatch":"0.9.19","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.8.1","selenium-standalone":"6.12.0","sharp":"0.18.4","storybook-addon-jsx":"5.3.0"},"devDependencies":{"babel-eslint":"8.2.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.15.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.9.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.3","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.9.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.1.9-test7","dist":{"shasum":"531fa86f5a750322a9c9df1660d316f0d251bd61","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.1.9-test7.tgz","integrity":"sha512-ttHY6+QT+5LGdRjPKrCZAZIgBRiyZv11IdHSt4wjziQFJr/UyyxzAHKjvEDIVicWcmX7NtBfNcvWuHjfdkI+Uw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGjBddt5RE6KzipI/zP8xYNx91fbQEe/7KD3uypeaKtOAiEAn9sKuEaZk677qn0vpc7+qetemQxOMes/wZwPo9Ej2T0="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.1.9-test7.tgz_1517178526842_0.5100784651003778"},"directories":{}},"1.1.9-test8":{"name":"picturebook","version":"1.1.9-test8","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra"},"license":"MIT","bin":{"picturebook":"./bin/picturebook.js","picturebook-build":"./bin/picturebook-build.sh","picturebook-image":"./bin/picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/react":"3.x","babel-cli":"6.26.0","babel-core":"6.26.0","babel-plugin-lodash":"3.3.2","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"5.0.0","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","kcd-scripts":"^0.30.4","lodash":"4.17.4","nightwatch":"0.9.19","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.8.1","selenium-standalone":"6.12.0","sharp":"0.18.4","storybook-addon-jsx":"5.3.0"},"devDependencies":{"babel-eslint":"8.2.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.15.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.9.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.3","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.9.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.1.9-test8","dist":{"shasum":"db8191d3d2b18517e4be1d8a19069d1d723939ea","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.1.9-test8.tgz","integrity":"sha512-FJk860XkuNpWgrOUO2gfAdu/A8YWhCGLooBdh8aq/5TqqjVMgmIu8f1a8NBfxR+yJn7sUwP9Z7Q2Jyn/yJGB/w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCiAl5nwCgzb7HkJstQWq5txBbNvX8iKaZDvoGjqRsryAIhAIBX1NzIe7DNcKOHCKg4QuBOIiYmtC2L1hqAwsHXtwkI"}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.1.9-test8.tgz_1517178968865_0.47417810768820345"},"directories":{}},"1.1.9-test9":{"name":"picturebook","version":"1.1.9-test9","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra"},"license":"MIT","bin":{"picturebook":"./bin/picturebook.js","picturebook-build":"./bin/picturebook-build.sh","picturebook-image":"./bin/picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/react":"3.x","babel-cli":"6.26.0","babel-core":"6.26.0","babel-plugin-lodash":"3.3.2","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"5.0.0","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","kcd-scripts":"^0.30.4","lodash":"4.17.4","nightwatch":"0.9.19","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.8.1","selenium-standalone":"6.12.0","sharp":"0.18.4","storybook-addon-jsx":"5.3.0"},"devDependencies":{"babel-eslint":"8.2.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.15.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.9.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.3","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.9.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.1.9-test9","dist":{"shasum":"4b516ad7e0f35316c5f707f58a208c819e6ad31a","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.1.9-test9.tgz","integrity":"sha512-F3wG0IneBN7yEinKo9OoQxsB+++vr5ZJXxVOK7oYAECA1H/B5G5zUmnBGnUm+8JsP3hPhd9BnSqZKUS1LokFoQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFLXIWgVLoaAAGtmCX3JRsYTQQ8nOQvfBcmD7VB5ZkfoAiAspUmCiiTWo3APWrY3+001W06M8ZdbwkZkCdWRkXJswA=="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.1.9-test9.tgz_1517179618104_0.18530452577397227"},"directories":{}},"1.1.9-test10":{"name":"picturebook","version":"1.1.9-test10","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra"},"license":"MIT","bin":{"picturebook":"./bin/picturebook.js","picturebook-build":"./bin/picturebook-build.sh","picturebook-image":"./bin/picturebook-image.sh"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/react":"3.x","babel-cli":"6.26.0","babel-core":"6.26.0","babel-plugin-lodash":"3.3.2","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"5.0.0","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","kcd-scripts":"^0.30.4","lodash":"4.17.4","nightwatch":"0.9.19","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.8.1","selenium-standalone":"6.12.0","sharp":"0.18.4","storybook-addon-jsx":"5.3.0"},"devDependencies":{"babel-eslint":"8.2.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.15.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.9.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.3","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.9.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.1.9-test10","dist":{"shasum":"2550c2c68cbe349e032e6393caac9364de4490db","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.1.9-test10.tgz","integrity":"sha512-UnlB+6xfwII50QydN7HaOTO0CdRDrWXIYqNwG5Xx2MbLcqDxdc/4BxWTmJEnTjP72nH//QVquU3Ea8fox89GjA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBd9x8sj/PuItNykj71uHEWi078zycvEj/pXM7tpiX2jAiEAhQ57K0Xjo1f0QJqxYDUyw7QfUd9XW64WqKAPLFckqNw="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.1.9-test10.tgz_1517180063373_0.19158264272846282"},"directories":{}},"1.1.9-test11":{"name":"picturebook","version":"1.1.9-test11","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra"},"license":"MIT","bin":{"picturebook":"./bin/picturebook.js"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/react":"3.x","babel-cli":"6.26.0","babel-core":"6.26.0","babel-plugin-lodash":"3.3.2","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"5.0.0","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","kcd-scripts":"^0.30.4","lodash":"4.17.4","nightwatch":"0.9.19","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.8.1","selenium-standalone":"6.12.0","sharp":"0.18.4","storybook-addon-jsx":"5.3.0"},"devDependencies":{"babel-eslint":"8.2.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.15.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.9.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.3","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.9.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.1.9-test11","dist":{"shasum":"0fd685625f98ddec9ffbbb0d483b510d97113f43","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.1.9-test11.tgz","integrity":"sha512-B0maQXMR3RKaRjrkeNF+66UjqRuNt1kxnG2gA1dZqNkechUXFZ3ihY/Od/HfsYCkDdZhOszTSz2tqO2I0LxvWQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAkQgEhDtSMvaCHDl9B+x5HtKtNCalzLDqpnm5v8t8X4AiBGISotmNJcUCnZUFDrEe9aRnqq4fMVDRQylxDqHs370A=="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.1.9-test11.tgz_1517180966428_0.8958163212519139"},"directories":{}},"1.1.9-test12":{"name":"picturebook","version":"1.1.9-test12","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra"},"license":"MIT","bin":{"picturebook":"./bin/picturebook.js","picturebook-build":"./bin/picturebook-build.js","picturebook-image":"./bin/picturebook-image.js"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"@storybook/react":"3.x","babel-cli":"6.26.0","babel-core":"6.26.0","babel-plugin-lodash":"3.3.2","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"5.0.0","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","kcd-scripts":"^0.30.4","lodash":"4.17.4","nightwatch":"0.9.19","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.8.1","selenium-standalone":"6.12.0","sharp":"0.18.4","storybook-addon-jsx":"5.3.0"},"devDependencies":{"babel-eslint":"8.2.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.15.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.9.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.3","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.9.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.1.9-test12","dist":{"shasum":"82c267d50ab6a5e9108c89b106e30f2b996b034d","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.1.9-test12.tgz","integrity":"sha512-oHq3xvvljQ5GbRc6ZZg+FqLlwoTR6jb3xpAHIko8x96/tHAWgD7l0aFyxWVTymWfKWu7PU6fMUCvK0wHm21ndQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCep/jk0VxDg/LXdeNqNUWj8TvodpT5GFY6fKLIxd/rWwIgB0Mo6/DWjWj3ozLTgGRuyhNr3p07ySiV107fD2P/EYI="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.1.9-test12.tgz_1517182798567_0.05467963614501059"},"directories":{}},"1.1.9-test13":{"name":"picturebook","version":"1.1.9-test13","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra"},"license":"MIT","bin":{"picturebook":"./bin/picturebook.js","picturebook-build":"./bin/picturebook-build.js","picturebook-image":"./bin/picturebook-image.js"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","babel-plugin-lodash":"3.3.2","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"5.0.0","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","kcd-scripts":"^0.30.4","lodash":"4.17.4","nightwatch":"0.9.19","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.8.1","selenium-standalone":"6.12.0","sharp":"0.18.4","storybook-addon-jsx":"5.3.0"},"devDependencies":{"babel-eslint":"8.2.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.15.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.9.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.3","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.9.2"},"peerDependencies":{"@storybook/react":"3.x","@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.1.9-test13","dist":{"shasum":"c847caa5fc299b1353952f0134f8f12f1b95e490","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.1.9-test13.tgz","integrity":"sha512-dXV+BFlueMxrwfVWjwDu8VpdQnYrbEVys/4I8eiwZiBJLAbGUToCCLlTvP7Gc9FepO7BLhWzFcz3Lyg3k+6ZKQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCpzwPWl1kKA2r7PZgz0QWTfK6dePml8I3hdtWWyOUEnwIhAMy6E/e20BQWy1t6Z7Z7VQng0ZyNKxnkAaSyHLPLW6uO"}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.1.9-test13.tgz_1517183258888_0.9684043885208666"},"directories":{}},"1.1.9-test14":{"name":"picturebook","version":"1.1.9-test14","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra"},"license":"MIT","bin":{"picturebook":"./bin/picturebook.js","picturebook-build":"./bin/picturebook-build.js","picturebook-image":"./bin/picturebook-image.js"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","babel-plugin-lodash":"3.3.2","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"5.0.0","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","kcd-scripts":"^0.30.4","lodash":"4.17.4","nightwatch":"0.9.19","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.8.1","selenium-standalone":"6.12.0","sharp":"0.18.4","storybook-addon-jsx":"5.3.0"},"devDependencies":{"babel-eslint":"8.2.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.15.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.9.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.3","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.9.2"},"peerDependencies":{"@storybook/react":"3.x","@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.1.9-test14","dist":{"shasum":"27d5cde97b62b06974e75e04215c570bf0c93d46","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.1.9-test14.tgz","integrity":"sha512-KKXWzzGqM3FC2Om5ilpa8TIOvgLKc+KeTMJ5mCsHJpuY0nijfgHQ3nSaaVihw6dJ2YVXU+eUkF48WPPQk/0GwQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCS+/RC8xiyoQsYLoSzWNm3UUZtstLfT8fGfBezXr1MiQIhANJJhi3lGgy5LDvLGoTq7VSiSZJzGOH/iN5/ecGf12EE"}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.1.9-test14.tgz_1517183402551_0.6145395312923938"},"directories":{}},"1.2.0":{"name":"picturebook","version":"1.2.0","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra"},"license":"MIT","bin":{"picturebook":"./bin/picturebook.js","picturebook-build":"./bin/picturebook-build.js","picturebook-image":"./bin/picturebook-image.js"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","babel-plugin-lodash":"3.3.2","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"5.0.0","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","kcd-scripts":"^0.30.4","lodash":"4.17.4","nightwatch":"0.9.19","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.8.1","selenium-standalone":"6.12.0","sharp":"0.18.4","storybook-addon-jsx":"5.3.0"},"devDependencies":{"babel-eslint":"8.2.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.15.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.9.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.3","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.9.2"},"peerDependencies":{"@storybook/react":"3.x","@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.2.0","dist":{"shasum":"f539b322707122b112476a5916a1d4f4242d2626","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.2.0.tgz","integrity":"sha512-kHDnjGtZHZvREQr1g4Q7evG8VrQk6mRBaS84W5h8fiYBKfJTxaqhkc8X1DqYFfi3dLSvDKsts461Azy9kJwgzg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDz3iF7vHXFO5AyzVXRj5Jeq9ibvTYTQPBy6D01gACg8AIgb2VMFN3nW9FZCZ/IJtKgRRj+LsVuFHHm7F9eI1Gop4Q="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.2.0.tgz_1517187232959_0.054972943384200335"},"directories":{}},"1.2.1":{"name":"picturebook","version":"1.2.1","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra"},"license":"MIT","bin":{"picturebook":"./bin/picturebook.js","picturebook-build":"./bin/picturebook-build.js","picturebook-image":"./bin/picturebook-image.js"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","babel-plugin-lodash":"3.3.2","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"5.0.0","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","kcd-scripts":"^0.30.4","lodash":"4.17.4","nightwatch":"0.9.19","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.8.1","selenium-standalone":"6.12.0","sharp":"0.18.4","storybook-addon-jsx":"5.3.0"},"devDependencies":{"babel-eslint":"8.2.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.15.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.9.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.3","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.9.2"},"peerDependencies":{"@storybook/react":"3.x","@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.2.1","dist":{"shasum":"afc2623bc742eb187b09a56ca22e9e547c5f5bea","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.2.1.tgz","integrity":"sha512-wrKCmu/RUzrbkzOCTkJ0oaDUWP/YMj7TAM9/xGSYMBhnNNQbWl0hIyJzIip8X0QbwUcsZovzuV9svn1wh1vppg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDDpAb0/dTZ9yOnJLYSOhzwb4KECjCveIr+kf7HEXAEwQIhALUcl607Hj27YAKqHBotyh/+5dzvRyITyJGGaCke0mIc"}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.2.1.tgz_1517187318595_0.7684205428231508"},"directories":{}},"1.2.2":{"name":"picturebook","version":"1.2.2","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra"},"license":"MIT","bin":{"picturebook":"./bin/picturebook.js","picturebook-build":"./bin/picturebook-build.js","picturebook-image":"./bin/picturebook-image.js"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","babel-plugin-lodash":"3.3.2","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"5.0.0","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","kcd-scripts":"^0.30.4","lodash":"4.17.4","nightwatch":"0.9.19","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.8.1","selenium-standalone":"6.12.0","sharp":"0.18.4","storybook-addon-jsx":"5.3.0"},"devDependencies":{"babel-eslint":"8.2.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.15.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.9.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.3","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.9.2"},"peerDependencies":{"@storybook/react":"3.x","@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.2.2","dist":{"shasum":"f289715b595238ce732b9c293965336c84b28510","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.2.2.tgz","integrity":"sha512-AqkeyMiEfh1KaiatZf3gDmMrL3k2/QIvBLrZoD0MbPy30I9Uqsq5mZk36089cghJKr67UuLGkXOwnxO81pAKIA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDSGbFjJEIrJH9G+nQCtvAl7m4OnVdyLw9pxTpi7aDPVgIhAJwX7OYFMre4gDRvmu8LYrgTbybCJSjUN+fJoT8eQ9V2"}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.2.2.tgz_1517668229056_0.3888553318101913"},"directories":{}},"1.2.3":{"name":"picturebook","version":"1.2.3","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra"},"license":"MIT","bin":{"picturebook":"./bin/picturebook.js","picturebook-build":"./bin/picturebook-build.js","picturebook-image":"./bin/picturebook-image.js"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","babel-plugin-lodash":"3.3.2","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"5.0.0","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","kcd-scripts":"^0.30.4","lodash":"4.17.4","nightwatch":"0.9.19","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.8.1","selenium-standalone":"6.12.0","sharp":"0.18.4","storybook-addon-jsx":"5.3.0"},"devDependencies":{"babel-eslint":"8.2.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.15.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.9.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.3","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.9.2"},"peerDependencies":{"@storybook/react":"3.x","@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.2.3","dist":{"shasum":"c88720008ebc1e75b74afb505adb2b811917c690","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.2.3.tgz","integrity":"sha512-LWVU5UZ6kM04CORivJXiMMV6AE9QdRamXNKlW0pwI9pdWJdzOcptuir/4opKj3yG/vh09z7x5ATyCcupC0240A==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEXXT57N0QL8TCXozB9pcSkqOuewR/QZXGzJIAZMRSt+AiEAoFCuf2OAfj4BdfHEaxjNsWu6AlnYKvNwhDzY+MwTVYQ="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.2.3.tgz_1517764790735_0.8162761521525681"},"directories":{}},"1.2.4":{"name":"picturebook","version":"1.2.4","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"https://github.com/obartra/picturebook"},"author":{"name":"Oscar Bartra"},"license":"MIT","bin":{"picturebook":"./bin/picturebook.js","picturebook-build":"./bin/picturebook-build.js","picturebook-image":"./bin/picturebook-image.js"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","babel-plugin-lodash":"3.3.2","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"5.0.0","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","kcd-scripts":"^0.30.4","lodash":"4.17.4","nightwatch":"0.9.19","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.8.1","selenium-standalone":"6.12.0","sharp":"0.18.4","storybook-addon-jsx":"5.3.0"},"devDependencies":{"babel-eslint":"8.2.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.15.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.9.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.3","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.9.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"licenseText":"MIT License\n\nCopyright (c) 2017 Oscar Bartra\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"picturebook@1.2.4","dist":{"shasum":"94edd37830accae0eece0e668f82b2dffd21443b","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.2.4.tgz","integrity":"sha512-hCXcxS1PgOEKFRsO3z6Cngxj0E0n5Nd7mfw7qReZGI2CsEEBJKgwd63FG96U/dXyU27DW8ZKzaF3zujFgGUzLQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCvcX1pGYbROt59wkWrVvNxn0lY4L7mlQgdB1dn4HO/KQIgcP67/w2uxOmURzK1KXOA2BTfEDWl7R9fPkvdpCoejQ0="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook-1.2.4.tgz_1517766933116_0.40970117738470435"},"directories":{}},"1.2.5":{"name":"picturebook","version":"1.2.5","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"git+https://github.com/obartra/picturebook.git"},"author":{"name":"Oscar Bartra"},"license":"MIT","bin":{"picturebook":"./bin/picturebook.js","picturebook-build":"./bin/picturebook-build.js","picturebook-image":"./bin/picturebook-image.js"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","babel-plugin-lodash":"3.3.2","babel-plugin-preval":"1.6.2","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","cosmiconfig":"3.1.0","find-up":"2.1.0","fs-extra":"5.0.0","harmony-reflect":"1.5.1","identity-obj-proxy":"3.0.0","kcd-scripts":"^0.30.4","lodash":"4.17.4","nightwatch":"0.9.19","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.8.1","selenium-standalone":"6.12.0","sharp":"0.18.4","storybook-addon-jsx":"5.3.0"},"devDependencies":{"babel-eslint":"8.2.1","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.15.0","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.9.0","eslint-plugin-import":"2.8.0","eslint-plugin-jsx-a11y":"6.0.3","eslint-plugin-react":"7.5.1","postcss-cssnext":"3.0.2","postcss-flexbugs-fixes":"3.2.0","postcss-import":"11.0.0","postcss-nesting":"4.2.1","prettier":"1.9.2"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"gitHead":"3ca5b145045a04792b7a4b84971a00751ebeb086","bugs":{"url":"https://github.com/obartra/picturebook/issues"},"homepage":"https://github.com/obartra/picturebook#readme","_id":"picturebook@1.2.5","_npmVersion":"5.6.0","_nodeVersion":"9.3.0","_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"dist":{"integrity":"sha512-d7gOvIqEyvh2AUaFp7Q/KqDrK2x2Q/oppMqceJiBDr9fyWFXOXwit6Ei+j3+YVkSkISuIxAu7wbETW2UTBX4WA==","shasum":"34750953bc25fad29ba63f0f44fd0799ff3c3172","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.2.5.tgz","fileCount":39,"unpackedSize":307074,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBplLlD0g2Wk+u/34q3dN+niMUmP3hWoPJGooUgl0hVDAiB6/MbO4EAXy/guafRBUDGrpj5z34TvdzfaTbBGbrOL8g=="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook_1.2.5_1520719087382_0.010327739136230862"},"_hasShrinkwrap":false},"1.2.6":{"name":"picturebook","version":"1.2.6","description":"Opinionated Storybook Setup","main":"index.js","repository":{"type":"git","url":"git+https://github.com/obartra/picturebook.git"},"author":{"name":"Oscar Bartra"},"license":"MIT","bin":{"picturebook":"./bin/picturebook.js","picturebook-build":"./bin/picturebook-build.js","picturebook-image":"./bin/picturebook-image.js"},"scripts":{"format-all":"git ls-files {config,shared,test}*.{js,css} | xargs yarn format","format":"prettier --write --single-quote --no-semi --trailing-comma es5"},"dependencies":{"babel-cli":"6.26.0","babel-core":"6.26.0","babel-plugin-lodash":"3.3.2","babel-plugin-preval":"1.6.4","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.6.1","babel-preset-react":"6.24.1","cosmiconfig":"4.0.0","find-up":"2.1.0","fs-extra":"5.0.0","harmony-reflect":"1.6.0","identity-obj-proxy":"3.0.0","kcd-scripts":"^0.36.0","lodash":"4.17.5","nightwatch":"0.9.20","node-resemble-js":"0.2.0","saucelabs":"1.4.0","selenium-server-standalone-jar":"3.9.1","selenium-standalone":"6.13.0","sharp":"0.20.0","storybook-addon-jsx":"5.3.0"},"devDependencies":{"babel-eslint":"8.2.2","babel-runtime":"6.26.0","cssnano":"3.10.0","eslint":"4.18.2","eslint-config-airbnb":"16.1.0","eslint-config-prettier":"2.9.0","eslint-plugin-import":"2.9.0","eslint-plugin-jsx-a11y":"6.0.3","eslint-plugin-react":"7.7.0","postcss-cssnext":"3.1.0","postcss-flexbugs-fixes":"3.3.0","postcss-import":"11.1.0","postcss-nesting":"4.2.1","prettier":"1.11.1"},"peerDependencies":{"@storybook/addon-actions":"3.x","@storybook/addon-knobs":"3.x","@storybook/addon-notes":"3.x","@storybook/addon-options":"3.x","@storybook/channels":"3.x","@storybook/react":"3.x","react":">= 15.x","react-dom":">= 15.x"},"gitHead":"b6a4cf1168bd54b511c5023cfff410664be3ec1a","bugs":{"url":"https://github.com/obartra/picturebook/issues"},"homepage":"https://github.com/obartra/picturebook#readme","_id":"picturebook@1.2.6","_npmVersion":"5.6.0","_nodeVersion":"9.3.0","_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"dist":{"integrity":"sha512-i9pF/l1AxWDoP8XAjdw+95GDBYhdFHVip0znJ4jwrJqEN5U8PwoLHVKurGsa1IUxYWfOGsnBp25Y/WgFPXbjiQ==","shasum":"3f8f4ae114a2db8af957e1fd4ecc66834d144637","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-1.2.6.tgz","fileCount":39,"unpackedSize":333863,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEBLb/iHxH+8puod8P8o4Zc8mIXaS/CdgW15sXDeLvGzAiBUSaOL2H90pFOJOCc0tu9atc7/2QuXab+bgo8oIuhwOQ=="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook_1.2.6_1520721156326_0.8507782731191642"},"_hasShrinkwrap":false},"2.0.0-beta.1":{"name":"picturebook","version":"2.0.0-beta.1","description":"Opinionated Storybook Setup","main":"dist/picturebook.node.js","browser":"dist/picturebook.web.js","repository":{"type":"git","url":"git+https://github.com/obartra/picturebook.git"},"author":{"name":"Oscar Bartra"},"license":"MIT","scripts":{"format":"prettier --write \"{{src,test,sampleFolder}/**/,}*.js\"","test":"jest","lint":"eslint --ext .js --cache .","build":"webpack --mode development --config webpack.build.config.js","build:watch":"yarn build --watch","test:watch":"yarn test --watch","start":"yarn && yarn build && cd sampleFolder && yarn && yarn start","test:app":"cd sampleFolder && yarn test --env chrome,firefox,ie11,edge,safari,iphone7","ci":"yarn lint && yarn flow && yarn test"},"dependencies":{"fs-extra":"7.0.0","lodash":"4.17.10","node-sauce-connect":"4.5.0","pixelmatch":"4.0.2","pngjs":"3.3.3","rimraf":"2.6.2","selenium-download":"2.0.13","selenium-server-standalone-jar":"3.13.0"},"devDependencies":{"@storybook/react":"3.4.10","babel-cli":"6.26.0","babel-core":"6.26.3","babel-eslint":"8.2.6","babel-loader":"7.1.5","babel-plugin-require-context-hook":"1.0.0","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-flow-strip-types":"6.22.0","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.7.0","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","clean-webpack-plugin":"0.1.19","eslint":"5.4.0","eslint-config-airbnb":"17.1.0","eslint-config-prettier":"3.0.1","eslint-plugin-flowtype":"2.50.0","eslint-plugin-import":"2.14.0","eslint-plugin-jest":"21.22.0","eslint-plugin-jsx-a11y":"6.1.1","eslint-plugin-prettier":"2.6.2","eslint-plugin-promise":"4.0.0","eslint-plugin-react":"7.11.1","flow-bin":"0.79.1","jest":"23.5.0","png-crop":"0.0.2","prettier":"1.14.2","react":"16.4.2","react-dom":"16.4.2","webpack":"4.17.1","webpack-cli":"3.1.0"},"peerDependencies":{"@storybook/react":">= 3.x","nightwatch":">=0.9.x","react":">= 15.x","react-dom":">= 15.x"},"readme":"# 🤖📗 PictureBook\n\nAutomated React Storybook Setup\n\nSimplify React Storybook story creation and cross-browser image comparison testing\n\n## 💡 Rationale\n\nSetting up storybook and implement cross-browser image comparison testing on multiple projects is time consuming.\n\nInstead of providing a wrapper on top of existing projects that will fall out of date, Picturebook lets you retain control of the Storybook and Nightwatch packages.\n\nThis project aims to provide utility methods to simplify [Storybook](https://storybook.js.org/), [SauceLabs](https://saucelabs.com/) and [Nightwatch](http://nightwatchjs.org/) configuration and screenshot comparison. Specifically:\n\n- **Creation of storybook stories**: They are created based on your file system structure\n- **Saucelabs tunnel setup**: Reduce SauceConnect config to the tunnel id and username / accessKey\n- **Screenshot**: Take screenshots of every story on different browsers using SauceLabs and Nightwatch\n- **Image Comparison**: Compare and update screenshots to baselines collocated with your stories.\n\n## ⚙️ Install\n\n1. You will need a SauceLabs account. If you don't have one you can sign up for a trial [here](https://signup.saucelabs.com/signup/trial) or request a free one for open source projects [here](https://saucelabs.com/open-source-request-account).\n1. If you want to run tests against Safari and IE11 from localhost, add `localtest.dev 127.0.0.1` to your `/etc/hosts` (the exact steps may vary depending on your platform, see [here](https://www.howtogeek.com/howto/27350/beginner-geek-how-to-edit-your-hosts-file/) for more details).\n1. Add picturebook and its peer dependencies:\n\n```sh\nyarn add --dev picturebook @storybook/react nightwatch react\n```\n\nIf you don't have Storybook set it up yet, follow [these instructions](https://storybook.js.org/basics/quick-start-guide/) first.\n\nSome of Picturebook utility methods rely on the output of `require.context`. This is a webpack construct and it's not available in Node or test environments. There are multiple ways to mock it. If you are using babel you could add the [require-context-hook](https://github.com/smrq/babel-plugin-require-context-hook) plugin. For instance, if you want to enable it only for tests, you can do something like:\n\n```json\n{\n  \"env\": {\n    \"test\": {\n      \"plugins\": [\"require-context-hook\"]\n    }\n  }\n}\n```\n\nand on your test setup:\n\n```js\nrequire('babel-plugin-require-context-hook/register')()\n```\n\nAlternatively, there's also the [require-context](https://www.npmjs.com/package/require-context) npm package that will also emulate webpack's `require.context`.\n\n## 📚 API\n\n```js\ntype StoryPaths = {|\n  +name: string,\n  +parents: $ReadOnlyArray<string>,\n  +title: string,\n  +path: string,\n  +screenshots: {|\n    +[extension: string]: string,\n  |},\n  +tests: {|\n    +[extension: string]: string,\n  |},\n  +doc: ?string,\n  +url: ?string,\n|}\n\ntype LoadedStory = {|\n  ...$Exact<StoryPaths>,\n  +main: () => React.Node,\n|}\n\ntype Options = {|\n  flattenFolders: $ReadOnlyArray<string>,\n  storiesOf: any,\n  stories: any,\n  baseUrl?: string,\n  decorators: $ReadOnlyArray<Function>,\n  storyFiles: $ReadOnlyArray<string>,\n|}\n\ntype ImgLog = {|\n  +imgFileName: string,\n  +name: string,\n  +platform: string,\n  +browser: string\n|}\n\nfunction getFiles(userOptions: $Shape<Options>): Array<StoryPaths>\n\nfunction loadStories(userOptions: $Shape<Options>): Array<LoadedStory>\n\nfunction nightwatchConfig(params: {\n  desiredCapabilities?: {},     // nightwatch desired capabilities object\n  files: Array<StoryPaths>,     // output of getFiles()\n  username: string,             // SauceLabs username\n  access_key: string,           // SauceLabs accessKey\n  browsers?: {                  // List of browsers to test. Default list\n    [browserName: string]: {    //   includes chrome, firefox, edge, ie11, iphone7\n      desiredCapabilities: {    //   and safari but any valid SauceLabs config is\n        platform: string,       //   valid\n        version: string,\n        browserName: string,\n        screenResolution: string,\n      },\n      custom_vars: {|           // Custom properties required per browser config:\n        name: string,           // Must match \"browserName\"\n        platform: string,       // \"mobile\" | \"desktop\" but any string is allowed\n        extract?: {|            // If cropping the output, specify crop\n          top: number,\n          left: number,\n          width: number,\n          height: number,\n        |},\n      |},\n    },\n  },\n  // Alias for browsers where localhost cannot be accessed from a tunnel,\n  // defaults to \"localtest.dev\"\n  localhostAlias?: string,\n  // List of browsers that can't access localhost from a tunnel, defaults to:\n  // [\"ie11\", \"safari\"]\n  localhostAliasBrowsers?: Array<string>,\n  resultPath?: string,           // Where to output the result file\n  proxy?: {},                    // Nightwatch proxy object\n}): Object\n\nfunction compareImages(params: {\n    screenshots: Array<ImgLog>,  // output of runTests() or runTestsWithTunnel()\n    files: Array<StoryPaths>,    // output of getFiles()\n    root: string,                // base path for the stories\n    threshold?: number,          // max number of different pixels allowed\n    overwrite?: boolean          // update image instead of failing\n  }): Promise<{\n    +name: string,\n    +status: 'CREATED' | 'SUCCESS' | 'FAILED',\n    +error: ?string,\n    +diffPath: ?string,\n    +referencePath: ?string,\n    +screenshotPath: ?string,\n    +diffThreshold: number,\n    +browser: string,\n    +platform: string,\n  }>\n\nfunction runTests(configPath: string): Promise<Array<ImgLog>>\n\nfunction runTestsWithTunnel(tunnelId: string, configPath: string): Promise<Array<ImgLog>>\n```\n\n## 🎪 Sample App\n\nThis project includes a sample app to demo the behavior. You can view it running `yarn start` and opening `localhost:6006` on your browser.\n\nTo run the image comparison tests, keep `yarn start` running and call `SAUCE_ACCESS_KEY={YOUR_ACCESS_KEY} SAUCE_USERNAME={YOUR_USERNAME} yarn test:app`.\n\n## ️✏️ Storybook Usage\n\nTo take advantage of the automated storybook folder config (and testing) modify your storybook `config.js` to look like this:\n\n```js\nimport { storiesOf, configure } from '@storybook/react'\nimport * as picturebook from 'picturebook'\n\nfunction loadStories() {\n  picturebook.loadStories({\n    storiesOf,\n    stories: require.context('../stories', true, /\\.(js|md|png)/),\n  })\n}\n\nconfigure(loadStories, module)\n```\n\nIf you want to see a more advanced use case on how to use it with decorators and other plugins, check out the [sample project](./sampleFolder/.storybook/config.js).\n\n## 📸 Screenshot Usage\n\nTo take screenshots, picturebook relies on nightwatch. With the exception of a few required fields, configuration is generated for you. To take advantage of it you should create a `nightwatch.conf.js` file on your root (or customize it following instructions [here](http://nightwatchjs.org/gettingstarted#settings-file)).\n\n```js\nrequire('babel-register')\n\nconst { resolve } = require('path')\nconst { nightwatchConfig, getFiles } = require('picturebook')\nconst requireContext = require('require-context')\n\nconst config = nightwatchConfig({\n  username: process.env.SAUCE_USERNAME,\n  access_key: process.env.SAUCE_ACCESS_KEY,\n  files: getFiles({\n    baseUrl: 'http://localhost:6006',\n    stories: requireContext(resolve(__dirname, './stories'), true, /\\.js/),\n  }),\n  resultPath: resolve(__dirname, './picturebook-img.log'),\n  desiredCapabilities: {\n    build: 'local',\n    'tunnel-identifier': 'picturebook-sample',\n  },\n})\n\nmodule.exports = config\n```\n\nTo run image comparison, after screenshots have been taken you can call:\n\n```js\ncompareImages({\n  screenshots,\n  root: storyRoot,\n  overwrite: true,\n  files: getFiles({\n    stories: requireContext(storyRoot, true, /\\.(js|png)/),\n  }),\n})\n```\n\nWhere `screenshots` is the output of `runTestsWithTunnel` or `runTests` (if running with or without a tunnel, respectively).\n\n## 🙋 QYMA (Questions you may ask)\n\n### Why do I need to add localtest.dev as a localhost alias?\n\nThis is a SauceLabs issue. To work around it, `safari` and `edge` browsers replace `localhost` from urls to `localtest.dev` as described [here](https://support.saucelabs.com/hc/en-us/articles/225106887-Safari-and-Internet-Explorer-Won-t-Load-Website-When-Using-Sauce-Connect-on-Localhost).\n\nYou can customize the target browsers and localhost alias with the `localhostAliasBrowsers` and `localhostAlias`, respectively.\n\n### How do you skip some files?\n\nPicturebook will only take screenshots of the files you tell it exists. You can filter the output from [require.context](https://webpack.js.org/guides/dependency-management/#require-context) by specifying a different regExp to filter by.\n\n### SauceConnect ENOENT error\n\nIf you see the following error after a couple unsuccessful runs of SauceConnect:\n\n```sh\nevents.js:167\n      throw er; // Unhandled 'error' event\n      ^\n\nError: spawn ~/picturebook/node_modules/node-sauce-connect/lib/sc ENOENT\n```\n\nSometimes it gets stuck. Try cleaning `node_modules` and re-running yarn:\n\n```sh\nrm -rf node_modules\nyarn\n```\n","readmeFilename":"README.md","gitHead":"c64ee09e3ecd8da13b17e95d03a3e2d7a151bfec","bugs":{"url":"https://github.com/obartra/picturebook/issues"},"homepage":"https://github.com/obartra/picturebook#readme","_id":"picturebook@2.0.0-beta.1","_npmVersion":"6.1.0","_nodeVersion":"10.6.0","_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"dist":{"integrity":"sha512-Pg9lY9nqktzdmc7Ze4yZ9M+6JiG28qcdH3a7h4lnHq3+XdvdiNwhTSZf5TnwKoA/qyCxX+/UjbsYGnKZ/9fzoQ==","shasum":"785e9dfdb684728e6ac1bb4484d5ab43579e6546","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-2.0.0-beta.1.tgz","fileCount":114,"unpackedSize":7150453,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbo90cCRA9TVsSAnZWagAAwR0P/jsJyGjKXyCEyDGGXSla\n4huuLCy9+4ixDEjlhDrvzRHb2B6KZjRLm8aoFY+HnpECGt3N4fOQ7bhxvx/y\nIGpTAriVeMtPj8Y/QqDMDfRPGABMyCllmLiguaogUdrDg775kbz/styafNDI\n3+h96OfvvfOCn62bZRc0cxL8OZVcuLkAaPi8ate2RSNMgknvmkyisPggFHTV\n6kwZadzk4Pli5IxxrZM+VGFKu2rTflqToOY4fv+VJPh/h163aZZVDPhBsF9y\nuzuoqf31L2eJKX88IVukmfwVbt7ZPi6OWZSuB3JR1j+G59Wp3UFePSv1eU9o\n4VLbm0aMCjFMXGCchLenZIjEofQOX/eDKb1hZruXRSw2i9V+ZUxz0k5nbvA2\nksXYhTBTK1YxlqgBLfz7XGDGeHcsGgRWDr+oK+jm81uPZ/4G0Wk6lBo3xY6G\n6Zuy+ka4JQxM1VhBx/6NKBSbfBT32NdqD9xYae3M4Hl3OeJ8f4EDwT8vVDIX\nHYFO85aKjIQUFk27zfd2tI50Vqf70HmV0RVKpTEX6P5y4lwcvEStdKbwtHB6\nVDALW6750B/Xtu+DHwWjjnE9iqQtYtKHMTCQqWVrdbDtA9pj2c1xqSAz5wWW\nb6gIUeWrEvbRlc/KFjwZva03vWYgP3Sue/qBDoCBQsC2IsT0umalU3AVW3M4\n30hv\r\n=eW73\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD2Ddmwf5dCCG1tqxtfz/OoQH5pQa5tPNIk2fX0y7E3+gIgR5LiSpMG763CFYDAkmEVeZucwMi59CDn1co03k3Ukts="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook_2.0.0-beta.1_1537465627815_0.48825615951757295"},"_hasShrinkwrap":false},"2.0.0-beta.2":{"name":"picturebook","version":"2.0.0-beta.2","description":"Opinionated Storybook Setup","main":"dist/picturebook.node.js","browser":"dist/picturebook.web.js","repository":{"type":"git","url":"git+https://github.com/obartra/picturebook.git"},"author":{"name":"Oscar Bartra"},"license":"MIT","scripts":{"format":"prettier --write \"{{src,test,sampleFolder}/**/,}*.js\"","test":"jest","lint":"eslint --ext .js --cache .","build":"webpack --mode development --config webpack.build.config.js","build:watch":"yarn build --watch","test:watch":"yarn test --watch","start":"yarn && yarn build && cd sampleFolder && yarn && yarn start","test:app":"cd sampleFolder && yarn test --env chrome,firefox,ie11,edge,safari,iphone7","ci":"yarn lint && yarn flow && yarn test"},"dependencies":{"fs-extra":"7.0.0","lodash":"4.17.10","node-sauce-connect":"4.5.0","pixelmatch":"4.0.2","pngjs":"3.3.3","rimraf":"2.6.2","selenium-download":"2.0.13","selenium-server-standalone-jar":"3.13.0"},"devDependencies":{"@storybook/react":"3.4.10","babel-cli":"6.26.0","babel-core":"6.26.3","babel-eslint":"8.2.6","babel-loader":"7.1.5","babel-plugin-require-context-hook":"1.0.0","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-flow-strip-types":"6.22.0","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.7.0","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","clean-webpack-plugin":"0.1.19","eslint":"5.4.0","eslint-config-airbnb":"17.1.0","eslint-config-prettier":"3.0.1","eslint-plugin-flowtype":"2.50.0","eslint-plugin-import":"2.14.0","eslint-plugin-jest":"21.22.0","eslint-plugin-jsx-a11y":"6.1.1","eslint-plugin-prettier":"2.6.2","eslint-plugin-promise":"4.0.0","eslint-plugin-react":"7.11.1","flow-bin":"0.79.1","jest":"23.5.0","png-crop":"0.0.2","prettier":"1.14.2","react":"16.4.2","react-dom":"16.4.2","webpack":"4.17.1","webpack-cli":"3.1.0"},"peerDependencies":{"@storybook/react":">= 3.x","nightwatch":">=0.9.x","react":">= 15.x","react-dom":">= 15.x"},"gitHead":"c64ee09e3ecd8da13b17e95d03a3e2d7a151bfec","readme":"# 🤖📗 PictureBook\n\nAutomated React Storybook Setup\n\nSimplify React Storybook story creation and cross-browser image comparison testing\n\n## 💡 Rationale\n\nSetting up storybook and implement cross-browser image comparison testing on multiple projects is time consuming.\n\nInstead of providing a wrapper on top of existing projects that will fall out of date, Picturebook lets you retain control of the Storybook and Nightwatch packages.\n\nThis project aims to provide utility methods to simplify [Storybook](https://storybook.js.org/), [SauceLabs](https://saucelabs.com/) and [Nightwatch](http://nightwatchjs.org/) configuration and screenshot comparison. Specifically:\n\n- **Creation of storybook stories**: They are created based on your file system structure\n- **Saucelabs tunnel setup**: Reduce SauceConnect config to the tunnel id and username / accessKey\n- **Screenshot**: Take screenshots of every story on different browsers using SauceLabs and Nightwatch\n- **Image Comparison**: Compare and update screenshots to baselines collocated with your stories.\n\n## ⚙️ Install\n\n1. You will need a SauceLabs account. If you don't have one you can sign up for a trial [here](https://signup.saucelabs.com/signup/trial) or request a free one for open source projects [here](https://saucelabs.com/open-source-request-account).\n1. If you want to run tests against Safari and IE11 from localhost, add `localtest.dev 127.0.0.1` to your `/etc/hosts` (the exact steps may vary depending on your platform, see [here](https://www.howtogeek.com/howto/27350/beginner-geek-how-to-edit-your-hosts-file/) for more details).\n1. Add picturebook and its peer dependencies:\n\n```sh\nyarn add --dev picturebook @storybook/react nightwatch react\n```\n\nIf you don't have Storybook set it up yet, follow [these instructions](https://storybook.js.org/basics/quick-start-guide/) first.\n\nSome of Picturebook utility methods rely on the output of `require.context`. This is a webpack construct and it's not available in Node or test environments. There are multiple ways to mock it. If you are using babel you could add the [require-context-hook](https://github.com/smrq/babel-plugin-require-context-hook) plugin. For instance, if you want to enable it only for tests, you can do something like:\n\n```json\n{\n  \"env\": {\n    \"test\": {\n      \"plugins\": [\"require-context-hook\"]\n    }\n  }\n}\n```\n\nand on your test setup:\n\n```js\nrequire('babel-plugin-require-context-hook/register')()\n```\n\nAlternatively, there's also the [require-context](https://www.npmjs.com/package/require-context) npm package that will also emulate webpack's `require.context`.\n\n## 📚 API\n\n```js\ntype StoryPaths = {|\n  +name: string,\n  +parents: $ReadOnlyArray<string>,\n  +title: string,\n  +path: string,\n  +screenshots: {|\n    +[extension: string]: string,\n  |},\n  +tests: {|\n    +[extension: string]: string,\n  |},\n  +doc: ?string,\n  +url: ?string,\n|}\n\ntype LoadedStory = {|\n  ...$Exact<StoryPaths>,\n  +main: () => React.Node,\n|}\n\ntype Options = {|\n  flattenFolders: $ReadOnlyArray<string>,\n  storiesOf: any,\n  stories: any,\n  baseUrl?: string,\n  decorators: $ReadOnlyArray<Function>,\n  storyFiles: $ReadOnlyArray<string>,\n|}\n\ntype ImgLog = {|\n  +imgFileName: string,\n  +name: string,\n  +platform: string,\n  +browser: string\n|}\n\nfunction getFiles(userOptions: $Shape<Options>): Array<StoryPaths>\n\nfunction loadStories(userOptions: $Shape<Options>): Array<LoadedStory>\n\nfunction nightwatchConfig(params: {\n  desiredCapabilities?: {},     // nightwatch desired capabilities object\n  files: Array<StoryPaths>,     // output of getFiles()\n  username: string,             // SauceLabs username\n  access_key: string,           // SauceLabs accessKey\n  browsers?: {                  // List of browsers to test. Default list\n    [browserName: string]: {    //   includes chrome, firefox, edge, ie11, iphone7\n      desiredCapabilities: {    //   and safari but any valid SauceLabs config is\n        platform: string,       //   valid\n        version: string,\n        browserName: string,\n        screenResolution: string,\n      },\n      custom_vars: {|           // Custom properties required per browser config:\n        name: string,           // Must match \"browserName\"\n        platform: string,       // \"mobile\" | \"desktop\" but any string is allowed\n        extract?: {|            // If cropping the output, specify crop\n          top: number,\n          left: number,\n          width: number,\n          height: number,\n        |},\n      |},\n    },\n  },\n  // Alias for browsers where localhost cannot be accessed from a tunnel,\n  // defaults to \"localtest.dev\"\n  localhostAlias?: string,\n  // List of browsers that can't access localhost from a tunnel, defaults to:\n  // [\"ie11\", \"safari\"]\n  localhostAliasBrowsers?: Array<string>,\n  resultPath?: string,           // Where to output the result file\n  proxy?: {},                    // Nightwatch proxy object\n}): Object\n\nfunction compareImages(params: {\n    screenshots: Array<ImgLog>,  // output of runTests() or runTestsWithTunnel()\n    files: Array<StoryPaths>,    // output of getFiles()\n    root: string,                // base path for the stories\n    threshold?: number,          // max number of different pixels allowed\n    overwrite?: boolean          // update image instead of failing\n  }): Promise<{\n    +name: string,\n    +status: 'CREATED' | 'SUCCESS' | 'FAILED',\n    +error: ?string,\n    +diffPath: ?string,\n    +referencePath: ?string,\n    +screenshotPath: ?string,\n    +diffThreshold: number,\n    +browser: string,\n    +platform: string,\n  }>\n\nfunction runTests(configPath: string): Promise<Array<ImgLog>>\n\nfunction runTestsWithTunnel(tunnelId: string, configPath: string): Promise<Array<ImgLog>>\n```\n\n## 🎪 Sample App\n\nThis project includes a sample app to demo the behavior. You can view it running `yarn start` and opening `localhost:6006` on your browser.\n\nTo run the image comparison tests, keep `yarn start` running and call `SAUCE_ACCESS_KEY={YOUR_ACCESS_KEY} SAUCE_USERNAME={YOUR_USERNAME} yarn test:app`.\n\n## ️✏️ Storybook Usage\n\nTo take advantage of the automated storybook folder config (and testing) modify your storybook `config.js` to look like this:\n\n```js\nimport { storiesOf, configure } from '@storybook/react'\nimport * as picturebook from 'picturebook'\n\nfunction loadStories() {\n  picturebook.loadStories({\n    storiesOf,\n    stories: require.context('../stories', true, /\\.(js|md|png)/),\n  })\n}\n\nconfigure(loadStories, module)\n```\n\nIf you want to see a more advanced use case on how to use it with decorators and other plugins, check out the [sample project](./sampleFolder/.storybook/config.js).\n\n## 📸 Screenshot Usage\n\nTo take screenshots, picturebook relies on nightwatch. With the exception of a few required fields, configuration is generated for you. To take advantage of it you should create a `nightwatch.conf.js` file on your root (or customize it following instructions [here](http://nightwatchjs.org/gettingstarted#settings-file)).\n\n```js\nrequire('babel-register')\n\nconst { resolve } = require('path')\nconst { nightwatchConfig, getFiles } = require('picturebook')\nconst requireContext = require('require-context')\n\nconst config = nightwatchConfig({\n  username: process.env.SAUCE_USERNAME,\n  access_key: process.env.SAUCE_ACCESS_KEY,\n  files: getFiles({\n    baseUrl: 'http://localhost:6006',\n    stories: requireContext(resolve(__dirname, './stories'), true, /\\.js/),\n  }),\n  resultPath: resolve(__dirname, './picturebook-img.log'),\n  desiredCapabilities: {\n    build: 'local',\n    'tunnel-identifier': 'picturebook-sample',\n  },\n})\n\nmodule.exports = config\n```\n\nTo run image comparison, after screenshots have been taken you can call:\n\n```js\ncompareImages({\n  screenshots,\n  root: storyRoot,\n  overwrite: true,\n  files: getFiles({\n    stories: requireContext(storyRoot, true, /\\.(js|png)/),\n  }),\n})\n```\n\nWhere `screenshots` is the output of `runTestsWithTunnel` or `runTests` (if running with or without a tunnel, respectively).\n\n## 🙋 QYMA (Questions you may ask)\n\n### Why do I need to add localtest.dev as a localhost alias?\n\nThis is a SauceLabs issue. To work around it, `safari` and `edge` browsers replace `localhost` from urls to `localtest.dev` as described [here](https://support.saucelabs.com/hc/en-us/articles/225106887-Safari-and-Internet-Explorer-Won-t-Load-Website-When-Using-Sauce-Connect-on-Localhost).\n\nYou can customize the target browsers and localhost alias with the `localhostAliasBrowsers` and `localhostAlias`, respectively.\n\n### How do you skip some files?\n\nPicturebook will only take screenshots of the files you tell it exists. You can filter the output from [require.context](https://webpack.js.org/guides/dependency-management/#require-context) by specifying a different regExp to filter by.\n\n### SauceConnect ENOENT error\n\nIf you see the following error after a couple unsuccessful runs of SauceConnect:\n\n```sh\nevents.js:167\n      throw er; // Unhandled 'error' event\n      ^\n\nError: spawn ~/picturebook/node_modules/node-sauce-connect/lib/sc ENOENT\n```\n\nSometimes it gets stuck. Try cleaning `node_modules` and re-running yarn:\n\n```sh\nrm -rf node_modules\nyarn\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/obartra/picturebook/issues"},"homepage":"https://github.com/obartra/picturebook#readme","_id":"picturebook@2.0.0-beta.2","_npmVersion":"6.1.0","_nodeVersion":"10.6.0","_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"dist":{"integrity":"sha512-p4aP22V8W0sbJ1YT5xiwVGSmBneTwQbuAaKB6m8MOwAh9qVWD6pYQW+S79Rd3sW0Vru/andXASPrxWBvxDBzvw==","shasum":"c2c0b6764e03d217337efa3d19e2f8ce7a8eaadd","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-2.0.0-beta.2.tgz","fileCount":114,"unpackedSize":7144854,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbpAr7CRA9TVsSAnZWagAA7DkP/1Cb42XIIcBGkWDOw4Ih\nuyYzsufybuQp0oIV7NMl8Iu9CEHZpkqWtOI6w14Q9MYpe5QD3BE3z5VOOja0\nbnj1JbW4dxGhuEJg6LQXhQDlZDX4MxC8EoyE5leH0pT5L1wa9mdA71A/E9/t\n08xS56PL/PEEZ7ZoMQeGZeQog+ATuV7xa8xQZ6Tw78H1SWdzwHtcMtDXajTJ\nujnX7W/Xl2wKGt515w+Z5xv5gS+e0eoBYlP33cYsYPirn0cvL6JFEVnpsCDE\n7rrGslLrsnjD0FKm+XDooe0g5jqj51QnU1kboHo8+qqTdGenBLoK8LXB+4KC\nh3vFoRhDruVqgGlLm3VvafWRbbZ9dFCHOGC/f4ox6hFSC/ZeU7T+rvbdqoYG\nA2GSx4jJi5ri/osA29cJZ0W76b5EvIZHcuG6oA1qToehUkFmKFuUWM7U4+dc\nfeXD8jZi7BKV936fF+CTEl4qlurX3FOnBk4ghxbjyYkAEEupQDCzzt/z3gtF\nCN0rIRNFJXdl7ym56DtA0oa5yh8MdDM9YGzWzG7TFfNGpsmahUUfS4Hw4g20\nVVL0pN4xkkfT5NEFbjCy97r1IL2a1UejxV6tpfw2HCduYWaMnEAPXYhqTl5u\nObTNM6rTwTJ8ZDYIREpdZljgfyBV6EmgaZN5r7lxbgEKfr92npfxc+kKMua7\nhSZ9\r\n=aNlm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGUkLguhti2BbYxGr9bi0GP6eNka5uj1EivEVKze7SSVAiEAjXT0UjP66NzdN17Bs5nArxI9dVmZwJqfx+4xjHINiT4="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook_2.0.0-beta.2_1537477371014_0.5954628810373392"},"_hasShrinkwrap":false},"2.0.0-beta.3":{"name":"picturebook","version":"2.0.0-beta.3","description":"Opinionated Storybook Setup","main":"dist/index.js","browser":"dist/picturebook.web.js","repository":{"type":"git","url":"git+https://github.com/obartra/picturebook.git"},"author":{"name":"Oscar Bartra"},"license":"MIT","scripts":{"format":"prettier --write \"{{src,test,sampleFolder}/**/,}*.js\"","test":"jest","lint":"eslint --ext .js --cache .","build":"webpack --mode production --config webpack.build.config.js && babel src -d dist --copy-files","build:watch":"yarn build --watch","test:watch":"yarn test --watch","start":"yarn && yarn build && cd sampleFolder && yarn && yarn start","test:app":"cd sampleFolder && yarn test --env chrome,firefox,ie11,edge,safari,iphone7","ci":"yarn lint && yarn flow && yarn test"},"dependencies":{"fs-extra":"7.0.0","lodash":"4.17.10","node-sauce-connect":"4.5.0","pixelmatch":"4.0.2","pngjs":"3.3.3","rimraf":"2.6.2","selenium-download":"2.0.13","selenium-server-standalone-jar":"3.13.0"},"devDependencies":{"@storybook/react":"3.4.10","babel-cli":"6.26.0","babel-core":"6.26.3","babel-eslint":"8.2.6","babel-loader":"7.1.5","babel-plugin-require-context-hook":"1.0.0","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-flow-strip-types":"6.22.0","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.7.0","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","clean-webpack-plugin":"0.1.19","eslint":"5.4.0","eslint-config-airbnb":"17.1.0","eslint-config-prettier":"3.0.1","eslint-plugin-flowtype":"2.50.0","eslint-plugin-import":"2.14.0","eslint-plugin-jest":"21.22.0","eslint-plugin-jsx-a11y":"6.1.1","eslint-plugin-prettier":"2.6.2","eslint-plugin-promise":"4.0.0","eslint-plugin-react":"7.11.1","flow-bin":"0.79.1","jest":"23.5.0","png-crop":"0.0.2","prettier":"1.14.2","react":"16.4.2","react-dom":"16.4.2","webpack":"4.17.1","webpack-cli":"3.1.0"},"peerDependencies":{"@storybook/react":">= 3.x","nightwatch":">=0.9.x","react":">= 15.x","react-dom":">= 15.x"},"readme":"# 🤖📗 PictureBook\n\nAutomated React Storybook Setup\n\nSimplify React Storybook story creation and cross-browser image comparison testing\n\n## 💡 Rationale\n\nSetting up storybook and implement cross-browser image comparison testing on multiple projects is time consuming.\n\nInstead of providing a wrapper on top of existing projects that will fall out of date, Picturebook lets you retain control of the Storybook and Nightwatch packages.\n\nThis project aims to provide utility methods to simplify [Storybook](https://storybook.js.org/), [SauceLabs](https://saucelabs.com/) and [Nightwatch](http://nightwatchjs.org/) configuration and screenshot comparison. Specifically:\n\n- **Creation of storybook stories**: They are created based on your file system structure\n- **Saucelabs tunnel setup**: Reduce SauceConnect config to the tunnel id and username / accessKey\n- **Screenshot**: Take screenshots of every story on different browsers using SauceLabs and Nightwatch\n- **Image Comparison**: Compare and update screenshots to baselines collocated with your stories.\n\n## ⚙️ Install\n\n1. You will need a SauceLabs account. If you don't have one you can sign up for a trial [here](https://signup.saucelabs.com/signup/trial) or request a free one for open source projects [here](https://saucelabs.com/open-source-request-account).\n1. If you want to run tests against Safari and IE11 from localhost, add `localtest.dev 127.0.0.1` to your `/etc/hosts` (the exact steps may vary depending on your platform, see [here](https://www.howtogeek.com/howto/27350/beginner-geek-how-to-edit-your-hosts-file/) for more details).\n1. Add picturebook and its peer dependencies:\n\n```sh\nyarn add --dev picturebook @storybook/react nightwatch react\n```\n\nIf you don't have Storybook set it up yet, follow [these instructions](https://storybook.js.org/basics/quick-start-guide/) first.\n\nSome of Picturebook utility methods rely on the output of `require.context`. This is a webpack construct and it's not available in Node or test environments. There are multiple ways to mock it. If you are using babel you could add the [require-context-hook](https://github.com/smrq/babel-plugin-require-context-hook) plugin. For instance, if you want to enable it only for tests, you can do something like:\n\n```json\n{\n  \"env\": {\n    \"test\": {\n      \"plugins\": [\"require-context-hook\"]\n    }\n  }\n}\n```\n\nand on your test setup:\n\n```js\nrequire('babel-plugin-require-context-hook/register')()\n```\n\nAlternatively, there's also the [require-context](https://www.npmjs.com/package/require-context) npm package that will also emulate webpack's `require.context`.\n\n## 📚 API\n\n```js\ntype StoryPaths = {|\n  +name: string,\n  +parents: $ReadOnlyArray<string>,\n  +title: string,\n  +path: string,\n  +screenshots: {|\n    +[extension: string]: string,\n  |},\n  +tests: {|\n    +[extension: string]: string,\n  |},\n  +doc: ?string,\n  +url: ?string,\n|}\n\ntype LoadedStory = {|\n  ...$Exact<StoryPaths>,\n  +main: () => React.Node,\n|}\n\ntype Options = {|\n  flattenFolders: $ReadOnlyArray<string>,\n  storiesOf: any,\n  stories: any,\n  baseUrl?: string,\n  decorators: $ReadOnlyArray<Function>,\n  storyFiles: $ReadOnlyArray<string>,\n|}\n\ntype ImgLog = {|\n  +imgFileName: string,\n  +name: string,\n  +platform: string,\n  +browser: string\n|}\n\nfunction getFiles(userOptions: $Shape<Options>): Array<StoryPaths>\n\nfunction loadStories(userOptions: $Shape<Options>): Array<LoadedStory>\n\nfunction nightwatchConfig(params: {\n  desiredCapabilities?: {},     // nightwatch desired capabilities object\n  files: Array<StoryPaths>,     // output of getFiles()\n  username: string,             // SauceLabs username\n  access_key: string,           // SauceLabs accessKey\n  browsers?: {                  // List of browsers to test. Default list\n    [browserName: string]: {    //   includes chrome, firefox, edge, ie11, iphone7\n      desiredCapabilities: {    //   and safari but any valid SauceLabs config is\n        platform: string,       //   valid\n        version: string,\n        browserName: string,\n        screenResolution: string,\n      },\n      custom_vars: {|           // Custom properties required per browser config:\n        name: string,           // Must match \"browserName\"\n        platform: string,       // \"mobile\" | \"desktop\" but any string is allowed\n        extract?: {|            // If cropping the output, specify crop\n          top: number,\n          left: number,\n          width: number,\n          height: number,\n        |},\n      |},\n    },\n  },\n  // Alias for browsers where localhost cannot be accessed from a tunnel,\n  // defaults to \"localtest.dev\"\n  localhostAlias?: string,\n  // List of browsers that can't access localhost from a tunnel, defaults to:\n  // [\"ie11\", \"safari\"]\n  localhostAliasBrowsers?: Array<string>,\n  resultPath?: string,           // Where to output the result file\n  proxy?: {},                    // Nightwatch proxy object\n}): Object\n\nfunction compareImages(params: {\n    screenshots: Array<ImgLog>,  // output of runTests() or runTestsWithTunnel()\n    files: Array<StoryPaths>,    // output of getFiles()\n    root: string,                // base path for the stories\n    threshold?: number,          // max number of different pixels allowed\n    overwrite?: boolean          // update image instead of failing\n  }): Promise<{\n    +name: string,\n    +status: 'CREATED' | 'SUCCESS' | 'FAILED',\n    +error: ?string,\n    +diffPath: ?string,\n    +referencePath: ?string,\n    +screenshotPath: ?string,\n    +diffThreshold: number,\n    +browser: string,\n    +platform: string,\n  }>\n\nfunction runTests(configPath: string): Promise<Array<ImgLog>>\n\nfunction runTestsWithTunnel(tunnelId: string, configPath: string): Promise<Array<ImgLog>>\n```\n\n## 🎪 Sample App\n\nThis project includes a sample app to demo the behavior. You can view it running `yarn start` and opening `localhost:6006` on your browser.\n\nTo run the image comparison tests, keep `yarn start` running and call `SAUCE_ACCESS_KEY={YOUR_ACCESS_KEY} SAUCE_USERNAME={YOUR_USERNAME} yarn test:app`.\n\n## ️✏️ Storybook Usage\n\nTo take advantage of the automated storybook folder config (and testing) modify your storybook `config.js` to look like this:\n\n```js\nimport { storiesOf, configure } from '@storybook/react'\nimport * as picturebook from 'picturebook'\n\nfunction loadStories() {\n  picturebook.loadStories({\n    storiesOf,\n    stories: require.context('../stories', true, /\\.(js|md|png)/),\n  })\n}\n\nconfigure(loadStories, module)\n```\n\nIf you want to see a more advanced use case on how to use it with decorators and other plugins, check out the [sample project](./sampleFolder/.storybook/config.js).\n\n## 📸 Screenshot Usage\n\nTo take screenshots, picturebook relies on nightwatch. With the exception of a few required fields, configuration is generated for you. To take advantage of it you should create a `nightwatch.conf.js` file on your root (or customize it following instructions [here](http://nightwatchjs.org/gettingstarted#settings-file)).\n\n```js\nrequire('babel-register')\n\nconst { resolve } = require('path')\nconst { nightwatchConfig, getFiles } = require('picturebook')\nconst requireContext = require('require-context')\n\nconst config = nightwatchConfig({\n  username: process.env.SAUCE_USERNAME,\n  access_key: process.env.SAUCE_ACCESS_KEY,\n  files: getFiles({\n    baseUrl: 'http://localhost:6006',\n    stories: requireContext(resolve(__dirname, './stories'), true, /\\.js/),\n  }),\n  resultPath: resolve(__dirname, './picturebook-img.log'),\n  desiredCapabilities: {\n    build: 'local',\n    'tunnel-identifier': 'picturebook-sample',\n  },\n})\n\nmodule.exports = config\n```\n\nTo run image comparison, after screenshots have been taken you can call:\n\n```js\ncompareImages({\n  screenshots,\n  root: storyRoot,\n  overwrite: true,\n  files: getFiles({\n    stories: requireContext(storyRoot, true, /\\.(js|png)/),\n  }),\n})\n```\n\nWhere `screenshots` is the output of `runTestsWithTunnel` or `runTests` (if running with or without a tunnel, respectively).\n\n## 🙋 QYMA (Questions you may ask)\n\n### Why do I need to add localtest.dev as a localhost alias?\n\nThis is a SauceLabs issue. To work around it, `safari` and `edge` browsers replace `localhost` from urls to `localtest.dev` as described [here](https://support.saucelabs.com/hc/en-us/articles/225106887-Safari-and-Internet-Explorer-Won-t-Load-Website-When-Using-Sauce-Connect-on-Localhost).\n\nYou can customize the target browsers and localhost alias with the `localhostAliasBrowsers` and `localhostAlias`, respectively.\n\n### How do you skip some files?\n\nPicturebook will only take screenshots of the files you tell it exists. You can filter the output from [require.context](https://webpack.js.org/guides/dependency-management/#require-context) by specifying a different regExp to filter by.\n\n### SauceConnect ENOENT error\n\nIf you see the following error after a couple unsuccessful runs of SauceConnect:\n\n```sh\nevents.js:167\n      throw er; // Unhandled 'error' event\n      ^\n\nError: spawn ~/picturebook/node_modules/node-sauce-connect/lib/sc ENOENT\n```\n\nSometimes it gets stuck. Try cleaning `node_modules` and re-running yarn:\n\n```sh\nrm -rf node_modules\nyarn\n```\n","readmeFilename":"README.md","gitHead":"27b9ac222d4b5334a4cc25b5c55f07e18eda4b26","bugs":{"url":"https://github.com/obartra/picturebook/issues"},"homepage":"https://github.com/obartra/picturebook#readme","_id":"picturebook@2.0.0-beta.3","_npmVersion":"6.1.0","_nodeVersion":"10.6.0","_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"dist":{"integrity":"sha512-D1oCT8ZFouK5WLFD9mA4PuwxbRqjHj7O9BYIMwWGNATus0i5M9qygaBtR4QxKXsEdkG/i5VECTXi5KCaP64azw==","shasum":"2b75fb18d4fd39268f7d01f1ff3ead403284945c","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-2.0.0-beta.3.tgz","fileCount":171,"unpackedSize":4864601,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbpCFkCRA9TVsSAnZWagAAnBYP/1EBPe2+p6Csc+4534AG\n0nnm17SMJenjeOKFXa0yzr1L+jTUEnZkGoSzEI7fkD+Lrw5G1NwBy47Ehv7+\nowsIb1m6OlIzaq0Lh5aZf3Ue1CiVMN+zCou7T243oECMyp5z2fHXEI2DFiwk\nR0+nKSdFxB8p7cBwUKXkUqsF+1CuL1ks/zIyxCQIVz6hgh5FmF5DSgTJQ+F3\nOPMCeItAbx8w2fkBacJQLBKFN2510L1yQe9gIDvvjOvcH1VIYNSONa0OwxNd\n94zKW9itSgv+btLlUJsUYP6u77ttUh2z6apwuDFbfh0pfd8THpIuDmFF9RQg\ns57rS/i1huX+/v0paB1fVIWfu2HM6g1dAWpBbmx3pkv/1raBpSNOyiqCZP5m\nAs2umUsT6n/So6ccrWomUqHhU4MsXFI8oPc760P1GRWOIFb8VJ3SSS+Z0xlL\nXJhE0bytD6SWcWWLD+y+rN0bIMHAbQIvrGJErZr7j9MuN//OP3DmjNgIMdh+\nsoNOZjDNQE/QC17NDSkZAEPX+38YglTCIiEUEd19+Of8XrMh1Lm1LqM1j3OC\nnfToFveS3pvtoT7QtJ8hOWdg89u3NOjhe0BpIjRZPjWiIpAJcyMcu0wbYEob\nfgutS/lAdlorJz/1s0q8zKGapJf66BHYOxeEf8Zap93X9IotLghG5oY8OSd6\nJ1Sc\r\n=QMxU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDsxu+r2TyldLuF0ix8wzGcHwe2D46h7SOJGr2D64DfUAiBjQksHXTDCeS6Dce8qpdZEdIP7TKTGbGcYqc8hSwiK+Q=="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook_2.0.0-beta.3_1537483107482_0.1364408868842235"},"_hasShrinkwrap":false},"2.0.0-beta.4":{"name":"picturebook","version":"2.0.0-beta.4","description":"Opinionated Storybook Setup","main":"dist/index.js","browser":"dist/picturebook.web.js","repository":{"type":"git","url":"git+https://github.com/obartra/picturebook.git"},"author":{"name":"Oscar Bartra"},"license":"MIT","scripts":{"format":"prettier --write \"{{src,test,sampleFolder}/**/,}*.js\"","test":"jest","lint":"eslint --ext .js --cache .","build":"webpack --mode production --config webpack.build.config.js && babel src -d dist --copy-files","build:watch":"yarn build --watch","test:watch":"yarn test --watch","start":"yarn && yarn build && cd sampleFolder && yarn && yarn start","test:app":"cd sampleFolder && yarn test --env chrome,firefox,ie11,edge,safari,iphone7","ci":"yarn lint && yarn flow && yarn test"},"dependencies":{"fs-extra":"7.0.0","lodash":"4.17.10","node-sauce-connect":"4.5.0","pixelmatch":"4.0.2","pngjs":"3.3.3","png-crop":"0.0.2","rimraf":"2.6.2","selenium-download":"2.0.13","selenium-server-standalone-jar":"3.13.0"},"devDependencies":{"@storybook/react":"3.4.10","babel-cli":"6.26.0","babel-core":"6.26.3","babel-eslint":"8.2.6","babel-loader":"7.1.5","babel-plugin-require-context-hook":"1.0.0","babel-plugin-transform-class-properties":"6.24.1","babel-plugin-transform-flow-strip-types":"6.22.0","babel-plugin-transform-object-rest-spread":"6.26.0","babel-preset-env":"1.7.0","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","clean-webpack-plugin":"0.1.19","eslint":"5.4.0","eslint-config-airbnb":"17.1.0","eslint-config-prettier":"3.0.1","eslint-plugin-flowtype":"2.50.0","eslint-plugin-import":"2.14.0","eslint-plugin-jest":"21.22.0","eslint-plugin-jsx-a11y":"6.1.1","eslint-plugin-prettier":"2.6.2","eslint-plugin-promise":"4.0.0","eslint-plugin-react":"7.11.1","flow-bin":"0.79.1","jest":"23.5.0","prettier":"1.14.2","react":"16.4.2","react-dom":"16.4.2","webpack":"4.17.1","webpack-cli":"3.1.0"},"peerDependencies":{"@storybook/react":">= 3.x","nightwatch":">=0.9.x","react":">= 15.x","react-dom":">= 15.x"},"readme":"# 🤖📗 PictureBook\n\nAutomated React Storybook Setup\n\nSimplify React Storybook story creation and cross-browser image comparison testing\n\n## 💡 Rationale\n\nSetting up storybook and implement cross-browser image comparison testing on multiple projects is time consuming.\n\nInstead of providing a wrapper on top of existing projects that will fall out of date, Picturebook lets you retain control of the Storybook and Nightwatch packages.\n\nThis project aims to provide utility methods to simplify [Storybook](https://storybook.js.org/), [SauceLabs](https://saucelabs.com/) and [Nightwatch](http://nightwatchjs.org/) configuration and screenshot comparison. Specifically:\n\n- **Creation of storybook stories**: They are created based on your file system structure\n- **Saucelabs tunnel setup**: Reduce SauceConnect config to the tunnel id and username / accessKey\n- **Screenshot**: Take screenshots of every story on different browsers using SauceLabs and Nightwatch\n- **Image Comparison**: Compare and update screenshots to baselines collocated with your stories.\n\n## ⚙️ Install\n\n1. You will need a SauceLabs account. If you don't have one you can sign up for a trial [here](https://signup.saucelabs.com/signup/trial) or request a free one for open source projects [here](https://saucelabs.com/open-source-request-account).\n1. If you want to run tests against Safari and IE11 from localhost, add `localtest.dev 127.0.0.1` to your `/etc/hosts` (the exact steps may vary depending on your platform, see [here](https://www.howtogeek.com/howto/27350/beginner-geek-how-to-edit-your-hosts-file/) for more details).\n1. Add picturebook and its peer dependencies:\n\n```sh\nyarn add --dev picturebook @storybook/react nightwatch react\n```\n\nIf you don't have Storybook set it up yet, follow [these instructions](https://storybook.js.org/basics/quick-start-guide/) first.\n\nSome of Picturebook utility methods rely on the output of `require.context`. This is a webpack construct and it's not available in Node or test environments. There are multiple ways to mock it. If you are using babel you could add the [require-context-hook](https://github.com/smrq/babel-plugin-require-context-hook) plugin. For instance, if you want to enable it only for tests, you can do something like:\n\n```json\n{\n  \"env\": {\n    \"test\": {\n      \"plugins\": [\"require-context-hook\"]\n    }\n  }\n}\n```\n\nand on your test setup:\n\n```js\nrequire('babel-plugin-require-context-hook/register')()\n```\n\nAlternatively, there's also the [require-context](https://www.npmjs.com/package/require-context) npm package that will also emulate webpack's `require.context`.\n\n## 📚 API\n\n```js\ntype StoryPaths = {|\n  +name: string,\n  +parents: $ReadOnlyArray<string>,\n  +title: string,\n  +path: string,\n  +screenshots: {|\n    +[extension: string]: string,\n  |},\n  +tests: {|\n    +[extension: string]: string,\n  |},\n  +doc: ?string,\n  +url: ?string,\n|}\n\ntype LoadedStory = {|\n  ...$Exact<StoryPaths>,\n  +main: () => React.Node,\n|}\n\ntype Options = {|\n  flattenFolders: $ReadOnlyArray<string>,\n  storiesOf: any,\n  stories: any,\n  baseUrl?: string,\n  decorators: $ReadOnlyArray<Function>,\n  storyFiles: $ReadOnlyArray<string>,\n|}\n\ntype ImgLog = {|\n  +imgFileName: string,\n  +name: string,\n  +platform: string,\n  +browser: string\n|}\n\nfunction getFiles(userOptions: $Shape<Options>): Array<StoryPaths>\n\nfunction loadStories(userOptions: $Shape<Options>): Array<LoadedStory>\n\nfunction nightwatchConfig(params: {\n  desiredCapabilities?: {},     // nightwatch desired capabilities object\n  files: Array<StoryPaths>,     // output of getFiles()\n  username: string,             // SauceLabs username\n  access_key: string,           // SauceLabs accessKey\n  browsers?: {                  // List of browsers to test. Default list\n    [browserName: string]: {    //   includes chrome, firefox, edge, ie11, iphone7\n      desiredCapabilities: {    //   and safari but any valid SauceLabs config is\n        platform: string,       //   valid\n        version: string,\n        browserName: string,\n        screenResolution: string,\n      },\n      custom_vars: {|           // Custom properties required per browser config:\n        name: string,           // Must match \"browserName\"\n        platform: string,       // \"mobile\" | \"desktop\" but any string is allowed\n        extract?: {|            // If cropping the output, specify crop\n          top: number,\n          left: number,\n          width: number,\n          height: number,\n        |},\n      |},\n    },\n  },\n  // Alias for browsers where localhost cannot be accessed from a tunnel,\n  // defaults to \"localtest.dev\"\n  localhostAlias?: string,\n  // List of browsers that can't access localhost from a tunnel, defaults to:\n  // [\"ie11\", \"safari\"]\n  localhostAliasBrowsers?: Array<string>,\n  resultPath?: string,           // Where to output the result file\n  proxy?: {},                    // Nightwatch proxy object\n}): Object\n\nfunction compareImages(params: {\n    screenshots: Array<ImgLog>,  // output of runTests() or runTestsWithTunnel()\n    files: Array<StoryPaths>,    // output of getFiles()\n    root: string,                // base path for the stories\n    threshold?: number,          // max number of different pixels allowed\n    overwrite?: boolean          // update image instead of failing\n  }): Promise<{\n    +name: string,\n    +status: 'CREATED' | 'SUCCESS' | 'FAILED',\n    +error: ?string,\n    +diffPath: ?string,\n    +referencePath: ?string,\n    +screenshotPath: ?string,\n    +diffThreshold: number,\n    +browser: string,\n    +platform: string,\n  }>\n\nfunction runTests(configPath: string): Promise<Array<ImgLog>>\n\nfunction runTestsWithTunnel(tunnelId: string, configPath: string): Promise<Array<ImgLog>>\n```\n\n## 🎪 Sample App\n\nThis project includes a sample app to demo the behavior. You can view it running `yarn start` and opening `localhost:6006` on your browser.\n\nTo run the image comparison tests, keep `yarn start` running and call `SAUCE_ACCESS_KEY={YOUR_ACCESS_KEY} SAUCE_USERNAME={YOUR_USERNAME} yarn test:app`.\n\n## ️✏️ Storybook Usage\n\nTo take advantage of the automated storybook folder config (and testing) modify your storybook `config.js` to look like this:\n\n```js\nimport { storiesOf, configure } from '@storybook/react'\nimport * as picturebook from 'picturebook'\n\nfunction loadStories() {\n  picturebook.loadStories({\n    storiesOf,\n    stories: require.context('../stories', true, /\\.(js|md|png)/),\n  })\n}\n\nconfigure(loadStories, module)\n```\n\nIf you want to see a more advanced use case on how to use it with decorators and other plugins, check out the [sample project](./sampleFolder/.storybook/config.js).\n\n## 📸 Screenshot Usage\n\nTo take screenshots, picturebook relies on nightwatch. With the exception of a few required fields, configuration is generated for you. To take advantage of it you should create a `nightwatch.conf.js` file on your root (or customize it following instructions [here](http://nightwatchjs.org/gettingstarted#settings-file)).\n\n```js\nrequire('babel-register')\n\nconst { resolve } = require('path')\nconst { nightwatchConfig, getFiles } = require('picturebook')\nconst requireContext = require('require-context')\n\nconst config = nightwatchConfig({\n  username: process.env.SAUCE_USERNAME,\n  access_key: process.env.SAUCE_ACCESS_KEY,\n  files: getFiles({\n    baseUrl: 'http://localhost:6006',\n    stories: requireContext(resolve(__dirname, './stories'), true, /\\.js/),\n  }),\n  resultPath: resolve(__dirname, './picturebook-img.log'),\n  desiredCapabilities: {\n    build: 'local',\n    'tunnel-identifier': 'picturebook-sample',\n  },\n})\n\nmodule.exports = config\n```\n\nTo run image comparison, after screenshots have been taken you can call:\n\n```js\ncompareImages({\n  screenshots,\n  root: storyRoot,\n  overwrite: true,\n  files: getFiles({\n    stories: requireContext(storyRoot, true, /\\.(js|png)/),\n  }),\n})\n```\n\nWhere `screenshots` is the output of `runTestsWithTunnel` or `runTests` (if running with or without a tunnel, respectively).\n\n## 🙋 QYMA (Questions you may ask)\n\n### Why do I need to add localtest.dev as a localhost alias?\n\nThis is a SauceLabs issue. To work around it, `safari` and `edge` browsers replace `localhost` from urls to `localtest.dev` as described [here](https://support.saucelabs.com/hc/en-us/articles/225106887-Safari-and-Internet-Explorer-Won-t-Load-Website-When-Using-Sauce-Connect-on-Localhost).\n\nYou can customize the target browsers and localhost alias with the `localhostAliasBrowsers` and `localhostAlias`, respectively.\n\n### How do you skip some files?\n\nPicturebook will only take screenshots of the files you tell it exists. You can filter the output from [require.context](https://webpack.js.org/guides/dependency-management/#require-context) by specifying a different regExp to filter by.\n\n### SauceConnect ENOENT error\n\nIf you see the following error after a couple unsuccessful runs of SauceConnect:\n\n```sh\nevents.js:167\n      throw er; // Unhandled 'error' event\n      ^\n\nError: spawn ~/picturebook/node_modules/node-sauce-connect/lib/sc ENOENT\n```\n\nSometimes it gets stuck. Try cleaning `node_modules` and re-running yarn:\n\n```sh\nrm -rf node_modules\nyarn\n```\n","readmeFilename":"README.md","gitHead":"27b9ac222d4b5334a4cc25b5c55f07e18eda4b26","bugs":{"url":"https://github.com/obartra/picturebook/issues"},"homepage":"https://github.com/obartra/picturebook#readme","_id":"picturebook@2.0.0-beta.4","_npmVersion":"6.1.0","_nodeVersion":"10.6.0","_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"dist":{"integrity":"sha512-LbBAllNvjfQheZQkA7BytMVFjEKD1PbpUWzOVjAEvNqNZq2UnOk6TcKPpu5GevtMqgGXYnq1DWAKOwNaIWruYA==","shasum":"278df1afa6f8c2caeccaeaa5426ebe5918a8083a","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-2.0.0-beta.4.tgz","fileCount":171,"unpackedSize":4864312,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbpCn6CRA9TVsSAnZWagAAnR8P/398icec2sg7EoHP2Jix\nKoO4elEUgraIC/9Pa13mCcKXuG1UlNDYGyTvZxqcrWX1QhREMGst/AycWdUs\nmsFNPgse+Pwx1K8MomQ9j7kPihxNgs4ei/5zwtj8S4qUPtho6La7NjRy3zYN\n5N1LNDmPd8EyHe4hMcO9D/KCuGAUmSZhnR6w3H3Zou63bjhMctceq58q0vvO\nyEjxB58ydgJvzDLS2EW9Jru92sjYmCqQNdAXKO5KXFrNWlfvTCG9zs8y39Gi\n4X3yseTCwmUmC9tv2SrTHb5YthpqEB76uq4qxBrcijHzHJeYJsk1Rktivhga\nFP/MgNZNmk3MT/C3Rt9Ge7A4esZrHvZR3hvt5Hr8wqhS80TLcKX8qEFdHZw0\nm6WEUTnGJ6T2EQd/GxbKACGS4iyE5oRgZZfp5j4cWCVpHk2auOFKSfWJLWl3\nS2G2wgUhiNQROtMDy+M1xt14eV8AJSerlXTXYZooTNPZXCN5as63VQeWy6Kf\n2ir4CYse0lKis/yW90zMusCIUrMlY0zyTb+9bQocEUkO6G1LitlbEmOZgF/g\nRKaIsPunu2eFgyimr76bFQNLXHvu9fi3Kq+dKWSIiqleA5exC8b0CaDouixS\nUPl23hetTFZSM4Q1Qk43fKAHVRBVq6ljrx6xkJit1bXQY98hR/Rxk+NBv6Ey\ncwFk\r\n=lnQ5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGUYFEd7iHVYao7vRAcxEs4kTZOdp3n21xGxgaNnutAhAiBhKvSO6CwsHLDo4Zou8Kak5NEh8rajNeI79bfK4TwxHQ=="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook_2.0.0-beta.4_1537485305789_0.5015870978792831"},"_hasShrinkwrap":false},"2.0.0-beta.5":{"name":"picturebook","version":"2.0.0-beta.5","description":"Opinionated Storybook Setup","main":"dist/index.js","browser":"dist/picturebook.web.js","repository":{"type":"git","url":"git+https://github.com/obartra/picturebook.git"},"author":{"name":"Oscar Bartra"},"license":"MIT","scripts":{"format":"prettier --write \"{{src,test,sampleFolder}/**/,}*.js\"","test":"jest","lint":"eslint --ext .js --cache .","build":"webpack --mode production --config webpack.build.config.js && babel src -d dist --copy-files","build:watch":"yarn build --watch","test:watch":"yarn test --watch","start":"yarn && yarn build && cd sampleFolder && yarn && yarn start","test:app":"cd sampleFolder && yarn test --env chrome,firefox,ie11,edge,safari,iphone7","ci":"yarn lint && yarn flow && yarn test"},"dependencies":{"fs-extra":"7.0.0","lodash":"4.17.10","node-sauce-connect":"4.5.0","pixelmatch":"4.0.2","png-crop":"0.0.2","pngjs":"3.3.3","rimraf":"2.6.2","selenium-download":"2.0.13","selenium-server-standalone-jar":"3.13.0"},"devDependencies":{"@babel/plugin-transform-regenerator":"7.0.0","@storybook/react":"3.4.10","babel-cli":"6.26.0","babel-core":"6.26.3","babel-eslint":"8.2.6","babel-loader":"7.1.5","babel-plugin-require-context-hook":"1.0.0","babel-plugin-transform-flow-strip-types":"6.22.0","babel-plugin-transform-object-rest-spread":"6.26.0","babel-polyfill":"6.26.0","babel-preset-env":"1.7.0","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","clean-webpack-plugin":"0.1.19","eslint":"5.4.0","eslint-config-airbnb":"17.1.0","eslint-config-prettier":"3.0.1","eslint-plugin-flowtype":"2.50.0","eslint-plugin-import":"2.14.0","eslint-plugin-jest":"21.22.0","eslint-plugin-jsx-a11y":"6.1.1","eslint-plugin-prettier":"2.6.2","eslint-plugin-promise":"4.0.0","eslint-plugin-react":"7.11.1","flow-bin":"0.79.1","jest":"23.5.0","prettier":"1.14.2","react":"16.4.2","react-dom":"16.4.2","webpack":"4.17.1","webpack-cli":"3.1.0"},"peerDependencies":{"nightwatch":">=0.9.x","react":">= 15.x","react-dom":">= 15.x"},"readme":"# 🤖📗 PictureBook\n\nAutomated React Storybook Setup\n\nSimplify React Storybook story creation and cross-browser image comparison testing\n\n## 💡 Rationale\n\nSetting up storybook and implement cross-browser image comparison testing on multiple projects is time consuming.\n\nInstead of providing a wrapper on top of existing projects that will fall out of date, Picturebook lets you retain control of the Storybook and Nightwatch packages.\n\nThis project aims to provide utility methods to simplify [Storybook](https://storybook.js.org/), [SauceLabs](https://saucelabs.com/) and [Nightwatch](http://nightwatchjs.org/) configuration and screenshot comparison. Specifically:\n\n- **Creation of storybook stories**: They are created based on your file system structure\n- **Saucelabs tunnel setup**: Reduce SauceConnect config to the tunnel id and username / accessKey\n- **Screenshot**: Take screenshots of every story on different browsers using SauceLabs and Nightwatch\n- **Image Comparison**: Compare and update screenshots to baselines collocated with your stories.\n\n## ⚙️ Install\n\n1. You will need a SauceLabs account. If you don't have one you can sign up for a trial [here](https://signup.saucelabs.com/signup/trial) or request a free one for open source projects [here](https://saucelabs.com/open-source-request-account).\n1. If you want to run tests against Safari and IE11 from localhost, add `localtest.dev 127.0.0.1` to your `/etc/hosts` (the exact steps may vary depending on your platform, see [here](https://www.howtogeek.com/howto/27350/beginner-geek-how-to-edit-your-hosts-file/) for more details).\n1. Add picturebook and its peer dependencies:\n\n```sh\nyarn add --dev picturebook @storybook/react nightwatch react\n```\n\nIf you don't have Storybook set it up yet, follow [these instructions](https://storybook.js.org/basics/quick-start-guide/) first.\n\nSome of Picturebook utility methods rely on the output of `require.context`. This is a webpack construct and it's not available in Node or test environments. There are multiple ways to mock it. If you are using babel you could add the [require-context-hook](https://github.com/smrq/babel-plugin-require-context-hook) plugin. For instance, if you want to enable it only for tests, you can do something like:\n\n```json\n{\n  \"env\": {\n    \"test\": {\n      \"plugins\": [\"require-context-hook\"]\n    }\n  }\n}\n```\n\nand on your test setup:\n\n```js\nrequire('babel-plugin-require-context-hook/register')()\n```\n\nAlternatively, there's also the [require-context](https://www.npmjs.com/package/require-context) npm package that will also emulate webpack's `require.context`.\n\n## 📚 API\n\nThe API can be split into 2 sections, storybook creation for finding files in the file system and creating storybook stories around them and storybook testing, to connect to SauceLabs and run cross-browser image comparison tests.\n\n### Storybook creation\n\n`getFiles` and `loadStories` have very similar APIs and output.\n\n`getFiles` allows you to retrieve a list of related files. For instance if you have:\n\n```sh\nfile1.js\nfile1.md\nfile2.png\nfile2.js\n```\n\nIt will provide an array of 2 elements (file1 and file2) with the different related files grouped.\n\nThese values are used to identify helper files for stories where `*.md` is understood to be documentation,`.*(spec|test).js` is a test file and an unprefixed `*.js` file is a story. The `flattenFolders` parameters allow grouping nested folders as well. For instance if `flattenFolders: ['a']` `file1.js` and `a/file1.png` will be grouped together.\n\n`loadStories` provide the same functionality than `getFiles` but it also loads and creates storybook stories. This is why it requires storybook's [storiesOf](https://storybook.js.org/basics/writing-stories/#writing-stories) method as a parameter. The response is also similar but it includes a `main` method with the loaded story.\n\nYou can find the exact APIs below:\n\n```js\ntype Options = {|\n  baseUrl?: string,              // The url for the story, defaults to:\n                                 //   'http://localhost:6006'\n  flattenFolders?: Array<string> // Folders to flatten\n                                 //   defaults to ['__snapshots__', '__screenshots__']\n  stories: any,                  // Output of require context with the stories\n|}\n\ntype StoryPaths = {|\n  name: string,\n  parents: $ReadOnlyArray<string>,\n  title: string,\n  path: string,\n  screenshots: {|\n    [extension: string]: string,\n  |},\n  tests: {|\n    [extension: string]: string,\n  |},\n  doc: ?string,\n  url: ?string,\n|}\n\n// Retrieve and group the different stories based on their filenames\nfunction getFiles(options: Options): Array<StoryPaths>\n\n// Retrieve, group, load and create stories\nfunction loadStories(options: Options & {|\n  decorators: $ReadOnlyArray<Function>,\n  storiesOf: any,\n  storyFiles: $ReadOnlyArray<string>,\n|}): Array<StoryPaths & {|\n  main: () => React.Node,\n|}>\n```\n\n### Storybook testing\n\nOnce stories are loaded, `runTests` will connect to SauceLabs (optionally through a SauceConnect tunnel) and return a Promise that includes the results of the test.\n\nSince it uses `nightwatch` under the hood, you must have a valid nightwatch instance running. To assist with it, `nightwatchConfig` provides defaultValues\n\n```js\n// Invoke nightwatch and run image comparison in SauceLabs\nfunction runTests(options: {|\n  configPath: string,           // absolute path to nightwatch config\n  files: Array<StoryPaths>,     // output of getFiles()\n  overwrite: boolean,           // true to replace failing or missing images\n  storyRoot: string,            // absolute path to the stories\n  tunnelId?: string,            // if set, it will set up a SC tunnel with the id\n|}): Promise<Array<{|\n  browser: string,\n  diffPath: ?string,\n  diffThreshold: number,\n  error: ?string,\n  name: string,\n  platform: string,\n  referencePath: ?string,\n  screenshotPath: ?string,\n  status: 'CREATED' | 'SUCCESS' | 'FAILED',\n|}>>\n\n// Nightwatch config generation helper\nfunction nightwatchConfig(options: {|\n  desiredCapabilities?: {},     // nightwatch desired capabilities object\n  files: Array<StoryPaths>,     // output of getFiles()\n  username: string,             // SauceLabs username\n  access_key: string,           // SauceLabs accessKey\n  browsers?: {                  // List of browsers to test. Default list\n                                //   includes chrome, firefox, edge, ie11,\n                                //   iphone7 and safari but any valid SauceLabs\n                                //   config is valid\n    [browserName: string]: {\n      desiredCapabilities: {\n        platform: string,\n        version: string,\n        browserName: string,\n        screenResolution: string,\n      },\n      custom_vars: {|           // Custom properties required per browser config:\n        name: string,           // Must match \"browserName\"\n        platform: string,       // \"mobile\" | \"desktop\" but any string is allowed\n        extract?: {|            // If cropping the output, specify crop\n          top: number,\n          left: number,\n          width: number,\n          height: number,\n        |},\n      |},\n    },\n  },\n  // Alias for browsers where localhost cannot be accessed from a tunnel,\n  // defaults to \"localtest.dev\"\n  localhostAlias?: string,\n  // List of browsers that can't access localhost from a tunnel, defaults to:\n  // [\"ie11\", \"safari\"]\n  localhostAliasBrowsers?: Array<string>,\n  resultPath?: string,          // Where to output the result file\n  proxy?: {},                   // Nightwatch proxy object\n|}): Object\n```\n\n## 🎪 Sample App\n\nThis project includes a sample app to demo the behavior. You can view it running `yarn start` and opening `localhost:6006` on your browser.\n\nTo run the image comparison tests, keep `yarn start` running and call `SAUCE_ACCESS_KEY={YOUR_ACCESS_KEY} SAUCE_USERNAME={YOUR_USERNAME} yarn test:app`.\n\n## ️✏️ Storybook Usage\n\nTo take advantage of the automated storybook folder config (and testing) modify your storybook `config.js` to look like this:\n\n```js\nimport { storiesOf, configure } from '@storybook/react'\nimport * as picturebook from 'picturebook'\n\nfunction loadStories() {\n  picturebook.loadStories({\n    storiesOf,\n    stories: require.context('../stories', true, /\\.(js|md|png)/),\n  })\n}\n\nconfigure(loadStories, module)\n```\n\nIf you want to see a more advanced use case on how to use it with decorators and other plugins, check out the [sample project](./sampleFolder/.storybook/config.js).\n\n## 📸 Screenshot Usage\n\nTo take screenshots, picturebook relies on nightwatch. With the exception of a few required fields, configuration is generated for you. To take advantage of it you should create a `nightwatch.conf.js` file on your root (or customize it following instructions [here](http://nightwatchjs.org/gettingstarted#settings-file)).\n\n```js\nconst { resolve } = require('path')\nconst { nightwatchConfig, getFiles } = require('picturebook')\nconst requireContext = require('require-context')\n\nconst config = nightwatchConfig({\n  username: process.env.SAUCE_USERNAME,\n  access_key: process.env.SAUCE_ACCESS_KEY,\n  files: getFiles({\n    baseUrl: 'http://localhost:6006',\n    stories: requireContext(resolve(__dirname, './stories'), true, /\\.js/),\n  }),\n  resultPath: resolve(__dirname, './picturebook-img.log'),\n  desiredCapabilities: {\n    build: 'local',\n    'tunnel-identifier': 'picturebook-sample',\n  },\n})\n\nmodule.exports = config\n```\n\nTo run image comparison, after screenshots have been taken you can call:\n\n```js\ncompareImages({\n  screenshots,\n  root: storyRoot,\n  overwrite: true,\n  files: getFiles({\n    stories: requireContext(storyRoot, true, /\\.(js|png)/),\n  }),\n})\n```\n\nWhere `screenshots` is the output of `runTestsWithTunnel` or `runTests` (if running with or without a tunnel, respectively).\n\n## 🙋 QYMA (Questions you may ask)\n\n### Why do I need to add localtest.dev as a localhost alias?\n\nThis is a SauceLabs issue. To work around it, `safari` and `edge` browsers replace `localhost` from urls to `localtest.dev` as described [here](https://support.saucelabs.com/hc/en-us/articles/225106887-Safari-and-Internet-Explorer-Won-t-Load-Website-When-Using-Sauce-Connect-on-Localhost).\n\nYou can customize the target browsers and localhost alias with the `localhostAliasBrowsers` and `localhostAlias`, respectively.\n\n### How do you skip some files?\n\nPicturebook will only take screenshots of the files you tell it exists. You can filter the output from [require.context](https://webpack.js.org/guides/dependency-management/#require-context) by specifying a different regExp to filter by.\n\n### SauceConnect ENOENT error\n\nIf you see the following error after a couple unsuccessful runs of SauceConnect:\n\n```sh\nevents.js:167\n      throw er; // Unhandled 'error' event\n      ^\n\nError: spawn ~/picturebook/node_modules/node-sauce-connect/lib/sc ENOENT\n```\n\nSometimes it gets stuck. Try cleaning `node_modules` and re-running yarn:\n\n```sh\nrm -rf node_modules\nyarn\n```\n\n### node-dir \"cannot read property 'files' of undefined\" error\n\nThere's currently a [bug in node-dir](https://github.com/fshost/node-dir/issues/53) that fails on empty dirs.\n\nRemove empty folders within your stories if you see the following error:\n\n```sh\nyourProject/node_modules/node-dir/lib/paths.js:92\n                results.files = results.files.concat(res.files);\n                                                         ^\n\nTypeError: Cannot read property 'files' of undefined\n    at subloop (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:92:58)\n    at /Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:107:13\n    at onDirRead (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:139:35)\n    at onStat (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:154:14)\n```\n\nYou can do so with:\n\n```sh\nfind /some/path -depth -type d -exec rmdir {} \\;\n```\n","readmeFilename":"README.md","gitHead":"8edb015928d4d020d503f9e61b8fc058c4386c96","bugs":{"url":"https://github.com/obartra/picturebook/issues"},"homepage":"https://github.com/obartra/picturebook#readme","_id":"picturebook@2.0.0-beta.5","_npmVersion":"6.1.0","_nodeVersion":"10.6.0","_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"dist":{"integrity":"sha512-E8BVvHXIHCSQ+7OULP6jjZA2K3VPRahsm5rAlasuHArx+DBRqxBpg64+hiaP997cMmtY8Cs3jTbOwsUkUmi9uA==","shasum":"25c9266ee0b44a23854782a33a41227c877c7152","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-2.0.0-beta.5.tgz","fileCount":171,"unpackedSize":5370269,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbpTw+CRA9TVsSAnZWagAA8L0P/2629qxSLMfoWWoNLQsz\nUfBPeMaVyttV04jSm3OW1vxYBJhTVPdeExR2NndxS6umwF33DJSZhlr88pSb\n0COGHPXabpz4xiTIExAauFJxdUOEqudz2S+V167LRJl6+6sK1c5ygNozYRSi\nX2hddeY+2OqUe1nAt9F8/1bUzi+PbFHGNQtUcJqNC6imo8jjFS/yaDTaf12f\nwA4uOJiFNNpT6MTiDX+d3Dz2iQdMTiaWqcqcJ0W8IfoavbCF54VClFp6gAlQ\n3NjyifBCpVu0rxNYHdTylVmneJd3psY5AimtnxivqkqUaRKvh2RCD4G1y67x\nFL6P8j1FCe1LG+aIy8vaB0DXnOIFC4licrY/1f72cg2P1zCFG8XlS96pwa6r\nZ7MouKrdgeXmixzx2doIVJEu5klTRCRL0BDXCdb15dyNUEMZSC+MGbZOt+Pf\nNVea9SeefwilyCCqfFPcLXi9iHZxRryvY2G98BxETj/iA/SJyLdQUW3FrEa9\ns/i7IBYu1F42YZ1wxPiOHToR2gxaJPFF+PR0wZ270Slj4S8Aubcys0Ftbtdx\nfZGrwl5Iauh0U11TcRAftqtmhheLkhu6ocalIoqWtzuD34VXkIJalxD1XDo6\nz6Ixhi9AnuUOqk+E4/Ume3XLFdB84gtbb8H0q/RzBQOulTd8HdRbYgn5bUHD\nobvf\r\n=lehm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEnPvDy8YWVyCKvXfM2vg/3bFd3E4BouV7pDepCB9Ii1AiEApSahvvcH3BeE0iVmGFaydAxcYvSoS+kveEjlruRkCO4="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook_2.0.0-beta.5_1537555517403_0.10065924021510098"},"_hasShrinkwrap":false},"2.0.0-beta.6":{"name":"picturebook","version":"2.0.0-beta.6","description":"Opinionated Storybook Setup","main":"dist/index.js","browser":"dist/picturebook.web.js","repository":{"type":"git","url":"git+https://github.com/obartra/picturebook.git"},"author":{"name":"Oscar Bartra"},"license":"MIT","scripts":{"format":"prettier --write \"{{src,test,sampleFolder}/**/,}*.js\"","test":"jest","lint":"eslint --ext .js --cache .","build":"webpack --mode production --config webpack.build.config.js && babel src -d dist --copy-files","build:watch":"yarn build --watch","test:watch":"yarn test --watch","start":"yarn && yarn build && cd sampleFolder && yarn && yarn start","test:app":"cd sampleFolder && yarn test --env chrome,firefox,ie11,edge,safari,iphone7","ci":"yarn lint && yarn flow && yarn test"},"dependencies":{"fs-extra":"7.0.0","lodash":"4.17.10","node-sauce-connect":"4.5.0","pixelmatch":"4.0.2","png-crop":"0.0.2","pngjs":"3.3.3","rimraf":"2.6.2","selenium-download":"2.0.13","selenium-server-standalone-jar":"3.13.0"},"devDependencies":{"@babel/plugin-transform-regenerator":"7.0.0","@storybook/react":"3.4.10","babel-cli":"6.26.0","babel-core":"6.26.3","babel-eslint":"8.2.6","babel-loader":"7.1.5","babel-plugin-require-context-hook":"1.0.0","babel-plugin-transform-flow-strip-types":"6.22.0","babel-plugin-transform-object-rest-spread":"6.26.0","babel-polyfill":"6.26.0","babel-preset-env":"1.7.0","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","clean-webpack-plugin":"0.1.19","eslint":"5.4.0","eslint-config-airbnb":"17.1.0","eslint-config-prettier":"3.0.1","eslint-plugin-flowtype":"2.50.0","eslint-plugin-import":"2.14.0","eslint-plugin-jest":"21.22.0","eslint-plugin-jsx-a11y":"6.1.1","eslint-plugin-prettier":"2.6.2","eslint-plugin-promise":"4.0.0","eslint-plugin-react":"7.11.1","flow-bin":"0.79.1","jest":"23.5.0","prettier":"1.14.2","react":"16.4.2","react-dom":"16.4.2","webpack":"4.17.1","webpack-cli":"3.1.0"},"peerDependencies":{"nightwatch":">=0.9.x","react":">= 15.x","react-dom":">= 15.x"},"readme":"# 🤖📗 PictureBook\n\nAutomated React Storybook Setup\n\nSimplify React Storybook story creation and cross-browser image comparison testing\n\n## 💡 Rationale\n\nSetting up storybook and implement cross-browser image comparison testing on multiple projects is time consuming.\n\nInstead of providing a wrapper on top of existing projects that will fall out of date, Picturebook lets you retain control of the Storybook and Nightwatch packages.\n\nThis project aims to provide utility methods to simplify [Storybook](https://storybook.js.org/), [SauceLabs](https://saucelabs.com/) and [Nightwatch](http://nightwatchjs.org/) configuration and screenshot comparison. Specifically:\n\n- **Creation of storybook stories**: They are created based on your file system structure\n- **Saucelabs tunnel setup**: Reduce SauceConnect config to the tunnel id and username / accessKey\n- **Screenshot**: Take screenshots of every story on different browsers using SauceLabs and Nightwatch\n- **Image Comparison**: Compare and update screenshots to baselines collocated with your stories.\n\n## ⚙️ Install\n\n1. You will need a SauceLabs account. If you don't have one you can sign up for a trial [here](https://signup.saucelabs.com/signup/trial) or request a free one for open source projects [here](https://saucelabs.com/open-source-request-account).\n1. If you want to run tests against Safari and IE11 from localhost, add `localtest.dev 127.0.0.1` to your `/etc/hosts` (the exact steps may vary depending on your platform, see [here](https://www.howtogeek.com/howto/27350/beginner-geek-how-to-edit-your-hosts-file/) for more details).\n1. Add picturebook and its peer dependencies:\n\n```sh\nyarn add --dev picturebook @storybook/react nightwatch react\n```\n\nIf you don't have Storybook set it up yet, follow [these instructions](https://storybook.js.org/basics/quick-start-guide/) first.\n\nSome of Picturebook utility methods rely on the output of `require.context`. This is a webpack construct and it's not available in Node or test environments. There are multiple ways to mock it. If you are using babel you could add the [require-context-hook](https://github.com/smrq/babel-plugin-require-context-hook) plugin. For instance, if you want to enable it only for tests, you can do something like:\n\n```json\n{\n  \"env\": {\n    \"test\": {\n      \"plugins\": [\"require-context-hook\"]\n    }\n  }\n}\n```\n\nand on your test setup:\n\n```js\nrequire('babel-plugin-require-context-hook/register')()\n```\n\nAlternatively, there's also the [require-context](https://www.npmjs.com/package/require-context) npm package that will also emulate webpack's `require.context`.\n\n## 📚 API\n\nThe API can be split into 2 sections, storybook creation for finding files in the file system and creating storybook stories around them and storybook testing, to connect to SauceLabs and run cross-browser image comparison tests.\n\n### Storybook creation\n\n`getFiles` and `loadStories` have very similar APIs and output.\n\n`getFiles` allows you to retrieve a list of related files. For instance if you have:\n\n```sh\nfile1.js\nfile1.md\nfile2.png\nfile2.js\n```\n\nIt will provide an array of 2 elements (file1 and file2) with the different related files grouped.\n\nThese values are used to identify helper files for stories where `*.md` is understood to be documentation,`.*(spec|test).js` is a test file and an unprefixed `*.js` file is a story. The `flattenFolders` parameters allow grouping nested folders as well. For instance if `flattenFolders: ['a']` `file1.js` and `a/file1.png` will be grouped together.\n\n`loadStories` provide the same functionality than `getFiles` but it also loads and creates storybook stories. This is why it requires storybook's [storiesOf](https://storybook.js.org/basics/writing-stories/#writing-stories) method as a parameter. The response is also similar but it includes a `main` method with the loaded story.\n\nYou can find the exact APIs below:\n\n```js\ntype Options = {|\n  baseUrl?: string,              // The url for the story, defaults to:\n                                 //   'http://localhost:6006'\n  flattenFolders?: Array<string> // Folders to flatten\n                                 //   defaults to ['__snapshots__', '__screenshots__']\n  stories: any,                  // Output of require context with the stories\n|}\n\ntype StoryPaths = {|\n  name: string,\n  parents: $ReadOnlyArray<string>,\n  title: string,\n  path: string,\n  screenshots: {|\n    [extension: string]: string,\n  |},\n  tests: {|\n    [extension: string]: string,\n  |},\n  doc: ?string,\n  url: ?string,\n|}\n\n// Retrieve and group the different stories based on their filenames\nfunction getFiles(options: Options): Array<StoryPaths>\n\n// Retrieve, group, load and create stories\nfunction loadStories(options: Options & {|\n  decorators: $ReadOnlyArray<Function>,\n  storiesOf: any,\n  storyFiles: $ReadOnlyArray<string>,\n|}): Array<StoryPaths & {|\n  main: () => React.Node,\n|}>\n```\n\n### Storybook testing\n\nOnce stories are loaded, `runTests` will connect to SauceLabs (optionally through a SauceConnect tunnel) and return a Promise that includes the results of the test.\n\nSince it uses `nightwatch` under the hood, you must have a valid nightwatch instance running. To assist with it, `nightwatchConfig` provides defaultValues\n\n```js\n// Invoke nightwatch and run image comparison in SauceLabs\nfunction runTests(options: {|\n  configPath: string,           // absolute path to nightwatch config\n  files: Array<StoryPaths>,     // output of getFiles()\n  overwrite: boolean,           // true to replace failing or missing images\n  storyRoot: string,            // absolute path to the stories\n  tunnelId?: string,            // if set, it will set up a SC tunnel with the id\n|}): Promise<Array<{|\n  browser: string,\n  diffPath: ?string,\n  diffThreshold: number,\n  error: ?string,\n  name: string,\n  platform: string,\n  referencePath: ?string,\n  screenshotPath: ?string,\n  status: 'CREATED' | 'SUCCESS' | 'FAILED',\n|}>>\n\n// Nightwatch config generation helper\nfunction nightwatchConfig(options: {|\n  desiredCapabilities?: {},     // nightwatch desired capabilities object\n  files: Array<StoryPaths>,     // output of getFiles()\n  username: string,             // SauceLabs username\n  access_key: string,           // SauceLabs accessKey\n  browsers?: {                  // List of browsers to test. Default list\n                                //   includes chrome, firefox, edge, ie11,\n                                //   iphone7 and safari but any valid SauceLabs\n                                //   config is valid\n    [browserName: string]: {\n      desiredCapabilities: {\n        platform: string,\n        version: string,\n        browserName: string,\n        screenResolution: string,\n      },\n      custom_vars: {|           // Custom properties required per browser config:\n        name: string,           // Must match \"browserName\"\n        platform: string,       // \"mobile\" | \"desktop\" but any string is allowed\n        extract?: {|            // If cropping the output, specify crop\n          top: number,\n          left: number,\n          width: number,\n          height: number,\n        |},\n      |},\n    },\n  },\n  // Alias for browsers where localhost cannot be accessed from a tunnel,\n  // defaults to \"localtest.dev\"\n  localhostAlias?: string,\n  // List of browsers that can't access localhost from a tunnel, defaults to:\n  // [\"ie11\", \"safari\"]\n  localhostAliasBrowsers?: Array<string>,\n  resultPath?: string,          // Where to output the result file\n  proxy?: {},                   // Nightwatch proxy object\n|}): Object\n```\n\n## 🎪 Sample App\n\nThis project includes a sample app to demo the behavior. You can view it running `yarn start` and opening `localhost:6006` on your browser.\n\nTo run the image comparison tests, keep `yarn start` running and call `SAUCE_ACCESS_KEY={YOUR_ACCESS_KEY} SAUCE_USERNAME={YOUR_USERNAME} yarn test:app`.\n\n## ️✏️ Storybook Usage\n\nTo take advantage of the automated storybook folder config (and testing) modify your storybook `config.js` to look like this:\n\n```js\nimport { storiesOf, configure } from '@storybook/react'\nimport * as picturebook from 'picturebook'\n\nfunction loadStories() {\n  picturebook.loadStories({\n    storiesOf,\n    stories: require.context('../stories', true, /\\.(js|md|png)/),\n  })\n}\n\nconfigure(loadStories, module)\n```\n\nIf you want to see a more advanced use case on how to use it with decorators and other plugins, check out the [sample project](./sampleFolder/.storybook/config.js).\n\n## 📸 Screenshot Usage\n\nTo take screenshots, picturebook relies on nightwatch. With the exception of a few required fields, configuration is generated for you. To take advantage of it you should create a `nightwatch.conf.js` file on your root (or customize it following instructions [here](http://nightwatchjs.org/gettingstarted#settings-file)).\n\n```js\nconst { resolve } = require('path')\nconst { nightwatchConfig, getFiles } = require('picturebook')\nconst requireContext = require('require-context')\n\nconst config = nightwatchConfig({\n  username: process.env.SAUCE_USERNAME,\n  access_key: process.env.SAUCE_ACCESS_KEY,\n  files: getFiles({\n    baseUrl: 'http://localhost:6006',\n    stories: requireContext(resolve(__dirname, './stories'), true, /\\.js/),\n  }),\n  resultPath: resolve(__dirname, './picturebook-img.log'),\n  desiredCapabilities: {\n    build: 'local',\n    'tunnel-identifier': 'picturebook-sample',\n  },\n})\n\nmodule.exports = config\n```\n\nTo run image comparison, after screenshots have been taken you can call:\n\n```js\ncompareImages({\n  screenshots,\n  root: storyRoot,\n  overwrite: true,\n  files: getFiles({\n    stories: requireContext(storyRoot, true, /\\.(js|png)/),\n  }),\n})\n```\n\nWhere `screenshots` is the output of `runTestsWithTunnel` or `runTests` (if running with or without a tunnel, respectively).\n\n## 🙋 QYMA (Questions you may ask)\n\n### Why do I need to add localtest.dev as a localhost alias?\n\nThis is a SauceLabs issue. To work around it, `safari` and `edge` browsers replace `localhost` from urls to `localtest.dev` as described [here](https://support.saucelabs.com/hc/en-us/articles/225106887-Safari-and-Internet-Explorer-Won-t-Load-Website-When-Using-Sauce-Connect-on-Localhost).\n\nYou can customize the target browsers and localhost alias with the `localhostAliasBrowsers` and `localhostAlias`, respectively.\n\n### How do you skip some files?\n\nPicturebook will only take screenshots of the files you tell it exists. You can filter the output from [require.context](https://webpack.js.org/guides/dependency-management/#require-context) by specifying a different regExp to filter by.\n\n### SauceConnect ENOENT error\n\nIf you see the following error after a couple unsuccessful runs of SauceConnect:\n\n```sh\nevents.js:167\n      throw er; // Unhandled 'error' event\n      ^\n\nError: spawn ~/picturebook/node_modules/node-sauce-connect/lib/sc ENOENT\n```\n\nSometimes it gets stuck. Try cleaning `node_modules` and re-running yarn:\n\n```sh\nrm -rf node_modules\nyarn\n```\n\n### node-dir \"cannot read property 'files' of undefined\" error\n\nThere's currently a [bug in node-dir](https://github.com/fshost/node-dir/issues/53) that fails on empty dirs.\n\nRemove empty folders within your stories if you see the following error:\n\n```sh\nyourProject/node_modules/node-dir/lib/paths.js:92\n                results.files = results.files.concat(res.files);\n                                                         ^\n\nTypeError: Cannot read property 'files' of undefined\n    at subloop (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:92:58)\n    at /Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:107:13\n    at onDirRead (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:139:35)\n    at onStat (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:154:14)\n```\n\nYou can do so with:\n\n```sh\nfind /some/path -depth -type d -exec rmdir {} \\;\n```\n","readmeFilename":"README.md","gitHead":"59051af9998ec365265d3b0c2f75458190ec6b13","bugs":{"url":"https://github.com/obartra/picturebook/issues"},"homepage":"https://github.com/obartra/picturebook#readme","_id":"picturebook@2.0.0-beta.6","_npmVersion":"6.1.0","_nodeVersion":"10.6.0","_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"dist":{"integrity":"sha512-dSwqskMDSbvKPAYH8ttFXfgurYwn76XU871S1NXr7C45/28ZxNpHkZyTzD+qBLxRn8IcaruxHHCLbr3j5WIczA==","shasum":"171d3aefbbf836edd16437ef196e7d488b9a007c","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-2.0.0-beta.6.tgz","fileCount":171,"unpackedSize":5370830,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbpY0XCRA9TVsSAnZWagAAhAsQAI5v5C3sm4Do6r0WvKMo\nfS3mJFvzXH56hA2CACfa1ND/ohr0pNKlo7DJbWQuLfHruu8zVIxvM0OBbVpu\n0LkMrPOokyzrraeYsJNRnHfbNmcPxQNP0E5aLX4hrWFX2aRgJSUALWjF8Z8t\nemAm5OCxtxQwKAGrqKhgyUA1Mim0m3mUXR1E5g+ZLwe0kmpjtqasiCMJVm56\nxN4sW8c2VNlTicDlZsR7iggL8ZmMz7FQk77ldVz0TqIdtagI5UJmv6w/fIZM\nt3ET2hE9jX49ketj9nLpbEg1CrAxDEh1IRM0VeOGLJ3r9wciJmbNDdBCCiiO\nZDZmzyDiNYZScAtW+SZxrmzVGPnbVhy8ECvhXTlwAO7Z5IXjVJxeK0v1xtt/\nxn2QMknz065dtmANgqC+/rUjFWs3lRSUXtZNfMWIzd2mQQfPccoNtsL9PSMa\nx3+84TNo7MYBkOqhi7e14xpgFhiqfxlMqb7+0td9MSK+HAE5xMUBn7pmfsdp\nXrsd1scpTOpoEaElUP9yZmCXkxXzNhEQz+TIJrGOW/PkY6S2DEyc9ttm2TqD\nJqKgjHloG47r36EfYD6iCqf7ArPM69CrPQDTLhRGemiwIT7AL3IAp2opx+lh\nbgvKVpbY2s++TJbhEwqAvcbxhFDmeBDjmLlh1jQJ6hec+iDTJlTfJu4+fCjO\nAeG1\r\n=o7PT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBWn6JG50TnhTKiJoPB6lzJYkBpSEWIlfcGsag3r9s8pAiEAyxrsFCF1REqhRDNfbc4CyJD93f/quDoCB6UhAbPTYIo="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook_2.0.0-beta.6_1537576214938_0.9836649392821675"},"_hasShrinkwrap":false},"2.0.0-beta.7":{"name":"picturebook","version":"2.0.0-beta.7","description":"Opinionated Storybook Setup","main":"dist/index.js","browser":"dist/picturebook.web.js","repository":{"type":"git","url":"git+https://github.com/obartra/picturebook.git"},"author":{"name":"Oscar Bartra"},"license":"MIT","scripts":{"format":"prettier --write \"{{src,test,sampleFolder}/**/,}*.js\"","test":"jest","lint":"eslint --ext .js --cache .","build":"webpack --mode production --config webpack.build.config.js && babel src -d dist --copy-files","build:watch":"yarn build --watch","test:watch":"yarn test --watch","start":"yarn && yarn build && cd sampleFolder && yarn && yarn start","test:app":"cd sampleFolder && yarn test --env chrome,firefox,ie11,edge,safari,iphone7","ci":"yarn lint && yarn flow && yarn test"},"dependencies":{"fs-extra":"7.0.0","lodash":"4.17.10","node-sauce-connect":"4.5.0","pixelmatch":"4.0.2","png-crop":"0.0.2","pngjs":"3.3.3","rimraf":"2.6.2","selenium-download":"2.0.13","selenium-server-standalone-jar":"3.13.0"},"devDependencies":{"@babel/plugin-transform-regenerator":"7.0.0","@storybook/react":"3.4.10","babel-cli":"6.26.0","babel-core":"6.26.3","babel-eslint":"8.2.6","babel-loader":"7.1.5","babel-plugin-require-context-hook":"1.0.0","babel-plugin-transform-flow-strip-types":"6.22.0","babel-plugin-transform-object-rest-spread":"6.26.0","babel-polyfill":"6.26.0","babel-preset-env":"1.7.0","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","clean-webpack-plugin":"0.1.19","eslint":"5.4.0","eslint-config-airbnb":"17.1.0","eslint-config-prettier":"3.0.1","eslint-plugin-flowtype":"2.50.0","eslint-plugin-import":"2.14.0","eslint-plugin-jest":"21.22.0","eslint-plugin-jsx-a11y":"6.1.1","eslint-plugin-prettier":"2.6.2","eslint-plugin-promise":"4.0.0","eslint-plugin-react":"7.11.1","flow-bin":"0.79.1","jest":"23.5.0","prettier":"1.14.2","react":"16.4.2","react-dom":"16.4.2","webpack":"4.17.1","webpack-cli":"3.1.0"},"peerDependencies":{"nightwatch":">=0.9.x","react":">= 15.x","react-dom":">= 15.x"},"readme":"# 🤖📗 PictureBook\n\nAutomated React Storybook Setup\n\nSimplify React Storybook story creation and cross-browser image comparison testing\n\n## 💡 Rationale\n\nSetting up storybook and implement cross-browser image comparison testing on multiple projects is time consuming.\n\nInstead of providing a wrapper on top of existing projects that will fall out of date, Picturebook lets you retain control of the Storybook and Nightwatch packages.\n\nThis project aims to provide utility methods to simplify [Storybook](https://storybook.js.org/), [SauceLabs](https://saucelabs.com/) and [Nightwatch](http://nightwatchjs.org/) configuration and screenshot comparison. Specifically:\n\n- **Creation of storybook stories**: They are created based on your file system structure\n- **Saucelabs tunnel setup**: Reduce SauceConnect config to the tunnel id and username / accessKey\n- **Screenshot**: Take screenshots of every story on different browsers using SauceLabs and Nightwatch\n- **Image Comparison**: Compare and update screenshots to baselines collocated with your stories.\n\n## ⚙️ Install\n\n1. You will need a SauceLabs account. If you don't have one you can sign up for a trial [here](https://signup.saucelabs.com/signup/trial) or request a free one for open source projects [here](https://saucelabs.com/open-source-request-account).\n1. If you want to run tests against Safari and IE11 from localhost, add `localtest.dev 127.0.0.1` to your `/etc/hosts` (the exact steps may vary depending on your platform, see [here](https://www.howtogeek.com/howto/27350/beginner-geek-how-to-edit-your-hosts-file/) for more details).\n1. Add picturebook and its peer dependencies:\n\n```sh\nyarn add --dev picturebook @storybook/react nightwatch react\n```\n\nIf you don't have Storybook set it up yet, follow [these instructions](https://storybook.js.org/basics/quick-start-guide/) first.\n\nSome of Picturebook utility methods rely on the output of `require.context`. This is a webpack construct and it's not available in Node or test environments. There are multiple ways to mock it. If you are using babel you could add the [require-context-hook](https://github.com/smrq/babel-plugin-require-context-hook) plugin. For instance, if you want to enable it only for tests, you can do something like:\n\n```json\n{\n  \"env\": {\n    \"test\": {\n      \"plugins\": [\"require-context-hook\"]\n    }\n  }\n}\n```\n\nand on your test setup:\n\n```js\nrequire('babel-plugin-require-context-hook/register')()\n```\n\nAlternatively, there's also the [require-context](https://www.npmjs.com/package/require-context) npm package that will also emulate webpack's `require.context`.\n\n## 📚 API\n\nThe API can be split into 2 sections, storybook creation for finding files in the file system and creating storybook stories around them and storybook testing, to connect to SauceLabs and run cross-browser image comparison tests.\n\n### Storybook creation\n\n`getFiles` and `loadStories` have very similar APIs and output.\n\n`getFiles` allows you to retrieve a list of related files. For instance if you have:\n\n```sh\nfile1.js\nfile1.md\nfile2.png\nfile2.js\n```\n\nIt will provide an array of 2 elements (file1 and file2) with the different related files grouped.\n\nThese values are used to identify helper files for stories where `*.md` is understood to be documentation,`.*(spec|test).js` is a test file and an unprefixed `*.js` file is a story. The `flattenFolders` parameters allow grouping nested folders as well. For instance if `flattenFolders: ['a']` `file1.js` and `a/file1.png` will be grouped together.\n\n`loadStories` provide the same functionality than `getFiles` but it also loads and creates storybook stories. This is why it requires storybook's [storiesOf](https://storybook.js.org/basics/writing-stories/#writing-stories) method as a parameter. The response is also similar but it includes a `main` method with the loaded story.\n\nYou can find the exact APIs below:\n\n```js\ntype Options = {|\n  baseUrl?: string,              // The url for the story, defaults to:\n                                 //   'http://localhost:6006'\n  flattenFolders?: Array<string> // Folders to flatten\n                                 //   defaults to ['__snapshots__', '__screenshots__']\n  stories: any,                  // Output of require context with the stories\n|}\n\ntype StoryPaths = {|\n  name: string,\n  parents: $ReadOnlyArray<string>,\n  title: string,\n  path: string,\n  screenshots: {|\n    [extension: string]: string,\n  |},\n  tests: {|\n    [extension: string]: string,\n  |},\n  doc: ?string,\n  url: ?string,\n|}\n\n// Retrieve and group the different stories based on their filenames\nfunction getFiles(options: Options): Array<StoryPaths>\n\n// Retrieve, group, load and create stories\nfunction loadStories(options: Options & {|\n  decorators: $ReadOnlyArray<Function>,\n  storiesOf: any,\n  storyFiles: $ReadOnlyArray<string>,\n|}): Array<StoryPaths & {|\n  main: () => React.Node,\n|}>\n```\n\n### Storybook testing\n\nOnce stories are loaded, `runTests` will connect to SauceLabs (optionally through a SauceConnect tunnel) and return a Promise that includes the results of the test.\n\nSince it uses `nightwatch` under the hood, you must have a valid nightwatch instance running. To assist with it, `nightwatchConfig` provides defaultValues\n\n```js\n// Invoke nightwatch and run image comparison in SauceLabs\nfunction runTests(options: {|\n  configPath: string,           // absolute path to nightwatch config\n  files: Array<StoryPaths>,     // output of getFiles()\n  overwrite: boolean,           // true to replace failing or missing images\n  storyRoot: string,            // absolute path to the stories\n  tunnelId?: string,            // if set, it will set up a SC tunnel with the id\n|}): Promise<Array<{|\n  browser: string,\n  diffPath: ?string,\n  diffThreshold: number,\n  error: ?string,\n  name: string,\n  platform: string,\n  referencePath: ?string,\n  screenshotPath: ?string,\n  status: 'CREATED' | 'SUCCESS' | 'FAILED',\n|}>>\n\n// Nightwatch config generation helper\nfunction nightwatchConfig(options: {|\n  desiredCapabilities?: {},     // nightwatch desired capabilities object\n  files: Array<StoryPaths>,     // output of getFiles()\n  username: string,             // SauceLabs username\n  access_key: string,           // SauceLabs accessKey\n  browsers?: {                  // List of browsers to test. Default list\n                                //   includes chrome, firefox, edge, ie11,\n                                //   iphone7 and safari but any valid SauceLabs\n                                //   config is valid\n    [browserName: string]: {\n      desiredCapabilities: {\n        platform: string,\n        version: string,\n        browserName: string,\n        screenResolution: string,\n      },\n      custom_vars: {|           // Custom properties required per browser config:\n        name: string,           // Must match \"browserName\"\n        platform: string,       // \"mobile\" | \"desktop\" but any string is allowed\n        extract?: {|            // If cropping the output, specify crop dimensions\n          top: number,\n          left: number,\n          width: number,\n          height: number,\n        |},\n      |},\n    },\n  },\n  // Alias for browsers where localhost cannot be accessed from a tunnel,\n  // defaults to \"localtest.dev\"\n  localhostAlias?: string,\n  // List of browsers that can't access localhost from a tunnel, defaults to:\n  // [\"ie11\", \"safari\"]\n  localhostAliasBrowsers?: Array<string>,\n  proxy?: {},                   // Nightwatch proxy object\n|}): Object\n```\n\n## 🎪 Sample App\n\nThis project includes a sample app to demo the behavior. You can view it running `yarn start` and opening `localhost:6006` on your browser.\n\nTo run the image comparison tests, keep `yarn start` running and call `SAUCE_ACCESS_KEY={YOUR_ACCESS_KEY} SAUCE_USERNAME={YOUR_USERNAME} yarn test:app`.\n\n## ️✏️ Storybook Usage\n\nTo take advantage of the automated storybook folder config (and testing) modify your storybook `config.js` to look like this:\n\n```js\nimport { storiesOf, configure } from '@storybook/react'\nimport * as picturebook from 'picturebook'\n\nfunction loadStories() {\n  picturebook.loadStories({\n    storiesOf,\n    stories: require.context('../stories', true, /\\.(js|md|png)/),\n  })\n}\n\nconfigure(loadStories, module)\n```\n\nIf you want to see a more advanced use case on how to use it with decorators and other plugins, check out the [sample project](./sampleFolder/.storybook/config.js).\n\n## 📸 Screenshot Usage\n\nTo take screenshots, picturebook relies on nightwatch. With the exception of a few required fields, configuration is generated for you. To take advantage of it you should create a `nightwatch.conf.js` file on your root (or customize it following instructions [here](http://nightwatchjs.org/gettingstarted#settings-file)).\n\n```js\nconst { resolve } = require('path')\nconst { nightwatchConfig, getFiles } = require('picturebook')\nconst requireContext = require('require-context')\n\nconst config = nightwatchConfig({\n  username: process.env.SAUCE_USERNAME,\n  access_key: process.env.SAUCE_ACCESS_KEY,\n  files: getFiles({\n    baseUrl: 'http://localhost:6006',\n    stories: requireContext(resolve(__dirname, './stories'), true, /\\.js/),\n  }),\n  desiredCapabilities: {\n    build: 'local',\n    'tunnel-identifier': 'picturebook-sample',\n  },\n})\n\nmodule.exports = config\n```\n\nTo take screenshots and run image comparison, you can call:\n\n```js\nrunTests({\n  storyRoot,\n  files: getFiles({\n    stories: requireContext(storyRoot, true, /\\.(js|png)/),\n  }),\n  overwrite,\n  tunnelId: 'picturebook-sample',\n  configPath: resolve(__dirname, 'nightwatch.conf.js'),\n})\n```\n\nNote that if using a tunnel, `tunnel-identifier` on your nightwatch config must match the `tunnelId` parameter passed to `runTests`.\n\n## 🙋 QYMA (Questions you may ask)\n\n### Why do I need to add localtest.dev as a localhost alias?\n\nThis is a SauceLabs issue. To work around it, `safari` and `edge` browsers replace `localhost` from urls to `localtest.dev` as described [here](https://support.saucelabs.com/hc/en-us/articles/225106887-Safari-and-Internet-Explorer-Won-t-Load-Website-When-Using-Sauce-Connect-on-Localhost).\n\nYou can customize the target browsers and localhost alias with the `localhostAliasBrowsers` and `localhostAlias`, respectively.\n\n### How do you skip some files?\n\nPicturebook will only take screenshots of the files you tell it exists. You can filter the output from [require.context](https://webpack.js.org/guides/dependency-management/#require-context) by specifying a different regExp to filter by.\n\n### SauceConnect ENOENT error\n\nIf you see the following error after a couple unsuccessful runs of SauceConnect:\n\n```sh\nevents.js:167\n      throw er; // Unhandled 'error' event\n      ^\n\nError: spawn ~/picturebook/node_modules/node-sauce-connect/lib/sc ENOENT\n```\n\nSometimes it gets stuck. Try cleaning `node_modules` and re-running yarn:\n\n```sh\nrm -rf node_modules\nyarn\n```\n\n### Error retrieving a new session from the selenium server\n\nThis is a Nightwatch issue, addressed in 1.0.4 versions of Nightwatch and later as per [this issue](https://github.com/nightwatchjs/nightwatch/issues/1772).\n\n### node-dir \"cannot read property 'files' of undefined\" error\n\nThere's currently a [bug in node-dir](https://github.com/fshost/node-dir/issues/53) that fails on empty dirs.\n\nRemove empty folders within your stories if you see the following error:\n\n```sh\nyourProject/node_modules/node-dir/lib/paths.js:92\n                results.files = results.files.concat(res.files);\n                                                         ^\n\nTypeError: Cannot read property 'files' of undefined\n    at subloop (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:92:58)\n    at /Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:107:13\n    at onDirRead (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:139:35)\n    at onStat (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:154:14)\n```\n\nYou can do so with:\n\n```sh\nfind /some/path -depth -type d -exec rmdir {} \\;\n```\n","readmeFilename":"README.md","gitHead":"8ed9fc30bb081348af6bfd48129aa9510f63d6c7","bugs":{"url":"https://github.com/obartra/picturebook/issues"},"homepage":"https://github.com/obartra/picturebook#readme","_id":"picturebook@2.0.0-beta.7","_npmVersion":"6.1.0","_nodeVersion":"10.6.0","_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"dist":{"integrity":"sha512-oMvxNOGb/4O2XbwWICqe7OGvAuP1AhKL1hbFF/Lnf4urBpVr+m9UdoIT3jnXSgCPPVC7hwubsYnHwV9AgWucDg==","shasum":"93f9785e2e0803706474e432d29c3566fe345f07","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-2.0.0-beta.7.tgz","fileCount":171,"unpackedSize":5374452,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbqFUKCRA9TVsSAnZWagAAan0P/3QRk/pTWC/wQ418gC/O\nohEPPfJXMvVR48ZddW/ewGkRTR/OlCpdoqkPkTkHKSSPRGwredFnnccCerYh\nOOmRdkN3eegoV7EJIh7Vlp0q73yvphIR07jCzKCW0AQebeHD7NAp2PkbMSjO\nbJi1fUDdR/XsrEiHnewgi/CQKObrhLxlWgc4Zl1k0cr7uCgSh+1+Nw0ymD2r\n4vt+yxlPTRY5hDum8ecQOi9oky4bNTwlEoEO08QXVPHfld/FOe3lhrMR3Aw0\n8mNccDvpNfn/PtpvBwfQxqrL0va68V0bH9K6jutWoPrw5rUX//u69c12cpaY\nG1ignVDxWelSzDioR7wtZHfO95MXc4x/90tXlPvCwHe+pdAtueBncDxtzbIa\n2OlATjAsei4jyMa6bUf/Eu7I7SCFKrZXxFOPfIOBFDX+L7Napt3Jg9sj9bzK\nT0xvHrBe0DeJ1g1cE0kcWtDdUloSoPm2s5Nunmwe/wncmqTK0Us31HQJ10jc\nqVYGgGneMWADMo1SQE5pAq2LqPDIm2juYqJIw3Lvw7MTYDmSAMJKX3bt0g+9\nKyVg+Pp+tvAnCNw/JPrpbUrxqr6HJBuLx6vP2FZm9g2SnRcOEciwDV7A4PmL\n/ThNwoUB8Jb2FVgX0lqRkIqabHGG1klCk61zHs7rnXtI0lvScaxw5ILKSQBw\nF6SX\r\n=CBEl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDeX50Q0uElzBq55eDx7BjnXb0+uExlwVgGeFKthFZ8DAiBLzA7tRas84rU8M10VinuaXLARg77GxZG9b7RhQ2KZ8Q=="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook_2.0.0-beta.7_1537758474280_0.23635987518781842"},"_hasShrinkwrap":false},"2.0.0-beta.8":{"name":"picturebook","version":"2.0.0-beta.8","description":"Opinionated Storybook Setup","main":"dist/index.js","browser":"dist/picturebook.web.js","repository":{"type":"git","url":"git+https://github.com/obartra/picturebook.git"},"author":{"name":"Oscar Bartra"},"license":"MIT","scripts":{"format":"prettier --write \"{{src,test,sampleFolder}/**/,}*.js\"","test":"jest","lint":"eslint --ext .js --cache .","build":"webpack --mode production --config webpack.build.config.js && babel src -d dist --copy-files","build:watch":"yarn build --watch","test:watch":"yarn test --watch","start":"yarn && yarn build && cd sampleFolder && yarn && yarn start","test:app":"cd sampleFolder && yarn test --env chrome,firefox,ie11,edge,safari,iphone7","ci":"yarn lint && yarn flow && yarn test"},"dependencies":{"fs-extra":"7.0.0","lodash":"4.17.10","node-sauce-connect":"4.5.0","pixelmatch":"4.0.2","png-crop":"0.0.2","pngjs":"3.3.3","rimraf":"2.6.2","selenium-download":"2.0.13","selenium-server-standalone-jar":"3.13.0"},"devDependencies":{"@babel/plugin-transform-regenerator":"7.0.0","@storybook/react":"3.4.10","babel-cli":"6.26.0","babel-core":"6.26.3","babel-eslint":"8.2.6","babel-loader":"7.1.5","babel-plugin-require-context-hook":"1.0.0","babel-plugin-transform-flow-strip-types":"6.22.0","babel-plugin-transform-object-rest-spread":"6.26.0","babel-polyfill":"6.26.0","babel-preset-env":"1.7.0","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","clean-webpack-plugin":"0.1.19","eslint":"5.4.0","eslint-config-airbnb":"17.1.0","eslint-config-prettier":"3.0.1","eslint-plugin-flowtype":"2.50.0","eslint-plugin-import":"2.14.0","eslint-plugin-jest":"21.22.0","eslint-plugin-jsx-a11y":"6.1.1","eslint-plugin-prettier":"2.6.2","eslint-plugin-promise":"4.0.0","eslint-plugin-react":"7.11.1","flow-bin":"0.79.1","jest":"23.5.0","prettier":"1.14.2","react":"16.4.2","react-dom":"16.4.2","webpack":"4.17.1","webpack-cli":"3.1.0"},"peerDependencies":{"nightwatch":">=0.9.x","react":">= 15.x","react-dom":">= 15.x"},"readme":"# 🤖📗 PictureBook\n\nAutomated React Storybook Setup\n\nSimplify React Storybook story creation and cross-browser image comparison testing\n\n## 💡 Rationale\n\nSetting up storybook and implement cross-browser image comparison testing on multiple projects is time consuming.\n\nInstead of providing a wrapper on top of existing projects that will fall out of date, Picturebook lets you retain control of the Storybook and Nightwatch packages.\n\nThis project aims to provide utility methods to simplify [Storybook](https://storybook.js.org/), [SauceLabs](https://saucelabs.com/) and [Nightwatch](http://nightwatchjs.org/) configuration and screenshot comparison. Specifically:\n\n- **Creation of storybook stories**: They are created based on your file system structure\n- **Saucelabs tunnel setup**: Reduce SauceConnect config to the tunnel id and username / accessKey\n- **Screenshot**: Take screenshots of every story on different browsers using SauceLabs and Nightwatch\n- **Image Comparison**: Compare and update screenshots to baselines collocated with your stories.\n\n## ⚙️ Install\n\n1. You will need a SauceLabs account. If you don't have one you can sign up for a trial [here](https://signup.saucelabs.com/signup/trial) or request a free one for open source projects [here](https://saucelabs.com/open-source-request-account).\n1. If you want to run tests against Safari and IE11 from localhost, add `localtest.dev 127.0.0.1` to your `/etc/hosts` (the exact steps may vary depending on your platform, see [here](https://www.howtogeek.com/howto/27350/beginner-geek-how-to-edit-your-hosts-file/) for more details).\n1. Add picturebook and its peer dependencies:\n\n```sh\nyarn add --dev picturebook @storybook/react nightwatch react\n```\n\nIf you don't have Storybook set it up yet, follow [these instructions](https://storybook.js.org/basics/quick-start-guide/) first.\n\nSome of Picturebook utility methods rely on the output of `require.context`. This is a webpack construct and it's not available in Node or test environments. There are multiple ways to mock it. If you are using babel you could add the [require-context-hook](https://github.com/smrq/babel-plugin-require-context-hook) plugin. For instance, if you want to enable it only for tests, you can do something like:\n\n```json\n{\n  \"env\": {\n    \"test\": {\n      \"plugins\": [\"require-context-hook\"]\n    }\n  }\n}\n```\n\nand on your test setup:\n\n```js\nrequire('babel-plugin-require-context-hook/register')()\n```\n\nAlternatively, there's also the [require-context](https://www.npmjs.com/package/require-context) npm package that will also emulate webpack's `require.context`.\n\n## 📚 API\n\nThe API can be split into 2 sections, storybook creation for finding files in the file system and creating storybook stories around them and storybook testing, to connect to SauceLabs and run cross-browser image comparison tests.\n\n### Storybook creation\n\n`getFiles` and `loadStories` have very similar APIs and output.\n\n`getFiles` allows you to retrieve a list of related files. For instance if you have:\n\n```sh\nfile1.js\nfile1.md\nfile2.png\nfile2.js\n```\n\nIt will provide an array of 2 elements (file1 and file2) with the different related files grouped.\n\nThese values are used to identify helper files for stories where `*.md` is understood to be documentation,`.*(spec|test).js` is a test file and an unprefixed `*.js` file is a story. The `flattenFolders` parameters allow grouping nested folders as well. For instance if `flattenFolders: ['a']` `file1.js` and `a/file1.png` will be grouped together.\n\n`loadStories` provide the same functionality than `getFiles` but it also loads and creates storybook stories. This is why it requires storybook's [storiesOf](https://storybook.js.org/basics/writing-stories/#writing-stories) method as a parameter. The response is also similar but it includes a `main` method with the loaded story.\n\nYou can find the exact APIs below:\n\n```js\ntype Options = {|\n  baseUrl?: string,              // The url for the story, defaults to:\n                                 //   'http://localhost:6006'\n  flattenFolders?: Array<string> // Folders to flatten\n                                 //   defaults to ['__snapshots__', '__screenshots__']\n  stories: any,                  // Output of require context with the stories\n|}\n\ntype StoryPaths = {|\n  name: string,\n  parents: $ReadOnlyArray<string>,\n  title: string,\n  path: string,\n  screenshots: {|\n    [extension: string]: string,\n  |},\n  tests: {|\n    [extension: string]: string,\n  |},\n  doc: ?string,\n  url: ?string,\n|}\n\n// Retrieve and group the different stories based on their filenames\nfunction getFiles(options: Options): Array<StoryPaths>\n\n// Retrieve, group, load and create stories\nfunction loadStories(options: Options & {|\n  decorators: $ReadOnlyArray<Function>,\n  storiesOf: any,\n  storyFiles: $ReadOnlyArray<string>,\n|}): Array<StoryPaths & {|\n  main: () => React.Node,\n|}>\n```\n\n### Storybook testing\n\nOnce stories are loaded, `runTests` will connect to SauceLabs (optionally through a SauceConnect tunnel) and return a Promise that includes the results of the test.\n\nSince it uses `nightwatch` under the hood, you must have a valid nightwatch instance running. To assist with it, `nightwatchConfig` provides defaultValues\n\n```js\n// Invoke nightwatch and run image comparison in SauceLabs\nfunction runTests(options: {|\n  configPath: string,           // absolute path to nightwatch config\n  files: Array<StoryPaths>,     // output of getFiles()\n  overwrite: boolean,           // true to replace failing or missing images\n  storyRoot: string,            // absolute path to the stories\n  tunnelId?: string,            // if set, it will set up a SC tunnel with the id\n|}): Promise<Array<{|\n  browser: string,\n  diffPath: ?string,\n  diffThreshold: number,\n  error: ?string,\n  name: string,\n  platform: string,\n  referencePath: ?string,\n  screenshotPath: ?string,\n  status: 'CREATED' | 'SUCCESS' | 'FAILED',\n|}>>\n\n// Nightwatch config generation helper\nfunction nightwatchConfig(options: {|\n  desiredCapabilities?: {},     // nightwatch desired capabilities object\n  files: Array<StoryPaths>,     // output of getFiles()\n  username: string,             // SauceLabs username\n  access_key: string,           // SauceLabs accessKey\n  browsers?: {                  // List of browsers to test. Default list\n                                //   includes chrome, firefox, edge, ie11,\n                                //   iphone7 and safari but any valid SauceLabs\n                                //   config is valid\n    [browserName: string]: {\n      desiredCapabilities: {\n        platform: string,\n        version: string,\n        browserName: string,\n        screenResolution: string,\n      },\n      custom_vars: {|           // Custom properties required per browser config:\n        name: string,           // Must match \"browserName\"\n        platform: string,       // \"mobile\" | \"desktop\" but any string is allowed\n        extract?: {|            // If cropping the output, specify crop dimensions\n          top: number,\n          left: number,\n          width: number,\n          height: number,\n        |},\n      |},\n    },\n  },\n  // Alias for browsers where localhost cannot be accessed from a tunnel,\n  // defaults to \"localtest.dev\"\n  localhostAlias?: string,\n  // List of browsers that can't access localhost from a tunnel, defaults to:\n  // [\"ie11\", \"safari\"]\n  localhostAliasBrowsers?: Array<string>,\n  proxy?: {},                   // Nightwatch proxy object\n|}): Object\n```\n\n## 🎪 Sample App\n\nThis project includes a sample app to demo the behavior. You can view it running `yarn start` and opening `localhost:6006` on your browser.\n\nTo run the image comparison tests, keep `yarn start` running and call `SAUCE_ACCESS_KEY={YOUR_ACCESS_KEY} SAUCE_USERNAME={YOUR_USERNAME} yarn test:app`.\n\n## ️✏️ Storybook Usage\n\nTo take advantage of the automated storybook folder config (and testing) modify your storybook `config.js` to look like this:\n\n```js\nimport { storiesOf, configure } from '@storybook/react'\nimport * as picturebook from 'picturebook'\n\nfunction loadStories() {\n  picturebook.loadStories({\n    storiesOf,\n    stories: require.context('../stories', true, /\\.(js|md|png)/),\n  })\n}\n\nconfigure(loadStories, module)\n```\n\nIf you want to see a more advanced use case on how to use it with decorators and other plugins, check out the [sample project](./sampleFolder/.storybook/config.js).\n\n## 📸 Screenshot Usage\n\nTo take screenshots, picturebook relies on nightwatch. With the exception of a few required fields, configuration is generated for you. To take advantage of it you should create a `nightwatch.conf.js` file on your root (or customize it following instructions [here](http://nightwatchjs.org/gettingstarted#settings-file)).\n\n```js\nconst { resolve } = require('path')\nconst { nightwatchConfig, getFiles } = require('picturebook')\nconst requireContext = require('require-context')\n\nconst config = nightwatchConfig({\n  username: process.env.SAUCE_USERNAME,\n  access_key: process.env.SAUCE_ACCESS_KEY,\n  files: getFiles({\n    baseUrl: 'http://localhost:6006',\n    stories: requireContext(resolve(__dirname, './stories'), true, /\\.js/),\n  }),\n  desiredCapabilities: {\n    build: 'local',\n    'tunnel-identifier': 'picturebook-sample',\n  },\n})\n\nmodule.exports = config\n```\n\nTo take screenshots and run image comparison, you can call:\n\n```js\nrunTests({\n  storyRoot,\n  files: getFiles({\n    stories: requireContext(storyRoot, true, /\\.(js|png)/),\n  }),\n  overwrite,\n  tunnelId: 'picturebook-sample',\n  configPath: resolve(__dirname, 'nightwatch.conf.js'),\n})\n```\n\nNote that if using a tunnel, `tunnel-identifier` on your nightwatch config must match the `tunnelId` parameter passed to `runTests`.\n\n## 🙋 QYMA (Questions you may ask)\n\n### Why do I need to add localtest.dev as a localhost alias?\n\nThis is a SauceLabs issue. To work around it, `safari` and `edge` browsers replace `localhost` from urls to `localtest.dev` as described [here](https://support.saucelabs.com/hc/en-us/articles/225106887-Safari-and-Internet-Explorer-Won-t-Load-Website-When-Using-Sauce-Connect-on-Localhost).\n\nYou can customize the target browsers and localhost alias with the `localhostAliasBrowsers` and `localhostAlias`, respectively.\n\n### How do you skip some files?\n\nPicturebook will only take screenshots of the files you tell it exists. You can filter the output from [require.context](https://webpack.js.org/guides/dependency-management/#require-context) by specifying a different regExp to filter by.\n\n### SauceConnect ENOENT error\n\nIf you see the following error after a couple unsuccessful runs of SauceConnect:\n\n```sh\nevents.js:167\n      throw er; // Unhandled 'error' event\n      ^\n\nError: spawn ~/picturebook/node_modules/node-sauce-connect/lib/sc ENOENT\n```\n\nSometimes it gets stuck. Try cleaning `node_modules` and re-running yarn:\n\n```sh\nrm -rf node_modules\nyarn\n```\n\n### Error retrieving a new session from the selenium server\n\nThis is a Nightwatch issue, addressed in 1.0.4 versions of Nightwatch and later as per [this issue](https://github.com/nightwatchjs/nightwatch/issues/1772).\n\n### node-dir \"cannot read property 'files' of undefined\" error\n\nThere's currently a [bug in node-dir](https://github.com/fshost/node-dir/issues/53) that fails on empty dirs.\n\nRemove empty folders within your stories if you see the following error:\n\n```sh\nyourProject/node_modules/node-dir/lib/paths.js:92\n                results.files = results.files.concat(res.files);\n                                                         ^\n\nTypeError: Cannot read property 'files' of undefined\n    at subloop (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:92:58)\n    at /Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:107:13\n    at onDirRead (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:139:35)\n    at onStat (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:154:14)\n```\n\nYou can do so with:\n\n```sh\nfind /some/path -depth -type d -exec rmdir {} \\;\n```\n","readmeFilename":"README.md","gitHead":"f7c13eac2fb53d02ed3f1be907e04b74a14ac987","bugs":{"url":"https://github.com/obartra/picturebook/issues"},"homepage":"https://github.com/obartra/picturebook#readme","_id":"picturebook@2.0.0-beta.8","_npmVersion":"6.1.0","_nodeVersion":"10.6.0","_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"dist":{"integrity":"sha512-3tWea1jwXdN0vUhG8i4TaC24iqOCof80hv9j1BfOZaQ+nzCXMwy5l3h1uD7BoVsodSMvML+YwWoyYetUf7X7Cg==","shasum":"ce84fa894e6afc07c2cf66b79a7d0563dcffcf45","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-2.0.0-beta.8.tgz","fileCount":171,"unpackedSize":5374428,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbqHOUCRA9TVsSAnZWagAAWBsP/jzPHN9HmP83IPW7xS7C\nR23jvL0Vt01k9niLYAWdiv/jFlKvoWOqENviQ4zIjeQQDCQ2HZONK9SDdNyu\nenOXaMaZEZk/ODTdAUpRDCm+EZR3vHZiruJLoOSty7iGMfGK8+lVIi21bPq2\nOMmkqXPBvPxaPf1yqSYTuKvMxtEV2PuFE3i5KiLAW8VeY4RugQ+rU9GEFy3s\n8YB75u9is7dveFoVZTGNv+cfv3PHLYYoSb2NTEPYrKsSpbQZz2cIi3qlEOMR\nUa78lDlV8hq6RUtDQRnCkgtJkGNT5efnxrRjc+GVeMSNNNHKAMZs8pX07Dy1\nl1l4BWrefktPt6Dvmux+NF6KOgVrpvXp1SlaiKG8chUlaYv09XDm6dnAytNi\ntPoveABnnbt9uAgALXP/ek5RlwXezMWeA5c8j8k5zI1WtktroYWy0h7nMIxt\nUJEE7UiZdPjIR5tDktNep3/KqHrYEw3dmRYzSAESvd5PJww8vs3RGr/w1vBL\njXPiDB1A9MLecOLqhv0XJOxY8vRPFUGf2rGB6AsK5QhCmFBmOAUqGcJgPZDI\n6xGELjd0MCCNHtekgWvAZysBIIG0KCPF5ir1fhL/DkHcc0Bi7er9VsQA8q1Q\npK5iukjhUTCIE1Iq3X8ieWmGpl64SCO+Ztf0SpYdDmwdi+fiknP9R0kDQwFb\nILj3\r\n=hiZt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID6Go31UR+fls34OSKCd4aRe0zdB59pAGlDfp8WbMWQJAiAqxF3diz0uDJOCtYdipDwf54IGWyuDaMwXRKB+wzOg7w=="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook_2.0.0-beta.8_1537766292016_0.5005787092123128"},"_hasShrinkwrap":false},"2.0.0-beta.9":{"name":"picturebook","version":"2.0.0-beta.9","description":"Opinionated Storybook Setup","main":"dist/index.js","browser":"dist/picturebook.web.js","repository":{"type":"git","url":"git+https://github.com/obartra/picturebook.git"},"author":{"name":"Oscar Bartra"},"license":"MIT","scripts":{"format":"prettier --write \"{{src,test,sampleFolder}/**/,}*.js\"","test":"jest","lint":"eslint --ext .js --cache .","build":"webpack --mode production --config webpack.build.config.js && babel src -d dist --copy-files","build:watch":"yarn build --watch","test:watch":"yarn test --watch","start":"yarn && yarn build && cd sampleFolder && yarn && yarn start","test:app":"cd sampleFolder && yarn test --env chrome,firefox,ie11,edge,safari,iphone7","ci":"yarn lint && yarn flow && yarn test"},"dependencies":{"fs-extra":"7.0.0","lodash":"4.17.10","node-sauce-connect":"4.5.0","pixelmatch":"4.0.2","png-crop":"0.0.2","pngjs":"3.3.3","rimraf":"2.6.2","selenium-download":"2.0.13","selenium-server-standalone-jar":"3.13.0"},"devDependencies":{"@babel/plugin-transform-regenerator":"7.0.0","@storybook/react":"3.4.10","babel-cli":"6.26.0","babel-core":"6.26.3","babel-eslint":"8.2.6","babel-loader":"7.1.5","babel-plugin-require-context-hook":"1.0.0","babel-plugin-transform-flow-strip-types":"6.22.0","babel-plugin-transform-object-rest-spread":"6.26.0","babel-polyfill":"6.26.0","babel-preset-env":"1.7.0","babel-preset-react":"6.24.1","babel-runtime":"6.26.0","clean-webpack-plugin":"0.1.19","eslint":"5.4.0","eslint-config-airbnb":"17.1.0","eslint-config-prettier":"3.0.1","eslint-plugin-flowtype":"2.50.0","eslint-plugin-import":"2.14.0","eslint-plugin-jest":"21.22.0","eslint-plugin-jsx-a11y":"6.1.1","eslint-plugin-prettier":"2.6.2","eslint-plugin-promise":"4.0.0","eslint-plugin-react":"7.11.1","flow-bin":"0.79.1","jest":"23.5.0","prettier":"1.14.2","react":"16.4.2","react-dom":"16.4.2","webpack":"4.17.1","webpack-cli":"3.1.0"},"peerDependencies":{"nightwatch":">=0.9.x","react":">= 15.x","react-dom":">= 15.x"},"readme":"# 🤖📗 PictureBook\n\nAutomated React Storybook Setup\n\nSimplify React Storybook story creation and cross-browser image comparison testing\n\n## 💡 Rationale\n\nSetting up storybook and implement cross-browser image comparison testing on multiple projects is time consuming.\n\nInstead of providing a wrapper on top of existing projects that will fall out of date, Picturebook lets you retain control of the Storybook and Nightwatch packages.\n\nThis project aims to provide utility methods to simplify [Storybook](https://storybook.js.org/), [SauceLabs](https://saucelabs.com/) and [Nightwatch](http://nightwatchjs.org/) configuration and screenshot comparison. Specifically:\n\n- **Creation of storybook stories**: They are created based on your file system structure\n- **Saucelabs tunnel setup**: Reduce SauceConnect config to the tunnel id and username / accessKey\n- **Screenshot**: Take screenshots of every story on different browsers using SauceLabs and Nightwatch\n- **Image Comparison**: Compare and update screenshots to baselines collocated with your stories.\n\n## ⚙️ Install\n\n1. You will need a SauceLabs account. If you don't have one you can sign up for a trial [here](https://signup.saucelabs.com/signup/trial) or request a free one for open source projects [here](https://saucelabs.com/open-source-request-account).\n1. If you want to run tests against Safari and IE11 from localhost, add `localtest.dev 127.0.0.1` to your `/etc/hosts` (the exact steps may vary depending on your platform, see [here](https://www.howtogeek.com/howto/27350/beginner-geek-how-to-edit-your-hosts-file/) for more details).\n1. Add picturebook and its peer dependencies:\n\n```sh\nyarn add --dev picturebook @storybook/react nightwatch react\n```\n\nIf you don't have Storybook set it up yet, follow [these instructions](https://storybook.js.org/basics/quick-start-guide/) first.\n\nSome of Picturebook utility methods rely on the output of `require.context`. This is a webpack construct and it's not available in Node or test environments. There are multiple ways to mock it. If you are using babel you could add the [require-context-hook](https://github.com/smrq/babel-plugin-require-context-hook) plugin. For instance, if you want to enable it only for tests, you can do something like:\n\n```json\n{\n  \"env\": {\n    \"test\": {\n      \"plugins\": [\"require-context-hook\"]\n    }\n  }\n}\n```\n\nand on your test setup:\n\n```js\nrequire('babel-plugin-require-context-hook/register')()\n```\n\nAlternatively, there's also the [require-context](https://www.npmjs.com/package/require-context) npm package that will also emulate webpack's `require.context`.\n\n## 📚 API\n\nThe API can be split into 2 sections, storybook creation for finding files in the file system and creating storybook stories around them and storybook testing, to connect to SauceLabs and run cross-browser image comparison tests.\n\n### Storybook creation\n\n`getFiles` and `loadStories` have very similar APIs and output.\n\n`getFiles` allows you to retrieve a list of related files. For instance if you have:\n\n```sh\nfile1.js\nfile1.md\nfile2.png\nfile2.js\n```\n\nIt will provide an array of 2 elements (file1 and file2) with the different related files grouped.\n\nThese values are used to identify helper files for stories where `*.md` is understood to be documentation,`.*(spec|test).js` is a test file and an unprefixed `*.js` file is a story. The `flattenFolders` parameters allow grouping nested folders as well. For instance if `flattenFolders: ['a']` `file1.js` and `a/file1.png` will be grouped together.\n\n`loadStories` provide the same functionality than `getFiles` but it also loads and creates storybook stories. This is why it requires storybook's [storiesOf](https://storybook.js.org/basics/writing-stories/#writing-stories) method as a parameter. The response is also similar but it includes a `main` method with the loaded story.\n\nYou can find the exact APIs below:\n\n```js\ntype Options = {|\n  baseUrl?: string,              // The url for the story, defaults to:\n                                 //   'http://localhost:6006'\n  flattenFolders?: Array<string> // Folders to flatten\n                                 //   defaults to ['__snapshots__', '__screenshots__']\n  stories: any,                  // Output of require context with the stories\n|}\n\ntype StoryPaths = {|\n  name: string,\n  parents: $ReadOnlyArray<string>,\n  title: string,\n  path: string,\n  screenshots: {|\n    [extension: string]: string,\n  |},\n  tests: {|\n    [extension: string]: string,\n  |},\n  doc: ?string,\n  url: ?string,\n|}\n\n// Retrieve and group the different stories based on their filenames\nfunction getFiles(options: Options): Array<StoryPaths>\n\n// Retrieve, group, load and create stories\nfunction loadStories(options: Options & {|\n  decorators: $ReadOnlyArray<Function>,\n  storiesOf: any,\n  storyFiles: $ReadOnlyArray<string>,\n|}): Array<StoryPaths & {|\n  main: () => React.Node,\n|}>\n```\n\n### Storybook testing\n\nOnce stories are loaded, `runTests` will connect to SauceLabs (optionally through a SauceConnect tunnel) and return a Promise that includes the results of the test.\n\nSince it uses `nightwatch` under the hood, you must have a valid nightwatch instance running. To assist with it, `nightwatchConfig` provides defaultValues\n\n```js\ntype Status = 'CREATED' | 'SUCCESS' | 'FAILED'\ntype ImgResults = {|\n    browser: string,\n    diffPath: ?string,\n    diffThreshold: number,\n    error: ?string,\n    name: string,\n    platform: string,\n    referencePath: ?string,\n    screenshotPath: ?string,\n    status: Status,\n  |}\n\n// Invoke nightwatch and run image comparison in SauceLabs\nfunction runTests(options: {|\n  configPath: string,           // absolute path to nightwatch config\n  files: Array<StoryPaths>,     // output of getFiles()\n  overwrite: boolean,           // true to replace failing or missing images\n  storyRoot: string,            // absolute path to the stories\n  tunnelId?: string,            // if set, it will set up a SC tunnel with the id\n  outputPath?: string,          // if set, where to store the test results as a\n                                // json file matching the return of `runTests`\n|}): Promise<{|\n  error: Error | null,          // null if there were no exceptions during tests\n  results: Array<ImgResults>,   // per browser / platform / story results\n  // An overall summary status. If any tests failed, it's FAILED, if any tests\n  // where created or updated it's CREATED, if all tests succeeded it's SUCCESS\n  // if no tests ran, it's EMPTY\n  status: Status | 'EMPTY',\n  counts: {|                    // counts for all tests\n    CREATED: number,\n    SUCCESS: number,\n    FAILED: number,\n  |},\n  version: string,              // picturebook version used\n  date: string,                 // ISO date when was the test report created\n|}>\n\n// Nightwatch config generation helper\nfunction nightwatchConfig(options: {|\n  desiredCapabilities?: {},     // nightwatch desired capabilities object\n  files: Array<StoryPaths>,     // output of getFiles()\n  username: string,             // SauceLabs username\n  access_key: string,           // SauceLabs accessKey\n  browsers?: {                  // List of browsers to test. Default list\n                                //   includes chrome, firefox, edge, ie11,\n                                //   iphone7 and safari but any valid SauceLabs\n                                //   config is valid\n    [browserName: string]: {\n      desiredCapabilities: {\n        platform: string,\n        version: string,\n        browserName: string,\n        screenResolution: string,\n      },\n      custom_vars: {|           // Custom properties required per browser config:\n        name: string,           // Must match \"browserName\"\n        platform: string,       // \"mobile\" | \"desktop\" but any string is allowed\n        extract?: {|            // If cropping the output, specify crop dimensions\n          top: number,\n          left: number,\n          width: number,\n          height: number,\n        |},\n      |},\n    },\n  },\n  // Alias for browsers where localhost cannot be accessed from a tunnel,\n  // defaults to \"localtest.dev\"\n  localhostAlias?: string,\n  // List of browsers that can't access localhost from a tunnel, defaults to:\n  // [\"ie11\", \"safari\"]\n  localhostAliasBrowsers?: Array<string>,\n  proxy?: {},                   // Nightwatch proxy object\n|}): Object\n```\n\n## 🎪 Sample App\n\nThis project includes a sample app to demo the behavior. You can view it running `yarn start` and opening `localhost:6006` on your browser.\n\nTo run the image comparison tests, keep `yarn start` running and call `SAUCE_ACCESS_KEY={YOUR_ACCESS_KEY} SAUCE_USERNAME={YOUR_USERNAME} yarn test:app`.\n\n## ️✏️ Storybook Usage\n\nTo take advantage of the automated storybook folder config (and testing) modify your storybook `config.js` to look like this:\n\n```js\nimport { storiesOf, configure } from '@storybook/react'\nimport * as picturebook from 'picturebook'\n\nfunction loadStories() {\n  picturebook.loadStories({\n    storiesOf,\n    stories: require.context('../stories', true, /\\.(js|md|png)/),\n  })\n}\n\nconfigure(loadStories, module)\n```\n\nIf you want to see a more advanced use case on how to use it with decorators and other plugins, check out the [sample project](./sampleFolder/.storybook/config.js).\n\n## 📸 Screenshot Usage\n\nTo take screenshots, picturebook relies on nightwatch. With the exception of a few required fields, configuration is generated for you. To take advantage of it you should create a `nightwatch.conf.js` file on your root (or customize it following instructions [here](http://nightwatchjs.org/gettingstarted#settings-file)).\n\n```js\nconst { resolve } = require('path')\nconst { nightwatchConfig, getFiles } = require('picturebook')\nconst requireContext = require('require-context')\n\nconst config = nightwatchConfig({\n  username: process.env.SAUCE_USERNAME,\n  access_key: process.env.SAUCE_ACCESS_KEY,\n  files: getFiles({\n    baseUrl: 'http://localhost:6006',\n    stories: requireContext(resolve(__dirname, './stories'), true, /\\.js/),\n  }),\n  desiredCapabilities: {\n    build: 'local',\n    'tunnel-identifier': 'picturebook-sample',\n  },\n})\n\nmodule.exports = config\n```\n\nTo take screenshots and run image comparison, you can call:\n\n```js\nrunTests({\n  storyRoot,\n  files: getFiles({\n    stories: requireContext(storyRoot, true, /\\.(js|png)/),\n  }),\n  overwrite,\n  tunnelId: 'picturebook-sample',\n  configPath: resolve(__dirname, 'nightwatch.conf.js'),\n})\n```\n\nNote that if using a tunnel, `tunnel-identifier` on your nightwatch config must match the `tunnelId` parameter passed to `runTests`.\n\n## 🙋 QYMA (Questions you may ask)\n\n### Why do I need to add localtest.dev as a localhost alias?\n\nThis is a SauceLabs issue. To work around it, `safari` and `edge` browsers replace `localhost` from urls to `localtest.dev` as described [here](https://support.saucelabs.com/hc/en-us/articles/225106887-Safari-and-Internet-Explorer-Won-t-Load-Website-When-Using-Sauce-Connect-on-Localhost).\n\nYou can customize the target browsers and localhost alias with the `localhostAliasBrowsers` and `localhostAlias`, respectively.\n\n### How do you skip some files?\n\nPicturebook will only take screenshots of the files you tell it exists. You can filter the output from [require.context](https://webpack.js.org/guides/dependency-management/#require-context) by specifying a different regExp to filter by.\n\n### SauceConnect ENOENT error\n\nIf you see the following error after a couple unsuccessful runs of SauceConnect:\n\n```sh\nevents.js:167\n      throw er; // Unhandled 'error' event\n      ^\n\nError: spawn ~/picturebook/node_modules/node-sauce-connect/lib/sc ENOENT\n```\n\nSometimes it gets stuck. Try cleaning `node_modules` and re-running yarn:\n\n```sh\nrm -rf node_modules\nyarn\n```\n\n### Error retrieving a new session from the selenium server\n\nThis is a Nightwatch issue, addressed in 1.0.4 versions of Nightwatch and later as per [this issue](https://github.com/nightwatchjs/nightwatch/issues/1772).\n\n### node-dir \"cannot read property 'files' of undefined\" error\n\nThere's currently a [bug in node-dir](https://github.com/fshost/node-dir/issues/53) that fails on empty dirs.\n\nRemove empty folders within your stories if you see the following error:\n\n```sh\nyourProject/node_modules/node-dir/lib/paths.js:92\n                results.files = results.files.concat(res.files);\n                                                         ^\n\nTypeError: Cannot read property 'files' of undefined\n    at subloop (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:92:58)\n    at /Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:107:13\n    at onDirRead (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:139:35)\n    at onStat (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:154:14)\n```\n\nYou can do so with:\n\n```sh\nfind /some/path -depth -type d -exec rmdir {} \\;\n```\n","readmeFilename":"README.md","gitHead":"5a1f97b96ccfce829e748fc222d0557c575ad6fe","bugs":{"url":"https://github.com/obartra/picturebook/issues"},"homepage":"https://github.com/obartra/picturebook#readme","_id":"picturebook@2.0.0-beta.9","_npmVersion":"6.1.0","_nodeVersion":"10.6.0","_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"dist":{"integrity":"sha512-kdf/tLrAUzVITrPgxsKEmx3u/7w2K/qc4q9S+aklL7yBRjSfTm5txyt7Q33UVRUwhenVIqaMTQeDIUUQ6bBpPg==","shasum":"37b54d11951739cc88edf74d7261443d3f32d7e9","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-2.0.0-beta.9.tgz","fileCount":171,"unpackedSize":5378348,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbqU3gCRA9TVsSAnZWagAAb5UP/0AfVTJauBvXcQjT0uX+\nhekQDoFMUe0axI5E1aGTQWFsqFrgixFFeO0mBl4zQDnIPIIoBp/z4164BGgw\nls6wCE/blWtZl6ryqXnFsCwLaqBo7738cEMldl5ah6RYdas84Th+K38jD5P6\nt2vBvz2s3zlveFyT4ZcvzR2HuE79KNh6n42KekjFmrtSdJUqdnI61oXDxppx\nmF0DjMyyh9zf1PhlEY0EsXR3yTWgNdEGyunAKN2mueY+f346BRKFL3xuhaev\nrr5u60PbtKUTEnki/G//ncQZz11pyoG9ynTkIHfLJs0R11LtT4Fn2ham3+/5\nXXTizRTVMeLDsEhvbPCZQHx1EmCuLBi16Zi5avd391WkpNmlW9AjqQJrBdUV\nL7wel44Sz4ilqRE+fddF+SZdHfqFWSbt+pfSwJyqpDHdyi57CpccWLWdm6uN\nFKYbWrOCbZVxh9EKhCyXV4jY9jLkY+BcU+FPvnX0uUPsVd1ESr52MJXgCAlu\nX8M9kYoeDSQ8JRDun0dnZY6+hK1pxpTjgmRzz7iUqs/U8f5UZeSzsiSyr/pq\nICvWhKBplczxSzzm+kFMxcYqEvZj1rCWykkNujQzAHkygK6DpNjfL0u0FbJt\n8zPHGf8TobbB2JmzthO66ipQud9W8soyoBNMhgHlLReW5I5ZUljrdWe/DzX5\nhKHi\r\n=R/YN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCmEqOzCIAelgMahRh6UI8UFapW0VQMWGDGnY2jUcrwYQIgR6fVX6LNIErlbbRtSCs/X0Shqkk35GGSnpuipGk+qcY="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook_2.0.0-beta.9_1537822175965_0.0915235931862517"},"_hasShrinkwrap":false},"2.0.0-beta.10":{"name":"picturebook","version":"2.0.0-beta.10","description":"Opinionated Storybook Setup","main":"dist/index.js","browser":"dist/picturebook.web.js","repository":{"type":"git","url":"git+https://github.com/obartra/picturebook.git"},"author":{"name":"Oscar Bartra"},"license":"MIT","scripts":{"format":"prettier --write \"{{src,test,sampleFolder}/**/,}*.js\"","test":"jest","lint":"eslint --ext .js --cache .","build":"webpack --mode production --config webpack.build.config.js && babel src -d dist --copy-files","build:watch":"yarn build --watch","test:watch":"yarn test --watch","start":"yarn && yarn build && cd sampleFolder && yarn && yarn start","test:app":"cd sampleFolder && yarn test --env chrome,firefox,ie11,edge,safari,iphone7","update-deps":"yarn upgrade --exact --latest && cd sampleFolder && yarn upgrade --exact --latest && cd .. && yarn ci","ci":"yarn build && yarn lint && yarn flow check && yarn test"},"dependencies":{"fs-extra":"7.0.0","lodash":"4.17.11","node-sauce-connect":"4.5.0","pixelmatch":"4.0.2","png-crop":"0.0.2","pngjs":"3.3.3","rimraf":"2.6.2","selenium-download":"2.0.13","selenium-server-standalone-jar":"3.14.0"},"devDependencies":{"@babel/cli":"7.1.0","@babel/core":"7.1.0","@babel/plugin-proposal-object-rest-spread":"7.0.0","@babel/plugin-transform-regenerator":"7.0.0","@babel/plugin-transform-runtime":"7.1.0","@babel/preset-env":"7.1.0","@babel/preset-flow":"7.0.0","@babel/preset-react":"7.0.0","@babel/runtime":"7.0.0","@storybook/react":"3.4.11","babel-core":"7.0.0-bridge.0","babel-eslint":"9.0.0","babel-jest":"23.6.0","babel-loader":"8.0.2","babel-plugin-require-context-hook":"1.0.0","clean-webpack-plugin":"0.1.19","eslint":"5.6.0","eslint-config-airbnb":"17.1.0","eslint-config-prettier":"3.1.0","eslint-plugin-flowtype":"2.50.1","eslint-plugin-import":"2.14.0","eslint-plugin-jest":"21.22.1","eslint-plugin-jsx-a11y":"6.1.1","eslint-plugin-prettier":"2.6.2","eslint-plugin-promise":"4.0.1","eslint-plugin-react":"7.11.1","flow-bin":"0.81.0","jest":"23.6.0","prettier":"1.14.3","react":"16.5.2","react-dom":"16.5.2","webpack":"4.20.1","webpack-cli":"3.1.1"},"peerDependencies":{"nightwatch":">=0.9.x","react":">= 15.x","react-dom":">= 15.x"},"readme":"# 🤖📗 PictureBook\n\nAutomated React Storybook Setup\n\nSimplify React Storybook story creation and cross-browser image comparison testing\n\n## 💡 Rationale\n\nSetting up storybook and implement cross-browser image comparison testing on multiple projects is time consuming.\n\nInstead of providing a wrapper on top of existing projects that will fall out of date, Picturebook lets you retain control of the Storybook and Nightwatch packages.\n\nThis project aims to provide utility methods to simplify [Storybook](https://storybook.js.org/), [SauceLabs](https://saucelabs.com/) and [Nightwatch](http://nightwatchjs.org/) configuration and screenshot comparison. Specifically:\n\n- **Creation of storybook stories**: They are created based on your file system structure\n- **Saucelabs tunnel setup**: Reduce SauceConnect config to the tunnel id and username / accessKey\n- **Screenshot**: Take screenshots of every story on different browsers using SauceLabs and Nightwatch\n- **Image Comparison**: Compare and update screenshots to baselines collocated with your stories.\n\n## ⚙️ Install\n\n1. You will need a SauceLabs account. If you don't have one you can sign up for a trial [here](https://signup.saucelabs.com/signup/trial) or request a free one for open source projects [here](https://saucelabs.com/open-source-request-account).\n1. If you want to run tests against Safari and IE11 from localhost, add `localtest.dev 127.0.0.1` to your `/etc/hosts` (the exact steps may vary depending on your platform, see [here](https://www.howtogeek.com/howto/27350/beginner-geek-how-to-edit-your-hosts-file/) for more details).\n1. Add picturebook and its peer dependencies:\n\n```sh\nyarn add --dev picturebook @storybook/react nightwatch react\n```\n\nIf you don't have Storybook set it up yet, follow [these instructions](https://storybook.js.org/basics/quick-start-guide/) first.\n\nSome of Picturebook utility methods rely on the output of `require.context`. This is a webpack construct and it's not available in Node or test environments. There are multiple ways to mock it. If you are using babel you could add the [require-context-hook](https://github.com/smrq/babel-plugin-require-context-hook) plugin. For instance, if you want to enable it only for tests, you can do something like:\n\n```json\n{\n  \"env\": {\n    \"test\": {\n      \"plugins\": [\"require-context-hook\"]\n    }\n  }\n}\n```\n\nand on your test setup:\n\n```js\nrequire('babel-plugin-require-context-hook/register')()\n```\n\nAlternatively, there's also the [require-context](https://www.npmjs.com/package/require-context) npm package that will also emulate webpack's `require.context`.\n\n## 📚 API\n\nThe API can be split into 2 sections, storybook creation for finding files in the file system and creating storybook stories around them and storybook testing, to connect to SauceLabs and run cross-browser image comparison tests.\n\n### Storybook creation\n\n`getFiles` and `loadStories` have very similar APIs and output.\n\n`getFiles` allows you to retrieve a list of related files. For instance if you have:\n\n```sh\nfile1.js\nfile1.md\nfile2.png\nfile2.js\n```\n\nIt will provide an array of 2 elements (file1 and file2) with the different related files grouped.\n\nThese values are used to identify helper files for stories where `*.md` is understood to be documentation,`.*(spec|test).js` is a test file and an unprefixed `*.js` file is a story. The `flattenFolders` parameters allow grouping nested folders as well. For instance if `flattenFolders: ['a']` `file1.js` and `a/file1.png` will be grouped together.\n\n`loadStories` provide the same functionality than `getFiles` but it also loads and creates storybook stories. This is why it requires storybook's [storiesOf](https://storybook.js.org/basics/writing-stories/#writing-stories) method as a parameter. The response is also similar but it includes a `main` method with the loaded story.\n\nYou can find the exact APIs below:\n\n```js\ntype Options = {|\n  baseUrl?: string,              // The url for the story, defaults to:\n                                 //   'http://localhost:6006'\n  flattenFolders?: Array<string> // Folders to flatten\n                                 //   defaults to ['__snapshots__', '__screenshots__']\n  stories: any,                  // Output of require context with the stories\n|}\n\ntype StoryPaths = {|\n  name: string,\n  parents: $ReadOnlyArray<string>,\n  title: string,\n  path: string,\n  screenshots: {|\n    [extension: string]: string,\n  |},\n  tests: {|\n    [extension: string]: string,\n  |},\n  doc: ?string,\n  url: ?string,\n|}\n\n// Retrieve and group the different stories based on their filenames\nfunction getFiles(options: Options): Array<StoryPaths>\n\n// Retrieve, group, load and create stories\nfunction loadStories(options: Options & {|\n  decorators: $ReadOnlyArray<Function>,\n  storiesOf: any,\n  storyFiles: $ReadOnlyArray<string>,\n|}): Array<StoryPaths & {|\n  main: () => React.Node,\n|}>\n```\n\n### Storybook testing\n\nOnce stories are loaded, `runTests` will connect to SauceLabs (optionally through a SauceConnect tunnel) and return a Promise that includes the results of the test.\n\nSince it uses `nightwatch` under the hood, you must have a valid nightwatch instance running. To assist with it, `nightwatchConfig` provides defaultValues\n\n```js\ntype Status = 'CREATED' | 'SUCCESS' | 'FAILED'\ntype ImgResults = {|\n    browser: string,\n    diffPath: ?string,\n    diffThreshold: number,\n    error: ?string,\n    name: string,\n    platform: string,\n    referencePath: ?string,\n    screenshotPath: ?string,\n    status: Status,\n  |}\n\n// Invoke nightwatch and run image comparison in SauceLabs\nfunction runTests(options: {|\n  configPath: string,           // absolute path to nightwatch config\n  files: Array<StoryPaths>,     // output of getFiles()\n  overwrite: boolean,           // true to replace failing or missing images\n  storyRoot: string,            // absolute path to the stories\n  tunnelId?: string,            // if set, it will set up a SC tunnel with the id\n  outputPath?: string,          // if set, where to store the test results as a\n                                // json file matching the return of `runTests`\n|}): Promise<{|\n  error: Error | null,          // null if there were no exceptions during tests\n  results: Array<ImgResults>,   // per browser / platform / story results\n  // An overall summary status. If any tests failed, it's FAILED, if any tests\n  // where created or updated it's CREATED, if all tests succeeded it's SUCCESS\n  // if no tests ran, it's EMPTY\n  status: Status | 'EMPTY',\n  counts: {|                    // counts for all tests\n    CREATED: number,\n    SUCCESS: number,\n    FAILED: number,\n  |},\n  version: string,              // picturebook version used\n  date: string,                 // ISO date when was the test report created\n|}>\n\n// Nightwatch config generation helper\nfunction nightwatchConfig(options: {|\n  desiredCapabilities?: {},     // nightwatch desired capabilities object\n  files: Array<StoryPaths>,     // output of getFiles()\n  username: string,             // SauceLabs username\n  access_key: string,           // SauceLabs accessKey\n  browsers?: {                  // List of browsers to test. Default list\n                                //   includes chrome, firefox, edge, ie11,\n                                //   iphone7 and safari but any valid SauceLabs\n                                //   config is valid\n    [browserName: string]: {\n      desiredCapabilities: {\n        platform: string,\n        version: string,\n        browserName: string,\n        screenResolution: string,\n      },\n      custom_vars: {|           // Custom properties required per browser config:\n        name: string,           // Must match \"browserName\"\n        platform: string,       // \"mobile\" | \"desktop\" but any string is allowed\n        extract?: {|            // If cropping the output, specify crop dimensions\n          top: number,\n          left: number,\n          width: number,\n          height: number,\n        |},\n      |},\n    },\n  },\n  // Alias for browsers where localhost cannot be accessed from a tunnel,\n  // defaults to \"localtest.dev\"\n  localhostAlias?: string,\n  // List of browsers that can't access localhost from a tunnel, defaults to:\n  // [\"ie11\", \"safari\"]\n  localhostAliasBrowsers?: Array<string>,\n  proxy?: {},                   // Nightwatch proxy object\n|}): Object\n```\n\n## 🎪 Sample App\n\nThis project includes a sample app to demo the behavior. You can view it running `yarn start` and opening `localhost:6006` on your browser.\n\nTo run the image comparison tests, keep `yarn start` running and call `SAUCE_ACCESS_KEY={YOUR_ACCESS_KEY} SAUCE_USERNAME={YOUR_USERNAME} yarn test:app`.\n\n## ️✏️ Storybook Usage\n\nTo take advantage of the automated storybook folder config (and testing) modify your storybook `config.js` to look like this:\n\n```js\nimport { storiesOf, configure } from '@storybook/react'\nimport * as picturebook from 'picturebook'\n\nfunction loadStories() {\n  picturebook.loadStories({\n    storiesOf,\n    stories: require.context('../stories', true, /\\.(js|md|png)/),\n  })\n}\n\nconfigure(loadStories, module)\n```\n\nIf you want to see a more advanced use case on how to use it with decorators and other plugins, check out the [sample project](./sampleFolder/.storybook/config.js).\n\n## 📸 Screenshot Usage\n\nTo take screenshots, picturebook relies on nightwatch. With the exception of a few required fields, configuration is generated for you. To take advantage of it you should create a `nightwatch.conf.js` file on your root (or customize it following instructions [here](http://nightwatchjs.org/gettingstarted#settings-file)).\n\n```js\nconst { resolve } = require('path')\nconst { nightwatchConfig, getFiles } = require('picturebook')\nconst requireContext = require('require-context')\n\nconst config = nightwatchConfig({\n  username: process.env.SAUCE_USERNAME,\n  access_key: process.env.SAUCE_ACCESS_KEY,\n  files: getFiles({\n    baseUrl: 'http://localhost:6006',\n    stories: requireContext(resolve(__dirname, './stories'), true, /\\.js/),\n  }),\n  desiredCapabilities: {\n    build: 'local',\n    'tunnel-identifier': 'picturebook-sample',\n  },\n})\n\nmodule.exports = config\n```\n\nTo take screenshots and run image comparison, you can call:\n\n```js\nrunTests({\n  storyRoot,\n  files: getFiles({\n    stories: requireContext(storyRoot, true, /\\.(js|png)/),\n  }),\n  overwrite,\n  tunnelId: 'picturebook-sample',\n  configPath: resolve(__dirname, 'nightwatch.conf.js'),\n})\n```\n\nNote that if using a tunnel, `tunnel-identifier` on your nightwatch config must match the `tunnelId` parameter passed to `runTests`.\n\n## 🙋 QYMA (Questions you may ask)\n\n### Why do I need to add localtest.dev as a localhost alias?\n\nThis is a SauceLabs issue. To work around it, `safari` and `edge` browsers replace `localhost` from urls to `localtest.dev` as described [here](https://support.saucelabs.com/hc/en-us/articles/225106887-Safari-and-Internet-Explorer-Won-t-Load-Website-When-Using-Sauce-Connect-on-Localhost).\n\nYou can customize the target browsers and localhost alias with the `localhostAliasBrowsers` and `localhostAlias`, respectively.\n\n### How do you skip some files?\n\nPicturebook will only take screenshots of the files you tell it exists. You can filter the output from [require.context](https://webpack.js.org/guides/dependency-management/#require-context) by specifying a different regExp to filter by.\n\n### SauceConnect ENOENT error\n\nIf you see the following error after a couple unsuccessful runs of SauceConnect:\n\n```sh\nevents.js:167\n      throw er; // Unhandled 'error' event\n      ^\n\nError: spawn ~/picturebook/node_modules/node-sauce-connect/lib/sc ENOENT\n```\n\nSometimes it gets stuck. Try cleaning `node_modules` and re-running yarn:\n\n```sh\nrm -rf node_modules\nyarn\n```\n\n### Error retrieving a new session from the selenium server\n\nThis is a Nightwatch issue, addressed in 1.0.4 versions of Nightwatch and later as per [this issue](https://github.com/nightwatchjs/nightwatch/issues/1772).\n\n### node-dir \"cannot read property 'files' of undefined\" error\n\nThere's currently a [bug in node-dir](https://github.com/fshost/node-dir/issues/53) that fails on empty dirs.\n\nRemove empty folders within your stories if you see the following error:\n\n```sh\nyourProject/node_modules/node-dir/lib/paths.js:92\n                results.files = results.files.concat(res.files);\n                                                         ^\n\nTypeError: Cannot read property 'files' of undefined\n    at subloop (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:92:58)\n    at /Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:107:13\n    at onDirRead (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:139:35)\n    at onStat (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:154:14)\n```\n\nYou can do so with:\n\n```sh\nfind /some/path -depth -type d -exec rmdir {} \\;\n```\n","readmeFilename":"README.md","gitHead":"cc8b097c1e9dd9b7290334ac930e55413a1708d6","bugs":{"url":"https://github.com/obartra/picturebook/issues"},"homepage":"https://github.com/obartra/picturebook#readme","_id":"picturebook@2.0.0-beta.10","_npmVersion":"6.1.0","_nodeVersion":"10.6.0","_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"dist":{"integrity":"sha512-8E+xwxBEzTk/FjEr4qH6SFYLibldsVzuMNUzqEeyf3SkCPDTyIsh9I7FsS4pwvrQmejJhVNFLBN0WiaP2x8ihA==","shasum":"3f9f8069b7cc877bc07120dc3f1588bc2e5014c5","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-2.0.0-beta.10.tgz","fileCount":165,"unpackedSize":4889685,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbqk2XCRA9TVsSAnZWagAAW2QP/2Oq17wix5ixz7SJcDwk\ncggmgkNP5qAcfvaObD2gt+ZIeiNnlu24aHGntqNcHJJs09l40mAaOihX0WQ/\nwGvG/NSGwdOcb/wyNKaXGipUF5flBIg79RGWMM/mhK34aETY2RbV6D37wfWb\nGpP8Q88WUS2i7uKghNmnooerJJ3QeDB/vIAxEKgdCstU+NpCeMI46tnOr8TY\nRxCXlBwQg4aIjZTNwntDl8DXlHCaHjMT+ZyyL2lFWBL1wZJwg9YwsBcsBxGu\nap3ZyyIOXz638+oXfXL54+AZ1cJo3fK9h+py1HzbtlKR7RXymxY4Yws+cpGg\nxyM+qIDpcf7Eknb/dKeNLw+EexBFihO9jFl61uX58Ajr+ePLKfhHo9rd2OBY\nt9varVqJXG5y1hPXpMp5RcSWVdNIXL3ziy48O9D5q1TBAIzpWgYUYzGKWOuE\nArnvTH74oEpvMW2eouLZ68ydTvCN3DpUyHkbUM2ethMnuCWjk2WG/De7LxT3\n32abPW9vG7De4bMQFHap+a1c1EyzCBQaqStawmhsa2wz2XASsTWx7Zwv2yM/\nBtIvK1QyDvecy3giUq0IkVm2ppWrbN4zXb7jhZ2Zy3LR8qcHskbRjGs5PoeZ\nGwsuxi8JhVQDHWYqvFnu+gshIMxIwbhki/tRM1I3VaQ/Kd01x+DH0TpUgdMj\n/cc9\r\n=DsID\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFAgDVKbVEhAJ1oOkRrNObWl4ENXvh0KifTe68WZbsPfAiAsoLNPLYy3OJ81JthnFPntoCTA19izhXCYxt82izE8Og=="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook_2.0.0-beta.10_1537887638611_0.34147483228251496"},"_hasShrinkwrap":false},"2.0.0-beta.11":{"name":"picturebook","version":"2.0.0-beta.11","description":"Opinionated Storybook Setup","main":"dist/index.js","browser":"dist/picturebook.web.js","repository":{"type":"git","url":"git+https://github.com/obartra/picturebook.git"},"author":{"name":"Oscar Bartra"},"license":"MIT","scripts":{"format":"prettier --write \"{{src,test,sampleFolder}/**/,}*.js\"","test":"jest","lint":"eslint --ext .js --cache .","build":"webpack --mode production --config webpack.build.config.js && babel src -d dist --copy-files","build:watch":"yarn build --watch","test:watch":"yarn test --watch","start":"yarn && yarn build && cd sampleFolder && yarn && yarn start","test:app":"cd sampleFolder && yarn test --env chrome,firefox,ie11,edge,safari,iphone7","update-deps":"yarn upgrade --exact --latest && cd sampleFolder && yarn upgrade --exact --latest && cd .. && yarn ci","ci":"yarn build && yarn lint && yarn flow check && yarn test"},"dependencies":{"fs-extra":"7.0.0","lodash":"4.17.11","node-sauce-connect":"4.5.0","pixelmatch":"4.0.2","png-crop":"0.0.2","pngjs":"3.3.3","rimraf":"2.6.2","selenium-download":"2.0.13","selenium-server-standalone-jar":"3.14.0"},"devDependencies":{"@babel/cli":"7.1.0","@babel/core":"7.1.0","@babel/plugin-proposal-object-rest-spread":"7.0.0","@babel/plugin-transform-regenerator":"7.0.0","@babel/plugin-transform-runtime":"7.1.0","@babel/preset-env":"7.1.0","@babel/preset-flow":"7.0.0","@babel/preset-react":"7.0.0","@babel/runtime":"7.0.0","@storybook/react":"3.4.11","babel-core":"7.0.0-bridge.0","babel-eslint":"9.0.0","babel-jest":"23.6.0","babel-loader":"8.0.2","babel-plugin-require-context-hook":"1.0.0","clean-webpack-plugin":"0.1.19","eslint":"5.6.0","eslint-config-airbnb":"17.1.0","eslint-config-prettier":"3.1.0","eslint-plugin-flowtype":"2.50.1","eslint-plugin-import":"2.14.0","eslint-plugin-jest":"21.22.1","eslint-plugin-jsx-a11y":"6.1.1","eslint-plugin-prettier":"2.6.2","eslint-plugin-promise":"4.0.1","eslint-plugin-react":"7.11.1","flow-bin":"0.81.0","jest":"23.6.0","prettier":"1.14.3","react":"16.5.2","react-dom":"16.5.2","webpack":"4.20.1","webpack-cli":"3.1.1"},"peerDependencies":{"nightwatch":">=0.9.x","react":">= 15.x","react-dom":">= 15.x"},"readme":"# 🤖📗 PictureBook\n\nAutomated React Storybook Setup\n\nSimplify React Storybook story creation and cross-browser image comparison testing\n\n## 💡 Rationale\n\nSetting up storybook and implement cross-browser image comparison testing on multiple projects is time consuming.\n\nInstead of providing a wrapper on top of existing projects that will fall out of date, Picturebook lets you retain control of the Storybook and Nightwatch packages.\n\nThis project aims to provide utility methods to simplify [Storybook](https://storybook.js.org/), [SauceLabs](https://saucelabs.com/) and [Nightwatch](http://nightwatchjs.org/) configuration and screenshot comparison. Specifically:\n\n- **Creation of storybook stories**: They are created based on your file system structure\n- **Saucelabs tunnel setup**: Reduce SauceConnect config to the tunnel id and username / accessKey\n- **Screenshot**: Take screenshots of every story on different browsers using SauceLabs and Nightwatch\n- **Image Comparison**: Compare and update screenshots to baselines collocated with your stories.\n\n## ⚙️ Install\n\n1. You will need a SauceLabs account. If you don't have one you can sign up for a trial [here](https://signup.saucelabs.com/signup/trial) or request a free one for open source projects [here](https://saucelabs.com/open-source-request-account).\n1. If you want to run tests against Safari and IE11 from localhost, add `localtest.dev 127.0.0.1` to your `/etc/hosts` (the exact steps may vary depending on your platform, see [here](https://www.howtogeek.com/howto/27350/beginner-geek-how-to-edit-your-hosts-file/) for more details).\n1. Add picturebook and its peer dependencies:\n\n```sh\nyarn add --dev picturebook @storybook/react nightwatch react\n```\n\nIf you don't have Storybook set it up yet, follow [these instructions](https://storybook.js.org/basics/quick-start-guide/) first.\n\nSome of Picturebook utility methods rely on the output of `require.context`. This is a webpack construct and it's not available in Node or test environments. There are multiple ways to mock it. If you are using babel you could add the [require-context-hook](https://github.com/smrq/babel-plugin-require-context-hook) plugin. For instance, if you want to enable it only for tests, you can do something like:\n\n```json\n{\n  \"env\": {\n    \"test\": {\n      \"plugins\": [\"require-context-hook\"]\n    }\n  }\n}\n```\n\nand on your test setup:\n\n```js\nrequire('babel-plugin-require-context-hook/register')()\n```\n\nAlternatively, there's also the [require-context](https://www.npmjs.com/package/require-context) npm package that will also emulate webpack's `require.context`.\n\n## 📚 API\n\nThe API can be split into 2 sections, storybook creation for finding files in the file system and creating storybook stories around them and storybook testing, to connect to SauceLabs and run cross-browser image comparison tests.\n\n### Storybook creation\n\n`getFiles` and `loadStories` have very similar APIs and output.\n\n`getFiles` allows you to retrieve a list of related files. For instance if you have:\n\n```sh\nfile1.js\nfile1.md\nfile2.png\nfile2.js\n```\n\nIt will provide an array of 2 elements (file1 and file2) with the different related files grouped.\n\nThese values are used to identify helper files for stories where `*.md` is understood to be documentation,`.*(spec|test).js` is a test file and an unprefixed `*.js` file is a story. The `flattenFolders` parameters allow grouping nested folders as well. For instance if `flattenFolders: ['a']` `file1.js` and `a/file1.png` will be grouped together.\n\n`loadStories` provide the same functionality than `getFiles` but it also loads and creates storybook stories. This is why it requires storybook's [storiesOf](https://storybook.js.org/basics/writing-stories/#writing-stories) method as a parameter. The response is also similar but it includes a `main` method with the loaded story.\n\nYou can find the exact APIs below:\n\n```js\ntype StoryPaths = {|\n  name: string,\n  parents: $ReadOnlyArray<string>,\n  title: string,\n  path: string,\n  screenshots: {|\n    [extension: string]: string,\n  |},\n  tests: {|\n    [extension: string]: string,\n  |},\n  doc: ?string,\n  url: ?string,\n|}\n\n// Retrieve and group the different stories based on their filenames\nfunction getFiles({|\n  baseUrl?: string,              // The url for the story, defaults to:\n                                 //   'http://localhost:6006'\n  flattenFolders?: Array<string> // Folders to flatten\n                                 //   defaults to ['__snapshots__', '__screenshots__']\n  stories: any,                  // Output of require context with the stories\n  findKindAndStory?: (           // Customize \"selectedKind\" and \"selectedStory\" on the URL\n    story: StoryPaths,           //   this is not needed if stories are generated with \"loadStories\"\n  ) => {|\n    selectedKind: string,\n    selectedStory: string\n  |},\n  filter?: {|                    // Filter functions to determine how different files are grouped\n    screenshots?: (file: string) => boolean,\n    tests?: (file: string) => boolean,\n    docs?: (file: string) => boolean,\n    story?: (file: string, target: string) => boolean,\n  |}\n|}): Array<StoryPaths>\n\n// Retrieve, group, load and create stories\nfunction loadStories({|\n  baseUrl?: string,              // The url for the story, defaults to:\n                                 //   'http://localhost:6006'\n  flattenFolders?: Array<string> // Folders to flatten\n                                 //   defaults to ['__snapshots__', '__screenshots__']\n  stories: any,                  // Output of require context with the stories\n  decorators: $ReadOnlyArray<Function>,\n  storiesOf: any,\n  storyFiles: $ReadOnlyArray<string>,\n|}): Array<StoryPaths & {|\n  main: () => React.Node,\n|}>\n```\n\n### Storybook testing\n\nOnce stories are loaded, `runTests` will connect to SauceLabs (optionally through a SauceConnect tunnel) and return a Promise that includes the results of the test.\n\nSince it uses `nightwatch` under the hood, you must have a valid nightwatch instance running. To assist with it, `nightwatchConfig` provides defaultValues\n\n```js\ntype Status = 'CREATED' | 'SUCCESS' | 'FAILED'\ntype ImgResults = {|\n    browser: string,\n    diffPath: ?string,\n    diffThreshold: number,\n    error: ?string,\n    name: string,\n    platform: string,\n    referencePath: ?string,\n    screenshotPath: ?string,\n    status: Status,\n  |}\n\n// Invoke nightwatch and run image comparison in SauceLabs\nfunction runTests(options: {|\n  configPath: string,           // absolute path to nightwatch config\n  files: Array<StoryPaths>,     // output of getFiles()\n  overwrite: boolean,           // true to replace failing or missing images\n  storyRoot: string,            // absolute path to the stories\n  tunnelId?: string,            // if set, it will set up a SC tunnel with the id\n  outputPath?: string,          // if set, where to store the test results as a\n                                // json file matching the return of `runTests`\n|}): Promise<{|\n  error: Error | null,          // null if there were no exceptions during tests\n  results: Array<ImgResults>,   // per browser / platform / story results\n  // An overall summary status. If any tests failed, it's FAILED, if any tests\n  // where created or updated it's CREATED, if all tests succeeded it's SUCCESS\n  // if no tests ran, it's EMPTY\n  status: Status | 'EMPTY',\n  counts: {|                    // counts for all tests\n    CREATED: number,\n    SUCCESS: number,\n    FAILED: number,\n  |},\n  version: string,              // picturebook version used\n  date: string,                 // ISO date when was the test report created\n|}>\n\n// Nightwatch config generation helper\nfunction nightwatchConfig(options: {|\n  desiredCapabilities?: {},     // nightwatch desired capabilities object\n  files: Array<StoryPaths>,     // output of getFiles()\n  username: string,             // SauceLabs username\n  access_key: string,           // SauceLabs accessKey\n  browsers?: {                  // List of browsers to test. Default list\n                                //   includes chrome, firefox, edge, ie11,\n                                //   iphone7 and safari but any valid SauceLabs\n                                //   config is valid\n    [browserName: string]: {\n      desiredCapabilities: {\n        platform: string,\n        version: string,\n        browserName: string,\n        screenResolution: string,\n      },\n      custom_vars: {|           // Custom properties required per browser config:\n        name: string,           // Must match \"browserName\"\n        platform: string,       // \"mobile\" | \"desktop\" but any string is allowed\n        extract?: {|            // If cropping the output, specify crop dimensions\n          top: number,\n          left: number,\n          width: number,\n          height: number,\n        |},\n      |},\n    },\n  },\n  // Alias for browsers where localhost cannot be accessed from a tunnel,\n  // defaults to \"localtest.dev\"\n  localhostAlias?: string,\n  // List of browsers that can't access localhost from a tunnel, defaults to:\n  // [\"ie11\", \"safari\"]\n  localhostAliasBrowsers?: Array<string>,\n  proxy?: {},                   // Nightwatch proxy object\n|}): Object\n```\n\n## 🎪 Sample App\n\nThis project includes a sample app to demo the behavior. You can view it running `yarn start` and opening `localhost:6006` on your browser.\n\nTo run the image comparison tests, keep `yarn start` running and call `SAUCE_ACCESS_KEY={YOUR_ACCESS_KEY} SAUCE_USERNAME={YOUR_USERNAME} yarn test:app`.\n\n## ️✏️ Storybook Usage\n\nTo take advantage of the automated storybook folder config (and testing) modify your storybook `config.js` to look like this:\n\n```js\nimport { storiesOf, configure } from '@storybook/react'\nimport * as picturebook from 'picturebook'\n\nfunction loadStories() {\n  picturebook.loadStories({\n    storiesOf,\n    stories: require.context('../stories', true, /\\.(js|md|png)/),\n  })\n}\n\nconfigure(loadStories, module)\n```\n\nIf you want to see a more advanced use case on how to use it with decorators and other plugins, check out the [sample project](./sampleFolder/.storybook/config.js).\n\n## 📸 Screenshot Usage\n\nTo take screenshots, picturebook relies on nightwatch. With the exception of a few required fields, configuration is generated for you. To take advantage of it you should create a `nightwatch.conf.js` file on your root (or customize it following instructions [here](http://nightwatchjs.org/gettingstarted#settings-file)).\n\n```js\nconst { resolve } = require('path')\nconst { nightwatchConfig, getFiles } = require('picturebook')\nconst requireContext = require('require-context')\n\nconst config = nightwatchConfig({\n  username: process.env.SAUCE_USERNAME,\n  access_key: process.env.SAUCE_ACCESS_KEY,\n  files: getFiles({\n    baseUrl: 'http://localhost:6006',\n    stories: requireContext(resolve(__dirname, './stories'), true, /\\.js/),\n  }),\n  desiredCapabilities: {\n    build: 'local',\n    'tunnel-identifier': 'picturebook-sample',\n  },\n})\n\nmodule.exports = config\n```\n\nTo take screenshots and run image comparison, you can call:\n\n```js\nrunTests({\n  storyRoot,\n  files: getFiles({\n    stories: requireContext(storyRoot, true, /\\.(js|png)/),\n  }),\n  overwrite,\n  tunnelId: 'picturebook-sample',\n  configPath: resolve(__dirname, 'nightwatch.conf.js'),\n})\n```\n\nNote that if using a tunnel, `tunnel-identifier` on your nightwatch config must match the `tunnelId` parameter passed to `runTests`.\n\n## 🙋 QYMA (Questions you may ask)\n\n### Why do I need to add localtest.dev as a localhost alias?\n\nThis is a SauceLabs issue. To work around it, `safari` and `edge` browsers replace `localhost` from urls to `localtest.dev` as described [here](https://support.saucelabs.com/hc/en-us/articles/225106887-Safari-and-Internet-Explorer-Won-t-Load-Website-When-Using-Sauce-Connect-on-Localhost).\n\nYou can customize the target browsers and localhost alias with the `localhostAliasBrowsers` and `localhostAlias`, respectively.\n\n### How do you skip some files?\n\nPicturebook will only take screenshots of the files you tell it exists. You can filter the output from [require.context](https://webpack.js.org/guides/dependency-management/#require-context) by specifying a different regExp to filter by.\n\n### SauceConnect ENOENT error\n\nIf you see the following error after a couple unsuccessful runs of SauceConnect:\n\n```sh\nevents.js:167\n      throw er; // Unhandled 'error' event\n      ^\n\nError: spawn ~/picturebook/node_modules/node-sauce-connect/lib/sc ENOENT\n```\n\nSometimes it gets stuck. Try cleaning `node_modules` and re-running yarn:\n\n```sh\nrm -rf node_modules\nyarn\n```\n\n### Error retrieving a new session from the selenium server\n\nThis is a Nightwatch issue, addressed in 1.0.4 versions of Nightwatch and later as per [this issue](https://github.com/nightwatchjs/nightwatch/issues/1772).\n\n### node-dir \"cannot read property 'files' of undefined\" error\n\nThere's currently a [bug in node-dir](https://github.com/fshost/node-dir/issues/53) that fails on empty dirs.\n\nRemove empty folders within your stories if you see the following error:\n\n```sh\nyourProject/node_modules/node-dir/lib/paths.js:92\n                results.files = results.files.concat(res.files);\n                                                         ^\n\nTypeError: Cannot read property 'files' of undefined\n    at subloop (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:92:58)\n    at /Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:107:13\n    at onDirRead (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:139:35)\n    at onStat (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:154:14)\n```\n\nYou can do so with:\n\n```sh\nfind /some/path -depth -type d -exec rmdir {} \\;\n```\n","readmeFilename":"README.md","gitHead":"d9483d7a4a2bba05c4e416d37df24f8f6c70d63f","bugs":{"url":"https://github.com/obartra/picturebook/issues"},"homepage":"https://github.com/obartra/picturebook#readme","_id":"picturebook@2.0.0-beta.11","_npmVersion":"6.1.0","_nodeVersion":"10.6.0","_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"dist":{"integrity":"sha512-N468uHdGAoiohlnjFhI/0GuviuUFQM/VGjDpJv9Nv7ZdkaLrO0p9eaWvBK3Je2znchEPIPWDX1+MHieQ+MUoKw==","shasum":"8e4bdfb8bc031007e8197b36cc7a797992765873","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-2.0.0-beta.11.tgz","fileCount":196,"unpackedSize":5835296,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbrVe7CRA9TVsSAnZWagAAY+QP/0v7YapvHbFE+BPY9oVg\nCxm/9c4qbnTg27nWn3k82c3Y/9rFp7LlE5D4xxzqwJtKK8s43Fc+NfmkW/qe\nt6DgeSoQABoP6itpGZp0ip62SMQ6UMzGGeFzxa8+ttv41D/B1Yi6DHd5fLVa\nh4XABQiAt4wnkJpEO6MTjswT4KVFFtwdZh6GNEzBqb36XJQTfZyuq/Bo4JkT\nDFaBg9DVOM/JPWVa1IBw27MUck3/I3GhrI0Qd5hYZ5ICDkx5VWB+HFKmNLlP\nAjF3kssR9Zei2rVGinc0zhbY/eKJkb8uhf5o5ybxEWgx2J17wCLHS2qyyKoG\n97WQM8znSPgQHMdcp3i9OXAzgB7IOKcWtIM47kLhLi7J4sOlUKH3Jr9rq9n6\nWy8xDLhBiQvjcX1FjleyFMjnmzxlB3V4rIQ0iYbvHX/U+BPV4FTjBND1vMTW\nbJkmOKIzzWx86RJS5+Yru4uJU6srTbEtRXDJZ90ww5vcNGnIjvsrkE7bzj+A\nd+XTewmsazozCWq4+R1jZtBj0RI+xTO9a1mZpE7h3OglO8e+i6h7GeJWwQx+\nMuoYxLAXfv9RlvQSm4DWPLcFVs/w2KExqiJ6+C32ECLhaHjLWM0DcVN6TAT3\nVB3tjflyNNOKpgQL13+nSH7wTlIE20YdQDPMwF6Ra6dAeYrpJoYgJwIoMN7/\nMPmE\r\n=Nwt+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE1GjXtQMtcwwlTRxccTkM/RjxOpNOS/5OS4TcLamt0aAiApoeJRSrr6gBCbhc6e+xSTkWOhepOhubIhIUKbNRNEjQ=="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook_2.0.0-beta.11_1538086842423_0.2315215341236765"},"_hasShrinkwrap":false},"2.0.0-beta.12":{"name":"picturebook","version":"2.0.0-beta.12","description":"Opinionated Storybook Setup","main":"dist/index.js","browser":"dist/picturebook.web.js","repository":{"type":"git","url":"git+https://github.com/obartra/picturebook.git"},"author":{"name":"Oscar Bartra"},"license":"MIT","scripts":{"format":"prettier --write \"{{src,test,sampleFolder}/**/,}*.js\"","test":"jest","lint":"eslint --ext .js --cache .","build":"webpack --mode production --config webpack.build.config.js && babel src -d dist --copy-files","build:watch":"yarn build --watch","test:watch":"yarn test --watch","start":"yarn && yarn build && cd sampleFolder && yarn && yarn start","test:app":"cd sampleFolder && yarn test --env chrome,firefox,ie11,edge,safari,iphone7","update-deps":"yarn upgrade --exact --latest && cd sampleFolder && yarn upgrade --exact --latest && cd .. && yarn ci","ci":"yarn build && yarn lint && yarn flow check && yarn test"},"dependencies":{"fs-extra":"7.0.0","lodash":"4.17.11","node-sauce-connect":"4.5.0","pixelmatch":"4.0.2","png-crop":"0.0.2","pngjs":"3.3.3","rimraf":"2.6.2","selenium-server-standalone-jar":"3.14.0"},"devDependencies":{"@babel/cli":"7.1.2","@babel/core":"7.1.2","@babel/plugin-proposal-object-rest-spread":"7.0.0","@babel/plugin-transform-regenerator":"7.0.0","@babel/plugin-transform-runtime":"7.1.0","@babel/preset-env":"7.1.0","@babel/preset-flow":"7.0.0","@babel/preset-react":"7.0.0","@babel/runtime":"7.1.2","@storybook/react":"3.4.11","babel-core":"7.0.0-bridge.0","babel-eslint":"10.0.1","babel-jest":"23.6.0","babel-loader":"8.0.4","babel-plugin-require-context-hook":"1.0.0","clean-webpack-plugin":"0.1.19","eslint":"5.6.1","eslint-config-airbnb":"17.1.0","eslint-config-prettier":"3.1.0","eslint-plugin-flowtype":"2.50.3","eslint-plugin-import":"2.14.0","eslint-plugin-jest":"21.24.0","eslint-plugin-jsx-a11y":"6.1.1","eslint-plugin-prettier":"3.0.0","eslint-plugin-promise":"4.0.1","eslint-plugin-react":"7.11.1","flow-bin":"0.82.0","jest":"23.6.0","prettier":"1.14.3","react":"16.5.2","react-dom":"16.5.2","webpack":"4.20.2","webpack-cli":"3.1.2"},"peerDependencies":{"nightwatch":">=0.9.x","react":">= 15.x","react-dom":">= 15.x"},"readme":"# 🤖📗 PictureBook\n\nAutomated React Storybook Setup\n\nSimplify React Storybook story creation and cross-browser image comparison testing\n\n## 💡 Rationale\n\nSetting up storybook and implement cross-browser image comparison testing on multiple projects is time consuming.\n\nInstead of providing a wrapper on top of existing projects that will fall out of date, Picturebook lets you retain control of the Storybook and Nightwatch packages.\n\nThis project aims to provide utility methods to simplify [Storybook](https://storybook.js.org/), [SauceLabs](https://saucelabs.com/) and [Nightwatch](http://nightwatchjs.org/) configuration and screenshot comparison. Specifically:\n\n- **Creation of storybook stories**: They are created based on your file system structure\n- **Saucelabs tunnel setup**: Reduce SauceConnect config to the tunnel id and username / accessKey\n- **Screenshot**: Take screenshots of every story on different browsers using SauceLabs and Nightwatch\n- **Image Comparison**: Compare and update screenshots to baselines collocated with your stories.\n\n## ⚙️ Install\n\n1. You will need a SauceLabs account. If you don't have one you can sign up for a trial [here](https://signup.saucelabs.com/signup/trial) or request a free one for open source projects [here](https://saucelabs.com/open-source-request-account).\n1. If you want to run tests against Safari and IE11 from localhost, add `localtest.dev 127.0.0.1` to your `/etc/hosts` (the exact steps may vary depending on your platform, see [here](https://www.howtogeek.com/howto/27350/beginner-geek-how-to-edit-your-hosts-file/) for more details).\n1. Add picturebook and its peer dependencies:\n\n```sh\nyarn add --dev picturebook @storybook/react nightwatch react\n```\n\nIf you don't have Storybook set it up yet, follow [these instructions](https://storybook.js.org/basics/quick-start-guide/) first.\n\nSome of Picturebook utility methods rely on the output of `require.context`. This is a webpack construct and it's not available in Node or test environments. There are multiple ways to mock it. If you are using babel you could add the [require-context-hook](https://github.com/smrq/babel-plugin-require-context-hook) plugin. For instance, if you want to enable it only for tests, you can do something like:\n\n```json\n{\n  \"env\": {\n    \"test\": {\n      \"plugins\": [\"require-context-hook\"]\n    }\n  }\n}\n```\n\nand on your test setup:\n\n```js\nrequire('babel-plugin-require-context-hook/register')()\n```\n\nAlternatively, there's also the [require-context](https://www.npmjs.com/package/require-context) npm package that will also emulate webpack's `require.context`.\n\n## 📚 API\n\nThe API can be split into 2 sections, storybook creation for finding files in the file system and creating storybook stories around them and storybook testing, to connect to SauceLabs and run cross-browser image comparison tests.\n\n### Storybook creation\n\n`getFiles` and `loadStories` have very similar APIs and output.\n\n`getFiles` allows you to retrieve a list of related files. For instance if you have:\n\n```sh\nfile1.js\nfile1.md\nfile2.png\nfile2.js\n```\n\nIt will provide an array of 2 elements (file1 and file2) with the different related files grouped.\n\nThese values are used to identify helper files for stories where `*.md` is understood to be documentation,`.*(spec|test).js` is a test file and an unprefixed `*.js` file is a story. The `flattenFolders` parameters allow grouping nested folders as well. For instance if `flattenFolders: ['a']` `file1.js` and `a/file1.png` will be grouped together.\n\n`loadStories` provide the same functionality than `getFiles` but it also loads and creates storybook stories. This is why it requires storybook's [storiesOf](https://storybook.js.org/basics/writing-stories/#writing-stories) method as a parameter. The response is also similar but it includes a `main` method with the loaded story.\n\nYou can find the exact APIs below:\n\n```js\ntype StoryPaths = {|\n  name: string,\n  parents: $ReadOnlyArray<string>,\n  title: string,\n  path: string,\n  screenshots: {|\n    [extension: string]: string,\n  |},\n  tests: {|\n    [extension: string]: string,\n  |},\n  doc: ?string,\n  url: ?string,\n|}\n\n// Retrieve and group the different stories based on their filenames\nfunction getFiles({|\n  baseUrl?: string,              // The url for the story, defaults to:\n                                 //   'http://localhost:6006'\n  flattenFolders?: Array<string> // Folders to flatten\n                                 //   defaults to ['__snapshots__', '__screenshots__']\n  stories: any,                  // Output of require context with the stories\n  findKindAndStory?: (           // Customize \"selectedKind\" and \"selectedStory\" on the URL\n    story: StoryPaths,           //   this is not needed if stories are generated with \"loadStories\"\n  ) => {|\n    selectedKind: string,\n    selectedStory: string\n  |},\n  filter?: {|                    // Filter functions to determine how different files are grouped\n    screenshots?: (file: string) => boolean,\n    tests?: (file: string) => boolean,\n    docs?: (file: string) => boolean,\n    story?: (file: string, target: string) => boolean,\n  |}\n|}): Array<StoryPaths>\n\n// Retrieve, group, load and create stories\nfunction loadStories({|\n  baseUrl?: string,              // The url for the story, defaults to:\n                                 //   'http://localhost:6006'\n  flattenFolders?: Array<string> // Folders to flatten\n                                 //   defaults to ['__snapshots__', '__screenshots__']\n  stories: any,                  // Output of require context with the stories\n  decorators: $ReadOnlyArray<Function>,\n  storiesOf: any,\n  storyFiles: $ReadOnlyArray<string>,\n|}): Array<StoryPaths & {|\n  main: () => React.Node,\n|}>\n```\n\n### Storybook testing\n\nOnce stories are loaded, `runTests` will connect to SauceLabs (optionally through a SauceConnect tunnel) and return a Promise that includes the results of the test.\n\nSince it uses `nightwatch` under the hood, you must have a valid nightwatch instance running. To assist with it, `nightwatchConfig` provides defaultValues\n\n```js\ntype Status = 'CREATED' | 'SUCCESS' | 'FAILED'\ntype ImgResults = {|\n    browser: string,\n    diffPath: ?string,\n    diffThreshold: number,\n    error: ?string,\n    name: string,\n    platform: string,\n    referencePath: ?string,\n    screenshotPath: ?string,\n    status: Status,\n  |}\n\n// Invoke nightwatch and run image comparison in SauceLabs\nfunction runTests(options: {|\n  configPath: string,           // absolute path to nightwatch config\n  files: Array<StoryPaths>,     // output of getFiles()\n  overwrite: boolean,           // true to replace failing or missing images\n  storyRoot: string,            // absolute path to the stories\n  tunnelId?: string,            // if set, it will set up a SC tunnel with the id\n  outputPath?: string,          // if set, where to store the test results as a\n                                // json file matching the return of `runTests`\n|}): Promise<{|\n  error: Error | null,          // null if there were no exceptions during tests\n  results: Array<ImgResults>,   // per browser / platform / story results\n  // An overall summary status. If any tests failed, it's FAILED, if any tests\n  // where created or updated it's CREATED, if all tests succeeded it's SUCCESS\n  // if no tests ran, it's EMPTY\n  status: Status | 'EMPTY',\n  counts: {|                    // counts for all tests\n    CREATED: number,\n    SUCCESS: number,\n    FAILED: number,\n  |},\n  version: string,              // picturebook version used\n  date: string,                 // ISO date when was the test report created\n|}>\n\n// Nightwatch config generation helper\nfunction nightwatchConfig(options: {|\n  desiredCapabilities?: {},     // nightwatch desired capabilities object\n  files: Array<StoryPaths>,     // output of getFiles()\n  username: string,             // SauceLabs username\n  access_key: string,           // SauceLabs accessKey\n  browsers?: {                  // List of browsers to test. Default list\n                                //   includes chrome, firefox, edge, ie11,\n                                //   iphone7 and safari but any valid SauceLabs\n                                //   config is valid\n    [browserName: string]: {\n      desiredCapabilities: {\n        platform: string,\n        version: string,\n        browserName: string,\n        screenResolution: string,\n      },\n      custom_vars: {|           // Custom properties required per browser config:\n        name: string,           // Must match \"browserName\"\n        platform: string,       // \"mobile\" | \"desktop\" but any string is allowed\n        extract?: {|            // If cropping the output, specify crop dimensions\n          top: number,\n          left: number,\n          width: number,\n          height: number,\n        |},\n      |},\n    },\n  },\n  // Alias for browsers where localhost cannot be accessed from a tunnel,\n  // defaults to \"localtest.dev\"\n  localhostAlias?: string,\n  // List of browsers that can't access localhost from a tunnel, defaults to:\n  // [\"ie11\", \"safari\"]\n  localhostAliasBrowsers?: Array<string>,\n  proxy?: {},                   // Nightwatch proxy object\n|}): Object\n```\n\n## 🎪 Sample App\n\nThis project includes a sample app to demo the behavior. You can view it running `yarn start` and opening `localhost:6006` on your browser.\n\nTo run the image comparison tests, keep `yarn start` running and call `SAUCE_ACCESS_KEY={YOUR_ACCESS_KEY} SAUCE_USERNAME={YOUR_USERNAME} yarn test:app`.\n\n## ️✏️ Storybook Usage\n\nTo take advantage of the automated storybook folder config (and testing) modify your storybook `config.js` to look like this:\n\n```js\nimport { storiesOf, configure } from '@storybook/react'\nimport * as picturebook from 'picturebook'\n\nfunction loadStories() {\n  picturebook.loadStories({\n    storiesOf,\n    stories: require.context('../stories', true, /\\.(js|md|png)/),\n  })\n}\n\nconfigure(loadStories, module)\n```\n\nIf you want to see a more advanced use case on how to use it with decorators and other plugins, check out the [sample project](./sampleFolder/.storybook/config.js).\n\n## 📸 Screenshot Usage\n\nTo take screenshots, picturebook relies on nightwatch. With the exception of a few required fields, configuration is generated for you. To take advantage of it you should create a `nightwatch.conf.js` file on your root (or customize it following instructions [here](http://nightwatchjs.org/gettingstarted#settings-file)).\n\n```js\nconst { resolve } = require('path')\nconst { nightwatchConfig, getFiles } = require('picturebook')\nconst requireContext = require('require-context')\n\nconst config = nightwatchConfig({\n  username: process.env.SAUCE_USERNAME,\n  access_key: process.env.SAUCE_ACCESS_KEY,\n  files: getFiles({\n    baseUrl: 'http://localhost:6006',\n    stories: requireContext(resolve(__dirname, './stories'), true, /\\.js/),\n  }),\n  desiredCapabilities: {\n    build: 'local',\n    'tunnel-identifier': 'picturebook-sample',\n  },\n})\n\nmodule.exports = config\n```\n\nTo take screenshots and run image comparison, you can call:\n\n```js\nrunTests({\n  storyRoot,\n  files: getFiles({\n    stories: requireContext(storyRoot, true, /\\.(js|png)/),\n  }),\n  overwrite,\n  tunnelId: 'picturebook-sample',\n  configPath: resolve(__dirname, 'nightwatch.conf.js'),\n})\n```\n\nNote that if using a tunnel, `tunnel-identifier` on your nightwatch config must match the `tunnelId` parameter passed to `runTests`.\n\n## 🙋 QYMA (Questions you may ask)\n\n### Why do I need to add localtest.dev as a localhost alias?\n\nThis is a SauceLabs issue. To work around it, `safari` and `edge` browsers replace `localhost` from urls to `localtest.dev` as described [here](https://support.saucelabs.com/hc/en-us/articles/225106887-Safari-and-Internet-Explorer-Won-t-Load-Website-When-Using-Sauce-Connect-on-Localhost).\n\nYou can customize the target browsers and localhost alias with the `localhostAliasBrowsers` and `localhostAlias`, respectively.\n\n### How do you skip some files?\n\nPicturebook will only take screenshots of the files you tell it exists. You can filter the output from [require.context](https://webpack.js.org/guides/dependency-management/#require-context) by specifying a different regExp to filter by.\n\n### SauceConnect ENOENT error\n\nIf you see the following error after a couple unsuccessful runs of SauceConnect:\n\n```sh\nevents.js:167\n      throw er; // Unhandled 'error' event\n      ^\n\nError: spawn ~/picturebook/node_modules/node-sauce-connect/lib/sc ENOENT\n```\n\nSometimes it gets stuck. Try cleaning `node_modules` and re-running yarn:\n\n```sh\nrm -rf node_modules\nyarn\n```\n\n### Error retrieving a new session from the selenium server\n\nThis is a Nightwatch issue, addressed in 1.0.4 versions of Nightwatch and later as per [this issue](https://github.com/nightwatchjs/nightwatch/issues/1772).\n\n### node-dir \"cannot read property 'files' of undefined\" error\n\nThere's currently a [bug in node-dir](https://github.com/fshost/node-dir/issues/53) that fails on empty dirs.\n\nRemove empty folders within your stories if you see the following error:\n\n```sh\nyourProject/node_modules/node-dir/lib/paths.js:92\n                results.files = results.files.concat(res.files);\n                                                         ^\n\nTypeError: Cannot read property 'files' of undefined\n    at subloop (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:92:58)\n    at /Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:107:13\n    at onDirRead (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:139:35)\n    at onStat (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:154:14)\n```\n\nYou can do so with:\n\n```sh\nfind /some/path -depth -type d -exec rmdir {} \\;\n```\n\n### No Java runtime present\n\nSelenium 3.0+ requires Java 8. Make sure it's installed if you get the following error:\n\n```sh\nStarting selenium server in parallel mode... There was an error while starting the Selenium server:\n\nNo Java runtime present, requesting install.\n```\n\nFor additional Selenium tips, check out [selenium-standalone tips](https://www.npmjs.com/package/selenium-standalone#tips).\n","readmeFilename":"README.md","gitHead":"e1cfc4ca685f2d9f2b1eefb3c8a11f6cca44104f","bugs":{"url":"https://github.com/obartra/picturebook/issues"},"homepage":"https://github.com/obartra/picturebook#readme","_id":"picturebook@2.0.0-beta.12","_npmVersion":"6.1.0","_nodeVersion":"10.6.0","_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"dist":{"integrity":"sha512-i7XlSAcYNGoD54scJUWr3jHXNJTpwIe1R53lWM7+Cf+BLnMKqiv38x5eB5/ivLBdTOF7EJabScqMi1S9yhGVCQ==","shasum":"2071e2580b123060bdf404872fdf337e9c813832","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-2.0.0-beta.12.tgz","fileCount":164,"unpackedSize":2929600,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbs38XCRA9TVsSAnZWagAACoUQAIMH8VZ5W1TRlT+XxHJo\n0N/BpK07f212JuIh8+a/qJxtf+eutaryBD+sT75Ihvu6pJhDqcoL7IczNKQt\nwiukrkafKHEKueYmyspG18HxmycJFhMrweqQPsQBZt3kMmdl7UQ5MLZNeuxG\ncL0uDyHqYMgOO0HEVU60p/S0WhdUVDG3Zlex0C1j/DHbXelVurIJ5k/UmzZg\nkuQ8pM4evRQMFWN3OMEfUSY+kuPp4zDm8l4/46y+mtJYZeE1KarCZLX/GKGC\niip2H6rRD8zpxRPztAelXlAuBmzGdN4+me1ble05GJNiE4zhYbbJpUVMBu2N\nqWviCPHa/EbREY86N5sfPBxzSS80e1jWjmNRp4jKyiC51ToF43PxJNMPIT1S\nBPH8ZFamF29AvicP+K9C0rkBpl7kN5Fjv01S4luNz43b/J7wkiWorBuz1TSo\n9q9KivJuSYEY98s/trVgY61cqcZoMFPdLFKEmQCdv8dhKrfIVe5FLM1cnimK\nXuLx94ZBI/m2pdiOW+ya0/9ZfeiYjM9EMP/MuXV08zSgqKLQ8LvLVFwH98Yq\ndVXiW2VppKEumFZNGJFyRFCX5IzYU1HjtZhGrr5m6Zja7idBSksubRDUcpzv\nsN5/CESGdbt9dVx83xw2JGM0VKliEt+7XbWwchvb0Z9pgWjctjxZGYRjFN3M\nfsbL\r\n=KLPt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDm6LsEczxGkwbZZeIrYUezn7FbWqfQYfHN903mBBtR+QIhANLq0mjp+E14qh0bA/Hr+zxQQYUzDnh7TeJchdVqPYSg"}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook_2.0.0-beta.12_1538490134742_0.5379095763538022"},"_hasShrinkwrap":false},"2.0.0-beta.13":{"name":"picturebook","version":"2.0.0-beta.13","description":"Opinionated Storybook Setup","main":"dist/index.js","browser":"dist/picturebook.web.js","repository":{"type":"git","url":"git+https://github.com/obartra/picturebook.git"},"author":{"name":"Oscar Bartra"},"license":"MIT","scripts":{"format":"prettier --write \"{{src,test,sampleFolder}/**/,}*.js\"","test":"jest","lint":"eslint --ext .js --cache .","build":"webpack --mode production --config webpack.build.config.js && babel src -d dist --copy-files","build:watch":"yarn build --watch","test:watch":"yarn test --watch","start":"yarn && yarn build && cd sampleFolder && yarn && yarn start","test:app":"cd sampleFolder && yarn test --env chrome,firefox,ie11,edge,safari,iphone7","update-deps":"yarn upgrade --exact --latest && cd sampleFolder && yarn upgrade --exact --latest && cd .. && yarn ci","ci":"yarn build && yarn lint && yarn flow check && yarn test"},"dependencies":{"fs-extra":"7.0.0","lodash":"4.17.11","node-sauce-connect":"4.5.0","pixelmatch":"4.0.2","png-crop":"0.0.2","pngjs":"3.3.3","rimraf":"2.6.2","selenium-server-standalone-jar":"3.14.0"},"devDependencies":{"@babel/cli":"7.1.2","@babel/core":"7.1.2","@babel/plugin-proposal-object-rest-spread":"7.0.0","@babel/plugin-transform-regenerator":"7.0.0","@babel/plugin-transform-runtime":"7.1.0","@babel/preset-env":"7.1.0","@babel/preset-flow":"7.0.0","@babel/preset-react":"7.0.0","@babel/runtime":"7.1.2","@storybook/react":"3.4.11","babel-core":"7.0.0-bridge.0","babel-eslint":"10.0.1","babel-jest":"23.6.0","babel-loader":"8.0.4","babel-plugin-require-context-hook":"1.0.0","clean-webpack-plugin":"0.1.19","eslint":"5.6.1","eslint-config-airbnb":"17.1.0","eslint-config-prettier":"3.1.0","eslint-plugin-flowtype":"2.50.3","eslint-plugin-import":"2.14.0","eslint-plugin-jest":"21.24.0","eslint-plugin-jsx-a11y":"6.1.1","eslint-plugin-prettier":"3.0.0","eslint-plugin-promise":"4.0.1","eslint-plugin-react":"7.11.1","flow-bin":"0.82.0","jest":"23.6.0","prettier":"1.14.3","react":"16.5.2","react-dom":"16.5.2","webpack":"4.20.2","webpack-cli":"3.1.2"},"peerDependencies":{"nightwatch":">=0.9.x"},"readme":"# 🤖📗 PictureBook\n\nAutomated Storybook Setup\n\nSimplify Storybook story creation and cross-browser image comparison testing\n\n## 💡 Rationale\n\nSetting up storybook and implement cross-browser image comparison testing on multiple projects is time consuming.\n\nInstead of providing a wrapper on top of existing projects that will fall out of date, Picturebook lets you retain control of the Storybook and Nightwatch packages.\n\nThis project aims to provide utility methods to simplify [Storybook](https://storybook.js.org/), [SauceLabs](https://saucelabs.com/) and [Nightwatch](http://nightwatchjs.org/) configuration and screenshot comparison. Specifically:\n\n- **Creation of storybook stories**: They are created based on your file system structure\n- **Saucelabs tunnel setup**: Reduce SauceConnect config to the tunnel id and username / accessKey\n- **Screenshot**: Take screenshots of every story on different browsers using SauceLabs and Nightwatch\n- **Image Comparison**: Compare and update screenshots to baselines collocated with your stories.\n\n## ⚙️ Install\n\n1. You will need a SauceLabs account. If you don't have one you can sign up for a trial [here](https://signup.saucelabs.com/signup/trial) or request a free one for open source projects [here](https://saucelabs.com/open-source-request-account).\n1. If you want to run tests against Safari and IE11 from localhost, add `localtest.dev 127.0.0.1` to your `/etc/hosts` (the exact steps may vary depending on your platform, see [here](https://www.howtogeek.com/howto/27350/beginner-geek-how-to-edit-your-hosts-file/) for more details).\n1. Add picturebook and its peer dependencies:\n\n```sh\nyarn add --dev picturebook @storybook/react nightwatch react\n```\n\nReact is used in the examples but you can also use any flavor of storybook you want.\n\nIf you don't have Storybook set it up yet, follow [these instructions](https://storybook.js.org/basics/quick-start-guide/) first.\n\nSome of Picturebook utility methods rely on the output of `require.context`. This is a webpack construct and it's not available in Node or test environments. There are multiple ways to mock it. If you are using babel you could add the [require-context-hook](https://github.com/smrq/babel-plugin-require-context-hook) plugin. For instance, if you want to enable it only for tests, you can do something like:\n\n```json\n{\n  \"env\": {\n    \"test\": {\n      \"plugins\": [\"require-context-hook\"]\n    }\n  }\n}\n```\n\nand on your test setup:\n\n```js\nrequire('babel-plugin-require-context-hook/register')()\n```\n\nAlternatively, there's also the [require-context](https://www.npmjs.com/package/require-context) npm package that will also emulate webpack's `require.context`.\n\n## 📚 API\n\nThe API can be split into 2 sections, storybook creation for finding files in the file system and creating storybook stories around them and storybook testing, to connect to SauceLabs and run cross-browser image comparison tests.\n\n### Storybook creation\n\n`getFiles` and `loadStories` have very similar APIs and output.\n\n`getFiles` allows you to retrieve a list of related files. For instance if you have:\n\n```sh\nfile1.js\nfile1.md\nfile2.png\nfile2.js\n```\n\nIt will provide an array of 2 elements (file1 and file2) with the different related files grouped.\n\nThese values are used to identify helper files for stories where `*.md` is understood to be documentation,`.*(spec|test).js` is a test file and an unprefixed `*.js` file is a story. The `flattenFolders` parameters allow grouping nested folders as well. For instance if `flattenFolders: ['a']` `file1.js` and `a/file1.png` will be grouped together.\n\n`loadStories` provide the same functionality than `getFiles` but it also loads and creates storybook stories. This is why it requires storybook's [storiesOf](https://storybook.js.org/basics/writing-stories/#writing-stories) method as a parameter. The response is also similar but it includes a `main` method with the loaded story.\n\nYou can find the exact APIs below:\n\n```js\ntype StoryPaths = {|\n  name: string,\n  parents: $ReadOnlyArray<string>,\n  title: string,\n  path: string,\n  screenshots: {|\n    [extension: string]: string,\n  |},\n  tests: {|\n    [extension: string]: string,\n  |},\n  doc: ?string,\n  url: ?string,\n|}\n\n// Retrieve and group the different stories based on their filenames\nfunction getFiles({|\n  baseUrl?: string,              // The url for the story, defaults to:\n                                 //   'http://localhost:6006'\n  flattenFolders?: Array<string> // Folders to flatten\n                                 //   defaults to ['__snapshots__', '__screenshots__']\n  stories: any,                  // Output of require context with the stories\n  findKindAndStory?: (           // Customize \"selectedKind\" and \"selectedStory\" on the URL\n    story: StoryPaths,           //   this is not needed if stories are generated with \"loadStories\"\n  ) => {|\n    selectedKind: string,\n    selectedStory: string\n  |},\n  filter?: {|                    // Filter functions to determine how different files are grouped\n    screenshots?: (file: string) => boolean,\n    tests?: (file: string) => boolean,\n    docs?: (file: string) => boolean,\n    story?: (file: string, target: string) => boolean,\n  |}\n|}): Array<StoryPaths>\n\n// Retrieve, group, load and create stories\nfunction loadStories({|\n  baseUrl?: string,              // The url for the story, defaults to:\n                                 //   'http://localhost:6006'\n  flattenFolders?: Array<string> // Folders to flatten\n                                 //   defaults to ['__snapshots__', '__screenshots__']\n  stories: any,                  // Output of require context with the stories\n  decorators: $ReadOnlyArray<Function>,\n  storiesOf: any,\n  storyFiles: $ReadOnlyArray<string>,\n|}): Array<StoryPaths & {|\n  main: () => any,\n|}>\n```\n\n### Storybook testing\n\nOnce stories are loaded, `runTests` will connect to SauceLabs (optionally through a SauceConnect tunnel) and return a Promise that includes the results of the test.\n\nSince it uses `nightwatch` under the hood, you must have a valid nightwatch instance running. To assist with it, `nightwatchConfig` provides defaultValues\n\n```js\ntype Status = 'CREATED' | 'SUCCESS' | 'FAILED'\ntype ImgResults = {|\n    browser: string,\n    diffPath: ?string,\n    diffThreshold: number,\n    error: ?string,\n    name: string,\n    platform: string,\n    referencePath: ?string,\n    screenshotPath: ?string,\n    status: Status,\n  |}\n\n// Invoke nightwatch and run image comparison in SauceLabs\nfunction runTests(options: {|\n  configPath: string,           // absolute path to nightwatch config\n  files: Array<StoryPaths>,     // output of getFiles()\n  overwrite: boolean,           // true to replace failing or missing images\n  storyRoot: string,            // absolute path to the stories\n  tunnelId?: string,            // if set, it will set up a SC tunnel with the id\n  outputPath?: string,          // if set, where to store the test results as a\n                                // json file matching the return of `runTests`\n|}): Promise<{|\n  error: Error | null,          // null if there were no exceptions during tests\n  results: Array<ImgResults>,   // per browser / platform / story results\n  // An overall summary status. If any tests failed, it's FAILED, if any tests\n  // where created or updated it's CREATED, if all tests succeeded it's SUCCESS\n  // if no tests ran, it's EMPTY\n  status: Status | 'EMPTY',\n  counts: {|                    // counts for all tests\n    CREATED: number,\n    SUCCESS: number,\n    FAILED: number,\n  |},\n  version: string,              // picturebook version used\n  date: string,                 // ISO date when was the test report created\n|}>\n\n// Nightwatch config generation helper\nfunction nightwatchConfig(options: {|\n  desiredCapabilities?: {},     // nightwatch desired capabilities object\n  files: Array<StoryPaths>,     // output of getFiles()\n  username: string,             // SauceLabs username\n  access_key: string,           // SauceLabs accessKey\n  browsers?: {                  // List of browsers to test. Default list\n                                //   includes chrome, firefox, edge, ie11,\n                                //   iphone7 and safari but any valid SauceLabs\n                                //   config is valid\n    [browserName: string]: {\n      desiredCapabilities: {\n        platform: string,\n        version: string,\n        browserName: string,\n        screenResolution: string,\n      },\n      custom_vars: {|           // Custom properties required per browser config:\n        name: string,           // Must match \"browserName\"\n        platform: string,       // \"mobile\" | \"desktop\" but any string is allowed\n        extract?: {|            // If cropping the output, specify crop dimensions\n          top: number,\n          left: number,\n          width: number,\n          height: number,\n        |},\n      |},\n    },\n  },\n  // Alias for browsers where localhost cannot be accessed from a tunnel,\n  // defaults to \"localtest.dev\"\n  localhostAlias?: string,\n  // List of browsers that can't access localhost from a tunnel, defaults to:\n  // [\"ie11\", \"safari\"]\n  localhostAliasBrowsers?: Array<string>,\n  proxy?: {},                   // Nightwatch proxy object\n|}): Object\n```\n\n## 🎪 Sample App\n\nThis project includes a sample app to demo the behavior. You can view it running `yarn start` and opening `localhost:6006` on your browser.\n\nTo run the image comparison tests, keep `yarn start` running and call `SAUCE_ACCESS_KEY={YOUR_ACCESS_KEY} SAUCE_USERNAME={YOUR_USERNAME} yarn test:app`.\n\n## ️✏️ Storybook Usage\n\nTo take advantage of the automated storybook folder config (and testing) modify your storybook `config.js` to look like this:\n\n```js\nimport { storiesOf, configure } from '@storybook/react'\nimport * as picturebook from 'picturebook'\n\nfunction loadStories() {\n  picturebook.loadStories({\n    storiesOf,\n    stories: require.context('../stories', true, /\\.(js|md|png)/),\n  })\n}\n\nconfigure(loadStories, module)\n```\n\nIf you want to see a more advanced use case on how to use it with decorators and other plugins, check out the [sample project](./sampleFolder/.storybook/config.js).\n\n## 📸 Screenshot Usage\n\nTo take screenshots, picturebook relies on nightwatch. With the exception of a few required fields, configuration is generated for you. To take advantage of it you should create a `nightwatch.conf.js` file on your root (or customize it following instructions [here](http://nightwatchjs.org/gettingstarted#settings-file)).\n\n```js\nconst { resolve } = require('path')\nconst { nightwatchConfig, getFiles } = require('picturebook')\nconst requireContext = require('require-context')\n\nconst config = nightwatchConfig({\n  username: process.env.SAUCE_USERNAME,\n  access_key: process.env.SAUCE_ACCESS_KEY,\n  files: getFiles({\n    baseUrl: 'http://localhost:6006',\n    stories: requireContext(resolve(__dirname, './stories'), true, /\\.js/),\n  }),\n  desiredCapabilities: {\n    build: 'local',\n    'tunnel-identifier': 'picturebook-sample',\n  },\n})\n\nmodule.exports = config\n```\n\nTo take screenshots and run image comparison, you can call:\n\n```js\nrunTests({\n  storyRoot,\n  files: getFiles({\n    stories: requireContext(storyRoot, true, /\\.(js|png)/),\n  }),\n  overwrite,\n  tunnelId: 'picturebook-sample',\n  configPath: resolve(__dirname, 'nightwatch.conf.js'),\n})\n```\n\nNote that if using a tunnel, `tunnel-identifier` on your nightwatch config must match the `tunnelId` parameter passed to `runTests`.\n\n## 🙋 QYMA (Questions you may ask)\n\n### Why do I need to add localtest.dev as a localhost alias?\n\nThis is a SauceLabs issue. To work around it, `safari` and `edge` browsers replace `localhost` from urls to `localtest.dev` as described [here](https://support.saucelabs.com/hc/en-us/articles/225106887-Safari-and-Internet-Explorer-Won-t-Load-Website-When-Using-Sauce-Connect-on-Localhost).\n\nYou can customize the target browsers and localhost alias with the `localhostAliasBrowsers` and `localhostAlias`, respectively.\n\n### How do you skip some files?\n\nPicturebook will only take screenshots of the files you tell it exists. You can filter the output from [require.context](https://webpack.js.org/guides/dependency-management/#require-context) by specifying a different regExp to filter by.\n\n### SauceConnect ENOENT error\n\nIf you see the following error after a couple unsuccessful runs of SauceConnect:\n\n```sh\nevents.js:167\n      throw er; // Unhandled 'error' event\n      ^\n\nError: spawn ~/picturebook/node_modules/node-sauce-connect/lib/sc ENOENT\n```\n\nSometimes it gets stuck. Try cleaning `node_modules` and re-running yarn:\n\n```sh\nrm -rf node_modules\nyarn\n```\n\n### Error retrieving a new session from the selenium server\n\nThis is a Nightwatch issue, addressed in 1.0.4 versions of Nightwatch and later as per [this issue](https://github.com/nightwatchjs/nightwatch/issues/1772).\n\n### node-dir \"cannot read property 'files' of undefined\" error\n\nThere's currently a [bug in node-dir](https://github.com/fshost/node-dir/issues/53) that fails on empty dirs.\n\nRemove empty folders within your stories if you see the following error:\n\n```sh\nyourProject/node_modules/node-dir/lib/paths.js:92\n                results.files = results.files.concat(res.files);\n                                                         ^\n\nTypeError: Cannot read property 'files' of undefined\n    at subloop (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:92:58)\n    at /Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:107:13\n    at onDirRead (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:139:35)\n    at onStat (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:154:14)\n```\n\nYou can do so with:\n\n```sh\nfind /some/path -depth -type d -exec rmdir {} \\;\n```\n\n### No Java runtime present\n\nSelenium 3.0+ requires Java 8. Make sure it's installed if you get the following error:\n\n```sh\nStarting selenium server in parallel mode... There was an error while starting the Selenium server:\n\nNo Java runtime present, requesting install.\n```\n\nFor additional Selenium tips, check out [selenium-standalone tips](https://www.npmjs.com/package/selenium-standalone#tips).\n","readmeFilename":"README.md","gitHead":"b0a83d532b3cd0119b2e2d74feed0d0125cbb001","bugs":{"url":"https://github.com/obartra/picturebook/issues"},"homepage":"https://github.com/obartra/picturebook#readme","_id":"picturebook@2.0.0-beta.13","_npmVersion":"6.1.0","_nodeVersion":"10.6.0","_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"dist":{"integrity":"sha512-lW0bA9W5kdIBHS1+JErvxUIS4hTWGnUXhNmwwTNNhbX1B78u0fhIdrz4pvs7mSbauqKRDS48ogAFJBhiDLirOg==","shasum":"ddd88860be5f17db27070e987c41f2f9c8af0c89","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-2.0.0-beta.13.tgz","fileCount":164,"unpackedSize":2904839,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbs8DbCRA9TVsSAnZWagAA06AP/irxEQ3iMWADBFxLupb8\nZEDJLi9scZS/7k6FELCaLQb2u+dDp554ioomFW5j79iwWNVllnudvXWJ0U71\n7u8Om7gTnmNsNZsfN5QHv6WL1XBJCvazY3DFdEd3uwsmVfm0lEhD9OVFfV4b\niC9zxfv6fMEzG6G1Jt7Ta+Fx5SsIvLL66gOAZzCMwjV7lVSqcu3ob/sKB0nT\nevoSxKAs3RxHAZaJxeTlo7n8Z0gGl0jxK5OFvcU3zHnLedMTdvIDoe9R/jhO\n78neqlMtYaKGGqyH7Gb6VByY5yPWGtQXb74eU1vtqKoB9S1RF6TtKrBO4dOY\nXMqYqNFkhWN/oY4zfmCvf+yNxQUiUCaZm4XqQUVjzhuXTiyOjqyB6Qa/mAcP\nmZ3S+UXuCbO8eV3gQymb7fg0DBFCpTV4xyBpvnTB8oNxjMtaYqcvoNcpoACc\nH/h9BWe7bFVbdHJQJ+SXSB85OJoBjVuYKmQS/I+AeocoTjRM3qKwNXzdMYrq\nem/fJvDMk7qxT80ybl4/AQDaoTSVsOHtVBQzstuqOlI1jADPkrPVNjalWlCH\n+VVjQdhcG0s+BwMEA19k8RRxc5WNNRxTPFTIIcnAm41zw3woKxK8ncfOzqo9\neBoxNlUPvfnYAX/4E5375KRQK0qvWtrvuTVzqUQWBN71LLIVnn3fo4Y8tWY7\nL7zR\r\n=I7RS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGSbms5U/6oRcRqBs0uRyS5+R1OOYY11FjnvfLMtza1uAiBr7NrqvO9o5NUiwbpem3TgS5h8eCAvftnTLkjaUZtZPQ=="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook_2.0.0-beta.13_1538506971177_0.3456224938298944"},"_hasShrinkwrap":false},"2.0.0-beta.14":{"name":"picturebook","version":"2.0.0-beta.14","description":"Opinionated Storybook Setup","main":"dist/index.js","browser":"dist/picturebook.web.js","repository":{"type":"git","url":"git+https://github.com/obartra/picturebook.git"},"author":{"name":"Oscar Bartra"},"license":"MIT","scripts":{"format":"prettier --write \"{{src,test,sampleFolder}/**/,}*.js\"","test":"jest","lint":"eslint --ext .js --cache .","build":"webpack --mode production --config webpack.build.config.js && babel src -d dist --copy-files","build:watch":"yarn build --watch","test:watch":"yarn test --watch","start":"yarn && yarn build && cd sampleFolder && yarn && yarn start","test:app":"cd sampleFolder && yarn test --env chrome,firefox,ie11,edge,safari,iphone7","update-deps":"yarn upgrade --exact --latest && cd sampleFolder && yarn upgrade --exact --latest && cd .. && yarn ci","ci":"yarn build && yarn lint && yarn flow check && yarn test"},"dependencies":{"fs-extra":"7.0.0","lodash":"4.17.11","pixelmatch":"4.0.2","png-crop":"0.0.2","pngjs":"3.3.3","rimraf":"2.6.2","selenium-server-standalone-jar":"3.14.0"},"devDependencies":{"@babel/cli":"7.1.2","@babel/core":"7.1.2","@babel/plugin-proposal-object-rest-spread":"7.0.0","@babel/plugin-transform-regenerator":"7.0.0","@babel/plugin-transform-runtime":"7.1.0","@babel/preset-env":"7.1.0","@babel/preset-flow":"7.0.0","@babel/preset-react":"7.0.0","@babel/runtime":"7.1.2","@storybook/react":"3.4.11","babel-core":"7.0.0-bridge.0","babel-eslint":"10.0.1","babel-jest":"23.6.0","babel-loader":"8.0.4","babel-plugin-require-context-hook":"1.0.0","clean-webpack-plugin":"0.1.19","eslint":"5.6.1","eslint-config-airbnb":"17.1.0","eslint-config-prettier":"3.1.0","eslint-plugin-flowtype":"2.50.3","eslint-plugin-import":"2.14.0","eslint-plugin-jest":"21.24.0","eslint-plugin-jsx-a11y":"6.1.1","eslint-plugin-prettier":"3.0.0","eslint-plugin-promise":"4.0.1","eslint-plugin-react":"7.11.1","flow-bin":"0.82.0","jest":"23.6.0","prettier":"1.14.3","react":"16.5.2","react-dom":"16.5.2","webpack":"4.20.2","webpack-cli":"3.1.2"},"peerDependencies":{"nightwatch":">=0.9.x"},"gitHead":"1d0d5678675720b5a47b9f2b55b7fe1651a1f23a","readme":"# 🤖📗 PictureBook\n\nAutomated Storybook Setup\n\nSimplify Storybook story creation and cross-browser image comparison testing\n\n## 💡 Rationale\n\nSetting up storybook and implement cross-browser image comparison testing on multiple projects is time consuming.\n\nInstead of providing a wrapper on top of existing projects that will fall out of date, Picturebook lets you retain control of the Storybook and Nightwatch packages.\n\nThis project aims to provide utility methods to simplify [Storybook](https://storybook.js.org/), [SauceLabs](https://saucelabs.com/) and [Nightwatch](http://nightwatchjs.org/) configuration and screenshot comparison. Specifically:\n\n- **Creation of storybook stories**: They are created based on your file system structure\n- **Saucelabs tunnel setup**: Reduce SauceConnect config to the tunnel id and username / accessKey\n- **Screenshot**: Take screenshots of every story on different browsers using SauceLabs and Nightwatch\n- **Image Comparison**: Compare and update screenshots to baselines collocated with your stories.\n\n## ⚙️ Install\n\n1. You will need a SauceLabs account. If you don't have one you can sign up for a trial [here](https://signup.saucelabs.com/signup/trial) or request a free one for open source projects [here](https://saucelabs.com/open-source-request-account).\n1. If you want to run tests against Safari and IE11 from localhost, add `localtest.dev 127.0.0.1` to your `/etc/hosts` (the exact steps may vary depending on your platform, see [here](https://www.howtogeek.com/howto/27350/beginner-geek-how-to-edit-your-hosts-file/) for more details).\n1. Add picturebook and its peer dependencies:\n\n```sh\nyarn add --dev picturebook @storybook/react nightwatch react\n```\n\nReact is used in the examples but you can also use any flavor of storybook you want.\n\nIf you don't have Storybook set it up yet, follow [these instructions](https://storybook.js.org/basics/quick-start-guide/) first.\n\nSome of Picturebook utility methods rely on the output of `require.context`. This is a webpack construct and it's not available in Node or test environments. There are multiple ways to mock it. If you are using babel you could add the [require-context-hook](https://github.com/smrq/babel-plugin-require-context-hook) plugin. For instance, if you want to enable it only for tests, you can do something like:\n\n```json\n{\n  \"env\": {\n    \"test\": {\n      \"plugins\": [\"require-context-hook\"]\n    }\n  }\n}\n```\n\nand on your test setup:\n\n```js\nrequire('babel-plugin-require-context-hook/register')()\n```\n\nAlternatively, there's also the [require-context](https://www.npmjs.com/package/require-context) npm package that will also emulate webpack's `require.context`.\n\n## 📚 API\n\nThe API can be split into 2 sections, storybook creation for finding files in the file system and creating storybook stories around them and storybook testing, to connect to SauceLabs and run cross-browser image comparison tests.\n\n### Storybook creation\n\n`getFiles` and `loadStories` have very similar APIs and output.\n\n`getFiles` allows you to retrieve a list of related files. For instance if you have:\n\n```sh\nfile1.js\nfile1.md\nfile2.png\nfile2.js\n```\n\nIt will provide an array of 2 elements (file1 and file2) with the different related files grouped.\n\nThese values are used to identify helper files for stories where `*.md` is understood to be documentation,`.*(spec|test).js` is a test file and an unprefixed `*.js` file is a story. The `flattenFolders` parameters allow grouping nested folders as well. For instance if `flattenFolders: ['a']` `file1.js` and `a/file1.png` will be grouped together.\n\n`loadStories` provide the same functionality than `getFiles` but it also loads and creates storybook stories. This is why it requires storybook's [storiesOf](https://storybook.js.org/basics/writing-stories/#writing-stories) method as a parameter. The response is also similar but it includes a `main` method with the loaded story.\n\nYou can find the exact APIs below:\n\n```js\ntype StoryPaths = {|\n  name: string,\n  parents: $ReadOnlyArray<string>,\n  title: string,\n  path: string,\n  screenshots: {|\n    [extension: string]: string,\n  |},\n  tests: {|\n    [extension: string]: string,\n  |},\n  doc: ?string,\n  url: ?string,\n|}\n\n// Retrieve and group the different stories based on their filenames\nfunction getFiles({|\n  baseUrl?: string,              // The url for the story, defaults to:\n                                 //   'http://localhost:6006'\n  flattenFolders?: Array<string> // Folders to flatten\n                                 //   defaults to ['__snapshots__', '__screenshots__']\n  stories: any,                  // Output of require context with the stories\n  findKindAndStory?: (           // Customize \"selectedKind\" and \"selectedStory\" on the URL\n    story: StoryPaths,           //   this is not needed if stories are generated with \"loadStories\"\n  ) => {|\n    selectedKind: string,\n    selectedStory: string\n  |},\n  filter?: {|                    // Filter functions to determine how different files are grouped\n    screenshots?: (file: string) => boolean,\n    tests?: (file: string) => boolean,\n    docs?: (file: string) => boolean,\n    story?: (file: string, target: string) => boolean,\n  |}\n|}): Array<StoryPaths>\n\n// Retrieve, group, load and create stories\nfunction loadStories({|\n  baseUrl?: string,              // The url for the story, defaults to:\n                                 //   'http://localhost:6006'\n  flattenFolders?: Array<string> // Folders to flatten\n                                 //   defaults to ['__snapshots__', '__screenshots__']\n  stories: any,                  // Output of require context with the stories\n  decorators: $ReadOnlyArray<Function>,\n  storiesOf: any,\n  storyFiles: $ReadOnlyArray<string>,\n|}): Array<StoryPaths & {|\n  main: () => any,\n|}>\n```\n\n### Storybook testing\n\nOnce stories are loaded, `runTests` will connect to SauceLabs (optionally through a SauceConnect tunnel) and return a Promise that includes the results of the test.\n\nSince it uses `nightwatch` under the hood, you must have a valid nightwatch instance running. To assist with it, `nightwatchConfig` provides defaultValues\n\n```js\ntype Status = 'CREATED' | 'SUCCESS' | 'FAILED'\ntype ImgResults = {|\n    browser: string,\n    diffPath: ?string,\n    diffThreshold: number,\n    error: ?string,\n    name: string,\n    platform: string,\n    referencePath: ?string,\n    screenshotPath: ?string,\n    status: Status,\n  |}\n\n// Invoke nightwatch and run image comparison in SauceLabs\nfunction runTests(options: {|\n  configPath: string,           // absolute path to nightwatch config\n  files: Array<StoryPaths>,     // output of getFiles()\n  overwrite: boolean,           // true to replace failing or missing images\n  storyRoot: string,            // absolute path to the stories\n  tunnelId?: string,            // if set, it will set up a SC tunnel with the id\n  outputPath?: string,          // if set, where to store the test results as a\n                                // json file matching the return of `runTests`\n|}): Promise<{|\n  error: Error | null,          // null if there were no exceptions during tests\n  results: Array<ImgResults>,   // per browser / platform / story results\n  // An overall summary status. If any tests failed, it's FAILED, if any tests\n  // where created or updated it's CREATED, if all tests succeeded it's SUCCESS\n  // if no tests ran, it's EMPTY\n  status: Status | 'EMPTY',\n  counts: {|                    // counts for all tests\n    CREATED: number,\n    SUCCESS: number,\n    FAILED: number,\n  |},\n  version: string,              // picturebook version used\n  date: string,                 // ISO date when was the test report created\n|}>\n\n// Nightwatch config generation helper\nfunction nightwatchConfig(options: {|\n  desiredCapabilities?: {},     // nightwatch desired capabilities object\n  files: Array<StoryPaths>,     // output of getFiles()\n  username: string,             // SauceLabs username\n  access_key: string,           // SauceLabs accessKey\n  browsers?: {                  // List of browsers to test. Default list\n                                //   includes chrome, firefox, edge, ie11,\n                                //   iphone7 and safari but any valid SauceLabs\n                                //   config is valid\n    [browserName: string]: {\n      desiredCapabilities: {\n        platform: string,\n        version: string,\n        browserName: string,\n        screenResolution: string,\n      },\n      custom_vars: {|           // Custom properties required per browser config:\n        name: string,           // Must match \"browserName\"\n        platform: string,       // \"mobile\" | \"desktop\" but any string is allowed\n        extract?: {|            // If cropping the output, specify crop dimensions\n          top: number,\n          left: number,\n          width: number,\n          height: number,\n        |},\n      |},\n    },\n  },\n  // Alias for browsers where localhost cannot be accessed from a tunnel,\n  // defaults to \"localtest.dev\"\n  localhostAlias?: string,\n  // List of browsers that can't access localhost from a tunnel, defaults to:\n  // [\"ie11\", \"safari\"]\n  localhostAliasBrowsers?: Array<string>,\n  proxy?: {},                   // Nightwatch proxy object\n|}): Object\n```\n\n## 🎪 Sample App\n\nThis project includes a sample app to demo the behavior. You can view it running `yarn start` and opening `localhost:6006` on your browser.\n\nTo run the image comparison tests, keep `yarn start` running and call `SAUCE_ACCESS_KEY={YOUR_ACCESS_KEY} SAUCE_USERNAME={YOUR_USERNAME} yarn test:app`.\n\n## ️✏️ Storybook Usage\n\nTo take advantage of the automated storybook folder config (and testing) modify your storybook `config.js` to look like this:\n\n```js\nimport { storiesOf, configure } from '@storybook/react'\nimport * as picturebook from 'picturebook'\n\nfunction loadStories() {\n  picturebook.loadStories({\n    storiesOf,\n    stories: require.context('../stories', true, /\\.(js|md|png)/),\n  })\n}\n\nconfigure(loadStories, module)\n```\n\nIf you want to see a more advanced use case on how to use it with decorators and other plugins, check out the [sample project](./sampleFolder/.storybook/config.js).\n\n## 📸 Screenshot Usage\n\nTo take screenshots, picturebook relies on nightwatch. With the exception of a few required fields, configuration is generated for you. To take advantage of it you should create a `nightwatch.conf.js` file on your root (or customize it following instructions [here](http://nightwatchjs.org/gettingstarted#settings-file)).\n\n```js\nconst { resolve } = require('path')\nconst { nightwatchConfig, getFiles } = require('picturebook')\nconst requireContext = require('require-context')\n\nconst config = nightwatchConfig({\n  username: process.env.SAUCE_USERNAME,\n  access_key: process.env.SAUCE_ACCESS_KEY,\n  files: getFiles({\n    baseUrl: 'http://localhost:6006',\n    stories: requireContext(resolve(__dirname, './stories'), true, /\\.js/),\n  }),\n  desiredCapabilities: {\n    build: 'local',\n    'tunnel-identifier': 'picturebook-sample',\n  },\n})\n\nmodule.exports = config\n```\n\nTo take screenshots and run image comparison, you can call:\n\n```js\nrunTests({\n  storyRoot,\n  files: getFiles({\n    stories: requireContext(storyRoot, true, /\\.(js|png)/),\n  }),\n  overwrite,\n  tunnelId: 'picturebook-sample',\n  configPath: resolve(__dirname, 'nightwatch.conf.js'),\n})\n```\n\nNote that if using a tunnel, `tunnel-identifier` on your nightwatch config must match the `tunnelId` parameter passed to `runTests`.\n\n## 🙋 QYMA (Questions you may ask)\n\n### Why do I need to add localtest.dev as a localhost alias?\n\nThis is a SauceLabs issue. To work around it, `safari` and `edge` browsers replace `localhost` from urls to `localtest.dev` as described [here](https://support.saucelabs.com/hc/en-us/articles/225106887-Safari-and-Internet-Explorer-Won-t-Load-Website-When-Using-Sauce-Connect-on-Localhost).\n\nYou can customize the target browsers and localhost alias with the `localhostAliasBrowsers` and `localhostAlias`, respectively.\n\n### How do you skip some files?\n\nPicturebook will only take screenshots of the files you tell it exists. You can filter the output from [require.context](https://webpack.js.org/guides/dependency-management/#require-context) by specifying a different regExp to filter by.\n\n### SauceConnect ENOENT error\n\nIf you see the following error after a couple unsuccessful runs of SauceConnect:\n\n```sh\nevents.js:167\n      throw er; // Unhandled 'error' event\n      ^\n\nError: spawn ~/picturebook/node_modules/node-sauce-connect/lib/sc ENOENT\n```\n\nSometimes it gets stuck. Try cleaning `node_modules` and re-running yarn:\n\n```sh\nrm -rf node_modules\nyarn\n```\n\n### Error retrieving a new session from the selenium server\n\nThis is a Nightwatch issue, addressed in 1.0.4 versions of Nightwatch and later as per [this issue](https://github.com/nightwatchjs/nightwatch/issues/1772).\n\n### node-dir \"cannot read property 'files' of undefined\" error\n\nThere's currently a [bug in node-dir](https://github.com/fshost/node-dir/issues/53) that fails on empty dirs.\n\nRemove empty folders within your stories if you see the following error:\n\n```sh\nyourProject/node_modules/node-dir/lib/paths.js:92\n                results.files = results.files.concat(res.files);\n                                                         ^\n\nTypeError: Cannot read property 'files' of undefined\n    at subloop (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:92:58)\n    at /Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:107:13\n    at onDirRead (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:139:35)\n    at onStat (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:154:14)\n```\n\nYou can do so with:\n\n```sh\nfind /some/path -depth -type d -exec rmdir {} \\;\n```\n\n### No Java runtime present\n\nSelenium 3.0+ requires Java 8. Make sure it's installed if you get the following error:\n\n```sh\nStarting selenium server in parallel mode... There was an error while starting the Selenium server:\n\nNo Java runtime present, requesting install.\n```\n\nFor additional Selenium tips, check out [selenium-standalone tips](https://www.npmjs.com/package/selenium-standalone#tips).\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/obartra/picturebook/issues"},"homepage":"https://github.com/obartra/picturebook#readme","_id":"picturebook@2.0.0-beta.14","_npmVersion":"6.1.0","_nodeVersion":"10.6.0","_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"dist":{"integrity":"sha512-kLOj3TLIRmDAqfedWy99Njj+O8s2p5ZO2uWDq7843+XMU3b9sW5oR4ZtSrf/c4cmXgshNQy9v9alZ9rYITUIqw==","shasum":"7e9d70a46db70d5759a0b5a50d0ddf11683b72bd","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-2.0.0-beta.14.tgz","fileCount":164,"unpackedSize":3077517,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbygBFCRA9TVsSAnZWagAAjngP+gOW7KPRIjabaSbYJiCf\nCBnWgWxUbum+qslfhavojWOar3bn0vUWnlcO9pldZPxfWrzrpZIml4nisxxt\nsvtNaibTfbLZyBzuVilvCEnDQKXEVZc20ejzoRqjqYXFIYlFJymjDVgczSsZ\np14/8PVE1FFvHxRT0T778LJTCUnbud6NeMJzk9riO9PY5+ixfxoyGQdWiXCp\n/ZpnTYDkGw+lWQhtHzaOl7LgzDiHUsvt7C6YQh9i8/fNgZMoS+BwrjkP/tlD\nEIJ34Hwwz/z/D7YmBV4/ZoHP2L6rZ5beHUKl/k88dyzTegtpxpBMeVC7RdLm\n3AFxpCK2jyoAWQtg27qipHK9NqeSGXpzfFNvI232kEcCsLB4CWBkhdohkXp4\nxLOoJk1AizW5pY7/KxCKgNdhG4o6ILk4Yq0YW75Dukdu4T7sZYfL9qTjfwVz\n1w+vPPbfYjOCxkZiBDuKZdxi8m1gOCy3tEfaF/tTfK2IyUzZNON4hyDleCqz\nX7hqPVvxC4xr4HpzCBjo1ZcWG7RolxlC0FJX6TG+DCwrxyJmjojAdoorvtRt\n5vujfTnfQqFQU3d1PVrzWi37E6v8H27QcRdvnhJd+aCWVv9eyvUvOqD/QSx8\n/bYccID+QzieV6CAyb/WZLbMDmBlHhqFv7/7R+uyUlM0nrzZlxwAvMl+yGP4\nPk1r\r\n=i3Ga\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCHCaRerruPaY0jLymZQjuhWM8FwGsmoz4SKFF4E2cQ+wIgTFJyWEJ7xToUQ4W4BMtTgOK5xVnC6vuRxQsRci3z1TU="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook_2.0.0-beta.14_1539964996089_0.20433700382326037"},"_hasShrinkwrap":false},"2.0.0-beta.15":{"name":"picturebook","version":"2.0.0-beta.15","description":"Opinionated Storybook Setup","main":"dist/index.js","browser":"dist/picturebook.web.js","repository":{"type":"git","url":"git+https://github.com/obartra/picturebook.git"},"author":{"name":"Oscar Bartra"},"license":"MIT","scripts":{"format":"prettier --write \"{{src,test,sampleFolder}/**/,}*.js\"","test":"jest","lint":"eslint --ext .js --cache .","build":"webpack --mode production --config webpack.build.config.js && babel src -d dist --copy-files","build:watch":"yarn build --watch","test:watch":"yarn test --watch","start":"yarn && yarn build && cd sampleFolder && yarn && yarn start","test:app":"cd sampleFolder && yarn test --env chrome,firefox,ie11,edge,safari,iphone7","update-deps":"yarn upgrade --exact --latest && cd sampleFolder && yarn upgrade --exact --latest && cd .. && yarn ci","ci":"yarn build && yarn lint && yarn flow check && yarn test"},"dependencies":{"fs-extra":"7.0.0","lodash":"4.17.11","pixelmatch":"4.0.2","png-crop":"0.0.2","pngjs":"3.3.3","rimraf":"2.6.2","selenium-server-standalone-jar":"3.14.0"},"devDependencies":{"@babel/cli":"7.1.2","@babel/core":"7.1.2","@babel/plugin-proposal-object-rest-spread":"7.0.0","@babel/plugin-transform-regenerator":"7.0.0","@babel/plugin-transform-runtime":"7.1.0","@babel/preset-env":"7.1.0","@babel/preset-flow":"7.0.0","@babel/preset-react":"7.0.0","@babel/runtime":"7.1.2","@storybook/react":"3.4.11","babel-core":"7.0.0-bridge.0","babel-eslint":"10.0.1","babel-jest":"23.6.0","babel-loader":"8.0.4","babel-plugin-require-context-hook":"1.0.0","clean-webpack-plugin":"0.1.19","eslint":"5.6.1","eslint-config-airbnb":"17.1.0","eslint-config-prettier":"3.1.0","eslint-plugin-flowtype":"2.50.3","eslint-plugin-import":"2.14.0","eslint-plugin-jest":"21.24.0","eslint-plugin-jsx-a11y":"6.1.1","eslint-plugin-prettier":"3.0.0","eslint-plugin-promise":"4.0.1","eslint-plugin-react":"7.11.1","flow-bin":"0.82.0","jest":"23.6.0","prettier":"1.14.3","react":"16.5.2","react-dom":"16.5.2","webpack":"4.20.2","webpack-cli":"3.1.2"},"peerDependencies":{"nightwatch":">=0.9.x"},"gitHead":"b22d970fe4534cf45b294cd2e3a428e7f47af097","readme":"# 🤖📗 PictureBook\n\nAutomated Storybook Setup\n\nSimplify Storybook story creation and cross-browser image comparison testing\n\n## 💡 Rationale\n\nSetting up storybook and implement cross-browser image comparison testing on multiple projects is time consuming.\n\nInstead of providing a wrapper on top of existing projects that will fall out of date, Picturebook lets you retain control of the Storybook and Nightwatch packages.\n\nThis project aims to provide utility methods to simplify [Storybook](https://storybook.js.org/), [SauceLabs](https://saucelabs.com/) and [Nightwatch](http://nightwatchjs.org/) configuration and screenshot comparison. Specifically:\n\n- **Creation of storybook stories**: They are created based on your file system structure\n- **Saucelabs tunnel setup**: Reduce SauceConnect config to the tunnel id and username / accessKey\n- **Screenshot**: Take screenshots of every story on different browsers using SauceLabs and Nightwatch\n- **Image Comparison**: Compare and update screenshots to baselines collocated with your stories.\n\n## ⚙️ Install\n\n1. You will need a SauceLabs account. If you don't have one you can sign up for a trial [here](https://signup.saucelabs.com/signup/trial) or request a free one for open source projects [here](https://saucelabs.com/open-source-request-account).\n1. If you want to run tests against Safari and IE11 from localhost, add `localtest.dev 127.0.0.1` to your `/etc/hosts` (the exact steps may vary depending on your platform, see [here](https://www.howtogeek.com/howto/27350/beginner-geek-how-to-edit-your-hosts-file/) for more details).\n1. Add picturebook and its peer dependencies:\n\n```sh\nyarn add --dev picturebook @storybook/react nightwatch react\n```\n\nReact is used in the examples but you can also use any flavor of storybook you want.\n\nIf you don't have Storybook set it up yet, follow [these instructions](https://storybook.js.org/basics/quick-start-guide/) first.\n\nSome of Picturebook utility methods rely on the output of `require.context`. This is a webpack construct and it's not available in Node or test environments. There are multiple ways to mock it. If you are using babel you could add the [require-context-hook](https://github.com/smrq/babel-plugin-require-context-hook) plugin. For instance, if you want to enable it only for tests, you can do something like:\n\n```json\n{\n  \"env\": {\n    \"test\": {\n      \"plugins\": [\"require-context-hook\"]\n    }\n  }\n}\n```\n\nand on your test setup:\n\n```js\nrequire('babel-plugin-require-context-hook/register')()\n```\n\nAlternatively, there's also the [require-context](https://www.npmjs.com/package/require-context) npm package that will also emulate webpack's `require.context`.\n\n## 📚 API\n\nThe API can be split into 2 sections, storybook creation for finding files in the file system and creating storybook stories around them and storybook testing, to connect to SauceLabs and run cross-browser image comparison tests.\n\n### Storybook creation\n\n`getFiles` and `loadStories` have very similar APIs and output.\n\n`getFiles` allows you to retrieve a list of related files. For instance if you have:\n\n```sh\nfile1.js\nfile1.md\nfile2.png\nfile2.js\n```\n\nIt will provide an array of 2 elements (file1 and file2) with the different related files grouped.\n\nThese values are used to identify helper files for stories where `*.md` is understood to be documentation,`.*(spec|test).js` is a test file and an unprefixed `*.js` file is a story. The `flattenFolders` parameters allow grouping nested folders as well. For instance if `flattenFolders: ['a']` `file1.js` and `a/file1.png` will be grouped together.\n\n`loadStories` provide the same functionality than `getFiles` but it also loads and creates storybook stories. This is why it requires storybook's [storiesOf](https://storybook.js.org/basics/writing-stories/#writing-stories) method as a parameter. The response is also similar but it includes a `main` method with the loaded story.\n\nYou can find the exact APIs below:\n\n```js\ntype StoryPaths = {|\n  name: string,\n  parents: $ReadOnlyArray<string>,\n  title: string,\n  path: string,\n  screenshots: {|\n    [extension: string]: string,\n  |},\n  tests: {|\n    [extension: string]: string,\n  |},\n  doc: ?string,\n  url: ?string,\n|}\n\n// Retrieve and group the different stories based on their filenames\nfunction getFiles({|\n  baseUrl?: string,              // The url for the story, defaults to:\n                                 //   'http://localhost:6006'\n  flattenFolders?: Array<string> // Folders to flatten\n                                 //   defaults to ['__snapshots__', '__screenshots__']\n  stories: any,                  // Output of require context with the stories\n  findKindAndStory?: (           // Customize \"selectedKind\" and \"selectedStory\" on the URL\n    story: StoryPaths,           //   this is not needed if stories are generated with \"loadStories\"\n  ) => {|\n    selectedKind: string,\n    selectedStory: string\n  |},\n  filter?: {|                    // Filter functions to determine how different files are grouped\n    screenshots?: (file: string) => boolean,\n    tests?: (file: string) => boolean,\n    docs?: (file: string) => boolean,\n    story?: (file: string, target: string) => boolean,\n  |}\n|}): Array<StoryPaths>\n\n// Retrieve, group, load and create stories\nfunction loadStories({|\n  baseUrl?: string,              // The url for the story, defaults to:\n                                 //   'http://localhost:6006'\n  flattenFolders?: Array<string> // Folders to flatten\n                                 //   defaults to ['__snapshots__', '__screenshots__']\n  stories: any,                  // Output of require context with the stories\n  decorators: $ReadOnlyArray<Function>,\n  storiesOf: any,\n  storyFiles: $ReadOnlyArray<string>,\n|}): Array<StoryPaths & {|\n  main: () => any,\n|}>\n```\n\n### Storybook testing\n\nOnce stories are loaded, `runTests` will connect to SauceLabs (optionally through a SauceConnect tunnel) and return a Promise that includes the results of the test.\n\nSince it uses `nightwatch` under the hood, you must have a valid nightwatch instance running. To assist with it, `nightwatchConfig` provides defaultValues\n\n```js\ntype Status = 'CREATED' | 'SUCCESS' | 'FAILED'\ntype ImgResults = {|\n    browser: string,\n    diffPath: ?string,\n    diffThreshold: number,\n    error: ?string,\n    name: string,\n    platform: string,\n    referencePath: ?string,\n    screenshotPath: ?string,\n    status: Status,\n  |}\n\n// Invoke nightwatch and run image comparison in SauceLabs\nfunction runTests(options: {|\n  configPath: string,           // absolute path to nightwatch config\n  files: Array<StoryPaths>,     // output of getFiles()\n  overwrite: boolean,           // true to replace failing or missing images\n  storyRoot: string,            // absolute path to the stories\n  tunnelId?: string,            // if set, it will set up a SC tunnel with the id\n  outputPath?: string,          // if set, where to store the test results as a\n                                // json file matching the return of `runTests`\n|}): Promise<{|\n  error: Error | null,          // null if there were no exceptions during tests\n  results: Array<ImgResults>,   // per browser / platform / story results\n  // An overall summary status. If any tests failed, it's FAILED, if any tests\n  // where created or updated it's CREATED, if all tests succeeded it's SUCCESS\n  // if no tests ran, it's EMPTY\n  status: Status | 'EMPTY',\n  counts: {|                    // counts for all tests\n    CREATED: number,\n    SUCCESS: number,\n    FAILED: number,\n  |},\n  version: string,              // picturebook version used\n  date: string,                 // ISO date when was the test report created\n|}>\n\n// Nightwatch config generation helper\nfunction nightwatchConfig(options: {|\n  desiredCapabilities?: {},     // nightwatch desired capabilities object\n  files: Array<StoryPaths>,     // output of getFiles()\n  username: string,             // SauceLabs username\n  access_key: string,           // SauceLabs accessKey\n  browsers?: {                  // List of browsers to test. Default list\n                                //   includes chrome, firefox, edge, ie11,\n                                //   iphone7 and safari but any valid SauceLabs\n                                //   config is valid\n    [browserName: string]: {\n      desiredCapabilities: {\n        platform: string,\n        version: string,\n        browserName: string,\n        screenResolution: string,\n      },\n      custom_vars: {|           // Custom properties required per browser config:\n        name: string,           // Must match \"browserName\"\n        platform: string,       // \"mobile\" | \"desktop\" but any string is allowed\n        extract?: {|            // If cropping the output, specify crop dimensions\n          top: number,\n          left: number,\n          width: number,\n          height: number,\n        |},\n      |},\n    },\n  },\n  // Alias for browsers where localhost cannot be accessed from a tunnel,\n  // defaults to \"localtest.dev\"\n  localhostAlias?: string,\n  // List of browsers that can't access localhost from a tunnel, defaults to:\n  // [\"ie11\", \"safari\"]\n  localhostAliasBrowsers?: Array<string>,\n  proxy?: {},                   // Nightwatch proxy object\n|}): Object\n```\n\n## 🎪 Sample App\n\nThis project includes a sample app to demo the behavior. You can view it running `yarn start` and opening `localhost:6006` on your browser.\n\nTo run the image comparison tests, keep `yarn start` running and call `SAUCE_ACCESS_KEY={YOUR_ACCESS_KEY} SAUCE_USERNAME={YOUR_USERNAME} yarn test:app`.\n\n## ️✏️ Storybook Usage\n\nTo take advantage of the automated storybook folder config (and testing) modify your storybook `config.js` to look like this:\n\n```js\nimport { storiesOf, configure } from '@storybook/react'\nimport * as picturebook from 'picturebook'\n\nfunction loadStories() {\n  picturebook.loadStories({\n    storiesOf,\n    stories: require.context('../stories', true, /\\.(js|md|png)/),\n  })\n}\n\nconfigure(loadStories, module)\n```\n\nIf you want to see a more advanced use case on how to use it with decorators and other plugins, check out the [sample project](./sampleFolder/.storybook/config.js).\n\n## 📸 Screenshot Usage\n\nTo take screenshots, picturebook relies on nightwatch. With the exception of a few required fields, configuration is generated for you. To take advantage of it you should create a `nightwatch.conf.js` file on your root (or customize it following instructions [here](http://nightwatchjs.org/gettingstarted#settings-file)).\n\n```js\nconst { resolve } = require('path')\nconst { nightwatchConfig, getFiles } = require('picturebook')\nconst requireContext = require('require-context')\n\nconst config = nightwatchConfig({\n  username: process.env.SAUCE_USERNAME,\n  access_key: process.env.SAUCE_ACCESS_KEY,\n  files: getFiles({\n    baseUrl: 'http://localhost:6006',\n    stories: requireContext(resolve(__dirname, './stories'), true, /\\.js/),\n  }),\n  desiredCapabilities: {\n    build: 'local',\n    'tunnel-identifier': 'picturebook-sample',\n  },\n})\n\nmodule.exports = config\n```\n\nTo take screenshots and run image comparison, you can call:\n\n```js\nrunTests({\n  storyRoot,\n  files: getFiles({\n    stories: requireContext(storyRoot, true, /\\.(js|png)/),\n  }),\n  overwrite,\n  tunnelId: 'picturebook-sample',\n  configPath: resolve(__dirname, 'nightwatch.conf.js'),\n})\n```\n\nNote that if using a tunnel, `tunnel-identifier` on your nightwatch config must match the `tunnelId` parameter passed to `runTests`.\n\n## 🙋 QYMA (Questions you may ask)\n\n### Why do I need to add localtest.dev as a localhost alias?\n\nThis is a SauceLabs issue. To work around it, `safari` and `edge` browsers replace `localhost` from urls to `localtest.dev` as described [here](https://support.saucelabs.com/hc/en-us/articles/225106887-Safari-and-Internet-Explorer-Won-t-Load-Website-When-Using-Sauce-Connect-on-Localhost).\n\nYou can customize the target browsers and localhost alias with the `localhostAliasBrowsers` and `localhostAlias`, respectively.\n\n### How do you skip some files?\n\nPicturebook will only take screenshots of the files you tell it exists. You can filter the output from [require.context](https://webpack.js.org/guides/dependency-management/#require-context) by specifying a different regExp to filter by.\n\n### SauceConnect ENOENT error\n\nIf you see the following error after a couple unsuccessful runs of SauceConnect:\n\n```sh\nevents.js:167\n      throw er; // Unhandled 'error' event\n      ^\n\nError: spawn ~/picturebook/node_modules/node-sauce-connect/lib/sc ENOENT\n```\n\nSometimes it gets stuck. Try cleaning `node_modules` and re-running yarn:\n\n```sh\nrm -rf node_modules\nyarn\n```\n\n### Error retrieving a new session from the selenium server\n\nThis is a Nightwatch issue, addressed in 1.0.4 versions of Nightwatch and later as per [this issue](https://github.com/nightwatchjs/nightwatch/issues/1772).\n\n### node-dir \"cannot read property 'files' of undefined\" error\n\nThere's currently a [bug in node-dir](https://github.com/fshost/node-dir/issues/53) that fails on empty dirs.\n\nRemove empty folders within your stories if you see the following error:\n\n```sh\nyourProject/node_modules/node-dir/lib/paths.js:92\n                results.files = results.files.concat(res.files);\n                                                         ^\n\nTypeError: Cannot read property 'files' of undefined\n    at subloop (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:92:58)\n    at /Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:107:13\n    at onDirRead (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:139:35)\n    at onStat (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:154:14)\n```\n\nYou can do so with:\n\n```sh\nfind /some/path -depth -type d -exec rmdir {} \\;\n```\n\n### No Java runtime present\n\nSelenium 3.0+ requires Java 8. Make sure it's installed if you get the following error:\n\n```sh\nStarting selenium server in parallel mode... There was an error while starting the Selenium server:\n\nNo Java runtime present, requesting install.\n```\n\nFor additional Selenium tips, check out [selenium-standalone tips](https://www.npmjs.com/package/selenium-standalone#tips).\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/obartra/picturebook/issues"},"homepage":"https://github.com/obartra/picturebook#readme","_id":"picturebook@2.0.0-beta.15","_npmVersion":"6.1.0","_nodeVersion":"10.6.0","_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"dist":{"integrity":"sha512-8SMBrs2E4x33cWnMJYfPFKB96zFozGwQVO25K7G4rwI254Y9SNZmNq840VsHKyl7uF7utbUFCco8aKr0W2Z4dw==","shasum":"cfd1b2c06c84619a2f2a4df9f5cc17cf8156f629","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-2.0.0-beta.15.tgz","fileCount":85,"unpackedSize":1341684,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbygHuCRA9TVsSAnZWagAAWbkP/RHavZhgAZg4ysbcj+Ry\nBTqbY74HJN30X2COFK1tGKEWUVk8NMKfzSaq6l1utixeQUXmbypBz5elOfyN\nLRCwljQk8MIcPSd93/GJ/9ZQLmid6wCnDJBNmppQ4fibh9GCFFBpUAukZTKA\nwkpu97QXlGnysY+jWRAiwEvEsv2Ny0ZGwNtlM6UsbHUEw/H/mzM5fHKKC13o\nYK8Rx2IKG3oRUHQF57t3GCzPn/ApOfz5WVBXl2UBA53gaVgFywABT8n6IHue\nCEPboeLBcGI/hHSuJLL2zjbRmxeKK07+qscW0+Iw/KykjrZfObKEOTbdnPbT\niC1DkKXygTywFSzT3G9Tu+x7dDP71jD7JzFWj/Poh9p6+9ZS0kqXTat3MY8M\nQWIQRZknNsAUF9bjWkScvmBMSstQhX+NIq9jY0YoG+1PZyR2yI+heZwFD2aW\n4eU7Ky4cZt+oDspaBz7N+XtPSSXTqowmw3s9EVQOCkQ3PEQ6IzXrkZ6Lg3u6\nc+/lqFvPAQHGLD5zl1AcoRNWLDioHhFDOSpBhmi4toAsQq4f+WtFS6ck/Ijh\nubDJcNliR38uVzX9Cp9ipT64mgShjaUxLZIqa7JrsIFg7kON4ce83j7tFMFS\nBNjIc9kD2HsllyK0kEJ1hCrbm/S0zPet1Ldbijq5SBuofiI/jPPDDJ46tldS\naH/i\r\n=eMT8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC5gIINmoCMPMvymEATAyOMeFa+FoAqyFL0bb1RkrcpFAiEAx+2ahHM6oWnFwfJKrUvFYgSoO2nNOY739cKO7zDuMnw="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook_2.0.0-beta.15_1539965422157_0.8061403804562273"},"_hasShrinkwrap":false},"2.0.0-beta.16":{"name":"picturebook","version":"2.0.0-beta.16","description":"Opinionated Storybook Setup","main":"dist/index.js","browser":"dist/picturebook.web.js","repository":{"type":"git","url":"git+https://github.com/obartra/picturebook.git"},"author":{"name":"Oscar Bartra"},"license":"MIT","scripts":{"format":"prettier --write \"{{src,test,sampleFolder}/**/,}*.js\"","test":"jest","lint":"eslint --ext .js --cache .","build":"webpack --mode production --config webpack.build.config.js && babel src -d dist --copy-files","build:watch":"yarn build --watch","test:watch":"yarn test --watch","start":"yarn && yarn build && cd sampleFolder && yarn && yarn start","test:app":"cd sampleFolder && yarn test --env chrome,firefox,ie11,edge,safari,iphone7","update-deps":"yarn upgrade --exact --latest && cd sampleFolder && yarn upgrade --exact --latest && cd .. && yarn ci","ci":"yarn build && yarn lint && yarn flow check && yarn test"},"dependencies":{"fs-extra":"7.0.0","lodash":"4.17.11","pixelmatch":"4.0.2","png-crop":"0.0.2","pngjs":"3.3.3","rimraf":"2.6.2","selenium-server-standalone-jar":"3.14.0"},"devDependencies":{"@babel/cli":"7.1.2","@babel/core":"7.1.2","@babel/plugin-proposal-object-rest-spread":"7.0.0","@babel/plugin-transform-regenerator":"7.0.0","@babel/plugin-transform-runtime":"7.1.0","@babel/preset-env":"7.1.0","@babel/preset-flow":"7.0.0","@babel/preset-react":"7.0.0","@babel/runtime":"7.1.2","@storybook/react":"3.4.11","babel-core":"7.0.0-bridge.0","babel-eslint":"10.0.1","babel-jest":"23.6.0","babel-loader":"8.0.4","babel-plugin-require-context-hook":"1.0.0","clean-webpack-plugin":"0.1.19","eslint":"5.6.1","eslint-config-airbnb":"17.1.0","eslint-config-prettier":"3.1.0","eslint-plugin-flowtype":"2.50.3","eslint-plugin-import":"2.14.0","eslint-plugin-jest":"21.24.0","eslint-plugin-jsx-a11y":"6.1.1","eslint-plugin-prettier":"3.0.0","eslint-plugin-promise":"4.0.1","eslint-plugin-react":"7.11.1","flow-bin":"0.82.0","jest":"23.6.0","prettier":"1.14.3","react":"16.5.2","react-dom":"16.5.2","webpack":"4.20.2","webpack-cli":"3.1.2"},"peerDependencies":{"nightwatch":">=0.9.x"},"readme":"# 🤖📗 PictureBook\n\nAutomated Storybook Setup\n\nSimplify Storybook story creation and cross-browser image comparison testing\n\n## 💡 Rationale\n\nSetting up storybook and implement cross-browser image comparison testing on multiple projects is time consuming.\n\nInstead of providing a wrapper on top of existing projects that will fall out of date, Picturebook lets you retain control of the Storybook and Nightwatch packages.\n\nThis project aims to provide utility methods to simplify [Storybook](https://storybook.js.org/), [SauceLabs](https://saucelabs.com/) and [Nightwatch](http://nightwatchjs.org/) configuration and screenshot comparison. Specifically:\n\n- **Creation of storybook stories**: They are created based on your file system structure\n- **Saucelabs tunnel setup**: Reduce SauceConnect config to the tunnel id and username / accessKey\n- **Screenshot**: Take screenshots of every story on different browsers using SauceLabs and Nightwatch\n- **Image Comparison**: Compare and update screenshots to baselines collocated with your stories.\n\n## ⚙️ Install\n\n1. You will need a SauceLabs account. If you don't have one you can sign up for a trial [here](https://signup.saucelabs.com/signup/trial) or request a free one for open source projects [here](https://saucelabs.com/open-source-request-account).\n1. If you want to run tests against Safari and IE11 from localhost, add `localtest.dev 127.0.0.1` to your `/etc/hosts` (the exact steps may vary depending on your platform, see [here](https://www.howtogeek.com/howto/27350/beginner-geek-how-to-edit-your-hosts-file/) for more details).\n1. Add picturebook and its peer dependencies:\n\n```sh\nyarn add --dev picturebook @storybook/react nightwatch react\n```\n\nReact is used in the examples but you can also use any flavor of storybook you want.\n\nIf you don't have Storybook set it up yet, follow [these instructions](https://storybook.js.org/basics/quick-start-guide/) first.\n\nSome of Picturebook utility methods rely on the output of `require.context`. This is a webpack construct and it's not available in Node or test environments. There are multiple ways to mock it. If you are using babel you could add the [require-context-hook](https://github.com/smrq/babel-plugin-require-context-hook) plugin. For instance, if you want to enable it only for tests, you can do something like:\n\n```json\n{\n  \"env\": {\n    \"test\": {\n      \"plugins\": [\"require-context-hook\"]\n    }\n  }\n}\n```\n\nand on your test setup:\n\n```js\nrequire('babel-plugin-require-context-hook/register')()\n```\n\nAlternatively, there's also the [require-context](https://www.npmjs.com/package/require-context) npm package that will also emulate webpack's `require.context`.\n\n## 📚 API\n\nThe API can be split into 2 sections, storybook creation for finding files in the file system and creating storybook stories around them and storybook testing, to connect to SauceLabs and run cross-browser image comparison tests.\n\n### Storybook creation\n\n`getFiles` and `loadStories` have very similar APIs and output.\n\n`getFiles` allows you to retrieve a list of related files. For instance if you have:\n\n```sh\nfile1.js\nfile1.md\nfile2.png\nfile2.js\n```\n\nIt will provide an array of 2 elements (file1 and file2) with the different related files grouped.\n\nThese values are used to identify helper files for stories where `*.md` is understood to be documentation,`.*(spec|test).js` is a test file and an unprefixed `*.js` file is a story. The `flattenFolders` parameters allow grouping nested folders as well. For instance if `flattenFolders: ['a']` `file1.js` and `a/file1.png` will be grouped together.\n\n`loadStories` provide the same functionality than `getFiles` but it also loads and creates storybook stories. This is why it requires storybook's [storiesOf](https://storybook.js.org/basics/writing-stories/#writing-stories) method as a parameter. The response is also similar but it includes a `main` method with the loaded story.\n\nYou can find the exact APIs below:\n\n```js\ntype StoryPaths = {|\n  name: string,\n  parents: $ReadOnlyArray<string>,\n  title: string,\n  path: string,\n  screenshots: {|\n    [extension: string]: string,\n  |},\n  tests: {|\n    [extension: string]: string,\n  |},\n  doc: ?string,\n  url: ?string,\n|}\n\n// Retrieve and group the different stories based on their filenames\nfunction getFiles({|\n  baseUrl?: string,              // The url for the story, defaults to:\n                                 //   'http://localhost:6006'\n  flattenFolders?: Array<string> // Folders to flatten\n                                 //   defaults to ['__snapshots__', '__screenshots__']\n  stories: any,                  // Output of require context with the stories\n  findKindAndStory?: (           // Customize \"selectedKind\" and \"selectedStory\" on the URL\n    story: StoryPaths,           //   this is not needed if stories are generated with \"loadStories\"\n  ) => {|\n    selectedKind: string,\n    selectedStory: string\n  |},\n  filter?: {|                    // Filter functions to determine how different files are grouped\n    screenshots?: (file: string) => boolean,\n    tests?: (file: string) => boolean,\n    docs?: (file: string) => boolean,\n    story?: (file: string, target: string) => boolean,\n  |}\n|}): Array<StoryPaths>\n\n// Retrieve, group, load and create stories\nfunction loadStories({|\n  baseUrl?: string,              // The url for the story, defaults to:\n                                 //   'http://localhost:6006'\n  flattenFolders?: Array<string> // Folders to flatten\n                                 //   defaults to ['__snapshots__', '__screenshots__']\n  stories: any,                  // Output of require context with the stories\n  decorators: $ReadOnlyArray<Function>,\n  storiesOf: any,\n  storyFiles: $ReadOnlyArray<string>,\n|}): Array<StoryPaths & {|\n  main: () => any,\n|}>\n```\n\n### Storybook testing\n\nOnce stories are loaded, `runTests` will connect to SauceLabs (optionally through a SauceConnect tunnel) and return a Promise that includes the results of the test.\n\nSince it uses `nightwatch` under the hood, you must have a valid nightwatch instance running. To assist with it, `nightwatchConfig` provides defaultValues\n\n```js\ntype Status = 'CREATED' | 'SUCCESS' | 'FAILED'\ntype ImgResults = {|\n    browser: string,\n    diffPath: ?string,\n    diffThreshold: number,\n    error: ?string,\n    name: string,\n    platform: string,\n    referencePath: ?string,\n    screenshotPath: ?string,\n    status: Status,\n  |}\n\n// Invoke nightwatch and run image comparison in SauceLabs\nfunction runTests(options: {|\n  configPath: string,           // absolute path to nightwatch config\n  files: Array<StoryPaths>,     // output of getFiles()\n  overwrite: boolean,           // true to replace failing or missing images\n  storyRoot: string,            // absolute path to the stories\n  tunnelId?: string,            // if set, it will set up a SC tunnel with the id\n  outputPath?: string,          // if set, where to store the test results as a\n                                // json file matching the return of `runTests`\n|}): Promise<{|\n  error: Error | null,          // null if there were no exceptions during tests\n  results: Array<ImgResults>,   // per browser / platform / story results\n  // An overall summary status. If any tests failed, it's FAILED, if any tests\n  // where created or updated it's CREATED, if all tests succeeded it's SUCCESS\n  // if no tests ran, it's EMPTY\n  status: Status | 'EMPTY',\n  counts: {|                    // counts for all tests\n    CREATED: number,\n    SUCCESS: number,\n    FAILED: number,\n  |},\n  version: string,              // picturebook version used\n  date: string,                 // ISO date when was the test report created\n|}>\n\n// Nightwatch config generation helper\nfunction nightwatchConfig(options: {|\n  desiredCapabilities?: {},     // nightwatch desired capabilities object\n  files: Array<StoryPaths>,     // output of getFiles()\n  username: string,             // SauceLabs username\n  access_key: string,           // SauceLabs accessKey\n  browsers?: {                  // List of browsers to test. Default list\n                                //   includes chrome, firefox, edge, ie11,\n                                //   iphone7 and safari but any valid SauceLabs\n                                //   config is valid\n    [browserName: string]: {\n      desiredCapabilities: {\n        platform: string,\n        version: string,\n        browserName: string,\n        screenResolution: string,\n      },\n      custom_vars: {|           // Custom properties required per browser config:\n        name: string,           // Must match \"browserName\"\n        platform: string,       // \"mobile\" | \"desktop\" but any string is allowed\n        extract?: {|            // If cropping the output, specify crop dimensions\n          top: number,\n          left: number,\n          width: number,\n          height: number,\n        |},\n      |},\n    },\n  },\n  // Alias for browsers where localhost cannot be accessed from a tunnel,\n  // defaults to \"localtest.dev\"\n  localhostAlias?: string,\n  // List of browsers that can't access localhost from a tunnel, defaults to:\n  // [\"ie11\", \"safari\"]\n  localhostAliasBrowsers?: Array<string>,\n  proxy?: {},                   // Nightwatch proxy object\n|}): Object\n```\n\n## 🎪 Sample App\n\nThis project includes a sample app to demo the behavior. You can view it running `yarn start` and opening `localhost:6006` on your browser.\n\nTo run the image comparison tests, keep `yarn start` running and call `SAUCE_ACCESS_KEY={YOUR_ACCESS_KEY} SAUCE_USERNAME={YOUR_USERNAME} yarn test:app`.\n\n## ️✏️ Storybook Usage\n\nTo take advantage of the automated storybook folder config (and testing) modify your storybook `config.js` to look like this:\n\n```js\nimport { storiesOf, configure } from '@storybook/react'\nimport * as picturebook from 'picturebook'\n\nfunction loadStories() {\n  picturebook.loadStories({\n    storiesOf,\n    stories: require.context('../stories', true, /\\.(js|md|png)/),\n  })\n}\n\nconfigure(loadStories, module)\n```\n\nIf you want to see a more advanced use case on how to use it with decorators and other plugins, check out the [sample project](./sampleFolder/.storybook/config.js).\n\n## 📸 Screenshot Usage\n\nTo take screenshots, picturebook relies on nightwatch. With the exception of a few required fields, configuration is generated for you. To take advantage of it you should create a `nightwatch.conf.js` file on your root (or customize it following instructions [here](http://nightwatchjs.org/gettingstarted#settings-file)).\n\n```js\nconst { resolve } = require('path')\nconst { nightwatchConfig, getFiles } = require('picturebook')\nconst requireContext = require('require-context')\n\nconst config = nightwatchConfig({\n  username: process.env.SAUCE_USERNAME,\n  access_key: process.env.SAUCE_ACCESS_KEY,\n  files: getFiles({\n    baseUrl: 'http://localhost:6006',\n    stories: requireContext(resolve(__dirname, './stories'), true, /\\.js/),\n  }),\n  desiredCapabilities: {\n    build: 'local',\n    'tunnel-identifier': 'picturebook-sample',\n  },\n})\n\nmodule.exports = config\n```\n\nTo take screenshots and run image comparison, you can call:\n\n```js\nrunTests({\n  storyRoot,\n  files: getFiles({\n    stories: requireContext(storyRoot, true, /\\.(js|png)/),\n  }),\n  overwrite,\n  tunnelId: 'picturebook-sample',\n  configPath: resolve(__dirname, 'nightwatch.conf.js'),\n})\n```\n\nNote that if using a tunnel, `tunnel-identifier` on your nightwatch config must match the `tunnelId` parameter passed to `runTests`.\n\n## 🙋 QYMA (Questions you may ask)\n\n### Why do I need to add localtest.dev as a localhost alias?\n\nThis is a SauceLabs issue. To work around it, `safari` and `edge` browsers replace `localhost` from urls to `localtest.dev` as described [here](https://support.saucelabs.com/hc/en-us/articles/225106887-Safari-and-Internet-Explorer-Won-t-Load-Website-When-Using-Sauce-Connect-on-Localhost).\n\nYou can customize the target browsers and localhost alias with the `localhostAliasBrowsers` and `localhostAlias`, respectively.\n\n### How do you skip some files?\n\nPicturebook will only take screenshots of the files you tell it exists. You can filter the output from [require.context](https://webpack.js.org/guides/dependency-management/#require-context) by specifying a different regExp to filter by.\n\n### SauceConnect ENOENT error\n\nIf you see the following error after a couple unsuccessful runs of SauceConnect:\n\n```sh\nevents.js:167\n      throw er; // Unhandled 'error' event\n      ^\n\nError: spawn ~/picturebook/node_modules/node-sauce-connect/lib/sc ENOENT\n```\n\nSometimes it gets stuck. Try cleaning `node_modules` and re-running yarn:\n\n```sh\nrm -rf node_modules\nyarn\n```\n\n### Error retrieving a new session from the selenium server\n\nThis is a Nightwatch issue, addressed in 1.0.4 versions of Nightwatch and later as per [this issue](https://github.com/nightwatchjs/nightwatch/issues/1772).\n\n### node-dir \"cannot read property 'files' of undefined\" error\n\nThere's currently a [bug in node-dir](https://github.com/fshost/node-dir/issues/53) that fails on empty dirs.\n\nRemove empty folders within your stories if you see the following error:\n\n```sh\nyourProject/node_modules/node-dir/lib/paths.js:92\n                results.files = results.files.concat(res.files);\n                                                         ^\n\nTypeError: Cannot read property 'files' of undefined\n    at subloop (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:92:58)\n    at /Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:107:13\n    at onDirRead (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:139:35)\n    at onStat (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:154:14)\n```\n\nYou can do so with:\n\n```sh\nfind /some/path -depth -type d -exec rmdir {} \\;\n```\n\n### No Java runtime present\n\nSelenium 3.0+ requires Java 8. Make sure it's installed if you get the following error:\n\n```sh\nStarting selenium server in parallel mode... There was an error while starting the Selenium server:\n\nNo Java runtime present, requesting install.\n```\n\nFor additional Selenium tips, check out [selenium-standalone tips](https://www.npmjs.com/package/selenium-standalone#tips).\n","readmeFilename":"README.md","gitHead":"4f05b2d23b4b61ae1a17054e302d297eeef58c9f","bugs":{"url":"https://github.com/obartra/picturebook/issues"},"homepage":"https://github.com/obartra/picturebook#readme","_id":"picturebook@2.0.0-beta.16","_npmVersion":"6.1.0","_nodeVersion":"10.6.0","_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"dist":{"integrity":"sha512-cdtDsMCtHjEOlD3sDvW6Gwphw2SGVco95ulJhqGttq5VxMYEWmnHRL1bgKRR/IT2HO3DDBAXgQzqO/MC7G1g0w==","shasum":"9e6ea4dfa5e5e70abe5fa68cb91bf3230250cb0c","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-2.0.0-beta.16.tgz","fileCount":54,"unpackedSize":894745,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbylMECRA9TVsSAnZWagAAiUEP/RV5gVhP5l1KkqS0Fzlx\nK58isG/+9CTYgZd+IKjFlD/m5vzl4RoLs1xdD6N3SEGNqKz1Woztd8lw9gku\n2EByV1X3WzAtuLMSwr5mhmHPafxb5+LxPa41hzHOcT/rCwEhach1S2JZYCnL\nDIkHJ8gifiQpw1UJev2bW8Kww3NSo0UyOpWG9RMD390zdRhPP8uJ93KfQFWi\ni3awyBPfIpJH0oV+txG0T7/AkHl9fRgi++R8RsK1gzfJACpVZAEKwbE48d8E\nqLL5rjn6/0uMxcpahl7NrmlxHEFCzOMzBECq/aiPUdj+xcmu8GUaAGlcjgot\nplR5D0mtTE28tmURAvmmMQx2kBlQ/82blAhAO8YvWDZF/Ub+qu5t/RJMeyO+\npl0GQUGKPJBB7LXpA2XyKWXDV9DCJAeENK6AFbHbsUKTNq3Da5pHivgBf2QZ\nadhhvARzGjYmG5JTJi8fjF9SRe2IPSFHllujKamHAsRViRd2SD4NOukQhpo8\nzbBLAzCFGoL4j1dnF8SA6r3W6eq26krI8jKyjZDEnN3n+yqaDiuCIT+gilKe\nDvhM8cDdX+E6C6mP0s/5MCueV14K6clMXiMeWTfb6idRDTTxjhljVBss0RIw\ntDBt0dvXLof0Xyo+QbqT1ur0jf5W6qf5qDvC6wBiYi1PXbeRMJDhfU35aa8q\noaNe\r\n=mnJr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID2odrOMCXfqDDKD1evIcWuhpSyc3v4JzgcmWIYbP3w2AiEAqvpDaJ273EK4QXnPmPKk9c8nTJ+BdlDbLwjo9Kt7D/0="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook_2.0.0-beta.16_1539986180004_0.403865687050712"},"_hasShrinkwrap":false},"2.0.0-beta.17":{"name":"picturebook","version":"2.0.0-beta.17","description":"Opinionated Storybook Setup","main":"dist/index.js","browser":"dist/picturebook.web.js","repository":{"type":"git","url":"git+https://github.com/obartra/picturebook.git"},"author":{"name":"Oscar Bartra"},"license":"MIT","scripts":{"format":"prettier --write \"{{src,test,sampleFolder}/**/,}*.js\"","test":"jest","lint":"eslint --ext .js --cache .","build":"webpack --mode production --config webpack.build.config.js && babel src -d dist --copy-files","build:watch":"yarn build --watch","test:watch":"yarn test --watch","start":"yarn && yarn build && cd sampleFolder && yarn && yarn start","test:app":"cd sampleFolder && yarn test --env chrome,firefox,ie11,edge,safari,iphone7","update-deps":"yarn upgrade --exact --latest && cd sampleFolder && yarn upgrade --exact --latest && cd .. && yarn ci","ci":"yarn build && yarn lint && yarn flow check && yarn test"},"dependencies":{"fs-extra":"7.0.0","lodash":"4.17.11","pixelmatch":"4.0.2","png-crop":"0.0.2","pngjs":"3.3.3","rimraf":"2.6.2","selenium-server-standalone-jar":"3.14.0"},"devDependencies":{"@babel/cli":"7.1.2","@babel/core":"7.1.2","@babel/plugin-proposal-object-rest-spread":"7.0.0","@babel/plugin-transform-regenerator":"7.0.0","@babel/plugin-transform-runtime":"7.1.0","@babel/preset-env":"7.1.0","@babel/preset-flow":"7.0.0","@babel/preset-react":"7.0.0","@babel/runtime":"7.1.2","@storybook/react":"3.4.11","babel-core":"7.0.0-bridge.0","babel-eslint":"10.0.1","babel-jest":"23.6.0","babel-loader":"8.0.4","babel-plugin-require-context-hook":"1.0.0","clean-webpack-plugin":"0.1.19","eslint":"5.6.1","eslint-config-airbnb":"17.1.0","eslint-config-prettier":"3.1.0","eslint-plugin-flowtype":"2.50.3","eslint-plugin-import":"2.14.0","eslint-plugin-jest":"21.24.0","eslint-plugin-jsx-a11y":"6.1.1","eslint-plugin-prettier":"3.0.0","eslint-plugin-promise":"4.0.1","eslint-plugin-react":"7.11.1","flow-bin":"0.82.0","jest":"23.6.0","prettier":"1.14.3","react":"16.5.2","react-dom":"16.5.2","webpack":"4.20.2","webpack-cli":"3.1.2"},"peerDependencies":{"nightwatch":">=0.9.x"},"gitHead":"7280570e5ea2ead52b33eaffe34f74e9de757763","bugs":{"url":"https://github.com/obartra/picturebook/issues"},"homepage":"https://github.com/obartra/picturebook#readme","_id":"picturebook@2.0.0-beta.17","_npmVersion":"6.1.0","_nodeVersion":"10.6.0","_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"dist":{"integrity":"sha512-2Eb7ph8+fS9N11gwhQOLMNXdvXCll0dYh6Dy+VS0z8Y4SPNlogxU8cB9jABkR47RholHlVGhZwOYbG6SKgahJw==","shasum":"557d8e54edffd2b71d0b28ff51e70f13ab3bdf5d","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-2.0.0-beta.17.tgz","fileCount":52,"unpackedSize":878563,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbzkMICRA9TVsSAnZWagAAhOAP/R7dzdwsHn2TZ39/gcxW\n6ozao+B5mxpJCleWRqv9Z9qqh9N6sGfO6If+nLy01p2dtZYz7HICC/2o+nbR\n0WZ5WiKT7gZXby4cxxn65cYNoQhZZT8HWds6vDcD4bC4/OLHIb1Z0Q7LYrkc\nZqhltC/gsY4tOPTDkeKbUVWnZyephG4I6s00OTzh1T3PEblz8jpBPrNK7eHE\nzNDxRg9B9kZHCGzDvtWcvMhVzTIPGPqj2JFXDywrmDkTqZKEP0LwsZgTE+UR\nAD5ihdX+dAilC9z+PIl8fPvofscNYQbVnwCyppkMqNqpzE9pfP6krPSsEdTz\nNQZafG2F2lci+vLHdJXK0y34o5UIyK0Ah8vD0HUdY2AVTHtrKQQ6it8WL/4J\n2jl2d4bro0xddCaXEi9bketDgtZdrA1t7WFfqEnDtEuj8wWOfqgEhmBLc6/j\n8eqIQV+7FV8PW8OS1ILPtGjkPQhRlwXzgp5zkfB5ERP93XRJZvPGpklVQN6C\nyxBWn+YwMtkY+NcWO1I4XfOWCYcAm1tI7PSQ+6HmMFtdJQDH+IEtImmsLKPG\nQc4wuCE+0wA7o8BK0A3pCkWaTN/RT6ZwtTLda8VqE7V/phC9N10plnRMWTIE\nxgoTb7AkOsn7fDFRstzE9j3/8f44h7aSZrMVdINc/7H1BorKJpIDtUgJKa5M\niO5A\r\n=OKL0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDiWMayltej9biJP0gYv4VEgKzqvI2rcLWmKFFuuqwl0wIhAO20jJThlDYKJOncQPk7Ss6/PzEEVERfrnhtanxWB8Zn"}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook_2.0.0-beta.17_1540244231544_0.3195689591647346"},"_hasShrinkwrap":false},"2.0.0-beta.18":{"name":"picturebook","version":"2.0.0-beta.18","description":"Opinionated Storybook Setup","main":"dist/index.js","browser":"dist/picturebook.web.js","repository":{"type":"git","url":"git+https://github.com/obartra/picturebook.git"},"author":{"name":"Oscar Bartra"},"license":"MIT","scripts":{"format":"prettier --write \"{{src,test,sampleFolder}/**/,}*.js\"","test":"jest","lint":"eslint --ext .js --cache .","build":"webpack --mode production --config webpack.build.config.js && babel src -d dist --copy-files","build:watch":"yarn build --watch","test:watch":"yarn test --watch","start":"yarn && yarn build && cd sampleFolder && yarn && yarn start","test:app":"cd sampleFolder && yarn test --env chrome,firefox,ie11,edge,safari,iphone7","update-deps":"yarn upgrade --exact --latest && cd sampleFolder && yarn upgrade --exact --latest && cd .. && yarn ci","ci":"yarn build && yarn lint && yarn flow check && yarn test"},"dependencies":{"fs-extra":"7.0.0","lodash":"4.17.11","pixelmatch":"4.0.2","png-crop":"0.0.2","pngjs":"3.3.3","rimraf":"2.6.2","selenium-server-standalone-jar":"3.14.0"},"devDependencies":{"@babel/cli":"7.1.2","@babel/core":"7.1.2","@babel/plugin-proposal-object-rest-spread":"7.0.0","@babel/plugin-transform-regenerator":"7.0.0","@babel/plugin-transform-runtime":"7.1.0","@babel/preset-env":"7.1.0","@babel/preset-flow":"7.0.0","@babel/preset-react":"7.0.0","@babel/runtime":"7.1.2","@storybook/react":"3.4.11","babel-core":"7.0.0-bridge.0","babel-eslint":"10.0.1","babel-jest":"23.6.0","babel-loader":"8.0.4","babel-plugin-require-context-hook":"1.0.0","clean-webpack-plugin":"0.1.19","eslint":"5.6.1","eslint-config-airbnb":"17.1.0","eslint-config-prettier":"3.1.0","eslint-plugin-flowtype":"2.50.3","eslint-plugin-import":"2.14.0","eslint-plugin-jest":"21.24.0","eslint-plugin-jsx-a11y":"6.1.1","eslint-plugin-prettier":"3.0.0","eslint-plugin-promise":"4.0.1","eslint-plugin-react":"7.11.1","flow-bin":"0.82.0","jest":"23.6.0","prettier":"1.14.3","react":"16.5.2","react-dom":"16.5.2","webpack":"4.20.2","webpack-cli":"3.1.2"},"peerDependencies":{"nightwatch":">=0.9.x"},"gitHead":"c94da9e877fbd134bf5e230b6d19a63c6fa1c882","bugs":{"url":"https://github.com/obartra/picturebook/issues"},"homepage":"https://github.com/obartra/picturebook#readme","_id":"picturebook@2.0.0-beta.18","_npmVersion":"6.1.0","_nodeVersion":"10.6.0","_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"dist":{"integrity":"sha512-pI6P4MFQGMioyTeJqD53Z6MSV/tFArtGvD2jS6nVuXwBiKPKgpEhZ4RKVcSOGX1+8Bl504+LTwl33T6qbPqGAg==","shasum":"d1a8ef777869ec706489a0deaf66c3e0e4d35602","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-2.0.0-beta.18.tgz","fileCount":52,"unpackedSize":878632,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb0TgCCRA9TVsSAnZWagAAcVoQAJJ21glpG4UROwc74lIu\njmJzKDKBsSJEfq75lVc9D8K1H/v0/CxojBlQId8ezNzV+rU4jVBUToig9kXS\npv6IvDns92AbEtpR/v01vwFMDtMql8nE/pf95z6JZgOnIZpTUCC+Kcv3fgpo\nnGuN08XwNHENTzihw42c748wlJPoXkmLqiYnIcYm5vvZMHn3wqOVsA5r8qQo\nVVPf87P7JQRSsGsC2C+r2WXaua6Dw9LHzbumMss2QQ7lnaPufsjSbQmtWDXl\njAClOONkFPPtBtvlyU/+gjdCtZlqbQMWJ2at0XYJ1Jh8VF3i2ITPLpuEMTmf\nhGSktntNqtJznysEDmeSZUUt3AkEDUmj9niZ0wXTsS2XwpDUrVKV+DEMTn+p\nWOGFHMQhfpk9OnPEghXRbh6yMNZk2dkszTgoLAlQqRnMzu4WyRCEUORd+YoQ\nEqY502at1EnXbJSEP2ld8sMZWjPQOmlHzFgdpWKtXdXt39rmBpJJRL6GUyyc\nLqrgoMCEEHiRJxvXTgOCMJ+RHMDom2EQ/uuXpLM9iGZSjCX7NyUur2qm+fNY\n1T30Qtnk4NQISjZnAuAUwrSZ1mlPDmj6Jty28RWTUgNhF9joycgX92htXl/+\n7nbLlx6rhv6q6Kp1qcvxTYGd/uMulCAy7/VQHeuxvLTLoKJYNEvRwwXLGVKj\nJJbH\r\n=cNXZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEke+IQVGivU9rYXTH3NmrZCAg5PT6qQBFyRxacqJrg9AiA7719qCIGpQS0NB/nzoWIqZoRZtkpt2TPUOU0c91/qDg=="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook_2.0.0-beta.18_1540438017640_0.539781462448941"},"_hasShrinkwrap":false},"2.0.0-beta.19":{"name":"picturebook","version":"2.0.0-beta.19","description":"Opinionated Storybook Setup","main":"dist/index.js","browser":"dist/picturebook.web.js","repository":{"type":"git","url":"git+https://github.com/obartra/picturebook.git"},"author":{"name":"Oscar Bartra"},"license":"MIT","scripts":{"format":"prettier --write \"{{src,test,sampleFolder}/**/,}*.js\"","test":"jest","lint":"eslint --ext .js --cache .","build":"webpack --mode production --config webpack.build.config.js && babel src -d dist --copy-files","build:watch":"yarn build --watch","test:watch":"yarn test --watch","start":"yarn && yarn build && cd sampleFolder && yarn && yarn start","test:app":"cd sampleFolder && yarn test --env chrome,firefox,ie11,edge,safari,iphone7","update-deps":"yarn upgrade --exact --latest && cd sampleFolder && yarn upgrade --exact --latest && cd .. && yarn ci","ci":"yarn build && yarn lint && yarn flow check && yarn test"},"dependencies":{"fs-extra":"7.0.0","lodash":"4.17.11","pixelmatch":"4.0.2","png-crop":"0.0.2","pngjs":"3.3.3","rimraf":"2.6.2","selenium-server-standalone-jar":"3.14.0"},"devDependencies":{"@babel/cli":"7.1.2","@babel/core":"7.1.2","@babel/plugin-proposal-object-rest-spread":"7.0.0","@babel/plugin-transform-regenerator":"7.0.0","@babel/plugin-transform-runtime":"7.1.0","@babel/preset-env":"7.1.0","@babel/preset-flow":"7.0.0","@babel/preset-react":"7.0.0","@babel/runtime":"7.1.2","@storybook/react":"3.4.11","babel-core":"7.0.0-bridge.0","babel-eslint":"10.0.1","babel-jest":"23.6.0","babel-loader":"8.0.4","babel-plugin-require-context-hook":"1.0.0","clean-webpack-plugin":"0.1.19","eslint":"5.6.1","eslint-config-airbnb":"17.1.0","eslint-config-prettier":"3.1.0","eslint-plugin-flowtype":"2.50.3","eslint-plugin-import":"2.14.0","eslint-plugin-jest":"21.24.0","eslint-plugin-jsx-a11y":"6.1.1","eslint-plugin-prettier":"3.0.0","eslint-plugin-promise":"4.0.1","eslint-plugin-react":"7.11.1","flow-bin":"0.82.0","jest":"23.6.0","prettier":"1.14.3","react":"16.5.2","react-dom":"16.5.2","webpack":"4.20.2","webpack-cli":"3.1.2"},"peerDependencies":{"nightwatch":">=0.9.x"},"readme":"# 🤖📗 PictureBook\n\nAutomated Storybook Setup\n\nSimplify Storybook story creation and cross-browser image comparison testing\n\n## 💡 Rationale\n\nSetting up storybook and implement cross-browser image comparison testing on multiple projects is time consuming.\n\nInstead of providing a wrapper on top of existing projects that will fall out of date, Picturebook lets you retain control of the Storybook and Nightwatch packages.\n\nThis project aims to provide utility methods to simplify [Storybook](https://storybook.js.org/), [SauceLabs](https://saucelabs.com/) and [Nightwatch](http://nightwatchjs.org/) configuration and screenshot comparison. Specifically:\n\n- **Creation of storybook stories**: They are created based on your file system structure\n- **Saucelabs tunnel setup**: Reduce SauceConnect config to the SauceConnect binary path and username / accessKey\n- **Screenshot**: Take screenshots of every story on different browsers using SauceLabs and Nightwatch\n- **Image Comparison**: Compare and update screenshots to baselines collocated with your stories.\n\n## ⚙️ Install\n\n1. You will need a SauceLabs account. If you don't have one you can sign up for a trial [here](https://signup.saucelabs.com/signup/trial) or request a free one for open source projects [here](https://saucelabs.com/open-source-request-account).\n1. If you want to run tests against Safari and IE11 from localhost, add `localtest.dev 127.0.0.1` to your `/etc/hosts` (the exact steps may vary depending on your platform, see [here](https://www.howtogeek.com/howto/27350/beginner-geek-how-to-edit-your-hosts-file/) for more details).\n1. Add picturebook and its peer dependencies:\n\n```sh\nyarn add --dev picturebook @storybook/react nightwatch react\n```\n\nReact is used in the examples but you can also use any flavor of storybook you want.\n\nIf you don't have Storybook set it up yet, follow [these instructions](https://storybook.js.org/basics/quick-start-guide/) first.\n\nSome of Picturebook utility methods rely on the output of `require.context`. This is a webpack construct and it's not available in Node or test environments. There are multiple ways to mock it. If you are using babel you could add the [require-context-hook](https://github.com/smrq/babel-plugin-require-context-hook) plugin. For instance, if you want to enable it only for tests, you can do something like:\n\n```json\n{\n  \"env\": {\n    \"test\": {\n      \"plugins\": [\"require-context-hook\"]\n    }\n  }\n}\n```\n\nand on your test setup:\n\n```js\nrequire('babel-plugin-require-context-hook/register')()\n```\n\nAlternatively, there's also the [require-context](https://www.npmjs.com/package/require-context) npm package that will also emulate webpack's `require.context`.\n\n## 📚 API\n\nThe API can be split into 2 sections, storybook creation for finding files in the file system and creating storybook stories around them and storybook testing, to connect to SauceLabs and run cross-browser image comparison tests.\n\n### Storybook creation\n\n`getFiles` and `loadStories` have very similar APIs and output.\n\n`getFiles` allows you to retrieve a list of related files. For instance if you have:\n\n```sh\nfile1.js\nfile1.md\nfile2.png\nfile2.js\n```\n\nIt will provide an array of 2 elements (file1 and file2) with the different related files grouped.\n\nThese values are used to identify helper files for stories where `*.md` is understood to be documentation,`.*(spec|test).js` is a test file and an unprefixed `*.js` file is a story. The `flattenFolders` parameters allow grouping nested folders as well. For instance if `flattenFolders: ['a']` `file1.js` and `a/file1.png` will be grouped together.\n\n`loadStories` provide the same functionality than `getFiles` but it also loads and creates storybook stories. This is why it requires storybook's [storiesOf](https://storybook.js.org/basics/writing-stories/#writing-stories) method as a parameter. The response is also similar but it includes a `main` method with the loaded story.\n\nYou can find the exact APIs below:\n\n```js\ntype StoryPaths = {|\n  name: string,\n  parents: $ReadOnlyArray<string>,\n  title: string,\n  path: string,\n  screenshots: {|\n    [extension: string]: string,\n  |},\n  tests: {|\n    [extension: string]: string,\n  |},\n  doc: ?string,\n  url: ?string,\n|}\n\n// Retrieve and group the different stories based on their filenames\nfunction getFiles({|\n  baseUrl?: string,              // The url for the story, defaults to:\n                                 //   'http://localhost:6006'\n  flattenFolders?: Array<string> // Folders to flatten\n                                 //   defaults to ['__snapshots__', '__screenshots__']\n  stories: any,                  // Output of require context with the stories\n  findKindAndStory?: (           // Customize \"selectedKind\" and \"selectedStory\" on the URL\n    story: StoryPaths,           //   this is not needed if stories are generated with \"loadStories\"\n  ) => {|\n    selectedKind: string,\n    selectedStory: string\n  |},\n  filter?: {|                    // Filter functions to determine how different files are grouped\n    screenshots?: (file: string) => boolean,\n    tests?: (file: string) => boolean,\n    docs?: (file: string) => boolean,\n    story?: (file: string, target: string) => boolean,\n  |}\n|}): Array<StoryPaths>\n\n// Retrieve, group, load and create stories\nfunction loadStories({|\n  baseUrl?: string,              // The url for the story, defaults to:\n                                 //   'http://localhost:6006'\n  flattenFolders?: Array<string> // Folders to flatten\n                                 //   defaults to ['__snapshots__', '__screenshots__']\n  stories: any,                  // Output of require context with the stories\n  decorators: $ReadOnlyArray<Function>,\n  storiesOf: any,\n  storyFiles: $ReadOnlyArray<string>,\n|}): Array<StoryPaths & {|\n  main: () => any,\n|}>\n```\n\n### Storybook testing\n\nOnce stories are loaded, `runTests` will connect to SauceLabs (optionally through a SauceConnect tunnel) and return a Promise that includes the results of the test.\n\nSince it uses `nightwatch` under the hood, you must have a valid nightwatch instance running. To assist with it, `nightwatchConfig` provides defaultValues\n\n```js\ntype Status = 'CREATED' | 'SUCCESS' | 'FAILED'\ntype ImgResults = {|\n    browser: string,\n    diffPath: ?string,\n    diffThreshold: number,\n    error: ?string,\n    name: string,\n    platform: string,\n    referencePath: ?string,\n    screenshotPath: ?string,\n    status: Status,\n  |}\ntype Tunnel = {|\n  id: string,\n  binaryPath: string,\n|}\n\n// Invoke nightwatch and run image comparison in SauceLabs\nfunction runTests(options: {|\n  configPath: string,           // absolute path to nightwatch config\n  files: Array<StoryPaths>,     // output of getFiles()\n  overwrite: boolean,           // true to replace failing or missing images\n  storyRoot: string,            // absolute path to the stories\n  tunnel?: Tunnel,              // if set, it will set up a SC tunnel with the id\n  outputPath?: string,          // if set, where to store the test results as a\n                                // json file matching the return of `runTests`\n|}): Promise<{|\n  error: Error | null,          // null if there were no exceptions during tests\n  results: Array<ImgResults>,   // per browser / platform / story results\n  // An overall summary status. If any tests failed, it's FAILED, if any tests\n  // where created or updated it's CREATED, if all tests succeeded it's SUCCESS\n  // if no tests ran, it's EMPTY\n  status: Status | 'EMPTY',\n  counts: {|                    // counts for all tests\n    CREATED: number,\n    SUCCESS: number,\n    FAILED: number,\n  |},\n  version: string,              // picturebook version used\n  date: string,                 // ISO date when was the test report created\n|}>\n\n// Nightwatch config generation helper\nfunction nightwatchConfig(options: {|\n  desiredCapabilities?: {},     // nightwatch desired capabilities object\n  files: Array<StoryPaths>,     // output of getFiles()\n  username: string,             // SauceLabs username\n  access_key: string,           // SauceLabs accessKey\n  browsers?: {                  // List of browsers to test. Default list\n                                //   includes chrome, firefox, edge, ie11,\n                                //   iphone7 and safari but any valid SauceLabs\n                                //   config is valid\n    [browserName: string]: {\n      desiredCapabilities: {\n        platform: string,\n        version: string,\n        browserName: string,\n        screenResolution: string,\n      },\n      custom_vars: {|           // Custom properties required per browser config:\n        name: string,           // Must match \"browserName\"\n        platform: string,       // \"mobile\" | \"desktop\" but any string is allowed\n        extract?: {|            // If cropping the output, specify crop dimensions\n          top: number,\n          left: number,\n          width: number,\n          height: number,\n        |},\n      |},\n    },\n  },\n  // Alias for browsers where localhost cannot be accessed from a tunnel,\n  // defaults to \"localtest.dev\"\n  localhostAlias?: string,\n  // List of browsers that can't access localhost from a tunnel, defaults to:\n  // [\"ie11\", \"safari\"]\n  localhostAliasBrowsers?: Array<string>,\n  proxy?: {},                   // Nightwatch proxy object\n|}): Object\n```\n\n## 🎪 Sample App\n\nThis project includes a sample app to demo the behavior. You can view it running `yarn start` and opening `localhost:6006` on your browser.\n\nTo run the image comparison tests, keep `yarn start` running and call `SAUCE_ACCESS_KEY={YOUR_ACCESS_KEY} SAUCE_USERNAME={YOUR_USERNAME} yarn test:app`.\n\n## ️✏️ Storybook Usage\n\nTo take advantage of the automated storybook folder config (and testing) modify your storybook `config.js` to look like this:\n\n```js\nimport { storiesOf, configure } from '@storybook/react'\nimport * as picturebook from 'picturebook'\n\nfunction loadStories() {\n  picturebook.loadStories({\n    storiesOf,\n    stories: require.context('../stories', true, /\\.(js|md|png)/),\n  })\n}\n\nconfigure(loadStories, module)\n```\n\nIf you want to see a more advanced use case on how to use it with decorators and other plugins, check out the [sample project](./sampleFolder/.storybook/config.js).\n\n## 📸 Screenshot Usage\n\nTo take screenshots, picturebook relies on nightwatch. With the exception of a few required fields, configuration is generated for you. To take advantage of it you should create a `nightwatch.conf.js` file on your root (or customize it following instructions [here](http://nightwatchjs.org/gettingstarted#settings-file)).\n\n```js\nconst { resolve } = require('path')\nconst { nightwatchConfig, getFiles } = require('picturebook')\nconst requireContext = require('require-context')\n\nconst config = nightwatchConfig({\n  username: process.env.SAUCE_USERNAME,\n  access_key: process.env.SAUCE_ACCESS_KEY,\n  files: getFiles({\n    baseUrl: 'http://localhost:6006',\n    stories: requireContext(resolve(__dirname, './stories'), true, /\\.js/),\n  }),\n  desiredCapabilities: {\n    build: 'local',\n    'tunnel-identifier': 'picturebook-sample',\n  },\n})\n\nmodule.exports = config\n```\n\nTo take screenshots and run image comparison, you can call:\n\n```js\nrunTests({\n  storyRoot,\n  files: getFiles({\n    stories: requireContext(storyRoot, true, /\\.(js|png)/),\n  }),\n  overwrite,\n  tunnel,\n  configPath: resolve(__dirname, 'nightwatch.conf.js'),\n})\n```\n\nNote that if using a tunnel, `tunnel-identifier` on your nightwatch config must match the `tunnel.id` parameter passed to `runTests`.\n\n## 🙋 QYMA (Questions you may ask)\n\n### Why do I need to add localtest.dev as a localhost alias?\n\nThis is a SauceLabs issue. To work around it, `safari` and `edge` browsers replace `localhost` from urls to `localtest.dev` as described [here](https://support.saucelabs.com/hc/en-us/articles/225106887-Safari-and-Internet-Explorer-Won-t-Load-Website-When-Using-Sauce-Connect-on-Localhost).\n\nYou can customize the target browsers and localhost alias with the `localhostAliasBrowsers` and `localhostAlias`, respectively.\n\n### How do you skip some files?\n\nPicturebook will only take screenshots of the files you tell it exists. You can filter the output from [require.context](https://webpack.js.org/guides/dependency-management/#require-context) by specifying a different regExp to filter by.\n\n### SauceConnect ENOENT error\n\nIf you see the following error after a couple unsuccessful runs of SauceConnect:\n\n```sh\nevents.js:167\n      throw er; // Unhandled 'error' event\n      ^\n\nError: spawn ~/picturebook/node_modules/node-sauce-connect/lib/sc ENOENT\n```\n\nSometimes it gets stuck. Try cleaning `node_modules` and re-running yarn:\n\n```sh\nrm -rf node_modules\nyarn\n```\n\n### Error retrieving a new session from the selenium server\n\nThis is a Nightwatch issue, addressed in 1.0.4 versions of Nightwatch and later as per [this issue](https://github.com/nightwatchjs/nightwatch/issues/1772).\n\n### node-dir \"cannot read property 'files' of undefined\" error\n\nThere's currently a [bug in node-dir](https://github.com/fshost/node-dir/issues/53) that fails on empty dirs.\n\nRemove empty folders within your stories if you see the following error:\n\n```sh\nyourProject/node_modules/node-dir/lib/paths.js:92\n                results.files = results.files.concat(res.files);\n                                                         ^\n\nTypeError: Cannot read property 'files' of undefined\n    at subloop (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:92:58)\n    at /Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:107:13\n    at onDirRead (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:139:35)\n    at onStat (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:154:14)\n```\n\nYou can do so with:\n\n```sh\nfind /some/path -depth -type d -exec rmdir {} \\;\n```\n\n### No Java runtime present\n\nSelenium 3.0+ requires Java 8. Make sure it's installed if you get the following error:\n\n```sh\nStarting selenium server in parallel mode... There was an error while starting the Selenium server:\n\nNo Java runtime present, requesting install.\n```\n\nFor additional Selenium tips, check out [selenium-standalone tips](https://www.npmjs.com/package/selenium-standalone#tips).\n","readmeFilename":"README.md","gitHead":"74939a8d2930ae3e0d31864441034e1080a56e0f","bugs":{"url":"https://github.com/obartra/picturebook/issues"},"homepage":"https://github.com/obartra/picturebook#readme","_id":"picturebook@2.0.0-beta.19","_npmVersion":"6.1.0","_nodeVersion":"10.6.0","_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"dist":{"integrity":"sha512-PTkTsAxeKExn6ZJmW5ZOdrAaec6O0Baz24W8Oc07edkA/qaYXzD7b7BJAwFbmMNTyG79fMfMKaMVXneaYr5ipA==","shasum":"800fee855eaf1571394b62fdf82511bc526b8738","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-2.0.0-beta.19.tgz","fileCount":52,"unpackedSize":878682,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb3KbACRA9TVsSAnZWagAALc8P/AxSycCstq0e0gvsu0Rw\njtixn/OEmCqWZ7KOxBd5EpqWv2SaZFi2s3F4zGIgo4Mah72qHjLO3rLAsGTv\n/m9tXdvF+g40/pKebacgkEK4KJuCiEBdK7IEkq6Srm131uIhUHYaetXyf2yC\nCTkFjVLwQx+Bw7vWbdaCtQkJ4y8AUAXXtzPRajbEvxFFC9TYhNmPws57bkr4\nSvuKQoAcRJKmYd+5hGR/a+lJmkoS5i4E+QjyTptvddUE5gztgQEm6AfvNsoG\ns7aqpDwSD/SBei/dAbm4K80fEXRTBlJ0LHO4DjWoVmNKRgE2Dh/4BbRL6kPY\nPaT8WatMpmBVZwvdYhMxg4PbvTovOhqNBKbfFVvnNj36GLi1IG8GpGJZM1kD\nsf4cpbAxn005DahmPY/GIwAbxnn8GK97Q+W/Z0efolZpsuxRxybS6YsXK51D\nR55SXn1JatrDD5XXLNUGrBrWFJXJJ6uHp3SgbAgrGioyhbNhbI0JqZHPbh6R\n/qIvB2UeaOoWZQE5AfJF77kwAfWOeuSlsiFrvH2aeI/b12q2DFZprUg9m4QO\nfKsLN6ieYl4APKIrOaKjX0t7UGi9EYcIlIB894/3MjwMQwiDhC3H8xInpqgP\n/+FZNUBKfjrxHGbvmed0X1Yg5SpD5qIbjOoQoCmiTaGtFikNQ7aMMP2q//hJ\nryk5\r\n=QIry\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDblVlTFVWFHmW9Llagr59JFphxrtzL/UaEzDt7rvxY9AIgWVwhRcxfnUmgDvVpqpIVg8SE7a1LmTKdEXcj5O8pnbY="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook_2.0.0-beta.19_1541187263414_0.7101542348079337"},"_hasShrinkwrap":false},"2.0.0-beta.20":{"name":"picturebook","version":"2.0.0-beta.20","description":"Opinionated Storybook Setup","main":"dist/index.js","browser":"dist/picturebook.web.js","repository":{"type":"git","url":"git+https://github.com/obartra/picturebook.git"},"author":{"name":"Oscar Bartra"},"license":"MIT","scripts":{"format":"prettier --write \"{{src,test,sampleFolder}/**/,}*.js\"","test":"jest","lint":"eslint --ext .js --cache .","build":"webpack --mode production --config webpack.build.config.js && babel src -d dist --copy-files","build:watch":"yarn build --watch","test:watch":"yarn test --watch","start":"yarn && yarn build && cd sampleFolder && yarn && yarn start","test:app":"cd sampleFolder && yarn test --env chrome,firefox,ie11,edge,safari,iphone7","update-deps":"bash ./scripts/updateDeps.sh","ci":"yarn build && yarn lint && yarn flow check && yarn test"},"dependencies":{"fs-extra":"7.0.0","lodash":"4.17.11","png-crop":"0.0.2","rimraf":"2.6.2","selenium-server-standalone-jar":"3.14.0"},"devDependencies":{"@babel/cli":"7.1.2","@babel/core":"7.1.2","@babel/plugin-proposal-object-rest-spread":"7.0.0","@babel/plugin-transform-regenerator":"7.0.0","@babel/plugin-transform-runtime":"7.1.0","@babel/preset-env":"7.1.0","@babel/preset-flow":"7.0.0","@babel/preset-react":"7.0.0","@babel/runtime":"7.1.2","@storybook/react":"3.4.11","babel-core":"7.0.0-bridge.0","babel-eslint":"10.0.1","babel-jest":"23.6.0","babel-loader":"8.0.4","babel-plugin-require-context-hook":"1.0.0","clean-webpack-plugin":"0.1.19","eslint":"5.6.1","eslint-config-airbnb":"17.1.0","eslint-config-prettier":"3.1.0","eslint-plugin-flowtype":"2.50.3","eslint-plugin-import":"2.14.0","eslint-plugin-jest":"21.24.0","eslint-plugin-jsx-a11y":"6.1.1","eslint-plugin-prettier":"3.0.0","eslint-plugin-promise":"4.0.1","eslint-plugin-react":"7.11.1","flow-bin":"0.82.0","flow-typed":"2.5.1","jest":"23.6.0","prettier":"1.14.3","react":"16.5.2","react-dom":"16.5.2","resemblejs":"2.10.3","webpack":"4.20.2","webpack-cli":"3.1.2"},"peerDependencies":{"nightwatch":">=0.9.x"},"readme":"# 🤖📗 PictureBook\n\nAutomated Storybook Setup\n\nSimplify Storybook story creation and cross-browser image comparison testing\n\n## 💡 Rationale\n\nSetting up storybook and implement cross-browser image comparison testing on multiple projects is time consuming.\n\nInstead of providing a wrapper on top of existing projects that will fall out of date, Picturebook lets you retain control of the Storybook and Nightwatch packages.\n\nThis project aims to provide utility methods to simplify [Storybook](https://storybook.js.org/), [SauceLabs](https://saucelabs.com/) and [Nightwatch](http://nightwatchjs.org/) configuration and screenshot comparison. Specifically:\n\n- **Creation of storybook stories**: They are created based on your file system structure\n- **Saucelabs tunnel setup**: Reduce SauceConnect config to the SauceConnect binary path and username / accessKey\n- **Screenshot**: Take screenshots of every story on different browsers using SauceLabs and Nightwatch\n- **Image Comparison**: Compare and update screenshots to baselines collocated with your stories.\n\n## ⚙️ Install\n\n1. You will need a SauceLabs account. If you don't have one you can sign up for a trial [here](https://signup.saucelabs.com/signup/trial) or request a free one for open source projects [here](https://saucelabs.com/open-source-request-account).\n1. If you want to run tests against Safari and IE11 from localhost, add `localtest.dev 127.0.0.1` to your `/etc/hosts` (the exact steps may vary depending on your platform, see [here](https://www.howtogeek.com/howto/27350/beginner-geek-how-to-edit-your-hosts-file/) for more details).\n1. Add picturebook and its peer dependencies:\n\n```sh\nyarn add --dev picturebook @storybook/react nightwatch react\n```\n\nReact is used in the examples but you can also use any flavor of storybook you want.\n\nIf you don't have Storybook set it up yet, follow [these instructions](https://storybook.js.org/basics/quick-start-guide/) first.\n\nSome of Picturebook utility methods rely on the output of `require.context`. This is a webpack construct and it's not available in Node or test environments. There are multiple ways to mock it. If you are using babel you could add the [require-context-hook](https://github.com/smrq/babel-plugin-require-context-hook) plugin. For instance, if you want to enable it only for tests, you can do something like:\n\n```json\n{\n  \"env\": {\n    \"test\": {\n      \"plugins\": [\"require-context-hook\"]\n    }\n  }\n}\n```\n\nand on your test setup:\n\n```js\nrequire('babel-plugin-require-context-hook/register')()\n```\n\nAlternatively, there's also the [require-context](https://www.npmjs.com/package/require-context) npm package that will also emulate webpack's `require.context`.\n\n## 📚 API\n\nThe API can be split into 2 sections, storybook creation for finding files in the file system and creating storybook stories around them and storybook testing, to connect to SauceLabs and run cross-browser image comparison tests.\n\n### Storybook creation\n\n`getFiles` and `loadStories` have very similar APIs and output.\n\n`getFiles` allows you to retrieve a list of related files. For instance if you have:\n\n```sh\nfile1.js\nfile1.md\nfile2.png\nfile2.js\n```\n\nIt will provide an array of 2 elements (file1 and file2) with the different related files grouped.\n\nThese values are used to identify helper files for stories where `*.md` is understood to be documentation,`.*(spec|test).js` is a test file and an unprefixed `*.js` file is a story. The `flattenFolders` parameters allow grouping nested folders as well. For instance if `flattenFolders: ['a']` `file1.js` and `a/file1.png` will be grouped together.\n\n`loadStories` provide the same functionality than `getFiles` but it also loads and creates storybook stories. This is why it requires storybook's [storiesOf](https://storybook.js.org/basics/writing-stories/#writing-stories) method as a parameter. The response is also similar but it includes a `main` method with the loaded story.\n\nYou can find the exact APIs below:\n\n```js\ntype StoryPaths = {|\n  name: string,\n  parents: $ReadOnlyArray<string>,\n  title: string,\n  path: string,\n  screenshots: {|\n    [extension: string]: string,\n  |},\n  tests: {|\n    [extension: string]: string,\n  |},\n  doc: ?string,\n  url: ?string,\n|}\n\n// Retrieve and group the different stories based on their filenames\nfunction getFiles({|\n  baseUrl?: string,              // The url for the story, defaults to:\n                                 //   'http://localhost:6006'\n  flattenFolders?: Array<string> // Folders to flatten\n                                 //   defaults to ['__snapshots__', '__screenshots__']\n  stories: any,                  // Output of require context with the stories\n  findKindAndStory?: (           // Customize \"selectedKind\" and \"selectedStory\" on the URL\n    story: StoryPaths,           //   this is not needed if stories are generated with \"loadStories\"\n  ) => {|\n    selectedKind: string,\n    selectedStory: string\n  |},\n  filter?: {|                    // Filter functions to determine how different files are grouped\n    screenshots?: (file: string) => boolean,\n    tests?: (file: string) => boolean,\n    docs?: (file: string) => boolean,\n    story?: (file: string, target: string) => boolean,\n  |}\n|}): Array<StoryPaths>\n\n// Retrieve, group, load and create stories\nfunction loadStories({|\n  baseUrl?: string,              // The url for the story, defaults to:\n                                 //   'http://localhost:6006'\n  flattenFolders?: Array<string> // Folders to flatten\n                                 //   defaults to ['__snapshots__', '__screenshots__']\n  stories: any,                  // Output of require context with the stories\n  decorators: $ReadOnlyArray<Function>,\n  storiesOf: any,\n  storyFiles: $ReadOnlyArray<string>,\n|}): Array<StoryPaths & {|\n  main: () => any,\n|}>\n```\n\n### Storybook testing\n\nOnce stories are loaded, `runTests` will connect to SauceLabs (optionally through a SauceConnect tunnel) and return a Promise that includes the results of the test.\n\nSince it uses `nightwatch` under the hood, you must have a valid nightwatch instance running. To assist with it, `nightwatchConfig` provides defaultValues\n\n```js\ntype Status = 'CREATED' | 'SUCCESS' | 'FAILED'\ntype ImgResults = {|\n    browser: string,\n    diffPath: ?string,\n    diffThreshold: number,\n    error: ?string,\n    name: string,\n    platform: string,\n    referencePath: ?string,\n    screenshotPath: ?string,\n    status: Status,\n  |}\ntype Tunnel = {|\n  id: string,\n  binaryPath: string,\n|}\n\n// Invoke nightwatch and run image comparison in SauceLabs\nfunction runTests(options: {|\n  configPath: string,           // absolute path to nightwatch config\n  files: Array<StoryPaths>,     // output of getFiles()\n  overwrite: boolean,           // true to replace failing or missing images\n  storyRoot: string,            // absolute path to the stories\n  tunnel?: Tunnel,              // if set, it will set up a SC tunnel with the id\n  outputPath?: string,          // if set, where to store the test results as a\n                                // json file matching the return of `runTests`\n|}): Promise<{|\n  error: Error | null,          // null if there were no exceptions during tests\n  results: Array<ImgResults>,   // per browser / platform / story results\n  // An overall summary status. If any tests failed, it's FAILED, if any tests\n  // where created or updated it's CREATED, if all tests succeeded it's SUCCESS\n  // if no tests ran, it's EMPTY\n  status: Status | 'EMPTY',\n  counts: {|                    // counts for all tests\n    CREATED: number,\n    SUCCESS: number,\n    FAILED: number,\n  |},\n  version: string,              // picturebook version used\n  date: string,                 // ISO date when was the test report created\n|}>\n\n// Nightwatch config generation helper\nfunction nightwatchConfig(options: {|\n  desiredCapabilities?: {},     // nightwatch desired capabilities object\n  files: Array<StoryPaths>,     // output of getFiles()\n  username: string,             // SauceLabs username\n  access_key: string,           // SauceLabs accessKey\n  browsers?: {                  // List of browsers to test. Default list\n                                //   includes chrome, firefox, edge, ie11,\n                                //   iphone7 and safari but any valid SauceLabs\n                                //   config is valid\n    [browserName: string]: {\n      desiredCapabilities: {\n        platform: string,\n        version: string,\n        browserName: string,\n        screenResolution: string,\n      },\n      custom_vars: {|           // Custom properties required per browser config:\n        name: string,           // Must match \"browserName\"\n        platform: string,       // \"mobile\" | \"desktop\" but any string is allowed\n        extract?: {|            // If cropping the output, specify crop dimensions\n          top: number,\n          left: number,\n          width: number,\n          height: number,\n        |},\n      |},\n    },\n  },\n  // Alias for browsers where localhost cannot be accessed from a tunnel,\n  // defaults to \"localtest.dev\"\n  localhostAlias?: string,\n  // List of browsers that can't access localhost from a tunnel, defaults to:\n  // [\"ie11\", \"safari\"]\n  localhostAliasBrowsers?: Array<string>,\n  proxy?: {},                   // Nightwatch proxy object\n|}): Object\n```\n\n## 🎪 Sample App\n\nThis project includes a sample app to demo the behavior. You can view it running `yarn start` and opening `localhost:6006` on your browser.\n\nTo run the image comparison tests, keep `yarn start` running and call `SAUCE_ACCESS_KEY={YOUR_ACCESS_KEY} SAUCE_USERNAME={YOUR_USERNAME} yarn test:app`.\n\n## ️✏️ Storybook Usage\n\nTo take advantage of the automated storybook folder config (and testing) modify your storybook `config.js` to look like this:\n\n```js\nimport { storiesOf, configure } from '@storybook/react'\nimport * as picturebook from 'picturebook'\n\nfunction loadStories() {\n  picturebook.loadStories({\n    storiesOf,\n    stories: require.context('../stories', true, /\\.(js|md|png)/),\n  })\n}\n\nconfigure(loadStories, module)\n```\n\nIf you want to see a more advanced use case on how to use it with decorators and other plugins, check out the [sample project](./sampleFolder/.storybook/config.js).\n\n## 📸 Screenshot Usage\n\nTo take screenshots, picturebook relies on nightwatch. With the exception of a few required fields, configuration is generated for you. To take advantage of it you should create a `nightwatch.conf.js` file on your root (or customize it following instructions [here](http://nightwatchjs.org/gettingstarted#settings-file)).\n\n```js\nconst { resolve } = require('path')\nconst { nightwatchConfig, getFiles } = require('picturebook')\nconst requireContext = require('require-context')\n\nconst config = nightwatchConfig({\n  username: process.env.SAUCE_USERNAME,\n  access_key: process.env.SAUCE_ACCESS_KEY,\n  files: getFiles({\n    baseUrl: 'http://localhost:6006',\n    stories: requireContext(resolve(__dirname, './stories'), true, /\\.js/),\n  }),\n  desiredCapabilities: {\n    build: 'local',\n    'tunnel-identifier': 'picturebook-sample',\n  },\n})\n\nmodule.exports = config\n```\n\nTo take screenshots and run image comparison, you can call:\n\n```js\nrunTests({\n  storyRoot,\n  files: getFiles({\n    stories: requireContext(storyRoot, true, /\\.(js|png)/),\n  }),\n  overwrite,\n  tunnel,\n  configPath: resolve(__dirname, 'nightwatch.conf.js'),\n})\n```\n\nNote that if using a tunnel, `tunnel-identifier` on your nightwatch config must match the `tunnel.id` parameter passed to `runTests`.\n\n## 🙋 QYMA (Questions you may ask)\n\n### Why do I need to add localtest.dev as a localhost alias?\n\nThis is a SauceLabs issue. To work around it, `safari` and `edge` browsers replace `localhost` from urls to `localtest.dev` as described [here](https://support.saucelabs.com/hc/en-us/articles/225106887-Safari-and-Internet-Explorer-Won-t-Load-Website-When-Using-Sauce-Connect-on-Localhost).\n\nYou can customize the target browsers and localhost alias with the `localhostAliasBrowsers` and `localhostAlias`, respectively.\n\n### How do you skip some files?\n\nPicturebook will only take screenshots of the files you tell it exists. You can filter the output from [require.context](https://webpack.js.org/guides/dependency-management/#require-context) by specifying a different regExp to filter by.\n\n### SauceConnect ENOENT error\n\nIf you see the following error after a couple unsuccessful runs of SauceConnect:\n\n```sh\nevents.js:167\n      throw er; // Unhandled 'error' event\n      ^\n\nError: spawn ~/picturebook/node_modules/node-sauce-connect/lib/sc ENOENT\n```\n\nSometimes it gets stuck. Try cleaning `node_modules` and re-running yarn:\n\n```sh\nrm -rf node_modules\nyarn\n```\n\n### Error retrieving a new session from the selenium server\n\nThis is a Nightwatch issue, addressed in 1.0.4 versions of Nightwatch and later as per [this issue](https://github.com/nightwatchjs/nightwatch/issues/1772).\n\n### node-dir \"cannot read property 'files' of undefined\" error\n\nThere's currently a [bug in node-dir](https://github.com/fshost/node-dir/issues/53) that fails on empty dirs.\n\nRemove empty folders within your stories if you see the following error:\n\n```sh\nyourProject/node_modules/node-dir/lib/paths.js:92\n                results.files = results.files.concat(res.files);\n                                                         ^\n\nTypeError: Cannot read property 'files' of undefined\n    at subloop (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:92:58)\n    at /Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:107:13\n    at onDirRead (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:139:35)\n    at onStat (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:154:14)\n```\n\nYou can do so with:\n\n```sh\nfind /some/path -depth -type d -exec rmdir {} \\;\n```\n\n### No Java runtime present\n\nSelenium 3.0+ requires Java 8. Make sure it's installed if you get the following error:\n\n```sh\nStarting selenium server in parallel mode... There was an error while starting the Selenium server:\n\nNo Java runtime present, requesting install.\n```\n\nFor additional Selenium tips, check out [selenium-standalone tips](https://www.npmjs.com/package/selenium-standalone#tips).\n","readmeFilename":"README.md","gitHead":"156d010a14d4a894e80559e2d6ae4be67c816178","bugs":{"url":"https://github.com/obartra/picturebook/issues"},"homepage":"https://github.com/obartra/picturebook#readme","_id":"picturebook@2.0.0-beta.20","_npmVersion":"6.1.0","_nodeVersion":"10.6.0","_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"dist":{"integrity":"sha512-GaNDsaJK3FQuDIrtFY7mqR3OVpsubHJyZh2uG1scXohKDylcokWF1o6tVQuqABHsFFACqD9VPteU/mLhnrd+jg==","shasum":"dd391554013829207641dada100e1cb5d328c17b","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-2.0.0-beta.20.tgz","fileCount":113,"unpackedSize":2251056,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb4dvsCRA9TVsSAnZWagAARNAP/3YX5gCsqbzLQynIFOXR\nFIgnaUs1tDADUxYc4Gcv78KpLOJwe13RkPO3B9aThW16+QZHcCBx29VMbyyd\nqTrj7McbLuemFrOrFBx9W1diz4dEEVCeMkm/MB4+chZy1ITxcVgF+do4+yPf\nmYgYhchDFX/OQNvd7EflZx6CcgH1kl3epPqmW0BeeKqueT05J+wP5EH2GLAl\n3AlF6IwW4VJiowBIIygw2iY9Bp22ZqD5+EfgjdGdzCyFn8hboJJHyYfCnL3L\nLo4vcO0Opf41Owou37u9nhZEVbcLZU92LkIw2Ze7KSk/FFukqBnXWqdo5Igo\nQxsF5YI4Zkgsq3K8+SLi8p0rnVtwX4IEn4tvu6DEFbuU7Ifll1XatxEIcLCA\nBKGrJElZZrn9f9Fsy71krPf6mHXatDQLffmn7kk+MLiGwnwTPG83BPrMfWLj\nenX81zZrUqHbi82LfbUVXcCoVuRGwq4DUpLZD+iR0PINW61iUpx64eWLzKUe\n1nYYuaICnkX7uEdWRMhgcIeGhLnnZUbxuk09UAIRYw5QR+y1jc4+tLzrzl9v\n0vLih6wagEqAzST2m42RvFIHAj0EzfydeftM6UrUcCwOPuO7HgsA/kw3JixE\n493NeQVIWsSyVpLj5Qjx1hIW0AHrloZ6qxBLjMyFzEsLKu85C2W59GAvAuuv\n1iQo\r\n=BisO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAWOFfm9c96Lt6bLcZC6SEM7R+ncFCXyhvDExYC1PTTbAiBSCddp1V0Ybyrfw8jEpZKLf4jccLaZR5TZaKTzyt1CPQ=="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook_2.0.0-beta.20_1541528555876_0.19300934452616114"},"_hasShrinkwrap":false},"2.0.0-beta.21":{"name":"picturebook","version":"2.0.0-beta.21","description":"Opinionated Storybook Setup","main":"dist/index.js","browser":"dist/picturebook.web.js","repository":{"type":"git","url":"git+https://github.com/obartra/picturebook.git"},"author":{"name":"Oscar Bartra"},"license":"MIT","scripts":{"format":"prettier --write \"{{src,test,sampleFolder}/**/,}*.js\"","test":"jest","lint":"eslint --ext .js --cache .","build":"webpack --mode production --config webpack.build.config.js && babel src -d dist --copy-files","build:watch":"yarn build --watch","test:watch":"yarn test --watch","start":"yarn && yarn build && cd sampleFolder && yarn && yarn start","test:app":"cd sampleFolder && yarn test --env chrome,firefox,ie11,edge,safari,iphone7","update-deps":"bash ./scripts/updateDeps.sh","ci":"yarn build && yarn lint && yarn flow check && yarn test"},"dependencies":{"fs-extra":"7.0.0","lodash":"4.17.11","png-crop":"0.0.2","rimraf":"2.6.2","resemblejs":"2.10.3","selenium-server-standalone-jar":"3.14.0"},"devDependencies":{"@babel/cli":"7.1.2","@babel/core":"7.1.2","@babel/plugin-proposal-object-rest-spread":"7.0.0","@babel/plugin-transform-regenerator":"7.0.0","@babel/plugin-transform-runtime":"7.1.0","@babel/preset-env":"7.1.0","@babel/preset-flow":"7.0.0","@babel/preset-react":"7.0.0","@babel/runtime":"7.1.2","@storybook/react":"3.4.11","babel-core":"7.0.0-bridge.0","babel-eslint":"10.0.1","babel-jest":"23.6.0","babel-loader":"8.0.4","babel-plugin-require-context-hook":"1.0.0","clean-webpack-plugin":"0.1.19","eslint":"5.6.1","eslint-config-airbnb":"17.1.0","eslint-config-prettier":"3.1.0","eslint-plugin-flowtype":"2.50.3","eslint-plugin-import":"2.14.0","eslint-plugin-jest":"21.24.0","eslint-plugin-jsx-a11y":"6.1.1","eslint-plugin-prettier":"3.0.0","eslint-plugin-promise":"4.0.1","eslint-plugin-react":"7.11.1","flow-bin":"0.82.0","flow-typed":"2.5.1","jest":"23.6.0","prettier":"1.14.3","react":"16.5.2","react-dom":"16.5.2","webpack":"4.20.2","webpack-cli":"3.1.2"},"peerDependencies":{"nightwatch":">=0.9.x"},"readme":"# 🤖📗 PictureBook\n\nAutomated Storybook Setup\n\nSimplify Storybook story creation and cross-browser image comparison testing\n\n## 💡 Rationale\n\nSetting up storybook and implement cross-browser image comparison testing on multiple projects is time consuming.\n\nInstead of providing a wrapper on top of existing projects that will fall out of date, Picturebook lets you retain control of the Storybook and Nightwatch packages.\n\nThis project aims to provide utility methods to simplify [Storybook](https://storybook.js.org/), [SauceLabs](https://saucelabs.com/) and [Nightwatch](http://nightwatchjs.org/) configuration and screenshot comparison. Specifically:\n\n- **Creation of storybook stories**: They are created based on your file system structure\n- **Saucelabs tunnel setup**: Reduce SauceConnect config to the SauceConnect binary path and username / accessKey\n- **Screenshot**: Take screenshots of every story on different browsers using SauceLabs and Nightwatch\n- **Image Comparison**: Compare and update screenshots to baselines collocated with your stories.\n\n## ⚙️ Install\n\n1. You will need a SauceLabs account. If you don't have one you can sign up for a trial [here](https://signup.saucelabs.com/signup/trial) or request a free one for open source projects [here](https://saucelabs.com/open-source-request-account).\n1. If you want to run tests against Safari and IE11 from localhost, add `localtest.dev 127.0.0.1` to your `/etc/hosts` (the exact steps may vary depending on your platform, see [here](https://www.howtogeek.com/howto/27350/beginner-geek-how-to-edit-your-hosts-file/) for more details).\n1. Add picturebook and its peer dependencies:\n\n```sh\nyarn add --dev picturebook @storybook/react nightwatch react\n```\n\nReact is used in the examples but you can also use any flavor of storybook you want.\n\nIf you don't have Storybook set it up yet, follow [these instructions](https://storybook.js.org/basics/quick-start-guide/) first.\n\nSome of Picturebook utility methods rely on the output of `require.context`. This is a webpack construct and it's not available in Node or test environments. There are multiple ways to mock it. If you are using babel you could add the [require-context-hook](https://github.com/smrq/babel-plugin-require-context-hook) plugin. For instance, if you want to enable it only for tests, you can do something like:\n\n```json\n{\n  \"env\": {\n    \"test\": {\n      \"plugins\": [\"require-context-hook\"]\n    }\n  }\n}\n```\n\nand on your test setup:\n\n```js\nrequire('babel-plugin-require-context-hook/register')()\n```\n\nAlternatively, there's also the [require-context](https://www.npmjs.com/package/require-context) npm package that will also emulate webpack's `require.context`.\n\n## 📚 API\n\nThe API can be split into 2 sections, storybook creation for finding files in the file system and creating storybook stories around them and storybook testing, to connect to SauceLabs and run cross-browser image comparison tests.\n\n### Storybook creation\n\n`getFiles` and `loadStories` have very similar APIs and output.\n\n`getFiles` allows you to retrieve a list of related files. For instance if you have:\n\n```sh\nfile1.js\nfile1.md\nfile2.png\nfile2.js\n```\n\nIt will provide an array of 2 elements (file1 and file2) with the different related files grouped.\n\nThese values are used to identify helper files for stories where `*.md` is understood to be documentation,`.*(spec|test).js` is a test file and an unprefixed `*.js` file is a story. The `flattenFolders` parameters allow grouping nested folders as well. For instance if `flattenFolders: ['a']` `file1.js` and `a/file1.png` will be grouped together.\n\n`loadStories` provide the same functionality than `getFiles` but it also loads and creates storybook stories. This is why it requires storybook's [storiesOf](https://storybook.js.org/basics/writing-stories/#writing-stories) method as a parameter. The response is also similar but it includes a `main` method with the loaded story.\n\nYou can find the exact APIs below:\n\n```js\ntype StoryPaths = {|\n  name: string,\n  parents: $ReadOnlyArray<string>,\n  title: string,\n  path: string,\n  screenshots: {|\n    [extension: string]: string,\n  |},\n  tests: {|\n    [extension: string]: string,\n  |},\n  doc: ?string,\n  url: ?string,\n|}\n\n// Retrieve and group the different stories based on their filenames\nfunction getFiles({|\n  baseUrl?: string,              // The url for the story, defaults to:\n                                 //   'http://localhost:6006'\n  flattenFolders?: Array<string> // Folders to flatten\n                                 //   defaults to ['__snapshots__', '__screenshots__']\n  stories: any,                  // Output of require context with the stories\n  findKindAndStory?: (           // Customize \"selectedKind\" and \"selectedStory\" on the URL\n    story: StoryPaths,           //   this is not needed if stories are generated with \"loadStories\"\n  ) => {|\n    selectedKind: string,\n    selectedStory: string\n  |},\n  filter?: {|                    // Filter functions to determine how different files are grouped\n    screenshots?: (file: string) => boolean,\n    tests?: (file: string) => boolean,\n    docs?: (file: string) => boolean,\n    story?: (file: string, target: string) => boolean,\n  |}\n|}): Array<StoryPaths>\n\n// Retrieve, group, load and create stories\nfunction loadStories({|\n  baseUrl?: string,              // The url for the story, defaults to:\n                                 //   'http://localhost:6006'\n  flattenFolders?: Array<string> // Folders to flatten\n                                 //   defaults to ['__snapshots__', '__screenshots__']\n  stories: any,                  // Output of require context with the stories\n  decorators: $ReadOnlyArray<Function>,\n  storiesOf: any,\n  storyFiles: $ReadOnlyArray<string>,\n|}): Array<StoryPaths & {|\n  main: () => any,\n|}>\n```\n\n### Storybook testing\n\nOnce stories are loaded, `runTests` will connect to SauceLabs (optionally through a SauceConnect tunnel) and return a Promise that includes the results of the test.\n\nSince it uses `nightwatch` under the hood, you must have a valid nightwatch instance running. To assist with it, `nightwatchConfig` provides defaultValues\n\n```js\ntype Status = 'CREATED' | 'SUCCESS' | 'FAILED'\ntype ImgResults = {|\n    browser: string,\n    diffPath: ?string,\n    diffThreshold: number,\n    error: ?string,\n    name: string,\n    platform: string,\n    referencePath: ?string,\n    screenshotPath: ?string,\n    status: Status,\n  |}\ntype Tunnel = {|\n  id: string,\n  binaryPath: string,\n|}\n\n// Invoke nightwatch and run image comparison in SauceLabs\nfunction runTests(options: {|\n  configPath: string,           // absolute path to nightwatch config\n  files: Array<StoryPaths>,     // output of getFiles()\n  overwrite: boolean,           // true to replace failing or missing images\n  storyRoot: string,            // absolute path to the stories\n  tunnel?: Tunnel,              // if set, it will set up a SC tunnel with the id\n  outputPath?: string,          // if set, where to store the test results as a\n                                // json file matching the return of `runTests`\n|}): Promise<{|\n  error: Error | null,          // null if there were no exceptions during tests\n  results: Array<ImgResults>,   // per browser / platform / story results\n  // An overall summary status. If any tests failed, it's FAILED, if any tests\n  // where created or updated it's CREATED, if all tests succeeded it's SUCCESS\n  // if no tests ran, it's EMPTY\n  status: Status | 'EMPTY',\n  counts: {|                    // counts for all tests\n    CREATED: number,\n    SUCCESS: number,\n    FAILED: number,\n  |},\n  version: string,              // picturebook version used\n  date: string,                 // ISO date when was the test report created\n|}>\n\n// Nightwatch config generation helper\nfunction nightwatchConfig(options: {|\n  desiredCapabilities?: {},     // nightwatch desired capabilities object\n  files: Array<StoryPaths>,     // output of getFiles()\n  username: string,             // SauceLabs username\n  access_key: string,           // SauceLabs accessKey\n  browsers?: {                  // List of browsers to test. Default list\n                                //   includes chrome, firefox, edge, ie11,\n                                //   iphone7 and safari but any valid SauceLabs\n                                //   config is valid\n    [browserName: string]: {\n      desiredCapabilities: {\n        platform: string,\n        version: string,\n        browserName: string,\n        screenResolution: string,\n      },\n      custom_vars: {|           // Custom properties required per browser config:\n        name: string,           // Must match \"browserName\"\n        platform: string,       // \"mobile\" | \"desktop\" but any string is allowed\n        extract?: {|            // If cropping the output, specify crop dimensions\n          top: number,\n          left: number,\n          width: number,\n          height: number,\n        |},\n      |},\n    },\n  },\n  // Alias for browsers where localhost cannot be accessed from a tunnel,\n  // defaults to \"localtest.dev\"\n  localhostAlias?: string,\n  // List of browsers that can't access localhost from a tunnel, defaults to:\n  // [\"ie11\", \"safari\"]\n  localhostAliasBrowsers?: Array<string>,\n  proxy?: {},                   // Nightwatch proxy object\n|}): Object\n```\n\n## 🎪 Sample App\n\nThis project includes a sample app to demo the behavior. You can view it running `yarn start` and opening `localhost:6006` on your browser.\n\nTo run the image comparison tests, keep `yarn start` running and call `SAUCE_ACCESS_KEY={YOUR_ACCESS_KEY} SAUCE_USERNAME={YOUR_USERNAME} yarn test:app`.\n\n## ️✏️ Storybook Usage\n\nTo take advantage of the automated storybook folder config (and testing) modify your storybook `config.js` to look like this:\n\n```js\nimport { storiesOf, configure } from '@storybook/react'\nimport * as picturebook from 'picturebook'\n\nfunction loadStories() {\n  picturebook.loadStories({\n    storiesOf,\n    stories: require.context('../stories', true, /\\.(js|md|png)/),\n  })\n}\n\nconfigure(loadStories, module)\n```\n\nIf you want to see a more advanced use case on how to use it with decorators and other plugins, check out the [sample project](./sampleFolder/.storybook/config.js).\n\n## 📸 Screenshot Usage\n\nTo take screenshots, picturebook relies on nightwatch. With the exception of a few required fields, configuration is generated for you. To take advantage of it you should create a `nightwatch.conf.js` file on your root (or customize it following instructions [here](http://nightwatchjs.org/gettingstarted#settings-file)).\n\n```js\nconst { resolve } = require('path')\nconst { nightwatchConfig, getFiles } = require('picturebook')\nconst requireContext = require('require-context')\n\nconst config = nightwatchConfig({\n  username: process.env.SAUCE_USERNAME,\n  access_key: process.env.SAUCE_ACCESS_KEY,\n  files: getFiles({\n    baseUrl: 'http://localhost:6006',\n    stories: requireContext(resolve(__dirname, './stories'), true, /\\.js/),\n  }),\n  desiredCapabilities: {\n    build: 'local',\n    'tunnel-identifier': 'picturebook-sample',\n  },\n})\n\nmodule.exports = config\n```\n\nTo take screenshots and run image comparison, you can call:\n\n```js\nrunTests({\n  storyRoot,\n  files: getFiles({\n    stories: requireContext(storyRoot, true, /\\.(js|png)/),\n  }),\n  overwrite,\n  tunnel,\n  configPath: resolve(__dirname, 'nightwatch.conf.js'),\n})\n```\n\nNote that if using a tunnel, `tunnel-identifier` on your nightwatch config must match the `tunnel.id` parameter passed to `runTests`.\n\n## 🙋 QYMA (Questions you may ask)\n\n### Why do I need to add localtest.dev as a localhost alias?\n\nThis is a SauceLabs issue. To work around it, `safari` and `edge` browsers replace `localhost` from urls to `localtest.dev` as described [here](https://support.saucelabs.com/hc/en-us/articles/225106887-Safari-and-Internet-Explorer-Won-t-Load-Website-When-Using-Sauce-Connect-on-Localhost).\n\nYou can customize the target browsers and localhost alias with the `localhostAliasBrowsers` and `localhostAlias`, respectively.\n\n### How do you skip some files?\n\nPicturebook will only take screenshots of the files you tell it exists. You can filter the output from [require.context](https://webpack.js.org/guides/dependency-management/#require-context) by specifying a different regExp to filter by.\n\n### SauceConnect ENOENT error\n\nIf you see the following error after a couple unsuccessful runs of SauceConnect:\n\n```sh\nevents.js:167\n      throw er; // Unhandled 'error' event\n      ^\n\nError: spawn ~/picturebook/node_modules/node-sauce-connect/lib/sc ENOENT\n```\n\nSometimes it gets stuck. Try cleaning `node_modules` and re-running yarn:\n\n```sh\nrm -rf node_modules\nyarn\n```\n\n### Error retrieving a new session from the selenium server\n\nThis is a Nightwatch issue, addressed in 1.0.4 versions of Nightwatch and later as per [this issue](https://github.com/nightwatchjs/nightwatch/issues/1772).\n\n### node-dir \"cannot read property 'files' of undefined\" error\n\nThere's currently a [bug in node-dir](https://github.com/fshost/node-dir/issues/53) that fails on empty dirs.\n\nRemove empty folders within your stories if you see the following error:\n\n```sh\nyourProject/node_modules/node-dir/lib/paths.js:92\n                results.files = results.files.concat(res.files);\n                                                         ^\n\nTypeError: Cannot read property 'files' of undefined\n    at subloop (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:92:58)\n    at /Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:107:13\n    at onDirRead (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:139:35)\n    at onStat (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:154:14)\n```\n\nYou can do so with:\n\n```sh\nfind /some/path -depth -type d -exec rmdir {} \\;\n```\n\n### No Java runtime present\n\nSelenium 3.0+ requires Java 8. Make sure it's installed if you get the following error:\n\n```sh\nStarting selenium server in parallel mode... There was an error while starting the Selenium server:\n\nNo Java runtime present, requesting install.\n```\n\nFor additional Selenium tips, check out [selenium-standalone tips](https://www.npmjs.com/package/selenium-standalone#tips).\n","readmeFilename":"README.md","gitHead":"156d010a14d4a894e80559e2d6ae4be67c816178","bugs":{"url":"https://github.com/obartra/picturebook/issues"},"homepage":"https://github.com/obartra/picturebook#readme","_id":"picturebook@2.0.0-beta.21","_npmVersion":"6.1.0","_nodeVersion":"10.6.0","_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"dist":{"integrity":"sha512-R11FNAKuoBYbOQFz+qpIx+h3aaQA6Q1H6CltsK8pQnaDfMcTjMeeBp4sIvpzZW/IdmX8o94DT9t51o3mA/ZPfA==","shasum":"ba1a6dd7b4f4fa715b1dd347a38d1e0af2ab87ca","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-2.0.0-beta.21.tgz","fileCount":52,"unpackedSize":877717,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb4eCKCRA9TVsSAnZWagAAZMsP/2pQpopddjHWdEp/dm86\neo0p2/FQjqwQ4lNKEIt75cXCuxncqj03Rshq+N3hDeuaSuuG+eg33jrN3Mba\naZq7T75XesONvOzKYYUZYqoV63aJuhIfTACLnrhbIf88SBQvUTzwdS5vWRmR\n9lr6W0OTrMci/CzNbHLhvmGDVl+A41cPTk431+M/QGPaFSIdFRCqxGbb/360\nl0YbDq2+onAF2HUqxRE84y67+7eT4bKP3ms7dMKqnV1cIK6KizGIPAJ8a82y\nFjm0Noy4L+1lTuAqA3t7XJAh8bmubf0OpvtlrIW6hyhETsxWAHLbq7FDC4mC\nVbBE7gUvRN2kHND04Eutt7xkplRFZ2l4vMB+0L9mWvzcpO2TXKbcALv3ljxx\nDRESxGDYr8q6MNxRAhakfQUTcPGWrj0pvP9+QZtr7gNgVUm4u//jS2BpamUi\nZ7VCrHNIFUZ4rjxXLwKMp2ClubFgfKxLwKJ1E3tlGMpt57pR5D2Ygm7Qcxmo\nRfjkI/fFaa6FU+e0wZ8y0aIk5jHVGI03QrSnAhek8YrdfAxg8YOPRUJ/hxnf\ntuc+iLBVM4/jJH7uSfZ6s5l1FAmVreuPP2I/DvHS89hwejWztS0kZvOD2DK5\nsOSc4XQxYVSLEHuyxO5eyawBqRrzApd687vcHAT4w7S1J2SiadYTD9s89Vdv\nYpEQ\r\n=i3V9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBFCBRedGKU+ofsKDAmaU3g68yobIWHEs8wilDO/2b1eAiBrxgEIMyn2Juka6ppKsnnLdwdcOitLv15ix/bOcgl6Zg=="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook_2.0.0-beta.21_1541529737563_0.6381683358200088"},"_hasShrinkwrap":false},"2.0.0-beta.23":{"name":"picturebook","version":"2.0.0-beta.23","description":"Opinionated Storybook Setup","main":"dist/index.js","browser":"dist/picturebook.web.js","repository":{"type":"git","url":"git+https://github.com/obartra/picturebook.git"},"author":{"name":"Oscar Bartra"},"license":"MIT","scripts":{"format":"prettier --write \"{{src,test,sampleFolder}/**/,}*.js\"","test":"jest","lint":"eslint --ext .js --cache .","build":"webpack --mode production --config webpack.build.config.js && babel src -d dist --copy-files","build:watch":"yarn build --watch","test:watch":"yarn test --watch","start":"yarn && yarn build && cd sampleFolder && yarn && yarn start","test:app":"cd sampleFolder && yarn test --env chrome,firefox,ie11,edge,safari,iphone7","update-deps":"bash ./scripts/updateDeps.sh","ci":"yarn build && yarn lint && yarn flow check && yarn test"},"dependencies":{"fs-extra":"7.0.1","lodash":"4.17.11","png-crop":"0.0.2","resemblejs":"3.0.0","rimraf":"2.6.2","selenium-server-standalone-jar":"3.141.5"},"devDependencies":{"@babel/cli":"7.2.0","@babel/core":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.2.0","@babel/plugin-transform-regenerator":"7.0.0","@babel/plugin-transform-runtime":"7.2.0","@babel/preset-env":"7.2.0","@babel/preset-flow":"7.0.0","@babel/preset-react":"7.0.0","@babel/runtime":"7.2.0","@storybook/react":"4.0.12","babel-core":"7.0.0-bridge.0","babel-eslint":"10.0.1","babel-jest":"23.6.0","babel-loader":"8.0.4","babel-plugin-require-context-hook":"1.0.0","clean-webpack-plugin":"1.0.0","eslint":"5.10.0","eslint-config-airbnb":"17.1.0","eslint-config-prettier":"3.3.0","eslint-plugin-flowtype":"3.2.0","eslint-plugin-import":"2.14.0","eslint-plugin-jest":"22.1.2","eslint-plugin-jsx-a11y":"6.1.2","eslint-plugin-prettier":"3.0.0","eslint-plugin-promise":"4.0.1","eslint-plugin-react":"7.11.1","nightwatch":"0.9.21","flow-bin":"0.88.0","flow-typed":"2.5.1","jest":"23.6.0","prettier":"1.15.3","react":"16.6.3","react-dom":"16.6.3","webpack":"4.27.1","webpack-cli":"3.1.2"},"peerDependencies":{"nightwatch":">=0.9.x"},"readme":"# 🤖📗 PictureBook\n\nAutomated Storybook Setup\n\nSimplify Storybook story creation and cross-browser image comparison testing\n\n## 💡 Rationale\n\nSetting up storybook and implement cross-browser image comparison testing on multiple projects is time consuming.\n\nInstead of providing a wrapper on top of existing projects that will fall out of date, Picturebook lets you retain control of the Storybook and Nightwatch packages.\n\nThis project aims to provide utility methods to simplify [Storybook](https://storybook.js.org/), [SauceLabs](https://saucelabs.com/) and [Nightwatch](http://nightwatchjs.org/) configuration and screenshot comparison. Specifically:\n\n- **Creation of storybook stories**: They are created based on your file system structure\n- **Saucelabs tunnel setup**: Reduce SauceConnect config to the SauceConnect binary path and username / accessKey\n- **Screenshot**: Take screenshots of every story on different browsers using SauceLabs and Nightwatch\n- **Image Comparison**: Compare and update screenshots to baselines collocated with your stories.\n\n## ⚙️ Install\n\n1. You will need a SauceLabs account. If you don't have one you can sign up for a trial [here](https://signup.saucelabs.com/signup/trial) or request a free one for open source projects [here](https://saucelabs.com/open-source-request-account).\n1. If you want to run tests against Safari and IE11 from localhost, add `localtest.dev 127.0.0.1` to your `/etc/hosts` (the exact steps may vary depending on your platform, see [here](https://www.howtogeek.com/howto/27350/beginner-geek-how-to-edit-your-hosts-file/) for more details).\n1. Add picturebook and its peer dependencies:\n\n```sh\nyarn add --dev picturebook @storybook/react nightwatch react\n```\n\nReact is used in the examples but you can also use any flavor of storybook you want.\n\nIf you don't have Storybook set it up yet, follow [these instructions](https://storybook.js.org/basics/quick-start-guide/) first.\n\nSome of Picturebook utility methods rely on the output of `require.context`. This is a webpack construct and it's not available in Node or test environments. There are multiple ways to mock it. If you are using babel you could add the [require-context-hook](https://github.com/smrq/babel-plugin-require-context-hook) plugin. For instance, if you want to enable it only for tests, you can do something like:\n\n```json\n{\n  \"env\": {\n    \"test\": {\n      \"plugins\": [\"require-context-hook\"]\n    }\n  }\n}\n```\n\nand on your test setup:\n\n```js\nrequire('babel-plugin-require-context-hook/register')()\n```\n\nAlternatively, there's also the [require-context](https://www.npmjs.com/package/require-context) npm package that will also emulate webpack's `require.context`.\n\n## 📚 API\n\nThe API can be split into 2 sections, storybook creation for finding files in the file system and creating storybook stories around them and storybook testing, to connect to SauceLabs and run cross-browser image comparison tests.\n\n### Storybook creation\n\n`getFiles` and `loadStories` have very similar APIs and output.\n\n`getFiles` allows you to retrieve a list of related files. For instance if you have:\n\n```sh\nfile1.js\nfile1.md\nfile2.png\nfile2.js\n```\n\nIt will provide an array of 2 elements (file1 and file2) with the different related files grouped.\n\nThese values are used to identify helper files for stories where `*.md` is understood to be documentation,`.*(spec|test).js` is a test file and an unprefixed `*.js` file is a story. The `flattenFolders` parameters allow grouping nested folders as well. For instance if `flattenFolders: ['a']` `file1.js` and `a/file1.png` will be grouped together.\n\n`loadStories` provide the same functionality than `getFiles` but it also loads and creates storybook stories. This is why it requires storybook's [storiesOf](https://storybook.js.org/basics/writing-stories/#writing-stories) method as a parameter. The response is also similar but it includes a `main` method with the loaded story.\n\nYou can find the exact APIs below:\n\n```js\ntype StoryPaths = {|\n  name: string,\n  parents: $ReadOnlyArray<string>,\n  title: string,\n  path: string,\n  screenshots: {|\n    [extension: string]: string,\n  |},\n  tests: {|\n    [extension: string]: string,\n  |},\n  doc: ?string,\n  url: ?string,\n|}\n\n// Retrieve and group the different stories based on their filenames\nfunction getFiles({|\n  baseUrl?: string,              // The url for the story, defaults to:\n                                 //   'http://localhost:6006'\n  flattenFolders?: Array<string> // Folders to flatten\n                                 //   defaults to ['__snapshots__', '__screenshots__']\n  stories: any,                  // Output of require context with the stories\n  findKindAndStory?: (           // Customize \"selectedKind\" and \"selectedStory\" on the URL\n    story: StoryPaths,           //   this is not needed if stories are generated with \"loadStories\"\n  ) => {|\n    selectedKind: string,\n    selectedStory: string\n  |},\n  filter?: {|                    // Filter functions to determine how different files are grouped\n    screenshots?: (file: string) => boolean,\n    tests?: (file: string) => boolean,\n    docs?: (file: string) => boolean,\n    story?: (file: string, target: string) => boolean,\n  |}\n|}): Array<StoryPaths>\n\n// Retrieve, group, load and create stories\nfunction loadStories({|\n  baseUrl?: string,              // The url for the story, defaults to:\n                                 //   'http://localhost:6006'\n  flattenFolders?: Array<string> // Folders to flatten\n                                 //   defaults to ['__snapshots__', '__screenshots__']\n  stories: any,                  // Output of require context with the stories\n  decorators: $ReadOnlyArray<Function>,\n  storiesOf: any,\n  storyFiles: $ReadOnlyArray<string>,\n|}): Array<StoryPaths & {|\n  main: () => any,\n|}>\n```\n\n### Storybook testing\n\nOnce stories are loaded, `runTests` will connect to SauceLabs (optionally through a SauceConnect tunnel) and return a Promise that includes the results of the test.\n\nSince it uses `nightwatch` under the hood, you must have a valid nightwatch instance running. To assist with it, `nightwatchConfig` provides defaultValues\n\n```js\ntype Status = 'CREATED' | 'SUCCESS' | 'FAILED'\ntype ImgResults = {|\n    browser: string,\n    diffPath: ?string,\n    diffThreshold: number,\n    error: ?string,\n    name: string,\n    platform: string,\n    referencePath: ?string,\n    screenshotPath: ?string,\n    status: Status,\n  |}\ntype Tunnel = {|\n  id: string,\n  binaryPath: string,\n|}\n\n// Invoke nightwatch and run image comparison in SauceLabs\nfunction runTests(options: {|\n  configPath: string,           // absolute path to nightwatch config\n  files: Array<StoryPaths>,     // output of getFiles()\n  overwrite: boolean,           // true to replace failing or missing images\n  storyRoot: string,            // absolute path to the stories\n  tunnel?: Tunnel,              // if set, it will set up a SC tunnel with the id\n  outputPath?: string,          // if set, where to store the test results as a\n                                // json file matching the return of `runTests`\n|}): Promise<{|\n  error: Error | null,          // null if there were no exceptions during tests\n  results: Array<ImgResults>,   // per browser / platform / story results\n  // An overall summary status. If any tests failed, it's FAILED, if any tests\n  // where created or updated it's CREATED, if all tests succeeded it's SUCCESS\n  // if no tests ran, it's EMPTY\n  status: Status | 'EMPTY',\n  counts: {|                    // counts for all tests\n    CREATED: number,\n    SUCCESS: number,\n    FAILED: number,\n  |},\n  version: string,              // picturebook version used\n  date: string,                 // ISO date when was the test report created\n|}>\n\n// Nightwatch config generation helper\nfunction nightwatchConfig(options: {|\n  desiredCapabilities?: {},     // nightwatch desired capabilities object\n  files: Array<StoryPaths>,     // output of getFiles()\n  username: string,             // SauceLabs username\n  access_key: string,           // SauceLabs accessKey\n  browsers?: {                  // List of browsers to test. Default list\n                                //   includes chrome, firefox, edge, ie11,\n                                //   iphone7 and safari but any valid SauceLabs\n                                //   config is valid\n    [browserName: string]: {\n      desiredCapabilities: {\n        platform: string,\n        version: string,\n        browserName: string,\n        screenResolution: string,\n      },\n      custom_vars: {|           // Custom properties required per browser config:\n        name: string,           // Must match \"browserName\"\n        platform: string,       // \"mobile\" | \"desktop\" but any string is allowed\n        extract?: {|            // If cropping the output, specify crop dimensions\n          top: number,\n          left: number,\n          width: number,\n          height: number,\n        |},\n      |},\n    },\n  },\n  // Alias for browsers where localhost cannot be accessed from a tunnel,\n  // defaults to \"localtest.dev\"\n  localhostAlias?: string,\n  // List of browsers that can't access localhost from a tunnel, defaults to:\n  // [\"ie11\", \"safari\"]\n  localhostAliasBrowsers?: Array<string>,\n  proxy?: {},                   // Nightwatch proxy object\n|}): Object\n```\n\n## 🎪 Sample App\n\nThis project includes a sample app to demo the behavior. You can view it running `yarn start` and opening `localhost:6006` on your browser.\n\nTo run the image comparison tests, keep `yarn start` running and call `SAUCE_ACCESS_KEY={YOUR_ACCESS_KEY} SAUCE_USERNAME={YOUR_USERNAME} yarn test:app`.\n\n## ️✏️ Storybook Usage\n\nTo take advantage of the automated storybook folder config (and testing) modify your storybook `config.js` to look like this:\n\n```js\nimport { storiesOf, configure } from '@storybook/react'\nimport * as picturebook from 'picturebook'\n\nfunction loadStories() {\n  picturebook.loadStories({\n    storiesOf,\n    stories: require.context('../stories', true, /\\.(js|md|png)/),\n  })\n}\n\nconfigure(loadStories, module)\n```\n\nIf you want to see a more advanced use case on how to use it with decorators and other plugins, check out the [sample project](./sampleFolder/.storybook/config.js).\n\n## 📸 Screenshot Usage\n\nTo take screenshots, picturebook relies on nightwatch. With the exception of a few required fields, configuration is generated for you. To take advantage of it you should create a `nightwatch.conf.js` file on your root (or customize it following instructions [here](http://nightwatchjs.org/gettingstarted#settings-file)).\n\n```js\nconst { resolve } = require('path')\nconst { nightwatchConfig, getFiles } = require('picturebook')\nconst requireContext = require('require-context')\n\nconst config = nightwatchConfig({\n  username: process.env.SAUCE_USERNAME,\n  access_key: process.env.SAUCE_ACCESS_KEY,\n  files: getFiles({\n    baseUrl: 'http://localhost:6006',\n    stories: requireContext(resolve(__dirname, './stories'), true, /\\.js/),\n  }),\n  desiredCapabilities: {\n    build: 'local',\n    'tunnel-identifier': 'picturebook-sample',\n  },\n})\n\nmodule.exports = config\n```\n\nTo take screenshots and run image comparison, you can call:\n\n```js\nrunTests({\n  storyRoot,\n  files: getFiles({\n    stories: requireContext(storyRoot, true, /\\.(js|png)/),\n  }),\n  overwrite,\n  tunnel,\n  configPath: resolve(__dirname, 'nightwatch.conf.js'),\n})\n```\n\nNote that if using a tunnel, `tunnel-identifier` on your nightwatch config must match the `tunnel.id` parameter passed to `runTests`.\n\n## 🙋 QYMA (Questions you may ask)\n\n### Why do I need to add localtest.dev as a localhost alias?\n\nThis is a SauceLabs issue. To work around it, `safari` and `edge` browsers replace `localhost` from urls to `localtest.dev` as described [here](https://support.saucelabs.com/hc/en-us/articles/225106887-Safari-and-Internet-Explorer-Won-t-Load-Website-When-Using-Sauce-Connect-on-Localhost).\n\nYou can customize the target browsers and localhost alias with the `localhostAliasBrowsers` and `localhostAlias`, respectively.\n\n### How do you skip some files?\n\nPicturebook will only take screenshots of the files you tell it exists. You can filter the output from [require.context](https://webpack.js.org/guides/dependency-management/#require-context) by specifying a different regExp to filter by.\n\n### SauceConnect ENOENT error\n\nIf you see the following error after a couple unsuccessful runs of SauceConnect:\n\n```sh\nevents.js:167\n      throw er; // Unhandled 'error' event\n      ^\n\nError: spawn ~/picturebook/node_modules/node-sauce-connect/lib/sc ENOENT\n```\n\nSometimes it gets stuck. Try cleaning `node_modules` and re-running yarn:\n\n```sh\nrm -rf node_modules\nyarn\n```\n\n### Error retrieving a new session from the selenium server\n\nThis is a Nightwatch issue, addressed in 1.0.4 versions of Nightwatch and later as per [this issue](https://github.com/nightwatchjs/nightwatch/issues/1772).\n\n### node-dir \"cannot read property 'files' of undefined\" error\n\nThere's currently a [bug in node-dir](https://github.com/fshost/node-dir/issues/53) that fails on empty dirs.\n\nRemove empty folders within your stories if you see the following error:\n\n```sh\nyourProject/node_modules/node-dir/lib/paths.js:92\n                results.files = results.files.concat(res.files);\n                                                         ^\n\nTypeError: Cannot read property 'files' of undefined\n    at subloop (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:92:58)\n    at /Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:107:13\n    at onDirRead (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:139:35)\n    at onStat (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:154:14)\n```\n\nYou can do so with:\n\n```sh\nfind /some/path -depth -type d -exec rmdir {} \\;\n```\n\n### No Java runtime present\n\nSelenium 3.0+ requires Java 8. Make sure it's installed if you get the following error:\n\n```sh\nStarting selenium server in parallel mode... There was an error while starting the Selenium server:\n\nNo Java runtime present, requesting install.\n```\n\nFor additional Selenium tips, check out [selenium-standalone tips](https://www.npmjs.com/package/selenium-standalone#tips).\n","readmeFilename":"README.md","gitHead":"dcefe7ef767e350d0c75454c901cd59006ebd894","bugs":{"url":"https://github.com/obartra/picturebook/issues"},"homepage":"https://github.com/obartra/picturebook#readme","_id":"picturebook@2.0.0-beta.23","_npmVersion":"6.1.0","_nodeVersion":"10.6.0","_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"dist":{"integrity":"sha512-fDTX6fgV3ymbBoicK6ca0pcqiwnE+tJPpYBLkUa7kEWWLUy9EvkIRlprnP7+LvPVmo1cWcyhvKsRoUN3C3n4TA==","shasum":"280ea04e6294703db4547c550771bb0d5c4a1fd7","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-2.0.0-beta.23.tgz","fileCount":52,"unpackedSize":878199,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcNi+hCRA9TVsSAnZWagAAIgMP/0sj+3+vQfGuCb2HiKbj\nxHMILgxsX6WQcZ8UuZzjQh3aCXnVxKyYL6k5oECk088+qZDfXJSaeE8IJWcA\n2/OyWi3GOptivVUmRjXtgSoAgTzq2GeIoVrJffbep2758nq/ffr+7UPCRLdj\nY4jqzOXjDXw24fYs0jqkxCl2MGuS3WaqKavC0jGtuXBkdZv0h7DgOR85zAt9\nS1s79X0MCgWfvq+JOBq6Oy/07OA3Plwj2oOomFUAVtdZtA+VwP6gXIb7FI/3\nnYgf1K4z5nC4AyCnE7r0LJmTdGeROWdKXk7QrgSQYSgPg5U9tE0N8XLRh85A\nJ5VD9sqINdLTb4flmsFRjsHE3Ea8NM+LjwsP6hcjCt6wrSBLOCuFZGuAga2G\nLE9DUHq1mGK2al6iQd5B16wDzJOLP0RBEovQMcrb6JdB3OmewVJgi2mafDff\nsWomULBPivMB4Zs3ZEwH8bz0Owvv0Qaly6ja1iOXln0vsaXF0iY8LWXDxPT7\nWVuQJRqrzwdkZ+/AKE1u6VquDLabVeoIssz7EAfVUmdZotpJtL3n54YgGTSZ\nRFLzQswxR5GU7CxdaYj/vUt0zU4+UK3ULDLWdaFnbkc/+ed4I6G9FgvSGY/0\nhdxyl4wdyTNWcXgmZRsMMx1lWnS2Bqg8PgidcvwGhf1ZF8az77Xw9X6gRVE8\nlXlC\r\n=ocxy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBDVUiyethoid8RrvdQwndOpVcbbzn9StWh+KbE2sAyBAiEA+rUGJgjo1WRlF8DKiMHAkrarLYfUaOJ4aLclQ0RGLlI="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook_2.0.0-beta.23_1547055009069_0.9940167492052372"},"_hasShrinkwrap":false},"2.0.0-beta.24":{"name":"picturebook","version":"2.0.0-beta.24","description":"Opinionated Storybook Setup","main":"dist/index.js","browser":"dist/picturebook.web.js","repository":{"type":"git","url":"git+https://github.com/obartra/picturebook.git"},"author":{"name":"Oscar Bartra"},"license":"MIT","scripts":{"format":"prettier --write \"{{src,test,sampleFolder}/**/,}*.js\"","test":"jest","lint":"eslint --ext .js --cache .","build":"webpack --mode production --config webpack.build.config.js && babel src -d dist --copy-files","build:watch":"yarn build --watch","test:watch":"yarn test --watch","start":"yarn && yarn build && cd sampleFolder && yarn && yarn start","test:app":"cd sampleFolder && yarn test --env chrome,firefox,ie11,edge,safari,iphone7","test:app-local":"cd sampleFolder && yarn test --env chrome_local","test:app-all":"cd sampleFolder && yarn test --env chrome,chrome_local,firefox,ie11,edge,safari,iphone7","update-deps":"bash ./scripts/updateDeps.sh","ci":"yarn build && yarn lint && yarn flow check && yarn test"},"dependencies":{"chromedriver":"2.45.0","fs-extra":"7.0.1","lodash":"4.17.11","png-crop":"0.0.2","resemblejs":"3.0.0","rimraf":"2.6.2","selenium-server-standalone-jar":"3.141.5"},"devDependencies":{"@babel/cli":"7.2.0","@babel/core":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.2.0","@babel/plugin-transform-regenerator":"7.0.0","@babel/plugin-transform-runtime":"7.2.0","@babel/preset-env":"7.2.0","@babel/preset-flow":"7.0.0","@babel/preset-react":"7.0.0","@babel/runtime":"7.2.0","@storybook/react":"4.0.12","babel-core":"7.0.0-bridge.0","babel-eslint":"10.0.1","babel-jest":"23.6.0","babel-loader":"8.0.4","babel-plugin-require-context-hook":"1.0.0","clean-webpack-plugin":"1.0.0","eslint":"5.10.0","eslint-config-airbnb":"17.1.0","eslint-config-prettier":"3.3.0","eslint-plugin-flowtype":"3.2.0","eslint-plugin-import":"2.14.0","eslint-plugin-jest":"22.1.2","eslint-plugin-jsx-a11y":"6.1.2","eslint-plugin-prettier":"3.0.0","eslint-plugin-promise":"4.0.1","eslint-plugin-react":"7.11.1","flow-bin":"0.88.0","flow-typed":"2.5.1","jest":"23.6.0","nightwatch":"0.9.21","prettier":"1.15.3","react":"16.6.3","react-dom":"16.6.3","webpack":"4.27.1","webpack-cli":"3.1.2"},"peerDependencies":{"nightwatch":">=0.9.x"},"readme":"# 🤖📗 PictureBook\n\nAutomated Storybook Setup\n\nSimplify Storybook story creation and cross-browser image comparison testing\n\n## 💡 Rationale\n\nSetting up storybook and implement cross-browser image comparison testing on multiple projects is time consuming.\n\nInstead of providing a wrapper on top of existing projects that will fall out of date, Picturebook lets you retain control of the Storybook and Nightwatch packages.\n\nThis project aims to provide utility methods to simplify [Storybook](https://storybook.js.org/), [SauceLabs](https://saucelabs.com/) and [Nightwatch](http://nightwatchjs.org/) configuration and screenshot comparison. Specifically:\n\n- **Creation of storybook stories**: They are created based on your file system structure\n- **Saucelabs tunnel setup**: Reduce SauceConnect config to the SauceConnect binary path and username / accessKey\n- **Screenshot**: Take screenshots of every story on different browsers using SauceLabs and Nightwatch\n- **Image Comparison**: Compare and update screenshots to baselines collocated with your stories.\n\n## ⚙️ Install\n\n1. You will need a SauceLabs account. If you don't have one you can sign up for a trial [here](https://signup.saucelabs.com/signup/trial) or request a free one for open source projects [here](https://saucelabs.com/open-source-request-account).\n1. If you want to run tests against Safari and IE11 from localhost, add `localtest.dev 127.0.0.1` to your `/etc/hosts` (the exact steps may vary depending on your platform, see [here](https://www.howtogeek.com/howto/27350/beginner-geek-how-to-edit-your-hosts-file/) for more details).\n1. Add picturebook and its peer dependencies:\n\n```sh\nyarn add --dev picturebook @storybook/react nightwatch react\n```\n\nReact is used in the examples but you can also use any flavor of storybook you want.\n\nIf you don't have Storybook set it up yet, follow [these instructions](https://storybook.js.org/basics/quick-start-guide/) first.\n\nSome of Picturebook utility methods rely on the output of `require.context`. This is a webpack construct and it's not available in Node or test environments. There are multiple ways to mock it. If you are using babel you could add the [require-context-hook](https://github.com/smrq/babel-plugin-require-context-hook) plugin. For instance, if you want to enable it only for tests, you can do something like:\n\n```json\n{\n  \"env\": {\n    \"test\": {\n      \"plugins\": [\"require-context-hook\"]\n    }\n  }\n}\n```\n\nand on your test setup:\n\n```js\nrequire('babel-plugin-require-context-hook/register')()\n```\n\nAlternatively, there's also the [require-context](https://www.npmjs.com/package/require-context) npm package that will also emulate webpack's `require.context`.\n\n## 📚 API\n\nThe API can be split into 2 sections, storybook creation for finding files in the file system and creating storybook stories around them and storybook testing, to connect to SauceLabs and run cross-browser image comparison tests.\n\n### Storybook creation\n\n`getFiles` and `loadStories` have very similar APIs and output.\n\n`getFiles` allows you to retrieve a list of related files. For instance if you have:\n\n```sh\nfile1.js\nfile1.md\nfile2.png\nfile2.js\n```\n\nIt will provide an array of 2 elements (file1 and file2) with the different related files grouped.\n\nThese values are used to identify helper files for stories where `*.md` is understood to be documentation,`.*(spec|test).js` is a test file and an unprefixed `*.js` file is a story. The `flattenFolders` parameters allow grouping nested folders as well. For instance if `flattenFolders: ['a']` `file1.js` and `a/file1.png` will be grouped together.\n\n`loadStories` provide the same functionality than `getFiles` but it also loads and creates storybook stories. This is why it requires storybook's [storiesOf](https://storybook.js.org/basics/writing-stories/#writing-stories) method as a parameter. The response is also similar but it includes a `main` method with the loaded story.\n\nYou can find the exact APIs below:\n\n```js\ntype StoryPaths = {|\n  name: string,\n  parents: $ReadOnlyArray<string>,\n  title: string,\n  path: string,\n  screenshots: {|\n    [extension: string]: string,\n  |},\n  tests: {|\n    [extension: string]: string,\n  |},\n  doc: ?string,\n  url: ?string,\n|}\n\n// Retrieve and group the different stories based on their filenames\nfunction getFiles({|\n  baseUrl?: string,              // The url for the story, defaults to:\n                                 //   'http://localhost:6006'\n  flattenFolders?: Array<string> // Folders to flatten\n                                 //   defaults to ['__snapshots__', '__screenshots__']\n  stories: any,                  // Output of require context with the stories\n  findKindAndStory?: (           // Customize \"selectedKind\" and \"selectedStory\" on the URL\n    story: StoryPaths,           //   this is not needed if stories are generated with \"loadStories\"\n  ) => {|\n    selectedKind: string,\n    selectedStory: string\n  |},\n  filter?: {|                    // Filter functions to determine how different files are grouped\n    screenshots?: (file: string) => boolean,\n    tests?: (file: string) => boolean,\n    docs?: (file: string) => boolean,\n    story?: (file: string, target: string) => boolean,\n  |}\n|}): Array<StoryPaths>\n\n// Retrieve, group, load and create stories\nfunction loadStories({|\n  baseUrl?: string,              // The url for the story, defaults to:\n                                 //   'http://localhost:6006'\n  flattenFolders?: Array<string> // Folders to flatten\n                                 //   defaults to ['__snapshots__', '__screenshots__']\n  stories: any,                  // Output of require context with the stories\n  decorators: $ReadOnlyArray<Function>,\n  storiesOf: any,\n  storyFiles: $ReadOnlyArray<string>,\n|}): Array<StoryPaths & {|\n  main: () => any,\n|}>\n```\n\n### Storybook testing\n\nOnce stories are loaded, `runTests` will connect to SauceLabs (optionally through a SauceConnect tunnel) and return a Promise that includes the results of the test.\n\nSince it uses `nightwatch` under the hood, you must have a valid nightwatch instance running. To assist with it, `nightwatchConfig` provides defaultValues\n\n```js\ntype Status = 'CREATED' | 'SUCCESS' | 'FAILED'\ntype ImgResults = {|\n    browser: string,\n    diffPath: ?string,\n    diffThreshold: number,\n    error: ?string,\n    name: string,\n    platform: string,\n    referencePath: ?string,\n    screenshotPath: ?string,\n    status: Status,\n  |}\ntype Tunnel = {|\n  id: string,\n  binaryPath: string,\n|}\n\n// Invoke nightwatch and run image comparison in SauceLabs\nfunction runTests(options: {|\n  configPath: string,           // absolute path to nightwatch config\n  files: Array<StoryPaths>,     // output of getFiles()\n  overwrite: boolean,           // true to replace failing or missing images\n  storyRoot: string,            // absolute path to the stories\n  tunnel?: Tunnel,              // if set, it will set up a SC tunnel with the id\n  outputPath?: string,          // if set, where to store the test results as a\n                                // json file matching the return of `runTests`\n|}): Promise<{|\n  error: Error | null,          // null if there were no exceptions during tests\n  results: Array<ImgResults>,   // per browser / platform / story results\n  // An overall summary status. If any tests failed, it's FAILED, if any tests\n  // where created or updated it's CREATED, if all tests succeeded it's SUCCESS\n  // if no tests ran, it's EMPTY\n  status: Status | 'EMPTY',\n  counts: {|                    // counts for all tests\n    CREATED: number,\n    SUCCESS: number,\n    FAILED: number,\n  |},\n  version: string,              // picturebook version used\n  date: string,                 // ISO date when was the test report created\n|}>\n\n// Nightwatch config generation helper\nfunction nightwatchConfig(options: {|\n  desiredCapabilities?: {},     // nightwatch desired capabilities object\n  localOverrides: {},           // overrides set when browser.local flag is true\n  remoteOverrides: {},          // overrides when browser.local flag is falsy\n  files: Array<StoryPaths>,     // output of getFiles()\n  username: string,             // SauceLabs username\n  access_key: string,           // SauceLabs accessKey\n  browsers?: {                  // List of browsers to test. Default list\n                                //   includes chrome, firefox, edge, ie11,\n                                //   iphone7 and safari but any valid SauceLabs\n                                //   config is valid\n    [browserName: string]: {\n      desiredCapabilities: {\n        platform: string,\n        version: string,\n        browserName: string,\n        screenResolution: string,\n      },\n      custom_vars: {|           // Custom properties required per browser config:\n        local?: boolean,        // optionally run this browser locally. Useful for\n                                //   a mix of remote and local browsers\n        name: string,           // Must match \"browserName\"\n        platform: string,       // \"mobile\" | \"desktop\" but any string is allowed\n        extract?: {|            // If cropping the output, specify crop dimensions\n          top: number,\n          left: number,\n          width: number,\n          height: number,\n        |},\n      |},\n    },\n  },\n  // Alias for browsers where localhost cannot be accessed from a tunnel,\n  // defaults to \"localtest.dev\"\n  localhostAlias?: string,\n  // List of browsers that can't access localhost from a tunnel, defaults to:\n  // [\"ie11\", \"safari\"]\n  localhostAliasBrowsers?: Array<string>,\n  proxy?: {},                   // Nightwatch proxy object\n|}): Object\n```\n\n## 🎪 Sample App\n\nThis project includes a sample app to demo the behavior. You can view it running `yarn start` and opening `localhost:6006` on your browser.\n\nTo run the image comparison tests, keep `yarn start` running and call `SAUCE_ACCESS_KEY={YOUR_ACCESS_KEY} SAUCE_USERNAME={YOUR_USERNAME} yarn test:app`.\n\n## ️✏️ Storybook Usage\n\nTo take advantage of the automated storybook folder config (and testing) modify your storybook `config.js` to look like this:\n\n```js\nimport { storiesOf, configure } from '@storybook/react'\nimport * as picturebook from 'picturebook'\n\nfunction loadStories() {\n  picturebook.loadStories({\n    storiesOf,\n    stories: require.context('../stories', true, /\\.(js|md|png)/),\n  })\n}\n\nconfigure(loadStories, module)\n```\n\nIf you want to see a more advanced use case on how to use it with decorators and other plugins, check out the [sample project](./sampleFolder/.storybook/config.js).\n\n## 📸 Screenshot Usage\n\nTo take screenshots, picturebook relies on nightwatch. With the exception of a few required fields, configuration is generated for you. To take advantage of it you should create a `nightwatch.conf.js` file on your root (or customize it following instructions [here](http://nightwatchjs.org/gettingstarted#settings-file)).\n\n```js\nconst { resolve } = require('path')\nconst { nightwatchConfig, getFiles } = require('picturebook')\nconst requireContext = require('require-context')\n\nconst config = nightwatchConfig({\n  username: process.env.SAUCE_USERNAME,\n  access_key: process.env.SAUCE_ACCESS_KEY,\n  files: getFiles({\n    baseUrl: 'http://localhost:6006',\n    stories: requireContext(resolve(__dirname, './stories'), true, /\\.js/),\n  }),\n  desiredCapabilities: {\n    build: 'local',\n    'tunnel-identifier': 'picturebook-sample',\n  },\n})\n\nmodule.exports = config\n```\n\nTo take screenshots and run image comparison, you can call:\n\n```js\nrunTests({\n  storyRoot,\n  files: getFiles({\n    stories: requireContext(storyRoot, true, /\\.(js|png)/),\n  }),\n  overwrite,\n  tunnel,\n  configPath: resolve(__dirname, 'nightwatch.conf.js'),\n})\n```\n\nNote that if using a tunnel, `tunnel-identifier` on your nightwatch config must match the `tunnel.id` parameter passed to `runTests`.\n\n## 🙋 QYMA (Questions you may ask)\n\n### Why do I need to add localtest.dev as a localhost alias?\n\nThis is a SauceLabs issue. To work around it, `safari` and `edge` browsers replace `localhost` from urls to `localtest.dev` as described [here](https://support.saucelabs.com/hc/en-us/articles/225106887-Safari-and-Internet-Explorer-Won-t-Load-Website-When-Using-Sauce-Connect-on-Localhost).\n\nYou can customize the target browsers and localhost alias with the `localhostAliasBrowsers` and `localhostAlias`, respectively.\n\n### How do you skip some files?\n\nPicturebook will only take screenshots of the files you tell it exists. You can filter the output from [require.context](https://webpack.js.org/guides/dependency-management/#require-context) by specifying a different regExp to filter by.\n\n### SauceConnect ENOENT error\n\nIf you see the following error after a couple unsuccessful runs of SauceConnect:\n\n```sh\nevents.js:167\n      throw er; // Unhandled 'error' event\n      ^\n\nError: spawn ~/picturebook/node_modules/node-sauce-connect/lib/sc ENOENT\n```\n\nSometimes it gets stuck. Try cleaning `node_modules` and re-running yarn:\n\n```sh\nrm -rf node_modules\nyarn\n```\n\n### Error retrieving a new session from the selenium server\n\nThis is a Nightwatch issue, addressed in 1.0.4 versions of Nightwatch and later as per [this issue](https://github.com/nightwatchjs/nightwatch/issues/1772).\n\n### node-dir \"cannot read property 'files' of undefined\" error\n\nThere's currently a [bug in node-dir](https://github.com/fshost/node-dir/issues/53) that fails on empty dirs.\n\nRemove empty folders within your stories if you see the following error:\n\n```sh\nyourProject/node_modules/node-dir/lib/paths.js:92\n                results.files = results.files.concat(res.files);\n                                                         ^\n\nTypeError: Cannot read property 'files' of undefined\n    at subloop (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:92:58)\n    at /Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:107:13\n    at onDirRead (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:139:35)\n    at onStat (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:154:14)\n```\n\nYou can do so with:\n\n```sh\nfind /some/path -depth -type d -exec rmdir {} \\;\n```\n\n### No Java runtime present\n\nSelenium 3.0+ requires Java 8. Make sure it's installed if you get the following error:\n\n```sh\nStarting selenium server in parallel mode... There was an error while starting the Selenium server:\n\nNo Java runtime present, requesting install.\n```\n\nFor additional Selenium tips, check out [selenium-standalone tips](https://www.npmjs.com/package/selenium-standalone#tips).\n","readmeFilename":"README.md","gitHead":"2926c4552256661fc2bb4fea107de8d8a2d98066","bugs":{"url":"https://github.com/obartra/picturebook/issues"},"homepage":"https://github.com/obartra/picturebook#readme","_id":"picturebook@2.0.0-beta.24","_npmVersion":"6.1.0","_nodeVersion":"10.6.0","_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"dist":{"integrity":"sha512-KJ28BdhrvqyNV3icCTizS5zegqOEtPXsY6UibobM4HCGOgKiR+id8Lj1K88pgUW9MFImD8vQLBifQ6DFCVUs4Q==","shasum":"dbf86eae93f07e8bc18db90acf0f2feedf2c1da6","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-2.0.0-beta.24.tgz","fileCount":918,"unpackedSize":39998969,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcN57TCRA9TVsSAnZWagAA/lUQAJt03s3l10AEIV7PLGiM\nXrfH0IBTZgxUDVHiMUimlqZ1bLSvMjo5qCXIiu1urtZsRPmHz+OhGmk+WYCn\nQP5LBFBq4Ea7nspkMuAUfW9oxU/nGkXRZqccz9s4TQ3DF4iKEdtkMF39WFlT\noRCwFyiDS2PXKWKWyDapUpdIubxx8qanmwgEQSDY/GH6jTY7aroyU6cYM3qp\no0gik7houIN4Rj+tcmQZnAgjTD9lnRZmVIetcK7SEGGkZR8gMObUdHrTS/l9\n9CenKnTl7TDvAp6L5s4Khvdomcj8kjo2l3sZ56y1QDMBsipyEEM5vtJTGV4u\nhuUD3iLG1phsOon4mdLVtNfSOZLQ90FyzSm6jdaM0jMQN8Xsx/uwu8XWsTNQ\nCgczEdiUTgpbQsWGx0Z74l1fNvEjVBJDWdRLxpDGp627hbr4HrzalgX8oejx\nMjLKEWiYlpwKTSftquet2Vf6nyN6KR+jukRseNXqWfqf8foH+jVIQC4fKaTO\nXwQo2HQgaI8V8MKeQjK5Qg5yT59C5q9nEYExU8uCDQ8jncGkSw28FvpJARJ6\neGehgZTj/OPlaWUQNPQx8OGH7AHh+7PGZJkDKaCLrbFToFGl25xrMNl445zt\nWFKrySirKl7pPAAFRyF6/B4DInfasmKpwxEAo2b/xAHXmSqqfj4De7/UZZKN\nvEd7\r\n=Ma3q\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD3SIOqCY6sf5ukjXrN36lpTPhbgiLz1RSv7xjyTd0DYwIhAPl1HvtHyrs0bOPBfU3Z9xeK07u/yg4TxcKxZ4rTKMCf"}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook_2.0.0-beta.24_1547149010302_0.3802469615762589"},"_hasShrinkwrap":false},"3.0.0-alpha.1":{"name":"picturebook","version":"3.0.0-alpha.1","description":"Opinionated Storybook Setup","main":"dist/index.js","browser":"dist/picturebook.web.js","repository":{"type":"git","url":"git+https://github.com/obartra/picturebook.git"},"author":{"name":"Oscar Bartra"},"license":"MIT","scripts":{"format":"prettier --write \"{{src,test,sampleFolder}/**/,}*.js\"","test":"jest","lint":"eslint --ext .js --cache .","build":"webpack --mode production --config webpack.build.config.js && babel src -d dist --copy-files","build:watch":"yarn build --watch","test:watch":"yarn test --watch","start":"yarn && yarn build && cd sampleFolder && yarn && yarn start","test:app":"cd sampleFolder && yarn test --env chrome,firefox,ie11,edge,safari,iphone7","test:app-local":"cd sampleFolder && yarn test --env chrome_local","test:app-all":"cd sampleFolder && yarn test --env chrome,chrome_local,firefox,ie11,edge,safari,iphone7","update-deps":"bash ./scripts/updateDeps.sh","ci":"yarn build && yarn lint && yarn flow check && yarn test"},"dependencies":{"chromedriver":"2.45.0","fs-extra":"7.0.1","lodash":"4.17.11","png-crop":"0.0.2","resemblejs":"3.0.0","rimraf":"2.6.2","selenium-server-standalone-jar":"3.141.5"},"devDependencies":{"@babel/cli":"7.2.0","@babel/core":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.2.0","@babel/plugin-transform-regenerator":"7.0.0","@babel/plugin-transform-runtime":"7.2.0","@babel/preset-env":"7.2.0","@babel/preset-flow":"7.0.0","@babel/preset-react":"7.0.0","@babel/runtime":"7.2.0","@storybook/react":"5.0.6","babel-core":"7.0.0-bridge.0","babel-eslint":"10.0.1","babel-jest":"23.6.0","babel-loader":"8.0.4","babel-plugin-require-context-hook":"1.0.0","clean-webpack-plugin":"1.0.0","eslint":"5.10.0","eslint-config-airbnb":"17.1.0","eslint-config-prettier":"3.3.0","eslint-plugin-flowtype":"3.2.0","eslint-plugin-import":"2.14.0","eslint-plugin-jest":"22.1.2","eslint-plugin-jsx-a11y":"6.1.2","eslint-plugin-prettier":"3.0.0","eslint-plugin-promise":"4.0.1","eslint-plugin-react":"7.11.1","flow-bin":"0.88.0","flow-typed":"2.5.1","jest":"23.6.0","nightwatch":"0.9.21","prettier":"1.15.3","react":"16.6.3","react-dom":"16.6.3","webpack":"4.27.1","webpack-cli":"3.1.2"},"peerDependencies":{"nightwatch":">=1.x.x"},"readme":"# 🤖📗 PictureBook\n\nAutomated Storybook Setup\n\nSimplify Storybook story creation and cross-browser image comparison testing\n\n## 💡 Rationale\n\nSetting up storybook and implement cross-browser image comparison testing on multiple projects is time consuming.\n\nInstead of providing a wrapper on top of existing projects that will fall out of date, Picturebook lets you retain control of the Storybook and Nightwatch packages.\n\nThis project aims to provide utility methods to simplify [Storybook](https://storybook.js.org/), [SauceLabs](https://saucelabs.com/) and [Nightwatch](http://nightwatchjs.org/) configuration and screenshot comparison. Specifically:\n\n- **Creation of storybook stories**: They are created based on your file system structure\n- **Saucelabs tunnel setup**: Reduce SauceConnect config to the SauceConnect binary path and username / accessKey\n- **Screenshot**: Take screenshots of every story on different browsers using SauceLabs and Nightwatch\n- **Image Comparison**: Compare and update screenshots to baselines collocated with your stories.\n\n## ⚙️ Install\n\n1. You will need a SauceLabs account. If you don't have one you can sign up for a trial [here](https://signup.saucelabs.com/signup/trial) or request a free one for open source projects [here](https://saucelabs.com/open-source-request-account).\n1. If you want to run tests against Safari and IE11 from localhost, add `localtest.dev 127.0.0.1` to your `/etc/hosts` (the exact steps may vary depending on your platform, see [here](https://www.howtogeek.com/howto/27350/beginner-geek-how-to-edit-your-hosts-file/) for more details).\n1. Add picturebook and its peer dependencies:\n\n```sh\nyarn add --dev picturebook @storybook/react nightwatch react\n```\n\nReact is used in the examples but you can also use any flavor of storybook you want.\n\nIf you don't have Storybook set it up yet, follow [these instructions](https://storybook.js.org/basics/quick-start-guide/) first.\n\nSome of Picturebook utility methods rely on the output of `require.context`. This is a webpack construct and it's not available in Node or test environments. There are multiple ways to mock it. If you are using babel you could add the [require-context-hook](https://github.com/smrq/babel-plugin-require-context-hook) plugin. For instance, if you want to enable it only for tests, you can do something like:\n\n```json\n{\n  \"env\": {\n    \"test\": {\n      \"plugins\": [\"require-context-hook\"]\n    }\n  }\n}\n```\n\nand on your test setup:\n\n```js\nrequire('babel-plugin-require-context-hook/register')()\n```\n\nAlternatively, there's also the [require-context](https://www.npmjs.com/package/require-context) npm package that will also emulate webpack's `require.context`.\n\n## 📚 API\n\nThe API can be split into 2 sections, storybook creation for finding files in the file system and creating storybook stories around them and storybook testing, to connect to SauceLabs and run cross-browser image comparison tests.\n\n### Storybook creation\n\n`getFiles` and `loadStories` have very similar APIs and output.\n\n`getFiles` allows you to retrieve a list of related files. For instance if you have:\n\n```sh\nfile1.js\nfile1.md\nfile2.png\nfile2.js\n```\n\nIt will provide an array of 2 elements (file1 and file2) with the different related files grouped.\n\nThese values are used to identify helper files for stories where `*.md` is understood to be documentation,`.*(spec|test).js` is a test file and an unprefixed `*.js` file is a story. The `flattenFolders` parameters allow grouping nested folders as well. For instance if `flattenFolders: ['a']` `file1.js` and `a/file1.png` will be grouped together.\n\n`loadStories` provide the same functionality than `getFiles` but it also loads and creates storybook stories. This is why it requires storybook's [storiesOf](https://storybook.js.org/basics/writing-stories/#writing-stories) method as a parameter. The response is also similar but it includes a `main` method with the loaded story.\n\nYou can find the exact APIs below:\n\n```js\ntype StoryPaths = {|\n  name: string,\n  parents: $ReadOnlyArray<string>,\n  title: string,\n  path: string,\n  screenshots: {|\n    [extension: string]: string,\n  |},\n  tests: {|\n    [extension: string]: string,\n  |},\n  doc: ?string,\n  url: ?string,\n|}\n\n// Retrieve and group the different stories based on their filenames\nfunction getFiles({|\n  baseUrl?: string,              // The url for the story, defaults to:\n                                 //   'http://localhost:6006'\n  flattenFolders?: Array<string> // Folders to flatten\n                                 //   defaults to ['__snapshots__', '__screenshots__']\n  stories: any,                  // Output of require context with the stories\n  findKindAndStory?: (           // Customize \"selectedKind\" and \"selectedStory\" on the URL\n    story: StoryPaths,           //   this is not needed if stories are generated with \"loadStories\"\n  ) => {|\n    selectedKind: string,\n    selectedStory: string\n  |},\n  filter?: {|                    // Filter functions to determine how different files are grouped\n    screenshots?: (file: string) => boolean,\n    tests?: (file: string) => boolean,\n    docs?: (file: string) => boolean,\n    story?: (file: string, target: string) => boolean,\n  |}\n|}): Array<StoryPaths>\n\n// Retrieve, group, load and create stories\nfunction loadStories({|\n  baseUrl?: string,              // The url for the story, defaults to:\n                                 //   'http://localhost:6006'\n  flattenFolders?: Array<string> // Folders to flatten\n                                 //   defaults to ['__snapshots__', '__screenshots__']\n  stories: any,                  // Output of require context with the stories\n  decorators: $ReadOnlyArray<Function>,\n  storiesOf: any,\n  storyFiles: $ReadOnlyArray<string>,\n|}): Array<StoryPaths & {|\n  main: () => any,\n|}>\n```\n\n### Storybook testing\n\nOnce stories are loaded, `runTests` will connect to SauceLabs (optionally through a SauceConnect tunnel) and return a Promise that includes the results of the test.\n\nSince it uses `nightwatch` under the hood, you must have a valid nightwatch instance running. To assist with it, `nightwatchConfig` provides defaultValues\n\n```js\ntype Status = 'CREATED' | 'SUCCESS' | 'FAILED'\ntype ImgResults = {|\n    browser: string,\n    diffPath: ?string,\n    diffThreshold: number,\n    error: ?string,\n    name: string,\n    platform: string,\n    referencePath: ?string,\n    screenshotPath: ?string,\n    status: Status,\n  |}\ntype Tunnel = {|\n  id: string,\n  binaryPath: string,\n|}\n\n// Invoke nightwatch and run image comparison in SauceLabs\nfunction runTests(options: {|\n  configPath: string,           // absolute path to nightwatch config\n  files: Array<StoryPaths>,     // output of getFiles()\n  overwrite: boolean,           // true to replace failing or missing images\n  storyRoot: string,            // absolute path to the stories\n  tunnel?: Tunnel,              // if set, it will set up a SC tunnel with the id\n  outputPath?: string,          // if set, where to store the test results as a\n                                // json file matching the return of `runTests`\n|}): Promise<{|\n  error: Error | null,          // null if there were no exceptions during tests\n  results: Array<ImgResults>,   // per browser / platform / story results\n  // An overall summary status. If any tests failed, it's FAILED, if any tests\n  // where created or updated it's CREATED, if all tests succeeded it's SUCCESS\n  // if no tests ran, it's EMPTY\n  status: Status | 'EMPTY',\n  counts: {|                    // counts for all tests\n    CREATED: number,\n    SUCCESS: number,\n    FAILED: number,\n  |},\n  version: string,              // picturebook version used\n  date: string,                 // ISO date when was the test report created\n|}>\n\n// Nightwatch config generation helper\nfunction nightwatchConfig(options: {|\n  desiredCapabilities?: {},     // nightwatch desired capabilities object\n  localOverrides: {},           // overrides set when browser.local flag is true\n  remoteOverrides: {},          // overrides when browser.local flag is falsy\n  files: Array<StoryPaths>,     // output of getFiles()\n  username: string,             // SauceLabs username\n  access_key: string,           // SauceLabs accessKey\n  browsers?: {                  // List of browsers to test. Default list\n                                //   includes chrome, firefox, edge, ie11,\n                                //   iphone7 and safari but any valid SauceLabs\n                                //   config is valid\n    [browserName: string]: {\n      desiredCapabilities: {\n        platform: string,\n        version: string,\n        browserName: string,\n        screenResolution: string,\n      },\n      custom_vars: {|           // Custom properties required per browser config:\n        local?: boolean,        // optionally run this browser locally. Useful for\n                                //   a mix of remote and local browsers\n        name: string,           // Must match \"browserName\"\n        platform: string,       // \"mobile\" | \"desktop\" but any string is allowed\n        extract?: {|            // If cropping the output, specify crop dimensions\n          top: number,\n          left: number,\n          width: number,\n          height: number,\n        |},\n      |},\n    },\n  },\n  // Alias for browsers where localhost cannot be accessed from a tunnel,\n  // defaults to \"localtest.dev\"\n  localhostAlias?: string,\n  // List of browsers that can't access localhost from a tunnel, defaults to:\n  // [\"ie11\", \"safari\"]\n  localhostAliasBrowsers?: Array<string>,\n  proxy?: {},                   // Nightwatch proxy object\n|}): Object\n```\n\n## 🎪 Sample App\n\nThis project includes a sample app to demo the behavior. You can view it running `yarn start` and opening `localhost:6006` on your browser.\n\nTo run the image comparison tests, keep `yarn start` running and call `SAUCE_ACCESS_KEY={YOUR_ACCESS_KEY} SAUCE_USERNAME={YOUR_USERNAME} yarn test:app`.\n\n## ️✏️ Storybook Usage\n\nTo take advantage of the automated storybook folder config (and testing) modify your storybook `config.js` to look like this:\n\n```js\nimport { storiesOf, configure } from '@storybook/react'\nimport * as picturebook from 'picturebook'\n\nfunction loadStories() {\n  picturebook.loadStories({\n    storiesOf,\n    stories: require.context('../stories', true, /\\.(js|md|png)/),\n  })\n}\n\nconfigure(loadStories, module)\n```\n\nIf you want to see a more advanced use case on how to use it with decorators and other plugins, check out the [sample project](./sampleFolder/.storybook/config.js).\n\n## 📸 Screenshot Usage\n\nTo take screenshots, picturebook relies on nightwatch. With the exception of a few required fields, configuration is generated for you. To take advantage of it you should create a `nightwatch.conf.js` file on your root (or customize it following instructions [here](http://nightwatchjs.org/gettingstarted#settings-file)).\n\n```js\nconst { resolve } = require('path')\nconst { nightwatchConfig, getFiles } = require('picturebook')\nconst requireContext = require('require-context')\n\nconst config = nightwatchConfig({\n  username: process.env.SAUCE_USERNAME,\n  access_key: process.env.SAUCE_ACCESS_KEY,\n  files: getFiles({\n    baseUrl: 'http://localhost:6006',\n    stories: requireContext(resolve(__dirname, './stories'), true, /\\.js/),\n  }),\n  desiredCapabilities: {\n    build: 'local',\n    'tunnel-identifier': 'picturebook-sample',\n  },\n})\n\nmodule.exports = config\n```\n\nTo take screenshots and run image comparison, you can call:\n\n```js\nrunTests({\n  storyRoot,\n  files: getFiles({\n    stories: requireContext(storyRoot, true, /\\.(js|png)/),\n  }),\n  overwrite,\n  tunnel,\n  configPath: resolve(__dirname, 'nightwatch.conf.js'),\n})\n```\n\nNote that if using a tunnel, `tunnel-identifier` on your nightwatch config must match the `tunnel.id` parameter passed to `runTests`.\n\n## 🙋 QYMA (Questions you may ask)\n\n### Why do I need to add localtest.dev as a localhost alias?\n\nThis is a SauceLabs issue. To work around it, `safari` and `edge` browsers replace `localhost` from urls to `localtest.dev` as described [here](https://support.saucelabs.com/hc/en-us/articles/225106887-Safari-and-Internet-Explorer-Won-t-Load-Website-When-Using-Sauce-Connect-on-Localhost).\n\nYou can customize the target browsers and localhost alias with the `localhostAliasBrowsers` and `localhostAlias`, respectively.\n\n### How do you skip some files?\n\nPicturebook will only take screenshots of the files you tell it exists. You can filter the output from [require.context](https://webpack.js.org/guides/dependency-management/#require-context) by specifying a different regExp to filter by.\n\n### SauceConnect ENOENT error\n\nIf you see the following error after a couple unsuccessful runs of SauceConnect:\n\n```sh\nevents.js:167\n      throw er; // Unhandled 'error' event\n      ^\n\nError: spawn ~/picturebook/node_modules/node-sauce-connect/lib/sc ENOENT\n```\n\nSometimes it gets stuck. Try cleaning `node_modules` and re-running yarn:\n\n```sh\nrm -rf node_modules\nyarn\n```\n\n### Error retrieving a new session from the selenium server\n\nThis is a Nightwatch issue, addressed in 1.0.4 versions of Nightwatch and later as per [this issue](https://github.com/nightwatchjs/nightwatch/issues/1772).\n\n### node-dir \"cannot read property 'files' of undefined\" error\n\nThere's currently a [bug in node-dir](https://github.com/fshost/node-dir/issues/53) that fails on empty dirs.\n\nRemove empty folders within your stories if you see the following error:\n\n```sh\nyourProject/node_modules/node-dir/lib/paths.js:92\n                results.files = results.files.concat(res.files);\n                                                         ^\n\nTypeError: Cannot read property 'files' of undefined\n    at subloop (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:92:58)\n    at /Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:107:13\n    at onDirRead (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:139:35)\n    at onStat (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:154:14)\n```\n\nYou can do so with:\n\n```sh\nfind /some/path -depth -type d -exec rmdir {} \\;\n```\n\n### No Java runtime present\n\nSelenium 3.0+ requires Java 8. Make sure it's installed if you get the following error:\n\n```sh\nStarting selenium server in parallel mode... There was an error while starting the Selenium server:\n\nNo Java runtime present, requesting install.\n```\n\nFor additional Selenium tips, check out [selenium-standalone tips](https://www.npmjs.com/package/selenium-standalone#tips).\n","readmeFilename":"README.md","gitHead":"db7c20645fd6f60d742631c03898e464b34b6f4a","bugs":{"url":"https://github.com/obartra/picturebook/issues"},"homepage":"https://github.com/obartra/picturebook#readme","_id":"picturebook@3.0.0-alpha.1","_npmVersion":"5.6.0","_nodeVersion":"8.11.2","_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"dist":{"integrity":"sha512-Ry3o3M9VKf8VKTgADSI9mfE1zvt4htGGEf4ON0IzlDzx9YazDaMKgNqnpHNTdkPqcrsYgQPAEpIq48SzQwvr3A==","shasum":"004aceab0668f801636fd64a5c842db0c75b16f5","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-3.0.0-alpha.1.tgz","fileCount":52,"unpackedSize":884036,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcrkgZCRA9TVsSAnZWagAAvTEP/2zcicgAowcAEquhgSJo\nGZe7cKEFC8m0H9HXY/wwSWtHvI1JtYU3f9tNA61TL0W+kTOvpn1xfXa1+CsK\nqAC4BllWh9WrxofRsHN8+IS7bWz5OyA4LKBZgzV5CKka2fZaBoblo0Xhm1h1\nvQvSiFd2JybwRBirTG3qWv5bKjtm28cQY2CNZ+xjC0cpFo+JN2nVFyYfLxPx\n1aHqm9FX21rCkwCUl5DSm6at6qnXmgDq7zbjkbCgnhdFVMqxx8t7ZHK0vb3A\nPmD4u05AyYSYVPhPcTwaCxXYmxnLxUwL3jgAD2BD11J2vDMETe0f90Ufucl8\ndQt4KxOa0EYCQq1RZSqaLH0Jc74Oe1lXG2MoRU1iX+lFsLRlnMv3LTwa3L9q\nOPEXk2spyqW6KOHZEPdZ6nP2alxJcwbPtcaWlNawoYwmvp35Ciku5lRgE9E8\numyZyBnPBNRcW164/KU5wuNQMFPn4Rmkq2ASYea+c6d62ljHvaAp+D8xvC1Z\n/YnOjSv9V7MzG8fK7PFYtr1/I/81xMFdOIqEGVXvGRU6hlLcbpllcofIMJrU\nTRIUdjxDl3AvUaNeKplG3qtW00nmFAJlUrz7qAAvyqdtdbPNXagPZtE0IbzX\nLv3cTp44R6IqEnqdmCDbUO+C3lDliz+QXEaP9Ye7dm437121uvf6s7F2rLjA\nX4Th\r\n=K2V6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCCUbJ3/pWKLx3Ul6ZsjBaHQO5+uhNS0cXj1kkKW4ZNdQIgWKHoQXP8QvAAgNLqveRKehmx+wuBPVsphRSVLR9KEaQ="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook_3.0.0-alpha.1_1554925592515_0.319109640539756"},"_hasShrinkwrap":false},"3.0.0-alpha.2":{"name":"picturebook","version":"3.0.0-alpha.2","description":"Opinionated Storybook Setup","main":"dist/index.js","browser":"dist/picturebook.web.js","repository":{"type":"git","url":"git+https://github.com/obartra/picturebook.git"},"author":{"name":"Oscar Bartra"},"license":"MIT","scripts":{"format":"prettier --write \"{{src,test,sampleFolder}/**/,}*.js\"","test":"jest","lint":"eslint --ext .js --cache .","build":"webpack --mode production --config webpack.build.config.js && babel src -d dist --copy-files","build:watch":"yarn build --watch","test:watch":"yarn test --watch","start":"yarn && yarn build && cd sampleFolder && yarn && yarn start","test:app":"cd sampleFolder && yarn test --env chrome,firefox,ie11,edge,safari,iphone7","test:app-local":"cd sampleFolder && yarn test --env chrome_local","test:app-all":"cd sampleFolder && yarn test --env chrome,chrome_local,firefox,ie11,edge,safari,iphone7","update-deps":"bash ./scripts/updateDeps.sh","ci":"yarn build && yarn lint && yarn flow check && yarn test"},"dependencies":{"chromedriver":"2.45.0","fs-extra":"7.0.1","lodash":"4.17.11","png-crop":"0.0.2","resemblejs":"3.0.0","rimraf":"2.6.2","selenium-server-standalone-jar":"3.141.5"},"devDependencies":{"@babel/cli":"7.2.0","@babel/core":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.2.0","@babel/plugin-transform-regenerator":"7.0.0","@babel/plugin-transform-runtime":"7.2.0","@babel/preset-env":"7.2.0","@babel/preset-flow":"7.0.0","@babel/preset-react":"7.0.0","@babel/runtime":"7.2.0","@storybook/react":"5.0.6","babel-core":"7.0.0-bridge.0","babel-eslint":"10.0.1","babel-jest":"23.6.0","babel-loader":"8.0.4","babel-plugin-require-context-hook":"1.0.0","clean-webpack-plugin":"1.0.0","eslint":"5.10.0","eslint-config-airbnb":"17.1.0","eslint-config-prettier":"3.3.0","eslint-plugin-flowtype":"3.2.0","eslint-plugin-import":"2.14.0","eslint-plugin-jest":"22.1.2","eslint-plugin-jsx-a11y":"6.1.2","eslint-plugin-prettier":"3.0.0","eslint-plugin-promise":"4.0.1","eslint-plugin-react":"7.11.1","flow-bin":"0.88.0","flow-typed":"2.5.1","jest":"23.6.0","nightwatch":"0.9.21","prettier":"1.15.3","react":"16.6.3","react-dom":"16.6.3","webpack":"4.27.1","webpack-cli":"3.1.2"},"peerDependencies":{"nightwatch":"<=0.9.x"},"readme":"# 🤖📗 PictureBook\n\nAutomated Storybook Setup\n\nSimplify Storybook story creation and cross-browser image comparison testing\n\n## 💡 Rationale\n\nSetting up storybook and implement cross-browser image comparison testing on multiple projects is time consuming.\n\nInstead of providing a wrapper on top of existing projects that will fall out of date, Picturebook lets you retain control of the Storybook and Nightwatch packages.\n\nThis project aims to provide utility methods to simplify [Storybook](https://storybook.js.org/), [SauceLabs](https://saucelabs.com/) and [Nightwatch](http://nightwatchjs.org/) configuration and screenshot comparison. Specifically:\n\n- **Creation of storybook stories**: They are created based on your file system structure\n- **Saucelabs tunnel setup**: Reduce SauceConnect config to the SauceConnect binary path and username / accessKey\n- **Screenshot**: Take screenshots of every story on different browsers using SauceLabs and Nightwatch\n- **Image Comparison**: Compare and update screenshots to baselines collocated with your stories.\n\n## ⚙️ Install\n\n1. You will need a SauceLabs account. If you don't have one you can sign up for a trial [here](https://signup.saucelabs.com/signup/trial) or request a free one for open source projects [here](https://saucelabs.com/open-source-request-account).\n1. If you want to run tests against Safari and IE11 from localhost, add `localtest.dev 127.0.0.1` to your `/etc/hosts` (the exact steps may vary depending on your platform, see [here](https://www.howtogeek.com/howto/27350/beginner-geek-how-to-edit-your-hosts-file/) for more details).\n1. Add picturebook and its peer dependencies:\n\n```sh\nyarn add --dev picturebook @storybook/react nightwatch react\n```\n\nReact is used in the examples but you can also use any flavor of storybook you want.\n\nIf you don't have Storybook set it up yet, follow [these instructions](https://storybook.js.org/basics/quick-start-guide/) first.\n\nSome of Picturebook utility methods rely on the output of `require.context`. This is a webpack construct and it's not available in Node or test environments. There are multiple ways to mock it. If you are using babel you could add the [require-context-hook](https://github.com/smrq/babel-plugin-require-context-hook) plugin. For instance, if you want to enable it only for tests, you can do something like:\n\n```json\n{\n  \"env\": {\n    \"test\": {\n      \"plugins\": [\"require-context-hook\"]\n    }\n  }\n}\n```\n\nand on your test setup:\n\n```js\nrequire('babel-plugin-require-context-hook/register')()\n```\n\nAlternatively, there's also the [require-context](https://www.npmjs.com/package/require-context) npm package that will also emulate webpack's `require.context`.\n\n## 📚 API\n\nThe API can be split into 2 sections, storybook creation for finding files in the file system and creating storybook stories around them and storybook testing, to connect to SauceLabs and run cross-browser image comparison tests.\n\n### Storybook creation\n\n`getFiles` and `loadStories` have very similar APIs and output.\n\n`getFiles` allows you to retrieve a list of related files. For instance if you have:\n\n```sh\nfile1.js\nfile1.md\nfile2.png\nfile2.js\n```\n\nIt will provide an array of 2 elements (file1 and file2) with the different related files grouped.\n\nThese values are used to identify helper files for stories where `*.md` is understood to be documentation,`.*(spec|test).js` is a test file and an unprefixed `*.js` file is a story. The `flattenFolders` parameters allow grouping nested folders as well. For instance if `flattenFolders: ['a']` `file1.js` and `a/file1.png` will be grouped together.\n\n`loadStories` provide the same functionality than `getFiles` but it also loads and creates storybook stories. This is why it requires storybook's [storiesOf](https://storybook.js.org/basics/writing-stories/#writing-stories) method as a parameter. The response is also similar but it includes a `main` method with the loaded story.\n\nYou can find the exact APIs below:\n\n```js\ntype StoryPaths = {|\n  name: string,\n  parents: $ReadOnlyArray<string>,\n  title: string,\n  path: string,\n  screenshots: {|\n    [extension: string]: string,\n  |},\n  tests: {|\n    [extension: string]: string,\n  |},\n  doc: ?string,\n  url: ?string,\n|}\n\n// Retrieve and group the different stories based on their filenames\nfunction getFiles({|\n  baseUrl?: string,              // The url for the story, defaults to:\n                                 //   'http://localhost:6006'\n  flattenFolders?: Array<string> // Folders to flatten\n                                 //   defaults to ['__snapshots__', '__screenshots__']\n  stories: any,                  // Output of require context with the stories\n  findKindAndStory?: (           // Customize \"selectedKind\" and \"selectedStory\" on the URL\n    story: StoryPaths,           //   this is not needed if stories are generated with \"loadStories\"\n  ) => {|\n    selectedKind: string,\n    selectedStory: string\n  |},\n  filter?: {|                    // Filter functions to determine how different files are grouped\n    screenshots?: (file: string) => boolean,\n    tests?: (file: string) => boolean,\n    docs?: (file: string) => boolean,\n    story?: (file: string, target: string) => boolean,\n  |}\n|}): Array<StoryPaths>\n\n// Retrieve, group, load and create stories\nfunction loadStories({|\n  baseUrl?: string,              // The url for the story, defaults to:\n                                 //   'http://localhost:6006'\n  flattenFolders?: Array<string> // Folders to flatten\n                                 //   defaults to ['__snapshots__', '__screenshots__']\n  stories: any,                  // Output of require context with the stories\n  decorators: $ReadOnlyArray<Function>,\n  storiesOf: any,\n  storyFiles: $ReadOnlyArray<string>,\n|}): Array<StoryPaths & {|\n  main: () => any,\n|}>\n```\n\n### Storybook testing\n\nOnce stories are loaded, `runTests` will connect to SauceLabs (optionally through a SauceConnect tunnel) and return a Promise that includes the results of the test.\n\nSince it uses `nightwatch` under the hood, you must have a valid nightwatch instance running. To assist with it, `nightwatchConfig` provides defaultValues\n\n```js\ntype Status = 'CREATED' | 'SUCCESS' | 'FAILED'\ntype ImgResults = {|\n    browser: string,\n    diffPath: ?string,\n    diffThreshold: number,\n    error: ?string,\n    name: string,\n    platform: string,\n    referencePath: ?string,\n    screenshotPath: ?string,\n    status: Status,\n  |}\ntype Tunnel = {|\n  id: string,\n  binaryPath: string,\n|}\n\n// Invoke nightwatch and run image comparison in SauceLabs\nfunction runTests(options: {|\n  configPath: string,           // absolute path to nightwatch config\n  files: Array<StoryPaths>,     // output of getFiles()\n  overwrite: boolean,           // true to replace failing or missing images\n  storyRoot: string,            // absolute path to the stories\n  tunnel?: Tunnel,              // if set, it will set up a SC tunnel with the id\n  outputPath?: string,          // if set, where to store the test results as a\n                                // json file matching the return of `runTests`\n|}): Promise<{|\n  error: Error | null,          // null if there were no exceptions during tests\n  results: Array<ImgResults>,   // per browser / platform / story results\n  // An overall summary status. If any tests failed, it's FAILED, if any tests\n  // where created or updated it's CREATED, if all tests succeeded it's SUCCESS\n  // if no tests ran, it's EMPTY\n  status: Status | 'EMPTY',\n  counts: {|                    // counts for all tests\n    CREATED: number,\n    SUCCESS: number,\n    FAILED: number,\n  |},\n  version: string,              // picturebook version used\n  date: string,                 // ISO date when was the test report created\n|}>\n\n// Nightwatch config generation helper\nfunction nightwatchConfig(options: {|\n  desiredCapabilities?: {},     // nightwatch desired capabilities object\n  localOverrides: {},           // overrides set when browser.local flag is true\n  remoteOverrides: {},          // overrides when browser.local flag is falsy\n  files: Array<StoryPaths>,     // output of getFiles()\n  username: string,             // SauceLabs username\n  access_key: string,           // SauceLabs accessKey\n  browsers?: {                  // List of browsers to test. Default list\n                                //   includes chrome, firefox, edge, ie11,\n                                //   iphone7 and safari but any valid SauceLabs\n                                //   config is valid\n    [browserName: string]: {\n      desiredCapabilities: {\n        platform: string,\n        version: string,\n        browserName: string,\n        screenResolution: string,\n      },\n      custom_vars: {|           // Custom properties required per browser config:\n        local?: boolean,        // optionally run this browser locally. Useful for\n                                //   a mix of remote and local browsers\n        name: string,           // Must match \"browserName\"\n        platform: string,       // \"mobile\" | \"desktop\" but any string is allowed\n        extract?: {|            // If cropping the output, specify crop dimensions\n          top: number,\n          left: number,\n          width: number,\n          height: number,\n        |},\n      |},\n    },\n  },\n  // Alias for browsers where localhost cannot be accessed from a tunnel,\n  // defaults to \"localtest.dev\"\n  localhostAlias?: string,\n  // List of browsers that can't access localhost from a tunnel, defaults to:\n  // [\"ie11\", \"safari\"]\n  localhostAliasBrowsers?: Array<string>,\n  proxy?: {},                   // Nightwatch proxy object\n|}): Object\n```\n\n## 🎪 Sample App\n\nThis project includes a sample app to demo the behavior. You can view it running `yarn start` and opening `localhost:6006` on your browser.\n\nTo run the image comparison tests, keep `yarn start` running and call `SAUCE_ACCESS_KEY={YOUR_ACCESS_KEY} SAUCE_USERNAME={YOUR_USERNAME} yarn test:app`.\n\n## ️✏️ Storybook Usage\n\nTo take advantage of the automated storybook folder config (and testing) modify your storybook `config.js` to look like this:\n\n```js\nimport { storiesOf, configure } from '@storybook/react'\nimport * as picturebook from 'picturebook'\n\nfunction loadStories() {\n  picturebook.loadStories({\n    storiesOf,\n    stories: require.context('../stories', true, /\\.(js|md|png)/),\n  })\n}\n\nconfigure(loadStories, module)\n```\n\nIf you want to see a more advanced use case on how to use it with decorators and other plugins, check out the [sample project](./sampleFolder/.storybook/config.js).\n\n## 📸 Screenshot Usage\n\nTo take screenshots, picturebook relies on nightwatch. With the exception of a few required fields, configuration is generated for you. To take advantage of it you should create a `nightwatch.conf.js` file on your root (or customize it following instructions [here](http://nightwatchjs.org/gettingstarted#settings-file)).\n\n```js\nconst { resolve } = require('path')\nconst { nightwatchConfig, getFiles } = require('picturebook')\nconst requireContext = require('require-context')\n\nconst config = nightwatchConfig({\n  username: process.env.SAUCE_USERNAME,\n  access_key: process.env.SAUCE_ACCESS_KEY,\n  files: getFiles({\n    baseUrl: 'http://localhost:6006',\n    stories: requireContext(resolve(__dirname, './stories'), true, /\\.js/),\n  }),\n  desiredCapabilities: {\n    build: 'local',\n    'tunnel-identifier': 'picturebook-sample',\n  },\n})\n\nmodule.exports = config\n```\n\nTo take screenshots and run image comparison, you can call:\n\n```js\nrunTests({\n  storyRoot,\n  files: getFiles({\n    stories: requireContext(storyRoot, true, /\\.(js|png)/),\n  }),\n  overwrite,\n  tunnel,\n  configPath: resolve(__dirname, 'nightwatch.conf.js'),\n})\n```\n\nNote that if using a tunnel, `tunnel-identifier` on your nightwatch config must match the `tunnel.id` parameter passed to `runTests`.\n\n## 🙋 QYMA (Questions you may ask)\n\n### Why do I need to add localtest.dev as a localhost alias?\n\nThis is a SauceLabs issue. To work around it, `safari` and `edge` browsers replace `localhost` from urls to `localtest.dev` as described [here](https://support.saucelabs.com/hc/en-us/articles/225106887-Safari-and-Internet-Explorer-Won-t-Load-Website-When-Using-Sauce-Connect-on-Localhost).\n\nYou can customize the target browsers and localhost alias with the `localhostAliasBrowsers` and `localhostAlias`, respectively.\n\n### How do you skip some files?\n\nPicturebook will only take screenshots of the files you tell it exists. You can filter the output from [require.context](https://webpack.js.org/guides/dependency-management/#require-context) by specifying a different regExp to filter by.\n\n### SauceConnect ENOENT error\n\nIf you see the following error after a couple unsuccessful runs of SauceConnect:\n\n```sh\nevents.js:167\n      throw er; // Unhandled 'error' event\n      ^\n\nError: spawn ~/picturebook/node_modules/node-sauce-connect/lib/sc ENOENT\n```\n\nSometimes it gets stuck. Try cleaning `node_modules` and re-running yarn:\n\n```sh\nrm -rf node_modules\nyarn\n```\n\n### Error retrieving a new session from the selenium server\n\nThis is a Nightwatch issue, addressed in 1.0.4 versions of Nightwatch and later as per [this issue](https://github.com/nightwatchjs/nightwatch/issues/1772).\n\n### node-dir \"cannot read property 'files' of undefined\" error\n\nThere's currently a [bug in node-dir](https://github.com/fshost/node-dir/issues/53) that fails on empty dirs.\n\nRemove empty folders within your stories if you see the following error:\n\n```sh\nyourProject/node_modules/node-dir/lib/paths.js:92\n                results.files = results.files.concat(res.files);\n                                                         ^\n\nTypeError: Cannot read property 'files' of undefined\n    at subloop (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:92:58)\n    at /Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:107:13\n    at onDirRead (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:139:35)\n    at onStat (/Users/obartra/repos/gymnast/node_modules/node-dir/lib/paths.js:154:14)\n```\n\nYou can do so with:\n\n```sh\nfind /some/path -depth -type d -exec rmdir {} \\;\n```\n\n### No Java runtime present\n\nSelenium 3.0+ requires Java 8. Make sure it's installed if you get the following error:\n\n```sh\nStarting selenium server in parallel mode... There was an error while starting the Selenium server:\n\nNo Java runtime present, requesting install.\n```\n\nFor additional Selenium tips, check out [selenium-standalone tips](https://www.npmjs.com/package/selenium-standalone#tips).\n","readmeFilename":"README.md","gitHead":"63ead39c8bae9823ffe7dd5a673be36df13d40d3","bugs":{"url":"https://github.com/obartra/picturebook/issues"},"homepage":"https://github.com/obartra/picturebook#readme","_id":"picturebook@3.0.0-alpha.2","_npmVersion":"5.6.0","_nodeVersion":"8.11.2","_npmUser":{"name":"obartra","email":"obartra@gmail.com"},"dist":{"integrity":"sha512-u+MwubUxq3eNlRP46aDeMrc0HrP/T+6ACCkqcWFK7SJxgey1nPE314kRaMLZ8H0IK9Ip8SkwIKg8XXZFhX+wPw==","shasum":"fc3e37d816832c5257d8348ca95518713cc7a616","tarball":"https://registry.npmjs.org/picturebook/-/picturebook-3.0.0-alpha.2.tgz","fileCount":52,"unpackedSize":884036,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcrltbCRA9TVsSAnZWagAAZ1sP/00VMmIUSas5tccJaAui\n7zWuf8eV11jOrnPkz/AB2gDHM275s6UA30CTEfdlu040miLein7UfXjmoOBG\n3Du+b+WMv9sYdPRRPz8EzM1myuZuhEE30eV1iFsPNIRgYO6Y1EHfEaKktlrI\nT+cEMeETUyIeq1opsu5tAqL2orA9Ve4GedSIxBSkcxPGyA1Z42hxCXHiHTsv\nZKQmjDjd0EzzQCVqw6Q0wJ5pH81ioRbquHuRVWrSPYO/Ksuszudnxpk7y/hF\n6704wPRrzjkKBfzieK9hsbEqI0q594AAkYfAcG5aEc/ip7bBH9U5qQfdE4Yp\nEsdyQ5VzWVfxZhXnYv16RV2+ahGPyPVXN2XcuP22AdOj1vE5Pd5yCvyhkU7j\nQLggn6FRkcQ/QqSve1UlS02RutdS3HBwID92xL3vdnHfrZvWJ6y0Uz86KcDC\n7gsoDFouEEc6P53hEBWNc7IPmj/2xob/3KdZ/L3NJi+QsJesDPCZxICpy9ay\n9eG7jFjTCAISKeoSwmJ9SmtR9MyOb6OD3YgxF646L8jgLQBNzLHPlRhqZHTU\nbvCgK9/VOhfTdIFKvL19u7TJpg0Tjl66R2xEn4EsGl3otXPd9Bg9Cj6MDRhD\n9FtHxMyUAhTZMhi8a2cUFdtCSEzpjWNSPml1GwZ10A0lBph232ve9l+W+mrM\nuKq1\r\n=AdG8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFSl5GAyzmBxaNkO/pUWFxPn9+85b3YDcjCD2JVwgooLAiA6OF28oYQVXrt+qM+Q2J5u7i635zUVlHRVQGrYeYNqVQ=="}]},"maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/picturebook_3.0.0-alpha.2_1554930523203_0.052270755664519"},"_hasShrinkwrap":false}},"readme":"","maintainers":[{"name":"obartra","email":"obartra@gmail.com"}],"time":{"modified":"2022-06-23T22:51:27.957Z","created":"2017-11-04T03:00:29.569Z","1.0.0":"2017-11-04T03:00:29.569Z","1.0.1":"2017-11-04T17:03:03.644Z","1.0.2":"2017-11-04T19:33:47.928Z","1.0.3":"2017-11-05T00:17:07.591Z","1.0.4":"2017-11-06T16:06:04.536Z","1.0.5":"2017-11-06T19:41:14.885Z","1.0.6":"2017-11-06T19:58:53.429Z","1.0.7":"2017-11-06T20:52:27.636Z","1.0.8":"2017-11-07T03:01:27.291Z","1.0.9":"2017-11-07T05:18:34.077Z","1.0.10":"2017-11-07T05:20:29.569Z","1.0.11":"2017-11-08T03:31:45.803Z","1.0.12":"2017-11-08T03:37:11.726Z","1.0.13":"2017-11-08T04:29:18.294Z","1.0.14":"2017-11-08T04:41:51.552Z","1.0.15":"2017-11-08T05:12:56.335Z","1.0.16":"2017-11-09T23:37:44.662Z","1.0.17":"2017-11-09T23:56:13.068Z","1.0.18":"2017-11-10T00:15:49.842Z","1.0.18-test.1":"2017-11-12T23:08:12.312Z","1.0.18-test.2":"2017-11-12T23:14:16.224Z","1.0.18-test.3":"2017-11-12T23:19:57.580Z","1.0.19":"2017-11-12T23:36:31.331Z","1.0.20":"2017-11-13T00:03:20.157Z","1.0.21":"2017-11-13T00:46:16.093Z","1.0.22":"2017-11-13T17:06:00.082Z","1.0.23":"2017-11-13T17:10:40.855Z","1.0.24":"2017-11-15T03:01:52.675Z","1.0.25":"2017-11-15T04:15:07.764Z","1.0.26":"2017-11-15T04:52:41.372Z","1.0.27":"2017-11-15T15:57:39.589Z","1.0.28":"2017-11-15T16:52:01.018Z","1.0.28-beta.1":"2017-11-16T18:08:33.506Z","1.0.28-beta.2":"2017-11-16T19:44:14.217Z","1.0.28-beta.3":"2017-11-16T20:03:37.323Z","1.0.28-beta.4":"2017-11-16T20:04:21.143Z","1.0.28-beta.5":"2017-11-16T20:12:30.628Z","1.0.28-beta.6":"2017-11-16T20:14:56.106Z","1.0.28-beta.7":"2017-11-16T21:52:54.874Z","1.0.28-beta.8":"2017-11-20T00:57:36.845Z","1.0.28-beta.9":"2017-11-20T01:11:59.028Z","1.0.28-beta.10":"2017-11-20T01:52:02.316Z","1.0.28-beta.11":"2017-11-20T02:20:03.932Z","1.0.28-beta.12":"2017-11-20T02:35:42.760Z","1.0.28-beta.13":"2017-11-20T02:53:39.834Z","1.0.28-beta.14":"2017-11-20T03:17:09.460Z","1.0.28-beta.15":"2017-11-20T03:38:08.744Z","1.0.28-beta.16":"2017-11-20T03:56:13.496Z","1.0.28-beta.17":"2017-11-20T07:09:34.711Z","1.0.28-beta.18":"2017-11-20T07:45:38.898Z","1.0.28-beta.19":"2017-11-21T22:41:29.942Z","1.0.28-beta.20":"2017-11-21T22:53:57.101Z","1.0.28-beta.21":"2017-11-22T02:13:46.639Z","1.0.29":"2017-11-23T01:10:28.285Z","1.0.30":"2017-11-30T15:48:05.246Z","1.0.31":"2017-11-30T15:50:51.864Z","1.0.32":"2017-12-04T04:37:11.644Z","1.0.33":"2017-12-07T19:54:06.172Z","1.0.34":"2017-12-08T21:22:54.536Z","1.0.35":"2017-12-15T17:45:46.177Z","1.1.0":"2018-01-01T20:37:05.132Z","1.1.1":"2018-01-01T21:02:46.045Z","1.1.2":"2018-01-01T22:19:34.360Z","1.1.3":"2018-01-01T22:33:15.240Z","1.1.4":"2018-01-05T21:34:33.455Z","1.1.5":"2018-01-09T00:33:14.382Z","1.1.6":"2018-01-09T02:34:14.409Z","1.1.7":"2018-01-10T16:42:18.792Z","1.1.8":"2018-01-22T18:23:36.326Z","1.1.9":"2018-01-26T19:33:57.028Z","1.1.9-test":"2018-01-28T20:28:09.532Z","1.1.9-test2":"2018-01-28T21:09:09.162Z","1.1.9-test3":"2018-01-28T21:21:36.517Z","1.1.9-test4":"2018-01-28T22:01:06.554Z","1.1.9-test5":"2018-01-28T22:08:23.715Z","1.1.9-test6":"2018-01-28T22:16:09.016Z","1.1.9-test7":"2018-01-28T22:28:46.984Z","1.1.9-test8":"2018-01-28T22:36:08.972Z","1.1.9-test9":"2018-01-28T22:46:58.238Z","1.1.9-test10":"2018-01-28T22:54:23.483Z","1.1.9-test11":"2018-01-28T23:09:26.520Z","1.1.9-test12":"2018-01-28T23:39:58.801Z","1.1.9-test13":"2018-01-28T23:47:38.993Z","1.1.9-test14":"2018-01-28T23:50:02.651Z","1.2.0":"2018-01-29T00:53:53.088Z","1.2.1":"2018-01-29T00:55:18.699Z","1.2.2":"2018-02-03T14:30:29.293Z","1.2.3":"2018-02-04T17:19:50.844Z","1.2.4":"2018-02-04T17:55:33.282Z","1.2.5":"2018-03-10T21:58:07.584Z","1.2.6":"2018-03-10T22:32:36.384Z","2.0.0-beta.1":"2018-09-20T17:47:08.123Z","2.0.0-beta.2":"2018-09-20T21:02:51.215Z","2.0.0-beta.3":"2018-09-20T22:38:27.737Z","2.0.0-beta.4":"2018-09-20T23:15:06.090Z","2.0.0-beta.5":"2018-09-21T18:45:17.627Z","2.0.0-beta.6":"2018-09-22T00:30:15.104Z","2.0.0-beta.7":"2018-09-24T03:07:54.454Z","2.0.0-beta.8":"2018-09-24T05:18:12.367Z","2.0.0-beta.9":"2018-09-24T20:49:36.189Z","2.0.0-beta.10":"2018-09-25T15:00:38.818Z","2.0.0-beta.11":"2018-09-27T22:20:42.774Z","2.0.0-beta.12":"2018-10-02T14:22:14.953Z","2.0.0-beta.13":"2018-10-02T19:02:51.443Z","2.0.0-beta.14":"2018-10-19T16:03:16.485Z","2.0.0-beta.15":"2018-10-19T16:10:22.333Z","2.0.0-beta.16":"2018-10-19T21:56:20.195Z","2.0.0-beta.17":"2018-10-22T21:37:11.785Z","2.0.0-beta.18":"2018-10-25T03:26:57.813Z","2.0.0-beta.19":"2018-11-02T19:34:23.575Z","2.0.0-beta.20":"2018-11-06T18:22:36.202Z","2.0.0-beta.21":"2018-11-06T18:42:17.725Z","2.0.0-beta.23":"2019-01-09T17:30:09.269Z","2.0.0-beta.24":"2019-01-10T19:36:51.179Z","3.0.0-alpha.1":"2019-04-10T19:46:32.722Z","3.0.0-alpha.2":"2019-04-10T21:08:43.491Z"},"repository":{"type":"git","url":"git+https://github.com/obartra/picturebook.git"},"author":{"name":"Oscar Bartra"},"license":"MIT","readmeFilename":"","users":{"obartra":true},"homepage":"https://github.com/obartra/picturebook#readme","bugs":{"url":"https://github.com/obartra/picturebook/issues"}}